Krita

SliderSpinBox.h
1/*
2 * SPDX-FileCopyrightText: 2010 Justin Noel <justin@ics.com>
3 * SPDX-FileCopyrightText: 2021 Deif Lou <ginoba@gmail.com>
4 *
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
8#ifndef LIBKIS_SLIDERSPINBOX_H
9#define LIBKIS_SLIDERSPINBOX_H
10
11#include "kis_slider_spin_box.h"
12#include "IntParseSpinBox.h"
13#include "DoubleParseSpinBox.h"
14
15#include "kritalibkis_export.h"
16#include "libkis.h"
17
18template <typename SpinBoxTypeTP, typename BaseSpinBoxTypeTP>
19class KisSliderSpinBoxPrivate;
20
21/**
22 * @brief This class is a wrapper around KisSliderSpinBox, a spinbox in which
23 * you can click and drag to set the value, with a slider like bar displayed
24 * inside. The widget itself is accessed with the widget() function.
25 *
26 * The value can be set by click and dragging with the mouse or pen or by
27 * typing in with the keyboard. To enter the edit mode, in which the keyboard
28 * can be used, one has to right-click inside the spinbox or click and hold
29 * the pointer inside or press the enter key. To leave the edit mode, one
30 * can press the enter key again, in which case the value is committed, or
31 * press the escape key, in which case the value is rejected.
32 *
33 * When dragging with the pointer, one can fine tune the value by dragging
34 * far away vertically from the spinbox. The farther the pointer is, the
35 * slower the value will change. If the pointer is inside the spinbox plus
36 * a certain margin, the value will not be scaled.
37 * By pressing the shift key the slow down will be even more pronounced and
38 * by pressing the control key the value will snap to the increment set by
39 * @ref setFastSliderStep. The two keys can be used at the same time.
40 *
41 * A "soft range" can be set to make the slider display only a sub-range of the
42 * spinbox range. This way one can have a large range but display and set with
43 * the pointer and with more precision only the most commonly used sub-set
44 * of values.
45 * A value outside the "soft range" can be set by entering the edit
46 * mode and using the keyboard.
47 * The "soft range" is considered valid if the "soft maximum" is greater than
48 * the "soft minimum".
49 */
50class KRITALIBKIS_EXPORT SliderSpinBox : public IntParseSpinBox
51{
53 Q_DISABLE_COPY(SliderSpinBox)
54
55
56public:
57 explicit SliderSpinBox();
58 ~SliderSpinBox() override;
59
60public Q_SLOTS:
61
62 /**
63 * @brief Get the internal KisSliderSpinBox as a QWidget, so it may be
64 * added to a UI
65 *
66 * @return the internal KisSliderSpinBox as a QWidget
67 */
68 QWidget* widget() const;
69
70 /**
71 * @brief Get the value to which multiples the spinbox value snaps when
72 * the control key is pressed
73 *
74 * @return the value to which multiples the spinbox value snaps when
75 * the control key is pressed
76 * @see setFastSliderStep(int)
77 */
78 int fastSliderStep() const;
79 /**
80 * @brief Get the minimum value of the "soft range"
81 * @return the minimum value of the "soft range"
82 * @see setSoftMinimum(int)
83 * @see setSoftRange(int, int)
84 * @see softMaximum() const
85 */
86 int softMinimum() const;
87 /**
88 * @brief Get the maximum value of the "soft range"
89 * @return the maximum value of the "soft range"
90 * @see setSoftMaximum(int)
91 * @see setSoftRange(int, int)
92 * @see softMinimum) const
93 */
94 int softMaximum() const;
95 /**
96 * @brief Get if the user is currently dragging the slider with the pointer
97 * @return true if the user is currently dragging the slider with the
98 * pointer, false otherwise
99 */
100 bool isDragging() const;
101 /**
102 * @brief Set the value
103 * @param newValue the new value
104 */
105 void setValue(int newValue);
106 /**
107 * @brief Set the minimum and the maximum values of the range, computing
108 * a new "fast slider step" based on the range if required
109 *
110 * The soft range will be adapted to fit inside the range
111 * @param newMinimum the new minimum value
112 * @param newMaximum the new maximum value
113 * @param computeNewFastSliderStep true if a new "fast slider step"
114 * must be computed based on the range
115 * @see setMinimum(int)
116 * @see setMaximum(int)
117 */
118 void setRange(int newMinimum, int newMaximum, bool computeNewFastSliderStep = true);
119 /**
120 * @brief Set the minimum value of the range
121 *
122 * The soft range will be adapted to fit inside the range
123 * @param newMinimum the new minimum value
124 * @param computeNewFastSliderStep true if a new "fast slider step"
125 * must be computed based on the range
126 * @see setRange(int,int)
127 * @see setMaximum(int)
128 */
129 void setMinimum(int newMinimum, bool computeNewFastSliderStep = true);
130 /**
131 * @brief Set the maximum value of the range
132 *
133 * The soft range will be adapted to fit inside the range
134 * @param newMaximum the new maximum value
135 * @param computeNewFastSliderStep true if a new "fast slider step"
136 * must be computed based on the range
137 * @see setRange(int,int)
138 * @see setMinimum(int)
139 */
140 void setMaximum(int newMaximum, bool computeNewFastSliderStep = true);
141 /**
142 * @brief Set the exponent used by a power function to modify the values
143 * as a function of the horizontal position.
144 *
145 * This allows having more values concentrated in one side of the
146 * slider than the other
147 * @param newExponentRatio the new exponent to be used by the power function
148 */
149 void setExponentRatio(qreal newExponentRatio);
150 /**
151 * @brief Set if the spinbox should not Q_EMIT signals when dragging the
152 * slider.
153 *
154 * This is useful to prevent multiple updates when changing the value if
155 * the update operation is costly.
156 * A valueChanged signal will be emitted when the pointer is released from
157 * the slider.
158 * @param newBlockUpdateSignalOnDrag true if the spinbox should not emit
159 * signals when dragging the slider. false otherwise
160 */
161 void setBlockUpdateSignalOnDrag(bool newBlockUpdateSignalOnDrag);
162 /**
163 * @brief Set the value to which multiples the spinbox value snaps when
164 * the control key is pressed
165 * @param newFastSliderStep value to which multiples the spinbox value
166 * snaps when the control key is pressed
167 * @see fastSliderStep() const
168 */
169 void setFastSliderStep(int newFastSliderStep);
170 /**
171 * @brief Set the minimum and the maximum values of the soft range
172 * @param newSoftMinimum the new minimum value
173 * @param newSoftMaximum the new maximum value
174 * @see setSoftMinimum(int)
175 * @see setSoftMaximum(int)
176 * @see softMinimum() const
177 * @see softMaximum() const
178 */
179 void setSoftRange(int newSoftMinimum, int newSoftMaximum);
180 /**
181 * @brief Set the minimum value of the soft range
182 * @param newSoftMinimum the new minimum value
183 * @see setSoftRange(int,int)
184 * @see setSoftMaximum(int)
185 * @see softMinimum() const
186 * @see softMaximum() const
187 */
188 void setSoftMinimum(int newSoftMinimum);
189 /**
190 * @brief Set the maximum value of the soft range
191 * @param newSoftMaximum the new maximum value
192 * @see setSoftRange(int,int)
193 * @see setSoftMinimum(int)
194 * @see softMinimum() const
195 * @see softMaximum() const
196 */
197 void setSoftMaximum(int newSoftMaximum);
198
200 void draggingFinished();
201
202private:
203 struct Private;
204 Private *const d;
205};
206
207/**
208 * @brief This class is a wrapper around KisDoubleSliderSpinBox, a spinbox in
209 * which you can click and drag to set the value, with a slider like bar
210 * displayed inside. The widget itself is accessed with the widget() function.
211 *
212 * @see SliderSpinBox
213 */
214class KRITALIBKIS_EXPORT DoubleSliderSpinBox : public DoubleParseSpinBox
215{
217 Q_DISABLE_COPY(DoubleSliderSpinBox)
218
219public:
220 explicit DoubleSliderSpinBox();
221 ~DoubleSliderSpinBox() override;
222
223public Q_SLOTS:
224
225 /**
226 * @brief Get the internal KisDoubleSliderSpinBox as a QWidget, so it may be
227 * added to a UI
228 *
229 * @return the internal KisDoubleSliderSpinBox as a QWidget
230 */
231 QWidget* widget() const;
232
233 qreal fastSliderStep() const;
234 qreal softMinimum() const;
235 qreal softMaximum() const;
236 bool isDragging() const;
237 void setValue(qreal newValue);
238 /**
239 * @brief Set the minimum and the maximum values of the range
240 *
241 * The soft range will be adapted to fit inside the range
242 * The number of decimals used can be changed with the newNumberOfDecimals
243 * parameter
244 * @param newMinimum the new minimum value
245 * @param newMaximum the new maximum value
246 * @param newNumberOfDecimals the new number of decimals
247 * @param computeNewFastSliderStep true if a new "fast slider step"
248 * must be computed based on the range
249 * @see setMinimum(qreal)
250 * @see setMaximum(qreal)
251 */
252 void setRange(qreal newMinimum, qreal newMaximum, int newNumberOfDecimals = 0, bool computeNewFastSliderStep = true);
253 void setMinimum(qreal newMinimum, bool computeNewFastSliderStep = true);
254 void setMaximum(qreal newMaximum, bool computeNewFastSliderStep = true);
255 void setExponentRatio(qreal newExponentRatio);
256 void setBlockUpdateSignalOnDrag(bool newBlockUpdateSignalOnDrag);
257 void setFastSliderStep(qreal newFastSliderStep);
258 void setSoftRange(qreal newSoftMinimum, qreal newSoftMaximum);
259 void setSoftMinimum(qreal newSoftMinimum);
260 void setSoftMaximum(qreal newSoftMaximum);
261
263 void draggingFinished();
264
265private:
266 struct Private;
267 Private *const d;
268};
269
270#endif // LIBKIS_SLIDERSPINBOX_H
void setRange(qreal newMinimum, qreal newMaximum, int newNumberOfDecimals=0, bool computeNewFastSliderStep=true)
Set the minimum and the maximum values of the range.
QSpinBox * widget() const
Get the internal KisIntParseSpinBox as a QWidget, so it may be added to a UI.
void setValue(int value, bool overwriteExpression=false)
Set the value of the spinbox.
void setMinimum(int newMinimum, bool computeNewFastSliderStep=true)
Set the minimum value of the range.
int fastSliderStep() const
Get the value to which multiples the spinbox value snaps when the control key is pressed.
void setFastSliderStep(int newFastSliderStep)
Set the value to which multiples the spinbox value snaps when the control key is pressed.
void setRange(int newMinimum, int newMaximum, bool computeNewFastSliderStep=true)
Set the minimum and the maximum values of the range, computing a new "fast slider step" based on the ...
int softMinimum() const
Get the minimum value of the "soft range".
int softMaximum() const
Get the maximum value of the "soft range".
void setSoftRange(int newSoftMinimum, int newSoftMaximum)
Set the minimum and the maximum values of the soft range.
void setBlockUpdateSignalOnDrag(bool newBlockUpdateSignalOnDrag)
Set if the spinbox should not Q_EMIT signals when dragging the slider.
void setSoftMaximum(int newSoftMaximum)
Set the maximum value of the soft range.
void setExponentRatio(qreal newExponentRatio)
Set the exponent used by a power function to modify the values as a function of the horizontal positi...
void setMaximum(int newMaximum, bool computeNewFastSliderStep=true)
Set the maximum value of the range.
bool isDragging() const
Get if the user is currently dragging the slider with the pointer.
void setSoftMinimum(int newSoftMinimum)
Set the minimum value of the soft range.
Q_OBJECTQ_OBJECT
Q_SIGNALSQ_SIGNALS
Q_SLOTSQ_SLOTS
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Feb 21 2025 11:55:31 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.