No-op: remove all trailing whitespace.
[dcpomatic.git] / src / wx / wx_util.cc
index cf8b75dd24b78a66a6c0c7438514ca2b57bd2292..c05a271f7bfbfa6c8095b6eefcfe01db5c570618 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
 
     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<string ()> 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<string ()> 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<pair<string, string> > items)
+{
+       vector<pair<string, string> > 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<pair<string, string> >::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);
+}