2 Copyright (C) 2013-2018 Carl Hetherington <cth@carlh.net>
4 This file is part of DCP-o-matic.
6 DCP-o-matic is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 DCP-o-matic is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
22 #include "dcpomatic_button.h"
31 TimecodeBase::TimecodeBase (wxWindow* parent, bool set_button)
35 auto const s = TimecodeBase::size (parent);
37 wxTextValidator validator (wxFILTER_INCLUDE_CHAR_LIST);
40 wxString n (wxT ("0123456789"));
41 for (size_t i = 0; i < n.Length(); ++i) {
45 validator.SetIncludes (list);
47 _sizer = new wxBoxSizer (wxHORIZONTAL);
49 _editable = new wxPanel (this);
50 auto editable_sizer = new wxBoxSizer (wxHORIZONTAL);
51 _hours = new wxTextCtrl (_editable, wxID_ANY, wxT(""), wxDefaultPosition, s, 0, validator);
52 _hours->SetMaxLength (2);
53 editable_sizer->Add (_hours);
54 add_label_to_sizer (editable_sizer, _editable, wxT(":"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
55 _minutes = new wxTextCtrl (_editable, wxID_ANY, wxT(""), wxDefaultPosition, s, 0, validator);
56 _minutes->SetMaxLength (2);
57 editable_sizer->Add (_minutes);
58 add_label_to_sizer (editable_sizer, _editable, wxT (":"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
59 _seconds = new wxTextCtrl (_editable, wxID_ANY, wxT(""), wxDefaultPosition, s, 0, validator);
60 _seconds->SetMaxLength (2);
61 editable_sizer->Add (_seconds);
62 add_label_to_sizer (editable_sizer, _editable, wxT (":"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
63 _frames = new wxTextCtrl (_editable, wxID_ANY, wxT(""), wxDefaultPosition, s, 0, validator);
64 _frames->SetMaxLength (2);
65 editable_sizer->Add (_frames);
68 _set_button = new Button (_editable, _("Set"), wxDefaultPosition, small_button_size(parent, _("Set")));
69 editable_sizer->Add (_set_button, 0, wxLEFT | wxRIGHT, 8);
71 _editable->SetSizerAndFit (editable_sizer);
72 _sizer->Add (_editable);
74 _fixed = add_label_to_sizer (_sizer, this, wxT ("42"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
76 _hours->Bind (wxEVT_TEXT, boost::bind (&TimecodeBase::changed, this));
77 _minutes->Bind (wxEVT_TEXT, boost::bind (&TimecodeBase::changed, this));
78 _seconds->Bind (wxEVT_TEXT, boost::bind (&TimecodeBase::changed, this));
79 _frames->Bind (wxEVT_TEXT, boost::bind (&TimecodeBase::changed, this));
81 _set_button->Bind (wxEVT_BUTTON, boost::bind (&TimecodeBase::set_clicked, this));
82 _set_button->Enable (false);
87 SetSizerAndFit (_sizer);
91 TimecodeBase::set_focus ()
97 TimecodeBase::clear ()
99 checked_set (_hours, wxT (""));
100 checked_set (_minutes, wxT (""));
101 checked_set (_seconds, wxT (""));
102 checked_set (_frames, wxT (""));
103 checked_set (_fixed, wxT (""));
107 TimecodeBase::changed ()
109 if (_set_button && !_ignore_changed) {
110 _set_button->Enable (true);
115 TimecodeBase::set_clicked ()
119 _set_button->Enable (false);
122 _ignore_changed = true;
123 if (_hours->GetValue().IsEmpty()) {
124 _hours->SetValue(wxT("0"));
126 if (_minutes->GetValue().IsEmpty()) {
127 _minutes->SetValue(wxT("0"));
129 if (_seconds->GetValue().IsEmpty()) {
130 _seconds->SetValue(wxT("0"));
132 if (_frames->GetValue().IsEmpty()) {
133 _frames->SetValue(wxT("0"));
135 _ignore_changed = false;
139 TimecodeBase::set_editable (bool e)
147 TimecodeBase::size (wxWindow* parent)
149 wxClientDC dc (parent);
151 auto size = dc.GetTextExtent(wxT("999"));
153 auto size = dc.GetTextExtent(wxT("99999"));