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 Types inherited from KisOperation
enum  Flag { Normal = 0x0 , ReadOnly = 0x1 }
 

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
KisProcessingApplicator * beginAction (KisViewManager *view, const KUndo2MagicString &actionName, Flags flags=Normal)
 
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 224 of file kis_selection_action_factories.cpp.

225{
226 KisImageSP image = view->image();
227 if (!image) return;
228
229 if (!view->blockUntilOperationsFinished(image)) return;
230
231 // Reference layers is a fake node, so it isn't added to the layer stack, this results in KisSelectedShapesProxy not
232 // being aware of the active shapeManager and its selected shapes.
233 const auto currentToolHasSelection =
234 view->canvasBase()->toolProxy()->hasSelection();
235
236 const bool haveShapesSelected =
238
239 KisSelectionSP selection = view->selection();
240
241 const bool skipShapes = selection && !currentToolHasSelection;
242
243 if (!skipShapes && !flags.testFlag(SharpClip) && (haveShapesSelected || currentToolHasSelection)) {
244 // XXX: "Add saving of XML data for Cut/Copy of shapes"
245
251 KisImageBarrierLock lock(image, std::try_to_lock);
252 if (!lock.owns_lock()) return;
253
254 if (flags & CutClip) {
255 view->canvasBase()->toolProxy()->cut();
256 } else {
257 view->canvasBase()->toolProxy()->copy();
258 }
259 } else if (selection) {
260 KisNodeList selectedNodes = view->nodeManager()->selectedNodes();
261
262 KisNodeList masks;
263 Q_FOREACH (KisNodeSP node, selectedNodes) {
264 if (node->inherits("KisMask")) {
265 masks.append(node);
266 }
267 }
268
269 selectedNodes = KisLayerUtils::sortAndFilterMergeableInternalNodes(selectedNodes);
270
271 KisNodeList nodes;
272 Q_FOREACH (KisNodeSP node, selectedNodes) {
273 KisNodeSP dupNode;
274 if (node->inherits("KisShapeLayer") || node->inherits("KisFileLayer")
275
276 // also recreate the node for animated layers, since we have no
277 // API for making a node non-animated
278 || (node->inherits("KisPaintLayer") && node->isAnimated())) {
279
280 KisPaintDeviceSP dev = new KisPaintDevice(*node->projection());
281 // might have to change node's name (vector to paint layer)
282 dupNode = new KisPaintLayer(image, node->name(), node->opacity(), dev);
283 } else {
284 dupNode = node->clone();
285 }
286 nodes.append(dupNode);
287 }
288
289 Q_FOREACH (KisNodeSP node, nodes) {
290 KisLayerUtils::recursiveApplyNodes(node, [image, view, flags] (KisNodeSP node) {
291 if (node && node->paintDevice() && !node->inherits("KisMask")) {
292 KisToolUtils::trimDeviceForClipboard(image, node->paintDevice(), view->selection(), flags.testFlag(SharpClip));
293 }
294 });
295 }
296
297 KisImageSP tempImage = KisToolUtils::buildImageForClipboard(image, nodes);
298 KisClipboard::instance()->setLayers(nodes, tempImage, selection->selectedExactRect());
299
300
301 KUndo2MagicString actionName = flags & CutClip ?
302 kundo2_i18n("Cut") :
303 kundo2_i18n("Copy");
305 beginAction(view,
306 actionName,
308
309 if (flags & CutClip) {
310 selectedNodes.append(masks);
311 Q_FOREACH (KisNodeSP node, selectedNodes) {
312 KisLayerUtils::recursiveApplyNodes(node, [selection, masks, ap] (KisNodeSP node){
313
314 if (!node->hasEditablePaintDevice()) {
315 return;
316 }
317
318 // applied on masks if selected explicitly (when CTRL-X(cut) is used for deletion)
319 if (node->inherits("KisMask") && !masks.contains(node)) {
320 return;
321 }
322
323 struct ClearSelection : public KisTransactionBasedCommand {
324 ClearSelection(KisNodeSP node, KisSelectionSP sel)
325 : m_node(node), m_sel(sel) {}
326 KisNodeSP m_node;
327 KisSelectionSP m_sel;
328
329 KUndo2Command* paint() override {
330 KisSelectionSP cutSelection = m_sel;
331 // Shrinking the cutting area was previously used
332 // for getting seamless cut-paste. Now we use makeSharpClip
333 // instead.
334 // QRect originalRect = cutSelection->selectedExactRect();
335 // static const int preciseSelectionThreshold = 16;
336 //
337 // if (originalRect.width() > preciseSelectionThreshold ||
338 // originalRect.height() > preciseSelectionThreshold) {
339 // cutSelection = new KisSelection(*m_sel);
340 // delete cutSelection->flatten();
341 //
342 // KisSelectionFilter* filter = new KisShrinkSelectionFilter(1, 1, false);
343 //
344 // QRect processingRect = filter->changeRect(originalRect);
345 // filter->process(cutSelection->pixelSelection(), processingRect);
346 // }
347
348 KisTransaction transaction(m_node->paintDevice());
349 m_node->paintDevice()->clearSelection(cutSelection);
350 m_node->setDirty(cutSelection->selectedRect());
351 return transaction.endAndTake();
352 }
353 };
354
355 KUndo2Command *command = new ClearSelection(node, selection);
357
358 });
359 }
360 }
361
362 KisOperationConfiguration config(id());
363 config.setProperty("will-cut", flags.testFlag(CutClip));
364 config.setProperty("use-sharp-clip", flags.testFlag(SharpClip));
365 endAction(ap, config.toXML());
366 } else if (!flags.testFlag(SharpClip)) {
367 if (flags & CutClip) {
369 } else {
371 }
372 }
373}
KisToolProxy toolProxy
static KisClipboard * instance()
void setLayers(KisNodeList nodes, KisImageSP image, const QRect referenceRect, bool forceCopy=false)
KisNodeList selectedNodes()
void endAction(KisProcessingApplicator *applicator, const QString &xmlData)
KisProcessingApplicator * beginAction(KisViewManager *view, const KUndo2MagicString &actionName, Flags flags=Normal)
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)
KisNodeList sortAndFilterMergeableInternalNodes(KisNodeList nodes, bool allowMasks)
void recursiveApplyNodes(NodePointer node, Functor func)
KisImageSP buildImageForClipboard(KisImageSP srcImage, KisNodeList nodes)
virtual KisPaintDeviceSP projection() const =0
bool isAnimated() const
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
QRect selectedExactRect() const
Slow, but exact way of determining the rectangle that encloses the selection.

