From 1b7b25b06aaac3889be21aaa34654af9f5ac0262 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20H=C3=B6ltt=C3=A4?= Date: Tue, 4 Dec 2018 15:39:53 +0100 Subject: Simplified the 4 way algorithm --- plugin/spatialnavigation360.cpp | 2 +- plugin/spatialnavigation4dir.cpp | 74 +++++++++++++--------------------------- 2 files changed, 24 insertions(+), 52 deletions(-) (limited to 'plugin') diff --git a/plugin/spatialnavigation360.cpp b/plugin/spatialnavigation360.cpp index 8dd0b20..bddcc5a 100644 --- a/plugin/spatialnavigation360.cpp +++ b/plugin/spatialnavigation360.cpp @@ -151,7 +151,7 @@ CursorNavigationAttached* SpatialNavigation360::getNextCandidate( //item that overlaps the center of the selector beam CursorNavigationAttached* directHitItem = nullptr; qreal directHitDistance = -1; - //item that overlaps selector beam does not overlap with the center + //item that overlaps selector beam, but does not overlap with the center CursorNavigationAttached* withinToleranceItem = nullptr; qreal withinToleranceDistance = -1; diff --git a/plugin/spatialnavigation4dir.cpp b/plugin/spatialnavigation4dir.cpp index ac72e4e..bc1d8f8 100644 --- a/plugin/spatialnavigation4dir.cpp +++ b/plugin/spatialnavigation4dir.cpp @@ -62,7 +62,6 @@ CursorNavigationAttached* SpatialNavigation4Dir::getNextCandidate( if (CursorNavigationCommand::angleIsBetween(cmd.angle, right_start, right_end) || CursorNavigationCommand::angleIsBetween(cmd.angle, left_start, left_end) ) { - //if (cmd == CursorNavigationCommand::Right || cmd == CursorNavigationCommand::Left) { isInProjection = [¤tItemSceneRect](const QRectF &itemRect) { return !( currentItemSceneRect.y() > itemRect.y()+itemRect.height() || @@ -81,7 +80,6 @@ CursorNavigationAttached* SpatialNavigation4Dir::getNextCandidate( } else if (CursorNavigationCommand::angleIsBetween(cmd.angle, left_end, right_start) || CursorNavigationCommand::angleIsBetween(cmd.angle, right_end, left_start)) { - //} else if (cmd == Command_Up || cmd == Command_Down) { isInProjection = [¤tItemSceneRect](const QRectF &itemRect) { return !( currentItemSceneRect.x() > itemRect.x()+itemRect.width() || currentItemSceneRect.x()+currentItemSceneRect.width() < itemRect.x() ); @@ -100,9 +98,12 @@ CursorNavigationAttached* SpatialNavigation4Dir::getNextCandidate( return nullptr; } - std::pair closest(nullptr,0); - - //qDebug() << "current: x=" << currentItemSceneRect.x() << " y=" << currentItemSceneRect.y(); + //item that is closest within the projection + CursorNavigationAttached* inProjectionItem = nullptr; + qreal inProjectionItemDistance = -1; + //item that is closest in the general direction, but not within projection + CursorNavigationAttached* inDirectionItem = nullptr; + qreal inDirectionItemDistance = -1; for (auto candidate : candidates) { @@ -117,57 +118,28 @@ CursorNavigationAttached* SpatialNavigation4Dir::getNextCandidate( QRect( 0, 0, candidateItem->width(), candidateItem->height() )); - //qDebug() << "x=" << candidateSceneRect.x() << " y=" << candidateSceneRect.y(); - - if (isInDirection(candidateSceneRect) && isInProjection(candidateSceneRect)) - { - //qDebug() << " is in direction and projection..."; - int dist = distanceSquared(currentItemSceneRect,candidateSceneRect); - if (closest.second > dist || !closest.first) - { - closest.second = dist; - closest.first = candidate; - } - } - } - - if (closest.first) - { - qDebug() << "chosen one: " << closest.first->item()->mapRectToScene( - QRect( 0, 0, - closest.first->item()->width(), closest.first->item()->height() )); - } - - if (!closest.first) { - //qDebug() << Q_FUNC_INFO << " looking for a candidate in the general direction..."; - - for (auto candidate : candidates) - { - QQuickItem *candidateItem = candidate->item(); - if (!candidateItem->isVisible() || !candidateItem->isEnabled()) { - //qDebug() << "skipping a invisible/disabled item"; - continue; - } - - //scene coords of the candidate - QRectF candidateSceneRect = candidateItem->mapRectToScene( - QRect( 0, 0, - candidateItem->width(), candidateItem->height() )); - - if (isInDirection(candidateSceneRect)) - { + if (isInDirection(candidateSceneRect)) { + if (isInProjection(candidateSceneRect)) { + int dist = distanceSquared(currentItemSceneRect,candidateSceneRect); + if (inProjectionItemDistance > dist || !inProjectionItem) + { + inProjectionItemDistance = dist; + inProjectionItem = candidate; + } + } else if (!inProjectionItem) { int dist = distanceSquared(currentItemSceneRect,candidateSceneRect); - if (closest.second > dist || !closest.first) + if (inDirectionItemDistance > dist || !inDirectionItem) { - closest.second = dist; - closest.first = candidate; + inDirectionItemDistance = dist; + inDirectionItem = candidate; } } } } - qDebug() << Q_FUNC_INFO << " selected candidate:" << closest.first; - - return closest.first; - + if (inProjectionItem) + { + return inProjectionItem; + } + return inDirectionItem; } -- cgit v1.2.3