diff --git a/Makefile.in b/Makefile.in index 1057fb5cb6..9d3477d663 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3526,7 +3526,8 @@ COND_TOOLKIT_QT_GUI_HDR = \ wx/qt/dvrenderers.h \ $(QT_PLATFORM_HDR) \ wx/qt/treectrl.h \ - wx/generic/paletteg.h + wx/generic/paletteg.h \ + wx/qt/datectrl.h @COND_TOOLKIT_QT@GUI_HDR = $(COND_TOOLKIT_QT_GUI_HDR) @COND_TOOLKIT_COCOA@MEDIA_PLATFORM_HDR = @COND_TOOLKIT_GTK@MEDIA_PLATFORM_HDR = @@ -5342,7 +5343,7 @@ COND_TOOLKIT_MSW___GUI_SRC_OBJECTS = \ monodll_msw_bmpcbox.o \ monodll_msw_hyperlink.o \ monodll_msw_calctrl.o \ - monodll_datectrl.o \ + monodll_msw_datectrl.o \ monodll_msw_datetimectrl.o \ monodll_timectrl.o \ monodll_datecontrols.o \ @@ -5529,7 +5530,8 @@ COND_TOOLKIT_QT___GUI_SRC_OBJECTS = \ monodll_qt_window.o \ $(__QT_PLATFORM_SRC_OBJECTS) \ monodll_qt_treectrl.o \ - monodll_paletteg.o + monodll_paletteg.o \ + monodll_qt_datectrl.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 \ @@ -7102,7 +7104,7 @@ COND_TOOLKIT_MSW___GUI_SRC_OBJECTS_1 = \ monolib_msw_bmpcbox.o \ monolib_msw_hyperlink.o \ monolib_msw_calctrl.o \ - monolib_datectrl.o \ + monolib_msw_datectrl.o \ monolib_msw_datetimectrl.o \ monolib_timectrl.o \ monolib_datecontrols.o \ @@ -7289,7 +7291,8 @@ COND_TOOLKIT_QT___GUI_SRC_OBJECTS_1 = \ monolib_qt_window.o \ $(__QT_PLATFORM_SRC_OBJECTS_1) \ monolib_qt_treectrl.o \ - monolib_paletteg.o + monolib_paletteg.o \ + monolib_qt_datectrl.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 \ @@ -9014,7 +9017,7 @@ COND_TOOLKIT_MSW___GUI_SRC_OBJECTS_2 = \ coredll_msw_bmpcbox.o \ coredll_msw_hyperlink.o \ coredll_msw_calctrl.o \ - coredll_datectrl.o \ + coredll_msw_datectrl.o \ coredll_msw_datetimectrl.o \ coredll_timectrl.o \ coredll_datecontrols.o \ @@ -9201,7 +9204,8 @@ COND_TOOLKIT_QT___GUI_SRC_OBJECTS_2 = \ coredll_qt_window.o \ $(__QT_PLATFORM_SRC_OBJECTS_2) \ coredll_qt_treectrl.o \ - coredll_paletteg.o + coredll_paletteg.o \ + coredll_qt_datectrl.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 \ @@ -10502,7 +10506,7 @@ COND_TOOLKIT_MSW___GUI_SRC_OBJECTS_3 = \ corelib_msw_bmpcbox.o \ corelib_msw_hyperlink.o \ corelib_msw_calctrl.o \ - corelib_datectrl.o \ + corelib_msw_datectrl.o \ corelib_msw_datetimectrl.o \ corelib_timectrl.o \ corelib_datecontrols.o \ @@ -10689,7 +10693,8 @@ COND_TOOLKIT_QT___GUI_SRC_OBJECTS_3 = \ corelib_qt_window.o \ $(__QT_PLATFORM_SRC_OBJECTS_3) \ corelib_qt_treectrl.o \ - corelib_paletteg.o + corelib_paletteg.o \ + corelib_qt_datectrl.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 \ @@ -15300,7 +15305,7 @@ monodll_msw_hyperlink.o: $(srcdir)/src/msw/hyperlink.cpp $(MONODLL_ODEP) monodll_msw_calctrl.o: $(srcdir)/src/msw/calctrl.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/calctrl.cpp -monodll_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(MONODLL_ODEP) +monodll_msw_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/datectrl.cpp monodll_msw_datetimectrl.o: $(srcdir)/src/msw/datetimectrl.cpp $(MONODLL_ODEP) @@ -15783,6 +15788,9 @@ monodll_qt_graphics.o: $(srcdir)/src/qt/graphics.cpp $(MONODLL_ODEP) monodll_qt_treectrl.o: $(srcdir)/src/qt/treectrl.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/qt/treectrl.cpp +monodll_qt_datectrl.o: $(srcdir)/src/qt/datectrl.cpp $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/qt/datectrl.cpp + monodll_mdig.o: $(srcdir)/src/generic/mdig.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/mdig.cpp @@ -20040,7 +20048,7 @@ monolib_msw_hyperlink.o: $(srcdir)/src/msw/hyperlink.cpp $(MONOLIB_ODEP) monolib_msw_calctrl.o: $(srcdir)/src/msw/calctrl.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/calctrl.cpp -monolib_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(MONOLIB_ODEP) +monolib_msw_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/datectrl.cpp monolib_msw_datetimectrl.o: $(srcdir)/src/msw/datetimectrl.cpp $(MONOLIB_ODEP) @@ -20523,6 +20531,9 @@ monolib_qt_graphics.o: $(srcdir)/src/qt/graphics.cpp $(MONOLIB_ODEP) monolib_qt_treectrl.o: $(srcdir)/src/qt/treectrl.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/qt/treectrl.cpp +monolib_qt_datectrl.o: $(srcdir)/src/qt/datectrl.cpp $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/qt/datectrl.cpp + monolib_mdig.o: $(srcdir)/src/generic/mdig.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/mdig.cpp @@ -25458,7 +25469,7 @@ coredll_msw_hyperlink.o: $(srcdir)/src/msw/hyperlink.cpp $(COREDLL_ODEP) coredll_msw_calctrl.o: $(srcdir)/src/msw/calctrl.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/calctrl.cpp -coredll_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(COREDLL_ODEP) +coredll_msw_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/datectrl.cpp coredll_msw_datetimectrl.o: $(srcdir)/src/msw/datetimectrl.cpp $(COREDLL_ODEP) @@ -25941,6 +25952,9 @@ coredll_qt_graphics.o: $(srcdir)/src/qt/graphics.cpp $(COREDLL_ODEP) coredll_qt_treectrl.o: $(srcdir)/src/qt/treectrl.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/qt/treectrl.cpp +coredll_qt_datectrl.o: $(srcdir)/src/qt/datectrl.cpp $(COREDLL_ODEP) + $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/qt/datectrl.cpp + coredll_mdig.o: $(srcdir)/src/generic/mdig.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/generic/mdig.cpp @@ -29172,7 +29186,7 @@ corelib_msw_hyperlink.o: $(srcdir)/src/msw/hyperlink.cpp $(CORELIB_ODEP) corelib_msw_calctrl.o: $(srcdir)/src/msw/calctrl.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/calctrl.cpp -corelib_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(CORELIB_ODEP) +corelib_msw_datectrl.o: $(srcdir)/src/msw/datectrl.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/datectrl.cpp corelib_msw_datetimectrl.o: $(srcdir)/src/msw/datetimectrl.cpp $(CORELIB_ODEP) @@ -29655,6 +29669,9 @@ corelib_qt_graphics.o: $(srcdir)/src/qt/graphics.cpp $(CORELIB_ODEP) corelib_qt_treectrl.o: $(srcdir)/src/qt/treectrl.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/qt/treectrl.cpp +corelib_qt_datectrl.o: $(srcdir)/src/qt/datectrl.cpp $(CORELIB_ODEP) + $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/qt/datectrl.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 f235f19dd3..dfc67ee390 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -375,6 +375,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! $(QT_PLATFORM_HDR) wx/qt/treectrl.h wx/generic/paletteg.h + wx/qt/datectrl.h @@ -473,6 +474,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! $(QT_PLATFORM_SRC) src/qt/treectrl.cpp src/generic/paletteg.cpp + src/qt/datectrl.cpp diff --git a/build/cmake/files.cmake b/build/cmake/files.cmake index 73f329b700..91edbe4260 100644 --- a/build/cmake/files.cmake +++ b/build/cmake/files.cmake @@ -288,6 +288,7 @@ set(QT_HDR ${QT_PLATFORM_HDR} wx/qt/treectrl.h wx/generic/paletteg.h + wx/qt/datectrl.h ) set(QT_SRC @@ -386,6 +387,7 @@ set(QT_SRC ${QT_PLATFORM_SRC} src/qt/treectrl.cpp src/generic/paletteg.cpp + src/qt/datectrl.cpp ) set(MEDIA_QT_SRC diff --git a/build/files b/build/files index daccf35a45..e21f810cf6 100644 --- a/build/files +++ b/build/files @@ -258,6 +258,7 @@ QT_HDR = wx/qt/dataobj.h wx/qt/dataobj2.h wx/qt/dataview.h + wx/qt/datectrl.h wx/qt/dc.h wx/qt/dcclient.h wx/qt/dcmemory.h @@ -348,6 +349,7 @@ QT_SRC= src/qt/cursor.cpp src/qt/dataobj.cpp src/qt/dataview.cpp + src/qt/datectrl.cpp src/qt/dc.cpp src/qt/dcclient.cpp src/qt/dcmemory.cpp diff --git a/include/wx/datectrl.h b/include/wx/datectrl.h index 9734cb023d..da11f8e0a0 100644 --- a/include/wx/datectrl.h +++ b/include/wx/datectrl.h @@ -89,6 +89,10 @@ typedef wxDatePickerCtrlCommonBase wxDatePickerCtrlBase; #elif defined(__WXOSX_COCOA__) && !defined(__WXUNIVERSAL__) #include "wx/osx/datectrl.h" + #define wxHAS_NATIVE_DATEPICKCTRL +#elif defined(__WXQT__) && !defined(__WXUNIVERSAL__) + #include "wx/qt/datectrl.h" + #define wxHAS_NATIVE_DATEPICKCTRL #else #include "wx/generic/datectrl.h" diff --git a/include/wx/qt/datectrl.h b/include/wx/qt/datectrl.h new file mode 100644 index 0000000000..75e0f52ecf --- /dev/null +++ b/include/wx/qt/datectrl.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/qt/datectrl.h +// Purpose: wxDatePickerCtrl for Qt +// Author: Ali Kettab +// Modified by: +// Created: 2023-10-12 +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_QT_DATECTRL_H_ +#define _WX_QT_DATECTRL_H_ + +class QDateEdit; + +// ---------------------------------------------------------------------------- +// wxDatePickerCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDatePickerCtrl : public wxDatePickerCtrlBase +{ +public: + // ctors + wxDatePickerCtrl() { } + + wxDatePickerCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr) + { + 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 = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr); + + // Override this one to add date-specific (and time-ignoring) checks. + virtual void SetValue(const wxDateTime& dt) override; + virtual wxDateTime GetValue() const override; + + // Implement the base class pure virtuals. + virtual void SetRange(const wxDateTime& dt1, const wxDateTime& dt2) override; + virtual bool GetRange(wxDateTime *dt1, wxDateTime *dt2) const override; + + virtual QWidget *GetHandle() const override; + +protected: + +private: + QDateEdit* m_qtDateEdit; + + wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDatePickerCtrl); +}; + +#endif // _WX_QT_DATECTRL_H_ diff --git a/src/qt/datectrl.cpp b/src/qt/datectrl.cpp new file mode 100644 index 0000000000..ea26fd45fe --- /dev/null +++ b/src/qt/datectrl.cpp @@ -0,0 +1,127 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/qt/datectrl.cpp +// Purpose: wxDatePickerCtrl implementation +// Author: Ali Kettab +// Modified by: +// Created: 2023-10-12 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + + +#if wxUSE_DATEPICKCTRL + +#include "wx/datectrl.h" +#include "wx/dateevt.h" +#include "wx/qt/private/converter.h" +#include "wx/qt/private/winevent.h" + +#include + +wxIMPLEMENT_DYNAMIC_CLASS(wxDatePickerCtrl, wxControl); + +// ============================================================================ +// implementation +// ============================================================================ + +class wxQtDateEdit : public wxQtEventSignalHandler< QDateEdit, wxDatePickerCtrl > +{ +public: + wxQtDateEdit( wxWindow* parent, wxDatePickerCtrl* handler ); + +private: + void dateChanged(const QDate& date); + +}; + +wxQtDateEdit::wxQtDateEdit( wxWindow* parent, wxDatePickerCtrl* handler ) + : wxQtEventSignalHandler< QDateEdit, wxDatePickerCtrl >( parent, handler ) +{ + connect(this, &QDateTimeEdit::dateChanged, + this, &wxQtDateEdit::dateChanged); +} + +void wxQtDateEdit::dateChanged(const QDate& date) +{ + wxDateEvent event(GetHandler(), wxQtConvertDate(date), wxEVT_DATE_CHANGED); + EmitEvent( event ); +} + +// ---------------------------------------------------------------------------- +// wxDatePickerCtrl creation +// ---------------------------------------------------------------------------- + +bool +wxDatePickerCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + m_qtDateEdit = new wxQtDateEdit( parent, this ); + m_qtDateEdit->setDate( dt.IsValid() ? wxQtConvertDate(dt) : + wxQtConvertDate(wxDateTime::Today()) ); + m_qtDateEdit->setCalendarPopup(style & wxDP_DROPDOWN); + m_qtDateEdit->setDisplayFormat(QLocale::system().dateFormat(QLocale::ShortFormat)); + + return QtCreateControl( parent, id, pos, size, style, validator, name ); +} + +// ---------------------------------------------------------------------------- +// wxDatePickerCtrl operations +// ---------------------------------------------------------------------------- + +void wxDatePickerCtrl::SetValue(const wxDateTime& dt) +{ + wxASSERT_MSG( dt.IsValid() || HasFlag(wxDP_ALLOWNONE), + "this control must have a valid date" ); + + const auto qtDate = wxQtConvertDate(dt); + + if ( qtDate >= m_qtDateEdit->minimumDate() && + qtDate <= m_qtDateEdit->maximumDate() ) + { + wxQtEnsureSignalsBlocked blocker(m_qtDateEdit); + m_qtDateEdit->setDate( qtDate ); + } +} + +wxDateTime wxDatePickerCtrl::GetValue() const +{ + return wxQtConvertDate( m_qtDateEdit->date() ); +} + +void wxDatePickerCtrl::SetRange(const wxDateTime& dt1, const wxDateTime& dt2) +{ + m_qtDateEdit->setDateRange( wxQtConvertDate(dt1), wxQtConvertDate(dt2) ); +} + +bool wxDatePickerCtrl::GetRange(wxDateTime *dt1, wxDateTime *dt2) const +{ + if ( dt1 ) + *dt1 = wxQtConvertDate( m_qtDateEdit->minimumDate() ); + + if ( dt2 ) + *dt2 = wxQtConvertDate( m_qtDateEdit->maximumDate() ); + + return true; +} + +QWidget* wxDatePickerCtrl::GetHandle() const +{ + return m_qtDateEdit; +} + +#endif // wxUSE_DATEPICKCTRL