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