Add KDM directory configuration in player.
[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                 _player_mode->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::player_mode_changed, this));
124                 _image_display->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::image_display_changed, this));
125                 _respect_kdm->Bind (wxEVT_CHECKBOX, bind(&PlayerGeneralPage::respect_kdm_changed, this));
126                 _log_file->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::log_file_changed, this));
127                 _dcp_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::dcp_directory_changed, this));
128                 _kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&PlayerGeneralPage::kdm_directory_changed, this));
129         }
130
131         void config_changed ()
132         {
133                 GeneralPage::config_changed ();
134
135                 Config* config = Config::instance ();
136
137                 switch (config->player_mode()) {
138                 case Config::PLAYER_MODE_WINDOW:
139                         checked_set (_player_mode, 0);
140                         break;
141                 case Config::PLAYER_MODE_FULL:
142                         checked_set (_player_mode, 1);
143                         break;
144                 case Config::PLAYER_MODE_DUAL:
145                         checked_set (_player_mode, 2);
146                         break;
147                 }
148
149                 checked_set (_image_display, config->image_display());
150                 checked_set (_respect_kdm, config->respect_kdm_validity_periods());
151                 if (config->player_log_file()) {
152                         checked_set (_log_file, *config->player_log_file());
153                 }
154                 if (config->player_dcp_directory()) {
155                         checked_set (_dcp_directory, *config->player_dcp_directory());
156                 }
157                 if (config->player_kdm_directory()) {
158                         checked_set (_kdm_directory, *config->player_kdm_directory());
159                 }
160         }
161
162 private:
163         void player_mode_changed ()
164         {
165                 switch (_player_mode->GetSelection()) {
166                 case 0:
167                         Config::instance()->set_player_mode(Config::PLAYER_MODE_WINDOW);
168                         break;
169                 case 1:
170                         Config::instance()->set_player_mode(Config::PLAYER_MODE_FULL);
171                         break;
172                 case 2:
173                         Config::instance()->set_player_mode(Config::PLAYER_MODE_DUAL);
174                         break;
175                 }
176         }
177
178         void image_display_changed ()
179         {
180                 Config::instance()->set_image_display(_image_display->GetSelection());
181         }
182
183         void respect_kdm_changed ()
184         {
185                 Config::instance()->set_respect_kdm_validity_periods(_respect_kdm->GetValue());
186         }
187
188         void log_file_changed ()
189         {
190                 Config::instance()->set_player_log_file(wx_to_std(_log_file->GetPath()));
191         }
192
193         void dcp_directory_changed ()
194         {
195                 Config::instance()->set_player_dcp_directory(wx_to_std(_dcp_directory->GetPath()));
196         }
197
198         void kdm_directory_changed ()
199         {
200                 Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath()));
201         }
202
203         wxChoice* _player_mode;
204         wxChoice* _image_display;
205         wxCheckBox* _respect_kdm;
206         FilePickerCtrl* _log_file;
207         wxDirPickerCtrl* _dcp_directory;
208         wxDirPickerCtrl* _kdm_directory;
209 };
210
211 wxPreferencesEditor*
212 create_player_config_dialog ()
213 {
214         wxPreferencesEditor* e = new wxPreferencesEditor ();
215
216 #ifdef DCPOMATIC_OSX
217         /* Width that we force some of the config panels to be on OSX so that
218            the containing window doesn't shrink too much when we select those panels.
219            This is obviously an unpleasant hack.
220         */
221         wxSize ps = wxSize (520, -1);
222         int const border = 16;
223 #else
224         wxSize ps = wxSize (-1, -1);
225         int const border = 8;
226 #endif
227
228         e->AddPage (new PlayerGeneralPage (ps, border));
229         e->AddPage (new KeysPage (ps, border));
230         return e;
231 }