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 }