Krita Source Code Documentation
Loading...
Searching...
No Matches
KisCutCopyActionFactory Struct Reference

#include <kis_selection_action_factories.h>

+ Inheritance diagram for KisCutCopyActionFactory:

Public Types

enum  Flag { None = 0x0 , CutClip = 0x1 , SharpClip = 0x2 }
 

Public Member Functions

 KisCutCopyActionFactory ()
 
void run (Flags flags, KisViewManager *view)
 
void runFromXML (KisViewManager *view, const KisOperationConfiguration &config) override
 
- Public Member Functions inherited from KisOperation
QString id () const
 
 KisOperation (const QString &id)
 
virtual ~KisOperation ()
 

Additional Inherited Members

- Protected Member Functions inherited from KisOperation
KisProcessingApplicatorbeginAction (KisViewManager *view, const KUndo2MagicString &actionName)
 
void endAction (KisProcessingApplicator *applicator, const QString &xmlData)
 

Detailed Description

Definition at line 57 of file kis_selection_action_factories.h.

Member Enumeration Documentation

◆ Flag

Constructor & Destructor Documentation

◆ KisCutCopyActionFactory()

KisCutCopyActionFactory::KisCutCopyActionFactory ( )
inline

Definition at line 65 of file kis_selection_action_factories.h.

65: KisOperation("cut-copy-ui-action") {}
KisOperation(const QString &id)

Member Function Documentation

◆ run()

void KisCutCopyActionFactory::run ( Flags flags,
KisViewManager * view )

Make sure that we use tryBarrierLock() here because it does not cause requestStrokeEnd() to be called in the tools, hence does not prevent disruptions in the text tool.

Definition at line 300 of file kis_selection_action_factories.cpp.

