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));
130 _player_mode->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::player_mode_changed, this));
131 _image_display->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::image_display_changed, this));
132 _respect_kdm->Bind (wxEVT_CHECKBOX, bind(&PlayerGeneralPage::respect_kdm_changed, this));
133 _log_file->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::log_file_changed, this));
134 _dcp_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::dcp_directory_changed, this));
135 _kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::kdm_directory_changed, this));
136 #ifdef DCPOMATIC_VARIANT_SWAROOP
137 _background_image->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::background_image_changed, this));
141 void config_changed ()
143 GeneralPage::config_changed ();
145 Config* config = Config::instance ();
147 switch (config->player_mode()) {
148 case Config::PLAYER_MODE_WINDOW:
149 checked_set (_player_mode, 0);
151 case Config::PLAYER_MODE_FULL:
152 checked_set (_player_mode, 1);
154 case Config::PLAYER_MODE_DUAL:
155 checked_set (_player_mode, 2);
159 checked_set (_image_display, config->image_display());
160 checked_set (_respect_kdm, config->respect_kdm_validity_periods());
161 if (config->player_log_file()) {
162 checked_set (_log_file, *config->player_log_file());
164 if (config->player_dcp_directory()) {
165 checked_set (_dcp_directory, *config->player_dcp_directory());
167 if (config->player_kdm_directory()) {
168 checked_set (_kdm_directory, *config->player_kdm_directory());
170 #ifdef DCPOMATIC_VARIANT_SWAROOP
171 if (config->player_background_image()) {
172 checked_set (_background_image, *config->player_background_image());
178 void player_mode_changed ()
180 switch (_player_mode->GetSelection()) {
182 Config::instance()->set_player_mode(Config::PLAYER_MODE_WINDOW);
185 Config::instance()->set_player_mode(Config::PLAYER_MODE_FULL);
188 Config::instance()->set_player_mode(Config::PLAYER_MODE_DUAL);
193 void image_display_changed ()
195 Config::instance()->set_image_display(_image_display->GetSelection());
198 void respect_kdm_changed ()
200 Config::instance()->set_respect_kdm_validity_periods(_respect_kdm->GetValue());
203 void log_file_changed ()
205 Config::instance()->set_player_log_file(wx_to_std(_log_file->GetPath()));
208 void dcp_directory_changed ()
210 Config::instance()->set_player_dcp_directory(wx_to_std(_dcp_directory->GetPath()));
213 void kdm_directory_changed ()
215 Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath()));
218 #ifdef DCPOMATIC_VARIANT_SWAROOP
219 void background_image_changed ()
221 Config::instance()->set_player_background_image(wx_to_std(_background_image->GetPath()));
225 wxChoice* _player_mode;
226 wxChoice* _image_display;
227 wxCheckBox* _respect_kdm;
228 FilePickerCtrl* _log_file;
229 wxDirPickerCtrl* _dcp_directory;
230 wxDirPickerCtrl* _kdm_directory;
231 #ifdef DCPOMATIC_VARIANT_SWAROOP
232 FilePickerCtrl* _background_image;
237 create_player_config_dialog ()
239 wxPreferencesEditor* e = new wxPreferencesEditor ();
242 /* Width that we force some of the config panels to be on OSX so that
243 the containing window doesn't shrink too much when we select those panels.
244 This is obviously an unpleasant hack.
246 wxSize ps = wxSize (520, -1);
247 int const border = 16;
249 wxSize ps = wxSize (-1, -1);
250 int const border = 8;
253 e->AddPage (new PlayerGeneralPage (ps, border));
254 e->AddPage (new KeysPage (ps, border));