summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@nokia.com>2011-11-22 18:08:05 +0100
committerQt by Nokia <qt-info@nokia.com>2011-12-19 12:27:45 +0100
commit74c9f9d83f9f5cb934d0b62b468c74df5a3b9a0d (patch)
treeea5e783b8d025ce2d525dab5c524aaee298dd6b9 /src/plugins
parent7e12d2d30f74b5fe1f80fac7192416cf6eb22d4d (diff)
Accessibility: childAt returns interface
childAt used to return an integer. Return an interface instead. Not requiring a direct child to be returned allows optimizing by bypassing iterating through the hierarchy of accessibles. For QtQuick this is the only sensible way of implementing this. The bridges are still responsible for finding the top-most element. The default implementation in QAccessibleObject is sufficient to return direct children. The implementation in QAccessibleApplication is therfore no longer needed. Change-Id: Id7100dd5bcc3a98de516a7f4a12eaaa41cb46d26 Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/accessible/widgets/complexwidgets.cpp46
-rw-r--r--src/plugins/accessible/widgets/complexwidgets.h4
-rw-r--r--src/plugins/accessible/widgets/itemviews.cpp12
-rw-r--r--src/plugins/accessible/widgets/itemviews.h10
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.cpp11
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.h10
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.cpp48
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.h7
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm16
-rw-r--r--src/plugins/platforms/cocoa/qnsviewaccessibility.mm31
-rw-r--r--src/plugins/platforms/windows/qwindowsaccessibility.cpp24
11 files changed, 85 insertions, 134 deletions
diff --git a/src/plugins/accessible/widgets/complexwidgets.cpp b/src/plugins/accessible/widgets/complexwidgets.cpp
index 91f13676d3..5f62ab1506 100644
--- a/src/plugins/accessible/widgets/complexwidgets.cpp
+++ b/src/plugins/accessible/widgets/complexwidgets.cpp
@@ -1483,7 +1483,7 @@ public:
bool isValid() const { return true; }// (!m_parent.isNull()) && m_parent->count() > m_index; }
- int childAt(int, int) const { return 0; }
+ QAccessibleInterface *childAt(int, int) const { return 0; }
int childCount() const { return 0; }
int indexOfChild(const QAccessibleInterface *) const { return -1; }
@@ -1661,7 +1661,7 @@ QComboBox *QAccessibleComboBox::comboBox() const
return qobject_cast<QComboBox*>(object());
}
-QAccessibleInterface* QAccessibleComboBox::child(int index) const
+QAccessibleInterface *QAccessibleComboBox::child(int index) const
{
if (index == 0) {
QAbstractItemView *view = comboBox()->view();
@@ -1679,10 +1679,10 @@ int QAccessibleComboBox::childCount() const
return comboBox()->isEditable() ? 2 : 1;
}
-int QAccessibleComboBox::childAt(int x, int y) const
+QAccessibleInterface *QAccessibleComboBox::childAt(int x, int y) const
{
if (comboBox()->isEditable() && comboBox()->lineEdit()->rect().contains(x, y))
- return 1;
+ return child(1);
return 0;
}
@@ -1925,31 +1925,19 @@ int QAccessibleAbstractScrollArea::navigate(QAccessible::RelationFlag relation,
return *target ? 0: -1;
}
-//int QAccessibleAbstractScrollArea::childAt(int x, int y) const
-//{
-// if (!abstractScrollArea()->isVisible())
-// return -1;
-//#if 0
-// const QRect globalSelfGeometry = rect(Self);
-// if (!globalSelfGeometry.isValid() || !globalSelfGeometry.contains(QPoint(x, y)))
-// return -1;
-// const QWidgetList children = accessibleChildren();
-// for (int i = 0; i < children.count(); ++i) {
-// const QWidget *child = children.at(i);
-// const QRect globalChildGeometry = QRect(child->mapToGlobal(QPoint(0, 0)), child->size());
-// if (globalChildGeometry.contains(QPoint(x, y))) {
-// return ++i;
-// }
-// }
-// return 0;
-//#else
-// for (int i = childCount(); i >= 0; --i) {
-// if (rect().contains(x, y))
-// return i;
-// }
-// return -1;
-//#endif
-//}
+QAccessibleInterface *QAccessibleAbstractScrollArea::childAt(int x, int y) const
+{
+ if (!abstractScrollArea()->isVisible())
+ return 0;
+
+ for (int i = 0; i < childCount(); ++i) {
+ QPoint wpos = accessibleChildren().at(i)->mapToGlobal(QPoint(0, 0));
+ QRect rect = QRect(wpos, accessibleChildren().at(i)->size());
+ if (rect.contains(x, y))
+ return child(i);
+ }
+ return 0;
+}
QAbstractScrollArea *QAccessibleAbstractScrollArea::abstractScrollArea() const
{
diff --git a/src/plugins/accessible/widgets/complexwidgets.h b/src/plugins/accessible/widgets/complexwidgets.h
index 2e80e24e0f..1a69178a87 100644
--- a/src/plugins/accessible/widgets/complexwidgets.h
+++ b/src/plugins/accessible/widgets/complexwidgets.h
@@ -80,7 +80,7 @@ public:
int indexOfChild(const QAccessibleInterface *child) const;
bool isValid() const;
int navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **target) const;
-// int childAt(int x, int y) const;
+ QAccessibleInterface *childAt(int x, int y) const;
//protected:
QAbstractScrollArea *abstractScrollArea() const;
@@ -255,7 +255,7 @@ public:
explicit QAccessibleComboBox(QWidget *w);
int childCount() const;
- int childAt(int x, int y) const;
+ QAccessibleInterface *childAt(int x, int y) const;
int indexOfChild(const QAccessibleInterface *child) const;
QAccessibleInterface* child(int index) const;
diff --git a/src/plugins/accessible/widgets/itemviews.cpp b/src/plugins/accessible/widgets/itemviews.cpp
index 87956b139f..03f9afe275 100644
--- a/src/plugins/accessible/widgets/itemviews.cpp
+++ b/src/plugins/accessible/widgets/itemviews.cpp
@@ -366,7 +366,7 @@ QAccessible::State QAccessibleTable::state() const
return QAccessible::Normal;
}
-int QAccessibleTable::childAt(int x, int y) const
+QAccessibleInterface *QAccessibleTable::childAt(int x, int y) const
{
QPoint viewportOffset = view->viewport()->mapTo(view, QPoint(0,0));
QPoint indexPosition = view->mapFromGlobal(QPoint(x, y) - viewportOffset);
@@ -374,9 +374,9 @@ int QAccessibleTable::childAt(int x, int y) const
QModelIndex index = view->indexAt(indexPosition);
if (index.isValid()) {
- return logicalIndex(index);
+ return childFromLogical(logicalIndex(index));
}
- return -1;
+ return 0;
}
int QAccessibleTable::childCount() const
@@ -489,14 +489,14 @@ QModelIndex QAccessibleTree::indexFromLogical(int row, int column) const
return modelIndex;
}
-int QAccessibleTree::childAt(int x, int y) const
+QAccessibleInterface *QAccessibleTree::childAt(int x, int y) const
{
QPoint viewportOffset = view->viewport()->mapTo(view, QPoint(0,0));
QPoint indexPosition = view->mapFromGlobal(QPoint(x, y) - viewportOffset);
QModelIndex index = view->indexAt(indexPosition);
if (!index.isValid())
- return -1;
+ return 0;
const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
int row = treeView->d_func()->viewIndex(index) + (horizontalHeader() ? 1 : 0);
@@ -504,7 +504,7 @@ int QAccessibleTree::childAt(int x, int y) const
int i = row * view->model()->columnCount() + column + 1;
Q_ASSERT(i > view->model()->columnCount());
- return i;
+ return child(i - 1);
}
int QAccessibleTree::childCount() const
diff --git a/src/plugins/accessible/widgets/itemviews.h b/src/plugins/accessible/widgets/itemviews.h
index 9f95285d16..be309e61a7 100644
--- a/src/plugins/accessible/widgets/itemviews.h
+++ b/src/plugins/accessible/widgets/itemviews.h
@@ -71,7 +71,7 @@ public:
QString text(QAccessible::Text t) const;
QRect rect() const;
- int childAt(int x, int y) const;
+ QAccessibleInterface *childAt(int x, int y) const;
int childCount() const;
int indexOfChild(const QAccessibleInterface *) const;
@@ -153,7 +153,7 @@ public:
virtual ~QAccessibleTree() {}
- int childAt(int x, int y) const;
+ QAccessibleInterface *childAt(int x, int y) const;
int childCount() const;
int indexOfChild(const QAccessibleInterface *) const;
@@ -184,7 +184,7 @@ public:
QRect rect() const;
bool isValid() const;
- int childAt(int, int) const { return 0; }
+ QAccessibleInterface *childAt(int, int) const { return 0; }
int childCount() const { return 0; }
int indexOfChild(const QAccessibleInterface *) const { return -1; }
@@ -231,7 +231,7 @@ public:
QRect rect() const;
bool isValid() const;
- int childAt(int, int) const { return 0; }
+ QAccessibleInterface *childAt(int, int) const { return 0; }
int childCount() const { return 0; }
int indexOfChild(const QAccessibleInterface *) const { return -1; }
@@ -268,7 +268,7 @@ public:
QRect rect() const { return QRect(); }
bool isValid() const { return true; }
- int childAt(int, int) const { return 0; }
+ QAccessibleInterface *childAt(int, int) const { return 0; }
int childCount() const { return 0; }
int indexOfChild(const QAccessibleInterface *) const { return -1; }
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
index 2fe67fedfe..95c5c05097 100644
--- a/src/plugins/accessible/widgets/qaccessiblemenu.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
@@ -71,12 +71,12 @@ int QAccessibleMenu::childCount() const
return menu()->actions().count();
}
-int QAccessibleMenu::childAt(int x, int y) const
+QAccessibleInterface *QAccessibleMenu::childAt(int x, int y) const
{
QAction *act = menu()->actionAt(menu()->mapFromGlobal(QPoint(x,y)));
if(act && act->isSeparator())
act = 0;
- return menu()->actions().indexOf(act) + 1;
+ return act ? new QAccessibleMenuItem(menu(), act) : 0;
}
QString QAccessibleMenu::text(QAccessible::Text t) const
@@ -193,17 +193,16 @@ QAccessibleMenuItem::QAccessibleMenuItem(QWidget *owner, QAction *action)
QAccessibleMenuItem::~QAccessibleMenuItem()
{}
-int QAccessibleMenuItem::childAt(int x, int y ) const
+QAccessibleInterface *QAccessibleMenuItem::childAt(int x, int y ) const
{
for (int i = childCount(); i >= 0; --i) {
QAccessibleInterface *childInterface = child(i);
if (childInterface->rect().contains(x,y)) {
- delete childInterface;
- return i;
+ return childInterface;
}
delete childInterface;
}
- return -1;
+ return 0;
}
int QAccessibleMenuItem::childCount() const
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.h b/src/plugins/accessible/widgets/qaccessiblemenu.h
index cf6a703b0c..4ce161309b 100644
--- a/src/plugins/accessible/widgets/qaccessiblemenu.h
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.h
@@ -59,7 +59,7 @@ public:
explicit QAccessibleMenu(QWidget *w);
int childCount() const;
- int childAt(int x, int y) const;
+ QAccessibleInterface *childAt(int x, int y) const;
QString text(QAccessible::Text t) const;
QAccessible::Role role() const;
@@ -95,13 +95,13 @@ class QAccessibleMenuItem : public QAccessibleInterface, public QAccessibleActio
public:
explicit QAccessibleMenuItem(QWidget *owner, QAction *w);
- virtual ~QAccessibleMenuItem();
-
+ ~QAccessibleMenuItem();
void *interface_cast(QAccessible::InterfaceType t);
- int childAt(int x, int y) const;
+
int childCount() const;
- int indexOfChild(const QAccessibleInterface * child) const;
+ QAccessibleInterface *childAt(int x, int y) const;
bool isValid() const;
+ int indexOfChild(const QAccessibleInterface * child) const;
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
index 7387e2ea53..1e74de6ffd 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
@@ -722,17 +722,17 @@ QVariant QAccessibleStackedWidget::invokeMethod(QAccessible::Method, const QVari
}
-int QAccessibleStackedWidget::childAt(int x, int y) const
+QAccessibleInterface *QAccessibleStackedWidget::childAt(int x, int y) const
{
if (!stackedWidget()->isVisible())
- return -1;
+ return 0;
QWidget *currentWidget = stackedWidget()->currentWidget();
if (!currentWidget)
- return -1;
+ return 0;
QPoint position = currentWidget->mapFromGlobal(QPoint(x, y));
if (currentWidget->rect().contains(position))
- return 1;
- return -1;
+ return child(stackedWidget()->currentIndex());
+ return 0;
}
int QAccessibleStackedWidget::childCount() const
@@ -953,25 +953,6 @@ QRect QAccessibleMdiSubWindow::rect() const
return QRect(pos, mdiSubWindow()->size());
}
-int QAccessibleMdiSubWindow::childAt(int x, int y) const
-{
- if (!mdiSubWindow()->isVisible())
- return -1;
- if (!mdiSubWindow()->parent())
- return QAccessibleWidget::childAt(x, y);
- const QRect globalGeometry = rect();
- if (!globalGeometry.isValid())
- return -1;
- QAccessibleInterface *childIface = child(0);
- const QRect globalChildGeometry = childIface->rect();
- delete childIface;
- if (globalChildGeometry.isValid() && globalChildGeometry.contains(QPoint(x, y)))
- return 1;
- if (globalGeometry.contains(QPoint(x, y)))
- return 0;
- return -1;
-}
-
QMdiSubWindow *QAccessibleMdiSubWindow::mdiSubWindow() const
{
return static_cast<QMdiSubWindow *>(object());
@@ -1344,17 +1325,16 @@ QRect QAccessibleTitleBar::rect() const
return rect;
}
-int QAccessibleTitleBar::childAt(int x, int y) const
+QAccessibleInterface *QAccessibleTitleBar::childAt(int x, int y) const
{
- for (int i = childCount(); i >= 0; --i) {
- QAccessibleInterface *childIface = child(i - 1);
+ for (int i = 0; i < childCount(); ++i) {
+ QAccessibleInterface *childIface = child(i);
if (childIface->rect().contains(x,y)) {
- delete childIface;
- return i;
+ return childIface;
}
delete childIface;
}
- return -1;
+ return 0;
}
QObject *QAccessibleTitleBar::object() const
@@ -1463,21 +1443,21 @@ int QAccessibleMainWindow::indexOfChild(const QAccessibleInterface *iface) const
return childIndex == -1 ? -1 : ++childIndex;
}
-int QAccessibleMainWindow::childAt(int x, int y) const
+QAccessibleInterface *QAccessibleMainWindow::childAt(int x, int y) const
{
QWidget *w = widget();
if (!w->isVisible())
- return -1;
+ return 0;
QPoint gp = w->mapToGlobal(QPoint(0, 0));
if (!QRect(gp.x(), gp.y(), w->width(), w->height()).contains(x, y))
- return -1;
+ return 0;
QWidgetList kids = childWidgets(mainWindow(), true);
QPoint rp = mainWindow()->mapFromGlobal(QPoint(x, y));
for (int i = 0; i < kids.size(); ++i) {
QWidget *child = kids.at(i);
if (!child->isWindow() && !child->isHidden() && child->geometry().contains(rp)) {
- return i + 1;
+ return QAccessible::queryAccessibleInterface(child);
}
}
return 0;
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h
index e8c2e6ddf5..a544fd941c 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.h
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h
@@ -122,7 +122,7 @@ public:
explicit QAccessibleStackedWidget(QWidget *widget);
QVariant invokeMethod(QAccessible::Method method, const QVariantList &params);
- int childAt(int x, int y) const;
+ QAccessibleInterface *childAt(int x, int y) const;
int childCount() const;
int indexOfChild(const QAccessibleInterface *child) const;
QAccessibleInterface *child(int index) const;
@@ -173,7 +173,6 @@ public:
int indexOfChild(const QAccessibleInterface *child) const;
int navigate(QAccessible::RelationFlag relation, int entry, QAccessibleInterface **target) const;
QRect rect() const;
- int childAt(int x, int y) const;
protected:
QMdiSubWindow *mdiSubWindow() const;
@@ -261,12 +260,12 @@ public:
int indexOfChild(const QAccessibleInterface *child) const;
int childCount() const;
QAccessible::Relation relationTo(const QAccessibleInterface *other) const;
+ QAccessibleInterface *childAt(int x, int y) const;
void setText(QAccessible::Text t, const QString &text);
QString text(QAccessible::Text t) const;
QAccessible::Role role() const;
QRect rect () const;
QAccessible::State state() const;
- int childAt(int x, int y) const;
QObject *object() const;
bool isValid() const;
@@ -287,7 +286,7 @@ public:
QAccessibleInterface *child(int index) const;
int childCount() const;
int indexOfChild(const QAccessibleInterface *iface) const;
- int childAt(int x, int y) const;
+ QAccessibleInterface *childAt(int x, int y) const;
QMainWindow *mainWindow() const;
QVariant invokeMethod(QAccessible::Method method, const QVariantList &params);
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
index 332577d6e9..5ad9e57c31 100644
--- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
+++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
@@ -197,21 +197,19 @@ static QAccessibleInterface *acast(void *ptr)
}
- (id)accessibilityHitTest:(NSPoint)point {
- int index = acast(accessibleInterface)->childAt(point.x, qt_mac_flipYCoordinate(point.y));
- // hit outside
- if (index == -1) {
- return 0;
- }
+ if (!accessibleInterface)
+ return NSAccessibilityUnignoredAncestor(self);
+ QAccessibleInterface *childInterface = acast(accessibleInterface)->childAt(point.x, qt_mac_flipYCoordinate(point.y));
- // hit this element
- if (index == 0) {
+ // No child found, meaning we hit this element.
+ if (!childInterface) {
return NSAccessibilityUnignoredAncestor(self);
}
// hit a child, forward to child accessible interface.
- QAccessibleInterface *childInterface = acast(accessibleInterface)->child(index - 1);
- QCocoaAccessibleElement *accessibleElement = [QCocoaAccessibleElement elementWithIndex:index - 1 parent:self accessibleInterface: childInterface];
+ int childIndex = acast(accessibleInterface)->indexOfChild(childInterface);
+ QCocoaAccessibleElement *accessibleElement = [QCocoaAccessibleElement elementWithIndex:childIndex -1 parent:self accessibleInterface: childInterface];
return [accessibleElement accessibilityHitTest:point];
}
diff --git a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
index 327bace123..562ad4264a 100644
--- a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
+++ b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
@@ -83,34 +83,19 @@
}
- (id)accessibilityHitTest:(NSPoint)point {
+ if (!m_accessibleRoot)
+ return [super accessibilityHitTest:point];
NSPoint windowPoint = [[self window] convertScreenToBase:point];
- NSPoint localPoint = [self convertPoint:windowPoint fromView:nil];
-
- int index = -1;
- if (m_accessibleRoot) {
- index = m_accessibleRoot->childAt(point.x, qt_mac_flipYCoordinate(point.y));
-
- // qDebug() << "root rect" << m_accessibleRoot->rect();
- // qDebug() << "hit screen" << point.x << qt_mac_flipYCoordinate(point.y) << index;
- // if (index > 0) {
- // qDebug() << "child name" << m_accessibleRoot->child(index - 1)->text(QAccessible::Name);
- // qDebug() << "child rect" << m_accessibleRoot->child(index - 1)->rect();
- // }
- }
- // hit outside
- if (index == -1) {
+ QAccessibleInterface *childInterface = m_accessibleRoot->childAt(point.x, qt_mac_flipYCoordinate(point.y));
+ // No child found, meaning we hit the NSView
+ if (!childInterface) {
return [super accessibilityHitTest:point];
}
- // hit the NSView / top-level window
- if (index == 0) {
- QCocoaAccessibleElement *accessibleElement = [QCocoaAccessibleElement elementWithIndex:index parent:self accessibleInterface:(void*)m_accessibleRoot];
- return [accessibleElement accessibilityHitTest:point];
- }
-
- // hit a child, forward to child accessible interface.
- QCocoaAccessibleElement *accessibleElement = [QCocoaAccessibleElement elementWithIndex:index - 1 parent:self accessibleInterface:(void*)m_accessibleRoot->child(index -1)];
+ // Hit a child, forward to child accessible interface.
+ int childIndex = m_accessibleRoot->indexOfChild(childInterface);
+ QCocoaAccessibleElement *accessibleElement = [QCocoaAccessibleElement elementWithIndex:childIndex -1 parent:self accessibleInterface: childInterface];
return [accessibleElement accessibilityHitTest:point];
}
diff --git a/src/plugins/platforms/windows/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/qwindowsaccessibility.cpp
index aa4507484d..53d7b33769 100644
--- a/src/plugins/platforms/windows/qwindowsaccessibility.cpp
+++ b/src/plugins/platforms/windows/qwindowsaccessibility.cpp
@@ -753,21 +753,23 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::accHitTest(long xLeft, long yTop,
if (!accessible->isValid())
return E_FAIL;
- int control = accessible->childAt(xLeft, yTop);
- if (control == -1) {
+ QAccessibleInterface *child = accessible->childAt(xLeft, yTop);
+ if (child == 0) {
+ // no child found, return this item if it contains the coordinates
+ if (accessible->rect().contains(xLeft, yTop)) {
+ IDispatch *iface = 0;
+ QueryInterface(IID_IDispatch, (void**)&iface);
+ if (iface) {
+ (*pvarID).vt = VT_DISPATCH;
+ (*pvarID).pdispVal = iface;
+ return S_OK;
+ }
+ }
(*pvarID).vt = VT_EMPTY;
return S_FALSE;
}
- QAccessibleInterface *acc = 0;
- if (control)
- accessible->navigate(QAccessible::Child, control, &acc);
- if (!acc) {
- (*pvarID).vt = VT_I4;
- (*pvarID).lVal = control;
- return S_OK;
- }
- QWindowsAccessible* wacc = new QWindowsAccessible(acc);
+ QWindowsAccessible* wacc = new QWindowsAccessible(child);
IDispatch *iface = 0;
wacc->QueryInterface(IID_IDispatch, (void**)&iface);
if (iface) {