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