summaryrefslogtreecommitdiffstats
path: root/src/widgets/accessible
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/accessible')
-rw-r--r--src/widgets/accessible/qaccessible.cpp23
-rw-r--r--src/widgets/accessible/qaccessible.h16
-rw-r--r--src/widgets/accessible/qaccessibleobject.cpp14
-rw-r--r--src/widgets/accessible/qaccessibleobject.h2
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp210
-rw-r--r--src/widgets/accessible/qaccessiblewidget.h3
6 files changed, 143 insertions, 125 deletions
diff --git a/src/widgets/accessible/qaccessible.cpp b/src/widgets/accessible/qaccessible.cpp
index f8f63b1577..a61034a5bd 100644
--- a/src/widgets/accessible/qaccessible.cpp
+++ b/src/widgets/accessible/qaccessible.cpp
@@ -869,6 +869,27 @@ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > QAccessibleInterfa
*/
/*!
+ \fn QAccessibleInterface *parent() const
+
+ Returns the QAccessibleInterface of the parent in the accessible object hierarchy.
+
+ Returns 0 if no parent exists (e.g. for the top level application object).
+
+ \sa child()
+*/
+
+/*!
+ \fn QAccessibleInterface *child(int index) const
+
+ Returns the accessible child with index \a index.
+ 0-based index. The number of children of an object can be checked with childCount.
+
+ Returns 0 when asking for an invalid child (e.g. when the child became invalid in the meantime).
+
+ \sa childCount(), parent()
+*/
+
+/*!
\fn int QAccessibleInterface::navigate(RelationFlag relation, int entry, QAccessibleInterface
**target) const
@@ -909,7 +930,7 @@ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > QAccessibleInterfa
All objects support navigation.
- \sa relationTo(), childCount()
+ \sa relationTo(), childCount(), parent(), child()
*/
/*!
diff --git a/src/widgets/accessible/qaccessible.h b/src/widgets/accessible/qaccessible.h
index cbfbca61c5..e6a0f0dd19 100644
--- a/src/widgets/accessible/qaccessible.h
+++ b/src/widgets/accessible/qaccessible.h
@@ -382,19 +382,21 @@ public:
virtual int childAt(int x, int y) const = 0;
// navigation
+ virtual QAccessibleInterface *parent() const = 0;
+ virtual QAccessibleInterface *child(int index) const = 0;
virtual int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const = 0;
// properties and state
- virtual QString text(Text t, int child) const = 0;
+ virtual QString text(Text t, int child = 0) const = 0;
virtual void setText(Text t, int child, const QString &text) = 0;
- virtual QRect rect(int child) const = 0;
- virtual Role role(int child) const = 0;
- virtual State state(int child) const = 0;
+ virtual QRect rect(int child = 0) const = 0;
+ virtual Role role(int child = 0) const = 0;
+ virtual State state(int child = 0) const = 0;
// action
- virtual int userActionCount(int child) const = 0;
- virtual QString actionText(int action, Text t, int child) const = 0;
- virtual bool doAction(int action, int child, const QVariantList &params = QVariantList()) = 0;
+ virtual int userActionCount(int child = 0) const = 0;
+ virtual QString actionText(int action, Text t, int child = 0) const = 0;
+ virtual bool doAction(int action, int child = 0, const QVariantList &params = QVariantList()) = 0;
virtual QVariant invokeMethod(Method method, int child = 0,
const QVariantList &params = QVariantList());
diff --git a/src/widgets/accessible/qaccessibleobject.cpp b/src/widgets/accessible/qaccessibleobject.cpp
index 3f3534baf9..f1c5e1366e 100644
--- a/src/widgets/accessible/qaccessibleobject.cpp
+++ b/src/widgets/accessible/qaccessibleobject.cpp
@@ -284,6 +284,20 @@ QAccessible::Relation QAccessibleApplication::relationTo(int child, const
return Unrelated;
}
+QAccessibleInterface *QAccessibleApplication::parent() const
+{
+ return 0;
+}
+
+QAccessibleInterface *QAccessibleApplication::child(int index) const
+{
+ Q_ASSERT(index >= 0);
+ const QWidgetList tlw(topLevelWidgets());
+ if (index >= 0 && index < tlw.count())
+ return QAccessible::queryAccessibleInterface(tlw.at(index));
+ return 0;
+}
+
/*! \reimp */
int QAccessibleApplication::navigate(RelationFlag relation, int entry,
QAccessibleInterface **target) const
diff --git a/src/widgets/accessible/qaccessibleobject.h b/src/widgets/accessible/qaccessibleobject.h
index b26cfa743b..7d31b6e628 100644
--- a/src/widgets/accessible/qaccessibleobject.h
+++ b/src/widgets/accessible/qaccessibleobject.h
@@ -91,7 +91,9 @@ public:
Relation relationTo(int, const QAccessibleInterface *, int) const;
// navigation
+ QAccessibleInterface *parent() const;
int childAt(int x, int y) const;
+ QAccessibleInterface *child(int index) const;
int navigate(RelationFlag, int, QAccessibleInterface **) const;
// properties and state
diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp
index 7b8135f836..ec52c4bb71 100644
--- a/src/widgets/accessible/qaccessiblewidget.cpp
+++ b/src/widgets/accessible/qaccessiblewidget.cpp
@@ -447,6 +447,22 @@ QAccessible::Relation QAccessibleWidget::relationTo(int child,
return relation;
}
+QAccessibleInterface *QAccessibleWidget::parent() const
+{
+ QObject *parentWidget= widget()->parentWidget();
+ if (!parentWidget)
+ parentWidget = qApp;
+ return QAccessible::queryAccessibleInterface(parentWidget);
+}
+
+QAccessibleInterface *QAccessibleWidget::child(int index) const
+{
+ QWidgetList childList = childWidgets(widget());
+ if (index >= 0 && index < childList.size())
+ return QAccessible::queryAccessibleInterface(childList.at(index));
+ return 0;
+}
+
/*! \reimp */
int QAccessibleWidget::navigate(RelationFlag relation, int entry,
QAccessibleInterface **target) const
@@ -457,40 +473,19 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
*target = 0;
QObject *targetObject = 0;
- QWidgetList childList = childWidgets(widget());
- bool complexWidget = childList.size() < childCount();
-
switch (relation) {
// Hierarchical
case Self:
targetObject = object();
break;
case Child:
- if (complexWidget) {
- if (entry > 0 && entry <= childList.size()) {
- targetObject = childList.at(entry - 1);
- break;
- } else if (entry > childList.size() && entry <= childCount()) {
- return entry;
- }
- return -1;
- }else {
- if (entry > 0 && childList.size() >= entry)
- targetObject = childList.at(entry - 1);
- }
- break;
+ qWarning() << "QAccessibleWidget::navigate is deprecated for QAccessible::Child in:" << object()->metaObject()->className();
+ *target = child(entry - 1);
+ return *target ? 0 : -1;
case Ancestor:
- {
- if (entry <= 0)
- return -1;
- targetObject = widget()->parentWidget();
- int i;
- for (i = entry; i > 1 && targetObject; --i)
- targetObject = targetObject->parent();
- if (!targetObject && i == 1)
- targetObject = qApp;
- }
- break;
+ qWarning() << "QAccessibleWidget::navigate is deprecated for QAccessible::Ancestor in:" << object()->metaObject()->className();
+ *target = parent();
+ return *target ? 0 : -1;
case Sibling:
{
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(parentObject());
@@ -506,111 +501,92 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
// Geometrical
case QAccessible::Left:
- if (complexWidget && entry) {
- if (entry < 2 || widget()->height() > widget()->width() + 20) // looks vertical
- return -1;
- return entry - 1;
- }
// fall through
case QAccessible::Right:
- if (complexWidget && entry) {
- if (entry >= childCount() || widget()->height() > widget()->width() + 20) // looks vertical
- return -1;
- return entry + 1;
- }
// fall through
case QAccessible::Up:
- if (complexWidget && entry) {
- if (entry < 2 || widget()->width() > widget()->height() + 20) // looks horizontal
- return - 1;
- return entry - 1;
- }
// fall through
case QAccessible::Down:
- if (complexWidget && entry) {
- if (entry >= childCount() || widget()->width() > widget()->height() + 20) // looks horizontal
- return - 1;
- return entry + 1;
- } else {
- QAccessibleInterface *pIface = QAccessible::queryAccessibleInterface(parentObject());
- if (!pIface)
- return -1;
+ {
+ QAccessibleInterface *pIface = parent();
+ if (!pIface)
+ return -1;
- QRect startg = rect(0);
- QPoint startc = startg.center();
- QAccessibleInterface *candidate = 0;
- int mindist = 100000;
- int sibCount = pIface->childCount();
- for (int i = 0; i < sibCount; ++i) {
- QAccessibleInterface *sibling = 0;
- pIface->navigate(Child, i+1, &sibling);
- Q_ASSERT(sibling);
- if ((relationTo(0, sibling, 0) & Self) || (sibling->state(0) & QAccessible::Invisible)) {
- //ignore ourself and invisible siblings
+ QRect startg = rect(0);
+ QPoint startc = startg.center();
+ QAccessibleInterface *candidate = 0;
+ int mindist = 100000;
+ int sibCount = pIface->childCount();
+ for (int i = 0; i < sibCount; ++i) {
+ QAccessibleInterface *sibling = 0;
+ sibling = pIface->child(i);
+ Q_ASSERT(sibling);
+ if ((relationTo(0, sibling, 0) & Self) || (sibling->state(0) & QAccessible::Invisible)) {
+ //ignore ourself and invisible siblings
+ delete sibling;
+ continue;
+ }
+
+ QRect sibg = sibling->rect(0);
+ QPoint sibc = sibg.center();
+ QPoint sibp;
+ QPoint startp;
+ QPoint distp;
+ switch (relation) {
+ case QAccessible::Left:
+ startp = QPoint(startg.left(), startg.top() + startg.height() / 2);
+ sibp = QPoint(sibg.right(), sibg.top() + sibg.height() / 2);
+ if (QPoint(sibc - startc).x() >= 0) {
delete sibling;
continue;
}
-
- QRect sibg = sibling->rect(0);
- QPoint sibc = sibg.center();
- QPoint sibp;
- QPoint startp;
- QPoint distp;
- switch (relation) {
- case QAccessible::Left:
- startp = QPoint(startg.left(), startg.top() + startg.height() / 2);
- sibp = QPoint(sibg.right(), sibg.top() + sibg.height() / 2);
- if (QPoint(sibc - startc).x() >= 0) {
- delete sibling;
- continue;
- }
- distp = sibp - startp;
- break;
- case QAccessible::Right:
- startp = QPoint(startg.right(), startg.top() + startg.height() / 2);
- sibp = QPoint(sibg.left(), sibg.top() + sibg.height() / 2);
- if (QPoint(sibc - startc).x() <= 0) {
- delete sibling;
- continue;
- }
- distp = sibp - startp;
- break;
- case QAccessible::Up:
- startp = QPoint(startg.left() + startg.width() / 2, startg.top());
- sibp = QPoint(sibg.left() + sibg.width() / 2, sibg.bottom());
- if (QPoint(sibc - startc).y() >= 0) {
- delete sibling;
- continue;
- }
- distp = sibp - startp;
- break;
- case QAccessible::Down:
- startp = QPoint(startg.left() + startg.width() / 2, startg.bottom());
- sibp = QPoint(sibg.left() + sibg.width() / 2, sibg.top());
- if (QPoint(sibc - startc).y() <= 0) {
- delete sibling;
- continue;
- }
- distp = sibp - startp;
- break;
- default:
- break;
+ distp = sibp - startp;
+ break;
+ case QAccessible::Right:
+ startp = QPoint(startg.right(), startg.top() + startg.height() / 2);
+ sibp = QPoint(sibg.left(), sibg.top() + sibg.height() / 2);
+ if (QPoint(sibc - startc).x() <= 0) {
+ delete sibling;
+ continue;
}
-
- int dist = (int)qSqrt((qreal)distp.x() * distp.x() + distp.y() * distp.y());
- if (dist < mindist) {
- delete candidate;
- candidate = sibling;
- mindist = dist;
- } else {
+ distp = sibp - startp;
+ break;
+ case QAccessible::Up:
+ startp = QPoint(startg.left() + startg.width() / 2, startg.top());
+ sibp = QPoint(sibg.left() + sibg.width() / 2, sibg.bottom());
+ if (QPoint(sibc - startc).y() >= 0) {
delete sibling;
+ continue;
}
+ distp = sibp - startp;
+ break;
+ case QAccessible::Down:
+ startp = QPoint(startg.left() + startg.width() / 2, startg.bottom());
+ sibp = QPoint(sibg.left() + sibg.width() / 2, sibg.top());
+ if (QPoint(sibc - startc).y() <= 0) {
+ delete sibling;
+ continue;
+ }
+ distp = sibp - startp;
+ break;
+ default:
+ break;
+ }
+
+ int dist = (int)qSqrt((qreal)distp.x() * distp.x() + distp.y() * distp.y());
+ if (dist < mindist) {
+ delete candidate;
+ candidate = sibling;
+ mindist = dist;
+ } else {
+ delete sibling;
}
- delete pIface;
- *target = candidate;
- if (*target)
- return 0;
}
+ delete pIface;
+ *target = candidate;
+ if (*target)
+ return 0;
+ }
break;
case Covers:
if (entry > 0) {
diff --git a/src/widgets/accessible/qaccessiblewidget.h b/src/widgets/accessible/qaccessiblewidget.h
index 52b4566d13..acf900e84b 100644
--- a/src/widgets/accessible/qaccessiblewidget.h
+++ b/src/widgets/accessible/qaccessiblewidget.h
@@ -65,6 +65,9 @@ public:
int childAt(int x, int y) const;
QRect rect(int child) const;
+
+ QAccessibleInterface *parent() const;
+ QAccessibleInterface *child(int index) const;
int navigate(RelationFlag rel, int entry, QAccessibleInterface **target) const;
QString text(Text t, int child) const;