From 032fc66cea8379791c9a2bc75852a8a11cd19ff1 Mon Sep 17 00:00:00 2001 From: ali kettab Date: Sun, 15 Oct 2023 12:08:41 +0100 Subject: [PATCH] Now wxTimePickerCtrl is a native control under wxQt --- Makefile.in | 43 +++++++++---- build/bakefiles/files.bkl | 2 + build/cmake/files.cmake | 2 + build/files | 2 + include/wx/qt/private/converter.h | 4 ++ include/wx/qt/timectrl.h | 57 +++++++++++++++++ include/wx/timectrl.h | 4 ++ src/qt/converter.cpp | 17 +++++ src/qt/timectrl.cpp | 101 ++++++++++++++++++++++++++++++ 9 files changed, 219 insertions(+), 13 deletions(-) create mode 100644 include/wx/qt/timectrl.h create mode 100644 src/qt/timectrl.cpp diff --git a/Makefile.in b/Makefile.in index 9d3477d663..00c9405c44 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3527,7 +3527,8 @@ COND_TOOLKIT_QT_GUI_HDR = \ $(QT_PLATFORM_HDR) \ wx/qt/treectrl.h \ wx/generic/paletteg.h \ - wx/qt/datectrl.h + wx/qt/datectrl.h \ + wx/qt/timectrl.h @COND_TOOLKIT_QT@GUI_HDR = $(COND_TOOLKIT_QT_GUI_HDR) @COND_TOOLKIT_COCOA@MEDIA_PLATFORM_HDR = @COND_TOOLKIT_GTK@MEDIA_PLATFORM_HDR = @@ -5345,7 +5346,7 @@ COND_TOOLKIT_MSW___GUI_SRC_OBJECTS = \ monodll_msw_calctrl.o \ monodll_msw_datectrl.o \ monodll_msw_datetimectrl.o \ - monodll_timectrl.o \ + monodll_msw_timectrl.o \ monodll_datecontrols.o \ monodll_generic_activityindicator.o \ monodll_msw_imaglist.o \ @@ -5531,7 +5532,8 @@ COND_TOOLKIT_QT___GUI_SRC_OBJECTS = \ $(__QT_PLATFORM_SRC_OBJECTS) \ monodll_qt_treectrl.o \ monodll_paletteg.o \ - monodll_qt_datectrl.o + monodll_qt_datectrl.o \ + monodll_qt_timectrl.o @COND_TOOLKIT_QT@__GUI_SRC_OBJECTS = $(COND_TOOLKIT_QT___GUI_SRC_OBJECTS) @COND_PLATFORM_UNIX_1@__QT_PLATFORM_SRC_OBJECTS = \ @COND_PLATFORM_UNIX_1@ monodll_unix_dialup.o monodll_unix_joystick.o \ @@ -7106,7 +7108,7 @@ COND_TOOLKIT_MSW___GUI_SRC_OBJECTS_1 = \ monolib_msw_calctrl.o \ monolib_msw_datectrl.o \ monolib_msw_datetimectrl.o \ - monolib_timectrl.o \ + monolib_msw_timectrl.o \ monolib_datecontrols.o \ monolib_generic_activityindicator.o \ monolib_msw_imaglist.o \ @@ -7292,7 +7294,8 @@ COND_TOOLKIT_QT___GUI_SRC_OBJECTS_1 = \ $(__QT_PLATFORM_SRC_OBJECTS_1) \ monolib_qt_treectrl.o \ monolib_paletteg.o \ - monolib_qt_datectrl.o + monolib_qt_datectrl.o \ + monolib_qt_timectrl.o @COND_TOOLKIT_QT@__GUI_SRC_OBJECTS_1 = $(COND_TOOLKIT_QT___GUI_SRC_OBJECTS_1) @COND_PLATFORM_UNIX_1@__QT_PLATFORM_SRC_OBJECTS_1 = \ @COND_PLATFORM_UNIX_1@ monolib_unix_dialup.o monolib_unix_joystick.o \ @@ -9019,7 +9022,7 @@ COND_TOOLKIT_MSW___GUI_SRC_OBJECTS_2 = \ coredll_msw_calctrl.o \ coredll_msw_datectrl.o \ coredll_msw_datetimectrl.o \ - coredll_timectrl.o \ + coredll_msw_timectrl.o \ coredll_datecontrols.o \ coredll_generic_activityindicator.o \ coredll_msw_imaglist.o \ @@ -9205,7 +9208,8 @@ COND_TOOLKIT_QT___GUI_SRC_OBJECTS_2 = \ $(__QT_PLATFORM_SRC_OBJECTS_2) \ coredll_qt_treectrl.o \ coredll_paletteg.o \ - coredll_qt_datectrl.o + coredll_qt_datectrl.o \ + coredll_qt_timectrl.o @COND_TOOLKIT_QT@__GUI_SRC_OBJECTS_2 = $(COND_TOOLKIT_QT___GUI_SRC_OBJECTS_2) @COND_PLATFORM_UNIX_1@__QT_PLATFORM_SRC_OBJECTS_2 = \ @COND_PLATFORM_UNIX_1@ coredll_unix_dialup.o coredll_unix_joystick.o \ @@ -10508,7 +10512,7 @@ COND_TOOLKIT_MSW___GUI_SRC_OBJECTS_3 = \ corelib_msw_calctrl.o \ corelib_msw_datectrl.o \ corelib_msw_datetimectrl.o \ - corelib_timectrl.o \ + corelib_msw_timectrl.o \ corelib_datecontrols.o \ corelib_generic_activityindicator.o \ corelib_msw_imaglist.o \ @@ -10694,7 +10698,8 @@ COND_TOOLKIT_QT___GUI_SRC_OBJECTS_3 = \ $(__QT_PLATFORM_SRC_OBJECTS_3) \ corelib_qt_treectrl.o \ corelib_paletteg.o \ - corelib_qt_datectrl.o + corelib_qt_datectrl.o \ + corelib_qt_timectrl.o @COND_TOOLKIT_QT@__GUI_SRC_OBJECTS_3 = $(COND_TOOLKIT_QT___GUI_SRC_OBJECTS_3) @COND_PLATFORM_UNIX_1@__QT_PLATFORM_SRC_OBJECTS_3 = \ @COND_PLATFORM_UNIX_1@ corelib_unix_dialup.o corelib_unix_joystick.o \ @@ -15311,7 +15316,7 @@ monodll_msw_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(MONODLL_ODEP) monodll_msw_datetimectrl.o: $(srcdir)/src/msw/datetimectrl.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/datetimectrl.cpp -monodll_timectrl.o: $(srcdir)/src/msw/timectrl.cpp $(MONODLL_ODEP) +monodll_msw_timectrl.o: $(srcdir)/src/msw/timectrl.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/timectrl.cpp monodll_datecontrols.o: $(srcdir)/src/msw/datecontrols.cpp $(MONODLL_ODEP) @@ -15791,6 +15796,9 @@ monodll_qt_treectrl.o: $(srcdir)/src/qt/treectrl.cpp $(MONODLL_ODEP) monodll_qt_datectrl.o: $(srcdir)/src/qt/datectrl.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/qt/datectrl.cpp +monodll_qt_timectrl.o: $(srcdir)/src/qt/timectrl.cpp $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/qt/timectrl.cpp + monodll_mdig.o: $(srcdir)/src/generic/mdig.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/mdig.cpp @@ -20054,7 +20062,7 @@ monolib_msw_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(MONOLIB_ODEP) monolib_msw_datetimectrl.o: $(srcdir)/src/msw/datetimectrl.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/datetimectrl.cpp -monolib_timectrl.o: $(srcdir)/src/msw/timectrl.cpp $(MONOLIB_ODEP) +monolib_msw_timectrl.o: $(srcdir)/src/msw/timectrl.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/timectrl.cpp monolib_datecontrols.o: $(srcdir)/src/msw/datecontrols.cpp $(MONOLIB_ODEP) @@ -20534,6 +20542,9 @@ monolib_qt_treectrl.o: $(srcdir)/src/qt/treectrl.cpp $(MONOLIB_ODEP) monolib_qt_datectrl.o: $(srcdir)/src/qt/datectrl.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/qt/datectrl.cpp +monolib_qt_timectrl.o: $(srcdir)/src/qt/timectrl.cpp $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/qt/timectrl.cpp + monolib_mdig.o: $(srcdir)/src/generic/mdig.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/mdig.cpp @@ -25475,7 +25486,7 @@ coredll_msw_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(COREDLL_ODEP) coredll_msw_datetimectrl.o: $(srcdir)/src/msw/datetimectrl.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/datetimectrl.cpp -coredll_timectrl.o: $(srcdir)/src/msw/timectrl.cpp $(COREDLL_ODEP) +coredll_msw_timectrl.o: $(srcdir)/src/msw/timectrl.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/timectrl.cpp coredll_datecontrols.o: $(srcdir)/src/msw/datecontrols.cpp $(COREDLL_ODEP) @@ -25955,6 +25966,9 @@ coredll_qt_treectrl.o: $(srcdir)/src/qt/treectrl.cpp $(COREDLL_ODEP) coredll_qt_datectrl.o: $(srcdir)/src/qt/datectrl.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/qt/datectrl.cpp +coredll_qt_timectrl.o: $(srcdir)/src/qt/timectrl.cpp $(COREDLL_ODEP) + $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/qt/timectrl.cpp + coredll_mdig.o: $(srcdir)/src/generic/mdig.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/generic/mdig.cpp @@ -29192,7 +29206,7 @@ corelib_msw_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(CORELIB_ODEP) corelib_msw_datetimectrl.o: $(srcdir)/src/msw/datetimectrl.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/datetimectrl.cpp -corelib_timectrl.o: $(srcdir)/src/msw/timectrl.cpp $(CORELIB_ODEP) +corelib_msw_timectrl.o: $(srcdir)/src/msw/timectrl.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/timectrl.cpp corelib_datecontrols.o: $(srcdir)/src/msw/datecontrols.cpp $(CORELIB_ODEP) @@ -29672,6 +29686,9 @@ corelib_qt_treectrl.o: $(srcdir)/src/qt/treectrl.cpp $(CORELIB_ODEP) corelib_qt_datectrl.o: $(srcdir)/src/qt/datectrl.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/qt/datectrl.cpp +corelib_qt_timectrl.o: $(srcdir)/src/qt/timectrl.cpp $(CORELIB_ODEP) + $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/qt/timectrl.cpp + corelib_mdig.o: $(srcdir)/src/generic/mdig.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/generic/mdig.cpp diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index dfc67ee390..ba1c0ba6cb 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -376,6 +376,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/qt/treectrl.h wx/generic/paletteg.h wx/qt/datectrl.h + wx/qt/timectrl.h @@ -475,6 +476,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/qt/treectrl.cpp src/generic/paletteg.cpp src/qt/datectrl.cpp + src/qt/timectrl.cpp diff --git a/build/cmake/files.cmake b/build/cmake/files.cmake index 91edbe4260..384b229205 100644 --- a/build/cmake/files.cmake +++ b/build/cmake/files.cmake @@ -289,6 +289,7 @@ set(QT_HDR wx/qt/treectrl.h wx/generic/paletteg.h wx/qt/datectrl.h + wx/qt/timectrl.h ) set(QT_SRC @@ -388,6 +389,7 @@ set(QT_SRC src/qt/treectrl.cpp src/generic/paletteg.cpp src/qt/datectrl.cpp + src/qt/timectrl.cpp ) set(MEDIA_QT_SRC diff --git a/build/files b/build/files index e21f810cf6..b72c308e5d 100644 --- a/build/files +++ b/build/files @@ -305,6 +305,7 @@ QT_HDR = wx/qt/textctrl.h wx/qt/textentry.h wx/qt/tglbtn.h + wx/qt/timectrl.h wx/qt/toolbar.h wx/qt/tooltip.h wx/qt/toplevel.h @@ -400,6 +401,7 @@ QT_SRC= src/qt/textctrl.cpp src/qt/textentry.cpp src/qt/tglbtn.cpp + src/qt/timectrl.cpp src/qt/timer.cpp src/qt/toolbar.cpp src/qt/tooltip.cpp diff --git a/include/wx/qt/private/converter.h b/include/wx/qt/private/converter.h index fbb4250bd6..ca8c2c28c6 100644 --- a/include/wx/qt/private/converter.h +++ b/include/wx/qt/private/converter.h @@ -70,10 +70,14 @@ inline QColor wxQtConvertColour(const wxColour &colour) class WXDLLIMPEXP_FWD_BASE wxDateTime; class QDate; +class QTime; wxDateTime wxQtConvertDate(const QDate& date); QDate wxQtConvertDate(const wxDateTime& date); +wxDateTime wxQtConvertTime(const QTime& Time); +QTime wxQtConvertTime(const wxDateTime& time); + #endif // wxUSE_DATETIME inline wxSize wxQtConvertSize( const QSize &size ) diff --git a/include/wx/qt/timectrl.h b/include/wx/qt/timectrl.h new file mode 100644 index 0000000000..f4664b218c --- /dev/null +++ b/include/wx/qt/timectrl.h @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/qt/timectrl.h +// Purpose: wxTimePickerCtrl for Qt. +// Author: Ali Kettab +// Created: 2023-10-13 +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_QT_TIMECTRL_H_ +#define _WX_QT_TIMECTRL_H_ + +class QTimeEdit; + +// ---------------------------------------------------------------------------- +// wxTimePickerCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxTimePickerCtrl : public wxTimePickerCtrlBase +{ +public: + // ctors + wxTimePickerCtrl() { } + + wxTimePickerCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTP_DEFAULT, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTimePickerCtrlNameStr) + { + Create(parent, id, dt, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTP_DEFAULT, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTimePickerCtrlNameStr); + + // Override this one to add time-specific (and date-ignoring) checks. + virtual void SetValue(const wxDateTime& dt) override; + virtual wxDateTime GetValue() const override; + + virtual QWidget *GetHandle() const override; + +private: + QTimeEdit* m_qtTimeEdit; + + wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxTimePickerCtrl); +}; + +#endif // _WX_QT_TIMECTRL_H_ diff --git a/include/wx/timectrl.h b/include/wx/timectrl.h index 05a32f2002..83d1621ab5 100644 --- a/include/wx/timectrl.h +++ b/include/wx/timectrl.h @@ -101,6 +101,10 @@ typedef wxTimePickerCtrlCommonBase wxTimePickerCtrlBase; #elif defined(__WXOSX_COCOA__) && !defined(__WXUNIVERSAL__) #include "wx/osx/timectrl.h" + #define wxHAS_NATIVE_TIMEPICKERCTRL +#elif defined(__WXQT__) && !defined(__WXUNIVERSAL__) + #include "wx/qt/timectrl.h" + #define wxHAS_NATIVE_TIMEPICKERCTRL #else #include "wx/generic/timectrl.h" diff --git a/src/qt/converter.cpp b/src/qt/converter.cpp index 2d86f8b0f1..7aedee8fc6 100644 --- a/src/qt/converter.cpp +++ b/src/qt/converter.cpp @@ -15,6 +15,7 @@ #if wxUSE_DATETIME #include "wx/datetime.h" #include + #include #endif // wxUSE_DATETIME #include "wx/qt/private/converter.h" @@ -40,6 +41,22 @@ QDate wxQtConvertDate(const wxDateTime& date) return QDate(); } +wxDateTime wxQtConvertTime(const QTime& time) +{ + if ( !time.isNull() ) + return wxDateTime(time.hour(), time.minute(), time.second(), time.msec()); + else + return wxDateTime(); +} + +QTime wxQtConvertTime(const wxDateTime& time) +{ + if ( time.IsValid() ) + return QTime(time.GetHour(), time.GetMinute(), time.GetSecond(), time.GetMillisecond()); + else + return QTime(); +} + #endif // wxUSE_DATETIME Qt::Orientation wxQtConvertOrientation( long style, wxOrientation defaultOrientation ) diff --git a/src/qt/timectrl.cpp b/src/qt/timectrl.cpp new file mode 100644 index 0000000000..0b990e2571 --- /dev/null +++ b/src/qt/timectrl.cpp @@ -0,0 +1,101 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/qt/timectrl.cpp +// Purpose: wxTimePickerCtrl implementation +// Author: Ali Kettab +// Created: 2023-10-13 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + + +#if wxUSE_TIMEPICKCTRL + + +#include "wx/timectrl.h" +#include "wx/dateevt.h" +#include "wx/qt/private/converter.h" +#include "wx/qt/private/winevent.h" + +#include + +wxIMPLEMENT_DYNAMIC_CLASS(wxTimePickerCtrl, wxControl); + +// ============================================================================ +// implementation +// ============================================================================ + +class wxQtTimeEdit : public wxQtEventSignalHandler< QTimeEdit, wxTimePickerCtrl > +{ +public: + wxQtTimeEdit( wxWindow* parent, wxTimePickerCtrl* handler ); + +private: + void timeChanged(const QTime& time); + +}; + +wxQtTimeEdit::wxQtTimeEdit( wxWindow* parent, wxTimePickerCtrl* handler ) + : wxQtEventSignalHandler< QTimeEdit, wxTimePickerCtrl >( parent, handler ) +{ + connect(this, &QDateTimeEdit::timeChanged, + this, &wxQtTimeEdit::timeChanged); +} + +void wxQtTimeEdit::timeChanged(const QTime& time) +{ + wxDateEvent event(GetHandler(), wxQtConvertTime(time), wxEVT_TIME_CHANGED); + EmitEvent( event ); +} + +// ---------------------------------------------------------------------------- +// wxTimePickerCtrl creation +// ---------------------------------------------------------------------------- + +bool +wxTimePickerCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + m_qtTimeEdit = new wxQtTimeEdit( parent, this ); + m_qtTimeEdit->setTime( dt.IsValid() ? wxQtConvertTime(dt) : + wxQtConvertTime(wxDateTime::Now()) ); + m_qtTimeEdit->setDisplayFormat(QLocale::system().timeFormat(QLocale::ShortFormat)); + + return QtCreateControl( parent, id, pos, size, style, validator, name ); +} + +// ---------------------------------------------------------------------------- +// wxTimePickerCtrl operations +// ---------------------------------------------------------------------------- + +void wxTimePickerCtrl::SetValue(const wxDateTime& dt) +{ + wxQtEnsureSignalsBlocked blocker(m_qtTimeEdit); + m_qtTimeEdit->setTime( dt.IsValid() ? wxQtConvertTime(dt) : QTime() ); +} + +wxDateTime wxTimePickerCtrl::GetValue() const +{ + return wxQtConvertTime( m_qtTimeEdit->time() ); +} + +QWidget* wxTimePickerCtrl::GetHandle() const +{ + return m_qtTimeEdit; +} + +#endif // wxUSE_TIMEPICKCTRL