summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2012-11-03 19:21:12 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-12-12 15:30:53 +0100
commit22c234a34e8af6a26b374ef810630ba9e82c696a (patch)
treeef16e919f2295810d78398a5b7590bd01b6a1dd3
parent225a8357776dea2fc469bc51fe8b04092b7e84dd (diff)
Accessible: Improve value interfacev5.0.0-rc2
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 <jan-arve.saether@digia.com> Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
-rw-r--r--src/gui/accessible/qaccessible2.cpp13
-rw-r--r--src/gui/accessible/qaccessible2.h1
-rw-r--r--src/platformsupport/linuxaccessibility/atspiadaptor.cpp52
-rw-r--r--src/plugins/accessible/widgets/rangecontrols.cpp10
-rw-r--r--src/plugins/accessible/widgets/rangecontrols.h2
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.cpp8
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.h1
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp3
8 files changed, 59 insertions, 31 deletions
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
@@ -439,6 +439,19 @@ QString QAccessibleTextInterface::textAtOffset(int offset, QAccessible2::Boundar
*/
/*!
+ \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
\ingroup accessibility
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<QDBusVariant>();
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<QAbstractSlider *>(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<QProgressBar *>(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:
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index 242dacb55e..ba173dff81 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -453,6 +453,7 @@ void tst_QAccessibility::sliderTest()
QVERIFY(valueIface != 0);
QCOMPARE(valueIface->minimumValue().toInt(), slider->minimum());
QCOMPARE(valueIface->maximumValue().toInt(), slider->maximum());
+ QCOMPARE(valueIface->minimumStepSize().toInt(), slider->singleStep());
slider->setValue(50);
QCOMPARE(valueIface->currentValue().toInt(), slider->value());
slider->setValue(0);
@@ -461,6 +462,8 @@ void tst_QAccessibility::sliderTest()
QCOMPARE(valueIface->currentValue().toInt(), slider->value());
valueIface->setCurrentValue(77);
QCOMPARE(77, slider->value());
+ slider->setSingleStep(2);
+ QCOMPARE(valueIface->minimumStepSize().toInt(), 2);
delete slider;
}