From 7cefb8d8bdc2d6cd6306eb6bca30b71a7290f35b Mon Sep 17 00:00:00 2001 From: cneben Date: Mon, 26 Dec 2022 21:26:00 +0100 Subject: [PATCH] #185 Fix qan::EdgeDraggableCtrl for new snap to grid support. Partial FIX. WIP. Signed-off-by: cneben --- src/qanDraggableCtrl.cpp | 2 -- src/qanEdgeDraggableCtrl.cpp | 25 +++++++++++++------------ src/qanEdgeDraggableCtrl.h | 12 +++++++----- src/qanEdgeItem.h | 2 +- src/qanNodeItem.h | 2 +- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/qanDraggableCtrl.cpp b/src/qanDraggableCtrl.cpp index 19e3ac49..563d4ca9 100644 --- a/src/qanDraggableCtrl.cpp +++ b/src/qanDraggableCtrl.cpp @@ -130,8 +130,6 @@ bool DraggableCtrl::handleMouseMoveEvent(QMouseEvent* event) const auto sceneDragPos = rootItem->mapFromGlobal(event->globalPos()); if (!_targetItem->getDragged()) { // Project in scene rect (for example is a node is part of a group) - //const auto sceneTargetPos = rootItem->mapFromItem(_targetItem, QPointF{0,0}); - //_initialTargetPos = sceneTargetPos; beginDragMove(sceneDragPos, _targetItem->getSelected()); return true; } else { diff --git a/src/qanEdgeDraggableCtrl.cpp b/src/qanEdgeDraggableCtrl.cpp index 8cd63227..b47e0bb7 100644 --- a/src/qanEdgeDraggableCtrl.cpp +++ b/src/qanEdgeDraggableCtrl.cpp @@ -86,14 +86,12 @@ bool EdgeDraggableCtrl::handleMouseMoveEvent(QMouseEvent* event) const auto rootItem = graph->getContainerItem(); if (rootItem != nullptr && // Root item exist, left button is pressed and the target item event->buttons().testFlag(Qt::LeftButton)) { // is draggable and not collapsed - const auto globalPos = rootItem->mapFromGlobal(event->globalPos()); + const auto sceneDragPos = rootItem->mapFromGlobal(event->globalPos()); if (!_targetItem->getDragged()) { - beginDragMove(globalPos, false); // false = no selection (no edge selection support) + beginDragMove(sceneDragPos, false); // false = no selection (no edge selection support) return true; } else { - const auto delta = globalPos - _dragLastPos; - _dragLastPos = globalPos; - dragMove(delta, false); // false = no selection (no edge selection support) + dragMove(sceneDragPos, false); // false = no selection (no edge selection support) return true; } } @@ -110,14 +108,17 @@ void EdgeDraggableCtrl::handleMouseReleaseEvent(QMouseEvent* event) endDragMove(); } -void EdgeDraggableCtrl::beginDragMove(const QPointF& dragInitialMousePos, bool dragSelection) +void EdgeDraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragSelection) { Q_UNUSED(dragSelection) if (!_targetItem) return; _targetItem->setDragged(true); - _dragLastPos = dragInitialMousePos; + _initialDragPos = sceneDragPos; + const auto rootItem = getGraph()->getContainerItem(); + if (rootItem != nullptr) // Project in scene rect (for example is a node is part of a group) + _initialTargetPos = rootItem->mapFromItem(_targetItem, QPointF{0,0}); // Get target edge adjacent nodes auto src = _targetItem->getSourceItem() != nullptr && @@ -127,12 +128,12 @@ void EdgeDraggableCtrl::beginDragMove(const QPointF& dragInitialMousePos, boo _targetItem->getDestinationItem()->getNode() != nullptr ? _targetItem->getDestinationItem()->getNode()->getItem() : nullptr; if (src != nullptr) - src->draggableCtrl().beginDragMove(dragInitialMousePos, false); + src->draggableCtrl().beginDragMove(sceneDragPos, false); if (dst != nullptr) - dst->draggableCtrl().beginDragMove(dragInitialMousePos, false); + dst->draggableCtrl().beginDragMove(sceneDragPos, false); } -void EdgeDraggableCtrl::dragMove(const QPointF& delta, bool dragSelection) +void EdgeDraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelection) { Q_UNUSED(dragSelection) // PRECONDITIONS: @@ -147,9 +148,9 @@ void EdgeDraggableCtrl::dragMove(const QPointF& delta, bool dragSelection) _targetItem->getDestinationItem()->getNode() != nullptr ? _targetItem->getDestinationItem()->getNode()->getItem() : nullptr; if (src != nullptr) - src->draggableCtrl().dragMove(delta, false); + src->draggableCtrl().dragMove(sceneDragPos, false); if (dst != nullptr) - dst->draggableCtrl().dragMove(delta, false); + dst->draggableCtrl().dragMove(sceneDragPos, false); } void EdgeDraggableCtrl::endDragMove(bool dragSelection) diff --git a/src/qanEdgeDraggableCtrl.h b/src/qanEdgeDraggableCtrl.h index 42bfaeca..f20cb839 100644 --- a/src/qanEdgeDraggableCtrl.h +++ b/src/qanEdgeDraggableCtrl.h @@ -67,7 +67,7 @@ class EdgeDraggableCtrl : public qan::AbstractDraggableCtrl inline auto getTargetItem() const noexcept -> const qan::EdgeItem* { return _targetItem.data(); } inline auto setTargetItem(qan::EdgeItem* targetItem) noexcept { _targetItem = targetItem; } private: - QPointer _targetItem{nullptr}; + QPointer _targetItem; protected: //! Utility to return a safe _targetItem->getGraph(). @@ -90,14 +90,16 @@ class EdgeDraggableCtrl : public qan::AbstractDraggableCtrl public: //! \c dragInitialMousePos in window coordinate system. - virtual void beginDragMove(const QPointF& dragInitialMousePos, bool dragSelection = true) override; + virtual void beginDragMove(const QPointF& sceneDragPos, bool dragSelection = true) override; //! \c delta in scene coordinate system. - virtual void dragMove(const QPointF& delta, bool dragSelection = true) override; + virtual void dragMove(const QPointF& sceneDragPos, bool dragSelection = true) override; virtual void endDragMove(bool dragSelection = true) override; private: - //! Internal position cache. - QPointF _dragLastPos{0., 0.}; + //! Internal (mouse) initial dragging position. + QPointF _initialDragPos{0., 0.}; + //! Internal (target) initial dragging position. + QPointF _initialTargetPos{0., 0.}; //@} //------------------------------------------------------------------------- }; diff --git a/src/qanEdgeItem.h b/src/qanEdgeItem.h index 509f414f..93ed6f4f 100644 --- a/src/qanEdgeItem.h +++ b/src/qanEdgeItem.h @@ -445,7 +445,7 @@ private slots: * * Default to false. */ - bool _draggable = false; + bool _draggable = true; public: //! \copydoc qan::Draggable::_dragged diff --git a/src/qanNodeItem.h b/src/qanNodeItem.h index 43eafa0a..4cc9e655 100644 --- a/src/qanNodeItem.h +++ b/src/qanNodeItem.h @@ -297,7 +297,7 @@ protected slots: DragOrientation getDragOrientation() const noexcept { return _dragOrientation; } protected: //! \copydoc getDragOrientation() - DragOrientation _dragOrientation = DragOrientation::All; + DragOrientation _dragOrientation = DragOrientation::DragAll; signals: //! \copydoc getDragOrientation() void dragOrientationChanged();