diff options
author | Antti Hölttä <AHoelttae@luxoft.com> | 2018-12-07 10:52:06 +0100 |
---|---|---|
committer | Antti Hölttä <AHoelttae@luxoft.com> | 2019-03-18 16:33:53 +0100 |
commit | 6fd358d2fd82cd06dbe25a019e7de19817ba3017 (patch) | |
tree | 4098c93b7a6728b6b2c3c1d2765fac0a85e42876 | |
parent | 65b3492325672bc24400edbdeb0aa91b46cb8c8e (diff) |
Add available-function for a cursor navigable
Availability means that the item first of all accepting cursor,
visible, enabled, and within its parent's geometry. This value
is meant for the algorithms to define if item is navigable.
-rw-r--r-- | DemoApplication/main.qml | 48 | ||||
-rw-r--r-- | plugin/cursornavigationattached.cpp | 10 | ||||
-rw-r--r-- | plugin/cursornavigationattached.h | 7 | ||||
-rw-r--r-- | plugin/spatialnavigation360.cpp | 6 | ||||
-rw-r--r-- | plugin/spatialnavigation4dir.cpp | 14 |
5 files changed, 52 insertions, 33 deletions
diff --git a/DemoApplication/main.qml b/DemoApplication/main.qml index 58f1af5..bfb7840 100644 --- a/DemoApplication/main.qml +++ b/DemoApplication/main.qml @@ -13,28 +13,34 @@ ApplicationWindow { visible: true title: qsTr("Cursor Navigation Demo Application") - header: TabBar { - id: tabBar - width: parent.width - CNTabButton { - text: qsTr("Page 1") - } - CNTabButton { - text: qsTr("Page 2") - } - CNTabButton { - text: qsTr("Page 3") - } - CNTabButton { - text: qsTr("Page 4") - } - CNTabButton { - text: qsTr("Page 5") - } - CNTabButton { - text: qsTr("Map") + header: + + TabBar { + id: tabBar + width: window.width + + CursorNavigation.acceptsCursor: true + + CNTabButton { + text: qsTr("Page 1") + focus: true + } + CNTabButton { + text: qsTr("Page 2") + } + CNTabButton { + text: qsTr("Page 3") + } + CNTabButton { + text: qsTr("Page 4") + } + CNTabButton { + text: qsTr("Page 5") + } + CNTabButton { + text: qsTr("Map") + } } - } contentData: StackLayout { anchors.fill: parent diff --git a/plugin/cursornavigationattached.cpp b/plugin/cursornavigationattached.cpp index 6808922..2581920 100644 --- a/plugin/cursornavigationattached.cpp +++ b/plugin/cursornavigationattached.cpp @@ -185,6 +185,16 @@ QQuickItem *CursorNavigationAttached::escapeTarget() const return m_escapeTarget; } +bool CursorNavigationAttached::available() const +{ + if (m_acceptsCursor && item()->isVisible() && item()->isEnabled()) { + QRectF parentRect(0,0,m_parentNavigable->item()->width(), m_parentNavigable->item()->height()); + QRectF thisRect = item()->mapRectToItem(m_parentNavigable->item(), QRectF(0,0,item()->width(), item()->height())); + return parentRect.intersects(thisRect); + } + return false; +} + void CursorNavigationAttached::setHasCursor(bool hasCursor) { if (hasCursor != m_hasCursor) { diff --git a/plugin/cursornavigationattached.h b/plugin/cursornavigationattached.h index 1ae2119..1409a93 100644 --- a/plugin/cursornavigationattached.h +++ b/plugin/cursornavigationattached.h @@ -12,7 +12,7 @@ class QQuickWindow; class CursorNavigationAttached : public QObject { Q_OBJECT - //is available for cursor navigation + //is included for cursor navigation Q_PROPERTY(bool acceptsCursor READ acceptsCursor WRITE setAcceptsCursor NOTIFY acceptsCursorChanged) //indicates if item is currently selected, indicated also by activeFocus property Q_PROPERTY(bool hasCursor READ hasCursor NOTIFY hasCursorChanged) @@ -32,6 +32,11 @@ public: bool hasCursor() const; bool trapsCursor() const; QQuickItem *escapeTarget() const; + /* indicates if the item is currently available for the navigation. + * item might not be availble if it is disabled, invisible, outside of its + * parent's geometry or simply not accepting cursor + */ + bool available() const; QQuickItem *item() const; diff --git a/plugin/spatialnavigation360.cpp b/plugin/spatialnavigation360.cpp index f7d1e62..0e6d19b 100644 --- a/plugin/spatialnavigation360.cpp +++ b/plugin/spatialnavigation360.cpp @@ -153,12 +153,12 @@ CursorNavigationAttached* SpatialNavigation360::getNextCandidate( for (auto iter: candidates) { + if (!iter->available() || iter == currentItem) + continue; + const QRectF itemSceneRect = iter->item()->mapRectToScene( QRectF( 0, 0, iter->item()->width(), iter->item()->height() )); - if (iter == currentItem || !iter->item()->isVisible() || !iter->item()->isEnabled()) - continue; - if (isRectIncluded(quadrants, itemSceneRect, origin)) { std::pair<qreal,qreal> sector = getSector(itemSceneRect, origin); diff --git a/plugin/spatialnavigation4dir.cpp b/plugin/spatialnavigation4dir.cpp index bc1d8f8..8bccd7c 100644 --- a/plugin/spatialnavigation4dir.cpp +++ b/plugin/spatialnavigation4dir.cpp @@ -100,34 +100,32 @@ CursorNavigationAttached* SpatialNavigation4Dir::getNextCandidate( //item that is closest within the projection CursorNavigationAttached* inProjectionItem = nullptr; - qreal inProjectionItemDistance = -1; + float inProjectionItemDistance = -1; //item that is closest in the general direction, but not within projection CursorNavigationAttached* inDirectionItem = nullptr; - qreal inDirectionItemDistance = -1; + float inDirectionItemDistance = -1; for (auto candidate : candidates) { QQuickItem *candidateItem = candidate->item(); - if (!candidateItem->isVisible() || !candidateItem->isEnabled()) { - //qDebug() << "skipping a invisible/disabled item"; + if (!candidate->available() || candidate == currentItem) continue; - } //scene coords of the candidate QRectF candidateSceneRect = candidateItem->mapRectToScene( - QRect( 0, 0, + QRectF( 0, 0, candidateItem->width(), candidateItem->height() )); if (isInDirection(candidateSceneRect)) { if (isInProjection(candidateSceneRect)) { - int dist = distanceSquared(currentItemSceneRect,candidateSceneRect); + float dist = distanceSquared(currentItemSceneRect,candidateSceneRect); if (inProjectionItemDistance > dist || !inProjectionItem) { inProjectionItemDistance = dist; inProjectionItem = candidate; } } else if (!inProjectionItem) { - int dist = distanceSquared(currentItemSceneRect,candidateSceneRect); + float dist = distanceSquared(currentItemSceneRect,candidateSceneRect); if (inDirectionItemDistance > dist || !inDirectionItem) { inDirectionItemDistance = dist; |