X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fwx_util.cc;h=c05a271f7bfbfa6c8095b6eefcfe01db5c570618;hb=e60bb3e51bd1508b149e6b8f6608f09b5196ae26;hp=cf8b75dd24b78a66a6c0c7438514ca2b57bd2292;hpb=39029279954b1f346d3ba28ec12c58211bfa7436;p=dcpomatic.git diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index cf8b75dd2..c05a271f7 100644 --- a/src/wx/wx_util.cc +++ b/src/wx/wx_util.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2014 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 @@ -52,7 +52,7 @@ add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, bool, int prop) flags |= wxALIGN_RIGHT; t += wxT (":"); } -#endif +#endif wxStaticText* m = new wxStaticText (p, wxID_ANY, t); s->Add (m, prop, flags, 6); return m; @@ -71,7 +71,7 @@ add_label_to_grid_bag_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool, w flags |= wxALIGN_RIGHT; t += wxT (":"); } -#endif +#endif wxStaticText* m = new wxStaticText (p, wxID_ANY, t); s->Add (m, pos, span, flags); return m; @@ -97,7 +97,7 @@ confirm_dialog (wxWindow* parent, wxString m) d->Destroy (); return r == wxID_YES; } - + /** @param s wxWidgets string. * @return Corresponding STL string. @@ -117,50 +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, boost::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 (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 string_client_data (wxClientData* o) { @@ -193,7 +149,7 @@ void checked_set (wxSpinCtrlDouble* widget, double value) { /* XXX: completely arbitrary epsilon */ - if (fabs (widget->GetValue() - value) < 1e-16) { + if (fabs (widget->GetValue() - value) > 1e-16) { widget->SetValue (value); } } @@ -213,7 +169,7 @@ checked_set (wxChoice* widget, string value) if (widget->GetSelection() != -1) { o = widget->GetClientObject (widget->GetSelection ()); } - + if (!o || string_client_data(o) != value) { for (unsigned int i = 0; i < widget->GetCount(); ++i) { if (string_client_data (widget->GetClientObject (i)) == value) { @@ -223,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) { @@ -231,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) { @@ -239,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) { @@ -274,15 +269,21 @@ dcpomatic_setup_i18n () #ifdef DCPOMATIC_WINDOWS locale->AddCatalogLookupPathPrefix (std_to_wx (mo_path().string())); -#endif +#endif + +#ifdef DCPOMATIC_LINUX + locale->AddCatalogLookupPathPrefix (LINUX_LOCALE_PREFIX); -#ifdef DCPOMATIC_POSIX - locale->AddCatalogLookupPathPrefix (POSIX_LOCALE_PREFIX); + /* 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 ("dcpomatic2-wxstd")); #endif - locale->AddCatalog (wxT ("libdcpomatic-wx")); - locale->AddCatalog (wxT ("dcpomatic")); - + locale->AddCatalog (wxT ("libdcpomatic2-wx")); + locale->AddCatalog (wxT ("dcpomatic2")); + if (!locale->IsOk()) { delete locale; locale = new wxLocale (wxLANGUAGE_ENGLISH); @@ -329,3 +330,17 @@ context_translation (wxString s) return t; } + +wxString +time_to_timecode (DCPTime t, float fps) +{ + double w = t.seconds (); + int const h = (w / 3600); + w -= h * 3600; + int const m = (w / 60); + w -= m * 60; + int const s = floor (w); + w -= s; + int const f = rint (w * fps); + return wxString::Format (wxT("%02d:%02d:%02d.%02d"), h, m, s, f); +}