1 | /* -*- C++ -*- |
2 | This file is part of the KDE libraries |
3 | SPDX-FileCopyrightText: 1997 Tim D. Gilman <tdgilman@best.org> |
4 | SPDX-FileCopyrightText: 1998-2001 Mirko Boehm <mirko@kde.org> |
5 | SPDX-FileCopyrightText: 2007 John Layt <john@layt.net> |
6 | |
7 | SPDX-License-Identifier: LGPL-2.0-or-later |
8 | */ |
9 | |
10 | #ifndef KDATEPICKER_H |
11 | #define KDATEPICKER_H |
12 | |
13 | #include <kwidgetsaddons_export.h> |
14 | |
15 | #include <QFrame> |
16 | #include <memory> |
17 | |
18 | class QLineEdit; |
19 | class KDateTable; |
20 | |
21 | /** |
22 | * @class KDatePicker kdatepicker.h KDatePicker |
23 | * |
24 | * @short A date selection widget. |
25 | * |
26 | * Provides a widget for calendar date input. |
27 | * |
28 | * Different from the previous versions, it now emits two types of signals, |
29 | * either dateSelected() or dateEntered() (see documentation for both signals). |
30 | * |
31 | * A line edit has been added in the newer versions to allow the user |
32 | * to select a date directly by entering numbers like 19990101 |
33 | * or 990101. |
34 | * |
35 | * \image html kdatepicker.png "KDatePicker Widget" |
36 | * |
37 | * @author Tim Gilman, Mirko Boehm |
38 | */ |
39 | class KWIDGETSADDONS_EXPORT KDatePicker : public QFrame |
40 | { |
41 | Q_OBJECT |
42 | Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY dateChanged USER true) |
43 | Q_PROPERTY(bool closeButton READ hasCloseButton WRITE setCloseButton) |
44 | Q_PROPERTY(int fontSize READ fontSize WRITE setFontSize) |
45 | |
46 | public: |
47 | /** |
48 | * The constructor. The current date will be displayed initially. |
49 | */ |
50 | explicit KDatePicker(QWidget *parent = nullptr); |
51 | |
52 | /** |
53 | * The constructor. The given date will be displayed initially. |
54 | */ |
55 | explicit KDatePicker(const QDate &dt, QWidget *parent = nullptr); |
56 | |
57 | /** |
58 | * The destructor. |
59 | */ |
60 | ~KDatePicker() override; |
61 | |
62 | /** |
63 | * The size hint for date pickers. The size hint recommends the |
64 | * minimum size of the widget so that all elements may be placed |
65 | * without clipping. This sometimes looks ugly, so when using the |
66 | * size hint, try adding 28 to each of the reported numbers of |
67 | * pixels. |
68 | */ |
69 | QSize sizeHint() const override; |
70 | |
71 | /** |
72 | * Sets the date. |
73 | * |
74 | * @returns @p false and does not change anything if the date given is invalid. |
75 | */ |
76 | bool setDate(const QDate &date); |
77 | |
78 | /** |
79 | * @returns the selected date. |
80 | */ |
81 | const QDate &date() const; |
82 | |
83 | /** |
84 | * Sets the font size of the widgets elements. |
85 | */ |
86 | void setFontSize(int); |
87 | |
88 | /** |
89 | * Returns the font size of the widget elements. |
90 | */ |
91 | int fontSize() const; |
92 | |
93 | /** |
94 | * By calling this method with @p enable = true, KDatePicker will show |
95 | * a little close-button in the upper button-row. Clicking the |
96 | * close-button will cause the KDatePicker's topLevelWidget()'s close() |
97 | * method being called. This is mostly useful for toplevel datepickers |
98 | * without a window manager decoration. |
99 | * @see hasCloseButton |
100 | */ |
101 | void setCloseButton(bool enable); |
102 | |
103 | /** |
104 | * @returns true if a KDatePicker shows a close-button. |
105 | * @see setCloseButton |
106 | */ |
107 | bool hasCloseButton() const; |
108 | |
109 | protected: |
110 | /// to catch move keyEvents when QLineEdit has keyFocus |
111 | bool eventFilter(QObject *o, QEvent *e) override; |
112 | /// the resize event |
113 | void resizeEvent(QResizeEvent *) override; |
114 | void changeEvent(QEvent *event) override; |
115 | |
116 | protected Q_SLOTS: |
117 | void dateChangedSlot(const QDate &date); |
118 | void tableClickedSlot(); |
119 | void monthForwardClicked(); |
120 | void monthBackwardClicked(); |
121 | void yearForwardClicked(); |
122 | void yearBackwardClicked(); |
123 | void selectMonthClicked(); |
124 | void selectYearClicked(); |
125 | void uncheckYearSelector(); |
126 | void lineEnterPressed(); |
127 | void todayButtonClicked(); |
128 | void weekSelected(int); |
129 | |
130 | Q_SIGNALS: |
131 | /** |
132 | * This signal is emitted each time the selected date is changed. |
133 | * Usually, this does not mean that the date has been entered, |
134 | * since the date also changes, for example, when another month is |
135 | * selected. |
136 | * @see dateSelected |
137 | */ |
138 | void dateChanged(const QDate &date); |
139 | |
140 | /** |
141 | * This signal is emitted each time a day has been selected by |
142 | * clicking on the table (hitting a day in the current month). It |
143 | * has the same meaning as dateSelected() in older versions of |
144 | * KDatePicker. |
145 | */ |
146 | void dateSelected(const QDate &date); |
147 | |
148 | /** |
149 | * This signal is emitted when enter is pressed and a VALID date |
150 | * has been entered before into the line edit. Connect to both |
151 | * dateEntered() and dateSelected() to receive all events where the |
152 | * user really enters a date. |
153 | */ |
154 | void dateEntered(const QDate &date); |
155 | |
156 | /** |
157 | * This signal is emitted when the day has been selected by |
158 | * clicking on it in the table. |
159 | */ |
160 | void tableClicked(); |
161 | |
162 | private: |
163 | KWIDGETSADDONS_NO_EXPORT KDateTable *dateTable() const; |
164 | KWIDGETSADDONS_NO_EXPORT void initWidget(const QDate &date); |
165 | |
166 | private: |
167 | friend class KDatePickerPrivate; |
168 | std::unique_ptr<class KDatePickerPrivate> const d; |
169 | }; |
170 | |
171 | #endif // KDATEPICKER_H |
172 | |