diff --git a/src/qanDraggableCtrl.cpp b/src/qanDraggableCtrl.cpp index 073efb4e..474a4bdf 100644 --- a/src/qanDraggableCtrl.cpp +++ b/src/qanDraggableCtrl.cpp @@ -159,6 +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; if (_targetItem == nullptr || _target == nullptr) return; @@ -200,7 +201,6 @@ void DraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragSelec // If there is a selection, keep start position for all selected nodes. 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 +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; if (!_target || !_targetItem) @@ -338,7 +339,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..0963b5c4 100644 --- a/src/qanEdgeDraggableCtrl.cpp +++ b/src/qanEdgeDraggableCtrl.cpp @@ -112,8 +112,13 @@ void EdgeDraggableCtrl::beginDragMove(const QPointF& sceneDragPos, bool dragS { Q_UNUSED(dragSelection) Q_UNUSED(notify) - if (!_targetItem) + if (!_targetItem || + _target == nullptr) + return; + 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) @@ -202,18 +208,17 @@ void EdgeDraggableCtrl::dragMove(const QPointF& sceneDragPos, bool dragSelect if (graph == nullptr) return; 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/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..d169f920 100644 --- a/src/qanEdgeItem.cpp +++ b/src/qanEdgeItem.cpp @@ -77,10 +77,12 @@ 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); + } } auto EdgeItem::getGraph() const -> const qan::Graph* diff --git a/src/qanGraph.cpp b/src/qanGraph.cpp index 4034dcc4..8891d3c5 100644 --- a/src/qanGraph.cpp +++ b/src/qanGraph.cpp @@ -1436,11 +1436,9 @@ 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 return (_selectedNodes.size() + - _selectedGroups.size()) > 1 || - _selectedEdges.size() > 1; + _selectedGroups.size() + + _selectedEdges.size()) > 1; } std::vector Graph::getSelectedItems() const