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 kselector.h KSelector |
23 | * |
24 | * KSelector is the base class for other widgets which |
25 | * provides the ability to choose from a one-dimensional |
26 | * range of values. An example is the KGradientSelector |
27 | * which allows to choose from a range of colors. |
28 | * |
29 | * A custom drawing routine for the widget surface has |
30 | * to be provided by the subclass. |
31 | */ |
32 | class KWIDGETSADDONS_EXPORT KSelector : public QAbstractSlider |
33 | { |
34 | Q_OBJECT |
35 | Q_PROPERTY(int value READ value WRITE setValue) |
36 | Q_PROPERTY(int minValue READ minimum WRITE setMinimum) |
37 | Q_PROPERTY(int maxValue READ maximum WRITE setMaximum) |
38 | Q_PROPERTY(bool indent READ indent WRITE setIndent) |
39 | Q_PROPERTY(Qt::ArrowType arrowDirection READ arrowDirection WRITE setArrowDirection) |
40 | public: |
41 | /** |
42 | * Constructs a horizontal one-dimensional selection widget. |
43 | */ |
44 | explicit KSelector(QWidget *parent = nullptr); |
45 | /** |
46 | * Constructs a one-dimensional selection widget with |
47 | * a given orientation. |
48 | */ |
49 | explicit KSelector(Qt::Orientation o, QWidget *parent = nullptr); |
50 | /* |
51 | * Destructs the widget. |
52 | */ |
53 | ~KSelector() override; |
54 | |
55 | /** |
56 | * @return the rectangle on which subclasses should draw. |
57 | */ |
58 | QRect contentsRect() const; |
59 | |
60 | /** |
61 | * Sets the indent option of the widget to i. |
62 | * This determines whether a shaded frame is drawn. |
63 | */ |
64 | void setIndent(bool i); |
65 | |
66 | /** |
67 | * @return whether the indent option is set. |
68 | */ |
69 | bool indent() const; |
70 | |
71 | /** |
72 | * Sets the arrow direction. |
73 | */ |
74 | void setArrowDirection(Qt::ArrowType direction); |
75 | |
76 | /** |
77 | * @return the current arrow direction |
78 | */ |
79 | Qt::ArrowType arrowDirection() const; |
80 | |
81 | protected: |
82 | /** |
83 | * Override this function to draw the contents of the control. |
84 | * The default implementation does nothing. |
85 | * |
86 | * Draw only within contentsRect(). |
87 | */ |
88 | virtual void drawContents(QPainter *); |
89 | /** |
90 | * Override this function to draw the cursor which |
91 | * indicates the current value. |
92 | */ |
93 | virtual void drawArrow(QPainter *painter, const QPoint &pos); |
94 | |
95 | void paintEvent(QPaintEvent *) override; |
96 | void mousePressEvent(QMouseEvent *e) override; |
97 | void mouseMoveEvent(QMouseEvent *e) override; |
98 | void mouseReleaseEvent(QMouseEvent *e) override; |
99 | void wheelEvent(QWheelEvent *) override; |
100 | |
101 | private: |
102 | KWIDGETSADDONS_NO_EXPORT QPoint calcArrowPos(int val); |
103 | KWIDGETSADDONS_NO_EXPORT void moveArrow(const QPoint &pos); |
104 | |
105 | private: |
106 | friend class KSelectorPrivate; |
107 | std::unique_ptr<class KSelectorPrivate> const d; |
108 | |
109 | Q_DISABLE_COPY(KSelector) |
110 | }; |
111 | |
112 | /** |
113 | * @class KGradientSelector kselector.h KGradientSelector |
114 | * |
115 | * The KGradientSelector widget allows the user to choose |
116 | * from a one-dimensional range of colors which is given as a |
117 | * gradient between two colors provided by the programmer. |
118 | * |
119 | * \image html kgradientselector.png "KGradientSelector Widget" |
120 | */ |
121 | class KWIDGETSADDONS_EXPORT KGradientSelector : public KSelector |
122 | { |
123 | Q_OBJECT |
124 | |
125 | Q_PROPERTY(QColor firstColor READ firstColor WRITE setFirstColor) |
126 | Q_PROPERTY(QColor secondColor READ secondColor WRITE setSecondColor) |
127 | Q_PROPERTY(QString firstText READ firstText WRITE setFirstText) |
128 | Q_PROPERTY(QString secondText READ secondText WRITE setSecondText) |
129 | |
130 | public: |
131 | /** |
132 | * Constructs a horizontal color selector which |
133 | * contains a gradient between white and black. |
134 | */ |
135 | explicit KGradientSelector(QWidget *parent = nullptr); |
136 | /** |
137 | * Constructs a colors selector with orientation o which |
138 | * contains a gradient between white and black. |
139 | */ |
140 | explicit KGradientSelector(Qt::Orientation o, QWidget *parent = nullptr); |
141 | /** |
142 | * Destructs the widget. |
143 | */ |
144 | ~KGradientSelector() override; |
145 | |
146 | /** |
147 | * Sets the colors that make up the gradient. Any previously set colors |
148 | * are removed. |
149 | * @since 4.5 |
150 | */ |
151 | void setStops(const QGradientStops &stops); |
152 | |
153 | /** |
154 | * Get the colors that make up the gradient. |
155 | * @since 4.5 |
156 | */ |
157 | QGradientStops stops() const; |
158 | |
159 | /** |
160 | * Sets the two colors which span the gradient. |
161 | */ |
162 | void setColors(const QColor &col1, const QColor &col2); |
163 | void setText(const QString &t1, const QString &t2); |
164 | |
165 | /** |
166 | * Set each color on its own. |
167 | */ |
168 | void setFirstColor(const QColor &col); |
169 | void setSecondColor(const QColor &col); |
170 | |
171 | /** |
172 | * Set each description on its own |
173 | */ |
174 | void setFirstText(const QString &t); |
175 | void setSecondText(const QString &t); |
176 | |
177 | QColor firstColor() const; |
178 | QColor secondColor() const; |
179 | |
180 | QString firstText() const; |
181 | QString secondText() const; |
182 | |
183 | protected: |
184 | void drawContents(QPainter *) override; |
185 | virtual QSize minimumSize() const; |
186 | |
187 | private: |
188 | friend class KGradientSelectorPrivate; |
189 | std::unique_ptr<class KGradientSelectorPrivate> const d; |
190 | |
191 | Q_DISABLE_COPY(KGradientSelector) |
192 | }; |
193 | |
194 | #endif // KSELECTOR_H |
195 | |