Accessible: Improve value interface

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>
This commit is contained in:
Frederik Gladhorn 2012-11-03 19:21:12 +01:00 committed by The Qt Project
parent 225a835777
commit 22c234a34e
8 changed files with 60 additions and 32 deletions

View File

@ -438,6 +438,19 @@ QString QAccessibleTextInterface::textAtOffset(int offset, QAccessible2::Boundar
\sa maximumValue(), currentValue() \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 \class QAccessibleImageInterface
\inmodule QtGui \inmodule QtGui

View File

@ -117,6 +117,7 @@ public:
virtual void setCurrentValue(const QVariant &value) = 0; virtual void setCurrentValue(const QVariant &value) = 0;
virtual QVariant maximumValue() const = 0; virtual QVariant maximumValue() const = 0;
virtual QVariant minimumValue() const = 0; virtual QVariant minimumValue() const = 0;
virtual QVariant minimumStepSize() const = 0;
}; };
class Q_GUI_EXPORT QAccessibleTableCellInterface class Q_GUI_EXPORT QAccessibleTableCellInterface

View File

@ -1049,7 +1049,7 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event)
break; break;
} }
case QAccessible::ValueChanged: { case QAccessible::ValueChanged: {
if (sendObject || sendObject_value_changed) { if (sendObject || sendObject_value_changed || sendObject_property_change_accessible_value) {
QAIPointer iface = QAIPointer(event->accessibleInterface()); QAIPointer iface = QAIPointer(event->accessibleInterface());
Q_ASSERT(iface->valueInterface()); Q_ASSERT(iface->valueInterface());
QString path = pathForInterface(iface); QString path = pathForInterface(iface);
@ -2093,44 +2093,34 @@ bool AtSpiAdaptor::editableTextInterface(const QAIPointer &interface, const QStr
// Value interface // Value interface
bool AtSpiAdaptor::valueInterface(const QAIPointer &interface, const QString &function, const QDBusMessage &message, const QDBusConnection &connection) bool AtSpiAdaptor::valueInterface(const QAIPointer &interface, const QString &function, const QDBusMessage &message, const QDBusConnection &connection)
{ {
if (0) { if (function == QLatin1String("SetCurrentValue")) {
} else if (function == QLatin1String("SetCurrentValue")) {
QDBusVariant v = message.arguments().at(2).value<QDBusVariant>(); QDBusVariant v = message.arguments().at(2).value<QDBusVariant>();
double value = v.variant().toDouble(); double value = v.variant().toDouble();
//Temporary fix //Temporary fix
//See https://bugzilla.gnome.org/show_bug.cgi?id=652596 //See https://bugzilla.gnome.org/show_bug.cgi?id=652596
interface->valueInterface()->setCurrentValue(value); interface->valueInterface()->setCurrentValue(value);
connection.send(message.createReply()); // FIXME is the reply needed? 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.");
}
connection.send(message.createReply(
QVariant::fromValue(QDBusVariant(QVariant::fromValue(val)))));
} else { } else {
qAtspiDebug() << "WARNING: AtSpiAdaptor::valueInterface does not implement " << function << message.path(); QVariant value;
return false; 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(value.toDouble())))));
} }
return true; return true;
} }

View File

@ -122,6 +122,11 @@ QVariant QAccessibleAbstractSpinBox::minimumValue() const
return abstractSpinBox()->property("minimum"); return abstractSpinBox()->property("minimum");
} }
QVariant QAccessibleAbstractSpinBox::minimumStepSize() const
{
return abstractSpinBox()->property("stepSize");
}
/*! /*!
\class QAccessibleSpinBox \class QAccessibleSpinBox
\brief The QAccessibleSpinBox class implements the QAccessibleInterface for spinbox widgets. \brief The QAccessibleSpinBox class implements the QAccessibleInterface for spinbox widgets.
@ -278,6 +283,11 @@ QVariant QAccessibleAbstractSlider::minimumValue() const
return abstractSlider()->minimum(); return abstractSlider()->minimum();
} }
QVariant QAccessibleAbstractSlider::minimumStepSize() const
{
return abstractSlider()->singleStep();
}
QAbstractSlider *QAccessibleAbstractSlider::abstractSlider() const QAbstractSlider *QAccessibleAbstractSlider::abstractSlider() const
{ {
return static_cast<QAbstractSlider *>(object()); return static_cast<QAbstractSlider *>(object());

View File

@ -71,6 +71,7 @@ public:
void setCurrentValue(const QVariant &value); void setCurrentValue(const QVariant &value);
QVariant maximumValue() const; QVariant maximumValue() const;
QVariant minimumValue() const; QVariant minimumValue() const;
QVariant minimumStepSize() const;
// FIXME Action interface // FIXME Action interface
@ -110,6 +111,7 @@ public:
void setCurrentValue(const QVariant &value); void setCurrentValue(const QVariant &value);
QVariant maximumValue() const; QVariant maximumValue() const;
QVariant minimumValue() const; QVariant minimumValue() const;
QVariant minimumStepSize() const;
protected: protected:
QAbstractSlider *abstractSlider() const; QAbstractSlider *abstractSlider() const;

View File

@ -832,6 +832,14 @@ QVariant QAccessibleProgressBar::minimumValue() const
return progressBar()->minimum(); 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 QProgressBar *QAccessibleProgressBar::progressBar() const
{ {
return qobject_cast<QProgressBar *>(object()); return qobject_cast<QProgressBar *>(object());

View File

@ -188,6 +188,7 @@ public:
QVariant currentValue() const; QVariant currentValue() const;
QVariant maximumValue() const; QVariant maximumValue() const;
QVariant minimumValue() const; QVariant minimumValue() const;
QVariant minimumStepSize() const;
inline void setCurrentValue(const QVariant &) {} inline void setCurrentValue(const QVariant &) {}
protected: protected:

View File

@ -453,6 +453,7 @@ void tst_QAccessibility::sliderTest()
QVERIFY(valueIface != 0); QVERIFY(valueIface != 0);
QCOMPARE(valueIface->minimumValue().toInt(), slider->minimum()); QCOMPARE(valueIface->minimumValue().toInt(), slider->minimum());
QCOMPARE(valueIface->maximumValue().toInt(), slider->maximum()); QCOMPARE(valueIface->maximumValue().toInt(), slider->maximum());
QCOMPARE(valueIface->minimumStepSize().toInt(), slider->singleStep());
slider->setValue(50); slider->setValue(50);
QCOMPARE(valueIface->currentValue().toInt(), slider->value()); QCOMPARE(valueIface->currentValue().toInt(), slider->value());
slider->setValue(0); slider->setValue(0);
@ -461,6 +462,8 @@ void tst_QAccessibility::sliderTest()
QCOMPARE(valueIface->currentValue().toInt(), slider->value()); QCOMPARE(valueIface->currentValue().toInt(), slider->value());
valueIface->setCurrentValue(77); valueIface->setCurrentValue(77);
QCOMPARE(77, slider->value()); QCOMPARE(77, slider->value());
slider->setSingleStep(2);
QCOMPARE(valueIface->minimumStepSize().toInt(), 2);
delete slider; delete slider;
} }