summaryrefslogtreecommitdiffstats
path: root/src/plugins/accessible/widgets/qaccessiblemenu.cpp
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@nokia.com>2011-09-15 21:41:54 +0200
committerQt by Nokia <qt-info@nokia.com>2011-09-19 12:06:13 +0200
commit76d0d1926466d42b1b25f0bac642c1e0f239074c (patch)
tree84397813957307cf1ac393ac29d045acc6e08846 /src/plugins/accessible/widgets/qaccessiblemenu.cpp
parent3647a00d47fd774daccce9f143cc2046fb59099d (diff)
Add parent and child functions to QAccessibleInterface.
Stop the mis-use of navigate to find the parent. In order to make navigation straight forward parent and child functions are now part of QAccessibleInterface. This allows navigating the hierarchy of accessible objects without the 1-based indexes in the navigate function which lead to confusion. Eventually the support for Ancestor in navigate can be completely removed and forwarded in the windows bridge if needed. In addition default parameters for virtual children. This will make the transition smooth since it allows to remove the integer already. Change-Id: I278287ce17161f9fa46797ac244676778c859576 Reviewed-on: http://codereview.qt-project.org/5024 Reviewed-by: Frederik Gladhorn <frederik.gladhorn@nokia.com> Reviewed-by: Jan-Arve Sæther <jan-arve.saether@nokia.com>
Diffstat (limited to 'src/plugins/accessible/widgets/qaccessiblemenu.cpp')
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.cpp454
1 files changed, 169 insertions, 285 deletions
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;