From dd2888f303856b4156f406ea0654140b3be3d6c4 Mon Sep 17 00:00:00 2001 From: cneben Date: Tue, 20 Feb 2024 16:14:49 +0100 Subject: [PATCH 1/4] #223 Again again again. See what it broke ;) Signed-off-by: cneben --- src/qanDraggableCtrl.cpp | 7 +++++-- src/qanEdgeDraggableCtrl.cpp | 17 ++++++++++++++--- src/qanGraph.cpp | 8 ++++++-- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/qanDraggableCtrl.cpp b/src/qanDraggableCtrl.cpp index 073efb4e..c49b63a7 100644 --- a/src/qanDraggableCtrl.cpp +++ b/src/qanDraggableCtrl.cpp @@ -159,6 +159,8 @@ void DraggableCtrl::handleMouseReleaseEvent(QMouseEvent* event) void DraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragSelection, bool notify) { + qWarning() << "DraggableCtrl::beginDragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection << " notify=" << notify; + if (_targetItem == nullptr || _target == nullptr) return; @@ -198,9 +200,9 @@ void DraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragSelec _initialTargetScenePos = rootItem->mapFromItem(_targetItem, QPointF{0,0}); // If there is a selection, keep start position for all selected nodes. + qWarning() << "graph->hasMultipleSelection(): " << graph->hasMultipleSelection(); if (dragSelection && graph->hasMultipleSelection()) { - auto beginDragMoveSelected = [this, &sceneDragPos] (auto primitive) { // Call beginDragMove() on a given node or group if (primitive != nullptr && primitive->getItem() != nullptr && @@ -225,6 +227,7 @@ void DraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelection, // _graph must be configured (non nullptr) // _graph must have a container item for coordinate mapping // _target and _targetItem must be configured (true) + qWarning() << "DraggableCtrl::dragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection; if (!_target || !_targetItem) @@ -338,7 +341,7 @@ void DraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelection, if (primitive != nullptr && primitive->getItem() != nullptr && primitiveIsNotSelf) // Note: nodes inside a group or groups might be dragged too - primitive->getItem()->draggableCtrl().dragMove(sceneDragPos, false); + primitive->getItem()->draggableCtrl().dragMove(sceneDragPos, /*dragSelection=*/false); }; std::for_each(graph->getSelectedNodes().begin(), graph->getSelectedNodes().end(), dragMoveSelected); diff --git a/src/qanEdgeDraggableCtrl.cpp b/src/qanEdgeDraggableCtrl.cpp index 22c203e5..ce98bd80 100644 --- a/src/qanEdgeDraggableCtrl.cpp +++ b/src/qanEdgeDraggableCtrl.cpp @@ -114,6 +114,11 @@ void EdgeDraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragS Q_UNUSED(notify) if (!_targetItem) return; + // FIXME #223 + /*if (_target->getIsProtected() || // Prevent dragging of protected or locked objects + _target->getLocked()) + return;*/ + qWarning() << "EdgeDraggableCtrl::beginDragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection << " notify=" << notify; _targetItem->setDragged(true); _initialDragPos = sceneDragPos; @@ -157,6 +162,7 @@ void EdgeDraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragS void EdgeDraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelection, bool disableSnapToGrid, bool disableOrientation) { + qWarning() << "EdgeDraggableCtrl::dragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection; Q_UNUSED(dragSelection) Q_UNUSED(disableSnapToGrid) Q_UNUSED(disableOrientation) @@ -201,19 +207,24 @@ void EdgeDraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelect const auto graph = getGraph(); if (graph == nullptr) return; + qWarning() << "selected nodes="; + for (const auto& sn: graph->getSelectedNodes()) + qWarning() << " " << sn; + qWarning() << "selected edges="; + for (const auto& se: graph->getSelectedEdges()) + qWarning() << " " << se; if (dragSelection) { - auto dragMoveSelected = [this, &sceneDragPos] (auto primitive) { // Call dragMove() on a given node or group + auto dragMoveSelected = [this, &sceneDragPos] (auto primitive) { // Call dragMove() on a given node, group or edge const auto primitiveIsNotSelf = static_cast(primitive->getItem()) != static_cast(this->_targetItem.data()); if (primitive != nullptr && primitive->getItem() != nullptr && primitiveIsNotSelf) // Note: nodes inside a group or groups might be dragged too - primitive->getItem()->draggableCtrl().dragMove(sceneDragPos, false); + primitive->getItem()->draggableCtrl().dragMove(sceneDragPos, /*dragSelection=*/false); }; std::for_each(graph->getSelectedNodes().begin(), graph->getSelectedNodes().end(), dragMoveSelected); std::for_each(graph->getSelectedEdges().begin(), graph->getSelectedEdges().end(), dragMoveSelected); std::for_each(graph->getSelectedGroups().begin(), graph->getSelectedGroups().end(), dragMoveSelected); - //std::for_each(graph->getSelectedEdges().begin(), graph->getSelectedEdges().end(), dragMoveSelected); } } diff --git a/src/qanGraph.cpp b/src/qanGraph.cpp index 4034dcc4..3358bc7a 100644 --- a/src/qanGraph.cpp +++ b/src/qanGraph.cpp @@ -1438,9 +1438,13 @@ bool Graph::hasMultipleSelection() const { // Note 20231104: There is still no support for multiple edge selection, // but an heterogeneous selection of nodes and groups is a multiple selection - return (_selectedNodes.size() + + // FIXME #223 again + /*return (_selectedNodes.size() + _selectedGroups.size()) > 1 || - _selectedEdges.size() > 1; + _selectedEdges.size() > 1;*/ + return (_selectedNodes.size() + + _selectedGroups.size() + + _selectedEdges.size()) > 1; } std::vector Graph::getSelectedItems() const From 88941a1703302d49439a6f8d050c8d8c3f65f245 Mon Sep 17 00:00:00 2001 From: cneben Date: Tue, 20 Feb 2024 16:19:32 +0100 Subject: [PATCH 2/4] #223 Add protected/locked support for edge draggable ctrl. WIP. Signed-off-by: cneben --- src/qanDraggableCtrl.cpp | 6 ++---- src/qanEdgeDraggableCtrl.cpp | 10 +++++----- src/qanEdgeDraggableCtrl.h | 7 +++++++ src/qanEdgeItem.cpp | 5 ++++- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/qanDraggableCtrl.cpp b/src/qanDraggableCtrl.cpp index c49b63a7..474a4bdf 100644 --- a/src/qanDraggableCtrl.cpp +++ b/src/qanDraggableCtrl.cpp @@ -159,8 +159,7 @@ void DraggableCtrl::handleMouseReleaseEvent(QMouseEvent* event) void DraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragSelection, bool notify) { - qWarning() << "DraggableCtrl::beginDragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection << " notify=" << notify; - + //qWarning() << "DraggableCtrl::beginDragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection << " notify=" << notify; if (_targetItem == nullptr || _target == nullptr) return; @@ -200,7 +199,6 @@ void DraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragSelec _initialTargetScenePos = rootItem->mapFromItem(_targetItem, QPointF{0,0}); // If there is a selection, keep start position for all selected nodes. - qWarning() << "graph->hasMultipleSelection(): " << graph->hasMultipleSelection(); if (dragSelection && graph->hasMultipleSelection()) { auto beginDragMoveSelected = [this, &sceneDragPos] (auto primitive) { // Call beginDragMove() on a given node or group @@ -227,7 +225,7 @@ void DraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelection, // _graph must be configured (non nullptr) // _graph must have a container item for coordinate mapping // _target and _targetItem must be configured (true) - qWarning() << "DraggableCtrl::dragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection; + //qWarning() << "DraggableCtrl::dragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection; if (!_target || !_targetItem) diff --git a/src/qanEdgeDraggableCtrl.cpp b/src/qanEdgeDraggableCtrl.cpp index ce98bd80..42424c2f 100644 --- a/src/qanEdgeDraggableCtrl.cpp +++ b/src/qanEdgeDraggableCtrl.cpp @@ -112,13 +112,13 @@ void EdgeDraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragS { Q_UNUSED(dragSelection) Q_UNUSED(notify) - if (!_targetItem) + if (!_targetItem || + _target == nullptr) return; - // FIXME #223 - /*if (_target->getIsProtected() || // Prevent dragging of protected or locked objects + if (_target->getIsProtected() || // Prevent dragging of protected or locked objects _target->getLocked()) - return;*/ - qWarning() << "EdgeDraggableCtrl::beginDragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection << " notify=" << notify; + return; + //qWarning() << "EdgeDraggableCtrl::beginDragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection << " notify=" << notify; _targetItem->setDragged(true); _initialDragPos = sceneDragPos; diff --git a/src/qanEdgeDraggableCtrl.h b/src/qanEdgeDraggableCtrl.h index e1519e0c..5b8db539 100644 --- a/src/qanEdgeDraggableCtrl.h +++ b/src/qanEdgeDraggableCtrl.h @@ -61,6 +61,13 @@ class EdgeDraggableCtrl : public qan::AbstractDraggableCtrl virtual ~EdgeDraggableCtrl() override = default; EdgeDraggableCtrl(const EdgeDraggableCtrl&) = delete; +public: + inline auto getTarget() noexcept -> qan::Edge* { return _target.data(); } + inline auto getTarget() const noexcept -> const qan::Edge* { return _target.data(); } + inline auto setTarget(qan::Edge* target) noexcept { _target = target; } +private: + QPointer _target{nullptr}; + public: inline auto getTargetItem() noexcept -> qan::EdgeItem* { return _targetItem.data(); } inline auto getTargetItem() const noexcept -> const qan::EdgeItem* { return _targetItem.data(); } diff --git a/src/qanEdgeItem.cpp b/src/qanEdgeItem.cpp index d099885c..cb86274b 100644 --- a/src/qanEdgeItem.cpp +++ b/src/qanEdgeItem.cpp @@ -79,8 +79,11 @@ auto EdgeItem::setEdge(qan::Edge* edge) noexcept -> void { _edge = edge; if (edge != nullptr && - edge->getItem() != this) + edge->getItem() != this) { edge->setItem(this); + const auto edgeDraggableCtrl = static_cast(_draggableCtrl.get()); + edgeDraggableCtrl->setTarget(edge); + } } auto EdgeItem::getGraph() const -> const qan::Graph* From baa5f3b07b5e6967da3fc82b540db149a0d066a5 Mon Sep 17 00:00:00 2001 From: cneben Date: Tue, 20 Feb 2024 16:23:04 +0100 Subject: [PATCH 3/4] #223 Multiple edge/node/group selection dragging working... Signed-off-by: cneben --- src/qanEdgeDraggableCtrl.cpp | 8 +------- src/qanEdgeItem.cpp | 5 ++--- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/qanEdgeDraggableCtrl.cpp b/src/qanEdgeDraggableCtrl.cpp index 42424c2f..0963b5c4 100644 --- a/src/qanEdgeDraggableCtrl.cpp +++ b/src/qanEdgeDraggableCtrl.cpp @@ -162,7 +162,7 @@ void EdgeDraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragS void EdgeDraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelection, bool disableSnapToGrid, bool disableOrientation) { - qWarning() << "EdgeDraggableCtrl::dragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection; + //qWarning() << "EdgeDraggableCtrl::dragMove(): target=" << getTargetItem() << " dragSelection=" << dragSelection; Q_UNUSED(dragSelection) Q_UNUSED(disableSnapToGrid) Q_UNUSED(disableOrientation) @@ -207,12 +207,6 @@ void EdgeDraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelect const auto graph = getGraph(); if (graph == nullptr) return; - qWarning() << "selected nodes="; - for (const auto& sn: graph->getSelectedNodes()) - qWarning() << " " << sn; - qWarning() << "selected edges="; - for (const auto& se: graph->getSelectedEdges()) - qWarning() << " " << se; if (dragSelection) { auto dragMoveSelected = [this, &sceneDragPos] (auto primitive) { // Call dragMove() on a given node, group or edge const auto primitiveIsNotSelf = static_cast(primitive->getItem()) != diff --git a/src/qanEdgeItem.cpp b/src/qanEdgeItem.cpp index cb86274b..d169f920 100644 --- a/src/qanEdgeItem.cpp +++ b/src/qanEdgeItem.cpp @@ -77,9 +77,8 @@ auto EdgeItem::getEdge() noexcept -> qan::Edge* { return _edge.data(); } auto EdgeItem::getEdge() const noexcept -> const qan::Edge* { return _edge.data(); } auto EdgeItem::setEdge(qan::Edge* edge) noexcept -> void { - _edge = edge; - if (edge != nullptr && - edge->getItem() != this) { + if (_edge != edge) { + _edge = edge; edge->setItem(this); const auto edgeDraggableCtrl = static_cast(_draggableCtrl.get()); edgeDraggableCtrl->setTarget(edge); From f426f2e65446d12cb81c1278ccc21f4cd8872a84 Mon Sep 17 00:00:00 2001 From: cneben Date: Tue, 20 Feb 2024 16:24:44 +0100 Subject: [PATCH 4/4] #223 Polish / cosmetic. Signed-off-by: cneben --- src/qanGraph.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/qanGraph.cpp b/src/qanGraph.cpp index 3358bc7a..8891d3c5 100644 --- a/src/qanGraph.cpp +++ b/src/qanGraph.cpp @@ -1436,12 +1436,6 @@ bool Graph::hasSelection() const bool Graph::hasMultipleSelection() const { - // Note 20231104: There is still no support for multiple edge selection, - // but an heterogeneous selection of nodes and groups is a multiple selection - // FIXME #223 again - /*return (_selectedNodes.size() + - _selectedGroups.size()) > 1 || - _selectedEdges.size() > 1;*/ return (_selectedNodes.size() + _selectedGroups.size() + _selectedEdges.size()) > 1;