@@ -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
310340GraphicsView::
311341onDuplicateSelectedObjects ()
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