X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Fwx_util.cc;h=ea8255f8169a9ae7fbddf01c5e771ed1dbc7bac1;hp=20fd2df755f30240e93995ac9639386085c67d34;hb=a5e87b6f0f496f4ed71d9129d40a5baebb68495f;hpb=373f010a7f04add1f49169cbaa60cb7ae5f508d4 diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index 20fd2df75..ea8255f81 100644 --- a/src/wx/wx_util.cc +++ b/src/wx/wx_util.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -105,7 +105,7 @@ confirm_dialog (wxWindow* parent, wxString m) string wx_to_std (wxString s) { - return string (s.mb_str ()); + return string (s.ToUTF8 ()); } /** @param s STL string. @@ -117,42 +117,6 @@ std_to_wx (string s) return wxString (s.c_str(), wxConvUTF8); } -int const ThreadedStaticText::_update_event_id = 10000; - -/** @param parent Parent for the wxStaticText. - * @param initial Initial text for the wxStaticText while the computation is being run. - * @param fn Function which works out what the wxStaticText content should be and returns it. - */ -ThreadedStaticText::ThreadedStaticText (wxWindow* parent, wxString initial, function fn) - : wxStaticText (parent, wxID_ANY, initial) -{ - Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ThreadedStaticText::thread_finished, this, _1), _update_event_id); - _thread = new thread (bind (&ThreadedStaticText::run, this, fn)); -} - -ThreadedStaticText::~ThreadedStaticText () -{ - _thread->interrupt (); - _thread->join (); - delete _thread; -} - -/** Run our thread and post the result to the GUI thread via AddPendingEvent */ -void -ThreadedStaticText::run (function fn) -{ - wxCommandEvent ev (wxEVT_COMMAND_TEXT_UPDATED, _update_event_id); - ev.SetString (std_to_wx (fn ())); - GetEventHandler()->AddPendingEvent (ev); -} - -/** Called in the GUI thread when our worker thread has finished */ -void -ThreadedStaticText::thread_finished (wxCommandEvent& ev) -{ - SetLabel (ev.GetString ()); -} - string string_client_data (wxClientData* o) { @@ -181,6 +145,15 @@ checked_set (wxSpinCtrl* widget, int value) } } +void +checked_set (wxSpinCtrlDouble* widget, double value) +{ + /* XXX: completely arbitrary epsilon */ + if (fabs (widget->GetValue() - value) > 1e-16) { + widget->SetValue (value); + } +} + void checked_set (wxChoice* widget, int value) { @@ -206,6 +179,29 @@ checked_set (wxChoice* widget, string value) } } +void +checked_set (wxChoice* widget, vector > items) +{ + vector > current; + for (unsigned int i = 0; i < widget->GetCount(); ++i) { + current.push_back ( + make_pair ( + wx_to_std (widget->GetString (i)), + string_client_data (widget->GetClientObject (i)) + ) + ); + } + + if (current == items) { + return; + } + + widget->Clear (); + for (vector >::const_iterator i = items.begin(); i != items.end(); ++i) { + widget->Append (std_to_wx (i->first), new wxStringClientData (std_to_wx (i->second))); + } +} + void checked_set (wxTextCtrl* widget, string value) { @@ -214,6 +210,14 @@ checked_set (wxTextCtrl* widget, string value) } } +void +checked_set (wxTextCtrl* widget, wxString value) +{ + if (widget->GetValue() != value) { + widget->ChangeValue (value); + } +} + void checked_set (wxStaticText* widget, string value) { @@ -222,6 +226,14 @@ checked_set (wxStaticText* widget, string value) } } +void +checked_set (wxStaticText* widget, wxString value) +{ + if (widget->GetLabel() != value) { + widget->SetLabel (value); + } +} + void checked_set (wxCheckBox* widget, bool value) { @@ -260,9 +272,17 @@ dcpomatic_setup_i18n () #endif #ifdef DCPOMATIC_POSIX - locale->AddCatalogLookupPathPrefix (POSIX_LOCALE_PREFIX); + locale->AddCatalogLookupPathPrefix (LINUX_LOCALE_PREFIX); #endif +#ifdef DCPOMATIC_LINUX + /* We have to include the wxWidgets .mo in our distribution, + so we rename it to avoid clashes with any other installation + of wxWidgets. + */ + locale->AddCatalog (wxT ("dcpomatic-wxstd")); +#endif + locale->AddCatalog (wxT ("libdcpomatic-wx")); locale->AddCatalog (wxT ("dcpomatic")); @@ -276,3 +296,39 @@ dcpomatic_setup_i18n () dcpomatic_setup_gettext_i18n (wx_to_std (locale->GetCanonicalName ())); } } + +int +wx_get (wxSpinCtrl* w) +{ + return w->GetValue (); +} + +int +wx_get (wxChoice* w) +{ + return w->GetSelection (); +} + +double +wx_get (wxSpinCtrlDouble* w) +{ + return w->GetValue (); +} + +/** @param s String of the form Context|String + * @return translation, or String if no translation is available. + */ +wxString +context_translation (wxString s) +{ + wxString t = wxGetTranslation (s); + if (t == s) { + /* No translation; strip the context */ + int c = t.Find (wxT ("|")); + if (c != wxNOT_FOUND) { + t = t.Mid (c + 1); + } + } + + return t; +}