summaryrefslogtreecommitdiffstats
path: root/src/widgets/accessible
diff options
context:
space:
mode:
authorJan-Arve Saether <jan-arve.saether@nokia.com>2012-02-09 11:20:34 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-10 15:21:46 +0100
commitff2886db6a3308c1f4ee0879af497a5d43c33133 (patch)
tree50bfc43dbcb2bb34898e7723519abde2181d0347 /src/widgets/accessible
parent482d96a0c5d523ace63f56bda6851926b4469dd0 (diff)
Move all usages of Relation enum values to QAccessible::relations()
Next step is to remove navigate(), but that has to be done in qtdeclarative first. Change-Id: I01ea1386c092446be04cc19d0f70adf53f094adc Reviewed-by: Frederik Gladhorn <frederik.gladhorn@nokia.com>
Diffstat (limited to 'src/widgets/accessible')
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp177
-rw-r--r--src/widgets/accessible/qaccessiblewidget.h3
2 files changed, 64 insertions, 116 deletions
diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp
index 56ba990382..feac42780d 100644
--- a/src/widgets/accessible/qaccessiblewidget.cpp
+++ b/src/widgets/accessible/qaccessiblewidget.cpp
@@ -327,37 +327,76 @@ static inline bool isAncestor(const QObject *obj, const QObject *child)
return false;
}
-
/*! \reimp */
-QAccessible::Relation QAccessibleWidget::relationTo(const QAccessibleInterface *other) const
+QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >
+QAccessibleWidget::relations(QAccessible::Relation match /*= QAccessible::AllRelations*/) const
{
- QAccessible::Relation relation = QAccessible::Unrelated;
- if (d->asking == this) // recursive call
- return relation;
-
- QObject *o = other ? other->object() : 0;
- if (!o)
- return relation;
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > rels;
+ if (match & QAccessible::Label) {
+ const QAccessible::Relation rel = QAccessible::Label;
+ if (QWidget *parent = widget()->parentWidget()) {
+#ifndef QT_NO_SHORTCUT
+ // first check for all siblings that are labels to us
+ // ideally we would go through all objects and check, but that
+ // will be too expensive
+ const QList<QWidget*> kids = childWidgets(parent);
+ for (int i = 0; i < kids.count(); ++i) {
+ if (QLabel *labelSibling = qobject_cast<QLabel*>(kids.at(i))) {
+ if (labelSibling->buddy() == widget()) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(labelSibling);
+ rels.append(qMakePair(iface, rel));
+ }
+ }
+ }
+#endif
+#ifndef QT_NO_GROUPBOX
+ QGroupBox *groupbox = qobject_cast<QGroupBox*>(parent);
+ if (groupbox && !groupbox->title().isEmpty()) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(groupbox);
+ rels.append(qMakePair(iface, rel));
+ }
+#endif
+ }
+ }
- QACConnectionObject *connectionObject = (QACConnectionObject*)object();
- for (int sig = 0; sig < d->primarySignals.count(); ++sig) {
- if (connectionObject->isSender(o, d->primarySignals.at(sig).toAscii())) {
- relation |= QAccessible::Controller;
- break;
+ if (match & QAccessible::Controller) {
+ const QAccessible::Relation rel = QAccessible::Controller;
+ QACConnectionObject *connectionObject = (QACConnectionObject*)object();
+ const QObjectList senderList = connectionObject->senderList();
+ for (int s = 0; s < senderList.count(); ++s) {
+ QObject *sender = senderList.at(s);
+ if (sender->isWidgetType() && sender != object()) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(sender);
+ QACConnectionObject *connectionSender = (QACConnectionObject*)sender;
+ QStringList senderPrimarySignals = static_cast<QAccessibleWidget*>(iface)->d->primarySignals;
+ for (int sig = 0; sig < senderPrimarySignals.count(); ++sig) {
+ const QByteArray strSignal = senderPrimarySignals.at(sig).toAscii();
+ if (connectionSender->isSender(object(), strSignal.constData()))
+ rels.append(qMakePair(iface, rel));
+ }
+ }
}
}
- // test for passive relationships.
- // d->asking protects from endless recursion.
- d->asking = this;
- int inverse = other->relationTo(this);
- d->asking = 0;
- if (inverse & QAccessible::Controller)
- relation |= QAccessible::Controlled;
- if (inverse & QAccessible::Label)
- relation |= QAccessible::Labelled;
+ if (match & QAccessible::Controlled) {
+ QObjectList allReceivers;
+ QACConnectionObject *connectionObject = (QACConnectionObject*)object();
+ for (int sig = 0; sig < d->primarySignals.count(); ++sig) {
+ const QObjectList receivers = connectionObject->receiverList(d->primarySignals.at(sig).toAscii());
+ allReceivers += receivers;
+ }
+
+ allReceivers.removeAll(object()); //### The object might connect to itself internally
- return relation;
+ for (int i = 0; i < allReceivers.count(); ++i) {
+ const QAccessible::Relation rel = QAccessible::Controlled;
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(allReceivers.at(i));
+ if (iface)
+ rels.append(qMakePair(iface, rel));
+ }
+ }
+
+ return rels;
}
/*! \reimp */
@@ -394,96 +433,6 @@ QAccessibleInterface *QAccessibleWidget::focusChild() const
}
/*! \reimp */
-int QAccessibleWidget::navigate(QAccessible::RelationFlag relation, int entry,
- QAccessibleInterface **target) const
-{
- if (!target)
- return -1;
-
- *target = 0;
- QObject *targetObject = 0;
-
- switch (relation) {
- // Logical
- case QAccessible::Label:
- if (entry > 0) {
- QAccessibleInterface *pIface = QAccessible::queryAccessibleInterface(parentObject());
- if (!pIface)
- return -1;
-
- // first check for all siblings that are labels to us
- // ideally we would go through all objects and check, but that
- // will be too expensive
- int sibCount = pIface->childCount();
- QAccessibleInterface *candidate = 0;
- for (int i = 0; i < sibCount && entry; ++i) {
- candidate = pIface->child(i);
- Q_ASSERT(candidate);
- if (candidate->relationTo(this) & QAccessible::Label)
- --entry;
- if (!entry)
- break;
-
- delete candidate;
- candidate = 0;
- }
- if (!candidate) {
- if (pIface->relationTo(this) & QAccessible::Label)
- --entry;
- if (!entry)
- candidate = pIface;
- }
- if (pIface != candidate)
- delete pIface;
-
- *target = candidate;
- if (*target)
- return 0;
- }
- break;
- case QAccessible::Labelled: // only implemented in subclasses
- break;
- case QAccessible::Controller:
- if (entry > 0) {
- // check all senders we are connected to,
- // and figure out which one are controllers to us
- QACConnectionObject *connectionObject = (QACConnectionObject*)object();
- QObjectList allSenders = connectionObject->senderList();
- QObjectList senders;
- for (int s = 0; s < allSenders.size(); ++s) {
- QObject *sender = allSenders.at(s);
- QAccessibleInterface *candidate = QAccessible::queryAccessibleInterface(sender);
- if (!candidate)
- continue;
- if (candidate->relationTo(this) & QAccessible::Controller)
- senders << sender;
- delete candidate;
- }
- if (entry <= senders.size())
- targetObject = senders.at(entry-1);
- }
- break;
- case QAccessible::Controlled:
- if (entry > 0) {
- QObjectList allReceivers;
- QACConnectionObject *connectionObject = (QACConnectionObject*)object();
- for (int sig = 0; sig < d->primarySignals.count(); ++sig) {
- QObjectList receivers = connectionObject->receiverList(d->primarySignals.at(sig).toAscii());
- allReceivers += receivers;
- }
- if (entry <= allReceivers.size())
- targetObject = allReceivers.at(entry-1);
- }
- break;
- default:
- break;
- }
-
- *target = QAccessible::queryAccessibleInterface(targetObject);
- return *target ? 0 : -1;
-}
-
-/*! \reimp */
int QAccessibleWidget::childCount() const
{
QWidgetList cl = childWidgets(widget());
diff --git a/src/widgets/accessible/qaccessiblewidget.h b/src/widgets/accessible/qaccessiblewidget.h
index d34d852e27..4b480ca0ee 100644
--- a/src/widgets/accessible/qaccessiblewidget.h
+++ b/src/widgets/accessible/qaccessiblewidget.h
@@ -61,14 +61,13 @@ public:
QWindow *window() const;
int childCount() const;
int indexOfChild(const QAccessibleInterface *child) const;
- QAccessible::Relation relationTo(const QAccessibleInterface *other) const;
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > relations(QAccessible::Relation match = QAccessible::AllRelations) const;
QAccessibleInterface *focusChild() const;
QRect rect() const;
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
- int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
QString text(QAccessible::Text t) const;
QAccessible::Role role() const;