summaryrefslogtreecommitdiff
path: root/src/wx
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-09-06 14:19:33 +0100
committerCarl Hetherington <cth@carlh.net>2018-09-06 14:19:33 +0100
commit33a2c1355cc52372565835638bea0dab1e3f85a1 (patch)
treeafeb722b6be3437921d117f62e780cbfbc8b3a74 /src/wx
parentebc29bddd5cbc5cad23cc9b1095d842f55ece5e0 (diff)
Add simple/full interface option and make DCP panel respect it.
Diffstat (limited to 'src/wx')
-rw-r--r--src/wx/dcp_panel.cc199
-rw-r--r--src/wx/dcp_panel.h15
-rw-r--r--src/wx/full_config_dialog.cc27
-rw-r--r--src/wx/wx_util.cc58
-rw-r--r--src/wx/wx_util.h3
5 files changed, 216 insertions, 86 deletions
diff --git a/src/wx/dcp_panel.cc b/src/wx/dcp_panel.cc
index 5c4d3148d..353080928 100644
--- a/src/wx/dcp_panel.cc
+++ b/src/wx/dcp_panel.cc
@@ -65,35 +65,16 @@ DCPPanel::DCPPanel (wxNotebook* n, boost::shared_ptr<Film> film)
_sizer = new wxBoxSizer (wxVERTICAL);
_panel->SetSizer (_sizer);
- wxGridBagSizer* grid = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
- _sizer->Add (grid, 0, wxEXPAND | wxALL, 8);
-
- int r = 0;
+ _grid = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+ _sizer->Add (_grid, 0, wxEXPAND | wxALL, 8);
- add_label_to_sizer (grid, _panel, _("Name"), true, wxGBPosition (r, 0));
+ _name_label = create_label (_panel, _("Name"), true);
_name = new wxTextCtrl (_panel, wxID_ANY);
- grid->Add (_name, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND | wxLEFT | wxRIGHT);
- ++r;
-
FocusManager::instance()->add(_name);
- int flags = wxALIGN_CENTER_VERTICAL;
-#ifdef __WXOSX__
- flags |= wxALIGN_RIGHT;
-#endif
-
_use_isdcf_name = new wxCheckBox (_panel, wxID_ANY, _("Use ISDCF name"));
- grid->Add (_use_isdcf_name, wxGBPosition (r, 0), wxDefaultSpan, flags);
-
- {
- wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
- _edit_isdcf_button = new wxButton (_panel, wxID_ANY, _("Details..."));
- s->Add (_edit_isdcf_button, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_X_GAP);
- _copy_isdcf_name_button = new wxButton (_panel, wxID_ANY, _("Copy as name"));
- s->Add (_copy_isdcf_name_button, 1, wxEXPAND | wxLEFT, DCPOMATIC_SIZER_X_GAP);
- grid->Add (s, wxGBPosition (r, 1), wxDefaultSpan, wxEXPAND);
- ++r;
- }
+ _edit_isdcf_button = new wxButton (_panel, wxID_ANY, _("Details..."));
+ _copy_isdcf_name_button = new wxButton (_panel, wxID_ANY, _("Copy as name"));
/* wxST_ELLIPSIZE_MIDDLE works around a bug in GTK2 and/or wxWidgets, see
http://trac.wxwidgets.org/ticket/12539
@@ -103,79 +84,49 @@ DCPPanel::DCPPanel (wxNotebook* n, boost::shared_ptr<Film> film)
wxALIGN_CENTRE_HORIZONTAL | wxST_NO_AUTORESIZE | wxST_ELLIPSIZE_MIDDLE
);
- grid->Add (_dcp_name, wxGBPosition(r, 0), wxGBSpan (1, 2), wxALIGN_CENTER_VERTICAL | wxEXPAND);
- ++r;
-
- add_label_to_sizer (grid, _panel, _("Content Type"), true, wxGBPosition (r, 0));
+ _dcp_content_type_label = create_label (_panel, _("Content Type"), true);
_dcp_content_type = new wxChoice (_panel, wxID_ANY);
- grid->Add (_dcp_content_type, wxGBPosition (r, 1));
- ++r;
-
- _notebook = new wxNotebook (_panel, wxID_ANY);
- _sizer->Add (_notebook, 1, wxEXPAND | wxTOP, 6);
-
- _notebook->AddPage (make_video_panel (), _("Video"), false);
- _notebook->AddPage (make_audio_panel (), _("Audio"), false);
_signed = new wxCheckBox (_panel, wxID_ANY, _("Signed"));
- grid->Add (_signed, wxGBPosition (r, 0), wxGBSpan (1, 2));
- ++r;
-
_encrypted = new wxCheckBox (_panel, wxID_ANY, _("Encrypted"));
- grid->Add (_encrypted, wxGBPosition (r, 0), wxGBSpan (1, 2));
- ++r;
wxClientDC dc (_panel);
wxSize size = dc.GetTextExtent (wxT ("GGGGGGGG..."));
size.SetHeight (-1);
- {
- add_label_to_sizer (grid, _panel, _("Key"), true, wxGBPosition (r, 0));
- wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
- _key = new wxStaticText (_panel, wxID_ANY, "", wxDefaultPosition, size);
- s->Add (_key, 1, wxALIGN_CENTER_VERTICAL);
- _edit_key = new wxButton (_panel, wxID_ANY, _("Edit..."));
- s->Add (_edit_key);
- grid->Add (s, wxGBPosition (r, 1));
- ++r;
- }
+ _key_label = create_label (_panel, _("Key"), true);
+ _key = new wxStaticText (_panel, wxID_ANY, "", wxDefaultPosition, size);
+ _edit_key = new wxButton (_panel, wxID_ANY, _("Edit..."));
- add_label_to_sizer (grid, _panel, _("Reels"), true, wxGBPosition (r, 0));
+ _reels_label = create_label (_panel, _("Reels"), true);
_reel_type = new wxChoice (_panel, wxID_ANY);
- grid->Add (_reel_type, wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
- ++r;
- add_label_to_sizer (grid, _panel, _("Reel length"), true, wxGBPosition (r, 0));
+ _reel_length_label = create_label (_panel, _("Reel length"), true);
+ _reel_length = new wxSpinCtrl (_panel, wxID_ANY);
+ _reel_length_gb_label = create_label (_panel, _("GB"), false);
- {
- wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
- _reel_length = new wxSpinCtrl (_panel, wxID_ANY);
- s->Add (_reel_length);
- add_label_to_sizer (s, _panel, _("GB"), false);
- grid->Add (s, wxGBPosition (r, 1));
- ++r;
- }
-
- add_label_to_sizer (grid, _panel, _("Standard"), true, wxGBPosition (r, 0));
+ _standard_label = create_label (_panel, _("Standard"), true);
_standard = new wxChoice (_panel, wxID_ANY);
- grid->Add (_standard, wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
- ++r;
_upload_after_make_dcp = new wxCheckBox (_panel, wxID_ANY, _("Upload DCP to TMS after it is made"));
- grid->Add (_upload_after_make_dcp, wxGBPosition (r, 0), wxGBSpan (1, 2));
- ++r;
+
+ _notebook = new wxNotebook (_panel, wxID_ANY);
+ _sizer->Add (_notebook, 1, wxEXPAND | wxTOP, 6);
+
+ _notebook->AddPage (make_video_panel (), _("Video"), false);
+ _notebook->AddPage (make_audio_panel (), _("Audio"), false);
_name->Bind (wxEVT_TEXT, boost::bind (&DCPPanel::name_changed, this));
_use_isdcf_name->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::use_isdcf_name_toggled, this));
_edit_isdcf_button->Bind (wxEVT_BUTTON, boost::bind (&DCPPanel::edit_isdcf_button_clicked, this));
_copy_isdcf_name_button->Bind(wxEVT_BUTTON, boost::bind (&DCPPanel::copy_isdcf_name_button_clicked, this));
- _dcp_content_type->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::dcp_content_type_changed, this));
+ _dcp_content_type->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::dcp_content_type_changed, this));
_signed->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::signed_toggled, this));
_encrypted->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::encrypted_toggled, this));
_edit_key->Bind (wxEVT_BUTTON, boost::bind (&DCPPanel::edit_key_clicked, this));
- _reel_type->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::reel_type_changed, this));
+ _reel_type->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::reel_type_changed, this));
_reel_length->Bind (wxEVT_SPINCTRL, boost::bind (&DCPPanel::reel_length_changed, this));
- _standard->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::standard_changed, this));
+ _standard->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::standard_changed, this));
_upload_after_make_dcp->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::upload_after_make_dcp_changed, this));
BOOST_FOREACH (DCPContentType const * i, DCPContentType::all()) {
@@ -192,7 +143,100 @@ DCPPanel::DCPPanel (wxNotebook* n, boost::shared_ptr<Film> film)
_standard->Append (_("SMPTE"));
_standard->Append (_("Interop"));
- Config::instance()->Changed.connect (boost::bind (&DCPPanel::config_changed, this));
+ Config::instance()->Changed.connect (boost::bind (&DCPPanel::config_changed, this, _1));
+
+ add_to_grid ();
+}
+
+void
+DCPPanel::add_to_grid ()
+{
+ Config::Interface interface = Config::instance()->interface_complexity ();
+
+ int r = 0;
+
+ add_label_to_sizer (_grid, _name_label, true, wxGBPosition (r, 0));
+ _grid->Add (_name, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND | wxLEFT | wxRIGHT);
+ ++r;
+
+ int flags = wxALIGN_CENTER_VERTICAL;
+#ifdef __WXOSX__
+ flags |= wxALIGN_RIGHT;
+#endif
+
+ _use_isdcf_name->Show (interface == Config::INTERFACE_FULL);
+ _edit_isdcf_button->Show (interface == Config::INTERFACE_FULL);
+ _copy_isdcf_name_button->Show (interface == Config::INTERFACE_FULL);
+
+ if (interface == Config::INTERFACE_FULL) {
+ _grid->Add (_use_isdcf_name, wxGBPosition (r, 0), wxDefaultSpan, flags);
+ {
+ wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ s->Add (_edit_isdcf_button, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_X_GAP);
+ s->Add (_copy_isdcf_name_button, 1, wxEXPAND | wxLEFT, DCPOMATIC_SIZER_X_GAP);
+ _grid->Add (s, wxGBPosition (r, 1), wxDefaultSpan, wxEXPAND);
+ }
+ ++r;
+ }
+
+ _grid->Add (_dcp_name, wxGBPosition(r, 0), wxGBSpan (1, 2), wxALIGN_CENTER_VERTICAL | wxEXPAND);
+ ++r;
+
+ add_label_to_sizer (_grid, _dcp_content_type_label, true, wxGBPosition (r, 0));
+ _grid->Add (_dcp_content_type, wxGBPosition (r, 1));
+ ++r;
+
+ _signed->Show (interface == Config::INTERFACE_FULL);
+ if (interface == Config::INTERFACE_FULL) {
+ _grid->Add (_signed, wxGBPosition (r, 0), wxGBSpan (1, 2));
+ ++r;
+ }
+
+ _grid->Add (_encrypted, wxGBPosition (r, 0), wxGBSpan (1, 2));
+ ++r;
+
+ _key_label->Show (interface == Config::INTERFACE_FULL);
+ _key->Show (interface == Config::INTERFACE_FULL);
+ _edit_key->Show (interface == Config::INTERFACE_FULL);
+ _reels_label->Show (interface == Config::INTERFACE_FULL);
+ _reel_type->Show (interface == Config::INTERFACE_FULL);
+ _reel_length_label->Show (interface == Config::INTERFACE_FULL);
+ _reel_length->Show (interface == Config::INTERFACE_FULL);
+ _reel_length_gb_label->Show (interface == Config::INTERFACE_FULL);
+ _standard_label->Show (interface == Config::INTERFACE_FULL);
+ _standard->Show (interface == Config::INTERFACE_FULL);
+ _upload_after_make_dcp->Show (interface == Config::INTERFACE_FULL);
+
+ if (interface == Config::INTERFACE_FULL) {
+ add_label_to_sizer (_grid, _key_label, true, wxGBPosition (r, 0));
+ {
+ wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ s->Add (_key, 1, wxALIGN_CENTER_VERTICAL);
+ s->Add (_edit_key);
+ _grid->Add (s, wxGBPosition (r, 1));
+ }
+ ++r;
+
+ add_label_to_sizer (_grid, _reels_label, true, wxGBPosition (r, 0));
+ _grid->Add (_reel_type, wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
+ ++r;
+
+ add_label_to_sizer (_grid, _reel_length_label, true, wxGBPosition (r, 0));
+ {
+ wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ s->Add (_reel_length);
+ add_label_to_sizer (s, _reel_length_gb_label, false);
+ _grid->Add (s, wxGBPosition (r, 1));
+ }
+ ++r;
+
+ add_label_to_sizer (_grid, _standard_label, true, wxGBPosition (r, 0));
+ _grid->Add (_standard, wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
+ ++r;
+
+ _grid->Add (_upload_after_make_dcp, wxGBPosition (r, 0), wxGBSpan (1, 2));
+ ++r;
+ }
}
void
@@ -624,10 +668,17 @@ DCPPanel::three_d_changed ()
}
void
-DCPPanel::config_changed ()
+DCPPanel::config_changed (Config::Property p)
{
_j2k_bandwidth->SetRange (1, Config::instance()->maximum_j2k_bandwidth() / 1000000);
setup_frame_rate_widget ();
+
+ if (p == Config::INTERFACE_COMPLEXITY) {
+ _grid->Clear ();
+ add_to_grid ();
+ _sizer->Layout ();
+ _grid->Layout ();
+ }
}
void
diff --git a/src/wx/dcp_panel.h b/src/wx/dcp_panel.h
index b8a67b2f5..0311b063e 100644
--- a/src/wx/dcp_panel.h
+++ b/src/wx/dcp_panel.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -18,6 +18,7 @@
*/
+#include "lib/config.h"
#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>
@@ -31,6 +32,7 @@ class wxChoice;
class wxButton;
class wxSpinCtrl;
class wxSizer;
+class wxGridBagSizer;
class AudioDialog;
class Film;
@@ -79,6 +81,7 @@ private:
void setup_frame_rate_widget ();
void setup_container ();
void setup_dcp_name ();
+ void add_to_grid ();
int minimum_allowed_audio_channels () const;
@@ -86,14 +89,16 @@ private:
wxPanel* make_video_panel ();
wxPanel* make_audio_panel ();
- void config_changed ();
+ void config_changed (Config::Property p);
void setup_sensitivity ();
wxPanel* _panel;
wxNotebook* _notebook;
wxBoxSizer* _sizer;
+ wxGridBagSizer* _grid;
+ wxStaticText* _name_label;
wxTextCtrl* _name;
wxStaticText* _dcp_name;
wxCheckBox* _use_isdcf_name;
@@ -102,6 +107,7 @@ private:
wxButton* _edit_isdcf_button;
wxButton* _copy_isdcf_name_button;
wxSpinCtrl* _j2k_bandwidth;
+ wxStaticText* _dcp_content_type_label;
wxChoice* _dcp_content_type;
wxChoice* _frame_rate_choice;
wxSpinCtrl* _frame_rate_spin;
@@ -112,12 +118,17 @@ private:
wxButton* _best_frame_rate;
wxCheckBox* _three_d;
wxChoice* _resolution;
+ wxStaticText* _standard_label;
wxChoice* _standard;
wxCheckBox* _signed;
wxCheckBox* _encrypted;
+ wxStaticText* _key_label;
wxStaticText* _key;
wxButton* _edit_key;
+ wxStaticText* _reels_label;
wxChoice* _reel_type;
+ wxStaticText* _reel_length_label;
+ wxStaticText* _reel_length_gb_label;
wxSpinCtrl* _reel_length;
wxCheckBox* _upload_after_make_dcp;
diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc
index d21c8a2c1..bb4f43bea 100644
--- a/src/wx/full_config_dialog.cc
+++ b/src/wx/full_config_dialog.cc
@@ -85,6 +85,11 @@ private:
int r = 0;
add_language_controls (table, r);
+ add_label_to_sizer (table, _panel, _("Interface complexity"), true, wxGBPosition(r, 0));
+ _interface_complexity = new wxChoice (_panel, wxID_ANY);
+ table->Add (_interface_complexity, wxGBPosition (r, 1));
+ ++r;
+
add_label_to_sizer (table, _panel, _("Number of threads DCP-o-matic should use"), true, wxGBPosition (r, 0));
_master_encoding_threads = new wxSpinCtrl (_panel);
table->Add (_master_encoding_threads, wxGBPosition (r, 1));
@@ -138,6 +143,10 @@ private:
_config_file->Bind (wxEVT_FILEPICKER_CHANGED, boost::bind (&FullGeneralPage::config_file_changed, this));
_cinemas_file->Bind (wxEVT_FILEPICKER_CHANGED, boost::bind (&FullGeneralPage::cinemas_file_changed, this));
+ _interface_complexity->Append (_("Simple"));
+ _interface_complexity->Append (_("Full"));
+ _interface_complexity->Bind (wxEVT_CHOICE, boost::bind(&FullGeneralPage::interface_complexity_changed, this));
+
_master_encoding_threads->SetRange (1, 128);
_master_encoding_threads->Bind (wxEVT_SPINCTRL, boost::bind (&FullGeneralPage::master_encoding_threads_changed, this));
_server_encoding_threads->SetRange (1, 128);
@@ -157,6 +166,14 @@ private:
{
Config* config = Config::instance ();
+ switch (config->interface_complexity()) {
+ case Config::INTERFACE_SIMPLE:
+ checked_set (_interface_complexity, 0);
+ break;
+ case Config::INTERFACE_FULL:
+ checked_set (_interface_complexity, 1);
+ break;
+ }
checked_set (_master_encoding_threads, config->master_encoding_threads ());
checked_set (_server_encoding_threads, config->server_encoding_threads ());
#ifdef DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG
@@ -184,6 +201,15 @@ private:
d->Destroy ();
}
+ void interface_complexity_changed ()
+ {
+ if (_interface_complexity->GetSelection() == 0) {
+ Config::instance()->set_interface_complexity (Config::INTERFACE_SIMPLE);
+ } else {
+ Config::instance()->set_interface_complexity (Config::INTERFACE_FULL);
+ }
+ }
+
#ifdef DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG
void analyse_ebur128_changed ()
@@ -248,6 +274,7 @@ private:
Config::instance()->set_cinemas_file (wx_to_std (_cinemas_file->GetPath ()));
}
+ wxChoice* _interface_complexity;
wxSpinCtrl* _master_encoding_threads;
wxSpinCtrl* _server_encoding_threads;
FilePickerCtrl* _config_file;
diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc
index 4fde32674..7edcabf40 100644
--- a/src/wx/wx_util.cc
+++ b/src/wx/wx_util.cc
@@ -36,6 +36,21 @@ using namespace std;
using namespace boost;
using dcp::locale_convert;
+wxStaticText *
+#ifdef __WXOSX__
+create_label (wxWindow* p, wxString t, bool left)
+#else
+create_label (wxWindow* p, wxString t, bool)
+#endif
+{
+#ifdef __WXOSX__
+ if (left) {
+ t += wxT (":");
+ }
+#endif
+ return new wxStaticText (p, wxID_ANY, t);
+}
+
/** Add a wxStaticText to a wxSizer, aligning it at vertical centre.
* @param s Sizer to add to.
* @param p Parent window for the wxStaticText.
@@ -45,42 +60,65 @@ using dcp::locale_convert;
* @param prop Proportion to pass when calling Add() on the wxSizer.
*/
wxStaticText *
-#ifdef __WXOSX__
add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, bool left, int prop, int flags)
-#else
-add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, bool, int prop, int flags)
-#endif
{
#ifdef __WXOSX__
if (left) {
flags |= wxALIGN_RIGHT;
- t += wxT (":");
}
#endif
- wxStaticText* m = new wxStaticText (p, wxID_ANY, t);
+ wxStaticText* m = create_label (p, t, left);
s->Add (m, prop, flags, 6);
return m;
}
wxStaticText *
#ifdef __WXOSX__
-add_label_to_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool left, wxGBPosition pos, wxGBSpan span)
+add_label_to_sizer (wxSizer* s, wxStaticText* t, bool left, int prop, int flags)
#else
-add_label_to_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool, wxGBPosition pos, wxGBSpan span)
+add_label_to_sizer (wxSizer* s, wxStaticText* t, bool, int prop, int flags)
#endif
{
+#ifdef __WXOSX__
+ if (left) {
+ flags |= wxALIGN_RIGHT;
+ }
+#endif
+ s->Add (t, prop, flags, 6);
+ return t;
+}
+
+wxStaticText *
+add_label_to_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool left, wxGBPosition pos, wxGBSpan span)
+{
int flags = wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT;
#ifdef __WXOSX__
if (left) {
flags |= wxALIGN_RIGHT;
- t += wxT (":");
}
#endif
- wxStaticText* m = new wxStaticText (p, wxID_ANY, t);
+ wxStaticText* m = create_label (p, t, left);
s->Add (m, pos, span, flags);
return m;
}
+wxStaticText *
+#ifdef __WXOSX__
+add_label_to_sizer (wxGridBagSizer* s, wxStaticText* t, bool left, wxGBPosition pos, wxGBSpan span)
+#else
+add_label_to_sizer (wxGridBagSizer* s, wxStaticText* t, bool, wxGBPosition pos, wxGBSpan span)
+#endif
+{
+ int flags = wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT;
+#ifdef __WXOSX__
+ if (left) {
+ flags |= wxALIGN_RIGHT;
+ }
+#endif
+ s->Add (t, pos, span, flags);
+ return t;
+}
+
/** Pop up an error dialogue box.
* @param parent Parent.
* @param m Message.
diff --git a/src/wx/wx_util.h b/src/wx/wx_util.h
index e1a7af1aa..f59f5d683 100644
--- a/src/wx/wx_util.h
+++ b/src/wx/wx_util.h
@@ -72,8 +72,11 @@ class wxSplashScreen;
extern void error_dialog (wxWindow *, wxString, boost::optional<wxString> e = boost::optional<wxString>());
extern void message_dialog (wxWindow *, wxString);
extern bool confirm_dialog (wxWindow *, wxString);
+extern wxStaticText* create_label (wxWindow* p, wxString t, bool left);
extern wxStaticText* add_label_to_sizer (wxSizer *, wxWindow *, wxString, bool left, int prop = 0, int flags = wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT);
+extern wxStaticText* add_label_to_sizer (wxSizer *, wxStaticText *, bool left, int prop = 0, int flags = wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT);
extern wxStaticText* add_label_to_sizer (wxGridBagSizer *, wxWindow *, wxString, bool, wxGBPosition, wxGBSpan span = wxDefaultSpan);
+extern wxStaticText* add_label_to_sizer (wxGridBagSizer *, wxStaticText *, bool, wxGBPosition, wxGBSpan span = wxDefaultSpan);
extern std::string wx_to_std (wxString);
extern wxString std_to_wx (std::string);
extern void dcpomatic_setup_i18n ();