File indexing completed on 2024-06-09 04:20:46
0001 /* This file is part of the KDE project 0002 * SPDX-FileCopyrightText: 2008 Jan Hambrecht <jaham@gmx.net> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "KoShapeShadowCommand.h" 0008 #include "KoShape.h" 0009 #include "KoShapeShadow.h" 0010 0011 #include <klocalizedstring.h> 0012 0013 class Q_DECL_HIDDEN KoShapeShadowCommand::Private 0014 { 0015 public: 0016 Private() {} 0017 ~Private() { 0018 Q_FOREACH (KoShapeShadow* shadow, oldShadows) { 0019 if (shadow && !shadow->deref()) 0020 delete shadow; 0021 } 0022 } 0023 0024 void addOldShadow(KoShapeShadow * oldShadow) 0025 { 0026 if (oldShadow) 0027 oldShadow->ref(); 0028 oldShadows.append(oldShadow); 0029 } 0030 0031 void addNewShadow(KoShapeShadow * newShadow) 0032 { 0033 if (newShadow) 0034 newShadow->ref(); 0035 newShadows.append(newShadow); 0036 } 0037 0038 QList<KoShape*> shapes; ///< the shapes to set shadow for 0039 QList<KoShapeShadow*> oldShadows; ///< the old shadows, one for each shape 0040 QList<KoShapeShadow*> newShadows; ///< the new shadows to set 0041 }; 0042 0043 KoShapeShadowCommand::KoShapeShadowCommand(const QList<KoShape*> &shapes, KoShapeShadow *shadow, KUndo2Command *parent) 0044 : KUndo2Command(parent) 0045 , d(new Private()) 0046 { 0047 d->shapes = shapes; 0048 // save old shadows 0049 Q_FOREACH (KoShape *shape, d->shapes) { 0050 d->addOldShadow(shape->shadow()); 0051 d->addNewShadow(shadow); 0052 } 0053 0054 setText(kundo2_i18n("Set Shadow")); 0055 } 0056 0057 KoShapeShadowCommand::KoShapeShadowCommand(const QList<KoShape*> &shapes, const QList<KoShapeShadow*> &shadows, KUndo2Command *parent) 0058 : KUndo2Command(parent) 0059 , d(new Private()) 0060 { 0061 Q_ASSERT(shapes.count() == shadows.count()); 0062 0063 d->shapes = shapes; 0064 0065 // save old shadows 0066 Q_FOREACH (KoShape *shape, shapes) 0067 d->addOldShadow(shape->shadow()); 0068 Q_FOREACH (KoShapeShadow * shadow, shadows) 0069 d->addNewShadow(shadow); 0070 0071 setText(kundo2_i18n("Set Shadow")); 0072 } 0073 0074 KoShapeShadowCommand::KoShapeShadowCommand(KoShape* shape, KoShapeShadow *shadow, KUndo2Command *parent) 0075 : KUndo2Command(parent) 0076 , d(new Private()) 0077 { 0078 d->shapes.append(shape); 0079 d->addNewShadow(shadow); 0080 d->addOldShadow(shape->shadow()); 0081 0082 setText(kundo2_i18n("Set Shadow")); 0083 } 0084 0085 KoShapeShadowCommand::~KoShapeShadowCommand() 0086 { 0087 delete d; 0088 } 0089 0090 void KoShapeShadowCommand::redo() 0091 { 0092 KUndo2Command::redo(); 0093 int shapeCount = d->shapes.count(); 0094 for (int i = 0; i < shapeCount; ++i) { 0095 KoShape *shape = d->shapes[i]; 0096 0097 // TODO: implement comparison operator for KoShapeShadow 0098 // (or just deprecate it entirely) 0099 if (shape->shadow() || d->newShadows[i]) { 0100 const QRectF oldBoundingRect = shape->boundingRect(); 0101 shape->setShadow(d->newShadows[i]); 0102 shape->updateAbsolute(oldBoundingRect | shape->boundingRect()); 0103 } 0104 } 0105 } 0106 0107 void KoShapeShadowCommand::undo() 0108 { 0109 KUndo2Command::undo(); 0110 int shapeCount = d->shapes.count(); 0111 for (int i = 0; i < shapeCount; ++i) { 0112 KoShape *shape = d->shapes[i]; 0113 0114 // TODO: implement comparison operator for KoShapeShadow 0115 // (or just deprecate it entirely) 0116 if (shape->shadow() || d->oldShadows[i]) { 0117 const QRectF oldBoundingRect = shape->boundingRect(); 0118 shape->setShadow(d->oldShadows[i]); 0119 shape->updateAbsolute(oldBoundingRect | shape->boundingRect()); 0120 } 0121 } 0122 }