diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-05-26 00:21:53 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-05-26 00:21:53 +0100 |
| commit | c77dabbe4e6bb031edf4aa82f5e890fe605bafe1 (patch) | |
| tree | d3a3f2f34b44eecedabc0240ea82c741b49385ba /src/wx/timecode.cc | |
| parent | 996b0c06e23bcb6b300d7b8799df94993692e07d (diff) | |
Add unfinished timing tab; fix crash on reconstruction of timeline; fix lack of black / silence at end of films.
Diffstat (limited to 'src/wx/timecode.cc')
| -rw-r--r-- | src/wx/timecode.cc | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/wx/timecode.cc b/src/wx/timecode.cc new file mode 100644 index 000000000..460f7423b --- /dev/null +++ b/src/wx/timecode.cc @@ -0,0 +1,90 @@ +/* + Copyright (C) 2013 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <boost/lexical_cast.hpp> +#include "timecode.h" +#include "wx_util.h" + +using std::string; +using boost::lexical_cast; + +Timecode::Timecode (wxWindow* parent) + : wxPanel (parent) +{ + wxClientDC dc (parent); + wxSize size = dc.GetTextExtent (wxT ("9999")); + size.SetHeight (-1); + + wxTextValidator validator (wxFILTER_INCLUDE_CHAR_LIST); + wxArrayString list; + + string n = "0123456789"; + for (size_t i = 0; i < n.length(); ++i) { + list.Add (n[i]); + } + + validator.SetIncludes (list); + + wxBoxSizer* sizer = new wxBoxSizer (wxHORIZONTAL); + _hours = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size, 0, validator); + _hours->SetMaxLength (2); + sizer->Add (_hours); + add_label_to_sizer (sizer, this, ":"); + _minutes = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); + _minutes->SetMaxLength (2); + sizer->Add (_minutes); + add_label_to_sizer (sizer, this, ":"); + _seconds = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); + _seconds->SetMaxLength (2); + sizer->Add (_seconds); + add_label_to_sizer (sizer, this, "."); + _frames = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size); + _frames->SetMaxLength (2); + sizer->Add (_frames); + + SetSizerAndFit (sizer); +} + +void +Timecode::set (Time t, int fps) +{ + int const h = t / (3600 * TIME_HZ); + t -= h * 3600 * TIME_HZ; + int const m = t / (60 * TIME_HZ); + t -= m * 60 * TIME_HZ; + int const s = t / 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)); +} + +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; + return t; +} |