301{
302 KisImageSP image = view->image();
303 if (!image) return;
304
305 if (!view->blockUntilOperationsFinished(image)) return;
306
307 // Reference layers is a fake node, so it isn't added to the layer stack, this results in KisSelectedShapesProxy not
308 // being aware of the active shapeManager and its selected shapes.
309 const auto currentToolHasSelection =
310 view->canvasBase()->toolProxy()->hasSelection();
311
312 const bool haveShapesSelected =
314
315 KisSelectionSP selection = view->selection();
316
317 const bool skipShapes = selection && !currentToolHasSelection;
318
319 if (!skipShapes && !flags.testFlag(SharpClip) && (haveShapesSelected || currentToolHasSelection)) {
320 // XXX: "Add saving of XML data for Cut/Copy of shapes"
321
327 KisImageBarrierLock lock(image, std::try_to_lock);
328 if (!lock.owns_lock()) return;
329
330 if (flags & CutClip) {
331 view->canvasBase()->toolProxy()->cut();
332 } else {
333 view->canvasBase()->toolProxy()->copy();
334 }
335 } else if (selection) {
336 KisNodeList selectedNodes = view->nodeManager()->selectedNodes();
337
338 KisNodeList masks;
339 Q_FOREACH (KisNodeSP node, selectedNodes) {
340 if (node->inherits("KisMask")) {
341 masks.append(node);
342 }
343 }
344
345 selectedNodes = KisLayerUtils::sortAndFilterMergeableInternalNodes(selectedNodes);
346
347 KisNodeList nodes;
348 Q_FOREACH (KisNodeSP node, selectedNodes) {
349 KisNodeSP dupNode;
350 if (node->inherits("KisShapeLayer") || node->inherits("KisFileLayer")) {
351 KisPaintDeviceSP dev = new KisPaintDevice(*node->projection());
352 // might have to change node's name (vector to paint layer)
353 dupNode = new KisPaintLayer(image, node->name(), node->opacity(), dev);
354 } else {
355 dupNode = node->clone();
356 }
357 nodes.append(dupNode);
358 }
359
360 Q_FOREACH (KisNodeSP node, nodes) {
361 KisLayerUtils::recursiveApplyNodes(node, [image, view, flags] (KisNodeSP node) {
362 if (node && node->paintDevice()) {
363 node->paintDevice()->burnKeyframe();
364 }
365
366 KisTimeSpan range;
367
369 if (channel) {
370 const int currentTime = image->animationInterface()->currentTime();
371 range = channel->affectedFrames(currentTime);
372 }
373
374 if (node && node->paintDevice() && !node->inherits("KisMask")) {
375 ActionHelper::trimDevice(view, node->paintDevice(), flags.testFlag(SharpClip), range);
376 }
377 });
378 }
379
380 KisImageSP tempImage = ActionHelper::makeImage(view, nodes);
381 KisClipboard::instance()->setLayers(nodes, tempImage);
382
383
384 KUndo2MagicString actionName = flags & CutClip ?
385 kundo2_i18n("Cut") :
386 kundo2_i18n("Copy");
387 KisProcessingApplicator *ap = beginAction(view, actionName);
388
389 if (flags & CutClip) {
390 selectedNodes.append(masks);
391 Q_FOREACH (KisNodeSP node, selectedNodes) {
392 KisLayerUtils::recursiveApplyNodes(node, [selection, masks, ap] (KisNodeSP node){
393
394 if (!node->hasEditablePaintDevice()) {
395 return;
396 }
397
398 // applied on masks if selected explicitly (when CTRL-X(cut) is used for deletion)
399 if (node->inherits("KisMask") && !masks.contains(node)) {
400 return;
401 }
402
403 struct ClearSelection : public KisTransactionBasedCommand {
404 ClearSelection(KisNodeSP node, KisSelectionSP sel)
405 : m_node(node), m_sel(sel) {}
406 KisNodeSP m_node;
407 KisSelectionSP m_sel;
408
409 KUndo2Command* paint() override {
410 KisSelectionSP cutSelection = m_sel;
411 // Shrinking the cutting area was previously used
412 // for getting seamless cut-paste. Now we use makeSharpClip
413 // instead.
414 // QRect originalRect = cutSelection->selectedExactRect();
415 // static const int preciseSelectionThreshold = 16;
416 //
417 // if (originalRect.width() > preciseSelectionThreshold ||
418 // originalRect.height() > preciseSelectionThreshold) {
419 // cutSelection = new KisSelection(*m_sel);
420 // delete cutSelection->flatten();
421 //
422 // KisSelectionFilter* filter = new KisShrinkSelectionFilter(1, 1, false);
423 //
424 // QRect processingRect = filter->changeRect(originalRect);
425 // filter->process(cutSelection->pixelSelection(), processingRect);
426 // }
427
428 KisTransaction transaction(m_node->paintDevice());
429 m_node->paintDevice()->clearSelection(cutSelection);
430 m_node->setDirty(cutSelection->selectedRect());
431 return transaction.endAndTake();
432 }
433 };
434
435 KUndo2Command *command = new ClearSelection(node, selection);
437
438 });
439 }
440 }
441
442 KisOperationConfiguration config(id());
443 config.setProperty("will-cut", flags.testFlag(CutClip));
444 config.setProperty("use-sharp-clip", flags.testFlag(SharpClip));
445 endAction(ap, config.toXML());
446 } else if (!flags.testFlag(SharpClip)) {
447 if (flags & CutClip) {
449 } else {
451 }
452 }
453}
KisToolProxy toolProxy
void setLayers(KisNodeList nodes, KisImageSP image, bool forceCopy=false)
static KisClipboard * instance()
KisImageAnimationInterface * animationInterface() const
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....
static const KoID Raster
virtual KisTimeSpan affectedFrames(int time) const
Get the set of frames affected by any changes to the value or content of the active keyframe at the g...
KisNodeList selectedNodes()
KisProcessingApplicator * beginAction(KisViewManager *view, const KUndo2MagicString &actionName)
void endAction(KisProcessingApplicator *applicator, const QString &xmlData)
void clearSelection(KisSelectionSP selection)
void applyCommand(KUndo2Command *command, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
bool blockUntilOperationsFinished(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
KisCanvas2 * canvasBase() const
Return the canvas base class.
KisSelectionSP selection()
KisNodeManager * nodeManager() const
The node manager handles everything about nodes.
KisSelectionManager * selectionManager()
KisImageWSP image() const
Return the image this view is displaying.
void copy() const
Forwarded to the current KoToolBase.
void cut()
Forwarded to the current KoToolBase.
bool hasSelection() const
returns true if the current tool holds a selection
KUndo2MagicString kundo2_i18n(const char *text)
KisImageSP makeImage(KisViewManager *view, KisNodeList nodes)
void trimDevice(KisViewManager *view, KisPaintDeviceSP device, bool makeSharpClip=false, const KisTimeSpan &range=KisTimeSpan())
KisNodeList sortAndFilterMergeableInternalNodes(KisNodeList nodes, bool allowMasks)
void recursiveApplyNodes(NodePointer node, Functor func)
virtual KisPaintDeviceSP projection() const =0
KisKeyframeChannel * getKeyframeChannel(const QString &id, bool create)
virtual KisPaintDeviceSP paintDevice() const =0
QString name() const
quint8 opacity() const
bool hasEditablePaintDevice() const
virtual KisNodeSP clone() const =0
virtual void setDirty()
Definition kis_node.cpp:577
QRect selectedRect() const

References KisKeyframeChannel::affectedFrames(), KisImage::animationInterface(), KisProcessingApplicator::applyCommand(), KisOperation::beginAction(), KisViewManager::blockUntilOperationsFinished(), KisViewManager::canvasBase(), KisPaintDevice::clearSelection(), KisNode::clone(), KisStrokeJobData::CONCURRENT, KoToolProxy::copy(), KisNodeManager::copyLayersToClipboard(), KisImageAnimationInterface::currentTime(), KoToolProxy::cut(), CutClip, KisNodeManager::cutLayersToClipboard(), KisOperation::endAction(), KisTransaction::endAndTake(), KisBaseNode::getKeyframeChannel(), KisBaseNode::hasEditablePaintDevice(), KoToolProxy::hasSelection(), KisSelectionManager::haveShapesSelected(), KisViewManager::image(), KisClipboard::instance(), kundo2_i18n(), ActionHelper::makeImage(), KisBaseNode::name(), KisViewManager::nodeManager(), KisStrokeJobData::NORMAL, KisBaseNode::opacity(), KisBaseNode::paintDevice(), KisBaseNode::projection(), KisKeyframeChannel::Raster, KisLayerUtils::recursiveApplyNodes(), KisNodeManager::selectedNodes(), KisSelection::selectedRect(), KisViewManager::selection(), KisViewManager::selectionManager(), KisNode::setDirty(), KisClipboard::setLayers(), KisPropertiesConfiguration::setProperty(), SharpClip, KisLayerUtils::sortAndFilterMergeableInternalNodes(), KisCanvas2::toolProxy, KisPropertiesConfiguration::toXML(), and ActionHelper::trimDevice().

◆ runFromXML()

void KisCutCopyActionFactory::runFromXML ( KisViewManager * view,
const KisOperationConfiguration & config )
inlineoverridevirtual

Reimplemented from KisOperation.

Definition at line 66 of file kis_selection_action_factories.h.

66 {
67 Flags flags;
68 flags.setFlag(CutClip, config.getBool("will-cut", false));
69 flags.setFlag(SharpClip, config.getBool("use-sharp-clip", false));
70 run(flags, view);
71 }
void run(Flags flags, KisViewManager *view)
bool getBool(const QString &name, bool def=false) const

References KisPropertiesConfiguration::getBool(), and KisNoParameterActionFactory::run().


The documentation for this struct was generated from the following files: