diff options
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/cursornavigation.cpp | 113 | ||||
-rw-r--r-- | plugin/cursornavigation.h | 12 | ||||
-rw-r--r-- | plugin/cursornavigationattached.cpp | 102 | ||||
-rw-r--r-- | plugin/cursornavigationattached.h | 21 | ||||
-rw-r--r-- | plugin/inputadapter.cpp | 36 |
5 files changed, 153 insertions, 131 deletions
diff --git a/plugin/cursornavigation.cpp b/plugin/cursornavigation.cpp index 155a158..0a09ade 100644 --- a/plugin/cursornavigation.cpp +++ b/plugin/cursornavigation.cpp @@ -3,7 +3,6 @@ #include "spatialnavigation4dir.h" #include <QQuickWindow> #include <QQuickItem> -#include <QtMath> const char CursorNavigation::windowPropertyName[] = "cursor_navigation"; @@ -15,44 +14,60 @@ CursorNavigation::CursorNavigation(QQuickWindow *parent) ,m_rootItem(new CursorNavigationAttached(nullptr)) { m_rootItem->setParent(m_window->contentItem()); - - //m_algorithms.push_back(new SpatialNavigation4Dir()); + m_rootItem->m_cursorNavigation = this; connect(m_window, &QQuickWindow::activeFocusItemChanged, this, &CursorNavigation::onActiveFocusItemChanged); onActiveFocusItemChanged(); } -void CursorNavigation::move(qreal angle, qreal tolerance, bool discrete) +bool CursorNavigation::move(qreal angle, qreal tolerance, bool discrete) { - qreal a = qDegreesToRadians(angle); - qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); - _move(a, t, discrete); -} + CursorNavigationAttached *nextItem = find(angle, tolerance, discrete); -void CursorNavigation::move(const QVector2D& vector, qreal tolerance, bool discrete) -{ - qreal a = qAtan2(vector.y(), vector.x()); - qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); - _move(a, t, discrete); + if (nextItem) { + setCursorOnItem(nextItem); + return true; + } + return false; } CursorNavigationAttached *CursorNavigation::find(qreal angle, qreal tolerance, bool discrete) { - qreal a = qDegreesToRadians(angle); - qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); + CursorNavigationAttached *nextItem = nullptr; + CursorNavigationAttached *parent = m_currentItem ? + m_currentItem->m_parentNavigable : + m_rootItem; - return _find(a,t,discrete); -} + if (!m_currentItem) + return defaultItem(); -CursorNavigationAttached *CursorNavigation::find(const QVector2D& vector, qreal tolerance, bool discrete) -{ - qreal a = qAtan2(vector.y(), vector.x()); - qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); + qWarning() << "find next item, angle = " << angle << " tolerance = " << tolerance << " discrete = " << discrete; + + QList<CursorNavigationAttached*> candidates; + + do { + candidates.append(parent->m_children); - return _find(a,t,discrete); + 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); + } else { + nextItem = m_navigation360.getNextCandidate(candidates, m_currentItem, cmd); + } + + return nextItem; } -void CursorNavigation::action(Action action) +bool CursorNavigation::action(Action action) { qWarning() << "handleActionCommand, action= " << action; switch (action) { @@ -70,12 +85,12 @@ void CursorNavigation::action(Action action) * if we are already at the root item's children, nothing happens */ if (!m_currentItem) - break; + return false; QQuickItem *escapeTarget = m_currentItem->m_parentNavigable->escapeTarget(); if (!escapeTarget) { if (m_currentItem->m_parentNavigable == m_rootItem) { - break; + return false; } escapeTarget = m_currentItem->m_parentNavigable->m_parentNavigable->item(); } @@ -84,12 +99,13 @@ void CursorNavigation::action(Action action) escapeTarget->forceActiveFocus(); onActiveFocusItemChanged(); //escapeTarget->setFocus(true); - break; + return true; } default: break; } + return false; } CursorNavigationAttached *CursorNavigation::qmlAttachedProperties(QObject *object) @@ -202,51 +218,6 @@ void CursorNavigation::unregisterItem(CursorNavigationAttached* item) //TODO if the item that is being unregistered has children, they should be reassigned to the item's parent } -void CursorNavigation::_move(qreal angle, qreal tolerance, bool discrete) -{ - CursorNavigationAttached *nextItem = _find(angle, tolerance, discrete); - - if (nextItem) { - setCursorOnItem(nextItem); - } -} - -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; - - 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); - } else { - nextItem = m_navigation360.getNextCandidate(candidates, m_currentItem, cmd); - } - - return nextItem; -} - CursorNavigationAttached *CursorNavigation::defaultItem() { if (m_rootItem->m_children.size()) diff --git a/plugin/cursornavigation.h b/plugin/cursornavigation.h index f3a6f91..a32a357 100644 --- a/plugin/cursornavigation.h +++ b/plugin/cursornavigation.h @@ -20,13 +20,16 @@ class CursorNavigation : public QObject public: CursorNavigation(QQuickWindow *parent); + //pass input events forward to the current item + //void setMagnitude(qreal angle, qreal magnitude); + //void setMagnitude(const QVector2D& vector); //move the cursor - void move(qreal angle, qreal tolerance, bool discrete); - void move(const QVector2D& vector, qreal tolerance, bool discrete); + bool move(qreal angle, qreal tolerance, bool discrete); + bool move(const QVector2D& vector, qreal tolerance, bool discrete); //find the next item without moving the cursor CursorNavigationAttached *find(qreal angle, qreal tolerance, bool discrete); CursorNavigationAttached *find(const QVector2D& vector, qreal tolerance, bool discrete); - void action(Action action); + bool action(Action action); static CursorNavigationAttached *qmlAttachedProperties(QObject *object); @@ -40,8 +43,6 @@ private: void registerItem(CursorNavigationAttached* item); void unregisterItem(CursorNavigationAttached* item); - void _move(qreal angle, qreal tolerance, bool discrete); - CursorNavigationAttached *_find(qreal angle, qreal tolerance, bool discrete); CursorNavigationAttached *defaultItem(); private: @@ -55,6 +56,7 @@ private: CursorNavigationAttached *m_rootItem; friend class CursorNavigationAttached; + friend class InputAdapter; }; QML_DECLARE_TYPEINFO(CursorNavigation, QML_HAS_ATTACHED_PROPERTIES) diff --git a/plugin/cursornavigationattached.cpp b/plugin/cursornavigationattached.cpp index 2581920..ffa1b93 100644 --- a/plugin/cursornavigationattached.cpp +++ b/plugin/cursornavigationattached.cpp @@ -2,6 +2,7 @@ #include "cursornavigation.h" #include <QQuickItem> #include <QQuickWindow> +#include <QtMath> CursorNavigationAttached::CursorNavigationAttached(QQuickItem *parent) :QObject(parent), @@ -76,24 +77,49 @@ void CursorNavigationAttached::setEscapeTarget(QQuickItem *escapeTarget) emit escapeTargetChanged(m_escapeTarget); } +void CursorNavigationAttached::setMagnitude(qreal angle, qreal magnitude) +{ + if (m_cursorNavigation && m_cursorNavigation->m_currentItem) + m_cursorNavigation->m_currentItem->magnitudeChanged(angle, magnitude); +} + +void CursorNavigationAttached::setMagnitude(QVector2D vector) +{ + if (m_cursorNavigation && m_cursorNavigation->m_currentItem) + m_cursorNavigation->m_currentItem->magnitudeChanged( + qRadiansToDegrees(qAtan2(vector.y(), vector.x())), vector.length()); +} + void CursorNavigationAttached::move(qreal angle, qreal tolerance) { qWarning() << "move"; - if (m_cursorNavigation) - m_cursorNavigation->move(angle, tolerance, false); + qreal a = qDegreesToRadians(angle); + qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->move(a, t, false) && item) + item->moved(a,t); + } } void CursorNavigationAttached::move(QVector2D vector, qreal tolerance) { - qWarning() << "move"; - if (m_cursorNavigation) - m_cursorNavigation->move(vector, tolerance, false); + qWarning() << "move (vector)"; + qreal a = qAtan2(vector.y(), vector.x()); + qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->move(a, t, false) && item) + item->moved(a,t); + } } QQuickItem *CursorNavigationAttached::find(qreal angle, qreal tolerance) { + qreal a = qDegreesToRadians(angle); + qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); if (m_cursorNavigation) { - CursorNavigationAttached *item = m_cursorNavigation->find(angle, tolerance, false); + CursorNavigationAttached *item = m_cursorNavigation->find(a, t, false); if (item) return item->item(); } @@ -102,8 +128,10 @@ QQuickItem *CursorNavigationAttached::find(qreal angle, qreal tolerance) QQuickItem *CursorNavigationAttached::find(QVector2D vector, qreal tolerance) { + qreal a = qAtan2(vector.y(), vector.x()); + qreal t = qDegreesToRadians(qFabs(std::fmod(tolerance, 180))); if (m_cursorNavigation) { - CursorNavigationAttached *item = m_cursorNavigation->find(vector, tolerance, false); + CursorNavigationAttached *item = m_cursorNavigation->find(a, t, false); if (item) return item->item(); } @@ -112,50 +140,74 @@ QQuickItem *CursorNavigationAttached::find(QVector2D vector, qreal tolerance) void CursorNavigationAttached::moveUp() { - if (m_cursorNavigation) - m_cursorNavigation->move(-90, 0, true); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->move(qDegreesToRadians(-90.0f), 0, true) && item) + item->movedUp(); + } } void CursorNavigationAttached::moveDown() { - if (m_cursorNavigation) - m_cursorNavigation->move(90, 0, true); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->move(qDegreesToRadians(90.0f), 0, true) && item) + item->movedDown(); + } } void CursorNavigationAttached::moveRight() { - if (m_cursorNavigation) - m_cursorNavigation->move(0, 0, true); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->move(qDegreesToRadians(0.0f), 0, true) && item) + item->movedRight(); + } } void CursorNavigationAttached::moveLeft() { - if (m_cursorNavigation) - m_cursorNavigation->move(180, 0, true); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->move(qDegreesToRadians(180.0f), 0, true) && item) + item->movedLeft(); + } } void CursorNavigationAttached::activate() { - if (m_cursorNavigation) - m_cursorNavigation->action(Activate); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->action(Activate) && item) + item->activated(); + } } -void CursorNavigationAttached::forward() +void CursorNavigationAttached::moveForward() { - if (m_cursorNavigation) - m_cursorNavigation->action(Forward); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->action(Forward) && item) + item->movedForward(); + } } -void CursorNavigationAttached::back() +void CursorNavigationAttached::moveBack() { - if (m_cursorNavigation) - m_cursorNavigation->action(Back); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->action(Back) && item) + item->movedBack(); + } } void CursorNavigationAttached::escape() { - if (m_cursorNavigation) - m_cursorNavigation->action(Escape); + if (m_cursorNavigation) { + CursorNavigationAttached *item = m_cursorNavigation->m_currentItem; + if (m_cursorNavigation->action(Escape) && item) + item->escaped(); + } } void CursorNavigationAttached::onWindowChanged(QQuickWindow *window) diff --git a/plugin/cursornavigationattached.h b/plugin/cursornavigationattached.h index 1409a93..f3c729d 100644 --- a/plugin/cursornavigationattached.h +++ b/plugin/cursornavigationattached.h @@ -45,6 +45,12 @@ public slots: void setTrapsCursor(bool trapsCursor); void setEscapeTarget(QQuickItem * escapeTarget); + /* just for passing movement changes forward. does not move the cursor. + * events are received by the item that currently has the cursor + */ + void setMagnitude(qreal angle, qreal magnitude); + void setMagnitude(QVector2D vector); + void move(qreal angle, qreal tolerance = 0); void move(QVector2D vector, qreal tolerance = 0); @@ -57,8 +63,8 @@ public slots: void moveRight(); void moveLeft(); void activate(); - void forward(); - void back(); + void moveForward(); + void moveBack(); void escape(); @@ -69,6 +75,17 @@ signals: void escapeTargetChanged(QQuickItem * escapeTarget); + void magnitudeChanged(qreal angle, qreal magnitude); + void moved(qreal angle, qreal tolerance); + void movedUp(); + void movedDown(); + void movedRight(); + void movedLeft(); + void activated(); + void movedForward(); + void movedBack(); + void escaped(); + private slots: void onWindowChanged(QQuickWindow *window); diff --git a/plugin/inputadapter.cpp b/plugin/inputadapter.cpp index feb1373..52eba34 100644 --- a/plugin/inputadapter.cpp +++ b/plugin/inputadapter.cpp @@ -21,47 +21,39 @@ bool InputAdapter::eventFilter(QObject *object, QEvent *event) if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); return handleKeyEvent(keyEvent); - } else if (event->type() == QEvent::Wheel) { - QWheelEvent *wheelEvent = static_cast<QWheelEvent *>(event); - return handleWheelEvent(wheelEvent); - } else if (event->type() == QEvent::MouseMove) { - QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); - return handleMouseEvent(mouseEvent); } return false; } bool InputAdapter::handleKeyEvent(QKeyEvent *event) { - CursorNavigationCommand cmd; - //detect arrow keys, tabs, enter and esc switch (event->key()) { case Qt::Key_Left: - m_cursorNavigation->move(180, 0, true); + m_cursorNavigation->m_rootItem->moveLeft(); break; case Qt::Key_Right: - m_cursorNavigation->move(0, 0, true); + m_cursorNavigation->m_rootItem->moveRight(); break; case Qt::Key_Up: - m_cursorNavigation->move(-90, 0, true); + m_cursorNavigation->m_rootItem->moveUp(); break; case Qt::Key_Down: - m_cursorNavigation->move(90, 0, true); + m_cursorNavigation->m_rootItem->moveDown(); break; case Qt::Key_Return: case Qt::Key_Enter: - m_cursorNavigation->action(Activate); + m_cursorNavigation->m_rootItem->activate(); break; case Qt::BackButton: case Qt::Key_Escape: - m_cursorNavigation->action(Escape); + m_cursorNavigation->m_rootItem->escape(); break; case Qt::Key_Tab: - m_cursorNavigation->action(Forward); + m_cursorNavigation->m_rootItem->moveForward(); break; case Qt::Key_Backtab: - m_cursorNavigation->action(Back); + m_cursorNavigation->m_rootItem->moveBack(); break; default: return false; @@ -69,15 +61,3 @@ bool InputAdapter::handleKeyEvent(QKeyEvent *event) return true; } - -bool InputAdapter::handleMouseEvent(QMouseEvent *event) -{ - //interpret mouse movement as omnnidirectional joystick movements for testing purposes - return false; -} - -bool InputAdapter::handleWheelEvent(QWheelEvent *event) -{ - //turn wheel events into tabs - return false; -} |