summaryrefslogtreecommitdiffstats
path: root/src/widgets/accessible/rangecontrols.cpp
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2014-06-27 13:23:01 +0200
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2014-08-19 14:23:13 +0200
commit41f496cb7f63da012f73bfe7904c225e91d300da (patch)
tree1d2d6514ee86e2fd6a4d596450478f679178eeaf /src/widgets/accessible/rangecontrols.cpp
parentcf621f1b9e472d394bcab922d0a1a205bc539b02 (diff)
Accessibility: QSpinBox should not have any children
On both iOS and Android it is very confusing to be able to move the focus to both, the line edit and the outer frame that is the spin box. For Linux this fixes an issue that orca would not read the value correctly after pressing the up/down buttons. Task-number: QTBUG-39861 Task-number: QTBUG-39442 Change-Id: I73c50c91e9021324c52d168d537afd0ea719a48f Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
Diffstat (limited to 'src/widgets/accessible/rangecontrols.cpp')
-rw-r--r--src/widgets/accessible/rangecontrols.cpp118
1 files changed, 117 insertions, 1 deletions
diff --git a/src/widgets/accessible/rangecontrols.cpp b/src/widgets/accessible/rangecontrols.cpp
index d4dc74ea69..e16b99c25e 100644
--- a/src/widgets/accessible/rangecontrols.cpp
+++ b/src/widgets/accessible/rangecontrols.cpp
@@ -51,20 +51,28 @@
#include <qglobal.h>
#include <QDoubleSpinBox>
#include <QDial>
+#include <QtWidgets/qlineedit.h>
#include <qmath.h>
#include <private/qmath_p.h>
+#include "simplewidgets.h" // let spinbox use line edit's interface
+
QT_BEGIN_NAMESPACE
#ifndef QT_NO_ACCESSIBILITY
#ifndef QT_NO_SPINBOX
QAccessibleAbstractSpinBox::QAccessibleAbstractSpinBox(QWidget *w)
-: QAccessibleWidget(w, QAccessible::SpinBox)
+: QAccessibleWidget(w, QAccessible::SpinBox), lineEdit(Q_NULLPTR)
{
Q_ASSERT(abstractSpinBox());
}
+QAccessibleAbstractSpinBox::~QAccessibleAbstractSpinBox()
+{
+ delete lineEdit;
+}
+
/*!
Returns the underlying QAbstractSpinBox.
*/
@@ -73,6 +81,14 @@ QAbstractSpinBox *QAccessibleAbstractSpinBox::abstractSpinBox() const
return qobject_cast<QAbstractSpinBox*>(object());
}
+QAccessibleInterface *QAccessibleAbstractSpinBox::lineEditIface() const
+{
+ // QAccessibleLineEdit is only used to forward the text functions
+ if (!lineEdit)
+ lineEdit = new QAccessibleLineEdit(abstractSpinBox()->lineEdit());
+ return lineEdit;
+}
+
QString QAccessibleAbstractSpinBox::text(QAccessible::Text t) const
{
if (t == QAccessible::Value)
@@ -84,6 +100,10 @@ void *QAccessibleAbstractSpinBox::interface_cast(QAccessible::InterfaceType t)
{
if (t == QAccessible::ValueInterface)
return static_cast<QAccessibleValueInterface*>(this);
+ if (t == QAccessible::TextInterface)
+ return static_cast<QAccessibleTextInterface*>(this);
+ if (t == QAccessible::EditableTextInterface)
+ return static_cast<QAccessibleEditableTextInterface*>(this);
return QAccessibleWidget::interface_cast(t);
}
@@ -112,6 +132,102 @@ QVariant QAccessibleAbstractSpinBox::minimumStepSize() const
return abstractSpinBox()->property("stepSize");
}
+void QAccessibleAbstractSpinBox::addSelection(int startOffset, int endOffset)
+{
+ lineEditIface()->textInterface()->addSelection(startOffset, endOffset);
+}
+
+QString QAccessibleAbstractSpinBox::attributes(int offset, int *startOffset, int *endOffset) const
+{
+ return lineEditIface()->textInterface()->attributes(offset, startOffset, endOffset);
+}
+
+int QAccessibleAbstractSpinBox::cursorPosition() const
+{
+ return lineEditIface()->textInterface()->cursorPosition();
+}
+
+QRect QAccessibleAbstractSpinBox::characterRect(int offset) const
+{
+ return lineEditIface()->textInterface()->characterRect(offset);
+}
+
+int QAccessibleAbstractSpinBox::selectionCount() const
+{
+ return lineEditIface()->textInterface()->selectionCount();
+}
+
+int QAccessibleAbstractSpinBox::offsetAtPoint(const QPoint &point) const
+{
+ return lineEditIface()->textInterface()->offsetAtPoint(point);
+}
+
+void QAccessibleAbstractSpinBox::selection(int selectionIndex, int *startOffset, int *endOffset) const
+{
+ lineEditIface()->textInterface()->selection(selectionIndex, startOffset, endOffset);
+}
+
+QString QAccessibleAbstractSpinBox::text(int startOffset, int endOffset) const
+{
+ return lineEditIface()->textInterface()->text(startOffset, endOffset);
+}
+
+QString QAccessibleAbstractSpinBox::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
+{
+ return lineEditIface()->textInterface()->textBeforeOffset(offset, boundaryType, startOffset, endOffset);
+}
+
+QString QAccessibleAbstractSpinBox::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
+{
+ return lineEditIface()->textInterface()->textAfterOffset(offset, boundaryType, startOffset, endOffset);
+}
+
+QString QAccessibleAbstractSpinBox::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const
+{
+ return lineEditIface()->textInterface()->textAtOffset(offset, boundaryType, startOffset, endOffset);
+}
+
+void QAccessibleAbstractSpinBox::removeSelection(int selectionIndex)
+{
+ lineEditIface()->textInterface()->removeSelection(selectionIndex);
+}
+
+void QAccessibleAbstractSpinBox::setCursorPosition(int position)
+{
+ lineEditIface()->textInterface()->setCursorPosition(position);
+}
+
+void QAccessibleAbstractSpinBox::setSelection(int selectionIndex, int startOffset, int endOffset)
+{
+ lineEditIface()->textInterface()->setSelection(selectionIndex, startOffset, endOffset);
+}
+
+int QAccessibleAbstractSpinBox::characterCount() const
+{
+ return lineEditIface()->textInterface()->characterCount();
+}
+
+void QAccessibleAbstractSpinBox::scrollToSubstring(int startIndex, int endIndex)
+{
+ lineEditIface()->textInterface()->scrollToSubstring(startIndex, endIndex);
+}
+
+void QAccessibleAbstractSpinBox::deleteText(int startOffset, int endOffset)
+{
+ lineEditIface()->editableTextInterface()->deleteText(startOffset, endOffset);
+}
+
+void QAccessibleAbstractSpinBox::insertText(int offset, const QString &text)
+{
+ lineEditIface()->editableTextInterface()->insertText(offset, text);
+}
+
+void QAccessibleAbstractSpinBox::replaceText(int startOffset, int endOffset, const QString &text)
+{
+ lineEditIface()->editableTextInterface()->replaceText(startOffset, endOffset, text);
+}
+
+
/*!
\class QAccessibleSpinBox
\brief The QAccessibleSpinBox class implements the QAccessibleInterface for spinbox widgets.