Merge master.
[dcpomatic.git] / src / wx / config_dialog.cc
index ee343c5827973df1b9e965a70fd7608aa2ad25e8..f06670dfb222c7d2e613b48ae7055cfd41e335c3 100644 (file)
@@ -28,7 +28,7 @@
 #include <wx/preferences.h>
 #include <wx/filepicker.h>
 #include <wx/spinctrl.h>
-#include <libdcp/colour_matrix.h>
+#include <dcp/colour_matrix.h>
 #include "lib/config.h"
 #include "lib/ratio.h"
 #include "lib/scaler.h"
@@ -52,11 +52,25 @@ using boost::bind;
 using boost::shared_ptr;
 using boost::lexical_cast;
 
-class GeneralPage : public wxStockPreferencesPage
+class Page
 {
 public:
-       GeneralPage ()
+       Page (wxSize panel_size, int border)
+               : _panel_size (panel_size)
+               , _border (border)
+       {}
+
+protected:
+       wxSize _panel_size;
+       int _border;
+};
+
+class GeneralPage : public wxStockPreferencesPage, public Page
+{
+public:
+       GeneralPage (wxSize panel_size, int border)
                : wxStockPreferencesPage (Kind_General)
+               , Page (panel_size, border)
        {}
 
        wxWindow* CreateWindow (wxWindow* parent)
@@ -67,17 +81,18 @@ public:
 
                wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
                table->AddGrowableCol (1, 1);
-               s->Add (table, 1, wxALL | wxEXPAND, 8);
+               s->Add (table, 1, wxALL | wxEXPAND, _border);
                
                _set_language = new wxCheckBox (panel, wxID_ANY, _("Set language"));
                table->Add (_set_language, 1);
                _language = new wxChoice (panel, wxID_ANY);
+               _language->Append (wxT ("Deutsch"));
                _language->Append (wxT ("English"));
+               _language->Append (wxT ("Español"));
                _language->Append (wxT ("Français"));
                _language->Append (wxT ("Italiano"));
-               _language->Append (wxT ("Español"));
+               _language->Append (wxT ("Nederlands"));
                _language->Append (wxT ("Svenska"));
-               _language->Append (wxT ("Deutsch"));
                table->Add (_language);
                
                wxStaticText* restart = add_label_to_sizer (table, panel, _("(restart DCP-o-matic to see language changes)"), false);
@@ -90,6 +105,14 @@ public:
                add_label_to_sizer (table, panel, _("Threads to use for encoding on this host"), true);
                _num_local_encoding_threads = new wxSpinCtrl (panel);
                table->Add (_num_local_encoding_threads, 1);
+
+               add_label_to_sizer (table, panel, _("Maximum JPEG2000 bandwidth"), true);
+               _maximum_j2k_bandwidth = new wxSpinCtrl (panel);
+               table->Add (_maximum_j2k_bandwidth, 1);
+
+               _allow_any_dcp_frame_rate = new wxCheckBox (panel, wxID_ANY, _("Allow any DCP frame rate"));
+               table->Add (_allow_any_dcp_frame_rate, 1, wxEXPAND | wxALL);
+               table->AddSpacer (0);
                
                add_label_to_sizer (table, panel, _("Outgoing mail server"), true);
                _mail_server = new wxTextCtrl (panel, wxID_ANY);
@@ -124,17 +147,19 @@ public:
                _set_language->SetValue (config->language ());
                
                if (config->language().get_value_or ("") == "fr") {
-                       _language->SetSelection (1);
+                       _language->SetSelection (3);
                } else if (config->language().get_value_or ("") == "it") {
-               _language->SetSelection (2);
+                       _language->SetSelection (4);
                } else if (config->language().get_value_or ("") == "es") {
-                       _language->SetSelection (3);
+                       _language->SetSelection (2);
                } else if (config->language().get_value_or ("") == "sv") {
-                       _language->SetSelection (4);
+                       _language->SetSelection (6);
                } else if (config->language().get_value_or ("") == "de") {
+                       _language->SetSelection (0);
+               } else if (config->language().get_value_or ("") == "nl") {
                        _language->SetSelection (5);
                } else {
-                       _language->SetSelection (0);
+                       _language->SetSelection (1);
                }
                
                setup_language_sensitivity ();
@@ -145,6 +170,10 @@ public:
                _num_local_encoding_threads->SetRange (1, 128);
                _num_local_encoding_threads->SetValue (config->num_local_encoding_threads ());
                _num_local_encoding_threads->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&GeneralPage::num_local_encoding_threads_changed, this));
+
+               _maximum_j2k_bandwidth->SetRange (1, 500);
+               _maximum_j2k_bandwidth->SetValue (config->maximum_j2k_bandwidth() / 1000000);
+               _maximum_j2k_bandwidth->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&GeneralPage::maximum_j2k_bandwidth_changed, this));
                
                _mail_server->SetValue (std_to_wx (config->mail_server ()));
                _mail_server->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&GeneralPage::mail_server_changed, this));
@@ -158,6 +187,8 @@ public:
                _check_for_updates->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::check_for_updates_changed, this));
                _check_for_test_updates->SetValue (config->check_for_test_updates ());
                _check_for_test_updates->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::check_for_test_updates_changed, this));
