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 KDATETABLE_H
11#define KDATETABLE_H
12
13#include <QWidget>
14#include <memory>
15
16class QMenu;
17
18/*!
19 * \internal
20 * Date selection table.
21 * This is a support class for the KDatePicker class. It just
22 * draws the calendar table without titles, but could theoretically
23 * be used as a standalone.
24 *
25 * When a date is selected by the user, it emits a signal:
26 * dateSelected(QDate)
27 *
28 * \image kdatetable.png "KDE Date Selection Table"
29 */
30class KDateTable : public QWidget
31{
32 Q_OBJECT
33 Q_PROPERTY(QDate date READ date WRITE setDate)
34 Q_PROPERTY(bool popupMenu READ popupMenuEnabled WRITE setPopupMenuEnabled)
35
36public:
37 /*!
38 * The constructor.
39 */
40 explicit KDateTable(QWidget *parent = nullptr);
41
42 /*!
43 * The constructor.
44 */
45 explicit KDateTable(const QDate &, QWidget *parent = nullptr);
46
47 /*!
48 * The destructor.
49 */
50 ~KDateTable() override;
51
52 /*!
53 * Returns a recommended size for the widget.
54 * To save some time, the size of the largest used cell content is
55 * calculated in each paintCell() call, since all calculations have
56 * to be done there anyway. The size is stored in maxCell. The
57 * sizeHint() simply returns a multiple of maxCell.
58 */
59 QSize sizeHint() const override;
60
61 /*!
62 * Set the font size of the date table.
63 */
64 void setFontSize(int size);
65
66 /*!
67 * Select and display this date.
68 */
69 bool setDate(const QDate &date);
70
71 /*!
72 * Returns the selected date.
73 */
74 const QDate &date() const;
75
76 /*!
77 * Enables a popup menu when right clicking on a date.
78 *
79 * When it's enabled, this object emits a aboutToShowContextMenu signal
80 * where you can fill in the menu items.
81 */
82 void setPopupMenuEnabled(bool enable);
83
84 /*!
85 * Returns if the popup menu is enabled or not
86 */
87 bool popupMenuEnabled() const;
88
89 enum BackgroundMode {
90 NoBgMode = 0,
91 RectangleMode,
92 CircleMode
93 };
94
95 /*!
96 * Makes a given date be painted with a given foregroundColor, and background
97 * (a rectangle, or a circle/ellipse) in a given color.
98 */
99 void setCustomDatePainting(const QDate &date, const QColor &fgColor, BackgroundMode bgMode = NoBgMode, const QColor &bgColor = QColor());
100
101 /*!
102 * Unsets the custom painting of a date so that the date is painted as usual.
103 */
104 void unsetCustomDatePainting(const QDate &date);
105
106 /**
107 * Sets the valid date range. Dates outside this range will be styled differently and cannot be selected.
108 */
109 void setDateRange(const QDate &minDate, const QDate &maxDate);
110
111protected:
112 /*!
113 * calculate the position of the cell in the matrix for the given date.
114 * The result is the 0-based index.
115 */
116 virtual int posFromDate(const QDate &date);
117
118 /*!
119 * calculate the date that is displayed at a given cell in the matrix. pos is the
120 * 0-based index in the matrix. Inverse function to posForDate().
121 */
122 virtual QDate dateFromPos(int pos);
123
124 void paintEvent(QPaintEvent *e) override;
125
126 /*!
127 * React on mouse clicks that select a date.
128 */
129 void mousePressEvent(QMouseEvent *e) override;
130 void wheelEvent(QWheelEvent *e) override;
131 void keyPressEvent(QKeyEvent *e) override;
132 void focusInEvent(QFocusEvent *e) override;
133 void focusOutEvent(QFocusEvent *e) override;
134
135 /*!
136 * Cell highlight on mouse hovering
137 */
138 bool event(QEvent *e) override;
139
140Q_SIGNALS:
141 /*!
142 * The selected date changed.
143 */
144 void dateChanged(const QDate &date);
145
146 /*!
147 * A date has been selected by clicking on the table.
148 */
149 void tableClicked();
150
151 /*!
152 * A popup menu for a given date is about to be shown (as when the user
153 * right clicks on that date and the popup menu is enabled). Connect
154 * the slot where you fill the menu to this signal.
155 */
156 void aboutToShowContextMenu(QMenu *menu, const QDate &date);
157
158private:
159 class KDateTablePrivate;
160 friend class KDateTablePrivate;
161 std::unique_ptr<KDateTablePrivate> const d;
162
163 void initWidget(const QDate &date);
164 void initAccels();
165 void paintCell(QPainter *painter, int row, int col);
166
167 Q_DISABLE_COPY(KDateTable)
168};
169
170#endif // KDATETABLE_H
171

source code of kwidgetsaddons/src/kdatetable_p.h