diff options
-rw-r--r-- | src/plugins/accessible/widgets/complexwidgets.cpp | 34 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/complexwidgets.h | 2 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/itemviews.cpp | 78 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/itemviews.h | 20 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/qaccessiblemenu.cpp | 454 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/qaccessiblemenu.h | 6 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/qaccessiblewidgets.cpp | 62 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/qaccessiblewidgets.h | 3 | ||||
-rw-r--r-- | src/plugins/accessible/widgets/simplewidgets.cpp | 64 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessible.cpp | 23 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessible.h | 16 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessibleobject.cpp | 14 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessibleobject.h | 2 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidget.cpp | 210 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidget.h | 3 | ||||
-rw-r--r-- | tests/auto/qaccessibility/tst_qaccessibility.cpp | 258 |
16 files changed, 616 insertions, 633 deletions
diff --git a/src/plugins/accessible/widgets/complexwidgets.cpp b/src/plugins/accessible/widgets/complexwidgets.cpp index c1f70ac581..020ad06815 100644 --- a/src/plugins/accessible/widgets/complexwidgets.cpp +++ b/src/plugins/accessible/widgets/complexwidgets.cpp @@ -481,6 +481,17 @@ QAbstractItemView::CursorAction QAccessibleItemRow::toCursorAction( return QAbstractItemView::MoveRight; } +QAccessibleInterface *QAccessibleItemRow::parent() const +{ + return new QAccessibleItemView(view->viewport()); +} + +QAccessibleInterface *QAccessibleItemRow::child(int index) const +{ + // FIXME? port to IA2 table2. + return 0; +} + int QAccessibleItemRow::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const { @@ -489,19 +500,9 @@ int QAccessibleItemRow::navigate(RelationFlag relation, int index, return -1; switch (relation) { - case Ancestor: { - if (!index) - return -1; - QAccessibleItemView *ancestor = new QAccessibleItemView(view->viewport()); - if (index == 1) { - *iface = ancestor; - return 0; - } else if (index > 1) { - int ret = ancestor->navigate(Ancestor, index - 1, iface); - delete ancestor; - return ret; - } - } + case Ancestor: + *iface = parent(); + return *iface ? 0 : -1; case Child: { if (!index) return -1; @@ -1487,10 +1488,14 @@ public: QString text(Text, int) const { return qt_accStripAmp(m_parent->tabText(m_index)); } void setText(Text, int, const QString &) {} + QAccessibleInterface *parent() const { + return QAccessible::queryAccessibleInterface(m_parent); + } + QAccessibleInterface *child(int) const { return 0; } int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const { if (relation == QAccessible::Ancestor && index == 1) { - *iface = QAccessible::queryAccessibleInterface(m_parent); + *iface = parent(); return 0; } return -1; @@ -1842,6 +1847,7 @@ int QAccessibleComboBox::childAt(int x, int y) const if (rect(i).contains(x, y)) return i; } + Q_ASSERT(0); return 0; } diff --git a/src/plugins/accessible/widgets/complexwidgets.h b/src/plugins/accessible/widgets/complexwidgets.h index 8a5543041f..d29f4b9021 100644 --- a/src/plugins/accessible/widgets/complexwidgets.h +++ b/src/plugins/accessible/widgets/complexwidgets.h @@ -139,6 +139,8 @@ public: Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const; int childAt(int x, int y) const; + QAccessibleInterface *parent() const; + QAccessibleInterface *child(int index) const; int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const; int userActionCount(int child) const; diff --git a/src/plugins/accessible/widgets/itemviews.cpp b/src/plugins/accessible/widgets/itemviews.cpp index 19ef7b59e8..90e810ab32 100644 --- a/src/plugins/accessible/widgets/itemviews.cpp +++ b/src/plugins/accessible/widgets/itemviews.cpp @@ -359,9 +359,7 @@ QAccessible2::TableModelChange QAccessibleTable2::modelChange() const QAccessible::Role QAccessibleTable2::role(int child) const { - Q_ASSERT(child >= 0); - if (child > 0) - return QAccessible::Cell; + Q_ASSERT(child == 0); return m_role; } @@ -386,6 +384,8 @@ int QAccessibleTable2::childAt(int x, int y) const int QAccessibleTable2::childCount() const { + if (!view->model()) + return 0; int vHeader = verticalHeader() ? 1 : 0; int hHeader = horizontalHeader() ? 1 : 0; return (view->model()->rowCount()+hHeader) * (view->model()->columnCount()+vHeader); @@ -430,21 +430,31 @@ QRect QAccessibleTable2::rect(int child) const return QRect(pos.x(), pos.y(), view->width(), view->height()); } +QAccessibleInterface *QAccessibleTable2::parent() const +{ + if (view->parent()) { + return QAccessible::queryAccessibleInterface(view->parent()); + } + return 0; +} + +QAccessibleInterface *QAccessibleTable2::child(int index) const +{ + // Fixme: get rid of the +1 madness + return childFromLogical(index + 1); +} + int QAccessibleTable2::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const { *iface = 0; switch (relation) { case Ancestor: { - if (index == 1 && view->parent()) { - *iface = QAccessible::queryAccessibleInterface(view->parent()); - if (*iface) - return 0; - } - break; + *iface = parent(); + return *iface ? 0 : -1; } case QAccessible::Child: { Q_ASSERT(index > 0); - *iface = childFromLogical(index); + *iface = child(index - 1); if (*iface) { return 0; } @@ -806,14 +816,23 @@ bool QAccessibleTable2Cell::isValid() const return m_index.isValid(); } +QAccessibleInterface *QAccessibleTable2Cell::parent() const +{ + if (m_role == QAccessible::TreeItem) + return new QAccessibleTree(view); + + return new QAccessibleTable2(view); +} + +QAccessibleInterface *QAccessibleTable2Cell::child(int) const +{ + return 0; +} + int QAccessibleTable2Cell::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const { if (relation == Ancestor && index == 1) { - if (m_role == QAccessible::TreeItem) { - *iface = new QAccessibleTree(view); - } else { - *iface = new QAccessibleTable2(view); - } + *iface = parent(); return 0; } @@ -978,19 +997,28 @@ bool QAccessibleTable2HeaderCell::isValid() const return true; } -int QAccessibleTable2HeaderCell::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const +QAccessibleInterface *QAccessibleTable2HeaderCell::parent() const { - if (relation == QAccessible::Ancestor && index == 1) { - if (false) { + if (false) { #ifndef QT_NO_TREEVIEW - } else if (qobject_cast<const QTreeView*>(view)) { - *iface = new QAccessibleTree(view); - return 0; + } else if (qobject_cast<const QTreeView*>(view)) { + return new QAccessibleTree(view); #endif - } else { - *iface = new QAccessibleTable2(view); - return 0; - } + } else { + return new QAccessibleTable2(view); + } +} + +QAccessibleInterface *QAccessibleTable2HeaderCell::child(int) const +{ + return 0; +} + +int QAccessibleTable2HeaderCell::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const +{ + if (relation == QAccessible::Ancestor && index == 1) { + *iface = parent(); + return *iface ? 0 : -1; } *iface = 0; return -1; diff --git a/src/plugins/accessible/widgets/itemviews.h b/src/plugins/accessible/widgets/itemviews.h index d98180b254..c2b255b424 100644 --- a/src/plugins/accessible/widgets/itemviews.h +++ b/src/plugins/accessible/widgets/itemviews.h @@ -76,6 +76,8 @@ public: int childCount() const; int indexOfChild(const QAccessibleInterface *) const; + QAccessibleInterface *parent() const; + QAccessibleInterface *child(int index) const; int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const; Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const; @@ -193,6 +195,8 @@ public: QString text(Text t, int child) const; void setText(Text t, int child, const QString &text); + QAccessibleInterface *parent() const; + QAccessibleInterface *child(int) const; int navigate(RelationFlag relation, int m_index, QAccessibleInterface **iface) const; Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const; @@ -246,6 +250,8 @@ public: QString text(Text t, int child) const; void setText(Text t, int child, const QString &text); + QAccessibleInterface *parent() const; + QAccessibleInterface *child(int index) const; int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const; Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const; @@ -287,11 +293,17 @@ public: QString text(Text, int) const { return QString(); } void setText(Text, int, const QString &) {} - int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const + QAccessibleInterface *parent() const { + return QAccessible::queryAccessibleInterface(view); + } + QAccessibleInterface *child(int) const { + return 0; + } + int navigate(RelationFlag relation, int, QAccessibleInterface **iface) const { - if (relation == QAccessible::Ancestor && index == 1) { - *iface = QAccessible::queryAccessibleInterface(view); - return 0; + if (relation == QAccessible::Ancestor) { + *iface = parent(); + return *iface ? 0 : -1; } return -1; } diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp index eaf4ecb971..46954c4fbf 100644 --- a/src/plugins/accessible/widgets/qaccessiblemenu.cpp +++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp @@ -73,13 +73,8 @@ int QAccessibleMenu::childCount() const QRect QAccessibleMenu::rect(int child) const { - if (!child || child > childCount()) - return QAccessibleWidget::rect(child); - - QRect r = menu()->actionGeometry(menu()->actions()[child - 1]); - QPoint tlp = menu()->mapToGlobal(QPoint(0,0)); - - return QRect(tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height()); + Q_ASSERT(child == 0); + return QAccessibleWidget::rect(child); } int QAccessibleMenu::childAt(int x, int y) const @@ -92,79 +87,38 @@ int QAccessibleMenu::childAt(int x, int y) const QString QAccessibleMenu::text(Text t, int child) const { + Q_ASSERT(child == 0); QString tx = QAccessibleWidget::text(t, child); if (tx.size()) return tx; - switch (t) { - case Name: - if (!child) - return menu()->windowTitle(); - return qt_accStripAmp(menu()->actions().at(child-1)->text()); - case Help: - return child ? menu()->actions().at(child-1)->whatsThis() : tx; -#ifndef QT_NO_SHORTCUT - case Accelerator: - return child ? static_cast<QString>(menu()->actions().at(child-1)->shortcut()) : tx; -#endif - default: - break; - } + if (t == Name) + return menu()->windowTitle(); return tx; } QAccessible::Role QAccessibleMenu::role(int child) const { - if (!child) - return PopupMenu; - - QAction *action = menu()->actions()[child-1]; - if (action && action->isSeparator()) - return Separator; - return MenuItem; + Q_ASSERT(child == 0); + return PopupMenu; } QAccessible::State QAccessibleMenu::state(int child) const { + Q_ASSERT(child == 0); State s = QAccessibleWidget::state(child); - if (!child) - return s; - - QAction *action = menu()->actions()[child-1]; - if (!action) - return s; - - if (menu()->style()->styleHint(QStyle::SH_Menu_MouseTracking)) - s |= HotTracked; - if (action->isSeparator() || !action->isEnabled()) - s |= Unavailable; - if (action->isChecked()) - s |= Checked; - if (menu()->activeAction() == action) - s |= Focused; - return s; } QString QAccessibleMenu::actionText(int action, QAccessible::Text text, int child) const { - if (action == QAccessible::DefaultAction && child && text == QAccessible::Name) { - QAction *a = menu()->actions().value(child-1, 0); - if (!a || a->isSeparator()) - return QString(); - if (a->menu()) { - if (a->menu()->isVisible()) - return QMenu::tr("Close"); - return QMenu::tr("Open"); - } - return QMenu::tr("Execute"); - } - + Q_ASSERT(child == 0); return QAccessibleWidget::actionText(action, text, child); } bool QAccessibleMenu::doAction(int act, int child, const QVariantList &) { +// Q_ASSERT(child == 0); if (!child || act != QAccessible::DefaultAction) return false; @@ -179,52 +133,35 @@ bool QAccessibleMenu::doAction(int act, int child, const QVariantList &) return true; } -int QAccessibleMenu::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const +QAccessibleInterface *QAccessibleMenu::child(int index) const { - int ret = -1; - if (entry < 0) { - *target = 0; - return ret; - } + if (index < childCount()) + return new QAccessibleMenuItem(menu(), menu()->actions().at(index)); + return 0; +} - if (relation == Self || entry == 0) { - *target = new QAccessibleMenu(menu()); - return 0; +QAccessibleInterface *QAccessibleMenu::parent() const +{ + QWidget *parent = menu()->parentWidget(); + if (qobject_cast<QMenu*>(parent) || qobject_cast<QMenuBar*>(parent)) { + return new QAccessibleMenuItem(parent, menu()->menuAction()); } + return QAccessibleWidget::parent(); +} +int QAccessibleMenu::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const +{ + Q_ASSERT(entry >= 0); switch (relation) { case Child: - if (entry <= childCount()) { - *target = new QAccessibleMenuItem(menu(), menu()->actions().at( entry - 1 )); - ret = 0; - } - break; - case Ancestor: { - QAccessibleInterface *iface; - QWidget *parent = menu()->parentWidget(); - if (qobject_cast<QMenu*>(parent) || qobject_cast<QMenuBar*>(parent)) { - iface = new QAccessibleMenuItem(parent, menu()->menuAction()); - if (entry == 1) { - *target = iface; - ret = 0; - } else { - ret = iface->navigate(Ancestor, entry - 1, target); - delete iface; - } - } else { - return QAccessibleWidget::navigate(relation, entry, target); - } - break;} + *target = child(entry - 1); + return *target ? 0 : -1; + case Ancestor: + *target = parent(); + return *target ? 0 : -1; default: return QAccessibleWidget::navigate(relation, entry, target); } - - - if (ret == -1) - *target = 0; - - return ret; - } int QAccessibleMenu::indexOfChild( const QAccessibleInterface *child ) const @@ -258,12 +195,8 @@ int QAccessibleMenuBar::childCount() const QRect QAccessibleMenuBar::rect(int child) const { - if (!child) - return QAccessibleWidget::rect(child); - - QRect r = menuBar()->actionGeometry(menuBar()->actions()[child - 1]); - QPoint tlp = menuBar()->mapToGlobal(QPoint(0,0)); - return QRect(tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height()); + Q_ASSERT(child == 0); + return QAccessibleWidget::rect(child); } int QAccessibleMenuBar::childAt(int x, int y) const @@ -275,38 +208,23 @@ int QAccessibleMenuBar::childAt(int x, int y) const return -1; } -int QAccessibleMenuBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const +QAccessibleInterface *QAccessibleMenuBar::child(int index) const { - int ret = -1; - if (entry < 0) { - *target = 0; - return ret; - } - - if (relation == Self || entry == 0) { - *target = new QAccessibleMenuBar(menuBar()); - return 0; - } + if (index < childCount()) + return new QAccessibleMenuItem(menuBar(), menuBar()->actions().at(index)); + return 0; +} - switch (relation) { - case Child: - if (entry <= childCount()) { - *target = new QAccessibleMenuItem(menuBar(), menuBar()->actions().at( entry - 1 )); - ret = 0; - } - break; - default: - return QAccessibleWidget::navigate(relation, entry, target); +int QAccessibleMenuBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const +{ + if (relation == Child) { + *target = child(entry - 1); + return *target ? 0 : -1; } - - - if (ret == -1) - *target = 0; - - return ret; + return QAccessibleWidget::navigate(relation, entry, target); } -int QAccessibleMenuBar::indexOfChild( const QAccessibleInterface *child ) const +int QAccessibleMenuBar::indexOfChild(const QAccessibleInterface *child) const { int index = -1; Role r = child->role(0); @@ -320,87 +238,43 @@ int QAccessibleMenuBar::indexOfChild( const QAccessibleInterface *child ) const QString QAccessibleMenuBar::text(Text t, int child) const { - QString str; - - if (child) { - if (QAction *action = menuBar()->actions().value(child - 1, 0)) { - switch (t) { - case Name: - return qt_accStripAmp(action->text()); - case Accelerator: - str = qt_accHotKey(action->text()); - break; - default: - break; - } - } - } - if (str.isEmpty()) - str = QAccessibleWidget::text(t, child); - return str; + Q_ASSERT(child == 0); + return QAccessibleWidget::text(t, child); } QAccessible::Role QAccessibleMenuBar::role(int child) const { - if (!child) - return MenuBar; - - QAction *action = menuBar()->actions()[child-1]; - if (action && action->isSeparator()) - return Separator; - return MenuItem; + Q_ASSERT(child == 0); + return MenuBar; } QAccessible::State QAccessibleMenuBar::state(int child) const { + Q_ASSERT(child == 0); State s = QAccessibleWidget::state(child); - if (!child) - return s; - - QAction *action = menuBar()->actions().value(child-1, 0); - if (!action) - return s; - - if (menuBar()->style()->styleHint(QStyle::SH_Menu_MouseTracking)) - s |= HotTracked; - if (action->isSeparator() || !action->isEnabled()) - s |= Unavailable; - if (menuBar()->activeAction() == action) - s |= Focused; - return s; } QString QAccessibleMenuBar::actionText(int action, QAccessible::Text text, int child) const { - if (action == QAccessible::DefaultAction && child && text == QAccessible::Name) { - QAction *a = menuBar()->actions().value(child-1, 0); - if (!a || a->isSeparator()) - return QString(); - if (a->menu()) { - if (a->menu()->isVisible()) - return QMenu::tr("Close"); - return QMenu::tr("Open"); - } - return QMenu::tr("Execute"); - } - + Q_ASSERT(child == 0); return QAccessibleWidget::actionText(action, text, child); } -bool QAccessibleMenuBar::doAction(int act, int child, const QVariantList &) +bool QAccessibleMenuBar::doAction(int, int child, const QVariantList &) { - if (act != !child) - return false; - +// Q_ASSERT(child == 0); QAction *action = menuBar()->actions().value(child-1, 0); if (!action || !action->isEnabled()) return false; if (action->menu() && action->menu()->isVisible()) action->menu()->hide(); - else + else { menuBar()->setActiveAction(action); + } return true; + + return false; } #endif // QT_NO_MENUBAR @@ -427,32 +301,69 @@ int QAccessibleMenuItem::childCount() const return m_action->menu() ? 1 : 0; } -QString QAccessibleMenuItem::actionText(int action, Text text, int child ) const +QString QAccessibleMenuItem::actionText(int action, Text text, int child) const { - if (text == Name && child == 0) { - switch (action) { - case Press: - case DefaultAction: - return QMenu::tr("Execute"); - break; - default: - break; + Q_ASSERT(child == 0); + if (!m_action || m_action->isSeparator()) + return QString(); + + if (text == Name && ((action == Press) || (action == DefaultAction))) { + if (m_action->menu()) { + return QMenu::tr("Open"); } + return QMenu::tr("Execute"); } return QString(); } + +//QAction *action = menuBar()->actions().value(child-1, 0); +//if (!action || !action->isEnabled()) +// return false; +//if (action->menu() && action->menu()->isVisible()) +// action->menu()->hide(); +//else +// menuBar()->setActiveAction(action); +//return true; + + + bool QAccessibleMenuItem::doAction(int action, int child, const QVariantList & /*params = QVariantList()*/ ) { - if ((action == Press || action == DefaultAction) && child == 0) { + Q_ASSERT(child == 0); + if ((action != Press) && (action != DefaultAction)) + return false; + if (!m_action->isEnabled()) + return false; + + if (QMenuBar *bar = qobject_cast<QMenuBar*>(owner())) { + if (m_action->menu() && m_action->menu()->isVisible()) { + m_action->menu()->hide(); + return true; + } else { + bar->setActiveAction(m_action); + return true; + } + return false; + } else if (QMenu *menu = qobject_cast<QMenu*>(owner())){ + if (m_action->menu() && m_action->menu()->isVisible()) { + m_action->menu()->hide(); + return true; + } else { + menu->setActiveAction(m_action); + return true; + } + } else { + // no menu m_action->trigger(); return true; } return false; } -int QAccessibleMenuItem::indexOfChild( const QAccessibleInterface * child ) const +int QAccessibleMenuItem::indexOfChild(const QAccessibleInterface * child) const { + Q_ASSERT(child == 0); if (child->role(0) == PopupMenu && child->object() == m_action->menu()) return 1; @@ -464,6 +375,18 @@ bool QAccessibleMenuItem::isValid() const return m_action ? true : false; } +QAccessibleInterface *QAccessibleMenuItem::parent() const +{ + return QAccessible::queryAccessibleInterface(owner()); +} + +QAccessibleInterface *QAccessibleMenuItem::child(int index) const +{ + if (index == 0 && action()->menu()) + return new QAccessibleMenu(action()->menu()); + return 0; +} + int QAccessibleMenuItem::navigate(RelationFlag relation, int entry, QAccessibleInterface ** target ) const { int ret = -1; @@ -472,32 +395,14 @@ int QAccessibleMenuItem::navigate(RelationFlag relation, int entry, QAccessibleI return ret; } - if (relation == Self || entry == 0) { - *target = new QAccessibleMenuItem(owner(), action()); - return 0; - } - switch (relation) { case Child: - if (entry <= childCount()) { - *target = new QAccessibleMenu(action()->menu()); - ret = 0; - } + *target = child(entry - 1); + ret = *target ? 0 : -1; break; - - case Ancestor:{ - QWidget *parent = owner(); - QAccessibleInterface *ancestor = parent ? QAccessible::queryAccessibleInterface(parent) : 0; - if (ancestor) { - if (entry == 1) { - *target = ancestor; - ret = 0; - } else { - ret = ancestor->navigate(Ancestor, entry - 1, target); - delete ancestor; - } - } - break;} + case Ancestor: + *target = parent(); + return 0; case Up: case Down:{ QAccessibleInterface *parent = 0; @@ -533,36 +438,29 @@ QObject *QAccessibleMenuItem::object() const return m_action; } -QRect QAccessibleMenuItem::rect (int child ) const +QRect QAccessibleMenuItem::rect(int child) const { + Q_ASSERT(child == 0); QRect rect; - if (child == 0) { - QWidget *own = owner(); + QWidget *own = owner(); #ifndef QT_NO_MENUBAR - if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) { - rect = menuBar->actionGeometry(m_action); - QPoint globalPos = menuBar->mapToGlobal(QPoint(0,0)); - rect = rect.translated(globalPos); - } else + if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) { + rect = menuBar->actionGeometry(m_action); + QPoint globalPos = menuBar->mapToGlobal(QPoint(0,0)); + rect = rect.translated(globalPos); + } else #endif // QT_NO_MENUBAR - if (QMenu *menu = qobject_cast<QMenu*>(own)) { - rect = menu->actionGeometry(m_action); - QPoint globalPos = menu->mapToGlobal(QPoint(0,0)); - rect = rect.translated(globalPos); - } - } else if (child == 1) { - QMenu *menu = m_action->menu(); - if (menu) { - rect = menu->rect(); - QPoint globalPos = menu->mapToGlobal(QPoint(0,0)); - rect = rect.translated(globalPos); - } + if (QMenu *menu = qobject_cast<QMenu*>(own)) { + rect = menu->actionGeometry(m_action); + QPoint globalPos = menu->mapToGlobal(QPoint(0,0)); + rect = rect.translated(globalPos); } return rect; } QAccessible::Relation QAccessibleMenuItem::relationTo ( int child, const QAccessibleInterface * other, int otherChild ) const { + Q_ASSERT(child == 0); if (other->object() == owner()) { return Child; } @@ -573,81 +471,68 @@ QAccessible::Relation QAccessibleMenuItem::relationTo ( int child, const QAccess return Unrelated; } -QAccessible::Role QAccessibleMenuItem::role(int /*child*/ ) const +QAccessible::Role QAccessibleMenuItem::role(int child) const { - return m_action->isSeparator() ? Separator :MenuItem; + Q_ASSERT(child == 0); +// if (m_action->menu()) +// return PopupMenu; + return m_action->isSeparator() ? Separator : MenuItem; } void QAccessibleMenuItem::setText ( Text /*t*/, int /*child*/, const QString & /*text */) { - } -QAccessible::State QAccessibleMenuItem::state(int child ) const +QAccessible::State QAccessibleMenuItem::state(int child) const { - QAccessible::State s = Unavailable; - - if (child == 0) { - s = Normal; - QWidget *own = owner(); + Q_ASSERT(child == 0); + QAccessible::State s = Normal; + QWidget *own = owner(); - if (own->testAttribute(Qt::WA_WState_Visible) == false || m_action->isVisible() == false) { - s |= Invisible; - } + if (own->testAttribute(Qt::WA_WState_Visible) == false || m_action->isVisible() == false) { + s |= Invisible; + } - if (QMenu *menu = qobject_cast<QMenu*>(own)) { - if (menu->activeAction() == m_action) - s |= Focused; + if (QMenu *menu = qobject_cast<QMenu*>(own)) { + if (menu->activeAction() == m_action) + s |= Focused; #ifndef QT_NO_MENUBAR - } else if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) { - if (menuBar->activeAction() == m_action) - s |= Focused; + } else if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) { + if (menuBar->activeAction() == m_action) + s |= Focused; #endif - } - if (own->style()->styleHint(QStyle::SH_Menu_MouseTracking)) - s |= HotTracked; - if (m_action->isSeparator() || !m_action->isEnabled()) - s |= Unavailable; - if (m_action->isChecked()) - s |= Checked; - } else if (child == 1) { - QMenu *menu = m_action->menu(); - if (menu) { - QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(menu); - s = iface->state(0); - delete iface; - } } + if (own->style()->styleHint(QStyle::SH_Menu_MouseTracking)) + s |= HotTracked; + if (m_action->isSeparator() || !m_action->isEnabled()) + s |= Unavailable; + if (m_action->isChecked()) + s |= Checked; + return s; } QString QAccessibleMenuItem::text ( Text t, int child ) const { + Q_ASSERT(child == 0); QString str; switch (t) { case Name: - if (child == 0) { - str = m_action->text(); - } else if (child == 1) { - QMenu *m = m_action->menu(); - if (m) - str = m->title(); - } + str = m_action->text(); str = qt_accStripAmp(str); break; - case Accelerator: - if (child == 0) { + case Accelerator: { #ifndef QT_NO_SHORTCUT - QKeySequence key = m_action->shortcut(); - if (!key.isEmpty()) { - str = key.toString(); - } else + QKeySequence key = m_action->shortcut(); + if (!key.isEmpty()) { + str = key.toString(); + } else #endif - { - str = qt_accHotKey(m_action->text()); - } + { + str = qt_accHotKey(m_action->text()); } break; + } default: break; } @@ -659,7 +544,6 @@ int QAccessibleMenuItem::userActionCount ( int /*child*/ ) const return 0; } - QAction *QAccessibleMenuItem::action() const { return m_action; diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.h b/src/plugins/accessible/widgets/qaccessiblemenu.h index ce73629360..0144bf90b9 100644 --- a/src/plugins/accessible/widgets/qaccessiblemenu.h +++ b/src/plugins/accessible/widgets/qaccessiblemenu.h @@ -65,6 +65,8 @@ public: QString text(Text t, int child) const; Role role(int child) const; State state(int child) const; + QAccessibleInterface *child(int index) const; + QAccessibleInterface *parent() const; int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const; int indexOfChild( const QAccessibleInterface *child ) const; @@ -81,6 +83,7 @@ class QAccessibleMenuBar : public QAccessibleWidget public: explicit QAccessibleMenuBar(QWidget *w); + QAccessibleInterface *child(int index) const; int childCount() const; int childAt(int x, int y) const; @@ -113,6 +116,9 @@ public: virtual bool doAction ( int action, int child, const QVariantList & params = QVariantList() ); virtual int indexOfChild ( const QAccessibleInterface * child ) const; virtual bool isValid () const; + + QAccessibleInterface *parent() const; + QAccessibleInterface *child(int index) const; virtual int navigate ( RelationFlag relation, int entry, QAccessibleInterface ** target ) const; virtual QObject * object () const; virtual QRect rect ( int child ) const; diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp index dc16d80c5f..d811f976ab 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp @@ -414,22 +414,22 @@ int QAccessibleStackedWidget::indexOfChild(const QAccessibleInterface *child) co return -1; } -int QAccessibleStackedWidget::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const +QAccessibleInterface *QAccessibleStackedWidget::child(int index) const { - *target = 0; + if (index < 0 || index >= stackedWidget()->count()) + return 0; + return QAccessible::queryAccessibleInterface(stackedWidget()->widget(index)); +} - QObject *targetObject = 0; +int QAccessibleStackedWidget::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const +{ switch (relation) { case Child: - if (entry < 1 || entry > stackedWidget()->count()) - return -1; - targetObject = stackedWidget()->widget(entry-1); - break; + *target = child(entry - 1); + return *target ? 0 : -1; default: return QAccessibleWidget::navigate(relation, entry, target); } - *target = QAccessible::queryAccessibleInterface(targetObject); - return *target ? 0 : -1; } QStackedWidget *QAccessibleStackedWidget::stackedWidget() const @@ -1069,15 +1069,37 @@ QAccessibleTitleBar::QAccessibleTitleBar(QDockWidget *widget) } -int QAccessibleTitleBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const +QAccessibleInterface *QAccessibleTitleBar::parent() const { - if (entry == 0 || relation == Self) { - *iface = new QAccessibleTitleBar(dockWidget()); - return 0; + return new QAccessibleDockWidget(dockWidget()); +} + +QAccessibleInterface *QAccessibleTitleBar::child(int index) const +{ + if (index >= 0) { + QDockWidgetLayout *layout = dockWidgetLayout(); + int role; + int currentIndex = 0; + for (role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) { + QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role); + if (!w || !w->isVisible()) + continue; + if (currentIndex == index) + return QAccessible::queryAccessibleInterface(w); + ++currentIndex; + } } + return 0; +} + +int QAccessibleTitleBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const +{ switch (relation) { case Child: + *iface = child(entry - 1); + return *iface ? 0 : -1; case FocusChild: + // ### if (entry >= 1) { QDockWidgetLayout *layout = dockWidgetLayout(); int index = 1; @@ -1095,18 +1117,8 @@ int QAccessibleTitleBar::navigate(RelationFlag relation, int entry, QAccessibleI } break; case Ancestor: - { - QAccessibleDockWidget *target = new QAccessibleDockWidget(dockWidget()); - int index; - if (entry == 1) { - *iface = target; - return 0; - } - index = target->navigate(Ancestor, entry - 1, iface); - delete target; - return index; - - break;} + *iface = parent(); + return iface ? 0 : -1; case Sibling: return navigate(Child, entry, iface); break; diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h index 471dca5cab..6cb31726dd 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.h +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h @@ -132,6 +132,7 @@ public: int childAt(int x, int y) const; int childCount() const; int indexOfChild(const QAccessibleInterface *child) const; + QAccessibleInterface *child(int index) const; int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const; protected: @@ -273,6 +274,8 @@ public: QString actionText(int action, Text t, int child) const; bool doAction(int action, int child, const QVariantList& params = QVariantList()); int userActionCount ( int child) const; + QAccessibleInterface *parent() const; + QAccessibleInterface *child(int index) const; int navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const; int indexOfChild(const QAccessibleInterface *child) const; int childCount() const; diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp index f74aba2e62..eae8bd907d 100644 --- a/src/plugins/accessible/widgets/simplewidgets.cpp +++ b/src/plugins/accessible/widgets/simplewidgets.cpp @@ -106,8 +106,7 @@ QAbstractButton *QAccessibleButton::button() const /*! \reimp */ QString QAccessibleButton::actionText(int action, Text text, int child) const { - if (child) - return QString(); + Q_ASSERT(child == 0); if (text == Name) switch (action) { case Press: @@ -117,7 +116,7 @@ QString QAccessibleButton::actionText(int action, Text text, int child) const return QPushButton::tr("Open"); case CheckBox: { - if (state(child) & Checked) + if (state(0) & Checked) return QCheckBox::tr("Uncheck"); QCheckBox *cb = qobject_cast<QCheckBox*>(object()); if (!cb || !cb->isTristate() || cb->checkState() == Qt::PartiallyChecked) @@ -138,7 +137,8 @@ QString QAccessibleButton::actionText(int action, Text text, int child) const /*! \reimp */ bool QAccessibleButton::doAction(int action, int child, const QVariantList ¶ms) { - if (child || !widget()->isEnabled()) + Q_ASSERT(child == 0); + if (!widget()->isEnabled()) return false; switch (action) { @@ -161,6 +161,7 @@ bool QAccessibleButton::doAction(int action, int child, const QVariantList ¶ /*! \reimp */ QString QAccessibleButton::text(Text t, int child) const { + Q_ASSERT(child == 0); QString str; switch (t) { case Accelerator: @@ -190,7 +191,8 @@ QString QAccessibleButton::text(Text t, int child) const /*! \reimp */ QAccessible::State QAccessibleButton::state(int child) const { - State state = QAccessibleWidget::state(child); + Q_ASSERT(child == 0); + State state = QAccessibleWidget::state(0); QAbstractButton *b = button(); QCheckBox *cb = qobject_cast<QCheckBox *>(b); @@ -336,11 +338,16 @@ bool QAccessibleToolButton::isSplitButton() const /*! \reimp */ QAccessible::Role QAccessibleToolButton::role(int child) const { - if (isSplitButton()) switch(child) { - case ButtonExecute: - return PushButton; - case ButtonDropMenu: - return ButtonMenu; + Q_ASSERT(child == 0); + + // FIXME + if (isSplitButton()) { + switch (child) { + case ButtonExecute: + return PushButton; + case ButtonDropMenu: + return ButtonMenu; + } } return QAccessibleButton::role(child); } @@ -348,6 +355,7 @@ QAccessible::Role QAccessibleToolButton::role(int child) const /*! \reimp */ QAccessible::State QAccessibleToolButton::state(int child) const { + Q_ASSERT(child == 0); QAccessible::State st = QAccessibleButton::state(child); if (toolButton()->autoRaise()) st |= HotTracked; @@ -374,22 +382,24 @@ int QAccessibleToolButton::childCount() const */ QRect QAccessibleToolButton::rect(int child) const { + Q_ASSERT(child == 0); if (!toolButton()->isVisible()) return QRect(); - if (!child) - return QAccessibleButton::rect(child); - QStyleOptionToolButton opt; - opt.init(widget()); - QRect subrect = widget()->style()->subControlRect(QStyle::CC_ToolButton, &opt, - QStyle::SC_ToolButtonMenu, toolButton()); + return QAccessibleButton::rect(child); - if (child == ButtonExecute) - subrect = QRect(0, 0, subrect.x(), widget()->height()); + // FIXME: sub buttons when SplitButton +// QStyleOptionToolButton opt; +// opt.init(widget()); +// QRect subrect = widget()->style()->subControlRect(QStyle::CC_ToolButton, &opt, +// QStyle::SC_ToolButtonMenu, toolButton()); - QPoint ntl = widget()->mapToGlobal(subrect.topLeft()); - subrect.moveTopLeft(ntl); - return subrect; +// if (child == ButtonExecute) +// subrect = QRect(0, 0, subrect.x(), widget()->height()); + +// QPoint ntl = widget()->mapToGlobal(subrect.topLeft()); +// subrect.moveTopLeft(ntl); +// return subrect; } /*! @@ -400,6 +410,7 @@ QRect QAccessibleToolButton::rect(int child) const */ QString QAccessibleToolButton::text(Text t, int child) const { + Q_ASSERT(child == 0); QString str; switch (t) { case Name: @@ -423,6 +434,7 @@ QString QAccessibleToolButton::text(Text t, int child) const */ int QAccessibleToolButton::actionCount(int child) const { + Q_ASSERT(child == 0); // each subelement has one action if (child) return isSplitButton() ? 1 : 0; @@ -445,6 +457,7 @@ int QAccessibleToolButton::actionCount(int child) const */ QString QAccessibleToolButton::actionText(int action, Text text, int child) const { + Q_ASSERT(child == 0); if (text == Name) switch(child) { case ButtonExecute: return QToolButton::tr("Press"); @@ -472,6 +485,7 @@ QString QAccessibleToolButton::actionText(int action, Text text, int child) cons */ bool QAccessibleToolButton::doAction(int action, int child, const QVariantList ¶ms) { + Q_ASSERT(child == 0); if (!widget()->isEnabled()) return false; if (action == 1 || child == ButtonDropMenu) { @@ -507,6 +521,7 @@ QAccessibleDisplay::QAccessibleDisplay(QWidget *w, Role role) /*! \reimp */ QAccessible::Role QAccessibleDisplay::role(int child) const { + Q_ASSERT(child == 0); QLabel *l = qobject_cast<QLabel*>(object()); if (l) { if (l->pixmap()) @@ -530,6 +545,7 @@ QAccessible::Role QAccessibleDisplay::role(int child) const /*! \reimp */ QString QAccessibleDisplay::text(Text t, int child) const { + Q_ASSERT(child == 0); QString str; switch (t) { case Name: @@ -570,6 +586,7 @@ QString QAccessibleDisplay::text(Text t, int child) const QAccessible::Relation QAccessibleDisplay::relationTo(int child, const QAccessibleInterface *other, int otherChild) const { + Q_ASSERT(child == 0); Relation relation = QAccessibleWidget::relationTo(child, other, otherChild); if (child || otherChild) return relation; @@ -689,6 +706,7 @@ QLineEdit *QAccessibleLineEdit::lineEdit() const /*! \reimp */ QString QAccessibleLineEdit::text(Text t, int child) const { + Q_ASSERT(child == 0); QString str; switch (t) { case Value: @@ -723,6 +741,7 @@ void QAccessibleLineEdit::setText(Text t, int control, const QString &text) /*! \reimp */ QAccessible::State QAccessibleLineEdit::state(int child) const { + Q_ASSERT(child == 0); State state = QAccessibleWidget::state(child); QLineEdit *l = lineEdit(); @@ -744,8 +763,7 @@ QAccessible::State QAccessibleLineEdit::state(int child) const QVariant QAccessibleLineEdit::invokeMethod(QAccessible::Method method, int child, const QVariantList ¶ms) { - if (child) - return QVariant(); + Q_ASSERT(child == 0); switch (method) { case ListSupportedMethods: { 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 ¶ms = 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 ¶ms = QVariantList()) = 0; virtual QVariant invokeMethod(Method method, int child = 0, const QVariantList ¶ms = 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; diff --git a/tests/auto/qaccessibility/tst_qaccessibility.cpp b/tests/auto/qaccessibility/tst_qaccessibility.cpp index abd6998035..b43b580abf 100644 --- a/tests/auto/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/qaccessibility/tst_qaccessibility.cpp @@ -472,8 +472,7 @@ void tst_QAccessibility::navigateGeometric() // arrange 360 widgets around it in a circle QtTestAccessibleWidget *aw = 0; - int i; - for (i = 0; i < 360; i += skip) { + for (int i = 0; i < 360; i += skip) { aw = new QtTestAccessibleWidget(w, QString::number(i).toLatin1()); aw->move( int(200.0 + 100.0 * sin(step * (double)i)), int(200.0 + 100.0 * cos(step * (double)i)) ); } @@ -489,7 +488,7 @@ void tst_QAccessibility::navigateGeometric() QTest::qWait(100); // let one widget rotate around center - for (i = 0; i < 360; i+=skip) { + for (int i = 0; i < 360; i+=skip) { aw->move( int(200.0 + 75.0 * sin(step * (double)i)), int(200.0 + 75.0 * cos(step * (double)i)) ); if (i < 45 || i > 315) { @@ -561,22 +560,11 @@ void tst_QAccessibility::navigateSlider() slider->setObjectName(QString("Slidy")); slider->show(); QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(slider); - QAccessibleInterface *target = 0; QVERIFY(iface != 0); QVERIFY(iface->isValid()); - QCOMPARE(iface->childCount(), 3); - QCOMPARE(iface->navigate(QAccessible::Child, 1, &target), 1); - QVERIFY(target == 0); - QCOMPARE(iface->navigate(QAccessible::Child, 2, &target), 2); - QVERIFY(target == 0); - QCOMPARE(iface->navigate(QAccessible::Child, 3, &target), 3); - QVERIFY(target == 0); - QCOMPARE(iface->navigate(QAccessible::Child, 4, &target), -1); - QVERIFY(target == 0); - QCOMPARE(iface->navigate(QAccessible::Child, 0, &target), -1); - QVERIFY(target == 0); - QCOMPARE(iface->navigate(QAccessible::Child, -42, &target), -1); - QVERIFY(target == 0); + + QEXPECT_FAIL("", "Implement slider with value interface and no children. Test value interface here.", Continue); + QCOMPARE(iface->childCount(), 0); delete iface; delete slider; @@ -719,13 +707,20 @@ void tst_QAccessibility::navigateHierarchy() QCOMPARE(iface->navigate(QAccessible::Sibling, 42, &target), -1); QVERIFY(target == 0); QCOMPARE(iface->navigate(QAccessible::Child, 15, &target), -1); + QVERIFY(iface->child(15) == 0); QVERIFY(target == 0); QCOMPARE(iface->navigate(QAccessible::Child, 0, &target), -1); + QVERIFY(iface->child(-1) == 0); QVERIFY(target == 0); QCOMPARE(iface->navigate(QAccessible::Child, 1, &target), 0); + QAccessibleInterface *interfaceW1 = iface->child(0); QVERIFY(target != 0); QVERIFY(target->isValid()); QCOMPARE(target->object(), (QObject*)w1); + QVERIFY(interfaceW1 != 0); + QVERIFY(interfaceW1->isValid()); + QCOMPARE(interfaceW1->object(), (QObject*)w1); + delete interfaceW1; delete iface; iface = 0; QCOMPARE(target->navigate(QAccessible::Sibling, 0, &iface), -1); @@ -761,27 +756,11 @@ void tst_QAccessibility::navigateHierarchy() QCOMPARE(target->object(), (QObject*)w31); delete iface; iface = 0; - QCOMPARE(target->navigate(QAccessible::Ancestor, 42, &iface), -1); - QVERIFY(iface == 0); - QCOMPARE(target->navigate(QAccessible::Ancestor, -1, &iface), -1); - QVERIFY(iface == 0); - QCOMPARE(target->navigate(QAccessible::Ancestor, 0, &iface), -1); - QVERIFY(iface == 0); - QCOMPARE(target->navigate(QAccessible::Ancestor, 1, &iface), 0); + iface = target->parent(); QVERIFY(iface != 0); QVERIFY(iface->isValid()); QCOMPARE(iface->object(), (QObject*)w3); delete iface; iface = 0; - QCOMPARE(target->navigate(QAccessible::Ancestor, 2, &iface), 0); - QVERIFY(iface != 0); - QVERIFY(iface->isValid()); - QCOMPARE(iface->object(), (QObject*)w); - delete iface; iface = 0; - QCOMPARE(target->navigate(QAccessible::Ancestor, 3, &iface), 0); - QVERIFY(iface != 0); - QVERIFY(iface->isValid()); - QCOMPARE(iface->object(), (QObject*)qApp); - delete iface; iface = 0; delete target; target = 0; delete w; @@ -1328,17 +1307,17 @@ void tst_QAccessibility::tabTest() // Test that the Invisible bit for the navigation buttons gets set // and cleared correctly. - qWarning() << "Enable test again when child and parent functions are implemented"; -#if 0 - QVERIFY(interface->state(1) & QAccessible::Invisible); + QAccessibleInterface *child1 = interface->child(0); + QVERIFY(child1); + QVERIFY(child1->state() & QAccessible::Invisible); const int lots = 10; for (int i = 0; i < lots; ++i) tabBar->addTab("Foo"); - QVERIFY((interface->state(1) & QAccessible::Invisible) == false); + QVERIFY((child1->state() & QAccessible::Invisible) == false); tabBar->hide(); - QVERIFY(interface->state(1) & QAccessible::Invisible); + QVERIFY(child1->state() & QAccessible::Invisible); tabBar->show(); tabBar->setCurrentIndex(0); @@ -1350,7 +1329,7 @@ void tst_QAccessibility::tabTest() // Test that sending a press action to a tab selects it. interface->doAction(QAccessible::Press, 2, QVariantList()); QCOMPARE(tabBar->currentIndex(), 1); -#endif + delete tabBar; delete interface; QTestAccessibility::clearEvents(); @@ -1377,46 +1356,51 @@ void tst_QAccessibility::tabWidgetTest() QAccessibleInterface* tabBarInterface = 0; // there is no special logic to sort the children, so the contents will be 1, the tab bar 2 - QCOMPARE(interface->navigate(QAccessible::Child, 2 , &tabBarInterface), 0); + tabBarInterface = interface->child(1); QVERIFY(tabBarInterface); QCOMPARE(tabBarInterface->childCount(), 4); - QCOMPARE(tabBarInterface->role(0), QAccessible::PageTabList); + QCOMPARE(tabBarInterface->role(), QAccessible::PageTabList); - QAccessibleInterface* tabButton1Interface = 0; - QCOMPARE(tabBarInterface->navigate(QAccessible::Child, 1 , &tabButton1Interface), 0); + QAccessibleInterface* tabButton1Interface = tabBarInterface->child(0); QVERIFY(tabButton1Interface); + QCOMPARE(tabButton1Interface->role(), QAccessible::PageTab); + QCOMPARE(tabButton1Interface->text(QAccessible::Name), QLatin1String("Tab 1")); + + QAccessibleInterface* tabButton2Interface = tabBarInterface->child(1); + QVERIFY(tabButton1Interface); + QCOMPARE(tabButton2Interface->role(), QAccessible::PageTab); + QCOMPARE(tabButton2Interface->text(QAccessible::Name), QLatin1String("Tab 2")); + + QAccessibleInterface* tabButtonLeft = tabBarInterface->child(2); + QVERIFY(tabButtonLeft); + QCOMPARE(tabButtonLeft->role(), QAccessible::PushButton); + QCOMPARE(tabButtonLeft->text(QAccessible::Name), QLatin1String("Scroll Left")); + + QAccessibleInterface* tabButtonRight = tabBarInterface->child(3); + QVERIFY(tabButtonRight); + QCOMPARE(tabButtonRight->role(), QAccessible::PushButton); + QCOMPARE(tabButtonRight->text(QAccessible::Name), QLatin1String("Scroll Right")); delete tabButton1Interface; + delete tabButton2Interface; + delete tabButtonLeft; + delete tabButtonRight; - qWarning() << "Enable test again when child and parent functions are implemented"; -#if 0 - QCOMPARE(tabBarInterface->role(1), QAccessible::PageTab); - QCOMPARE(tabBarInterface->text(QAccessible::Name, 1), QLatin1String("Tab 1")); - QCOMPARE(tabBarInterface->role(2), QAccessible::PageTab); - QCOMPARE(tabBarInterface->text(QAccessible::Name, 2), QLatin1String("Tab 2")); - QCOMPARE(tabBarInterface->role(3), QAccessible::PushButton); - QCOMPARE(tabBarInterface->text(QAccessible::Name, 3), QLatin1String("Scroll Left")); - QCOMPARE(tabBarInterface->role(4), QAccessible::PushButton); - QCOMPARE(tabBarInterface->text(QAccessible::Name, 4), QLatin1String("Scroll Right")); - - QAccessibleInterface* stackWidgetInterface = 0; - QCOMPARE(interface->navigate(QAccessible::Child, 1, &stackWidgetInterface), 0); + QAccessibleInterface* stackWidgetInterface = interface->child(0); QVERIFY(stackWidgetInterface); QCOMPARE(stackWidgetInterface->childCount(), 2); - QCOMPARE(stackWidgetInterface->role(0), QAccessible::LayeredPane); + QCOMPARE(stackWidgetInterface->role(), QAccessible::LayeredPane); - QAccessibleInterface* stackChild1Interface = 0; - QCOMPARE(stackWidgetInterface->navigate(QAccessible::Child, 1, &stackChild1Interface), 0); + QAccessibleInterface* stackChild1Interface = stackWidgetInterface->child(0); QVERIFY(stackChild1Interface); #ifndef Q_CC_INTEL QCOMPARE(stackChild1Interface->childCount(), 0); #endif - QCOMPARE(stackChild1Interface->role(0), QAccessible::StaticText); - QCOMPARE(stackChild1Interface->text(QAccessible::Name, 0), QLatin1String("Page 1")); + QCOMPARE(stackChild1Interface->role(), QAccessible::StaticText); + QCOMPARE(stackChild1Interface->text(QAccessible::Name), QLatin1String("Page 1")); QCOMPARE(label1, stackChild1Interface->object()); // Navigation in stack widgets should be consistent - QAccessibleInterface* parent = 0; - QCOMPARE(stackChild1Interface->navigate(QAccessible::Ancestor, 1, &parent), 0); + QAccessibleInterface* parent = stackChild1Interface->parent(); QVERIFY(parent); #ifndef Q_CC_INTEL QCOMPARE(parent->childCount(), 2); @@ -1424,25 +1408,25 @@ void tst_QAccessibility::tabWidgetTest() QCOMPARE(parent->role(0), QAccessible::LayeredPane); delete parent; - QAccessibleInterface* stackChild2Interface = 0; - QCOMPARE(stackWidgetInterface->navigate(QAccessible::Child, 2, &stackChild2Interface), 0); + QAccessibleInterface* stackChild2Interface = stackWidgetInterface->child(1); QVERIFY(stackChild2Interface); QCOMPARE(stackChild2Interface->childCount(), 0); - QCOMPARE(stackChild2Interface->role(0), QAccessible::StaticText); - QCOMPARE(label2, stackChild2Interface->object()); // the text will be empty since it is not visible + QCOMPARE(stackChild2Interface->role(), QAccessible::StaticText); + QCOMPARE(label2, stackChild2Interface->object()); + QCOMPARE(label2->text(), stackChild2Interface->text(QAccessible::Name)); - QCOMPARE(stackChild2Interface->navigate(QAccessible::Ancestor, 1, &parent), 0); + parent = stackChild2Interface->parent(); QVERIFY(parent); #ifndef Q_CC_INTEL QCOMPARE(parent->childCount(), 2); #endif - QCOMPARE(parent->role(0), QAccessible::LayeredPane); + QCOMPARE(parent->role(), QAccessible::LayeredPane); delete parent; + + delete tabBarInterface; delete stackChild1Interface; delete stackChild2Interface; delete stackWidgetInterface; -#endif - delete tabBarInterface; delete interface; delete tabWidget; QTestAccessibility::clearEvents(); @@ -1486,17 +1470,23 @@ void tst_QAccessibility::menuTest() QTest::qWait(100); QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(mw.menuBar()); - QCOMPARE(verifyHierarchy(interface), 0); QVERIFY(interface); QCOMPARE(interface->childCount(), 5); QCOMPARE(interface->role(0), QAccessible::MenuBar); - QCOMPARE(interface->role(1), QAccessible::MenuItem); - QCOMPARE(interface->role(2), QAccessible::MenuItem); - QCOMPARE(interface->role(3), QAccessible::Separator); - QCOMPARE(interface->role(4), QAccessible::MenuItem); - QCOMPARE(interface->role(5), QAccessible::MenuItem); + + QAccessibleInterface *iFile = interface->child(0); + QAccessibleInterface *iEdit = interface->child(1); + QAccessibleInterface *iSeparator = interface->child(2); + QAccessibleInterface *iHelp = interface->child(3); + QAccessibleInterface *iAction = interface->child(4); + + QCOMPARE(iFile->role(0), QAccessible::MenuItem); + QCOMPARE(iEdit->role(0), QAccessible::MenuItem); + QCOMPARE(iSeparator->role(0), QAccessible::Separator); + QCOMPARE(iHelp->role(0), QAccessible::MenuItem); + QCOMPARE(iAction->role(0), QAccessible::MenuItem); #ifndef Q_WS_MAC #ifdef Q_OS_WINCE if (!IsValidCEPlatform()) { @@ -1506,73 +1496,79 @@ void tst_QAccessibility::menuTest() QCOMPARE(mw.mapFromGlobal(interface->rect(0).topLeft()), mw.menuBar()->geometry().topLeft()); QCOMPARE(interface->rect(0).size(), mw.menuBar()->size()); - QVERIFY(interface->rect(0).contains(interface->rect(1))); - QVERIFY(interface->rect(0).contains(interface->rect(2))); - // QVERIFY(interface->rect(0).contains(interface->rect(3))); //separator might be invisible - QVERIFY(interface->rect(0).contains(interface->rect(4))); - QVERIFY(interface->rect(0).contains(interface->rect(5))); + QVERIFY(interface->rect(0).contains(iFile->rect(0))); + QVERIFY(interface->rect(0).contains(iEdit->rect(0))); + // QVERIFY(interface->rect(0).contains(childSeparator->rect(0))); //separator might be invisible + QVERIFY(interface->rect(0).contains(iHelp->rect(0))); + QVERIFY(interface->rect(0).contains(iAction->rect(0))); #endif - QCOMPARE(interface->text(QAccessible::Name, 1), QString("File")); - QCOMPARE(interface->text(QAccessible::Name, 2), QString("Edit")); - QCOMPARE(interface->text(QAccessible::Name, 3), QString()); - QCOMPARE(interface->text(QAccessible::Name, 4), QString("Help")); - QCOMPARE(interface->text(QAccessible::Name, 5), QString("Action!")); + QCOMPARE(iFile->text(QAccessible::Name, 0), QString("File")); + QCOMPARE(iEdit->text(QAccessible::Name, 0), QString("Edit")); + QCOMPARE(iSeparator->text(QAccessible::Name, 0), QString()); + QCOMPARE(iHelp->text(QAccessible::Name, 0), QString("Help")); + QCOMPARE(iAction->text(QAccessible::Name, 0), QString("Action!")); // TODO: Currently not working, task to fix is #100019. #ifndef Q_OS_MAC - QCOMPARE(interface->text(QAccessible::Accelerator, 1), tr("Alt+F")); - QCOMPARE(interface->text(QAccessible::Accelerator, 2), tr("Alt+E")); - QCOMPARE(interface->text(QAccessible::Accelerator, 4), tr("Alt+H")); - QCOMPARE(interface->text(QAccessible::Accelerator, 3), QString()); - QCOMPARE(interface->text(QAccessible::Accelerator, 4), tr("Alt+H")); - QCOMPARE(interface->text(QAccessible::Accelerator, 5), QString()); + QCOMPARE(iFile->text(QAccessible::Accelerator, 0), tr("Alt+F")); + QCOMPARE(iEdit->text(QAccessible::Accelerator, 0), tr("Alt+E")); + QCOMPARE(iSeparator->text(QAccessible::Accelerator, 0), QString()); + QCOMPARE(iHelp->text(QAccessible::Accelerator, 0), tr("Alt+H")); + QCOMPARE(iAction->text(QAccessible::Accelerator, 0), QString()); #endif - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 1), QString("Open")); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 2), QString("Open")); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 3), QString()); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 4), QString("Open")); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 5), QString("Execute")); + QCOMPARE(iFile->actionText(QAccessible::DefaultAction, QAccessible::Name), QString("Open")); + QCOMPARE(iEdit->actionText(QAccessible::DefaultAction, QAccessible::Name), QString("Open")); + QCOMPARE(iSeparator->actionText(QAccessible::DefaultAction, QAccessible::Name), QString()); + QCOMPARE(iHelp->actionText(QAccessible::DefaultAction, QAccessible::Name), QString("Open")); + QCOMPARE(iAction->actionText(QAccessible::DefaultAction, QAccessible::Name), QString("Execute")); bool menuFade = qApp->isEffectEnabled(Qt::UI_FadeMenu); int menuFadeDelay = 300; - interface->doAction(QAccessible::DefaultAction, 1); + iFile->doAction(QAccessible::DefaultAction); if(menuFade) QTest::qWait(menuFadeDelay); QVERIFY(file->isVisible() && !edit->isVisible() && !help->isVisible()); - interface->doAction(QAccessible::DefaultAction, 2); + iEdit->doAction(QAccessible::DefaultAction); if(menuFade) QTest::qWait(menuFadeDelay); QVERIFY(!file->isVisible() && edit->isVisible() && !help->isVisible()); - interface->doAction(QAccessible::DefaultAction, 3); + iSeparator->doAction(QAccessible::DefaultAction); if(menuFade) QTest::qWait(menuFadeDelay); QVERIFY(!file->isVisible() && !edit->isVisible() && !help->isVisible()); - interface->doAction(QAccessible::DefaultAction, 4); + iHelp->doAction(QAccessible::DefaultAction); if(menuFade) QTest::qWait(menuFadeDelay); QVERIFY(!file->isVisible() && !edit->isVisible() && help->isVisible()); - interface->doAction(QAccessible::DefaultAction, 5); + iAction->doAction(QAccessible::DefaultAction); if(menuFade) QTest::qWait(menuFadeDelay); QVERIFY(!file->isVisible() && !edit->isVisible() && !help->isVisible()); - interface->doAction(QAccessible::DefaultAction, 1); + interface->doAction(QAccessible::DefaultAction); delete interface; interface = QAccessible::queryAccessibleInterface(file); QCOMPARE(interface->childCount(), 5); - QCOMPARE(interface->role(0), QAccessible::PopupMenu); - QCOMPARE(interface->role(1), QAccessible::MenuItem); - QCOMPARE(interface->role(2), QAccessible::MenuItem); - QCOMPARE(interface->role(3), QAccessible::MenuItem); - QCOMPARE(interface->role(4), QAccessible::Separator); - QCOMPARE(interface->role(5), QAccessible::MenuItem); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 1), QString("Open")); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 2), QString("Execute")); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 3), QString("Execute")); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 4), QString()); - QCOMPARE(interface->actionText(QAccessible::DefaultAction, QAccessible::Name, 5), QString("Execute")); + QCOMPARE(interface->role(), QAccessible::PopupMenu); + + QAccessibleInterface *iFileNew = interface->child(0); + QAccessibleInterface *iFileOpen = interface->child(1); + QAccessibleInterface *iFileSave = interface->child(2); + QAccessibleInterface *iFileSeparator = interface->child(3); + QAccessibleInterface *iFileExit = interface->child(4); + + QCOMPARE(iFileNew->role(), QAccessible::MenuItem); + QCOMPARE(iFileOpen->role(), QAccessible::MenuItem); + QCOMPARE(iFileSave->role(), QAccessible::MenuItem); + QCOMPARE(iFileSeparator->role(), QAccessible::Separator); + QCOMPARE(iFileExit->role(), QAccessible::MenuItem); + QCOMPARE(iFileNew->actionText(QAccessible::DefaultAction, QAccessible::Name, 0), QString("Open")); + QCOMPARE(iFileOpen->actionText(QAccessible::DefaultAction, QAccessible::Name, 0), QString("Execute")); + QCOMPARE(iFileSave->actionText(QAccessible::DefaultAction, QAccessible::Name, 0), QString("Execute")); + QCOMPARE(iFileSeparator->actionText(QAccessible::DefaultAction, QAccessible::Name, 0), QString()); + QCOMPARE(iFileExit->actionText(QAccessible::DefaultAction, QAccessible::Name, 0), QString("Execute")); QAccessibleInterface *iface = 0; QAccessibleInterface *iface2 = 0; @@ -1653,12 +1649,6 @@ void tst_QAccessibility::menuTest() QVERIFY(iface); QCOMPARE(iface->role(0), QAccessible::MenuItem); - // Traverse to the menubar. - QAccessibleInterface *ifaceMenuBar = 0; - entry = iface->navigate(QAccessible::Ancestor, 5, &ifaceMenuBar); - QCOMPARE(ifaceMenuBar->role(0), QAccessible::MenuBar); - delete ifaceMenuBar; - delete iface; // move mouse pointer away, since that might influence the @@ -1667,8 +1657,9 @@ void tst_QAccessibility::menuTest() QTest::qWait(100); if (menuFade) QTest::qWait(menuFadeDelay); - interface->doAction(QAccessible::DefaultAction, 1); - QTestEventLoop::instance().enterLoop(2); + + iFile->doAction(QAccessible::DefaultAction); + iFileNew->doAction(QAccessible::DefaultAction); QVERIFY(file->isVisible()); QVERIFY(fileNew->isVisible()); @@ -1678,6 +1669,12 @@ void tst_QAccessibility::menuTest() QTestAccessibility::clearEvents(); mw.hide(); + delete iFile; + delete iFileNew; + delete iFileOpen; + delete iFileSave; + delete iFileSeparator; + delete iFileExit; // Do not crash if the menu don't have a parent QMenu *menu = new QMenu; @@ -1685,8 +1682,9 @@ void tst_QAccessibility::menuTest() menu->addAction(QLatin1String("two")); menu->addAction(QLatin1String("three")); iface = QAccessible::queryAccessibleInterface(menu); - QCOMPARE(iface->navigate(QAccessible::Ancestor, 1, &iface2), 0); - QCOMPARE(iface2->role(0), QAccessible::Application); + iface2 = iface->parent(); + QVERIFY(iface2); + QCOMPARE(iface2->role(), QAccessible::Application); // caused a *crash* iface2->state(0); delete iface2; @@ -2912,11 +2910,9 @@ void tst_QAccessibility::table2TreeTest() treeView->resize(400,400); treeView->show(); - QTest::qWait(1); // Need this for indexOfchild to work. -#if defined(Q_OS_UNIX) + QCoreApplication::processEvents(); QTest::qWait(100); -#endif QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(treeView); QEXPECT_FAIL("", "Implement Sibling navigation for table2 cells.", Continue); @@ -2975,11 +2971,9 @@ void tst_QAccessibility::table2TreeTest() treeView->expandAll(); - QTest::qWait(1); // Need this for indexOfchild to work. -#if defined(Q_OS_UNIX) + // Need this for indexOfchild to work. QCoreApplication::processEvents(); QTest::qWait(100); -#endif QCOMPARE(table2->columnCount(), 2); QCOMPARE(table2->rowCount(), 5); |