diff options
Diffstat (limited to 'src/quick/items/qquickitem.cpp')
-rw-r--r-- | src/quick/items/qquickitem.cpp | 64 |
1 files changed, 49 insertions, 15 deletions
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index 154e3241b1..eba3842c10 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -67,6 +67,7 @@ #include <QtQuick/private/qquickstate_p.h> #include <private/qquickitem_p.h> #include <QtQuick/private/qquickaccessibleattached_p.h> +#include <QtQuick/private/qquickhoverhandler_p.h> #include <QtQuick/private/qquickpointerhandler_p.h> #include <private/qv4engine_p.h> @@ -356,7 +357,7 @@ void QQuickItemKeyFilter::componentComplete() \qmltype KeyNavigation \instantiates QQuickKeyNavigationAttached \inqmlmodule QtQuick - \ingroup qtquick-input + \ingroup qtquick-input-handlers \brief Supports key navigation by arrow keys. Key-based user interfaces commonly allow the use of arrow keys to navigate between @@ -815,7 +816,7 @@ bool QQuickKeysAttached::isConnected(const char *signalName) const \qmltype Keys \instantiates QQuickKeysAttached \inqmlmodule QtQuick - \ingroup qtquick-input + \ingroup qtquick-input-handlers \brief Provides key handling to Items. All visual primitives support key handling via the Keys @@ -2453,20 +2454,19 @@ bool QQuickItemPrivate::canAcceptTabFocus(QQuickItem *item) return true; #if QT_CONFIG(accessibility) - if (QObject *acc = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(item, false)) { - int role = acc->property("role").toInt(); - if (role == QAccessible::EditableText - || role == QAccessible::Table - || role == QAccessible::List - || role == QAccessible::SpinBox) { - return true; - } else if (role == QAccessible::ComboBox) { - QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(item); + QAccessible::Role role = QQuickItemPrivate::get(item)->accessibleRole(); + if (role == QAccessible::EditableText || role == QAccessible::Table || role == QAccessible::List) { + return true; + } else if (role == QAccessible::ComboBox || role == QAccessible::SpinBox) { + if (QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(item)) return iface->state().editable; - } } #endif + QVariant editable = item->property("editable"); + if (editable.isValid()) + return editable.toBool(); + QVariant readonly = item->property("readOnly"); if (readonly.isValid() && !readonly.toBool() && item->property("text").isValid()) return true; @@ -2565,8 +2565,19 @@ QQuickItem* QQuickItemPrivate::nextPrevItemInTabFocusChain(QQuickItem *item, boo from = item->parentItem(); } bool skip = false; - QQuickItem * startItem = item; - QQuickItem * firstFromItem = from; + + QQuickItem *startItem = item; + // Protect from endless loop: + // If we start on an invisible item we will not find it again. + // If there is no other item which can become the focus item, we have a forever loop, + // since the protection only works if we encounter the first item again. + while (startItem && !startItem->isVisible()) { + startItem = startItem->parentItem(); + } + if (!startItem) + return item; + + QQuickItem *firstFromItem = from; QQuickItem *current = item; qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: startItem:" << startItem; qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: firstFromItem:" << firstFromItem; @@ -5201,6 +5212,17 @@ void QQuickItemPrivate::deliverShortcutOverrideEvent(QKeyEvent *event) } } +bool QQuickItemPrivate::anyPointerHandlerWants(QQuickEventPoint *point) const +{ + if (!hasPointerHandlers()) + return false; + for (QQuickPointerHandler *handler : extra->pointerHandlers) { + if (handler->wantsEventPoint(point)) + return true; + } + return false; +} + /*! \internal Deliver the \a event to all PointerHandlers which are in the pre-determined @@ -7404,6 +7426,8 @@ void QQuickItemPrivate::setHasHoverInChild(bool hasHover) QQuickItemPrivate *otherChildPrivate = QQuickItemPrivate::get(otherChild); if (otherChildPrivate->subtreeHoverEnabled || otherChildPrivate->hoverEnabled) return; // nope! sorry, something else wants it kept on. + if (otherChildPrivate->hasHoverHandlers()) + return; // nope! sorry, we have pointer handlers which are interested. } } @@ -8177,6 +8201,16 @@ bool QQuickItemPrivate::hasPointerHandlers() const return extra.isAllocated() && !extra->pointerHandlers.isEmpty(); } +bool QQuickItemPrivate::hasHoverHandlers() const +{ + if (!hasPointerHandlers()) + return false; + for (QQuickPointerHandler *h : extra->pointerHandlers) + if (qmlobject_cast<QQuickHoverHandler *>(h)) + return true; + return false; +} + #if QT_CONFIG(quick_shadereffect) QQuickItemLayer::QQuickItemLayer(QQuickItem *item) : m_item(item) @@ -8762,7 +8796,7 @@ void QV4::Heap::QQuickItemWrapper::markObjects(QV4::Heap::Base *that, QV4::MarkS quint64 QQuickItemPrivate::_q_createJSWrapper(QV4::ExecutionEngine *engine) { - return (engine->memoryManager->allocObject<QQuickItemWrapper>(q_func()))->asReturnedValue(); + return (engine->memoryManager->allocate<QQuickItemWrapper>(q_func()))->asReturnedValue(); } QT_END_NAMESPACE |