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 "KisGlobalResourcesInterface.h"
0007 
0008 #include <QGlobalStatic>
0009 #include <KisResourceModel.h>
0010 #include <KisResourceModelProvider.h>
0011 
0012 #include <kis_debug.h>
0013 
0014 #include <QBasicMutex>
0015 
0016 
0017 namespace {
0018 class GlobalResourcesSource : public KisResourcesInterface::ResourceSourceAdapter
0019 {
0020 public:
0021     GlobalResourcesSource(const QString &resourceType, KisAllResourcesModel *model)
0022         : KisResourcesInterface::ResourceSourceAdapter(resourceType)
0023         , m_model(model)
0024     {}
0025 
0026     ~GlobalResourcesSource() override
0027     {
0028     }
0029 protected:
0030     QVector<KoResourceSP> resourcesForFilename(const QString &filename) const override {
0031         QVector<KoResourceSP> res = m_model->resourcesForFilename(filename);
0032         return res;
0033     }
0034 
0035     QVector<KoResourceSP> resourcesForName(const QString &name) const override {
0036         QVector<KoResourceSP> res = m_model->resourcesForName(name);
0037         return res;
0038     }
0039 
0040     QVector<KoResourceSP> resourcesForMD5(const QString &md5) const override {
0041         QVector<KoResourceSP> res = m_model->resourcesForMD5(md5);
0042         return res;
0043     }
0044 public:
0045     KoResourceSP fallbackResource() const override {
0046         return m_model->rowCount() > 0 ? m_model->resourceForIndex(m_model->index(0, 0)) : KoResourceSP();
0047     }
0048 
0049 private:
0050     KisAllResourcesModel *m_model;
0051 };
0052 }
0053 
0054 KisResourcesInterfaceSP KisGlobalResourcesInterface::instance()
0055 {
0056     // TODO: implement general macro like Q_GLOBAL_STATIC()
0057 
0058     static QBasicAtomicInt guard = Q_BASIC_ATOMIC_INITIALIZER(QtGlobalStatic::Uninitialized);
0059     static KisResourcesInterfaceSP d;
0060     static QBasicMutex mutex;
0061     int x = guard.loadAcquire();
0062     if (Q_UNLIKELY(x >= QtGlobalStatic::Uninitialized)) {
0063         QMutexLocker locker(&mutex);
0064         if (guard.load() == QtGlobalStatic::Uninitialized) {
0065             d.reset(new KisGlobalResourcesInterface());
0066             static struct Cleanup {
0067                 ~Cleanup() {
0068                     d.reset();
0069                     guard.store(QtGlobalStatic::Destroyed);
0070                 }
0071             } cleanup;
0072             guard.storeRelease(QtGlobalStatic::Initialized);
0073         }
0074     }
0075 
0076     return d;
0077 }
0078 
0079 KisResourcesInterface::ResourceSourceAdapter *KisGlobalResourcesInterface::createSourceImpl(const QString &type) const
0080 {
0081     KisResourcesInterface::ResourceSourceAdapter *source =
0082         new GlobalResourcesSource(type, KisResourceModelProvider::resourceModel(type));
0083 
0084     KIS_ASSERT(source);
0085     return source;
0086 }