File indexing completed on 2024-05-12 16:01:45

0001 /*
0002  *  SPDX-FileCopyrightText: 2019 Tusooa Zhu <tusooa@vista.aero>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisChangeCloneLayersCommand.h"
0008 
0009 #include <kis_clone_layer.h>
0010 
0011 struct KisChangeCloneLayersCommand::Private
0012 {
0013     QList<KisCloneLayerSP> cloneLayers;
0014     QList<KisLayerSP> originalSource;
0015     KisLayerSP newSource;
0016 };
0017 
0018 KisChangeCloneLayersCommand::KisChangeCloneLayersCommand(QList<KisCloneLayerSP> cloneLayers, KisLayerSP newSource, KUndo2Command *parent)
0019     : KUndo2Command(kundo2_i18n("Change Clone Layers"), parent)
0020     , d(new Private())
0021 {
0022     KIS_SAFE_ASSERT_RECOVER_RETURN(!cloneLayers.isEmpty());
0023     d->cloneLayers = cloneLayers;
0024     Q_FOREACH (KisCloneLayerSP layer, d->cloneLayers) {
0025         d->originalSource << layer->copyFrom();
0026     }
0027     d->newSource = newSource;
0028 }
0029 
0030 void KisChangeCloneLayersCommand::redo()
0031 {
0032     Q_FOREACH (KisCloneLayerSP layer, d->cloneLayers) {
0033         layer->setCopyFrom(d->newSource);
0034         layer->setDirty();
0035     }
0036 }
0037 
0038 void KisChangeCloneLayersCommand::undo()
0039 {
0040     KIS_SAFE_ASSERT_RECOVER_RETURN(d->cloneLayers.size() == d->originalSource.size());
0041     for (int i = 0; i < d->cloneLayers.size(); ++i) {
0042         KisCloneLayerSP layer = d->cloneLayers.at(i);
0043         layer->setCopyFrom(d->originalSource.at(i));
0044         layer->setDirty();
0045     }
0046 }
0047 
0048 bool KisChangeCloneLayersCommand::mergeWith(const KUndo2Command *command)
0049 {
0050     const KisChangeCloneLayersCommand *other = dynamic_cast<const KisChangeCloneLayersCommand *>(command);
0051 
0052     if (other && d->cloneLayers == other->d->cloneLayers) {
0053         d->newSource = other->d->newSource;
0054         return true;
0055     }
0056 
0057     return false;
0058 }