Untested watermarking.
[dcpomatic.git] / src / wx / player_config_dialog.cc
1 /*
2     Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
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.
10
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.
15
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/>.
18
19 */
20
21 /** @file src/player_config_dialog.cc
22  *  @brief A dialogue to edit DCP-o-matic Player configuration.
23  */
24
25 #include "config_dialog.h"
26 #include "wx_util.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"
42 #include "lib/log.h"
43 #include "lib/util.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>
53 #include <RtAudio.h>
54 #include <boost/filesystem.hpp>
55 #include <boost/foreach.hpp>
56 #include <iostream>
57
58 using std::vector;
59 using std::string;
60 using std::list;
61 using std::cout;
62 using std::pair;
63 using std::make_pair;
64 using std::map;
65 using boost::bind;
66 using boost::shared_ptr;
67 using boost::function;
68 using boost::optional;
69 using dcp::locale_convert;
70
71 class PlayerGeneralPage : public GeneralPage
72 {
73 public:
74         PlayerGeneralPage (wxSize panel_size, int border)
75                 : GeneralPage (panel_size, border)
76         {}
77
78 private:
79         void setup ()
80         {
81                 wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
82                 _panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
83
84                 int r = 0;
85                 add_language_controls (table, r);
86                 add_play_sound_controls (table, r);
87                 add_update_controls (table, r);
88
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));
95                 ++r;
96
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));
102                 ++r;
103
104                 _respect_kdm = new wxCheckBox (_panel, wxID_ANY, _("Respect KDM validity periods"));
105                 table->Add (_respect_kdm, wxGBPosition(r, 0), wxGBSpan(1, 2));
106                 ++r;
107
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));
111                 ++r;
112
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));
116                 ++r;
117
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));
121                 ++r;
122
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));
127                 ++r;
128
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));
132                 ++r;
133
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));
137                 ++r;
138 #endif
139
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));
150 #endif
151         }
152
153         void config_changed ()
154         {
155                 GeneralPage::config_changed ();
156
157                 Config* config = Config::instance ();
158
159                 switch (config->player_mode()) {
160                 case Config::PLAYER_MODE_WINDOW:
161                         checked_set (_player_mode, 0);
162                         break;
163                 case Config::PLAYER_MODE_FULL:
164                         checked_set (_player_mode, 1);
165                         break;
166                 case Config::PLAYER_MODE_DUAL:
167                         checked_set (_player_mode, 2);
168                         break;
169                 }
170
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());
175                 }
176                 if (config->player_dcp_directory()) {
177                         checked_set (_dcp_directory, *config->player_dcp_directory());
178                 }
179                 if (config->player_kdm_directory()) {
180                         checked_set (_kdm_directory, *config->player_kdm_directory());
181                 }
182 #ifdef DCPOMATIC_VARIANT_SWAROOP
183                 if (config->player_background_image()) {
184                         checked_set (_background_image, *config->player_background_image());
185                 }
186                 checked_set (_kdm_server_url, config->kdm_server_url());
187                 if (config->player_watermark()) {
188                         checked_set (_watermark, *config->player_watermark());
189                 }
190 #endif
191         }
192
193 private:
194         void player_mode_changed ()
195         {
196                 switch (_player_mode->GetSelection()) {
197                 case 0:
198                         Config::instance()->set_player_mode(Config::PLAYER_MODE_WINDOW);
199                         break;
200                 case 1:
201                         Config::instance()->set_player_mode(Config::PLAYER_MODE_FULL);
202                         break;
203                 case 2:
204                         Config::instance()->set_player_mode(Config::PLAYER_MODE_DUAL);
205                         break;
206                 }
207         }
208
209         void image_display_changed ()
210         {
211                 Config::instance()->set_image_display(_image_display->GetSelection());
212         }
213
214         void respect_kdm_changed ()
215         {
216                 Config::instance()->set_respect_kdm_validity_periods(_respect_kdm->GetValue());
217         }
218
219         void log_file_changed ()
220         {
221                 Config::instance()->set_player_log_file(wx_to_std(_log_file->GetPath()));
222         }
223
224         void dcp_directory_changed ()
225         {
226                 Config::instance()->set_player_dcp_directory(wx_to_std(_dcp_directory->GetPath()));
227         }
228
229         void kdm_directory_changed ()
230         {
231                 Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath()));
232         }
233
234 #ifdef DCPOMATIC_VARIANT_SWAROOP
235         void background_image_changed ()
236         {
237                 Config::instance()->set_player_background_image(wx_to_std(_background_image->GetPath()));
238         }
239
240         void kdm_server_url_changed ()
241         {
242                 Config::instance()->set_kdm_server_url(wx_to_std(_kdm_server_url->GetValue()));
243         }
244
245         void watermark_changed ()
246         {
247                 Config::instance()->set_player_watermark(wx_to_std(_watermark->GetPath()));
248         }
249 #endif
250
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;
261 #endif
262 };
263
264 wxPreferencesEditor*
265 create_player_config_dialog ()
266 {
267         wxPreferencesEditor* e = new wxPreferencesEditor ();
268
269 #ifdef DCPOMATIC_OSX
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.
273         */
274         wxSize ps = wxSize (520, -1);
275         int const border = 16;
276 #else
277         wxSize ps = wxSize (-1, -1);
278         int const border = 8;
279 #endif
280
281         e->AddPage (new PlayerGeneralPage (ps, border));
282         e->AddPage (new KeysPage (ps, border));
283         return e;
284 }