Skip to content

Commit 8a41b1c

Browse files
zmothpaceholder
authored andcommitted
Drag all the selected models (#357)
The motion of the selected group has been broken in v3. The original behavior was to employ the default implementation of QGraphicsItem::mouseMoveEvent that moves all the selected objects together. Now the motion is wrapped into a MoveNodeCommand, we need to shift the selected group manually, one-by-one, by providing new positions to the Graph Model
1 parent c42d358 commit 8a41b1c

File tree

3 files changed

+35
-21
lines changed

3 files changed

+35
-21
lines changed

src/NodeGraphicsObject.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,6 @@ mouseMoveEvent(QGraphicsSceneMouseEvent* event)
337337
auto diff = event->pos() - event->lastPos();
338338

339339
nodeScene()->undoStack().push(new MoveNodeCommand(nodeScene(),
340-
_nodeId,
341340
diff));
342341

343342
event->accept();

src/UndoCommands.cpp

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -445,39 +445,51 @@ redo()
445445

446446
MoveNodeCommand::
447447
MoveNodeCommand(BasicGraphicsScene* scene,
448-
NodeId const nodeId,
449448
QPointF const &diff)
450449
: _scene(scene)
451-
, _nodeId(nodeId)
452450
, _diff(diff)
453451
{
452+
_selectedNodes.clear();
453+
for (QGraphicsItem * item : _scene->selectedItems())
454+
{
455+
if (auto n = qgraphicsitem_cast<NodeGraphicsObject*>(item))
456+
{
457+
_selectedNodes.insert(n->nodeId());
458+
}
459+
}
454460
}
455461

456462
void
457463
MoveNodeCommand::
458464
undo()
459465
{
460-
auto oldPos =
461-
_scene->graphModel().nodeData(_nodeId,
462-
NodeRole::Position).value<QPointF>();
466+
for (auto nodeId : _selectedNodes)
467+
{
468+
auto oldPos =
469+
_scene->graphModel().nodeData(nodeId,
470+
NodeRole::Position).value<QPointF>();
463471

464-
oldPos -= _diff;
472+
oldPos -= _diff;
465473

466-
_scene->graphModel().setNodeData(_nodeId, NodeRole::Position, oldPos);
474+
_scene->graphModel().setNodeData(nodeId, NodeRole::Position, oldPos);
475+
}
467476
}
468477

469478

470479
void
471480
MoveNodeCommand::
472481
redo()
473482
{
474-
auto oldPos =
475-
_scene->graphModel().nodeData(_nodeId,
476-
NodeRole::Position).value<QPointF>();
483+
for (auto nodeId : _selectedNodes)
484+
{
485+
auto oldPos =
486+
_scene->graphModel().nodeData(nodeId,
487+
NodeRole::Position).value<QPointF>();
477488

478-
oldPos += _diff;
489+
oldPos += _diff;
479490

480-
_scene->graphModel().setNodeData(_nodeId, NodeRole::Position, oldPos);
491+
_scene->graphModel().setNodeData(nodeId, NodeRole::Position, oldPos);
492+
}
481493
}
482494

483495

@@ -495,10 +507,12 @@ mergeWith(QUndoCommand const *c)
495507
{
496508
auto mc = static_cast<MoveNodeCommand const*>(c);
497509

498-
_diff += mc->_diff;
499-
500-
return true;
510+
if (_selectedNodes == mc->_selectedNodes)
511+
{
512+
_diff += mc->_diff;
513+
return true;
514+
}
515+
return false;
501516
}
502517

503-
//
504-
}
518+
} // namespace QtNodes

src/UndoCommands.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include <QtCore/QPointF>
77
#include <QtCore/QJsonObject>
88

9+
#include <unordered_set>
10+
911
namespace QtNodes
1012
{
1113

@@ -92,7 +94,6 @@ class MoveNodeCommand : public QUndoCommand
9294
{
9395
public:
9496
MoveNodeCommand(BasicGraphicsScene* scene,
95-
NodeId const nodeId,
9697
QPointF const &diff);
9798

9899
void undo() override;
@@ -111,9 +112,9 @@ class MoveNodeCommand : public QUndoCommand
111112

112113
private:
113114
BasicGraphicsScene* _scene;
114-
NodeId _nodeId;
115+
std::unordered_set<NodeId> _selectedNodes;
115116
QPointF _diff;
116117
};
117118

118119

119-
}
120+
} // namespace QtNodes

0 commit comments

Comments
 (0)