File indexing completed on 2024-05-19 04:29:00

0001 /*
0002  *  SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "./kis_node_commands_adapter.h"
0008 
0009 #include <KoCompositeOp.h>
0010 #include "kis_undo_adapter.h"
0011 #include "kis_image.h"
0012 #include "commands/kis_image_layer_add_command.h"
0013 #include "commands/kis_image_layer_move_command.h"
0014 #include "commands/kis_image_layer_remove_command.h"
0015 #include "commands/KisNodeRenameCommand.h"
0016 #include "commands/kis_node_commands.h"
0017 #include "KisViewManager.h"
0018 #include "kis_processing_applicator.h"
0019 
0020 KisNodeCommandsAdapter::KisNodeCommandsAdapter(KisViewManager * view)
0021         : QObject(view)
0022         , m_view(view)
0023 {
0024 
0025 }
0026 
0027 KisNodeCommandsAdapter::~KisNodeCommandsAdapter()
0028 {
0029 }
0030 
0031 void KisNodeCommandsAdapter::applyOneCommandAsync(KUndo2Command *cmd, KisProcessingApplicator *applicator)
0032 {
0033     if (applicator) {
0034         applicator->applyCommand(cmd, KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::EXCLUSIVE);
0035     } else {
0036         QScopedPointer<KisProcessingApplicator> localApplicator(
0037             new KisProcessingApplicator(m_view->image(), 0, KisProcessingApplicator::NONE,
0038                                         KisImageSignalVector(),
0039                                         cmd->text(),
0040                                         0, cmd->id()));
0041         localApplicator->applyCommand(cmd);
0042         localApplicator->end();
0043     }
0044 }
0045 
0046 void KisNodeCommandsAdapter::addNodeAsync(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis, bool doRedoUpdates, bool doUndoUpdates, KisProcessingApplicator *applicator)
0047 {
0048     KUndo2Command *cmd = new KisImageLayerAddCommand(m_view->image(), node, parent, aboveThis, doRedoUpdates, doUndoUpdates);
0049     applyOneCommandAsync(cmd, applicator);
0050 }
0051 
0052 void KisNodeCommandsAdapter::addNodeAsync(KisNodeSP node, KisNodeSP parent, quint32 index, bool doRedoUpdates, bool doUndoUpdates, KisProcessingApplicator *applicator)
0053 {
0054     KUndo2Command *cmd = new KisImageLayerAddCommand(m_view->image(), node, parent, index, doRedoUpdates, doUndoUpdates);
0055     applyOneCommandAsync(cmd, applicator);
0056 }
0057 
0058 void KisNodeCommandsAdapter::beginMacro(const KUndo2MagicString& macroName)
0059 {
0060     Q_ASSERT(m_view->image()->undoAdapter());
0061     m_view->image()->undoAdapter()->beginMacro(macroName);
0062 }
0063 
0064 void KisNodeCommandsAdapter::addExtraCommand(KUndo2Command *command)
0065 {
0066     Q_ASSERT(m_view->image()->undoAdapter());
0067     m_view->image()->undoAdapter()->addCommand(command);
0068 }
0069 
0070 void KisNodeCommandsAdapter::endMacro()
0071 {
0072     Q_ASSERT(m_view->image()->undoAdapter());
0073     m_view->image()->undoAdapter()->endMacro();
0074 }
0075 
0076 void KisNodeCommandsAdapter::addNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis, bool doRedoUpdates, bool doUndoUpdates)
0077 {
0078     Q_ASSERT(m_view->image()->undoAdapter());
0079     m_view->image()->undoAdapter()->addCommand(new KisImageLayerAddCommand(m_view->image(), node, parent, aboveThis, doRedoUpdates, doUndoUpdates));
0080 }
0081 
0082 void KisNodeCommandsAdapter::addNode(KisNodeSP node, KisNodeSP parent, quint32 index, bool doRedoUpdates, bool doUndoUpdates)
0083 {
0084     Q_ASSERT(m_view->image()->undoAdapter());
0085     m_view->image()->undoAdapter()->addCommand(new KisImageLayerAddCommand(m_view->image(), node, parent, index, doRedoUpdates, doUndoUpdates));
0086 }
0087 
0088 void KisNodeCommandsAdapter::moveNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
0089 {
0090     Q_ASSERT(m_view->image()->undoAdapter());
0091     m_view->image()->undoAdapter()->addCommand(new KisImageLayerMoveCommand(m_view->image(), node, parent, aboveThis));
0092 }
0093 
0094 void KisNodeCommandsAdapter::moveNode(KisNodeSP node, KisNodeSP parent, quint32 indexaboveThis)
0095 {
0096     Q_ASSERT(m_view->image()->undoAdapter());
0097     m_view->image()->undoAdapter()->addCommand(new KisImageLayerMoveCommand(m_view->image(), node, parent, indexaboveThis));
0098 }
0099 
0100 void KisNodeCommandsAdapter::removeNode(KisNodeSP node)
0101 {
0102     Q_ASSERT(m_view->image()->undoAdapter());
0103     m_view->image()->undoAdapter()->addCommand(new KisImageLayerRemoveCommand(m_view->image(), node));
0104 }
0105 
0106 void KisNodeCommandsAdapter::setOpacity(KisNodeSP node, qint32 opacity)
0107 {
0108     KUndo2Command *cmd = new KisNodeOpacityCommand(node, opacity);
0109     applyOneCommandAsync(cmd);
0110 }
0111 
0112 void KisNodeCommandsAdapter::setCompositeOp(KisNodeSP node,
0113                                             const KoCompositeOp* compositeOp)
0114 {
0115     KUndo2Command *cmd = new KisNodeCompositeOpCommand(node,
0116                                                        compositeOp->id());
0117     applyOneCommandAsync(cmd);
0118 }
0119 
0120 void KisNodeCommandsAdapter::setNodeName(KisNodeSP node, const QString &name)
0121 {
0122     KUndo2Command *cmd = new KisNodeRenameCommand(node, node->name(), name);
0123     applyOneCommandAsync(cmd);
0124 }
0125 
0126 void KisNodeCommandsAdapter::undoLastCommand()
0127 {
0128     Q_ASSERT(m_view->image()->undoAdapter());
0129     m_view->image()->undoAdapter()->undoLastCommand();
0130 }