#include"timectrl.h" ctTimeCtrl::ctTimeCtrl(wxWindow *parent, double seconds) : wxTextCtrl(parent, wxID_ANY) { SetSeconds(seconds); Bind(wxEVT_CHAR, [this](wxKeyEvent& ev){ if(ev.GetKeyCode() == WXK_LEFT || ev.GetKeyCode() == WXK_RIGHT) ev.Skip(); else if(ev.GetKeyCode() >= '0' && ev.GetKeyCode() <= '9') { uint32_t c = GetValue()[GetInsertionPoint()].GetValue(); if(c >= '0' && c <= '9') { // SetValue calls EVT_TEXT wxString neu = GetValue().Clone(); neu.SetChar(GetInsertionPoint(), ev.GetUnicodeKey()); SetValue(neu); CallAfter([this](){ SetInsertionPoint(GetInsertionPoint() + 1); }); } } else if(GetInsertionPoint() < (long) GetValue().Length() && GetValue()[GetInsertionPoint()].GetValue() == ev.GetUnicodeKey()) { CallAfter([this](){ SetInsertionPoint(GetInsertionPoint() + 1); }); } }); Bind(wxEVT_TEXT, [this](wxCommandEvent &ev){ long h, m; double s; GetValue().ToCLong(&h); GetValue().Mid(3).ToCLong(&m); GetValue().Mid(6).ToCDouble(&s); this->seconds = (h * 60 + m) * 60 + s; }); } double ctTimeCtrl::GetSeconds() { return seconds; } void ctTimeCtrl::SetSeconds(double seconds) { this->seconds = seconds; ChangeValue(wxString::Format("%02i:%02i:%02.3g", (int) (seconds / 3600), (int) (seconds / 60), fmodf(seconds, 60))); }