Skip to content

Commit 4767ddb

Browse files
committed
Implement copy and paste commands
1 parent 0d6c318 commit 4767ddb

File tree

4 files changed

+303
-150
lines changed

4 files changed

+303
-150
lines changed

include/QtNodes/internal/GraphicsView.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ public Q_SLOTS:
7070
void
7171
onDuplicateSelectedObjects();
7272

73+
void
74+
onCopySelectedObjects();
75+
76+
void
77+
onPasteObjects();
78+
7379
Q_SIGNALS:
7480
void
7581
scaleChanged(double scale);
@@ -103,10 +109,16 @@ public Q_SLOTS:
103109
BasicGraphicsScene*
104110
nodeScene();
105111

112+
/// Computes scene position for pasting the copied/duplicated node groups.
113+
QPointF
114+
scenePastePosition();
115+
106116
private:
107117
QAction* _clearSelectionAction = nullptr;
108118
QAction* _deleteSelectionAction = nullptr;
109119
QAction* _duplicateSelectionAction = nullptr;
120+
QAction* _copySelectionAction = nullptr;
121+
QAction* _pasteAction = nullptr;
110122

111123
QPointF _clickPos;
112124
ScaleRange _scaleRange;

src/GraphicsView.cpp

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ GraphicsView(QWidget* parent)
3232
, _clearSelectionAction(Q_NULLPTR)
3333
, _deleteSelectionAction(Q_NULLPTR)
3434
, _duplicateSelectionAction(Q_NULLPTR)
35+
, _copySelectionAction(Q_NULLPTR)
36+
, _pasteAction(Q_NULLPTR)
3537
{
3638
setDragMode(QGraphicsView::ScrollHandDrag);
3739
setRenderHint(QPainter::Antialiasing);
@@ -128,6 +130,34 @@ setScene(BasicGraphicsScene* scene)
128130
addAction(_duplicateSelectionAction);
129131
}
130132

133+
{
134+
delete _copySelectionAction;
135+
_copySelectionAction = new QAction(QStringLiteral("Copy Selection"), this);
136+
_copySelectionAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut);
137+
_copySelectionAction->setShortcut(QKeySequence(QKeySequence::Copy));
138+
connect(_copySelectionAction,
139+
&QAction::triggered,
140+
this,
141+
&GraphicsView::onCopySelectedObjects);
142+
143+
addAction(_copySelectionAction);
144+
145+
}
146+
147+
{
148+
delete _pasteAction;
149+
_pasteAction = new QAction(QStringLiteral("Copy Selection"), this);
150+
_pasteAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut);
151+
_pasteAction->setShortcut(QKeySequence(QKeySequence::Paste));
152+
connect(_pasteAction,
153+
&QAction::triggered,
154+
this,
155+
&GraphicsView::onPasteObjects);
156+
157+
addAction(_pasteAction);
158+
159+
}
160+
131161

132162
auto undoAction = scene->undoStack().createUndoAction(this, tr("&Undo"));
133163
undoAction->setShortcuts(QKeySequence::Undo);
@@ -310,15 +340,27 @@ void
310340
GraphicsView::
311341
onDuplicateSelectedObjects()
312342
{
313-
QPoint origin = mapFromGlobal(QCursor::pos());
343+
QPointF const pastePosition = scenePastePosition();
314344

315-
QRect const viewRect = rect();
316-
if (!viewRect.contains(origin))
317-
origin = viewRect.center();
345+
nodeScene()->undoStack().push(new CopyCommand(nodeScene()));
346+
nodeScene()->undoStack().push(new PasteCommand(nodeScene(), pastePosition));
347+
}
318348

319-
QPointF relativeOrigin = mapToScene(origin);
320349

321-
nodeScene()->undoStack().push(new DuplicateCommand(nodeScene(), relativeOrigin));
350+
void
351+
GraphicsView::
352+
onCopySelectedObjects()
353+
{
354+
nodeScene()->undoStack().push(new CopyCommand(nodeScene()));
355+
}
356+
357+
358+
void
359+
GraphicsView::
360+
onPasteObjects()
361+
{
362+
QPointF const pastePosition = scenePastePosition();
363+
nodeScene()->undoStack().push(new PasteCommand(nodeScene(), pastePosition));
322364
}
323365

324366

@@ -453,3 +495,16 @@ nodeScene()
453495
return dynamic_cast<BasicGraphicsScene*>(scene());
454496
}
455497

498+
499+
QPointF
500+
GraphicsView::
501+
scenePastePosition()
502+
{
503+
QPoint origin = mapFromGlobal(QCursor::pos());
504+
505+
QRect const viewRect = rect();
506+
if (!viewRect.contains(origin))
507+
origin = viewRect.center();
508+
509+
return mapToScene(origin);
510+
}

0 commit comments

Comments
 (0)