Fix unnecessary shared_ptr; add missing checked_set()s.
[dcpomatic.git] / src / wx / timecode.cc
index 9072fb99e0327f151c45362b450eba6047c823b3..36a01f90d01eacda6c01c707abc8e6c4750d7e87 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include <boost/lexical_cast.hpp>
+#include "lib/util.h"
 #include "timecode.h"
 #include "wx_util.h"
 
@@ -27,7 +28,6 @@ using boost::lexical_cast;
 
 Timecode::Timecode (wxWindow* parent)
        : wxPanel (parent)
-       , _in_set (false)
 {
        wxClientDC dc (parent);
        wxSize size = dc.GetTextExtent (wxT ("9999"));
@@ -47,32 +47,35 @@ 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, wxT (":"));
-       _minutes = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size);
+       add_label_to_sizer (sizer, this, wxT (":"), false);
+       _minutes = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size, 0, validator);
        _minutes->SetMaxLength (2);
        sizer->Add (_minutes);
-       add_label_to_sizer (sizer, this, wxT (":"));
-       _seconds = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size);
+       add_label_to_sizer (sizer, this, wxT (":"), false);
+       _seconds = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size, 0, validator);
        _seconds->SetMaxLength (2);
        sizer->Add (_seconds);
-       add_label_to_sizer (sizer, this, wxT ("."));
-       _frames = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size);
+       add_label_to_sizer (sizer, this, wxT ("."), false);
+       _frames = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size, 0, validator);
        _frames->SetMaxLength (2);
        sizer->Add (_frames);
+       _set_button = new wxButton (this, wxID_ANY, _("Set"));
+       sizer->Add (_set_button, 0, wxLEFT | wxRIGHT, 8);
 
        _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);
+       _set_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (Timecode::set_clicked), 0, this);
 
+       _set_button->Enable (false);
+       
        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);
@@ -81,12 +84,10 @@ Timecode::set (Time t, int fps)
        t -= s * TIME_HZ;
        int const f = t * fps / TIME_HZ;
 
-       _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;
+       checked_set (_hours, lexical_cast<string> (h));
+       checked_set (_minutes, lexical_cast<string> (m));
+       checked_set (_seconds, lexical_cast<string> (s));
+       checked_set (_frames, lexical_cast<string> (f));
 }
 
 Time
@@ -101,15 +102,19 @@ Timecode::get (int fps) const
        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;
-       }
-       
+       _set_button->Enable (true);
+}
+
+void
+Timecode::set_clicked (wxCommandEvent &)
+{
        Changed ();
+       _set_button->Enable (false);
 }