X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ftimecode.h;h=c31a6740c5ea86c86e1fb9a2763dba874a23e85d;hb=7926a03f67cf0a371e43b5d8b4d075c7a789a478;hp=18eddfdb4a19b72fa2eb854e46b53f01e0d453fc;hpb=3828baf56467224f5d44049bf1e7a7ed11f43a05;p=dcpomatic.git diff --git a/src/wx/timecode.h b/src/wx/timecode.h index 18eddfdb4..c31a6740c 100644 --- a/src/wx/timecode.h +++ b/src/wx/timecode.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2015 Carl Hetherington + Copyright (C) 2013-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -22,19 +22,21 @@ #define DCPOMATIC_WX_TIMECODE_H #include "wx_util.h" +#include "lib/dcpomatic_time.h" #include "lib/types.h" +#include #include #include -#include class TimecodeBase : public wxPanel { public: - TimecodeBase (wxWindow *); + TimecodeBase (wxWindow *, bool set_button); void clear (); void set_editable (bool); + void set_focus (); boost::signals2::signal Changed; @@ -52,47 +54,61 @@ protected: wxTextCtrl* _frames; wxButton* _set_button; wxStaticText* _fixed; + + bool _ignore_changed = false; }; template class Timecode : public TimecodeBase { public: - Timecode (wxWindow* parent) - : TimecodeBase (parent) + Timecode (wxWindow* parent, bool set_button = true) + : TimecodeBase (parent, set_button) { } void set (T t, float fps) { - int h; - int m; - int s; - int f; - t.split (fps, h, m, s, f); + auto const hmsf = t.split (fps); - checked_set (_hours, boost::lexical_cast (h)); - checked_set (_minutes, boost::lexical_cast (m)); - checked_set (_seconds, boost::lexical_cast (s)); - checked_set (_frames, boost::lexical_cast (f)); + 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)); } - T get (int fps) const + 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 { - T t; - std::string const h = wx_to_std (_hours->GetValue ()); - t += T::from_seconds (boost::lexical_cast (h.empty() ? "0" : h) * 3600); - std::string const m = wx_to_std (_minutes->GetValue()); - t += T::from_seconds (boost::lexical_cast (m.empty() ? "0" : m) * 60); - std::string const s = wx_to_std (_seconds->GetValue()); - t += T::from_seconds (boost::lexical_cast (s.empty() ? "0" : s)); - std::string const f = wx_to_std (_frames->GetValue()); - t += T::from_seconds (boost::lexical_cast (f.empty() ? "0" : f) / fps); - - return t; + return T(get(), fps); } };