Merge master.
[dcpomatic.git] / src / wx / timecode.cc
index 460f7423b0d066feb9c8be54a125dec0925bc69f..6ce1c1cb8370c729714489cfbdb3d75ada23f9b6 100644 (file)
 #include "wx_util.h"
 
 using std::string;
+using std::cout;
 using boost::lexical_cast;
 
 Timecode::Timecode (wxWindow* parent)
        : wxPanel (parent)
+       , _in_set (false)
 {
        wxClientDC dc (parent);
        wxSize size = dc.GetTextExtent (wxT ("9999"));
@@ -34,8 +36,8 @@ Timecode::Timecode (wxWindow* parent)
        wxTextValidator validator (wxFILTER_INCLUDE_CHAR_LIST);
        wxArrayString list;
 
-       string n = "0123456789";
-       for (size_t i = 0; i < n.length(); ++i) {
+       wxString n (wxT ("0123456789"));
+       for (size_t i = 0; i < n.Length(); ++i) {
                list.Add (n[i]);
        }
 
@@ -45,25 +47,32 @@ Timecode::Timecode (wxWindow* parent)
        _hours = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size, 0, validator);
        _hours->SetMaxLength (2);
        sizer->Add (_hours);
-       add_label_to_sizer (sizer, this, ":");
+       add_label_to_sizer (sizer, this, wxT (":"), false);
        _minutes = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size);
        _minutes->SetMaxLength (2);
        sizer->Add (_minutes);
-       add_label_to_sizer (sizer, this, ":");
+       add_label_to_sizer (sizer, this, wxT (":"), false);
        _seconds = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size);
        _seconds->SetMaxLength (2);
        sizer->Add (_seconds);
-       add_label_to_sizer (sizer, this, ".");
+       add_label_to_sizer (sizer, this, wxT ("."), false);
        _frames = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size);
        _frames->SetMaxLength (2);
        sizer->Add (_frames);
 
+       _hours->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (Timecode::changed), 0, this);
+       _minutes->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (Timecode::changed), 0, this);
+       _seconds->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (Timecode::changed), 0, this);
+       _frames->Connect (wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (Timecode::changed), 0, this);
+
        SetSizerAndFit (sizer);
 }
 
 void
 Timecode::set (Time t, int fps)
 {
+       _in_set = true;
+       
        int const h = t / (3600 * TIME_HZ);
        t -= h * 3600 * TIME_HZ;
        int const m = t / (60 * TIME_HZ);
@@ -72,19 +81,35 @@ Timecode::set (Time t, int fps)
        t -= s * TIME_HZ;
        int const f = t * fps / TIME_HZ;
 
-       _hours->SetValue (wxString::Format ("%02d", h));
-       _minutes->SetValue (wxString::Format ("%02d", m));
-       _seconds->SetValue (wxString::Format ("%02d", s));
-       _frames->SetValue (wxString::Format ("%02d", f));
+       _hours->SetValue (wxString::Format (wxT ("%d"), h));
+       _minutes->SetValue (wxString::Format (wxT ("%d"), m));
+       _seconds->SetValue (wxString::Format (wxT ("%d"), s));
+       _frames->SetValue (wxString::Format (wxT ("%d"), f));
+
+       _in_set = false;
 }
 
 Time
 Timecode::get (int fps) const
 {
        Time t = 0;
-       t += lexical_cast<int> (wx_to_std (_hours->GetValue())) * 3600 * TIME_HZ;
-       t += lexical_cast<int> (wx_to_std (_minutes->GetValue())) * 60 * TIME_HZ;
-       t += lexical_cast<int> (wx_to_std (_seconds->GetValue())) * TIME_HZ;
-       t += lexical_cast<int> (wx_to_std (_frames->GetValue())) * TIME_HZ / fps;
+       string const h = wx_to_std (_hours->GetValue ());
+       t += lexical_cast<int> (h.empty() ? "0" : h) * 3600 * TIME_HZ;
+       string const m = wx_to_std (_minutes->GetValue());
+       t += lexical_cast<int> (m.empty() ? "0" : m) * 60 * TIME_HZ;
+       string const s = wx_to_std (_seconds->GetValue());
+       t += lexical_cast<int> (s.empty() ? "0" : s) * TIME_HZ;
+       string const f = wx_to_std (_frames->GetValue());
+       t += lexical_cast<int> (f.empty() ? "0" : f) * TIME_HZ / fps;
        return t;
 }
+
+void
+Timecode::changed (wxCommandEvent &)
+{
+       if (_in_set) {
+               return;
+       }
+       
+       Changed ();
+}