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 }