From 1b4897f0710921fb0a55932a7fb6f17a45989c41 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Wed, 4 Jan 2012 14:37:27 +0100 Subject: Accessibility: Checked state for check boxes and radio buttons. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also adapt to new api in qtbase - state is now a bit field. Change-Id: Ia4266f3d5094a6c32e0ace3499910b57c3e71c25 Reviewed-by: Jan-Arve Sæther --- .../qtquick1/qaccessibledeclarativeitem.cpp | 9 +++---- .../qtquick1/qaccessibledeclarativeitem.h | 2 +- .../accessible/quick/qaccessiblequickitem.cpp | 29 +++++++++++++++++----- .../accessible/quick/qaccessiblequickitem.h | 2 +- .../accessible/quick/qaccessiblequickview.cpp | 2 +- .../accessible/shared/qdeclarativeaccessible.cpp | 18 +++++++------- .../accessible/shared/qdeclarativeaccessible.h | 2 +- src/quick/items/qquickaccessibleattached.cpp | 29 ++++++++++++++++++++++ 8 files changed, 68 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp index 6e4f27adb2..8786949fae 100644 --- a/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp +++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp @@ -171,13 +171,10 @@ int QAccessibleDeclarativeItem::indexOfChild(const QAccessibleInterface *iface) return index; } -QFlags QAccessibleDeclarativeItem::state() const +QAccessible::State QAccessibleDeclarativeItem::state() const { - QAccessible::State state = QAccessible::Normal; - - if (m_item->hasFocus()) { - state |= QAccessible::Focused; - } + QAccessible::State state; + state.focused = m_item->hasFocus(); return state; } diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h index 29ff3d2bff..6f841a7c23 100644 --- a/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h +++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h @@ -65,7 +65,7 @@ public: int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const; int indexOfChild(const QAccessibleInterface *iface) const; - QFlags state() const; + QAccessible::State state() const; QAccessible::Role role() const; QString text(QAccessible::Text) const; diff --git a/src/plugins/accessible/quick/qaccessiblequickitem.cpp b/src/plugins/accessible/quick/qaccessiblequickitem.cpp index 7523f805e6..5cedfe62d6 100644 --- a/src/plugins/accessible/quick/qaccessiblequickitem.cpp +++ b/src/plugins/accessible/quick/qaccessiblequickitem.cpp @@ -174,17 +174,34 @@ QList QAccessibleQuickItem::childItems() const return item()->childItems(); } -QFlags QAccessibleQuickItem::state() const +QAccessible::State QAccessibleQuickItem::state() const { - QAccessible::State state = QAccessible::Normal; - - if (item()->hasActiveFocus()) { - state |= QAccessible::Focused; + QAccessible::State state; + + if (item()->hasActiveFocus()) + state.focused = true; + + QAccessible::Role r = role(); + switch (r) { + case QAccessible::Button: { + QVariant checkable = item()->property("checkable"); + if (!checkable.toBool()) + break; + // fall through + } + case QAccessible::CheckBox: + case QAccessible::RadioButton: { + // FIXME when states are extended: state.checkable = true; + state.checked = item()->property("checked").toBool(); + break; + } + default: + break; } + return state; } - QAccessible::Role QAccessibleQuickItem::role() const { // Workaround for setAccessibleRole() not working for diff --git a/src/plugins/accessible/quick/qaccessiblequickitem.h b/src/plugins/accessible/quick/qaccessiblequickitem.h index d412fcbeb7..5ef3a19247 100644 --- a/src/plugins/accessible/quick/qaccessiblequickitem.h +++ b/src/plugins/accessible/quick/qaccessiblequickitem.h @@ -67,7 +67,7 @@ public: int indexOfChild(const QAccessibleInterface *iface) const; QList childItems() const; - QFlags state() const; + QAccessible::State state() const; QAccessible::Role role() const; QString text(QAccessible::Text) const; diff --git a/src/plugins/accessible/quick/qaccessiblequickview.cpp b/src/plugins/accessible/quick/qaccessiblequickview.cpp index f4e8136c38..6a896efd29 100644 --- a/src/plugins/accessible/quick/qaccessiblequickview.cpp +++ b/src/plugins/accessible/quick/qaccessiblequickview.cpp @@ -82,7 +82,7 @@ QAccessible::Role QAccessibleQuickView::role() const QAccessible::State QAccessibleQuickView::state() const { - return QAccessible::Normal; // FIXME + return QAccessible::State(); // FIXME } QRect QAccessibleQuickView::rect() const diff --git a/src/plugins/accessible/shared/qdeclarativeaccessible.cpp b/src/plugins/accessible/shared/qdeclarativeaccessible.cpp index e3e05603a6..7db5f07cbe 100644 --- a/src/plugins/accessible/shared/qdeclarativeaccessible.cpp +++ b/src/plugins/accessible/shared/qdeclarativeaccessible.cpp @@ -82,7 +82,7 @@ QAccessibleInterface *QDeclarativeAccessible::childAt(int x, int y) const for (int i = childCount() - 1; i >= 0; --i) { QAccessibleInterface *childIface = child(i); - if (childIface && !(childIface->state() & QAccessible::Invisible)) { + if (childIface && !childIface->state().invisible) { if (childIface->rect().contains(x, y)) return childIface; } @@ -91,9 +91,9 @@ QAccessibleInterface *QDeclarativeAccessible::childAt(int x, int y) const return 0; } -QFlags QDeclarativeAccessible::state() const +QAccessible::State QDeclarativeAccessible::state() const { - QAccessible::State state;// = state(); + QAccessible::State state; //QRect viewRect(QPoint(0, 0), m_implementation->size()); //QRect itemRect(m_item->scenePos().toPoint(), m_item->boundingRect().size().toSize()); @@ -104,24 +104,24 @@ QFlags QDeclarativeAccessible::state() const // qDebug() << "viewRect" << viewRect << "itemRect" << itemRect; // error case: if (viewRect_.isNull() || itemRect.isNull()) { - state |= QAccessible::Invisible; + state.invisible = true; } if (!viewRect_.intersects(itemRect)) { - state |= QAccessible::Offscreen; - // state |= QAccessible::Invisible; // no set at this point to ease development + state.offscreen = true; + // state.invisible = true; // no set at this point to ease development } if (!object()->property("visible").toBool() || qFuzzyIsNull(object()->property("opacity").toDouble())) { - state |= QAccessible::Invisible; + state.invisible = true; } if ((role() == QAccessible::CheckBox || role() == QAccessible::RadioButton) && object()->property("checked").toBool()) { - state |= QAccessible::Checked; + state.checked = true; } if (role() == QAccessible::EditableText) - state |= QAccessible::Focusable; + state.focusable = true; //qDebug() << "state?" << m_item->property("state").toString() << m_item->property("status").toString() << m_item->property("visible").toString(); diff --git a/src/plugins/accessible/shared/qdeclarativeaccessible.h b/src/plugins/accessible/shared/qdeclarativeaccessible.h index 7908092b6a..9193e1a0fe 100644 --- a/src/plugins/accessible/shared/qdeclarativeaccessible.h +++ b/src/plugins/accessible/shared/qdeclarativeaccessible.h @@ -78,7 +78,7 @@ public: virtual QRect viewRect() const = 0; QFlags relationTo(const QAccessibleInterface*) const; QAccessibleInterface *childAt(int, int) const; - QFlags state() const; + QAccessible::State state() const; QVariant invokeMethod(QAccessible::Method, const QVariantList &); QStringList actionNames() const; diff --git a/src/quick/items/qquickaccessibleattached.cpp b/src/quick/items/qquickaccessibleattached.cpp index f7faf8f540..213920bb4d 100644 --- a/src/quick/items/qquickaccessibleattached.cpp +++ b/src/quick/items/qquickaccessibleattached.cpp @@ -102,6 +102,35 @@ QT_BEGIN_NAMESPACE Accessible.role: Accessible.Button } \endqml + + Some roles have special semantics. + In order to implement check boxes for example a "checked" property is expected. + + \table + \header + \o \bold {Role} + \o \bold {Expected property} + \o + + \row + \o CheckBox + \o checked + \o The check state of the check box. + \row + \o RadioButton + \o checked + \o The selected state of the radio button. + \row + \o Button + \o checkable + \o Whether the button is checkable. + \row + \o Button + \o checked + \o Whether the button is checked (only if checkable is true). + + \endtable + */ QQuickAccessibleAttached::QQuickAccessibleAttached(QObject *parent) -- cgit v1.2.3