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 }