diff options
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/cursornavigation.cpp | 35 | ||||
-rw-r--r-- | plugin/cursornavigation.h | 6 | ||||
-rw-r--r-- | plugin/cursornavigationalgorithm.h | 3 | ||||
-rw-r--r-- | plugin/cursornavigationattached.cpp | 56 | ||||
-rw-r--r-- | plugin/cursornavigationattached.h | 13 | ||||
-rw-r--r-- | plugin/plugin.pro | 2 | ||||
-rw-r--r-- | plugin/spatialnavigation360.cpp | 4 | ||||
-rw-r--r-- | plugin/spatialnavigation4dir.cpp | 4 |
8 files changed, 81 insertions, 42 deletions
diff --git a/plugin/cursornavigation.cpp b/plugin/cursornavigation.cpp index 71ea2d8..ebcd064 100644 --- a/plugin/cursornavigation.cpp +++ b/plugin/cursornavigation.cpp @@ -44,6 +44,8 @@ #include <QQuickItem> #include <QtMath> +Q_LOGGING_CATEGORY(cursorNavigationLog, "cursor.navigation") + const char CursorNavigation::windowPropertyName[] = "cursor_navigation"; CursorNavigation::CursorNavigation(QQuickWindow *parent) @@ -60,9 +62,9 @@ CursorNavigation::CursorNavigation(QQuickWindow *parent) onActiveFocusItemChanged(); } -bool CursorNavigation::move(qreal angle, qreal tolerance, bool discrete) +bool CursorNavigation::move(qreal angle, qreal offset, qreal tolerance, bool discrete) { - QQuickItem *foundItem = find(angle, tolerance, discrete); + QQuickItem *foundItem = find(angle + offset, tolerance, discrete); CursorNavigationAttached *nextItem = cursorNavigationAttachment(foundItem); if (nextItem) { @@ -77,14 +79,16 @@ bool CursorNavigation::move(qreal angle, qreal tolerance, bool discrete) QQuickItem *CursorNavigation::find(qreal angle, qreal tolerance, bool discrete) { - if (!m_currentItem) - return defaultItem()->item(); + if (!m_currentItem) { + auto defaultItemRef = defaultItem(); + return defaultItemRef ? defaultItemRef->item() : nullptr; + } if (m_currentItem->m_redirects.size()) { for (auto redirect : m_currentItem->m_redirects) { if (redirect->angleIsIncluded(angle)) { if (!redirect->target()) - qWarning() << "Redirect target is null"; + qCWarning(cursorNavigationLog) << "Redirect target is null"; return redirect->target(); } } @@ -120,7 +124,7 @@ QQuickItem *CursorNavigation::find(qreal angle, qreal tolerance, bool discrete) bool CursorNavigation::action(Action action) { - qWarning() << "handleActionCommand, action= " << action; + qCWarning(cursorNavigationLog) << "handleActionCommand, action= " << action; switch (action) { case Forward: break; @@ -145,7 +149,7 @@ bool CursorNavigation::action(Action action) } escapeTarget = m_currentItem->m_parentNavigable->m_parentNavigable->item(); } - qWarning() << "escaping, target = " << escapeTarget; + qCWarning(cursorNavigationLog) << "escaping, target = " << escapeTarget; setCursorOnItem(nullptr); escapeTarget->forceActiveFocus(); onActiveFocusItemChanged(); @@ -167,13 +171,12 @@ CursorNavigationAttached *CursorNavigation::qmlAttachedProperties(QObject *objec } if (!qobject_cast<QQuickItem *>(object)) { - qWarning("Cannot manage cursor for a non-Item!"); + qCWarning(cursorNavigationLog) << "Cannot manage cursor for a non-Item!"; return nullptr; } QQuickItem *item = static_cast<QQuickItem *>(object); - qWarning() << "Created a new CN attachment"; return new CursorNavigationAttached(item); } @@ -186,7 +189,7 @@ CursorNavigation *CursorNavigation::cursorNavigationForWindow(QQuickWindow *wind if (!oldCursorNavigation.isNull()) return oldCursorNavigation.value<CursorNavigation *>(); - qWarning() << "Created a new CN engine"; + qCWarning(cursorNavigationLog) << "Created a new CN engine"; CursorNavigation *cursorNavigation = new CursorNavigation(window); window->setProperty(windowPropertyName, QVariant::fromValue(cursorNavigation)); @@ -194,7 +197,7 @@ CursorNavigation *CursorNavigation::cursorNavigationForWindow(QQuickWindow *wind /*if (QQmlEngine *engine = cn->qmlEngine(window)) { engine->rootContext()->setContextProperty("_cursorNavigation", cn); } else { - qDebug() << "Couldn't find QQmlEngine"; + qCDebug(cursorNavigationLog) << "Couldn't find QQmlEngine"; }*/ return cursorNavigation; @@ -207,7 +210,6 @@ CursorNavigationAttached *CursorNavigation::cursorNavigationAttachment(QQuickIte void CursorNavigation::setCursorOnItem(CursorNavigationAttached *item) { - qWarning() << "set cursor on item " << item << " , currentItem " << m_currentItem; if (item != m_currentItem) { if (m_currentItem) { m_currentItem->setHasCursor(false); @@ -216,10 +218,8 @@ void CursorNavigation::setCursorOnItem(CursorNavigationAttached *item) if (item && item->acceptsCursor()) { item->setHasCursor(true); m_currentItem = item; - qWarning() << "Set cursor to " << item->item(); m_currentItem->item()->forceActiveFocus(); } else { - qWarning() << "Set cursor to NULL"; m_currentItem = nullptr; } } @@ -227,7 +227,8 @@ void CursorNavigation::setCursorOnItem(CursorNavigationAttached *item) void CursorNavigation::onActiveFocusItemChanged() { - qWarning() << "onActiveFocusItemChanged, item:" << m_window->activeFocusItem(); + qCWarning(cursorNavigationLog) << "onActiveFocusItemChanged, item:" + << m_window->activeFocusItem(); QQuickItem *item = m_window->activeFocusItem(); while (item) { @@ -243,7 +244,7 @@ void CursorNavigation::onActiveFocusItemChanged() void CursorNavigation::registerItem(CursorNavigationAttached* item) { - //qWarning() << "register item " << item; + //qCWarning(cursorNavigationLog) << "register item " << item; if (!item) return; @@ -285,7 +286,7 @@ void CursorNavigation::registerItem(CursorNavigationAttached* item) void CursorNavigation::unregisterItem(CursorNavigationAttached* item) { - //qWarning() << "unregister item " << item; + //qCWarning(cursorNavigationLog) << "unregister item " << item; if (item == m_currentItem) setCursorOnItem(nullptr); diff --git a/plugin/cursornavigation.h b/plugin/cursornavigation.h index 5829ff9..c73684e 100644 --- a/plugin/cursornavigation.h +++ b/plugin/cursornavigation.h @@ -49,8 +49,10 @@ #include <QObject> #include <qqml.h> #include <QStack> +#include <QtCore/QLoggingCategory> -//TODO remove useless debug prints and change over to categorized logging + +Q_DECLARE_LOGGING_CATEGORY(cursorNavigationLog) class QQuickItem; @@ -65,7 +67,7 @@ public: //void setMagnitude(qreal angle, qreal magnitude); //void setMagnitude(const QVector2D& vector); //move the cursor - bool move(qreal angle, qreal tolerance, bool discrete); + bool move(qreal angle, qreal offset, qreal tolerance, bool discrete); //find the next item without moving the cursor QQuickItem *find(qreal angle, qreal tolerance, bool discrete); bool action(Action action); diff --git a/plugin/cursornavigationalgorithm.h b/plugin/cursornavigationalgorithm.h index b0c1efd..06dbb21 100644 --- a/plugin/cursornavigationalgorithm.h +++ b/plugin/cursornavigationalgorithm.h @@ -42,6 +42,9 @@ #include <QList> #include "inputtypes.h" +#include <QtCore/QLoggingCategory> + +Q_DECLARE_LOGGING_CATEGORY(cursorNavigationLog) class CursorNavigationAttached; diff --git a/plugin/cursornavigationattached.cpp b/plugin/cursornavigationattached.cpp index 44bcdb9..c6a450f 100644 --- a/plugin/cursornavigationattached.cpp +++ b/plugin/cursornavigationattached.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018, 2019 Luxoft Sweden AB. All rights reserved. +** Copyright (C) 2018 - 2020 Luxoft Sweden AB. All rights reserved. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the cursor management module of the Qt Toolkit. @@ -41,12 +41,14 @@ #include "cursornavigation.h" #include <QQuickItem> #include <QQuickWindow> +#include <QVector2D> #include <QtMath> CursorNavigationAttached::CursorNavigationAttached(QQuickItem *parent) :QObject(parent), m_cursorNavigation(nullptr), m_parentNavigable(nullptr), +m_angleOffset(0.0), m_acceptsCursor(false), m_hasCursor(false), m_trapsCursor(false), @@ -57,18 +59,36 @@ m_escapeTarget(nullptr) if (parent && item() && item()->window()) { - qDebug() << "Item has a window already"; + qCDebug(cursorNavigationLog) << "Item has a window already"; onWindowChanged(item()->window()); } } CursorNavigationAttached::~CursorNavigationAttached() { - qWarning() << "~CursorNavigationAttached"; + qCWarning(cursorNavigationLog) << "~CursorNavigationAttached"; + + for (auto && child: m_children) { + child->m_parentNavigable = nullptr; + } + if (m_cursorNavigation) m_cursorNavigation->unregisterItem(this); } +double CursorNavigationAttached::angleOffset() const +{ + return m_angleOffset; +} + +void CursorNavigationAttached::setAngleOffset(double angleOffset) +{ + if (angleOffset != m_angleOffset) { + m_angleOffset = angleOffset; + emit angleOffsetChanged(m_angleOffset); + qCWarning(cursorNavigationLog) << "rotation changed " << m_angleOffset; + } +} bool CursorNavigationAttached::acceptsCursor() const { return m_acceptsCursor; @@ -122,7 +142,7 @@ void CursorNavigationAttached::setMagnitude(qreal angle, qreal magnitude) m_cursorNavigation->m_currentItem->magnitudeChanged(angle, magnitude); } -void CursorNavigationAttached::setMagnitude(QVector2D vector) +void CursorNavigationAttached::setMagnitude(const QVector2D &vector) { if (m_cursorNavigation && m_cursorNavigation->m_currentItem) m_cursorNavigation->m_currentItem->magnitudeChanged( @@ -132,23 +152,25 @@ void CursorNavigationAttached::setMagnitude(QVector2D vector) void CursorNavigationAttached::move(qreal angle, qreal tolerance) { if (m_cursorNavigation) { - qWarning() << "move"; + qCWarning(cursorNavigationLog) << "move"; qreal a = qDegreesToRadians(angle); qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; - if (m_cursorNavigation->move(a, t, false) && item) + double offset = item ? item->angleOffset() : 0.0; + if (m_cursorNavigation->move(a, offset, t, false) && item) item->moved(a,t); } } -void CursorNavigationAttached::move(QVector2D vector, qreal tolerance) +void CursorNavigationAttached::move(const QVector2D &vector, qreal tolerance) { if (m_cursorNavigation) { - qWarning() << "move (vector)"; + qCWarning(cursorNavigationLog) << "move (vector)"; qreal a = qAtan2(vector.y(), vector.x()); qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; - if (m_cursorNavigation->move(a, t, false) && item) + double offset = item ? item->angleOffset() : 0.0; + if (m_cursorNavigation->move(a, offset, t, false) && item) item->moved(a,t); } } @@ -163,7 +185,7 @@ QQuickItem *CursorNavigationAttached::find(qreal angle, qreal tolerance) return nullptr; } -QQuickItem *CursorNavigationAttached::find(QVector2D vector, qreal tolerance) +QQuickItem *CursorNavigationAttached::find(const QVector2D &vector, qreal tolerance) { if (m_cursorNavigation) { qreal a = qAtan2(vector.y(), vector.x()); @@ -177,7 +199,8 @@ void CursorNavigationAttached::moveUp() { if (m_cursorNavigation) { CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; - if (m_cursorNavigation->move(qDegreesToRadians(-90.0f), 0, true) && item) + double offset = item ? item->angleOffset() : 0.0; + if (m_cursorNavigation->move(qDegreesToRadians(-90.0f), offset, 0, true) && item) item->movedUp(); } } @@ -186,7 +209,8 @@ void CursorNavigationAttached::moveDown() { if (m_cursorNavigation) { CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; - if (m_cursorNavigation->move(qDegreesToRadians(90.0f), 0, true) && item) + double offset = item ? item->angleOffset() : 0.0; + if (m_cursorNavigation->move(qDegreesToRadians(90.0f), offset, 0, true) && item) item->movedDown(); } } @@ -195,7 +219,8 @@ void CursorNavigationAttached::moveRight() { if (m_cursorNavigation) { CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; - if (m_cursorNavigation->move(qDegreesToRadians(0.0f), 0, true) && item) + double offset = item ? item->angleOffset() : 0.0; + if (m_cursorNavigation->move(qDegreesToRadians(0.0f), offset, 0, true) && item) item->movedRight(); } } @@ -204,7 +229,8 @@ void CursorNavigationAttached::moveLeft() { if (m_cursorNavigation) { CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; - if (m_cursorNavigation->move(qDegreesToRadians(180.0f), 0, true) && item) + double offset = item ? item->angleOffset() : 0.0; + if (m_cursorNavigation->move(qDegreesToRadians(180.0f), offset, 0, true) && item) item->movedLeft(); } } @@ -252,7 +278,7 @@ QQuickItem *CursorNavigationAttached::currentItem() void CursorNavigationAttached::onWindowChanged(QQuickWindow *window) { - qDebug() << "window changed, window = " << window; + qCDebug(cursorNavigationLog) << "window changed, window = " << window; if (m_cursorNavigation && m_acceptsCursor) m_cursorNavigation->unregisterItem(this); diff --git a/plugin/cursornavigationattached.h b/plugin/cursornavigationattached.h index ac37de3..25a6769 100644 --- a/plugin/cursornavigationattached.h +++ b/plugin/cursornavigationattached.h @@ -49,10 +49,13 @@ class CursorNavigation; class QQuickItem; class QQuickWindow; +class QVector2D; class CursorNavigationAttached : public QObject { Q_OBJECT + //is used to add offsets to any directional movement of the cursor navigation + Q_PROPERTY(double angleOffset READ angleOffset WRITE setAngleOffset NOTIFY angleOffsetChanged) //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 @@ -67,6 +70,7 @@ public: CursorNavigationAttached(QQuickItem *parent); ~CursorNavigationAttached(); + double angleOffset() const; bool acceptsCursor() const; bool hasCursor() const; bool trapsCursor() const; @@ -82,6 +86,7 @@ public: QQuickItem *item() const; public slots: + void setAngleOffset(double angleOffset); void setAcceptsCursor(bool acceptsCursor); void setTrapsCursor(bool trapsCursor); void setEscapeTarget(QQuickItem * escapeTarget); @@ -90,14 +95,14 @@ public slots: * events are received by the item that currently has the cursor */ void setMagnitude(qreal angle, qreal magnitude); - void setMagnitude(QVector2D vector); + void setMagnitude(const QVector2D &vector); void move(qreal angle, qreal tolerance = 0); - void move(QVector2D vector, qreal tolerance = 0); + void move(const QVector2D &vector, qreal tolerance = 0); //find the next item with this move, without moving QQuickItem *find(qreal angle, qreal tolerance = 0); - QQuickItem *find(QVector2D vector, qreal tolerance = 0); + QQuickItem *find(const QVector2D &vector, qreal tolerance = 0); void moveUp(); void moveDown(); @@ -112,6 +117,7 @@ public slots: QQuickItem *currentItem(); signals: + void angleOffsetChanged(double angleOffset); void acceptsCursorChanged(bool acceptsCursor); void hasCursorChanged(bool hasCursor); void trapsCursorChanged(bool trapsCursor); @@ -144,6 +150,7 @@ private: CursorNavigationAttached *m_parentNavigable; QList<CursorNavigationAttached*> m_children; + double m_angleOffset; bool m_acceptsCursor; bool m_hasCursor; bool m_trapsCursor; diff --git a/plugin/plugin.pro b/plugin/plugin.pro index b5cdee7..952b52a 100644 --- a/plugin/plugin.pro +++ b/plugin/plugin.pro @@ -2,7 +2,7 @@ TARGET = cursornavigationplugin TEMPLATE = lib QT -= gui -QT += qml quick +QT += qml quick core CONFIG += plugin diff --git a/plugin/spatialnavigation360.cpp b/plugin/spatialnavigation360.cpp index 12f19ee..cc1f73e 100644 --- a/plugin/spatialnavigation360.cpp +++ b/plugin/spatialnavigation360.cpp @@ -154,7 +154,7 @@ CursorNavigationAttached* SpatialNavigation360::getNextCandidate( * -remember to use current item's coord system as the reference!!! */ - //qWarning() << "##### navigation360: start, angle = " << cmd.angle << " tolerance = " << cmd.angleTolerance; + //qCWarning(cursorNavigationLog) << "##### navigation360: start, angle = " << cmd.angle << " tolerance = " << cmd.angleTolerance; if (candidates.isEmpty()) return nullptr; @@ -218,7 +218,7 @@ CursorNavigationAttached* SpatialNavigation360::getNextCandidate( } } - //qWarning() << "##### end, directHit = " << + //qCWarning(cursorNavigationLog) << "##### end, directHit = " << // directHitItem << " withinTolerances = " << withinToleranceItem; if (directHitItem) diff --git a/plugin/spatialnavigation4dir.cpp b/plugin/spatialnavigation4dir.cpp index 5bd5b52..89b4a3a 100644 --- a/plugin/spatialnavigation4dir.cpp +++ b/plugin/spatialnavigation4dir.cpp @@ -69,10 +69,10 @@ CursorNavigationAttached* SpatialNavigation4Dir::getNextCandidate( if (candidates.isEmpty()) return nullptr; - qDebug() << "4-way algortihm called, no of candidates=" << candidates.count(); + qCDebug(cursorNavigationLog) << "4-way algortihm called, no of candidates=" << candidates.count(); if (!currentItem && candidates.size()) { - qDebug() << "the spatial chooser falling back to first child" << candidates.first(); + qCDebug(cursorNavigationLog) << "the spatial chooser falling back to first child" << candidates.first(); return candidates.first(); } |