Support for keeping video in sequence when changing lengths; tie selection in timelin...
[dcpomatic.git] / src / wx / timecode.cc
index 460f7423b0d066feb9c8be54a125dec0925bc69f..f8cdccbe2698eacf535bb84a2c3153c4f8a079ae 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"));
@@ -58,12 +60,19 @@ Timecode::Timecode (wxWindow* parent)
        _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 ();
+}