2 Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /** @file src/config_dialog.cc
21 * @brief A dialogue to edit DCP-o-matic configuration.
25 #include <boost/lexical_cast.hpp>
26 #include <boost/filesystem.hpp>
27 #include <wx/stdpaths.h>
28 #include <wx/preferences.h>
29 #include <wx/filepicker.h>
30 #include <wx/spinctrl.h>
31 #include <dcp/colour_matrix.h>
32 #include "lib/config.h"
33 #include "lib/ratio.h"
34 #include "lib/scaler.h"
35 #include "lib/filter.h"
36 #include "lib/dcp_content_type.h"
37 #include "lib/colour_conversion.h"
39 #include "config_dialog.h"
41 #include "editable_list.h"
42 #include "filter_dialog.h"
43 #include "dir_picker_ctrl.h"
44 #include "isdcf_metadata_dialog.h"
45 #include "preset_colour_conversion_dialog.h"
46 #include "server_dialog.h"
53 using boost::shared_ptr;
54 using boost::lexical_cast;
59 Page (wxSize panel_size, int border)
60 : _panel_size (panel_size)
69 class GeneralPage : public wxStockPreferencesPage, public Page
72 GeneralPage (wxSize panel_size, int border)
73 : wxStockPreferencesPage (Kind_General)
74 , Page (panel_size, border)
77 wxWindow* CreateWindow (wxWindow* parent)
79 wxPanel* panel = new wxPanel (parent);
80 wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
83 wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
84 table->AddGrowableCol (1, 1);
85 s->Add (table, 1, wxALL | wxEXPAND, _border);
87 _set_language = new wxCheckBox (panel, wxID_ANY, _("Set language"));
88 table->Add (_set_language, 1);
89 _language = new wxChoice (panel, wxID_ANY);
90 _language->Append (wxT ("Deutsch"));
91 _language->Append (wxT ("English"));
92 _language->Append (wxT ("Español"));
93 _language->Append (wxT ("Français"));
94 _language->Append (wxT ("Italiano"));
95 _language->Append (wxT ("Nederlands"));
96 _language->Append (wxT ("Svenska"));
97 table->Add (_language);
99 wxStaticText* restart = add_label_to_sizer (table, panel, _("(restart DCP-o-matic to see language changes)"), false);
100 wxFont font = restart->GetFont();
101 font.SetStyle (wxFONTSTYLE_ITALIC);
102 font.SetPointSize (font.GetPointSize() - 1);
103 restart->SetFont (font);
104 table->AddSpacer (0);
106 add_label_to_sizer (table, panel, _("Threads to use for encoding on this host"), true);
107 _num_local_encoding_threads = new wxSpinCtrl (panel);
108 table->Add (_num_local_encoding_threads, 1);
111 _check_for_updates = new wxCheckBox (panel, wxID_ANY, _("Check for updates on startup"));
112 table->Add (_check_for_updates, 1, wxEXPAND | wxALL);
113 table->AddSpacer (0);
115 _check_for_test_updates = new wxCheckBox (panel, wxID_ANY, _("Check for testing updates as well as stable ones"));
116 table->Add (_check_for_test_updates, 1, wxEXPAND | wxALL);
117 table->AddSpacer (0);
119 Config* config = Config::instance ();
121 _set_language->SetValue (config->language ());
123 if (config->language().get_value_or ("") == "fr") {
124 _language->SetSelection (3);
125 } else if (config->language().get_value_or ("") == "it") {
126 _language->SetSelection (4);
127 } else if (config->language().get_value_or ("") == "es") {
128 _language->SetSelection (2);
129 } else if (config->language().get_value_or ("") == "sv") {
130 _language->SetSelection (6);
131 } else if (config->language().get_value_or ("") == "de") {
132 _language->SetSelection (0);
133 } else if (config->language().get_value_or ("") == "nl") {
134 _language->SetSelection (5);
136 _language->SetSelection (1);
139 setup_language_sensitivity ();
141 _set_language->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::set_language_changed, this));
142 _language->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&GeneralPage::language_changed, this));
144 _num_local_encoding_threads->SetRange (1, 128);
145 _num_local_encoding_threads->SetValue (config->num_local_encoding_threads ());
146 _num_local_encoding_threads->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&GeneralPage::num_local_encoding_threads_changed, this));
148 _check_for_updates->SetValue (config->check_for_updates ());
149 _check_for_updates->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::check_for_updates_changed, this));
150 _check_for_test_updates->SetValue (config->check_for_test_updates ());
151 _check_for_test_updates->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::check_for_test_updates_changed, this));
157 void setup_language_sensitivity ()
159 _language->Enable (_set_language->GetValue ());
162 void set_language_changed ()
164 setup_language_sensitivity ();
165 if (_set_language->GetValue ()) {
168 Config::instance()->unset_language ();
172 void language_changed ()
174 switch (_language->GetSelection ()) {
176 Config::instance()->set_language ("de");
179 Config::instance()->set_language ("en");
182 Config::instance()->set_language ("es");
185 Config::instance()->set_language ("fr");
188 Config::instance()->set_language ("it");
191 Config::instance()->set_language ("nl");
194 Config::instance()->set_language ("sv");
199 void check_for_updates_changed ()
201 Config::instance()->set_check_for_updates (_check_for_updates->GetValue ());
204 void check_for_test_updates_changed ()
206 Config::instance()->set_check_for_test_updates (_check_for_test_updates->GetValue ());
209 void num_local_encoding_threads_changed ()
211 Config::instance()->set_num_local_encoding_threads (_num_local_encoding_threads->GetValue ());
214 wxCheckBox* _set_language;
216 wxSpinCtrl* _num_local_encoding_threads;
217 wxCheckBox* _check_for_updates;
218 wxCheckBox* _check_for_test_updates;
221 class DefaultsPage : public wxPreferencesPage, public Page
224 DefaultsPage (wxSize panel_size, int border)
225 : Page (panel_size, border)
228 wxString GetName () const
230 return _("Defaults");
234 wxBitmap GetLargeIcon () const
236 return wxBitmap ("defaults", wxBITMAP_TYPE_PNG_RESOURCE);
240 wxWindow* CreateWindow (wxWindow* parent)
242 wxPanel* panel = new wxPanel (parent);
243 wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
246 wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
247 table->AddGrowableCol (1, 1);
248 s->Add (table, 1, wxALL | wxEXPAND, _border);
251 add_label_to_sizer (table, panel, _("Default duration of still images"), true);
252 wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
253 _still_length = new wxSpinCtrl (panel);
254 s->Add (_still_length);
255 add_label_to_sizer (s, panel, _("s"), false);
259 add_label_to_sizer (table, panel, _("Default directory for new films"), true);
260 #ifdef DCPOMATIC_USE_OWN_DIR_PICKER
261 _directory = new DirPickerCtrl (panel);
263 _directory = new wxDirPickerCtrl (panel, wxDD_DIR_MUST_EXIST);
265 table->Add (_directory, 1, wxEXPAND);
267 add_label_to_sizer (table, panel, _("Default ISDCF name details"), true);
268 _isdcf_metadata_button = new wxButton (panel, wxID_ANY, _("Edit..."));
269 table->Add (_isdcf_metadata_button);
271 add_label_to_sizer (table, panel, _("Default container"), true);
272 _container = new wxChoice (panel, wxID_ANY);
273 table->Add (_container);
275 add_label_to_sizer (table, panel, _("Default content type"), true);
276 _dcp_content_type = new wxChoice (panel, wxID_ANY);
277 table->Add (_dcp_content_type);
280 add_label_to_sizer (table, panel, _("Default JPEG2000 bandwidth"), true);
281 wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
282 _j2k_bandwidth = new wxSpinCtrl (panel);
283 s->Add (_j2k_bandwidth);
284 add_label_to_sizer (s, panel, _("Mbit/s"), false);
289 add_label_to_sizer (table, panel, _("Default audio delay"), true);
290 wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
291 _audio_delay = new wxSpinCtrl (panel);
292 s->Add (_audio_delay);
293 add_label_to_sizer (s, panel, _("ms"), false);
297 add_label_to_sizer (table, panel, _("Default issuer"), true);
298 _issuer = new wxTextCtrl (panel, wxID_ANY);
299 table->Add (_issuer, 1, wxEXPAND);
301 add_label_to_sizer (table, panel, _("Default creator"), true);
302 _creator = new wxTextCtrl (panel, wxID_ANY);
303 table->Add (_creator, 1, wxEXPAND);
305 Config* config = Config::instance ();
307 _still_length->SetRange (1, 3600);
308 _still_length->SetValue (config->default_still_length ());
309 _still_length->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&DefaultsPage::still_length_changed, this));
311 _directory->SetPath (std_to_wx (config->default_directory_or (wx_to_std (wxStandardPaths::Get().GetDocumentsDir())).string ()));
312 _directory->Bind (wxEVT_COMMAND_DIRPICKER_CHANGED, boost::bind (&DefaultsPage::directory_changed, this));
314 _isdcf_metadata_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&DefaultsPage::edit_isdcf_metadata_clicked, this, parent));
316 vector<Ratio const *> ratio = Ratio::all ();
318 for (vector<Ratio const *>::iterator i = ratio.begin(); i != ratio.end(); ++i) {
319 _container->Append (std_to_wx ((*i)->nickname ()));
320 if (*i == config->default_container ()) {
321 _container->SetSelection (n);
326 _container->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&DefaultsPage::container_changed, this));
328 vector<DCPContentType const *> const ct = DCPContentType::all ();
330 for (vector<DCPContentType const *>::const_iterator i = ct.begin(); i != ct.end(); ++i) {
331 _dcp_content_type->Append (std_to_wx ((*i)->pretty_name ()));
332 if (*i == config->default_dcp_content_type ()) {
333 _dcp_content_type->SetSelection (n);
338 _dcp_content_type->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&DefaultsPage::dcp_content_type_changed, this));
340 _j2k_bandwidth->SetRange (50, 250);
341 _j2k_bandwidth->SetValue (config->default_j2k_bandwidth() / 1000000);
342 _j2k_bandwidth->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&DefaultsPage::j2k_bandwidth_changed, this));
344 _audio_delay->SetRange (-1000, 1000);
345 _audio_delay->SetValue (config->default_audio_delay ());
346 _audio_delay->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&DefaultsPage::audio_delay_changed, this));
348 _issuer->SetValue (std_to_wx (config->dcp_metadata().issuer));
349 _issuer->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&DefaultsPage::issuer_changed, this));
350 _creator->SetValue (std_to_wx (config->dcp_metadata().creator));
351 _creator->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&DefaultsPage::creator_changed, this));
357 void j2k_bandwidth_changed ()
359 Config::instance()->set_default_j2k_bandwidth (_j2k_bandwidth->GetValue() * 1000000);
362 void audio_delay_changed ()
364 Config::instance()->set_default_audio_delay (_audio_delay->GetValue());
367 void directory_changed ()
369 Config::instance()->set_default_directory (wx_to_std (_directory->GetPath ()));
372 void edit_isdcf_metadata_clicked (wxWindow* parent)
374 ISDCFMetadataDialog* d = new ISDCFMetadataDialog (parent, Config::instance()->default_isdcf_metadata ());
376 Config::instance()->set_default_isdcf_metadata (d->isdcf_metadata ());
380 void still_length_changed ()
382 Config::instance()->set_default_still_length (_still_length->GetValue ());
385 void container_changed ()
387 vector<Ratio const *> ratio = Ratio::all ();
388 Config::instance()->set_default_container (ratio[_container->GetSelection()]);
391 void dcp_content_type_changed ()
393 vector<DCPContentType const *> ct = DCPContentType::all ();
394 Config::instance()->set_default_dcp_content_type (ct[_dcp_content_type->GetSelection()]);
397 void issuer_changed ()
399 dcp::XMLMetadata m = Config::instance()->dcp_metadata ();
400 m.issuer = wx_to_std (_issuer->GetValue ());
401 Config::instance()->set_dcp_metadata (m);
404 void creator_changed ()
406 dcp::XMLMetadata m = Config::instance()->dcp_metadata ();
407 m.creator = wx_to_std (_creator->GetValue ());
408 Config::instance()->set_dcp_metadata (m);
411 wxSpinCtrl* _j2k_bandwidth;
412 wxSpinCtrl* _audio_delay;
413 wxButton* _isdcf_metadata_button;
414 wxSpinCtrl* _still_length;
415 #ifdef DCPOMATIC_USE_OWN_DIR_PICKER
416 DirPickerCtrl* _directory;
418 wxDirPickerCtrl* _directory;
420 wxChoice* _container;
421 wxChoice* _dcp_content_type;
423 wxTextCtrl* _creator;
426 class EncodingServersPage : public wxPreferencesPage, public Page
429 EncodingServersPage (wxSize panel_size, int border)
430 : Page (panel_size, border)
433 wxString GetName () const
439 wxBitmap GetLargeIcon () const
441 return wxBitmap ("servers", wxBITMAP_TYPE_PNG_RESOURCE);
445 wxWindow* CreateWindow (wxWindow* parent)
447 wxPanel* panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, _panel_size);
448 wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
451 _use_any_servers = new wxCheckBox (panel, wxID_ANY, _("Use all servers"));
452 s->Add (_use_any_servers, 0, wxALL, _border);
454 vector<string> columns;
455 columns.push_back (wx_to_std (_("IP address / host name")));
456 _servers_list = new EditableList<string, ServerDialog> (
459 boost::bind (&Config::servers, Config::instance()),
460 boost::bind (&Config::set_servers, Config::instance(), _1),
461 boost::bind (&EncodingServersPage::server_column, this, _1)
464 s->Add (_servers_list, 1, wxEXPAND | wxALL, _border);
466 _use_any_servers->SetValue (Config::instance()->use_any_servers ());
467 _use_any_servers->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&EncodingServersPage::use_any_servers_changed, this));
474 void use_any_servers_changed ()
476 Config::instance()->set_use_any_servers (_use_any_servers->GetValue ());
479 string server_column (string s)
484 wxCheckBox* _use_any_servers;
485 EditableList<string, ServerDialog>* _servers_list;
488 class ColourConversionsPage : public wxPreferencesPage, public Page
491 ColourConversionsPage (wxSize panel_size, int border)
492 : Page (panel_size, border)
495 wxString GetName () const
497 return _("Colour Conversions");
501 wxBitmap GetLargeIcon () const
503 return wxBitmap ("colour_conversions", wxBITMAP_TYPE_PNG_RESOURCE);
506 wxWindow* CreateWindow (wxWindow* parent)
508 wxPanel* panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, _panel_size);
509 wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
512 vector<string> columns;
513 columns.push_back (wx_to_std (_("Name")));
514 wxPanel* list = new EditableList<PresetColourConversion, PresetColourConversionDialog> (
517 boost::bind (&Config::colour_conversions, Config::instance()),
518 boost::bind (&Config::set_colour_conversions, Config::instance(), _1),
519 boost::bind (&ColourConversionsPage::colour_conversion_column, this, _1),
523 s->Add (list, 1, wxEXPAND | wxALL, _border);
528 string colour_conversion_column (PresetColourConversion c)
534 class TMSPage : public wxPreferencesPage, public Page
537 TMSPage (wxSize panel_size, int border)
538 : Page (panel_size, border)
541 wxString GetName () const
547 wxBitmap GetLargeIcon () const
549 return wxBitmap ("tms", wxBITMAP_TYPE_PNG_RESOURCE);
553 wxWindow* CreateWindow (wxWindow* parent)
555 wxPanel* panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, _panel_size);
556 wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
559 wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
560 table->AddGrowableCol (1, 1);
561 s->Add (table, 1, wxALL | wxEXPAND, _border);
563 add_label_to_sizer (table, panel, _("IP address"), true);
564 _tms_ip = new wxTextCtrl (panel, wxID_ANY);
565 table->Add (_tms_ip, 1, wxEXPAND);
567 add_label_to_sizer (table, panel, _("Target path"), true);
568 _tms_path = new wxTextCtrl (panel, wxID_ANY);
569 table->Add (_tms_path, 1, wxEXPAND);
571 add_label_to_sizer (table, panel, _("User name"), true);
572 _tms_user = new wxTextCtrl (panel, wxID_ANY);
573 table->Add (_tms_user, 1, wxEXPAND);
575 add_label_to_sizer (table, panel, _("Password"), true);
576 _tms_password = new wxTextCtrl (panel, wxID_ANY);
577 table->Add (_tms_password, 1, wxEXPAND);
579 Config* config = Config::instance ();
581 _tms_ip->SetValue (std_to_wx (config->tms_ip ()));
582 _tms_ip->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&TMSPage::tms_ip_changed, this));
583 _tms_path->SetValue (std_to_wx (config->tms_path ()));
584 _tms_path->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&TMSPage::tms_path_changed, this));
585 _tms_user->SetValue (std_to_wx (config->tms_user ()));
586 _tms_user->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&TMSPage::tms_user_changed, this));
587 _tms_password->SetValue (std_to_wx (config->tms_password ()));
588 _tms_password->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&TMSPage::tms_password_changed, this));
594 void tms_ip_changed ()
596 Config::instance()->set_tms_ip (wx_to_std (_tms_ip->GetValue ()));
599 void tms_path_changed ()
601 Config::instance()->set_tms_path (wx_to_std (_tms_path->GetValue ()));
604 void tms_user_changed ()
606 Config::instance()->set_tms_user (wx_to_std (_tms_user->GetValue ()));
609 void tms_password_changed ()
611 Config::instance()->set_tms_password (wx_to_std (_tms_password->GetValue ()));
615 wxTextCtrl* _tms_path;
616 wxTextCtrl* _tms_user;
617 wxTextCtrl* _tms_password;
620 class KDMEmailPage : public wxPreferencesPage, public Page
624 KDMEmailPage (wxSize panel_size, int border)
625 : Page (panel_size, border)
628 wxString GetName () const
630 return _("KDM Email");
634 wxBitmap GetLargeIcon () const
636 return wxBitmap ("kdm_email", wxBITMAP_TYPE_PNG_RESOURCE);
640 wxWindow* CreateWindow (wxWindow* parent)
642 /* We have to force both width and height of this one */
644 wxPanel* panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, wxSize (480, 128));
646 wxPanel* panel = new wxPanel (parent);
648 wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
651 wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
652 table->AddGrowableCol (1, 1);
653 s->Add (table, 1, wxTOP | wxLEFT | wxRIGHT | wxEXPAND, _border);
655 add_label_to_sizer (table, panel, _("Outgoing mail server"), true);
656 _mail_server = new wxTextCtrl (panel, wxID_ANY);
657 table->Add (_mail_server, 1, wxEXPAND | wxALL);
659 add_label_to_sizer (table, panel, _("Mail user name"), true);
660 _mail_user = new wxTextCtrl (panel, wxID_ANY);
661 table->Add (_mail_user, 1, wxEXPAND | wxALL);
663 add_label_to_sizer (table, panel, _("Mail password"), true);
664 _mail_password = new wxTextCtrl (panel, wxID_ANY);
665 table->Add (_mail_password, 1, wxEXPAND | wxALL);
667 wxStaticText* plain = add_label_to_sizer (table, panel, _("(password will be stored on disk in plaintext)"), false);
668 wxFont font = plain->GetFont();
669 font.SetStyle (wxFONTSTYLE_ITALIC);
670 font.SetPointSize (font.GetPointSize() - 1);
671 plain->SetFont (font);
672 table->AddSpacer (0);
674 add_label_to_sizer (table, panel, _("From address"), true);
675 _kdm_from = new wxTextCtrl (panel, wxID_ANY);
676 table->Add (_kdm_from, 1, wxEXPAND | wxALL);
678 _kdm_email = new wxTextCtrl (panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (480, 128), wxTE_MULTILINE);
679 s->Add (_kdm_email, 1.5, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, _border);
681 Config* config = Config::instance ();
682 _mail_server->SetValue (std_to_wx (config->mail_server ()));
683 _mail_server->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::mail_server_changed, this));
684 _mail_user->SetValue (std_to_wx (config->mail_user ()));
685 _mail_user->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::mail_user_changed, this));
686 _mail_password->SetValue (std_to_wx (config->mail_password ()));
687 _mail_password->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::mail_password_changed, this));
688 _kdm_from->SetValue (std_to_wx (config->kdm_from ()));
689 _kdm_from->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_from_changed, this));
690 _kdm_email->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_email_changed, this));
691 _kdm_email->SetValue (wx_to_std (Config::instance()->kdm_email ()));
697 void mail_server_changed ()
699 Config::instance()->set_mail_server (wx_to_std (_mail_server->GetValue ()));
702 void mail_user_changed ()
704 Config::instance()->set_mail_user (wx_to_std (_mail_user->GetValue ()));
707 void mail_password_changed ()
709 Config::instance()->set_mail_password (wx_to_std (_mail_password->GetValue ()));
712 void kdm_from_changed ()
714 Config::instance()->set_kdm_from (wx_to_std (_kdm_from->GetValue ()));
717 void kdm_email_changed ()
719 Config::instance()->set_kdm_email (wx_to_std (_kdm_email->GetValue ()));
722 wxTextCtrl* _mail_server;
723 wxTextCtrl* _mail_user;
724 wxTextCtrl* _mail_password;
725 wxTextCtrl* _kdm_from;
726 wxTextCtrl* _kdm_email;
729 class AdvancedPage : public wxStockPreferencesPage, public Page
733 AdvancedPage (wxSize panel_size, int border)
734 : wxStockPreferencesPage (Kind_Advanced)
735 , Page (panel_size, border)
738 wxWindow* CreateWindow (wxWindow* parent)
740 wxPanel* panel = new wxPanel (parent);
742 wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
745 wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
746 table->AddGrowableCol (1, 1);
747 s->Add (table, 1, wxALL | wxEXPAND, _border);
750 add_label_to_sizer (table, panel, _("Maximum JPEG2000 bandwidth"), true);
751 wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
752 _maximum_j2k_bandwidth = new wxSpinCtrl (panel);
753 s->Add (_maximum_j2k_bandwidth, 1);
754 add_label_to_sizer (s, panel, _("Mbit/s"), false);
758 _allow_any_dcp_frame_rate = new wxCheckBox (panel, wxID_ANY, _("Allow any DCP frame rate"));
759 table->Add (_allow_any_dcp_frame_rate, 1, wxEXPAND | wxALL);
760 table->AddSpacer (0);
762 add_label_to_sizer (table, panel, _("Log"), true);
763 _log_general = new wxCheckBox (panel, wxID_ANY, _("General"));
764 table->Add (_log_general, 1, wxEXPAND | wxALL);
765 _log_warning = new wxCheckBox (panel, wxID_ANY, _("Warnings"));
766 table->AddSpacer (0);
767 table->Add (_log_warning, 1, wxEXPAND | wxALL);
768 _log_error = new wxCheckBox (panel, wxID_ANY, _("Errors"));
769 table->AddSpacer (0);
770 table->Add (_log_error, 1, wxEXPAND | wxALL);
771 _log_timing = new wxCheckBox (panel, wxID_ANY, S_("Config|Timing"));
772 table->AddSpacer (0);
773 table->Add (_log_timing, 1, wxEXPAND | wxALL);
775 Config* config = Config::instance ();
777 _maximum_j2k_bandwidth->SetRange (1, 500);
778 _maximum_j2k_bandwidth->SetValue (config->maximum_j2k_bandwidth() / 1000000);
779 _maximum_j2k_bandwidth->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&AdvancedPage::maximum_j2k_bandwidth_changed, this));
780 _allow_any_dcp_frame_rate->SetValue (config->allow_any_dcp_frame_rate ());
781 _allow_any_dcp_frame_rate->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&AdvancedPage::allow_any_dcp_frame_rate_changed, this));
782 _log_general->SetValue (config->log_types() & Log::TYPE_GENERAL);
783 _log_general->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&AdvancedPage::log_changed, this));
784 _log_warning->SetValue (config->log_types() & Log::TYPE_WARNING);
785 _log_warning->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&AdvancedPage::log_changed, this));
786 _log_error->SetValue (config->log_types() & Log::TYPE_ERROR);
787 _log_error->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&AdvancedPage::log_changed, this));
788 _log_timing->SetValue (config->log_types() & Log::TYPE_TIMING);
789 _log_timing->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&AdvancedPage::log_changed, this));
796 void maximum_j2k_bandwidth_changed ()
798 Config::instance()->set_maximum_j2k_bandwidth (_maximum_j2k_bandwidth->GetValue() * 1000000);
801 void allow_any_dcp_frame_rate_changed ()
803 Config::instance()->set_allow_any_dcp_frame_rate (_allow_any_dcp_frame_rate->GetValue ());
809 if (_log_general->GetValue ()) {
810 types |= Log::TYPE_GENERAL;
812 if (_log_warning->GetValue ()) {
813 types |= Log::TYPE_WARNING;
815 if (_log_error->GetValue ()) {
816 types |= Log::TYPE_ERROR;
818 if (_log_timing->GetValue ()) {
819 types |= Log::TYPE_TIMING;
821 Config::instance()->set_log_types (types);
824 wxSpinCtrl* _maximum_j2k_bandwidth;
825 wxCheckBox* _allow_any_dcp_frame_rate;
826 wxCheckBox* _log_general;
827 wxCheckBox* _log_warning;
828 wxCheckBox* _log_error;
829 wxCheckBox* _log_timing;
833 create_config_dialog ()
835 wxPreferencesEditor* e = new wxPreferencesEditor ();
838 /* Width that we force some of the config panels to be on OSX so that
839 the containing window doesn't shrink too much when we select those panels.
840 This is obviously an unpleasant hack.
842 wxSize ps = wxSize (480, -1);
843 int const border = 16;
845 wxSize ps = wxSize (-1, -1);
846 int const border = 8;
849 e->AddPage (new GeneralPage (ps, border));
850 e->AddPage (new DefaultsPage (ps, border));
851 e->AddPage (new EncodingServersPage (ps, border));
852 e->AddPage (new ColourConversionsPage (ps, border));
853 e->AddPage (new TMSPage (ps, border));
854 e->AddPage (new KDMEmailPage (ps, border));
855 e->AddPage (new AdvancedPage (ps, border));