#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"));
_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);
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 ();
+}