From e443f6dc7df2e5a0bd2ab890c3b6094500f5b9ab Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Fri, 10 May 2013 11:54:37 +0200 Subject: Mac: respect the system settings in Full Keyboard Access Iterate all or not in nextPrevItemInTabFocusChain function. Change-Id: I95289b042f3d9924c28ffb9c8c7124c767addf2e Reviewed-by: Jens Bache-Wiig --- src/quick/items/qquickitem.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- src/quick/items/qquickitem_p.h | 3 +++ 2 files changed, 43 insertions(+), 1 deletion(-) (limited to 'src/quick') diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index 5ad53e99b6..1667736d46 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -2032,6 +2033,41 @@ QQuickItem::~QQuickItem() delete d->_stateGroup; d->_stateGroup = 0; } +/*! + \internal +*/ +bool QQuickItemPrivate::qt_tab_all_widgets() +{ + if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) + return theme->themeHint(QPlatformTheme::TabAllWidgets).toBool(); + return true; +} + +/*! + \internal +*/ +bool QQuickItemPrivate::canAcceptTabFocus(QQuickItem *item) +{ + bool result = true; + + if (item->window() && item == item->window()->contentItem()) + return true; + +#ifndef QT_NO_ACCESSIBILITY + result = false; + if (QObject *acc = qmlAttachedPropertiesObject(item, false)) { + int role = acc->property("role").toInt(); + if (role == QAccessible::EditableText + || role == QAccessible::Table + || role == QAccessible::List + || role == QAccessible::SpinBox) + result = true; + } +#endif + + return result; +} + /*! \internal \brief QQuickItemPrivate::focusNextPrev focuses the next/prev item in the tab-focus-chain @@ -2059,6 +2095,8 @@ QQuickItem* QQuickItemPrivate::nextPrevItemInTabFocusChain(QQuickItem *item, boo Q_ASSERT(item); Q_ASSERT(item->activeFocusOnTab()); + bool all = QQuickItemPrivate::qt_tab_all_widgets(); + QQuickItem *from = 0; if (forward) { from = item->parentItem(); @@ -2121,7 +2159,8 @@ QQuickItem* QQuickItemPrivate::nextPrevItemInTabFocusChain(QQuickItem *item, boo } from = last; - } while (skip || !current->activeFocusOnTab() || !current->isEnabled() || !current->isVisible()); + } while (skip || !current->activeFocusOnTab() || !current->isEnabled() || !current->isVisible() + || !(all || QQuickItemPrivate::canAcceptTabFocus(current))); return current; } diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index 12a5165d9b..c71da3c330 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -491,6 +491,9 @@ public: static bool focusNextPrev(QQuickItem *item, bool forward); static QQuickItem *nextPrevItemInTabFocusChain(QQuickItem *item, bool forward); + static bool qt_tab_all_widgets(); //todo: move to QGuiApplication? + static bool canAcceptTabFocus(QQuickItem *item); + qreal x; qreal y; qreal width; -- cgit v1.2.3