+               _allow_any_dcp_frame_rate->SetValue (config->allow_any_dcp_frame_rate ());
+               _allow_any_dcp_frame_rate->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::allow_any_dcp_frame_rate_changed, this));
                
                return panel;
        }
@@ -182,22 +213,25 @@ private:
        {
                switch (_language->GetSelection ()) {
                case 0:
-                       Config::instance()->set_language ("en");
+                       Config::instance()->set_language ("de");
                        break;
                case 1:
-                       Config::instance()->set_language ("fr");
+                       Config::instance()->set_language ("en");
                        break;
                case 2:
-                       Config::instance()->set_language ("it");
+                       Config::instance()->set_language ("es");
                        break;
                case 3:
-                       Config::instance()->set_language ("es");
+                       Config::instance()->set_language ("fr");
                        break;
                case 4:
-                       Config::instance()->set_language ("sv");
+                       Config::instance()->set_language ("it");
                        break;
                case 5:
-                       Config::instance()->set_language ("de");
+                       Config::instance()->set_language ("nl");
+                       break;
+               case 6:
+                       Config::instance()->set_language ("sv");
                        break;
                }
        }
@@ -236,10 +270,22 @@ private:
        {
                Config::instance()->set_num_local_encoding_threads (_num_local_encoding_threads->GetValue ());
        }
+
+       void maximum_j2k_bandwidth_changed ()
+       {
+               Config::instance()->set_maximum_j2k_bandwidth (_maximum_j2k_bandwidth->GetValue() * 1000000);
+       }
+
+       void allow_any_dcp_frame_rate_changed ()
+       {
+               Config::instance()->set_allow_any_dcp_frame_rate (_allow_any_dcp_frame_rate->GetValue ());
+       }
        
        wxCheckBox* _set_language;
        wxChoice* _language;
        wxSpinCtrl* _num_local_encoding_threads;
+       wxSpinCtrl* _maximum_j2k_bandwidth;
+       wxCheckBox* _allow_any_dcp_frame_rate;
        wxTextCtrl* _mail_server;
        wxTextCtrl* _mail_user;
        wxTextCtrl* _mail_password;
@@ -248,9 +294,13 @@ private:
        wxCheckBox* _check_for_test_updates;
 };
 
-class DefaultsPage : public wxPreferencesPage
+class DefaultsPage : public wxPreferencesPage, public Page
 {
 public:
+       DefaultsPage (wxSize panel_size, int border)
+               : Page (panel_size, border)
+       {}
+       
        wxString GetName () const
        {
                return _("Defaults");
@@ -271,7 +321,7 @@ public:
 
                wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
                table->AddGrowableCol (1, 1);
-               s->Add (table, 1, wxALL | wxEXPAND, 8);
+               s->Add (table, 1, wxALL | wxEXPAND, _border);
                
                {
                        add_label_to_sizer (table, panel, _("Default duration of still images"), true);
@@ -422,14 +472,14 @@ private:
 
        void issuer_changed ()
        {
-               libdcp::XMLMetadata m = Config::instance()->dcp_metadata ();
+               dcp::XMLMetadata m = Config::instance()->dcp_metadata ();
                m.issuer = wx_to_std (_issuer->GetValue ());
                Config::instance()->set_dcp_metadata (m);
        }
        
        void creator_changed ()
        {
-               libdcp::XMLMetadata m = Config::instance()->dcp_metadata ();
+               dcp::XMLMetadata m = Config::instance()->dcp_metadata ();
                m.creator = wx_to_std (_creator->GetValue ());
                Config::instance()->set_dcp_metadata (m);
        }
@@ -449,9 +499,13 @@ private:
        wxTextCtrl* _creator;
 };
 
-class EncodingServersPage : public wxPreferencesPage
+class EncodingServersPage : public wxPreferencesPage, public Page
 {
 public:
+       EncodingServersPage (wxSize panel_size, int border)
+               : Page (panel_size, border)
+       {}
+       
        wxString GetName () const
        {
                return _("Servers");
@@ -466,12 +520,12 @@ public:
 
        wxWindow* CreateWindow (wxWindow* parent)
        {
-               wxPanel* panel = new wxPanel (parent);
+               wxPanel* panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, _panel_size);
                wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
                panel->SetSizer (s);
                
                _use_any_servers = new wxCheckBox (panel, wxID_ANY, _("Use all servers"));
-               s->Add (_use_any_servers, 0, wxALL, DCPOMATIC_SIZER_X_GAP);
+               s->Add (_use_any_servers, 0, wxALL, _border);
                
                vector<string> columns;
                columns.push_back (wx_to_std (_("IP address / host name")));
@@ -483,7 +537,7 @@ public:
                        boost::bind (&EncodingServersPage::server_column, this, _1)
                        );
                
-               s->Add (_servers_list, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_X_GAP);
+               s->Add (_servers_list, 1, wxEXPAND | wxALL, _border);
                
                _use_any_servers->SetValue (Config::instance()->use_any_servers ());
                _use_any_servers->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&EncodingServersPage::use_any_servers_changed, this));
@@ -507,8 +561,13 @@ private:
        EditableList<string, ServerDialog>* _servers_list;
 };
 
