void KisCutCopyActionFactory::run(bool willCut, KisView2 *view) { KisImageSP image = view->image(); bool haveShapesSelected = view->selectionManager()->haveShapesSelected(); if (haveShapesSelected) { #ifdef __GNUC__ #warning "Add saving of XML data for Cut/Copy of shapes" #endif image->barrierLock(); if (willCut) { view->canvasBase()->toolProxy()->cut(); } else { view->canvasBase()->toolProxy()->copy(); } image->unlock(); } else { KisNodeSP node = view->activeNode(); if (!node) return; image->barrierLock(); ActionHelper::copyFromDevice(view, node->paintDevice()); image->unlock(); KUndo2Command *command = 0; if (willCut && node->isEditable()) { struct ClearSelection : public KisTransactionBasedCommand { ClearSelection(KisNodeSP node, KisSelectionSP sel) : m_node(node), m_sel(sel) {} KisNodeSP m_node; KisSelectionSP m_sel; KUndo2Command* paint() { KisTransaction transaction("", m_node->paintDevice()); m_node->paintDevice()->clearSelection(m_sel); m_node->setDirty(m_sel->selectedRect()); return transaction.endAndTake(); } }; command = new ClearSelection(node, view->selection()); } QString actionName = willCut ? i18n("Cut") : i18n("Copy"); KisProcessingApplicator *ap = beginAction(view, actionName); if (command) { ap->applyCommand(command, KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::NORMAL); } KisOperationConfiguration config(id()); config.setProperty("will-cut", willCut); endAction(ap, config.toXML()); } }