X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ftime_picker.cc;h=966671be9ac100f8c876707a4ad8b8ff038068b3;hb=f802565830bed9ec9e7ad6c16ccaa7b0700625d9;hp=a18182138af0be609e4136315d329333f80ef4d8;hpb=422be0eece2bf6ee80db1d3c21553cd82efff789;p=dcpomatic.git diff --git a/src/wx/time_picker.cc b/src/wx/time_picker.cc index a18182138..966671be9 100644 --- a/src/wx/time_picker.cc +++ b/src/wx/time_picker.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Carl Hetherington + Copyright (C) 2016-2020 Carl Hetherington This file is part of DCP-o-matic. @@ -20,9 +20,10 @@ #include "time_picker.h" #include "wx_util.h" -#include "lib/raw_convert.h" +#include "static_text.h" +#include #include -#include +#include #include using std::setfill; @@ -32,88 +33,110 @@ using std::max; using std::string; using std::cout; using boost::bind; +using dcp::locale_convert; -TimePicker::TimePicker (wxWindow* parent, wxDateTime time) + +TimePicker::TimePicker (wxWindow* parent) : wxPanel (parent) - , _block_update (false) +{ + +} + + +TimePickerSpin::TimePickerSpin (wxWindow* parent, wxDateTime time) + : TimePicker (parent) { wxClientDC dc (parent); - wxSize size = dc.GetTextExtent (wxT ("9999")); + wxSize size = dc.GetTextExtent (wxT ("9999999")); size.SetHeight (-1); wxBoxSizer* sizer = new wxBoxSizer (wxHORIZONTAL); - _hours = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); - _hours->SetMaxLength (2); - sizer->Add (_hours, 0); - _hours_spin = new wxSpinButton (this, wxID_ANY); - sizer->Add (_hours_spin, 0, wxLEFT | wxRIGHT, 2); - sizer->Add (new wxStaticText (this, wxID_ANY, wxT (":")), 0, wxALIGN_CENTER_VERTICAL); - _minutes = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); - _minutes->SetMaxLength (2); - sizer->Add (_minutes, 0); - _minutes_spin = new wxSpinButton (this, wxID_ANY); - sizer->Add (_minutes_spin, 0, wxLEFT | wxRIGHT, 2); + _hours = new wxSpinCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); + sizer->Add (_hours, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_GAP); + sizer->Add (new StaticText(this, wxT(":")), 0, wxALIGN_CENTER_VERTICAL); + _minutes = new wxSpinCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); + sizer->Add (_minutes, 1, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_GAP); SetSizerAndFit (sizer); _minutes->MoveAfterInTabOrder (_hours); - _hours_spin->SetValue (time.GetHour ()); - _hours_spin->SetRange (0, 23); - _minutes_spin->SetValue (time.GetMinute ()); - _minutes_spin->SetRange (0, 59); - - update_text (); + _hours->SetValue (time.GetHour ()); + _hours->SetRange (0, 23); + _minutes->SetValue (time.GetMinute ()); + _minutes->SetRange (0, 59); - _hours->Bind (wxEVT_COMMAND_TEXT_UPDATED, (bind (&TimePicker::update_spin, this))); - _minutes->Bind (wxEVT_COMMAND_TEXT_UPDATED, (bind (&TimePicker::update_spin, this))); - _hours_spin->Bind (wxEVT_SPIN, bind (&TimePicker::update_text, this)); - _minutes_spin->Bind (wxEVT_SPIN, bind (&TimePicker::update_text, this)); + _hours->Bind (wxEVT_SPINCTRL, (bind (&TimePickerSpin::changed, this))); + _minutes->Bind (wxEVT_SPINCTRL, (bind (&TimePickerSpin::changed, this))); } + void -TimePicker::update_text () +TimePickerSpin::changed () { - if (_block_update) { - return; - } - - _block_update = true; + Changed (); +} - _hours->SetValue (std_to_wx (raw_convert (_hours_spin->GetValue ()))); - locked_stringstream m; - m << setfill('0') << setw(2) << _minutes_spin->GetValue(); - _minutes->SetValue (std_to_wx (m.str())); +int +TimePickerSpin::hours () const +{ + return _hours->GetValue(); +} - _block_update = false; - Changed (); +int +TimePickerSpin::minutes () const +{ + return _minutes->GetValue(); } -void -TimePicker::update_spin () + +TimePickerText::TimePickerText (wxWindow* parent, wxDateTime time) + : TimePicker (parent) { - if (_block_update) { - return; - } + wxClientDC dc (parent); + wxSize size = dc.GetTextExtent (wxT("99999")); + size.SetHeight (-1); + + wxBoxSizer* sizer = new wxBoxSizer (wxHORIZONTAL); + _hours = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); + sizer->Add (_hours, 1, wxEXPAND | wxLEFT, DCPOMATIC_SIZER_GAP); + sizer->Add (new StaticText (this, wxT (":")), 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 4); + _minutes = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); + sizer->Add (_minutes, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP); + + SetSizerAndFit (sizer); + + _minutes->MoveAfterInTabOrder (_hours); - _block_update = true; - _hours_spin->SetValue (raw_convert (wx_to_std (_hours->GetValue()))); - _minutes_spin->SetValue (raw_convert (wx_to_std (_minutes->GetValue()))); - _block_update = false; + _hours->SetValue (wxString::Format("%d", time.GetHour())); + _minutes->SetValue (wxString::Format("%d", time.GetMinute())); + _hours->Bind (wxEVT_TEXT, (bind(&TimePickerText::changed, this))); + _minutes->Bind (wxEVT_TEXT, (bind(&TimePickerText::changed, this))); +} + + +void +TimePickerText::changed () +{ Changed (); } + int -TimePicker::hours () const +TimePickerText::hours () const { - return _hours_spin->GetValue(); + return max(0, min(23, wxAtoi(_hours->GetValue()))); } + int -TimePicker::minutes () const +TimePickerText::minutes () const { - return _minutes_spin->GetValue(); + return max(0, min(59, wxAtoi(_minutes->GetValue()))); } + + +