From 076d22efa63de107d36ec33d978e6365f70a1f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Fri, 19 Sep 2014 15:27:16 +0200 Subject: a11y: Make QAccessibleButton and friends resolve role dynamically The role may changed based on the checkable state of the button, eg, so we need to resolve the role at runtime instead of hard-coding it in the constructor. Change-Id: I78faee08189c5510ca9964b07ad94bcf5d4fa11b Reviewed-by: Frederik Gladhorn --- src/widgets/accessible/simplewidgets.cpp | 45 +++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 6 deletions(-) (limited to 'src/widgets/accessible/simplewidgets.cpp') diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp index d5933a6804..633a4d62cf 100644 --- a/src/widgets/accessible/simplewidgets.cpp +++ b/src/widgets/accessible/simplewidgets.cpp @@ -84,12 +84,14 @@ QString qt_accHotKey(const QString &text); /*! Creates a QAccessibleButton object for \a w. - \a role is propagated to the QAccessibleWidget constructor. */ -QAccessibleButton::QAccessibleButton(QWidget *w, QAccessible::Role role) -: QAccessibleWidget(w, role) +QAccessibleButton::QAccessibleButton(QWidget *w) +: QAccessibleWidget(w) { Q_ASSERT(button()); + + // FIXME: The checkable state of the button is dynamic, + // while we only update the controlling signal once :( if (button()->isCheckable()) addControllingSignal(QLatin1String("toggled(bool)")); else @@ -178,6 +180,23 @@ QRect QAccessibleButton::rect() const return QAccessibleWidget::rect(); } +QAccessible::Role QAccessibleButton::role() const +{ + QAbstractButton *ab = button(); + +#ifndef QT_NO_MENU + if (QPushButton *pb = qobject_cast(ab)) { + if (pb->menu()) + return QAccessible::ButtonMenu; + } +#endif + + if (ab->isCheckable()) + return ab->autoExclusive() ? QAccessible::RadioButton : QAccessible::CheckBox; + + return QAccessible::Button; +} + QStringList QAccessibleButton::actionNames() const { QStringList names; @@ -244,10 +263,9 @@ QStringList QAccessibleButton::keyBindingsForAction(const QString &actionName) c /*! Creates a QAccessibleToolButton object for \a w. - \a role is propagated to the QAccessibleWidget constructor. */ -QAccessibleToolButton::QAccessibleToolButton(QWidget *w, QAccessible::Role role) -: QAccessibleButton(w, role) +QAccessibleToolButton::QAccessibleToolButton(QWidget *w) +: QAccessibleButton(w) { Q_ASSERT(toolButton()); } @@ -287,6 +305,21 @@ int QAccessibleToolButton::childCount() const return isSplitButton() ? 1 : 0; } +QAccessible::Role QAccessibleToolButton::role() const +{ + QAbstractButton *ab = button(); + +#ifndef QT_NO_MENU + QToolButton *tb = qobject_cast(ab); + if (!tb->menu()) + return tb->isCheckable() ? QAccessible::CheckBox : QAccessible::PushButton; + else if (tb->popupMode() == QToolButton::DelayedPopup) + return QAccessible::ButtonDropDown; +#endif + + return QAccessible::ButtonMenu; +} + QAccessibleInterface *QAccessibleToolButton::child(int index) const { #ifndef QT_NO_MENU -- cgit v1.2.3