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 std::vector<wxTextCtrl*> controls;
51 _editable = new wxPanel (this);
52 auto editable_sizer = new wxBoxSizer (wxHORIZONTAL);
53 _hours = new wxTextCtrl (_editable, wxID_ANY, wxT(""), wxDefaultPosition, s, 0, validator);
54 controls.push_back(_hours);
55 _minutes = new wxTextCtrl (_editable, wxID_ANY, wxT(""), wxDefaultPosition, s, 0, validator);
56 controls.push_back(_minutes);
57 _seconds = new wxTextCtrl (_editable, wxID_ANY, wxT(""), wxDefaultPosition, s, 0, validator);
58 controls.push_back(_seconds);
59 _frames = new wxTextCtrl (_editable, wxID_ANY, wxT(""), wxDefaultPosition, s, 0, validator);
60 controls.push_back(_frames);
62 if (parent->GetLayoutDirection() == wxLayout_RightToLeft) {
63 std::reverse(controls.begin(), controls.end());
66 for (auto i = controls.begin(); i != controls.end(); ++i) {
67 (*i)->SetMaxLength(2);
68 editable_sizer->Add(*i);
69 if (std::next(i) != controls.end()) {
70 add_label_to_sizer(editable_sizer, _editable, wxT (":"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
75 _set_button = new Button (_editable, _("Set"), wxDefaultPosition, small_button_size(parent, _("Set")));
76 editable_sizer->Add (_set_button, 0, wxLEFT | wxRIGHT, 8);
78 _editable->SetSizerAndFit (editable_sizer);
79 _sizer->Add (_editable);
81 _fixed = add_label_to_sizer (_sizer, this, wxT ("42"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
83 _hours->Bind (wxEVT_TEXT, boost::bind (&TimecodeBase::changed, this));
84 _minutes->Bind (wxEVT_TEXT, boost::bind (&TimecodeBase::changed, this));
85 _seconds->Bind (wxEVT_TEXT, boost::bind (&TimecodeBase::changed, this));
86 _frames->Bind (wxEVT_TEXT, boost::bind (&TimecodeBase::changed, this));
88 _set_button->Bind (wxEVT_BUTTON, boost::bind (&TimecodeBase::set_clicked, this));
89 _set_button->Enable (false);
94 SetSizerAndFit (_sizer);
98 TimecodeBase::set_focus ()
104 TimecodeBase::clear ()
106 checked_set (_hours, wxT (""));
107 checked_set (_minutes, wxT (""));
108 checked_set (_seconds, wxT (""));
109 checked_set (_frames, wxT (""));
110 checked_set (_fixed, wxT (""));
114 TimecodeBase::changed ()
116 if (_set_button && !_ignore_changed) {
117 _set_button->Enable (true);
122 TimecodeBase::set_clicked ()
126 _set_button->Enable (false);
129 _ignore_changed = true;
130 if (_hours->GetValue().IsEmpty()) {
131 _hours->SetValue(wxT("0"));
133 if (_minutes->GetValue().IsEmpty()) {
134 _minutes->SetValue(wxT("0"));
136 if (_seconds->GetValue().IsEmpty()) {
137 _seconds->SetValue(wxT("0"));
139 if (_frames->GetValue().IsEmpty()) {
140 _frames->SetValue(wxT("0"));
142 _ignore_changed = false;
146 TimecodeBase::set_editable (bool e)
154 TimecodeBase::size (wxWindow* parent)
156 wxClientDC dc (parent);
158 auto size = dc.GetTextExtent(wxT("999"));
160 auto size = dc.GetTextExtent(wxT("99999"));