X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ftimecode.h;h=84ef5cc1ba2bdae4da4af268d4728617d652eee6;hb=29196ecc58f92432c21bac47dc5a59c6408524b4;hp=b13e8c3c084b9c35514e805f59e752927fe46ae1;hpb=3574212ee42b2bd924eb95d5c0f4f69ec9e0a2f0;p=dcpomatic.git diff --git a/src/wx/timecode.h b/src/wx/timecode.h index b13e8c3c0..84ef5cc1b 100644 --- a/src/wx/timecode.h +++ b/src/wx/timecode.h @@ -1,42 +1,54 @@ /* - Copyright (C) 2013 Carl Hetherington + Copyright (C) 2013-2021 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic 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, + DCP-o-matic 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. + along with DCP-o-matic. If not, see . */ -#include -#include + +#ifndef DCPOMATIC_WX_TIMECODE_H +#define DCPOMATIC_WX_TIMECODE_H + + +#include "wx_util.h" +#include "lib/dcpomatic_time.h" #include "lib/types.h" +#include +#include +#include + -class Timecode : public wxPanel +class TimecodeBase : public wxPanel { public: - Timecode (wxWindow *); + TimecodeBase (wxWindow *, bool set_button); - void set (DCPTime, int); - DCPTime get (int) const; + void clear (); void set_editable (bool); + void set_focus (); boost::signals2::signal Changed; -private: + static wxSize size (wxWindow* parent); + +protected: void changed (); void set_clicked (); - + wxSizer* _sizer; wxPanel* _editable; wxTextCtrl* _hours; @@ -45,5 +57,63 @@ private: wxTextCtrl* _frames; wxButton* _set_button; wxStaticText* _fixed; + + bool _ignore_changed = false; +}; + + +template +class Timecode : public TimecodeBase +{ +public: + Timecode (wxWindow* parent, bool set_button = true) + : TimecodeBase (parent, set_button) + { + + } + + void set (T t, float fps) + { + auto const hmsf = t.split (fps); + + checked_set (_hours, dcp::raw_convert(hmsf.h)); + checked_set (_minutes, dcp::raw_convert(hmsf.m)); + checked_set (_seconds, dcp::raw_convert(hmsf.s)); + checked_set (_frames, dcp::raw_convert(hmsf.f)); + + checked_set (_fixed, t.timecode (fps)); + } + + void set_hint (T t, float fps) + { + auto hmsf = t.split (fps); + + _hours->SetHint (std_to_wx(dcp::raw_convert(hmsf.h))); + _minutes->SetHint (std_to_wx(dcp::raw_convert(hmsf.m))); + _seconds->SetHint (std_to_wx(dcp::raw_convert(hmsf.s))); + _frames->SetHint (std_to_wx(dcp::raw_convert(hmsf.f))); + } + + dcpomatic::HMSF get () const + { + auto value_or_hint = [](wxTextCtrl const * t) { + auto s = wx_to_std (t->GetValue().IsEmpty() ? t->GetHint() : t->GetValue()); + if (s.empty()) { + return 0; + } + return dcp::raw_convert(s); + }; + + return { value_or_hint(_hours), + value_or_hint(_minutes), + value_or_hint(_seconds), + value_or_hint(_frames) }; + } + + T get (float fps) const + { + return T(get(), fps); + } }; +#endif