Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
rangecontrols.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#if QT_CONFIG(slider)
7#include <qslider.h>
8#endif
9#if QT_CONFIG(dial)
10#include <qdial.h>
11#endif
12#if QT_CONFIG(spinbox)
13#include <qspinbox.h>
14#endif
15#if QT_CONFIG(scrollbar)
16#include <qscrollbar.h>
17#endif
18#include <qstyle.h>
19#include <qstyleoption.h>
20#include <qdebug.h>
21#include <qglobal.h>
22#if QT_CONFIG(lineedit)
23#include <QtWidgets/qlineedit.h>
24#endif
25#include <qmath.h>
26#include <private/qmath_p.h>
27
28#include "simplewidgets_p.h" // let spinbox use line edit's interface
29
30QT_BEGIN_NAMESPACE
31
32using namespace Qt::StringLiterals;
33
34#if QT_CONFIG(accessibility)
35
36#if QT_CONFIG(spinbox)
37QAccessibleAbstractSpinBox::QAccessibleAbstractSpinBox(QWidget *w)
38 : QAccessibleWidgetV2(w, QAccessible::SpinBox), lineEdit(nullptr)
39{
40 Q_ASSERT(abstractSpinBox());
41}
42
43QAccessibleAbstractSpinBox::~QAccessibleAbstractSpinBox()
44{
45 delete lineEdit;
46}
47
48/*!
49 Returns the underlying QAbstractSpinBox.
50*/
51QAbstractSpinBox *QAccessibleAbstractSpinBox::abstractSpinBox() const
52{
53 return qobject_cast<QAbstractSpinBox*>(object());
54}
55
56QAccessibleInterface *QAccessibleAbstractSpinBox::lineEditIface() const
57{
58#if QT_CONFIG(lineedit)
59 // QAccessibleLineEdit is only used to forward the text functions
60 if (!lineEdit)
61 lineEdit = new QAccessibleLineEdit(abstractSpinBox()->lineEdit());
62 return lineEdit;
63#else
64 return nullptr;
65#endif
66}
67
68QAccessible::State QAccessibleAbstractSpinBox::state() const
69{
70 QAccessible::State state = QAccessibleWidgetV2::state();
71 if (abstractSpinBox()->isReadOnly())
72 state.readOnly = true;
73 else
74 state.editable = true;
75 return state;
76}
77
78QString QAccessibleAbstractSpinBox::text(QAccessible::Text t) const
79{
80 if (t == QAccessible::Value)
81 return abstractSpinBox()->text();
82 return QAccessibleWidgetV2::text(t);
83}
84
85void *QAccessibleAbstractSpinBox::interface_cast(QAccessible::InterfaceType t)
86{
87 if (t == QAccessible::ValueInterface)
88 return static_cast<QAccessibleValueInterface*>(this);
89 if (t == QAccessible::TextInterface)
90 return static_cast<QAccessibleTextInterface*>(this);
91 if (t == QAccessible::EditableTextInterface)
92 return static_cast<QAccessibleEditableTextInterface*>(this);
93 return QAccessibleWidgetV2::interface_cast(t);
94}
95
96QVariant QAccessibleAbstractSpinBox::currentValue() const
97{
98 return abstractSpinBox()->property("value");
99}
100
101void QAccessibleAbstractSpinBox::setCurrentValue(const QVariant &value)
102{
103 abstractSpinBox()->setProperty("value", value);
104}
105
106QVariant QAccessibleAbstractSpinBox::maximumValue() const
107{
108 return abstractSpinBox()->property("maximum");
109}
110
111QVariant QAccessibleAbstractSpinBox::minimumValue() const
112{
113 return abstractSpinBox()->property("minimum");
114}
115
116QVariant QAccessibleAbstractSpinBox::minimumStepSize() const
117{
118 return abstractSpinBox()->property("stepSize");
119}
120
121void QAccessibleAbstractSpinBox::addSelection(int startOffset, int endOffset)
122{
123 lineEditIface()->textInterface()->addSelection(startOffset, endOffset);
124}
125
126QString QAccessibleAbstractSpinBox::attributes(int offset, int *startOffset, int *endOffset) const
127{
128 return lineEditIface()->textInterface()->attributes(offset, startOffset, endOffset);
129}
130
131int QAccessibleAbstractSpinBox::cursorPosition() const
132{
133 return lineEditIface()->textInterface()->cursorPosition();
134}
135
136QRect QAccessibleAbstractSpinBox::characterRect(int offset) const
137{
138 return lineEditIface()->textInterface()->characterRect(offset);
139}
140
141int QAccessibleAbstractSpinBox::selectionCount() const
142{
143 return lineEditIface()->textInterface()->selectionCount();
144}
145
146int QAccessibleAbstractSpinBox::offsetAtPoint(const QPoint &point) const
147{
148 return lineEditIface()->textInterface()->offsetAtPoint(point);
149}
150
151void QAccessibleAbstractSpinBox::selection(int selectionIndex, int *startOffset, int *endOffset) const
152{
153 lineEditIface()->textInterface()->selection(selectionIndex, startOffset, endOffset);
154}
155
156QString QAccessibleAbstractSpinBox::text(int startOffset, int endOffset) const
157{
158 return lineEditIface()->textInterface()->text(startOffset, endOffset);
159}
160
161QString QAccessibleAbstractSpinBox::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
162{
163 return lineEditIface()->textInterface()->textBeforeOffset(offset, boundaryType, startOffset, endOffset);
164}
165
166QString QAccessibleAbstractSpinBox::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
167{
168 return lineEditIface()->textInterface()->textAfterOffset(offset, boundaryType, startOffset, endOffset);
169}
170
171QString QAccessibleAbstractSpinBox::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
172{
173 return lineEditIface()->textInterface()->textAtOffset(offset, boundaryType, startOffset, endOffset);
174}
175
176void QAccessibleAbstractSpinBox::removeSelection(int selectionIndex)
177{
178 lineEditIface()->textInterface()->removeSelection(selectionIndex);
179}
180
181void QAccessibleAbstractSpinBox::setCursorPosition(int position)
182{
183 lineEditIface()->textInterface()->setCursorPosition(position);
184}
185
186void QAccessibleAbstractSpinBox::setSelection(int selectionIndex, int startOffset, int endOffset)
187{
188 lineEditIface()->textInterface()->setSelection(selectionIndex, startOffset, endOffset);
189}
190
191int QAccessibleAbstractSpinBox::characterCount() const
192{
193 return lineEditIface()->textInterface()->characterCount();
194}
195
196void QAccessibleAbstractSpinBox::scrollToSubstring(int startIndex, int endIndex)
197{
198 lineEditIface()->textInterface()->scrollToSubstring(startIndex, endIndex);
199}
200
201void QAccessibleAbstractSpinBox::deleteText(int startOffset, int endOffset)
202{
203 lineEditIface()->editableTextInterface()->deleteText(startOffset, endOffset);
204}
205
206void QAccessibleAbstractSpinBox::insertText(int offset, const QString &text)
207{
208 lineEditIface()->editableTextInterface()->insertText(offset, text);
209}
210
211void QAccessibleAbstractSpinBox::replaceText(int startOffset, int endOffset, const QString &text)
212{
213 lineEditIface()->editableTextInterface()->replaceText(startOffset, endOffset, text);
214}
215
216
217/*!
218 \class QAccessibleSpinBox
219 \brief The QAccessibleSpinBox class implements the QAccessibleInterface for spinbox widgets.
220 \internal
221
222 \ingroup accessibility
223*/
224
225/*!
226 Constructs a QAccessibleSpinWidget object for \a w.
227*/
228QAccessibleSpinBox::QAccessibleSpinBox(QWidget *w)
229: QAccessibleAbstractSpinBox(w)
230{
231 Q_ASSERT(spinBox());
232 addControllingSignal("valueChanged(int)"_L1);
233}
234
235/*!
236 Returns the underlying QSpinBox.
237*/
238QSpinBox *QAccessibleSpinBox::spinBox() const
239{
240 return qobject_cast<QSpinBox*>(object());
241}
242
243
244// ================================== QAccessibleDoubleSpinBox ==================================
245QAccessibleDoubleSpinBox::QAccessibleDoubleSpinBox(QWidget *widget)
246 : QAccessibleAbstractSpinBox(widget)
247{
248 Q_ASSERT(qobject_cast<QDoubleSpinBox *>(widget));
249 addControllingSignal("valueChanged(double)"_L1);
250}
251
252/*!
253 Returns the underlying QDoubleSpinBox.
254*/
255QDoubleSpinBox *QAccessibleDoubleSpinBox::doubleSpinBox() const
256{
257 return static_cast<QDoubleSpinBox*>(object());
258}
259
260QString QAccessibleDoubleSpinBox::text(QAccessible::Text textType) const
261{
262 if (textType == QAccessible::Value)
263 return doubleSpinBox()->textFromValue(doubleSpinBox()->value());
264 return QAccessibleWidgetV2::text(textType);
265}
266
267#endif // QT_CONFIG(spinbox)
268
269#if QT_CONFIG(scrollbar)
270/*!
271 \class QAccessibleScrollBar
272 \brief The QAccessibleScrollBar class implements the QAccessibleInterface for scroll bars.
273 \internal
274
275 \ingroup accessibility
276*/
277
278/*!
279 Constructs a QAccessibleScrollBar object for \a w.
280 \a name is propagated to the QAccessibleWidget constructor.
281*/
282QAccessibleScrollBar::QAccessibleScrollBar(QWidget *w)
283: QAccessibleAbstractSlider(w, QAccessible::ScrollBar)
284{
285 Q_ASSERT(scrollBar());
286 addControllingSignal("valueChanged(int)"_L1);
287}
288
289/*! Returns the scroll bar. */
290QScrollBar *QAccessibleScrollBar::scrollBar() const
291{
292 return qobject_cast<QScrollBar*>(object());
293}
294
295QString QAccessibleScrollBar::text(QAccessible::Text t) const
296{
297 if (t == QAccessible::Value)
298 return QString::number(scrollBar()->value());
299 return QAccessibleAbstractSlider::text(t);
300}
301
302#endif // QT_CONFIG(scrollbar)
303
304#if QT_CONFIG(slider)
305/*!
306 \class QAccessibleSlider
307 \brief The QAccessibleSlider class implements the QAccessibleInterface for sliders.
308 \internal
309
310 \ingroup accessibility
311*/
312
313/*!
314 Constructs a QAccessibleScrollBar object for \a w.
315 \a name is propagated to the QAccessibleWidget constructor.
316*/
317QAccessibleSlider::QAccessibleSlider(QWidget *w)
318: QAccessibleAbstractSlider(w)
319{
320 Q_ASSERT(slider());
321 addControllingSignal("valueChanged(int)"_L1);
322}
323
324/*! Returns the slider. */
325QSlider *QAccessibleSlider::slider() const
326{
327 return qobject_cast<QSlider*>(object());
328}
329
330QString QAccessibleSlider::text(QAccessible::Text t) const
331{
332 if (t == QAccessible::Value)
333 return QString::number(slider()->value());
334
335 return QAccessibleAbstractSlider::text(t);
336}
337
338QAccessibleAbstractSlider::QAccessibleAbstractSlider(QWidget *w, QAccessible::Role r)
339 : QAccessibleWidgetV2(w, r)
340{
341 Q_ASSERT(qobject_cast<QAbstractSlider *>(w));
342}
343
344void *QAccessibleAbstractSlider::interface_cast(QAccessible::InterfaceType t)
345{
346 if (t == QAccessible::ValueInterface)
347 return static_cast<QAccessibleValueInterface*>(this);
348 return QAccessibleWidgetV2::interface_cast(t);
349}
350
351QList<QAccessible::Attribute> QAccessibleAbstractSlider::attributeKeys() const
352{
353 QList<QAccessible::Attribute> keys = QAccessibleWidgetV2::attributeKeys();
354 keys.append(QAccessible::Attribute::Orientation);
355
356 return keys;
357}
358
359QVariant QAccessibleAbstractSlider::attributeValue(QAccessible::Attribute key) const
360{
361 if (key == QAccessible::Attribute::Orientation)
362 return QVariant::fromValue(abstractSlider()->orientation());
363
364 return QAccessibleWidgetV2::attributeValue(key);
365}
366
367QVariant QAccessibleAbstractSlider::currentValue() const
368{
369 return abstractSlider()->value();
370}
371
372void QAccessibleAbstractSlider::setCurrentValue(const QVariant &value)
373{
374 abstractSlider()->setValue(value.toInt());
375}
376
377QVariant QAccessibleAbstractSlider::maximumValue() const
378{
379 return abstractSlider()->maximum();
380}
381
382QVariant QAccessibleAbstractSlider::minimumValue() const
383{
384 return abstractSlider()->minimum();
385}
386
387QVariant QAccessibleAbstractSlider::minimumStepSize() const
388{
389 return abstractSlider()->singleStep();
390}
391
392QAbstractSlider *QAccessibleAbstractSlider::abstractSlider() const
393{
394 return static_cast<QAbstractSlider *>(object());
395}
396
397#endif // QT_CONFIG(slider)
398
399#if QT_CONFIG(dial)
400// ======================================= QAccessibleDial ======================================
401QAccessibleDial::QAccessibleDial(QWidget *widget)
402 : QAccessibleAbstractSlider(widget, QAccessible::Dial)
403{
404 Q_ASSERT(qobject_cast<QDial *>(widget));
405 addControllingSignal("valueChanged(int)"_L1);
406}
407
408QString QAccessibleDial::text(QAccessible::Text textType) const
409{
410 if (textType == QAccessible::Value)
411 return QString::number(dial()->value());
412
413 return QAccessibleAbstractSlider::text(textType);
414}
415
416QDial *QAccessibleDial::dial() const
417{
418 return static_cast<QDial*>(object());
419}
420#endif // QT_CONFIG(dial)
421
422#endif // QT_CONFIG(accessibility)
423
424QT_END_NAMESPACE