From f195a8e2b69eba0e3c44f2dece222b0da9e06026 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Mon, 13 Feb 2012 14:05:51 +0100 Subject: Added QAccessibleGroupBox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a new accessible interface for QGroupBox, as QAccessibleDisplay is not good enough when the QGroupBox is checkable. AccessibleFactory was modified to return a QAccessibleGroupBox when the accessible interface of a QGroupBox is requested. Created tst_QAccessibility::groupBoxTest Port to Qt5 of the patch by José Millán Soto Change-Id: I6c23dcf5562b3ea269b04102e78463b65827188a Reviewed-by: Jan-Arve Sæther (cherry picked from commit c03ceb203c65d9e3485fad848bfc0c4b6ee3e9aa) --- src/plugins/accessible/widgets/main.cpp | 4 +- src/plugins/accessible/widgets/simplewidgets.cpp | 94 ++++++++++++++++++++---- src/plugins/accessible/widgets/simplewidgets.h | 23 ++++++ 3 files changed, 107 insertions(+), 14 deletions(-) (limited to 'src/plugins/accessible/widgets') diff --git a/src/plugins/accessible/widgets/main.cpp b/src/plugins/accessible/widgets/main.cpp index ca8bf816b6..4709069d39 100644 --- a/src/plugins/accessible/widgets/main.cpp +++ b/src/plugins/accessible/widgets/main.cpp @@ -236,8 +236,10 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec #endif } else if (classname == QLatin1String("QLabel") || classname == QLatin1String("QLCDNumber")) { iface = new QAccessibleDisplay(widget); +#ifndef QT_NO_GROUPBOX } else if (classname == QLatin1String("QGroupBox")) { - iface = new QAccessibleDisplay(widget, QAccessible::Grouping); + iface = new QAccessibleGroupBox(widget); +#endif } else if (classname == QLatin1String("QStatusBar")) { iface = new QAccessibleWidget(widget, QAccessible::StatusBar); #ifndef QT_NO_PROGRESSBAR diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp index 4e1fe34b8e..af0c211cca 100644 --- a/src/plugins/accessible/widgets/simplewidgets.cpp +++ b/src/plugins/accessible/widgets/simplewidgets.cpp @@ -399,10 +399,6 @@ QString QAccessibleDisplay::text(QAccessible::Text t) const if (str.isEmpty()) { if (qobject_cast(object())) { str = qobject_cast(object())->text(); -#ifndef QT_NO_GROUPBOX - } else if (qobject_cast(object())) { - str = qobject_cast(object())->title(); -#endif #ifndef QT_NO_LCDNUMBER } else if (qobject_cast(object())) { QLCDNumber *l = qobject_cast(object()); @@ -439,15 +435,6 @@ QAccessibleDisplay::relations(QAccessible::Relation match /*= QAccessible::AllRe #ifndef QT_NO_SHORTCUT if (QLabel *label = qobject_cast(object())) { relatedObjects.append(label->buddy()); -#endif -#ifndef QT_NO_GROUPBOX - } else if (QGroupBox *groupbox = qobject_cast(object())) { - if (!groupbox->title().isEmpty()) { - const QList kids = childWidgets(widget()); - for (int i = 0; i < kids.count(); ++i) { - relatedObjects.append(kids.at(i)); - } - } #endif } for (int i = 0; i < relatedObjects.count(); ++i) { @@ -502,6 +489,87 @@ QRect QAccessibleDisplay::imagePosition() const return QRect(label->mapToGlobal(label->pos()), label->size()); } +#ifndef QT_NO_GROUPBOX +QAccessibleGroupBox::QAccessibleGroupBox(QWidget *w) +: QAccessibleWidget(w) +{ +} + +QGroupBox* QAccessibleGroupBox::groupBox() const +{ + return static_cast(widget()); +} + +QString QAccessibleGroupBox::text(QAccessible::Text t) const +{ + QString txt = QAccessibleWidget::text(t); + + if (txt.isEmpty()) { + switch (t) { + case QAccessible::Name: + txt = qt_accStripAmp(groupBox()->title()); + case QAccessible::Description: + txt = qt_accStripAmp(groupBox()->title()); + default: + break; + } + } + + return txt; +} + +QAccessible::State QAccessibleGroupBox::state() const +{ + QAccessible::State st = QAccessibleWidget::state(); + st.checkable = groupBox()->isCheckable(); + st.checked = groupBox()->isChecked(); + return st; +} + +QAccessible::Role QAccessibleGroupBox::role() const +{ + return groupBox()->isCheckable() ? QAccessible::CheckBox : QAccessible::Grouping; +} + +QVector > +QAccessibleGroupBox::relations(QAccessible::Relation match /*= QAccessible::AllRelations*/) const +{ + QVector > rels = QAccessibleWidget::relations(match); + + if ((match & QAccessible::Labelled) && (!groupBox()->title().isEmpty())) { + const QList kids = childWidgets(widget()); + for (int i = 0; i < kids.count(); ++i) { + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kids.at(i)); + if (iface) + rels.append(qMakePair(iface, QAccessible::Relation(QAccessible::Labelled))); + } + } + return rels; +} + +QStringList QAccessibleGroupBox::actionNames() const +{ + QStringList actions = QAccessibleWidget::actionNames(); + + if (groupBox()->isCheckable()) { + actions.prepend(QAccessibleActionInterface::checkAction()); + } + return actions; +} + +void QAccessibleGroupBox::doAction(const QString &actionName) +{ + if (actionName == QAccessibleActionInterface::checkAction()) + groupBox()->setChecked(!groupBox()->isChecked()); +} + +QStringList QAccessibleGroupBox::keyBindingsForAction(const QString &) const +{ + return QStringList(); +} + +#endif + #ifndef QT_NO_LINEEDIT /*! \class QAccessibleLineEdit diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h index e2847dd2db..74c1da405d 100644 --- a/src/plugins/accessible/widgets/simplewidgets.h +++ b/src/plugins/accessible/widgets/simplewidgets.h @@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE class QAbstractButton; class QLineEdit; class QToolButton; +class QGroupBox; class QProgressBar; class QAccessibleButton : public QAccessibleWidget @@ -113,6 +114,28 @@ public: QRect imagePosition() const; }; +#ifndef QT_NO_GROUPBOX +class QAccessibleGroupBox : public QAccessibleWidget +{ +public: + explicit QAccessibleGroupBox(QWidget *w); + + QAccessible::State state() const; + QAccessible::Role role() const; + QString text(QAccessible::Text t) const; + + QVector >relations(QAccessible::Relation match = QAccessible::AllRelations) const; + + //QAccessibleActionInterface + QStringList actionNames() const; + void doAction(const QString &actionName); + QStringList keyBindingsForAction(const QString &) const; + +private: + QGroupBox *groupBox() const; +}; +#endif + #ifndef QT_NO_LINEEDIT class QAccessibleLineEdit : public QAccessibleWidget, public QAccessibleTextInterface, public QAccessibleSimpleEditableTextInterface -- cgit v1.2.3