1 | /* |
2 | This file is part of the KDE libraries |
3 | SPDX-FileCopyrightText: 1997 Martin Jones <mjones@kde.org> |
4 | |
5 | SPDX-License-Identifier: LGPL-2.0-or-later |
6 | */ |
7 | //----------------------------------------------------------------------------- |
8 | // Selector widgets for KDE Color Selector, but probably useful for other |
9 | // stuff also. |
10 | |
11 | #ifndef KSELECTOR_H |
12 | #define KSELECTOR_H |
13 | |
14 | #include <kwidgetsaddons_export.h> |
15 | |
16 | #include <QAbstractSlider> |
17 | #include <QGradient> |
18 | #include <QWidget> |
19 | #include <memory> |
20 | |
21 | /*! |
22 | * \class KSelector |
23 | * \inmodule KWidgetsAddons |
24 | * |
25 | * \brief Base class for other widgets which |
26 | * provides the ability to choose from a one-dimensional |
27 | * range of values. |
28 | * |
29 | * An example is the KGradientSelector |
30 | * which allows to choose from a range of colors. |
31 | * |
32 | * A custom drawing routine for the widget surface has |
33 | * to be provided by the subclass. |
34 | */ |
35 | class KWIDGETSADDONS_EXPORT KSelector : public QAbstractSlider |
36 | { |
37 | Q_OBJECT |
38 | /*! |
39 | * \property KSelector::value |
40 | */ |
41 | Q_PROPERTY(int value READ value WRITE setValue) |
42 | |
43 | /*! |
44 | * \property KSelector::minValue |
45 | */ |
46 | Q_PROPERTY(int minValue READ minimum WRITE setMinimum) |
47 | |
48 | /*! |
49 | * \property KSelector::maxValue |
50 | */ |
51 | Q_PROPERTY(int maxValue READ maximum WRITE setMaximum) |
52 | |
53 | /*! |
54 | * \property KSelector::indent |
55 | */ |
56 | Q_PROPERTY(bool indent READ indent WRITE setIndent) |
57 | |
58 | /*! |
59 | * \property KSelector::arrowDirection |
60 | */ |
61 | Q_PROPERTY(Qt::ArrowType arrowDirection READ arrowDirection WRITE setArrowDirection) |
62 | public: |
63 | /*! |
64 | * Constructs a horizontal one-dimensional selection widget. |
65 | */ |
66 | explicit KSelector(QWidget *parent = nullptr); |
67 | |
68 | /*! |
69 | * Constructs a one-dimensional selection widget with |
70 | * a given orientation. |
71 | */ |
72 | explicit KSelector(Qt::Orientation o, QWidget *parent = nullptr); |
73 | |
74 | ~KSelector() override; |
75 | |
76 | /*! |
77 | * Returns the rectangle on which subclasses should draw. |
78 | */ |
79 | QRect contentsRect() const; |
80 | |
81 | /*! |
82 | * Sets the indent option of the widget to i. |
83 | * |
84 | * This determines whether a shaded frame is drawn. |
85 | */ |
86 | void setIndent(bool i); |
87 | |
88 | /*! |
89 | * Returns whether the indent option is set. |
90 | */ |
91 | bool indent() const; |
92 | |
93 | /*! |
94 | * Sets the arrow direction. |
95 | */ |
96 | void setArrowDirection(Qt::ArrowType direction); |
97 | |
98 | /*! |
99 | * Returns the current arrow direction |
100 | */ |
101 | Qt::ArrowType arrowDirection() const; |
102 | |
103 | protected: |
104 | /*! |
105 | * Override this function to draw the contents of the control. |
106 | * The default implementation does nothing. |
107 | * |
108 | * Draw only within contentsRect(). |
109 | */ |
110 | virtual void drawContents(QPainter *); |
111 | |
112 | /*! |
113 | * Override this function to draw the cursor which |
114 | * indicates the current value. |
115 | */ |
116 | virtual void drawArrow(QPainter *painter, const QPoint &pos); |
117 | |
118 | void paintEvent(QPaintEvent *) override; |
119 | void mousePressEvent(QMouseEvent *e) override; |
120 | void mouseMoveEvent(QMouseEvent *e) override; |
121 | void mouseReleaseEvent(QMouseEvent *e) override; |
122 | void wheelEvent(QWheelEvent *) override; |
123 | |
124 | private: |
125 | KWIDGETSADDONS_NO_EXPORT QPoint calcArrowPos(int val); |
126 | KWIDGETSADDONS_NO_EXPORT void moveArrow(const QPoint &pos); |
127 | |
128 | private: |
129 | friend class KSelectorPrivate; |
130 | std::unique_ptr<class KSelectorPrivate> const d; |
131 | |
132 | Q_DISABLE_COPY(KSelector) |
133 | }; |
134 | |
135 | /*! |
136 | * \class KGradientSelector |
137 | * \inmodule KWidgetsAddons |
138 | * |
139 | * \brief Allows the user to choose |
140 | * from a one-dimensional range of colors which is given as a |
141 | * gradient between two colors provided by the programmer. |
142 | * |
143 | * \image kgradientselector.png "KGradientSelector Widget" |
144 | */ |
145 | class KWIDGETSADDONS_EXPORT KGradientSelector : public KSelector |
146 | { |
147 | Q_OBJECT |
148 | |
149 | /*! |
150 | * \property KGradientSelector::firstColor |
151 | */ |
152 | Q_PROPERTY(QColor firstColor READ firstColor WRITE setFirstColor) |
153 | |
154 | /*! |
155 | * \property KGradientSelector::secondColor |
156 | */ |
157 | Q_PROPERTY(QColor secondColor READ secondColor WRITE setSecondColor) |
158 | |
159 | /*! |
160 | * \property KGradientSelector::firstText |
161 | */ |
162 | Q_PROPERTY(QString firstText READ firstText WRITE setFirstText) |
163 | |
164 | /*! |
165 | * \property KGradientSelector::secondText |
166 | */ |
167 | Q_PROPERTY(QString secondText READ secondText WRITE setSecondText) |
168 | |
169 | public: |
170 | /*! |
171 | * Constructs a horizontal color selector which |
172 | * contains a gradient between white and black. |
173 | */ |
174 | explicit KGradientSelector(QWidget *parent = nullptr); |
175 | /*! |
176 | * Constructs a colors selector with orientation \a o which |
177 | * contains a gradient between white and black. |
178 | */ |
179 | explicit KGradientSelector(Qt::Orientation o, QWidget *parent = nullptr); |
180 | |
181 | ~KGradientSelector() override; |
182 | |
183 | /*! |
184 | * Sets the colors that make up the gradient. Any previously set colors |
185 | * are removed. |
186 | * \since 4.5 |
187 | */ |
188 | void setStops(const QGradientStops &stops); |
189 | |
190 | /*! |
191 | * Get the colors that make up the gradient. |
192 | * \since 4.5 |
193 | */ |
194 | QGradientStops stops() const; |
195 | |
196 | /*! |
197 | * Sets the two colors which span the gradient. |
198 | */ |
199 | void setColors(const QColor &col1, const QColor &col2); |
200 | |
201 | /*! |
202 | * |
203 | */ |
204 | void setText(const QString &t1, const QString &t2); |
205 | |
206 | /*! |
207 | * Set each color on its own. |
208 | */ |
209 | void setFirstColor(const QColor &col); |
210 | |
211 | /*! |
212 | * |
213 | */ |
214 | void setSecondColor(const QColor &col); |
215 | |
216 | /*! |
217 | * Set each description on its own |
218 | */ |
219 | void setFirstText(const QString &t); |
220 | |
221 | /*! |
222 | * |
223 | */ |
224 | void setSecondText(const QString &t); |
225 | |
226 | /*! |
227 | * |
228 | */ |
229 | QColor firstColor() const; |
230 | |
231 | /*! |
232 | * |
233 | */ |
234 | QColor secondColor() const; |
235 | |
236 | /*! |
237 | * |
238 | */ |
239 | QString firstText() const; |
240 | |
241 | /*! |
242 | * |
243 | */ |
244 | QString secondText() const; |
245 | |
246 | protected: |
247 | void drawContents(QPainter *) override; |
248 | |
249 | /*! |
250 | * |
251 | */ |
252 | virtual QSize minimumSize() const; |
253 | |
254 | private: |
255 | friend class KGradientSelectorPrivate; |
256 | std::unique_ptr<class KGradientSelectorPrivate> const d; |
257 | |
258 | Q_DISABLE_COPY(KGradientSelector) |
259 | }; |
260 | |
261 | #endif // KSELECTOR_H |
262 | |