File indexing completed on 2024-05-12 15:59:49

0001 /*
0002  * SPDX-FileCopyrightText: 2018 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #ifndef KISRESOURCELOADER_H
0008 #define KISRESOURCELOADER_H
0009 
0010 #include <QString>
0011 #include <QStringList>
0012 #include <QImage>
0013 #include <QScopedPointer>
0014 #include <QSharedPointer>
0015 
0016 #include <KoResource.h>
0017 #include <KoID.h>
0018 
0019 #include <kritaresources_export.h>
0020 
0021 
0022 /**
0023  * @brief The KisResourceLoader class is an abstract interface
0024  * class that must be implemented by actual resource classes and
0025  * registered with the KisResourceLoaderRegistry.
0026  */
0027 class KRITARESOURCES_EXPORT KisResourceLoaderBase
0028 {
0029 public:
0030 
0031     KisResourceLoaderBase(const QString &resourceSubType, const QString &resourceType, const QString &name, const QStringList &mimetypes)
0032     {
0033         m_resourceSubType = resourceSubType;
0034         m_resourceType = resourceType;
0035         m_mimetypes = mimetypes;
0036         m_name = name;
0037     }
0038 
0039     virtual ~KisResourceLoaderBase()
0040     {
0041     }
0042 
0043     /**
0044      * @return a set of filters ("*.bla,*.foo") that is suitable for filtering
0045      * the contents of a directory.
0046      */
0047     QStringList filters() const;
0048 
0049     /**
0050      * @return the mimetypes this resource can load
0051      */
0052     QStringList mimetypes() const
0053     {
0054         return m_mimetypes;
0055     }
0056 
0057     /**
0058      * @return the folder in the resource storage where resources
0059      * of this type are located
0060      */
0061     QString resourceType() const
0062     {
0063         return m_resourceType;
0064     }
0065 
0066     QString resourceSubType() const
0067     {
0068         return id();
0069     }
0070 
0071     /// For registration in KisResourceLoaderRegistry
0072     QString id() const
0073     {
0074         return m_resourceSubType;
0075     }
0076 
0077     /// The user-friendly name of the category
0078     QString name() const
0079     {
0080         return m_name;
0081     }
0082 
0083     virtual KoResourceSP create(const QString &name) = 0;
0084 
0085     bool load(KoResourceSP resource, QIODevice &dev, KisResourcesInterfaceSP resourcesInterface)
0086     {
0087         Q_ASSERT(dev.isOpen() && dev.isReadable());
0088         return resource->loadFromDevice(&dev, resourcesInterface);
0089     }
0090 
0091     /**
0092      * Load this resource.
0093      * @return a resource if loading the resource succeeded, 0 otherwise
0094      */
0095     KoResourceSP load(const QString &name, QIODevice &dev, KisResourcesInterfaceSP resourcesInterface)
0096     {
0097         KoResourceSP resource = create(name);
0098         return load(resource, dev, resourcesInterface) ? resource : 0;
0099     }
0100 
0101 
0102 private:
0103     QString m_resourceSubType;
0104     QString m_resourceType;
0105     QStringList m_mimetypes;
0106     QString m_name;
0107 
0108 };
0109 
0110 template<typename T>
0111 class KisResourceLoader : public KisResourceLoaderBase {
0112 public:
0113     KisResourceLoader(const QString &id, const QString &folder, const QString &name, const QStringList &mimetypes)
0114         : KisResourceLoaderBase(id, folder, name, mimetypes)
0115     {
0116     }
0117 
0118     virtual KoResourceSP create(const QString &name) override
0119     {
0120         QSharedPointer<T> resource = QSharedPointer<T>::create(name);
0121         return resource;
0122     }
0123 };
0124 
0125 
0126 
0127 #endif // KISRESOURCELOADER_H