-class ColourConversionsPage : public wxPreferencesPage
+class ColourConversionsPage : public wxPreferencesPage, public Page
 {
+public:
+       ColourConversionsPage (wxSize panel_size, int border)
+               : Page (panel_size, border)
+       {}
+       
        wxString GetName () const
        {
                return _("Colour Conversions");
@@ -522,16 +581,23 @@ class ColourConversionsPage : public wxPreferencesPage
 #endif 
        wxWindow* CreateWindow (wxWindow* parent)
        {
+               wxPanel* panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, _panel_size);
+               wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
+               panel->SetSizer (s);
+
                vector<string> columns;
                columns.push_back (wx_to_std (_("Name")));
-               return new EditableList<PresetColourConversion, PresetColourConversionDialog> (
-                       parent,
+               wxPanel* list = new EditableList<PresetColourConversion, PresetColourConversionDialog> (
+                       panel,
                        columns,
                        boost::bind (&Config::colour_conversions, Config::instance()),
                        boost::bind (&Config::set_colour_conversions, Config::instance(), _1),
                        boost::bind (&ColourConversionsPage::colour_conversion_column, this, _1),
                        300
                        );
+
+               s->Add (list, 1, wxEXPAND | wxALL, _border);
+               return panel;
        }
 
 private:
@@ -541,8 +607,13 @@ private:
        }
 };
 
-class TMSPage : public wxPreferencesPage
+class TMSPage : public wxPreferencesPage, public Page
 {
+public:
+       TMSPage (wxSize panel_size, int border)
+               : Page (panel_size, border)
+       {}
+
        wxString GetName () const
        {
                return _("TMS");
@@ -557,13 +628,13 @@ class TMSPage : public wxPreferencesPage
 
        wxWindow* CreateWindow (wxWindow* parent)
        {
-               wxPanel* panel = new wxPanel (parent);
+               wxPanel* panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, _panel_size);
                wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
                panel->SetSizer (s);
 
                wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
                table->AddGrowableCol (1, 1);
-               s->Add (table, 1, wxALL | wxEXPAND, 8);
+               s->Add (table, 1, wxALL | wxEXPAND, _border);
                
                add_label_to_sizer (table, panel, _("IP address"), true);
                _tms_ip = new wxTextCtrl (panel, wxID_ANY);
@@ -622,9 +693,14 @@ private:
        wxTextCtrl* _tms_password;
 };
 
-class KDMEmailPage : public wxPreferencesPage
+class KDMEmailPage : public wxPreferencesPage, public Page
 {
 public:
+
+       KDMEmailPage (wxSize panel_size, int border)
+               : Page (panel_size, border)
+       {}
+       
        wxString GetName () const
        {
                return _("KDM Email");
@@ -639,12 +715,17 @@ public:
 
        wxWindow* CreateWindow (wxWindow* parent)
        {
+               /* We have to force both width and height of this one */
+#ifdef DCPOMATIC_OSX
+               wxPanel* panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, wxSize (480, 128));
+#else          
                wxPanel* panel = new wxPanel (parent);
+#endif         
                wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
                panel->SetSizer (s);
                
-               _kdm_email = new wxTextCtrl (panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
-               s->Add (_kdm_email, 1, wxEXPAND | wxALL, 12);
+               _kdm_email = new wxTextCtrl (panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (480, 128), wxTE_MULTILINE);
+               s->Add (_kdm_email, 1, wxEXPAND | wxALL, _border);
                
                _kdm_email->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_email_changed, this));
                _kdm_email->SetValue (wx_to_std (Config::instance()->kdm_email ()));
@@ -665,11 +746,27 @@ wxPreferencesEditor*
 create_config_dialog ()
 {
        wxPreferencesEditor* e = new wxPreferencesEditor ();
-       e->AddPage (new GeneralPage);
-       e->AddPage (new DefaultsPage);
-       e->AddPage (new EncodingServersPage);
-       e->AddPage (new ColourConversionsPage);
-       e->AddPage (new TMSPage);
-       e->AddPage (new KDMEmailPage);
+
+#ifdef DCPOMATIC_OSX
+       /* Width that we force some of the config panels to be on OSX so that
+          the containing window doesn't shrink too much when we select those panels.
+          This is obviously an unpleasant hack.
+       */
+       wxSize ps = wxSize (480, -1);
+       int const border = 16;
+#else
+       /* We seem to need to specify height here, otherwise the general panel
+          is too short (at least on Linux).
+        */
+       wxSize ps = wxSize (-1, 400);
+       int const border = 8;
+#endif
+       
+       e->AddPage (new GeneralPage (ps, border));
+       e->AddPage (new DefaultsPage (ps, border));
+       e->AddPage (new EncodingServersPage (ps, border));
+       e->AddPage (new ColourConversionsPage (ps, border));
+       e->AddPage (new TMSPage (ps, border));
+       e->AddPage (new KDMEmailPage (ps, border));
        return e;
 }