Krita Source Code Documentation
Loading...
Searching...
No Matches
KoResourceManager_p.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2006, 2011 Boudewijn Rempt (boud@valdyas.org)
3 SPDX-FileCopyrightText: 2007, 2010 Thomas Zander <zander@kde.org>
4 SPDX-FileCopyrightText: 2008 Carlos Licea <carlos.licea@kdemail.net>
5 SPDX-FileCopyrightText: 2011 Jan Hambrecht <jaham@gmx.net>
6
7 SPDX-License-Identifier: LGPL-2.0-or-later
8 */
10
11#include <QVariant>
12#include <FlakeDebug.h>
13
14#include "KoShape.h"
15#include "kis_assert.h"
16#include "kis_debug.h"
17
24
29
30void KoResourceManager::setResource(int key, const QVariant &value)
31{
33
36
39
40 if (abstractResource) {
41 const QVariant oldValue = abstractResource->value();
42 abstractResource->setValue(value);
43
44 if (m_updateMediators.contains(key)) {
45 m_updateMediators[key]->connectResource(value);
46 }
47
48 if (oldValue != value) {
50 }
51 } else if (converter) {
52 const int sourceKey = converter->sourceKey();
53 const QVariant oldSourceValue = m_resources.value(sourceKey, QVariant());
54
55 bool valueChanged = false;
56 const QVariant newSourceValue = converter->writeToSource(value, oldSourceValue, &valueChanged);
57
58 if (valueChanged) {
60 }
61
62 if (oldSourceValue != newSourceValue) {
63 m_resources[sourceKey] = newSourceValue;
64 notifyResourceChanged(sourceKey, newSourceValue);
65 }
66 } else if (m_resources.contains(key)) {
67 const QVariant oldValue = m_resources.value(key, QVariant());
68 m_resources[key] = value;
69
70 if (m_updateMediators.contains(key)) {
71 m_updateMediators[key]->connectResource(value);
72 }
73
74 if (oldValue != value) {
76 }
77 } else {
78 m_resources[key] = value;
79 if (m_updateMediators.contains(key)) {
80 m_updateMediators[key]->connectResource(value);
81 }
83 }
84}
85
92
94{
95 QMultiHash<int, KoDerivedResourceConverterSP>::const_iterator it = m_derivedFromSource.constFind(key);
96 QMultiHash<int, KoDerivedResourceConverterSP>::const_iterator end = m_derivedFromSource.constEnd();
97
98 while (it != end && it.key() == key) {
99 KoDerivedResourceConverterSP converter = it.value();
100
101 if (converter->notifySourceChanged(value)) {
102 notifyResourceChanged(converter->key(), converter->readFromSource(value));
103 }
104
105 it++;
106 }
107}
108
114
116{
117 QMultiHash<int, KoDerivedResourceConverterSP>::const_iterator it = m_derivedFromSource.constFind(key);
118 QMultiHash<int, KoDerivedResourceConverterSP>::const_iterator end = m_derivedFromSource.constEnd();
119
120 while (it != end && it.key() == key) {
121 KoDerivedResourceConverterSP converter = it.value();
122 notifyResourceChangeAttempted(converter->key(), converter->readFromSource(value));
123 it++;
124 }
125}
126
127void KoResourceManager::notifyDependenciesAboutTargetChange(int targetKey, const QVariant &targetValue)
128{
129 auto it = m_dependencyFromTarget.find(targetKey);
130 while (it != m_dependencyFromTarget.end() && it.key() == targetKey) {
131 const int sourceKey = it.value()->sourceKey();
132
133 if (hasResource(sourceKey)) {
134 QVariant sourceValue = resource(sourceKey);
135
136 notifyResourceChangeAttempted(sourceKey, sourceValue);
137 if (it.value()->shouldUpdateSource(sourceValue, targetValue)) {
138 notifyResourceChanged(sourceKey, sourceValue);
139 }
140 }
141
142 ++it;
143 }
144}
145
146QVariant KoResourceManager::resource(int key) const
147{
148 KoAbstractCanvasResourceInterfaceSP abstractResource =
150 if (abstractResource) {
151 return abstractResource->value();
152 }
153
156
157 const int realKey = converter ? converter->sourceKey() : key;
158 QVariant value = m_resources.value(realKey, QVariant());
159
160 return converter ? converter->readFromSource(value) : value;
161}
162
163void KoResourceManager::setResource(int key, const KoColor &color)
164{
165 QVariant v;
166 v.setValue(color);
167 setResource(key, v);
168}
169
171{
172 QVariant v;
173 v.setValue(shape);
174 setResource(key, v);
175}
176
177void KoResourceManager::setResource(int key, const KoUnit &unit)
178{
179 QVariant v;
180 v.setValue(unit);
181 setResource(key, v);
182}
183
185{
186 if (! m_resources.contains(key)) {
187 KoColor empty;
188 return empty;
189 }
190 return resource(key).value<KoColor>();
191}
192
194{
195 if (! m_resources.contains(key))
196 return 0;
197
198 return resource(key).value<KoShape *>();
199}
200
201
203{
204 return resource(key).value<KoUnit>();
205}
206
208{
209 if (! m_resources.contains(key))
210 return false;
211 return m_resources[key].toBool();
212}
213
215{
216 if (! m_resources.contains(key))
217 return 0;
218 return m_resources[key].toInt();
219}
220
222{
223 if (! m_resources.contains(key)) {
224 QString empty;
225 return empty;
226 }
227 return qvariant_cast<QString>(resource(key));
228}
229
231{
232 if (! m_resources.contains(key)) {
233 QSizeF empty;
234 return empty;
235 }
236 return qvariant_cast<QSizeF>(resource(key));
237}
238
240{
241 if (m_abstractResources.contains(key)) return true;
242
245
246 const int realKey = converter ? converter->sourceKey() : key;
247 return m_resources.contains(realKey);
248}
249
251{
252 // we cannot remove a derived resource
253 if (m_derivedResources.contains(key)) return;
254
255 // we cannot remove an abstract resource either
256 if (m_abstractResources.contains(key)) return;
257
258 if (m_resources.contains(key)) {
259 m_resources.remove(key);
260 notifyResourceChanged(key, QVariant());
261 }
262}
263
265{
266 KIS_SAFE_ASSERT_RECOVER_NOOP(!m_derivedResources.contains(converter->key()));
267
268 if (hasAbstractResource(converter->key()))
269 qWarning() << "An abstract resource with the same resource ID exists!";
270
271 m_derivedResources.insert(converter->key(), converter);
272 m_derivedFromSource.insert(converter->sourceKey(), converter);
273}
274
276{
277 return m_derivedResources.contains(key);
278}
279
281{
282 Q_ASSERT(m_derivedResources.contains(key));
283
285 m_derivedResources.remove(key);
286 m_derivedFromSource.remove(converter->sourceKey(), converter);
287}
288
290{
291 KIS_SAFE_ASSERT_RECOVER_NOOP(!m_updateMediators.contains(mediator->key()));
292 m_updateMediators.insert(mediator->key(), mediator);
293 connect(mediator.data(), SIGNAL(sigResourceChanged(int)), SLOT(slotResourceInternalsChanged(int)));
294}
295
297{
298 return m_updateMediators.contains(key);
299}
300
306
308{
309 KIS_SAFE_ASSERT_RECOVER_RETURN(!hasActiveCanvasResourceDependency(dep->sourceKey(), dep->targetKey()));
310
311 m_dependencyFromSource.insert(dep->sourceKey(), dep);
312 m_dependencyFromTarget.insert(dep->targetKey(), dep);
313}
314
315bool KoResourceManager::hasActiveCanvasResourceDependency(int sourceKey, int targetKey) const
316{
317 auto it = m_dependencyFromSource.find(sourceKey);
318
319 while (it != m_dependencyFromSource.end() && it.key() == sourceKey) {
320 if (it.value()->targetKey() == targetKey) {
321 return true;
322 }
323 ++it;
324 }
325
326 return false;
327}
328
330{
332
333 {
334 auto it = m_dependencyFromSource.find(sourceKey);
335 while (it != m_dependencyFromSource.end() && it.key() == sourceKey) {
336 if (it.value()->targetKey() == targetKey) {
337 it = m_dependencyFromSource.erase(it);
338 break;
339 } else {
340 ++it;
341 }
342 }
343 }
344
345 {
346 auto it = m_dependencyFromTarget.find(targetKey);
347 while (it != m_dependencyFromTarget.end() && it.key() == targetKey) {
348 if (it.value()->sourceKey() == sourceKey) {
349 it = m_dependencyFromTarget.erase(it);
350 break;
351 } else {
352 ++it;
353 }
354 }
355 }
356}
357
359{
360 return m_abstractResources.contains(key);
361}
362
364{
365 Q_ASSERT(hasAbstractResource(key));
366
367 KoAbstractCanvasResourceInterfaceSP resourceInterface = m_abstractResources.value(key);
368 disconnect(resourceInterface.data(), SIGNAL(sigResourceChangedExternal(int, QVariant)),
369 this, SLOT(slotAbstractResourceChangedExternal(int, QVariant)));
370 m_abstractResources.remove(key);
371}
372
374{
375 KIS_SAFE_ASSERT_RECOVER_RETURN(resourceInterface);
376
377 if (hasDerivedResourceConverter(resourceInterface->key()))
378 qWarning() << "A derived resource converter with the same resource ID exists!";
379
380 const QVariant oldValue = this->resource(resourceInterface->key());
381
382 KoAbstractCanvasResourceInterfaceSP oldResourceInterface =
383 m_abstractResources.value(resourceInterface->key());
384 if (oldResourceInterface) {
385 disconnect(oldResourceInterface.data(), SIGNAL(sigResourceChangedExternal(int, QVariant)),
386 this, SLOT(slotAbstractResourceChangedExternal(int, QVariant)));
387 }
388
389 m_abstractResources[resourceInterface->key()] = resourceInterface;
390
391 connect(resourceInterface.data(), SIGNAL(sigResourceChangedExternal(int, QVariant)),
392 this, SLOT(slotAbstractResourceChangedExternal(int, const QVariant&)));
393
394 if (oldValue != resourceInterface->value()) {
395 notifyResourceChanged(resourceInterface->key(), resourceInterface->value());
396 }
397}
float value(const T *src, size_t ch)
qreal v
QSharedPointer< KoAbstractCanvasResourceInterface > KoAbstractCanvasResourceInterfaceSP
QSharedPointer< KoDerivedResourceConverter > KoDerivedResourceConverterSP
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void addDerivedResourceConverter(KoDerivedResourceConverterSP converter)
QMultiHash< int, KoActiveCanvasResourceDependencySP > m_dependencyFromSource
void removeDerivedResourceConverter(int key)
bool hasResourceUpdateMediator(int key)
void slotResourceInternalsChanged(int key)
QHash< int, KoDerivedResourceConverterSP > m_derivedResources
bool boolResource(int key) const
bool hasActiveCanvasResourceDependency(int sourceKey, int targetKey) const
bool hasResource(int key) const
void setResource(int key, const QVariant &value)
void removeResourceUpdateMediator(int key)
int intResource(int key) const
void addResourceUpdateMediator(KoResourceUpdateMediatorSP mediator)
void removeActiveCanvasResourceDependency(int sourceKey, int targetKey)
void resourceChangeAttempted(int key, const QVariant &value)
QSizeF sizeResource(int key) const
void notifyResourceChangeAttempted(int key, const QVariant &value)
bool hasAbstractResource(int key)
QHash< int, QVariant > m_resources
QMultiHash< int, KoDerivedResourceConverterSP > m_derivedFromSource
void notifyDependenciesAboutTargetChange(int targetKey, const QVariant &value)
bool hasDerivedResourceConverter(int key)
QMultiHash< int, KoActiveCanvasResourceDependencySP > m_dependencyFromTarget
QHash< int, KoAbstractCanvasResourceInterfaceSP > m_abstractResources
void notifyDerivedResourcesChangeAttempted(int key, const QVariant &value)
QString stringResource(int key) const
KoColor koColorResource(int key) const
void resourceChanged(int key, const QVariant &value)
KoShape * koShapeResource(int key) const
KoUnit unitResource(int key) const
void setAbstractResource(KoAbstractCanvasResourceInterfaceSP resource)
void notifyResourceChanged(int key, const QVariant &value)
void notifyDerivedResourcesChanged(int key, const QVariant &value)
void slotAbstractResourceChangedExternal(int key, const QVariant &value)
void addActiveCanvasResourceDependency(KoActiveCanvasResourceDependencySP dep)
void removeAbstractResource(int key)
QVariant resource(int key) const
QHash< int, KoResourceUpdateMediatorSP > m_updateMediators
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130