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 }