2 Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
4 This file is part of DCP-o-matic.
6 DCP-o-matic is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 DCP-o-matic is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
21 /** @file src/player_config_dialog.cc
22 * @brief A dialogue to edit DCP-o-matic Player configuration.
25 #include "config_dialog.h"
27 #include "editable_list.h"
28 #include "filter_dialog.h"
29 #include "file_picker_ctrl.h"
30 #include "dir_picker_ctrl.h"
31 #include "isdcf_metadata_dialog.h"
32 #include "server_dialog.h"
33 #include "make_chain_dialog.h"
34 #include "email_dialog.h"
35 #include "name_format_editor.h"
36 #include "nag_dialog.h"
37 #include "config_dialog.h"
38 #include "lib/config.h"
39 #include "lib/ratio.h"
40 #include "lib/filter.h"
41 #include "lib/dcp_content_type.h"
44 #include "lib/cross.h"
45 #include "lib/exceptions.h"
46 #include <dcp/locale_convert.h>
47 #include <dcp/exceptions.h>
48 #include <dcp/certificate_chain.h>
49 #include <wx/stdpaths.h>
50 #include <wx/preferences.h>
51 #include <wx/spinctrl.h>
52 #include <wx/filepicker.h>
54 #include <boost/filesystem.hpp>
55 #include <boost/foreach.hpp>
66 using boost::shared_ptr;
67 using boost::function;
68 using boost::optional;
69 using dcp::locale_convert;
71 class PlayerGeneralPage : public GeneralPage
74 PlayerGeneralPage (wxSize panel_size, int border)
75 : GeneralPage (panel_size, border)
81 wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
82 _panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
85 add_language_controls (table, r);
86 add_play_sound_controls (table, r);
87 add_update_controls (table, r);
89 add_label_to_sizer (table, _panel, _("Start player as"), true, wxGBPosition(r, 0));
90 _player_mode = new wxChoice (_panel, wxID_ANY);
91 _player_mode->Append (_("window"));
92 _player_mode->Append (_("full screen"));
93 _player_mode->Append (_("full screen with controls on other monitor"));
94 table->Add (_player_mode, wxGBPosition(r, 1));
97 add_label_to_sizer (table, _panel, _("Dual-screen displays"), true, wxGBPosition(r, 0));
98 _image_display = new wxChoice (_panel, wxID_ANY);
99 _image_display->Append (_("Image on primary, controls on secondary"));
100 _image_display->Append (_("Image on secondary, controls on primary"));
101 table->Add (_image_display, wxGBPosition(r, 1));
104 _respect_kdm = new wxCheckBox (_panel, wxID_ANY, _("Respect KDM validity periods"));
105 table->Add (_respect_kdm, wxGBPosition(r, 0), wxGBSpan(1, 2));
108 add_label_to_sizer (table, _panel, _("Log file"), true, wxGBPosition (r, 0));
109 _log_file = new FilePickerCtrl (_panel, _("Select log file"), "*", true);
110 table->Add (_log_file, wxGBPosition (r, 1));
113 add_label_to_sizer (table, _panel, _("DCP directory"), true, wxGBPosition (r, 0));
114 _dcp_directory = new wxDirPickerCtrl (_panel, wxID_ANY, wxEmptyString, wxDirSelectorPromptStr, wxDefaultPosition, wxSize (300, -1));
115 table->Add (_dcp_directory, wxGBPosition (r, 1));
118 _player_mode->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::player_mode_changed, this));
119 _image_display->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::image_display_changed, this));
120 _respect_kdm->Bind (wxEVT_CHECKBOX, bind(&PlayerGeneralPage::respect_kdm_changed, this));
121 _log_file->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::log_file_changed, this));
122 _dcp_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::dcp_directory_changed, this));
125 void config_changed ()
127 GeneralPage::config_changed ();
129 Config* config = Config::instance ();
131 switch (config->player_mode()) {
132 case Config::PLAYER_MODE_WINDOW:
133 checked_set (_player_mode, 0);
135 case Config::PLAYER_MODE_FULL:
136 checked_set (_player_mode, 1);
138 case Config::PLAYER_MODE_DUAL:
139 checked_set (_player_mode, 2);
143 checked_set (_image_display, config->image_display());
144 checked_set (_respect_kdm, config->respect_kdm_validity_periods());
145 if (config->player_log_file()) {
146 checked_set (_log_file, *config->player_log_file());
148 if (config->player_dcp_directory()) {
149 checked_set (_dcp_directory, *config->player_dcp_directory());
154 void player_mode_changed ()
156 switch (_player_mode->GetSelection()) {
158 Config::instance()->set_player_mode(Config::PLAYER_MODE_WINDOW);
161 Config::instance()->set_player_mode(Config::PLAYER_MODE_FULL);
164 Config::instance()->set_player_mode(Config::PLAYER_MODE_DUAL);
169 void image_display_changed ()
171 Config::instance()->set_image_display(_image_display->GetSelection());
174 void respect_kdm_changed ()
176 Config::instance()->set_respect_kdm_validity_periods(_respect_kdm->GetValue());
179 void log_file_changed ()
181 Config::instance()->set_player_log_file(wx_to_std(_log_file->GetPath()));
184 void dcp_directory_changed ()
186 Config::instance()->set_player_dcp_directory(wx_to_std(_dcp_directory->GetPath()));
189 wxChoice* _player_mode;
190 wxChoice* _image_display;
191 wxCheckBox* _respect_kdm;
192 FilePickerCtrl* _log_file;
193 wxDirPickerCtrl* _dcp_directory;
197 create_player_config_dialog ()
199 wxPreferencesEditor* e = new wxPreferencesEditor ();
202 /* Width that we force some of the config panels to be on OSX so that
203 the containing window doesn't shrink too much when we select those panels.
204 This is obviously an unpleasant hack.
206 wxSize ps = wxSize (520, -1);
207 int const border = 16;
209 wxSize ps = wxSize (-1, -1);
210 int const border = 8;
213 e->AddPage (new PlayerGeneralPage (ps, border));
214 e->AddPage (new KeysPage (ps, border));