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 add_label_to_sizer (table, _panel, _("KDM directory"), true, wxGBPosition (r, 0));
119 _kdm_directory = new wxDirPickerCtrl (_panel, wxID_ANY, wxEmptyString, wxDirSelectorPromptStr, wxDefaultPosition, wxSize (300, -1));
120 table->Add (_kdm_directory, wxGBPosition (r, 1));
123 #ifdef DCPOMATIC_VARIANT_SWAROOP
124 add_label_to_sizer (table, _panel, _("Background image"), true, wxGBPosition (r, 0));
125 _background_image = new FilePickerCtrl (_panel, _("Select image file"), "*.png;*.jpg;*.jpeg;*.tif;*.tiff", true);
126 table->Add (_background_image, wxGBPosition (r, 1));
129 add_label_to_sizer (table, _panel, _("KDM server URL"), true, wxGBPosition(r, 0));
130 _kdm_server_url = new wxTextCtrl (_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(400, -1));
131 table->Add (_kdm_server_url, wxGBPosition (r, 1));
135 _player_mode->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::player_mode_changed, this));
136 _image_display->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::image_display_changed, this));
137 _respect_kdm->Bind (wxEVT_CHECKBOX, bind(&PlayerGeneralPage::respect_kdm_changed, this));
138 _log_file->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::log_file_changed, this));
139 _dcp_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::dcp_directory_changed, this));
140 _kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::kdm_directory_changed, this));
141 #ifdef DCPOMATIC_VARIANT_SWAROOP
142 _background_image->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::background_image_changed, this));
143 _kdm_server_url->Bind (wxEVT_TEXT, bind(&PlayerGeneralPage::kdm_server_url_changed, this));
147 void config_changed ()
149 GeneralPage::config_changed ();
151 Config* config = Config::instance ();
153 switch (config->player_mode()) {
154 case Config::PLAYER_MODE_WINDOW:
155 checked_set (_player_mode, 0);
157 case Config::PLAYER_MODE_FULL:
158 checked_set (_player_mode, 1);
160 case Config::PLAYER_MODE_DUAL:
161 checked_set (_player_mode, 2);
165 checked_set (_image_display, config->image_display());
166 checked_set (_respect_kdm, config->respect_kdm_validity_periods());
167 if (config->player_log_file()) {
168 checked_set (_log_file, *config->player_log_file());
170 if (config->player_dcp_directory()) {
171 checked_set (_dcp_directory, *config->player_dcp_directory());
173 if (config->player_kdm_directory()) {
174 checked_set (_kdm_directory, *config->player_kdm_directory());
176 #ifdef DCPOMATIC_VARIANT_SWAROOP
177 if (config->player_background_image()) {
178 checked_set (_background_image, *config->player_background_image());
180 checked_set (_kdm_server_url, config->kdm_server_url());
185 void player_mode_changed ()
187 switch (_player_mode->GetSelection()) {
189 Config::instance()->set_player_mode(Config::PLAYER_MODE_WINDOW);
192 Config::instance()->set_player_mode(Config::PLAYER_MODE_FULL);
195 Config::instance()->set_player_mode(Config::PLAYER_MODE_DUAL);
200 void image_display_changed ()
202 Config::instance()->set_image_display(_image_display->GetSelection());
205 void respect_kdm_changed ()
207 Config::instance()->set_respect_kdm_validity_periods(_respect_kdm->GetValue());
210 void log_file_changed ()
212 Config::instance()->set_player_log_file(wx_to_std(_log_file->GetPath()));
215 void dcp_directory_changed ()
217 Config::instance()->set_player_dcp_directory(wx_to_std(_dcp_directory->GetPath()));
220 void kdm_directory_changed ()
222 Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath()));
225 #ifdef DCPOMATIC_VARIANT_SWAROOP
226 void background_image_changed ()
228 Config::instance()->set_player_background_image(wx_to_std(_background_image->GetPath()));
231 void kdm_server_url_changed ()
233 Config::instance()->set_kdm_server_url(wx_to_std(_kdm_server_url->GetValue()));
237 wxChoice* _player_mode;
238 wxChoice* _image_display;
239 wxCheckBox* _respect_kdm;
240 FilePickerCtrl* _log_file;
241 wxDirPickerCtrl* _dcp_directory;
242 wxDirPickerCtrl* _kdm_directory;
243 #ifdef DCPOMATIC_VARIANT_SWAROOP
244 FilePickerCtrl* _background_image;
245 wxTextCtrl* _kdm_server_url;
249 #ifdef DCPOMATIC_VARIANT_SWAROOP
250 class WatermarkPage : public StandardPage
253 WatermarkPage (wxSize panel_size, int border)
254 : StandardPage (panel_size, border)
257 wxString GetName () const
259 return _("Watermark");
265 wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
266 _panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
270 add_label_to_sizer (table, _panel, _("Theatre name"), true, wxGBPosition(r, 0));
271 _theatre = new wxTextCtrl (_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(300, -1));
272 table->Add (_theatre, wxGBPosition(r, 1), wxGBSpan(1, 2));
275 add_label_to_sizer (table, _panel, _("Period"), true, wxGBPosition(r, 0));
276 _period = new wxSpinCtrl (_panel, wxID_ANY);
277 _period->SetRange (1, 60);
278 table->Add (_period, wxGBPosition(r, 1));
279 add_label_to_sizer (table, _panel, _("minutes"), false, wxGBPosition(r, 2));
282 add_label_to_sizer (table, _panel, _("Duration"), true, wxGBPosition(r, 0));
283 _duration = new wxSpinCtrl (_panel, wxID_ANY);
284 _duration->SetRange (1, 200);
285 table->Add (_duration, wxGBPosition(r, 1));
286 add_label_to_sizer (table, _panel, _("milliseconds"), false, wxGBPosition(r, 2));
289 _theatre->Bind (wxEVT_TEXT, bind(&WatermarkPage::theatre_changed, this));
290 _duration->Bind (wxEVT_SPINCTRL, bind(&WatermarkPage::duration_changed, this));
291 _period->Bind (wxEVT_SPINCTRL, bind(&WatermarkPage::period_changed, this));
294 void config_changed ()
296 Config* config = Config::instance ();
297 checked_set (_theatre, config->player_watermark_theatre());
298 checked_set (_duration, config->player_watermark_duration());
299 checked_set (_period, config->player_watermark_period());
302 void theatre_changed ()
304 Config::instance()->set_player_watermark_theatre(wx_to_std(_theatre->GetValue()));
307 void period_changed ()
309 Config::instance()->set_player_watermark_period(_period->GetValue());
312 void duration_changed ()
314 Config::instance()->set_player_watermark_duration(_duration->GetValue());
317 wxTextCtrl* _theatre;
319 wxSpinCtrl* _duration;
324 create_player_config_dialog ()
326 wxPreferencesEditor* e = new wxPreferencesEditor ();
329 /* Width that we force some of the config panels to be on OSX so that
330 the containing window doesn't shrink too much when we select those panels.
331 This is obviously an unpleasant hack.
333 wxSize ps = wxSize (520, -1);
334 int const border = 16;
336 wxSize ps = wxSize (-1, -1);
337 int const border = 8;
340 e->AddPage (new PlayerGeneralPage (ps, border));
341 e->AddPage (new KeysPage (ps, border));
342 #ifdef DCPOMATIC_VARIANT_SWAROOP
343 e->AddPage (new WatermarkPage (ps, border));