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 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'plugin/cursornavigation.cpp') 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; +} -- cgit v1.2.3