Krita Source Code Documentation
Loading...
Searching...
No Matches
KisRequiredResourcesOperators.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2020 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#ifndef KISREQUIREDRESOURCESOPERATORS_H
7#define KISREQUIREDRESOURCESOPERATORS_H
8
9#include "kritaresources_export.h"
10
13#include "kis_assert.h"
14
15#include "kis_pointer_utils.h"
16
18{
19
20namespace detail {
21bool KRITARESOURCES_EXPORT isLocalResourcesStorage(KisResourcesInterfaceSP resourcesInterface);
22void KRITARESOURCES_EXPORT assertInGuiThread();
23KisResourcesInterfaceSP KRITARESOURCES_EXPORT createLocalResourcesStorage(const QList<KoResourceSP> &resources);
24void KRITARESOURCES_EXPORT addResourceOrWarnIfNotLoaded(KoResourceLoadResult loadedResource, QList<KoResourceSP> *resources, KisResourcesInterfaceSP resourcesInterface);
25}
26
27
34template <typename T>
35bool hasLocalResourcesSnapshot(const T *object)
36{
37 return detail::isLocalResourcesStorage(object->resourcesInterface());
38}
39
50template <typename T>
51void createLocalResourcesSnapshot(T *object, KisResourcesInterfaceSP globalResourcesInterface = nullptr)
52{
54
55 KisResourcesInterfaceSP effectiveResourcesInterface =
56 globalResourcesInterface ?
57 globalResourcesInterface :
58 object->resourcesInterface();
59
60 QList<KoResourceLoadResult> loadedResources =
61 object->requiredResources(effectiveResourcesInterface);
62
63 QList<KoResourceSP> resources;
64
65 Q_FOREACH(const KoResourceLoadResult &loadedResource, loadedResources) {
66 detail::addResourceOrWarnIfNotLoaded(loadedResource, &resources, effectiveResourcesInterface);
67 }
68
69 object->setResourcesInterface(detail::createLocalResourcesStorage(resources));
70}
71
83template <typename TypeSP, typename T = typename KisSharedPointerTraits<TypeSP>::ValueType>
84TypeSP cloneWithResourcesSnapshot(const T* object,
85 KisResourcesInterfaceSP globalResourcesInterface = nullptr)
86{
87 auto clonedStorage = object->clone();
88 TypeSP cloned = KisSharedPointerTraits<TypeSP>::template dynamicCastSP<T>(clonedStorage);
89
90 if (!hasLocalResourcesSnapshot(cloned.data())) {
91 createLocalResourcesSnapshot(cloned.data(), globalResourcesInterface);
93 }
94
95 return cloned;
96}
97
98}
99
100#endif // KISREQUIREDRESOURCESOPERATORS_H
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
KisResourcesInterfaceSP KRITARESOURCES_EXPORT createLocalResourcesStorage(const QList< KoResourceSP > &resources)
bool KRITARESOURCES_EXPORT isLocalResourcesStorage(KisResourcesInterfaceSP resourcesInterface)
void KRITARESOURCES_EXPORT addResourceOrWarnIfNotLoaded(KoResourceLoadResult loadedResource, QList< KoResourceSP > *resources, KisResourcesInterfaceSP resourcesInterface)
TypeSP cloneWithResourcesSnapshot(const T *object, KisResourcesInterfaceSP globalResourcesInterface=nullptr)
creates an exact copy of the object and loads all the linked resources into the local storage.
void createLocalResourcesSnapshot(T *object, KisResourcesInterfaceSP globalResourcesInterface=nullptr)