File indexing completed on 2024-05-12 15:56:48

0001 /*
0002  *  SPDX-FileCopyrightText: 2018 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KoShapeFillResourceConnector.h"
0008 
0009 #include <KoCanvasResourceProvider.h>
0010 #include <KoSelectedShapesProxy.h>
0011 
0012 #include "kis_assert.h"
0013 #include "kis_signal_auto_connection.h"
0014 
0015 #include <KoColor.h>
0016 #include <KoFlake.h>
0017 #include <KoShapeFillWrapper.h>
0018 #include <KoSelection.h>
0019 #include <KoCanvasBase.h>
0020 
0021 
0022 
0023 struct KoShapeFillResourceConnector::Private
0024 {
0025     KoCanvasBase *canvas;
0026     KisSignalAutoConnectionsStore resourceManagerConnections;
0027 
0028     void applyShapeColoring(KoFlake::FillVariant fillVariant, const KoColor &color);
0029 };
0030 
0031 KoShapeFillResourceConnector::KoShapeFillResourceConnector(QObject *parent)
0032     : QObject(parent),
0033       m_d(new Private())
0034 {
0035 }
0036 
0037 KoShapeFillResourceConnector::~KoShapeFillResourceConnector()
0038 {
0039 }
0040 
0041 void KoShapeFillResourceConnector::connectToCanvas(KoCanvasBase *canvas)
0042 {
0043     m_d->resourceManagerConnections.clear();
0044     m_d->canvas = 0;
0045 
0046     KIS_SAFE_ASSERT_RECOVER_RETURN(!canvas || canvas->resourceManager());
0047     KIS_SAFE_ASSERT_RECOVER_RETURN(!canvas || canvas->selectedShapesProxy());
0048 
0049     m_d->canvas = canvas;
0050 
0051     if (m_d->canvas) {
0052         m_d->resourceManagerConnections.addConnection(
0053             canvas->resourceManager(), SIGNAL(canvasResourceChanged(int,QVariant)),
0054             this, SLOT(slotCanvasResourceChanged(int,QVariant)));
0055     }
0056 }
0057 
0058 void KoShapeFillResourceConnector::disconnect()
0059 {
0060     connectToCanvas(0);
0061 }
0062 
0063 void KoShapeFillResourceConnector::slotCanvasResourceChanged(int key, const QVariant &value)
0064 {
0065     KIS_SAFE_ASSERT_RECOVER_RETURN(m_d->canvas);
0066 
0067     if (key == KoCanvasResource::ForegroundColor) {
0068         m_d->applyShapeColoring(KoFlake::Fill, value.value<KoColor>());
0069     } else if (key == KoCanvasResource::BackgroundColor) {
0070         m_d->applyShapeColoring(KoFlake::StrokeFill, value.value<KoColor>());
0071     }
0072 }
0073 
0074 
0075 void KoShapeFillResourceConnector::Private::applyShapeColoring(KoFlake::FillVariant fillVariant, const KoColor &color)
0076 {
0077     QList<KoShape *> selectedEditableShapes = canvas->selectedShapesProxy()->selection()->selectedEditableShapes();
0078 
0079     if (selectedEditableShapes.isEmpty()) {
0080         return;
0081     }
0082 
0083     KoShapeFillWrapper wrapper(selectedEditableShapes, fillVariant);
0084     KUndo2Command *command = wrapper.setColor(color.toQColor()); // TODO: do the conversion in a better way!
0085 
0086     if (command) {
0087         canvas->addCommand(command);
0088     }
0089 }