aboutsummaryrefslogtreecommitdiffstats
path: root/plugin/cursornavigationattached.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/cursornavigationattached.cpp')
-rw-r--r--plugin/cursornavigationattached.cpp64
1 files changed, 49 insertions, 15 deletions
diff --git a/plugin/cursornavigationattached.cpp b/plugin/cursornavigationattached.cpp
index 6e208d5..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();
}
}
@@ -242,9 +268,17 @@ void CursorNavigationAttached::escape()
}
}
+QQuickItem *CursorNavigationAttached::currentItem()
+{
+ if (m_cursorNavigation && m_cursorNavigation->m_currentItem) {
+ return m_cursorNavigation->m_currentItem->item();
+ }
+ return nullptr;
+}
+
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);