diff options
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/cursornavigation.cpp | 31 | ||||
-rw-r--r-- | plugin/cursornavigation.h | 1 | ||||
-rw-r--r-- | plugin/cursornavigationattached.cpp | 1 |
3 files changed, 29 insertions, 4 deletions
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<CursorNavigationAttached*> &candidates = m_currentItem ? - m_currentItem->m_parentNavigable->m_children : - m_rootItem->m_children; + QList<CursorNavigationAttached*> 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) |