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 }