References KisProcessingApplicator::applyCommand(), KisOperation::beginAction(), KisViewManager::blockUntilOperationsFinished(), KisToolUtils::buildImageForClipboard(), KisViewManager::canvasBase(), KisPaintDevice::clearSelection(), KisNode::clone(), KisStrokeJobData::CONCURRENT, KoToolProxy::copy(), KisNodeManager::copyLayersToClipboard(), KoToolProxy::cut(), CutClip, KisNodeManager::cutLayersToClipboard(), KisOperation::endAction(), KisTransaction::endAndTake(), KisBaseNode::hasEditablePaintDevice(), KoToolProxy::hasSelection(), KisSelectionManager::haveShapesSelected(), KisViewManager::image(), KisClipboard::instance(), KisBaseNode::isAnimated(), kundo2_i18n(), KisBaseNode::name(), KisViewManager::nodeManager(), KisStrokeJobData::NORMAL, KisOperation::Normal, KisBaseNode::opacity(), KisBaseNode::paintDevice(), KisBaseNode::projection(), KisOperation::ReadOnly, KisLayerUtils::recursiveApplyNodes(), KisSelection::selectedExactRect(), KisNodeManager::selectedNodes(), KisSelection::selectedRect(), KisViewManager::selection(), KisViewManager::selectionManager(), KisNode::setDirty(), KisClipboard::setLayers(), KisPropertiesConfiguration::setProperty(), SharpClip, KisLayerUtils::sortAndFilterMergeableInternalNodes(), KisCanvas2::toolProxy, and KisPropertiesConfiguration::toXML().

◆ 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: