File indexing completed on 2024-05-12 15:59:48
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #include "KisLocalStrokeResources.h" 0007 #include "KisResourcesInterface_p.h" 0008 0009 #include <QFileInfo> 0010 #include "kis_assert.h" 0011 #include "kis_debug.h" 0012 0013 namespace { 0014 class LocalResourcesSource : public KisResourcesInterface::ResourceSourceAdapter 0015 { 0016 public: 0017 LocalResourcesSource(const QString &resourceType, const QList<KoResourceSP> &cachedResources) 0018 : KisResourcesInterface::ResourceSourceAdapter(resourceType) 0019 , m_resourceType(resourceType) 0020 , m_cachedResources(cachedResources) 0021 { 0022 } 0023 protected: 0024 QVector<KoResourceSP> resourcesForFilename(const QString &filename) const override { 0025 QVector<KoResourceSP> resources; 0026 Q_FOREACH(KoResourceSP res, m_cachedResources) { 0027 if (res->filename() == filename && res->resourceType().first == m_resourceType) { 0028 resources << res; 0029 } 0030 } 0031 return resources; 0032 } 0033 0034 QVector<KoResourceSP> resourcesForName(const QString &name) const override { 0035 QVector<KoResourceSP> resources; 0036 Q_FOREACH(KoResourceSP res, m_cachedResources) { 0037 if (res->name() == name && res->resourceType().first == m_resourceType) { 0038 resources << res; 0039 } 0040 } 0041 return resources; 0042 } 0043 0044 QVector<KoResourceSP> resourcesForMD5(const QString &md5) const override { 0045 QVector<KoResourceSP> resources; 0046 Q_FOREACH(KoResourceSP res, m_cachedResources) { 0047 if (res->md5Sum() == md5 && res->resourceType().first == m_resourceType) { 0048 resources << res; 0049 } 0050 } 0051 return resources; 0052 } 0053 0054 public: 0055 0056 KoResourceSP fallbackResource() const override { 0057 auto it = std::find_if(m_cachedResources.begin(), 0058 m_cachedResources.end(), 0059 [this] (KoResourceSP res) { 0060 return res->resourceType().first == this->m_resourceType; 0061 }); 0062 return it != m_cachedResources.end() ? *it : KoResourceSP(); 0063 } 0064 0065 private: 0066 const QString m_resourceType; 0067 const QList<KoResourceSP> &m_cachedResources; 0068 }; 0069 } 0070 0071 class KisLocalStrokeResourcesPrivate : public KisResourcesInterfacePrivate 0072 { 0073 public: 0074 KisLocalStrokeResourcesPrivate(const QList<KoResourceSP> &_localResources) 0075 : localResources(_localResources) 0076 { 0077 0078 // sanity check that we don't have any null resources 0079 KIS_SAFE_ASSERT_RECOVER(!localResources.contains(KoResourceSP())) { 0080 localResources.removeAll(KoResourceSP()); 0081 } 0082 0083 0084 } 0085 QList<KoResourceSP> localResources; 0086 }; 0087 0088 0089 KisLocalStrokeResources::KisLocalStrokeResources() 0090 : KisResourcesInterface(new KisLocalStrokeResourcesPrivate({})) 0091 { 0092 } 0093 0094 KisLocalStrokeResources::KisLocalStrokeResources(const QList<KoResourceSP> &localResources) 0095 : KisResourcesInterface(new KisLocalStrokeResourcesPrivate(localResources)) 0096 { 0097 } 0098 0099 void KisLocalStrokeResources::addResource(KoResourceSP resource) 0100 { 0101 Q_D(KisLocalStrokeResources); 0102 KIS_SAFE_ASSERT_RECOVER(resource) 0103 { 0104 warnKrita << "Attempted to insert a null resource into the local style resource server"; 0105 return; 0106 } 0107 d->localResources.append(resource); 0108 } 0109 0110 void KisLocalStrokeResources::removeResource(KoResourceSP resource) 0111 { 0112 Q_D(KisLocalStrokeResources); 0113 d->localResources.removeAll(resource); 0114 } 0115 0116 KisLocalStrokeResources *KisLocalStrokeResources::clone() const 0117 { 0118 Q_D(const KisLocalStrokeResources); 0119 return new KisLocalStrokeResources(d->localResources); 0120 } 0121 0122 KisResourcesInterface::ResourceSourceAdapter *KisLocalStrokeResources::createSourceImpl(const QString &type) const 0123 { 0124 Q_D(const KisLocalStrokeResources); 0125 return new LocalResourcesSource(type, d->localResources); 0126 }