From 22c234a34e8af6a26b374ef810630ba9e82c696a Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Sat, 3 Nov 2012 19:21:12 +0100 Subject: Accessible: Improve value interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stepSize property was missing in Qt 4 and is a sensible addition to the value interface. Change-Id: I7571800d50ee7e4194c09c4db40300809a1ce45a Reviewed-by: Jan Arve Sæther Reviewed-by: Frederik Gladhorn --- src/gui/accessible/qaccessible2.cpp | 13 ++++++ src/gui/accessible/qaccessible2.h | 1 + .../linuxaccessibility/atspiadaptor.cpp | 52 +++++++++------------- src/plugins/accessible/widgets/rangecontrols.cpp | 10 +++++ src/plugins/accessible/widgets/rangecontrols.h | 2 + src/plugins/accessible/widgets/simplewidgets.cpp | 8 ++++ src/plugins/accessible/widgets/simplewidgets.h | 1 + 7 files changed, 56 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/gui/accessible/qaccessible2.cpp b/src/gui/accessible/qaccessible2.cpp index 7f871f9c5a..f21c74e74f 100644 --- a/src/gui/accessible/qaccessible2.cpp +++ b/src/gui/accessible/qaccessible2.cpp @@ -438,6 +438,19 @@ QString QAccessibleTextInterface::textAtOffset(int offset, QAccessible2::Boundar \sa maximumValue(), currentValue() */ +/*! + \fn QVariant QAccessibleValueInterface::minimumStepSize() const + + Returns the minimum step size for the accessible. + This is the smalles increment that makes sense when changing the value. + When programatically changing the value it should always be a multiple + of the minimum step size. + + Some tools use this value even when the setCurrentValue does not + perform any action. Progress bars for example are read-only but + should return their range divided by 100. +*/ + /*! \class QAccessibleImageInterface \inmodule QtGui diff --git a/src/gui/accessible/qaccessible2.h b/src/gui/accessible/qaccessible2.h index e93324b4f8..86a01c0730 100644 --- a/src/gui/accessible/qaccessible2.h +++ b/src/gui/accessible/qaccessible2.h @@ -117,6 +117,7 @@ public: virtual void setCurrentValue(const QVariant &value) = 0; virtual QVariant maximumValue() const = 0; virtual QVariant minimumValue() const = 0; + virtual QVariant minimumStepSize() const = 0; }; class Q_GUI_EXPORT QAccessibleTableCellInterface diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp index 6926f546a2..1eda1dfab9 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp +++ b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp @@ -1049,7 +1049,7 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) break; } case QAccessible::ValueChanged: { - if (sendObject || sendObject_value_changed) { + if (sendObject || sendObject_value_changed || sendObject_property_change_accessible_value) { QAIPointer iface = QAIPointer(event->accessibleInterface()); Q_ASSERT(iface->valueInterface()); QString path = pathForInterface(iface); @@ -2093,44 +2093,34 @@ bool AtSpiAdaptor::editableTextInterface(const QAIPointer &interface, const QStr // Value interface bool AtSpiAdaptor::valueInterface(const QAIPointer &interface, const QString &function, const QDBusMessage &message, const QDBusConnection &connection) { - if (0) { - } else if (function == QLatin1String("SetCurrentValue")) { + if (function == QLatin1String("SetCurrentValue")) { QDBusVariant v = message.arguments().at(2).value(); double value = v.variant().toDouble(); //Temporary fix //See https://bugzilla.gnome.org/show_bug.cgi?id=652596 interface->valueInterface()->setCurrentValue(value); connection.send(message.createReply()); // FIXME is the reply needed? - } else if (function == QLatin1String("GetCurrentValue")) { - bool success; - double val = interface->valueInterface()->currentValue().toDouble(&success); - if (!success) { - qAtspiDebug ("AtSpiAdaptor::valueInterface: Could not convert current value to double."); - } - connection.send(message.createReply( - QVariant::fromValue(QDBusVariant(QVariant::fromValue(val))))); - } else if (function == QLatin1String("GetMaximumValue")) { - bool success; - double val = interface->valueInterface()->maximumValue().toDouble(&success); - if (!success) { - qAtspiDebug ("AtSpiAdaptor::valueInterface: Could not convert current value to double."); - } - connection.send(message.createReply( - QVariant::fromValue(QDBusVariant(QVariant::fromValue(val))))); - } else if (function == QLatin1String("GetMinimumIncrement")) { - connection.send(message.createReply( - QVariant::fromValue(QDBusVariant(QVariant::fromValue(0.0))))); - } else if (function == QLatin1String("GetMinimumValue")) { - bool success; - double val = interface->valueInterface()->minimumValue().toDouble(&success); - if (!success) { - qAtspiDebug ("AtSpiAdaptor::valueInterface: Could not convert current value to double."); + } else { + QVariant value; + if (function == QLatin1String("GetCurrentValue")) + value = interface->valueInterface()->currentValue(); + else if (function == QLatin1String("GetMaximumValue")) + value = interface->valueInterface()->maximumValue(); + else if (function == QLatin1String("GetMinimumIncrement")) + value = interface->valueInterface()->minimumStepSize(); + else if (function == QLatin1String("GetMinimumValue")) + value = interface->valueInterface()->minimumValue(); + else { + qAtspiDebug() << "WARNING: AtSpiAdaptor::valueInterface does not implement " << function << message.path(); + return false; } + if (!value.canConvert(QVariant::Double)) + qAtspiDebug() << "AtSpiAdaptor::valueInterface: Could not convert to double: " << function; + + // explicitly convert to dbus-variant containing one double since atspi expects that + // everything else might fail to convert back on the other end connection.send(message.createReply( - QVariant::fromValue(QDBusVariant(QVariant::fromValue(val))))); - } else { - qAtspiDebug() << "WARNING: AtSpiAdaptor::valueInterface does not implement " << function << message.path(); - return false; + QVariant::fromValue(QDBusVariant(QVariant::fromValue(value.toDouble()))))); } return true; } diff --git a/src/plugins/accessible/widgets/rangecontrols.cpp b/src/plugins/accessible/widgets/rangecontrols.cpp index 954369b6b3..d03130f148 100644 --- a/src/plugins/accessible/widgets/rangecontrols.cpp +++ b/src/plugins/accessible/widgets/rangecontrols.cpp @@ -122,6 +122,11 @@ QVariant QAccessibleAbstractSpinBox::minimumValue() const return abstractSpinBox()->property("minimum"); } +QVariant QAccessibleAbstractSpinBox::minimumStepSize() const +{ + return abstractSpinBox()->property("stepSize"); +} + /*! \class QAccessibleSpinBox \brief The QAccessibleSpinBox class implements the QAccessibleInterface for spinbox widgets. @@ -278,6 +283,11 @@ QVariant QAccessibleAbstractSlider::minimumValue() const return abstractSlider()->minimum(); } +QVariant QAccessibleAbstractSlider::minimumStepSize() const +{ + return abstractSlider()->singleStep(); +} + QAbstractSlider *QAccessibleAbstractSlider::abstractSlider() const { return static_cast(object()); diff --git a/src/plugins/accessible/widgets/rangecontrols.h b/src/plugins/accessible/widgets/rangecontrols.h index b26d97421a..a370ada199 100644 --- a/src/plugins/accessible/widgets/rangecontrols.h +++ b/src/plugins/accessible/widgets/rangecontrols.h @@ -71,6 +71,7 @@ public: void setCurrentValue(const QVariant &value); QVariant maximumValue() const; QVariant minimumValue() const; + QVariant minimumStepSize() const; // FIXME Action interface @@ -110,6 +111,7 @@ public: void setCurrentValue(const QVariant &value); QVariant maximumValue() const; QVariant minimumValue() const; + QVariant minimumStepSize() const; protected: QAbstractSlider *abstractSlider() const; diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp index 1bd509dc41..8bf71da6e1 100644 --- a/src/plugins/accessible/widgets/simplewidgets.cpp +++ b/src/plugins/accessible/widgets/simplewidgets.cpp @@ -832,6 +832,14 @@ QVariant QAccessibleProgressBar::minimumValue() const return progressBar()->minimum(); } +QVariant QAccessibleProgressBar::minimumStepSize() const +{ + // This is arbitrary since any value between min and max is valid. + // Some screen readers (orca use it to calculate how many digits to display though, + // so it makes sense to return a "sensible" value. Providing 100 increments seems ok. + return (progressBar()->maximum() - progressBar()->minimum()) / 100.0; +} + QProgressBar *QAccessibleProgressBar::progressBar() const { return qobject_cast(object()); diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h index 2e1bca88b4..dbea8d4f09 100644 --- a/src/plugins/accessible/widgets/simplewidgets.h +++ b/src/plugins/accessible/widgets/simplewidgets.h @@ -188,6 +188,7 @@ public: QVariant currentValue() const; QVariant maximumValue() const; QVariant minimumValue() const; + QVariant minimumStepSize() const; inline void setCurrentValue(const QVariant &) {} protected: -- cgit v1.2.3