From c58955328688a73bea53f65cd38dd3f07229b3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20H=C3=B6ltt=C3=A4?= Date: Tue, 4 Dec 2018 14:48:36 +0100 Subject: cursor trapping and navigation out of a scope works now as intended done by precopying the list of candidates. Could avoid extra list copies if the algorithm traversed the tree, but this is simpler and works for now --- plugin/cursornavigation.cpp | 31 +++++++++++++++++++++++++++---- plugin/cursornavigation.h | 1 + plugin/cursornavigationattached.cpp | 1 + 3 files changed, 29 insertions(+), 4 deletions(-) (limited to 'plugin') diff --git a/plugin/cursornavigation.cpp b/plugin/cursornavigation.cpp index 7cdd80a..155a158 100644 --- a/plugin/cursornavigation.cpp +++ b/plugin/cursornavigation.cpp @@ -214,13 +214,29 @@ void CursorNavigation::_move(qreal angle, qreal tolerance, bool discrete) CursorNavigationAttached *CursorNavigation::_find(qreal angle, qreal tolerance, bool discrete) { CursorNavigationAttached *nextItem = nullptr; + CursorNavigationAttached *parent = m_currentItem ? + m_currentItem->m_parentNavigable : + m_rootItem; + + if (!m_currentItem) + return defaultItem(); qWarning() << "find next item, angle = " << angle << " tolerance = " << tolerance << " discrete = " << discrete; - CursorNavigationCommand cmd(angle, tolerance); - QList &candidates = m_currentItem ? - m_currentItem->m_parentNavigable->m_children : - m_rootItem->m_children; + QList candidates; + + do { + candidates.append(parent->m_children); + + if (parent->trapsCursor()) + break; + parent = parent->m_parentNavigable; + } while (parent); + + if (candidates.isEmpty()) + return nullptr; + + CursorNavigationCommand cmd(angle, tolerance); if (discrete) { nextItem = m_navigation4Dir.getNextCandidate(candidates, m_currentItem, cmd); @@ -230,3 +246,10 @@ CursorNavigationAttached *CursorNavigation::_find(qreal angle, qreal tolerance, return nextItem; } + +CursorNavigationAttached *CursorNavigation::defaultItem() +{ + if (m_rootItem->m_children.size()) + return m_rootItem->m_children.first(); + return nullptr; +} diff --git a/plugin/cursornavigation.h b/plugin/cursornavigation.h index 34dd794..f3a6f91 100644 --- a/plugin/cursornavigation.h +++ b/plugin/cursornavigation.h @@ -42,6 +42,7 @@ private: void _move(qreal angle, qreal tolerance, bool discrete); CursorNavigationAttached *_find(qreal angle, qreal tolerance, bool discrete); + CursorNavigationAttached *defaultItem(); private: static const char windowPropertyName[]; diff --git a/plugin/cursornavigationattached.cpp b/plugin/cursornavigationattached.cpp index 1c68ac9..6808922 100644 --- a/plugin/cursornavigationattached.cpp +++ b/plugin/cursornavigationattached.cpp @@ -9,6 +9,7 @@ m_cursorNavigation(nullptr), m_parentNavigable(nullptr), m_acceptsCursor(true), m_hasCursor(false), +m_trapsCursor(false), m_escapeTarget(nullptr) { if (parent) -- cgit v1.2.3