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, _("Watermark image"), true, wxGBPosition (r, 0));
130 _watermark = new FilePickerCtrl (_panel, _("Select image file"), "*.png;*.jpg;*.jpeg;*.tif;*.tiff", true);
131 table->Add (_watermark, wxGBPosition (r, 1));
134 add_label_to_sizer (table, _panel, _("KDM server URL"), true, wxGBPosition(r, 0));
135 _kdm_server_url = new wxTextCtrl (_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(400, -1));
136 table->Add (_kdm_server_url, wxGBPosition (r, 1));
140 _player_mode->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::player_mode_changed, this));
141 _image_display->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::image_display_changed, this));
142 _respect_kdm->Bind (wxEVT_CHECKBOX, bind(&PlayerGeneralPage::respect_kdm_changed, this));
143 _log_file->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::log_file_changed, this));
144 _dcp_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::dcp_directory_changed, this));
145 _kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::kdm_directory_changed, this));
146 #ifdef DCPOMATIC_VARIANT_SWAROOP
147 _background_image->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::background_image_changed, this));
148 _kdm_server_url->Bind (wxEVT_TEXT, bind(&PlayerGeneralPage::kdm_server_url_changed, this));
149 _watermark->Bind (wxEVT_TEXT, bind(&PlayerGeneralPage::watermark_changed, this));
153 void config_changed ()
155 GeneralPage::config_changed ();
157 Config* config = Config::instance ();
159 switch (config->player_mode()) {
160 case Config::PLAYER_MODE_WINDOW:
161 checked_set (_player_mode, 0);
163 case Config::PLAYER_MODE_FULL:
164 checked_set (_player_mode, 1);
166 case Config::PLAYER_MODE_DUAL:
167 checked_set (_player_mode, 2);
171 checked_set (_image_display, config->image_display());
172 checked_set (_respect_kdm, config->respect_kdm_validity_periods());
173 if (config->player_log_file()) {
174 checked_set (_log_file, *config->player_log_file());
176 if (config->player_dcp_directory()) {
177 checked_set (_dcp_directory, *config->player_dcp_directory());
179 if (config->player_kdm_directory()) {
180 checked_set (_kdm_directory, *config->player_kdm_directory());
182 #ifdef DCPOMATIC_VARIANT_SWAROOP
183 if (config->player_background_image()) {
184 checked_set (_background_image, *config->player_background_image());
186 checked_set (_kdm_server_url, config->kdm_server_url());
187 if (config->player_watermark()) {
188 checked_set (_watermark, *config->player_watermark());
194 void player_mode_changed ()
196 switch (_player_mode->GetSelection()) {
198 Config::instance()->set_player_mode(Config::PLAYER_MODE_WINDOW);
201 Config::instance()->set_player_mode(Config::PLAYER_MODE_FULL);
204 Config::instance()->set_player_mode(Config::PLAYER_MODE_DUAL);
209 void image_display_changed ()
211 Config::instance()->set_image_display(_image_display->GetSelection());
214 void respect_kdm_changed ()
216 Config::instance()->set_respect_kdm_validity_periods(_respect_kdm->GetValue());
219 void log_file_changed ()
221 Config::instance()->set_player_log_file(wx_to_std(_log_file->GetPath()));
224 void dcp_directory_changed ()
226 Config::instance()->set_player_dcp_directory(wx_to_std(_dcp_directory->GetPath()));
229 void kdm_directory_changed ()
231 Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath()));
234 #ifdef DCPOMATIC_VARIANT_SWAROOP
235 void background_image_changed ()
237 Config::instance()->set_player_background_image(wx_to_std(_background_image->GetPath()));
240 void kdm_server_url_changed ()
242 Config::instance()->set_kdm_server_url(wx_to_std(_kdm_server_url->GetValue()));
245 void watermark_changed ()
247 Config::instance()->set_player_watermark(wx_to_std(_watermark->GetPath()));
251 wxChoice* _player_mode;
252 wxChoice* _image_display;
253 wxCheckBox* _respect_kdm;
254 FilePickerCtrl* _log_file;
255 wxDirPickerCtrl* _dcp_directory;
256 wxDirPickerCtrl* _kdm_directory;
257 #ifdef DCPOMATIC_VARIANT_SWAROOP
258 FilePickerCtrl* _background_image;
259 wxTextCtrl* _kdm_server_url;
260 FilePickerCtrl* _watermark;
265 create_player_config_dialog ()
267 wxPreferencesEditor* e = new wxPreferencesEditor ();
270 /* Width that we force some of the config panels to be on OSX so that
271 the containing window doesn't shrink too much when we select those panels.
272 This is obviously an unpleasant hack.
274 wxSize ps = wxSize (520, -1);
275 int const border = 16;
277 wxSize ps = wxSize (-1, -1);
278 int const border = 8;
281 e->AddPage (new PlayerGeneralPage (ps, border));
282 e->AddPage (new KeysPage (ps, border));