X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fwx_util.cc;h=cf8b75dd24b78a66a6c0c7438514ca2b57bd2292;hb=cb1dfa9ec09af2abf6d10e4bf2764476db83841b;hp=b9e78932ae88b7664bf360b12ea3d859f5119ca1;hpb=f1fab174c7db85a1641bca2830ea75829982723f;p=dcpomatic.git diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index b9e78932a..cf8b75dd2 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-2014 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 @@ -24,9 +24,9 @@ #include #include #include +#include "lib/config.h" +#include "lib/util.h" #include "wx_util.h" -#include "config.h" -#include "util.h" using namespace std; using namespace boost; @@ -40,7 +40,11 @@ using namespace boost; * @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) +#else +add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, bool, int prop) +#endif { int flags = wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT; #ifdef __WXOSX__ @@ -55,7 +59,11 @@ add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, bool left, int prop) } wxStaticText * +#ifdef __WXOSX__ add_label_to_grid_bag_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool left, wxGBPosition pos, wxGBSpan span) +#else +add_label_to_grid_bag_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool, wxGBPosition pos, wxGBSpan span) +#endif { int flags = wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT; #ifdef __WXOSX__ @@ -76,7 +84,7 @@ add_label_to_grid_bag_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool le void error_dialog (wxWindow* parent, wxString m) { - wxMessageDialog* d = new wxMessageDialog (parent, m, _("DVD-o-matic"), wxOK); + wxMessageDialog* d = new wxMessageDialog (parent, m, _("DCP-o-matic"), wxOK); d->ShowModal (); d->Destroy (); } @@ -84,7 +92,7 @@ error_dialog (wxWindow* parent, wxString m) bool confirm_dialog (wxWindow* parent, wxString m) { - wxMessageDialog* d = new wxMessageDialog (parent, m, _("DVD-o-matic"), wxYES_NO | wxICON_QUESTION); + wxMessageDialog* d = new wxMessageDialog (parent, m, _("DCP-o-matic"), wxYES_NO | wxICON_QUESTION); int const r = d->ShowModal (); d->Destroy (); return r == wxID_YES; @@ -97,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. @@ -115,10 +123,10 @@ int const ThreadedStaticText::_update_event_id = 10000; * @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) +ThreadedStaticText::ThreadedStaticText (wxWindow* parent, wxString initial, boost::function fn) : wxStaticText (parent, wxID_ANY, initial) { - Connect (_update_event_id, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (ThreadedStaticText::thread_finished), 0, this); + Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ThreadedStaticText::thread_finished, this, _1), _update_event_id); _thread = new thread (bind (&ThreadedStaticText::run, this, fn)); } @@ -131,18 +139,26 @@ ThreadedStaticText::~ThreadedStaticText () /** Run our thread and post the result to the GUI thread via AddPendingEvent */ void -ThreadedStaticText::run (function fn) +ThreadedStaticText::run (boost::function fn) +try { wxCommandEvent ev (wxEVT_COMMAND_TEXT_UPDATED, _update_event_id); ev.SetString (std_to_wx (fn ())); GetEventHandler()->AddPendingEvent (ev); } +catch (...) +{ + /* Ignore exceptions; marginally better than the program quitting, but + only marginally. + */ +} /** Called in the GUI thread when our worker thread has finished */ void ThreadedStaticText::thread_finished (wxCommandEvent& ev) { SetLabel (ev.GetString ()); + Finished (); } string @@ -173,6 +189,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) { @@ -231,7 +256,7 @@ checked_set (wxRadioButton* widget, bool value) } void -dvdomatic_setup_i18n () +dcpomatic_setup_i18n () { int language = wxLANGUAGE_DEFAULT; @@ -247,21 +272,60 @@ dvdomatic_setup_i18n () if (wxLocale::IsAvailable (language)) { locale = new wxLocale (language, wxLOCALE_LOAD_DEFAULT); -#ifdef DVDOMATIC_WINDOWS +#ifdef DCPOMATIC_WINDOWS locale->AddCatalogLookupPathPrefix (std_to_wx (mo_path().string())); #endif - locale->AddCatalog (wxT ("libdvdomatic-wx")); - locale->AddCatalog (wxT ("dvdomatic")); +#ifdef DCPOMATIC_POSIX + locale->AddCatalogLookupPathPrefix (POSIX_LOCALE_PREFIX); +#endif + + locale->AddCatalog (wxT ("libdcpomatic-wx")); + locale->AddCatalog (wxT ("dcpomatic")); if (!locale->IsOk()) { delete locale; locale = new wxLocale (wxLANGUAGE_ENGLISH); - language = wxLANGUAGE_ENGLISH; } } if (locale) { - dvdomatic_setup_gettext_i18n (wx_to_std (locale->GetCanonicalName ())); + 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; }