GTK3 KDM window fixes backported from v2.15.x.
authorCarl Hetherington <cth@carlh.net>
Mon, 26 Oct 2020 11:36:12 +0000 (11:36 +0000)
committerCarl Hetherington <cth@carlh.net>
Mon, 26 Oct 2020 11:36:12 +0000 (11:36 +0000)
src/wx/kdm_timing_panel.cc
src/wx/time_picker.cc
src/wx/time_picker.h

index e0e5ac44f4a3c87b9dcc3e3982ec26fb23bd5af9..51a99627c902d0260a5eb4e73f4e61866424bd6a 100644 (file)
@@ -33,13 +33,29 @@ KDMTimingPanel::KDMTimingPanel (wxWindow* parent)
 {
        wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL);
 
+#ifdef __WXGTK3__
+       /* wxDatePickerCtrl is too small with the GTK3 backend so we need to make it bigger with some fudge factors */
+       wxClientDC dc (parent);
+       wxSize size = dc.GetTextExtent (wxT("99/99/9999"));
+       size.SetWidth (size.GetWidth() * 1.75);
+       size.SetHeight (-1);
+#else
+       wxSize size = wxDefaultSize;
+#endif
+
        wxSizer* table = new wxBoxSizer (wxHORIZONTAL);
        add_label_to_sizer (table, this, _("From"), true);
        wxDateTime from;
        from.SetToCurrent ();
-       _from_date = new wxDatePickerCtrl (this, wxID_ANY, from);
+       _from_date = new wxDatePickerCtrl (this, wxID_ANY, from, wxDefaultPosition, size);
        table->Add (_from_date, 0, wxALIGN_CENTER_VERTICAL);
-       _from_time = new TimePicker (this, from);
+
+#ifdef __WXGTK3__
+       _from_time = new TimePickerText (this, from);
+#else
+       _from_time = new TimePickerSpin (this, from);
+#endif
+
 #ifdef DCPOMATIC_OSX
        /* Hack to tweak alignment, which I can't get right by "proper" means for some reason */
        table->Add (_from_time, 0, wxALIGN_CENTER_VERTICAL | wxTOP, 4);
@@ -51,9 +67,15 @@ KDMTimingPanel::KDMTimingPanel (wxWindow* parent)
        wxDateTime to = from;
        /* 1 week from now */
        to.Add (wxDateSpan (0, 0, 1, 0));
-       _until_date = new wxDatePickerCtrl (this, wxID_ANY, to);
+       _until_date = new wxDatePickerCtrl (this, wxID_ANY, to, wxDefaultPosition, size);
        table->Add (_until_date, 0, wxALIGN_CENTER_VERTICAL);
-       _until_time = new TimePicker (this, to);
+
+#ifdef __WXGTK3__
+       _until_time = new TimePickerText (this, to);
+#else
+       _until_time = new TimePickerSpin (this, to);
+#endif
+
 #ifdef DCPOMATIC_OSX
        table->Add (_until_time, 0, wxALIGN_CENTER_VERTICAL | wxTOP, 4);
 #else
index efd5e20eddf764205c459df5f7a093e674c83675..63d6d4f847e88d273de2c5cfa2cc79cd40527f53 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2016-2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2016-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -35,9 +35,17 @@ using std::cout;
 using boost::bind;
 using dcp::locale_convert;
 
-TimePicker::TimePicker (wxWindow* parent, wxDateTime time)
+
+TimePicker::TimePicker (wxWindow* parent)
        : wxPanel (parent)
 {
+
+}
+
+
+TimePickerSpin::TimePickerSpin (wxWindow* parent, wxDateTime time)
+       : TimePicker (parent)
+{
        wxClientDC dc (parent);
        wxSize size = dc.GetTextExtent (wxT ("9999999"));
        size.SetHeight (-1);
@@ -58,24 +66,77 @@ TimePicker::TimePicker (wxWindow* parent, wxDateTime time)
        _minutes->SetValue (time.GetMinute ());
        _minutes->SetRange (0, 59);
 
-       _hours->Bind (wxEVT_SPINCTRL, (bind (&TimePicker::spin_changed, this)));
-       _minutes->Bind (wxEVT_SPINCTRL, (bind (&TimePicker::spin_changed, this)));
+       _hours->Bind (wxEVT_SPINCTRL, (bind (&TimePickerSpin::changed, this)));
+       _minutes->Bind (wxEVT_SPINCTRL, (bind (&TimePickerSpin::changed, this)));
 }
 
+
 void
-TimePicker::spin_changed ()
+TimePickerSpin::changed ()
 {
        Changed ();
 }
 
+
 int
-TimePicker::hours () const
+TimePickerSpin::hours () const
 {
        return _hours->GetValue();
 }
 
+
 int
-TimePicker::minutes () const
+TimePickerSpin::minutes () const
 {
        return _minutes->GetValue();
 }
+
+
+TimePickerText::TimePickerText (wxWindow* parent, wxDateTime time)
+       : TimePicker (parent)
+{
+       wxClientDC dc (parent);
+       wxSize size = dc.GetTextExtent (wxT("99999"));
+       size.SetHeight (-1);
+
+       wxBoxSizer* sizer = new wxBoxSizer (wxHORIZONTAL);
+       _hours = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size);
+       sizer->Add (_hours, 1, wxEXPAND | wxLEFT, DCPOMATIC_SIZER_GAP);
+       sizer->Add (new StaticText (this, wxT (":")), 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 4);
+       _minutes = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, size);
+       sizer->Add (_minutes, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP);
+
+       SetSizerAndFit (sizer);
+
+       _minutes->MoveAfterInTabOrder (_hours);
+
+       _hours->SetValue (wxString::Format("%d", time.GetHour()));
+       _minutes->SetValue (wxString::Format("%d", time.GetMinute()));
+
+       _hours->Bind (wxEVT_TEXT, (bind(&TimePickerText::changed, this)));
+       _minutes->Bind (wxEVT_TEXT, (bind(&TimePickerText::changed, this)));
+}
+
+
+void
+TimePickerText::changed ()
+{
+       Changed ();
+}
+
+
+int
+TimePickerText::hours () const
+{
+       return max(0, min(23, wxAtoi(_hours->GetValue())));
+}
+
+
+int
+TimePickerText::minutes () const
+{
+       return max(0, min(59, wxAtoi(_minutes->GetValue())));
+}
+
+
+
index 53e31a06a8d21e15c26cfe90f3d29b8b1a161de3..9e83c00430709cc158dc1b23d6f530548c01ff39 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2016-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 class wxSpinCtrl;
 
+
 class TimePicker : public wxPanel
 {
 public:
-       TimePicker (wxWindow* parent, wxDateTime time);
+       TimePicker (wxWindow* parent);
 
-       int hours () const;
-       int minutes () const;
+       virtual int hours () const = 0;
+       virtual int minutes () const = 0;
 
        boost::signals2::signal<void ()> Changed;
+};
+
+
+class TimePickerSpin : public TimePicker
+{
+public:
+       TimePickerSpin (wxWindow* parent, wxDateTime time);
+
+       int hours () const;
+       int minutes () const;
 
 private:
-       void spin_changed ();
+       void changed ();
 
        wxSpinCtrl* _hours;
        wxSpinCtrl* _minutes;
 };
+
+
+class TimePickerText : public TimePicker
+{
+public:
+       TimePickerText (wxWindow* parent, wxDateTime time);
+
+       int hours () const;
+       int minutes () const;
+
+private:
+       void changed ();
+
+       wxTextCtrl* _hours;
+       wxTextCtrl* _minutes;
+};