Finish off background image support for swaroop variant.
[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 #endif
129
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_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::background_image_changed, this));
138 #endif
139         }
140
141         void config_changed ()
142         {
143                 GeneralPage::config_changed ();
144
145                 Config* config = Config::instance ();
146
147                 switch (config->player_mode()) {
148                 case Config::PLAYER_MODE_WINDOW:
149                         checked_set (_player_mode, 0);
150                         break;
151                 case Config::PLAYER_MODE_FULL:
152                         checked_set (_player_mode, 1);
153                         break;
154                 case Config::PLAYER_MODE_DUAL:
155                         checked_set (_player_mode, 2);
156                         break;
157                 }
158
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());
163                 }
164                 if (config->player_dcp_directory()) {
165                         checked_set (_dcp_directory, *config->player_dcp_directory());
166                 }
167                 if (config->player_kdm_directory()) {
168                         checked_set (_kdm_directory, *config->player_kdm_directory());
169                 }
170 #ifdef DCPOMATIC_VARIANT_SWAROOP
171                 if (config->player_background_image()) {
172                         checked_set (_background_image, *config->player_background_image());
173                 }
174 #endif
175         }
176
177 private:
178         void player_mode_changed ()
179         {
180                 switch (_player_mode->GetSelection()) {
181                 case 0:
182                         Config::instance()->set_player_mode(Config::PLAYER_MODE_WINDOW);
183                         break;
184                 case 1:
185                         Config::instance()->set_player_mode(Config::PLAYER_MODE_FULL);
186                         break;
187                 case 2:
188                         Config::instance()->set_player_mode(Config::PLAYER_MODE_DUAL);
189                         break;
190                 }
191         }
192
193         void image_display_changed ()
194         {
195                 Config::instance()->set_image_display(_image_display->GetSelection());
196         }
197
198         void respect_kdm_changed ()
199         {
200                 Config::instance()->set_respect_kdm_validity_periods(_respect_kdm->GetValue());
201         }
202
203         void log_file_changed ()
204         {
205                 Config::instance()->set_player_log_file(wx_to_std(_log_file->GetPath()));
206         }
207
208         void dcp_directory_changed ()
209         {
210                 Config::instance()->set_player_dcp_directory(wx_to_std(_dcp_directory->GetPath()));
211         }
212
213         void kdm_directory_changed ()
214         {
215                 Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath()));
216         }
217
218 #ifdef DCPOMATIC_VARIANT_SWAROOP
219         void background_image_changed ()
220         {
221                 Config::instance()->set_player_background_image(wx_to_std(_background_image->GetPath()));
222         }
223 #endif
224
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;
233 #endif
234 };
235
236 wxPreferencesEditor*
237 create_player_config_dialog ()
238 {
239         wxPreferencesEditor* e = new wxPreferencesEditor ();
240
241 #ifdef DCPOMATIC_OSX
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.
245         */
246         wxSize ps = wxSize (520, -1);
247         int const border = 16;
248 #else
249         wxSize ps = wxSize (-1, -1);
250         int const border = 8;
251 #endif
252
253         e->AddPage (new PlayerGeneralPage (ps, border));
254         e->AddPage (new KeysPage (ps, border));
255         return e;
256 }