Skip to content

Commit

Permalink
Merge pull request #224 from cneben/b/#223-edges-selection
Browse files Browse the repository at this point in the history
B/#223 edges selection
  • Loading branch information
cneben committed Feb 20, 2024
2 parents f6f6b6a + f426f2e commit de076f9
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 13 deletions.
5 changes: 3 additions & 2 deletions src/qanDraggableCtrl.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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 &&
Expand All @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
13 changes: 9 additions & 4 deletions src/qanEdgeDraggableCtrl.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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<QQuickItem*>(primitive->getItem()) !=
static_cast<QQuickItem*>(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);
}
}

Expand Down
7 changes: 7 additions & 0 deletions src/qanEdgeDraggableCtrl.h
Expand Up @@ -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<qan::Edge> _target{nullptr};

public:
inline auto getTargetItem() noexcept -> qan::EdgeItem* { return _targetItem.data(); }
inline auto getTargetItem() const noexcept -> const qan::EdgeItem* { return _targetItem.data(); }
Expand Down
8 changes: 5 additions & 3 deletions src/qanEdgeItem.cpp
Expand Up @@ -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<EdgeDraggableCtrl*>(_draggableCtrl.get());
edgeDraggableCtrl->setTarget(edge);
}
}

auto EdgeItem::getGraph() const -> const qan::Graph*
Expand Down
6 changes: 2 additions & 4 deletions src/qanGraph.cpp
Expand Up @@ -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<QQuickItem*> Graph::getSelectedItems() const
Expand Down

0 comments on commit de076f9

Please sign in to comment.