From 1d18fd01645e3b9efcd1a2c5dd030a5fc0f5892a Mon Sep 17 00:00:00 2001 From: Jan-Arve Saether Date: Thu, 19 Jan 2012 14:20:54 +0100 Subject: Remove QAccessible::FocusChild, add focusChild() Also cleanup (reduce) all implementations of navigate() in order to make the final removal of navigate smoother. Change-Id: I2c216db8f5b2e40afcce8f859fc775053adc2fe3 Reviewed-by: Frederik Gladhorn --- src/gui/accessible/qaccessible.cpp | 18 ++++++++ src/gui/accessible/qaccessible.h | 4 +- src/gui/accessible/qaccessibleobject.cpp | 25 +++-------- src/gui/accessible/qaccessibleobject.h | 2 +- src/plugins/accessible/widgets/complexwidgets.cpp | 7 --- src/plugins/accessible/widgets/itemviews.cpp | 52 ---------------------- src/plugins/accessible/widgets/itemviews.h | 10 ----- src/plugins/accessible/widgets/qaccessiblemenu.cpp | 8 ---- src/plugins/accessible/widgets/qaccessiblemenu.h | 1 - .../accessible/widgets/qaccessiblewidgets.cpp | 28 ------------ .../accessible/widgets/qaccessiblewidgets.h | 1 - .../platforms/windows/qwindowsaccessibility.cpp | 33 +++++--------- src/widgets/accessible/qaccessiblewidget.cpp | 41 ++++++----------- src/widgets/accessible/qaccessiblewidget.h | 1 + 14 files changed, 52 insertions(+), 179 deletions(-) diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp index 8610ef726d..b45c7e8d84 100644 --- a/src/gui/accessible/qaccessible.cpp +++ b/src/gui/accessible/qaccessible.cpp @@ -909,6 +909,16 @@ QVector > QAccessibleInterfa return QVector >(); } +/*! + Returns the object that has the keyboard focus. + + The object returned can be any descendant, including itself. +*/ +QAccessibleInterface *QAccessibleInterface::focusChild() const +{ + return 0; +} + /*! \fn QAccessibleInterface *QAccessibleInterface::childAt(int x, int y) const @@ -991,6 +1001,14 @@ QVector > QAccessibleInterfa \sa relationTo(), childCount(), parent(), child() */ +int QAccessibleInterface::navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **target) const +{ + Q_UNUSED(entry); + Q_UNUSED(relation); + *target = 0; + return -1; +} + /*! \fn QString QAccessibleInterface::text(QAccessible::Text t) const diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h index 202791caca..214ec20f9c 100644 --- a/src/gui/accessible/qaccessible.h +++ b/src/gui/accessible/qaccessible.h @@ -307,7 +307,6 @@ public: enum RelationFlag { Unrelated = 0x00000000, - FocusChild = 0x00010000, Label = 0x00020000, Labelled = 0x00040000, Controller = 0x00080000, @@ -382,6 +381,7 @@ public: // relations virtual QAccessible::Relation relationTo(const QAccessibleInterface *other) const; virtual QVector > relations() const; + virtual QAccessibleInterface *focusChild() const; virtual QAccessibleInterface *childAt(int x, int y) const = 0; @@ -390,7 +390,7 @@ public: virtual QAccessibleInterface *child(int index) const = 0; virtual int childCount() const = 0; virtual int indexOfChild(const QAccessibleInterface *) const = 0; - virtual int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const = 0; + virtual int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const; // properties and state virtual QString text(QAccessible::Text t) const = 0; diff --git a/src/gui/accessible/qaccessibleobject.cpp b/src/gui/accessible/qaccessibleobject.cpp index b9e0ac388b..d277f39c43 100644 --- a/src/gui/accessible/qaccessibleobject.cpp +++ b/src/gui/accessible/qaccessibleobject.cpp @@ -237,28 +237,13 @@ QAccessibleInterface *QAccessibleApplication::child(int index) const return 0; } + /*! \reimp */ -int QAccessibleApplication::navigate(QAccessible::RelationFlag relation, int, - QAccessibleInterface **target) const +QAccessibleInterface *QAccessibleApplication::focusChild() const { - if (!target) - return -1; - - *target = 0; - QObject *targetObject = 0; - - switch (relation) { - case QAccessible::FocusChild: - if (QWindow *window = QGuiApplication::activeWindow()) { - *target = window->accessibleRoot(); - return 0; - } - break; - default: - break; - } - *target = QAccessible::queryAccessibleInterface(targetObject); - return *target ? 0 : -1; + if (QWindow *window = QGuiApplication::activeWindow()) + return window->accessibleRoot(); + return 0; } /*! \reimp */ diff --git a/src/gui/accessible/qaccessibleobject.h b/src/gui/accessible/qaccessibleobject.h index 2372e82f89..d035f17b1d 100644 --- a/src/gui/accessible/qaccessibleobject.h +++ b/src/gui/accessible/qaccessibleobject.h @@ -85,11 +85,11 @@ public: // relations int childCount() const; int indexOfChild(const QAccessibleInterface*) const; + QAccessibleInterface *focusChild() const; // navigation QAccessibleInterface *parent() const; QAccessibleInterface *child(int index) const; - int navigate(QAccessible::RelationFlag, int, QAccessibleInterface **) const; // properties and state QString text(QAccessible::Text t) const; diff --git a/src/plugins/accessible/widgets/complexwidgets.cpp b/src/plugins/accessible/widgets/complexwidgets.cpp index 50e0cd7b65..e4b10670ae 100644 --- a/src/plugins/accessible/widgets/complexwidgets.cpp +++ b/src/plugins/accessible/widgets/complexwidgets.cpp @@ -122,13 +122,6 @@ public: return QAccessible::queryAccessibleInterface(m_parent); } QAccessibleInterface *child(int) const { return 0; } - int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const - { - Q_UNUSED(relation); - Q_UNUSED(index); - Q_UNUSED(iface); - return -1; - } // action interface QStringList actionNames() const { diff --git a/src/plugins/accessible/widgets/itemviews.cpp b/src/plugins/accessible/widgets/itemviews.cpp index a85c79918f..a9f3a858d2 100644 --- a/src/plugins/accessible/widgets/itemviews.cpp +++ b/src/plugins/accessible/widgets/itemviews.cpp @@ -442,14 +442,6 @@ QAccessibleInterface *QAccessibleTable::child(int index) const return childFromLogical(index + 1); } -int QAccessibleTable::navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const -{ - Q_UNUSED(relation); - Q_UNUSED(index); - *iface = 0; - return -1; -} - void *QAccessibleTable::interface_cast(QAccessible::InterfaceType t) { if (t == QAccessible::TableInterface) @@ -780,41 +772,6 @@ QAccessibleInterface *QAccessibleTableCell::child(int) const return 0; } -int QAccessibleTableCell::navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const -{ - Q_UNUSED(index); - Q_UNUSED(relation); - -// switch (relation) { -// From table1 implementation: -// case Up: -// case Down: -// case Left: -// case Right: { -// // This is in the "not so nice" category. In order to find out which item -// // is geometrically around, we have to set the current index, navigate -// // and restore the index as well as the old selection -// view->setUpdatesEnabled(false); -// const QModelIndex oldIdx = view->currentIndex(); -// QList kids = children(); -// const QModelIndex currentIndex = index ? kids.at(index - 1) : QModelIndex(row); -// const QItemSelection oldSelection = view->selectionModel()->selection(); -// view->setCurrentIndex(currentIndex); -// const QModelIndex idx = view->moveCursor(toCursorAction(relation), Qt::NoModifier); -// view->setCurrentIndex(oldIdx); -// view->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect); -// view->setUpdatesEnabled(true); -// if (!idx.isValid()) -// return -1; - -// if (idx.parent() != row.parent() || idx.row() != row.row()) -// *iface = cell(idx); -// return index ? kids.indexOf(idx) + 1 : 0; } -// } - *iface = 0; - return -1; -} - QAccessibleTableHeaderCell::QAccessibleTableHeaderCell(QAbstractItemView *view_, int index_, Qt::Orientation orientation_) : view(view_), index(index_), orientation(orientation_) { @@ -905,15 +862,6 @@ QAccessibleInterface *QAccessibleTableHeaderCell::child(int) const return 0; } -int QAccessibleTableHeaderCell::navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const -{ - Q_UNUSED(relation); - Q_UNUSED(index); - Q_UNUSED(iface); - - return -1; -} - #endif // QT_NO_ITEMVIEWS QT_END_NAMESPACE diff --git a/src/plugins/accessible/widgets/itemviews.h b/src/plugins/accessible/widgets/itemviews.h index 35a9f83a9e..3d852a2377 100644 --- a/src/plugins/accessible/widgets/itemviews.h +++ b/src/plugins/accessible/widgets/itemviews.h @@ -77,7 +77,6 @@ public: QAccessibleInterface *parent() const; QAccessibleInterface *child(int index) const; - int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const; void *interface_cast(QAccessible::InterfaceType t); @@ -190,7 +189,6 @@ public: QAccessibleInterface *parent() const; QAccessibleInterface *child(int) const; - int navigate(QAccessible::RelationFlag relation, int m_index, QAccessibleInterface **iface) const; // cell interface virtual int columnExtent() const; @@ -236,7 +234,6 @@ public: QAccessibleInterface *parent() const; QAccessibleInterface *child(int index) const; - int navigate(QAccessible::RelationFlag relation, int index, QAccessibleInterface **iface) const; private: QAbstractItemView *view; @@ -276,13 +273,6 @@ public: QAccessibleInterface *child(int) const { return 0; } - int navigate(QAccessible::RelationFlag relation, int, QAccessibleInterface **iface) const - { - Q_UNUSED(relation); - Q_UNUSED(iface); - return -1; - } - private: QAbstractItemView *view; }; diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp index 49cf550b76..d3ca1629bd 100644 --- a/src/plugins/accessible/widgets/qaccessiblemenu.cpp +++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp @@ -204,14 +204,6 @@ QAccessibleInterface *QAccessibleMenuItem::child(int index) const return 0; } -int QAccessibleMenuItem::navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **target) const -{ - Q_UNUSED(relation); - Q_UNUSED(entry); - *target = 0; - return -1; -} - void *QAccessibleMenuItem::interface_cast(QAccessible::InterfaceType t) { if (t == QAccessible::ActionInterface) diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.h b/src/plugins/accessible/widgets/qaccessiblemenu.h index e926dc708a..af934e2de7 100644 --- a/src/plugins/accessible/widgets/qaccessiblemenu.h +++ b/src/plugins/accessible/widgets/qaccessiblemenu.h @@ -103,7 +103,6 @@ public: QAccessibleInterface *parent() const; QAccessibleInterface *child(int index) const; - int navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface ** target) const; QObject * object() const; QRect rect() const; QAccessible::Role role() const; diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp index 12a415a5b1..94101efa67 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp @@ -965,34 +965,6 @@ QAccessibleInterface *QAccessibleTitleBar::child(int index) const return 0; } -int QAccessibleTitleBar::navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **iface) const -{ - switch (relation) { - case QAccessible::FocusChild: - // ### - if (entry >= 1) { - QDockWidgetLayout *layout = dockWidgetLayout(); - int index = 1; - int role; - for (role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) { - QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role); - if (!w->isVisible()) - continue; - if (index == entry) - break; - ++index; - } - *iface = 0; - return role > QDockWidgetLayout::FloatButton ? -1 : index; - } - break; - default: - break; - } - *iface = 0; - return -1; -} - int QAccessibleTitleBar::indexOfChild(const QAccessibleInterface * /*child*/) const { return -1; diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h index c19f1f49fd..147ea91a41 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.h +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h @@ -248,7 +248,6 @@ public: QAccessibleInterface *parent() const; QAccessibleInterface *child(int index) const; - int navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **iface) const; int indexOfChild(const QAccessibleInterface *child) const; int childCount() const; QAccessibleInterface *childAt(int x, int y) const; diff --git a/src/plugins/platforms/windows/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/qwindowsaccessibility.cpp index 2678fd7f23..8d11745410 100644 --- a/src/plugins/platforms/windows/qwindowsaccessibility.cpp +++ b/src/plugins/platforms/windows/qwindowsaccessibility.cpp @@ -1189,29 +1189,18 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accFocus(VARIANT *pvarID) if (!accessible->isValid()) return E_FAIL; - QAccessibleInterface *acc = 0; - int control = accessible->navigate(QAccessible::FocusChild, 1, &acc); - if (control == -1) { - (*pvarID).vt = VT_EMPTY; - return S_FALSE; - } - if (!acc || control == 0) { - (*pvarID).vt = VT_I4; - (*pvarID).lVal = control ? control : CHILDID_SELF; - return S_OK; - } - - QWindowsAccessible* wacc = new QWindowsAccessible(acc); - IDispatch *iface = 0; - wacc->QueryInterface(IID_IDispatch, (void**)&iface); - if (iface) { - (*pvarID).vt = VT_DISPATCH; - (*pvarID).pdispVal = iface; - return S_OK; - } else { - delete wacc; + if (QAccessibleInterface *acc = accessible->focusChild()) { + QWindowsAccessible* wacc = new QWindowsAccessible(acc); + IDispatch *iface = 0; + wacc->QueryInterface(IID_IDispatch, (void**)&iface); + if (iface) { + (*pvarID).vt = VT_DISPATCH; + (*pvarID).pdispVal = iface; + return S_OK; + } else { + delete wacc; + } } - (*pvarID).vt = VT_EMPTY; return S_FALSE; } diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp index a4a86e5d31..be579fecf8 100644 --- a/src/widgets/accessible/qaccessiblewidget.cpp +++ b/src/widgets/accessible/qaccessiblewidget.cpp @@ -339,10 +339,6 @@ QAccessible::Relation QAccessibleWidget::relationTo(const QAccessibleInterface * if (!o) return relation; - QWidget *focus = widget()->focusWidget(); - if (object() == focus && isAncestor(o, focus)) - relation |= QAccessible::FocusChild; - QACConnectionObject *connectionObject = (QACConnectionObject*)object(); for (int sig = 0; sig < d->primarySignals.count(); ++sig) { if (connectionObject->isSender(o, d->primarySignals.at(sig).toAscii())) { @@ -382,6 +378,20 @@ QAccessibleInterface *QAccessibleWidget::child(int index) const return 0; } +/*! \reimp */ +QAccessibleInterface *QAccessibleWidget::focusChild() const +{ + if (widget()->hasFocus()) + return QAccessible::queryAccessibleInterface(object()); + + QWidget *fw = widget()->focusWidget(); + if (!fw) + return 0; + + if (isAncestor(widget(), fw) || fw == widget()) + return QAccessible::queryAccessibleInterface(fw); +} + /*! \reimp */ int QAccessibleWidget::navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **target) const @@ -394,29 +404,6 @@ int QAccessibleWidget::navigate(QAccessible::RelationFlag relation, int entry, switch (relation) { // Logical - case QAccessible::FocusChild: - { - if (widget()->hasFocus()) { - targetObject = object(); - break; - } - - QWidget *fw = widget()->focusWidget(); - if (!fw) - return -1; - - if (isAncestor(widget(), fw) || fw == widget()) - targetObject = fw; - /* ### - QWidget *parent = fw; - while (parent && !targetObject) { - parent = parent->parentWidget(); - if (parent == widget()) - targetObject = fw; - } - */ - } - break; case QAccessible::Label: if (entry > 0) { QAccessibleInterface *pIface = QAccessible::queryAccessibleInterface(parentObject()); diff --git a/src/widgets/accessible/qaccessiblewidget.h b/src/widgets/accessible/qaccessiblewidget.h index f96d298f90..d34d852e27 100644 --- a/src/widgets/accessible/qaccessiblewidget.h +++ b/src/widgets/accessible/qaccessiblewidget.h @@ -62,6 +62,7 @@ public: int childCount() const; int indexOfChild(const QAccessibleInterface *child) const; QAccessible::Relation relationTo(const QAccessibleInterface *other) const; + QAccessibleInterface *focusChild() const; QRect rect() const; -- cgit v1.2.3