File indexing completed on 2024-05-12 15:56:12

0001 /*
0002  * SPDX-FileCopyrightText: 2018 Boudewijn Rempt <boud@valdyas.org>
0003  * SPDX-FileCopyrightText: 2019 Agata Cacko <cacko.azh@gmail.com>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.0-or-later
0006  */
0007 
0008 #include "KisAbrStorage.h"
0009 #include "KisResourceStorage.h"
0010 
0011 #include <QFileInfo>
0012 
0013 struct KisAbrStorageStaticRegistrar {
0014     KisAbrStorageStaticRegistrar() {
0015         KisStoragePluginRegistry::instance()->addStoragePluginFactory(KisResourceStorage::StorageType::AdobeBrushLibrary, new KisStoragePluginFactory<KisAbrStorage>());
0016     }
0017 };
0018 static KisAbrStorageStaticRegistrar s_registrar;
0019 
0020 
0021 class AbrTagIterator : public KisResourceStorage::TagIterator
0022 {
0023 public:
0024     AbrTagIterator(KisAbrBrushCollectionSP brushCollection, const QString &location, const QString &resourceType)
0025         : m_brushCollection(brushCollection)
0026         , m_location(location)
0027         , m_resourceType(resourceType)
0028     {}
0029 
0030     bool hasNext() const override {
0031         if (m_resourceType != ResourceType::Brushes) return false;
0032         return !m_taggingDone;
0033     }
0034 
0035     void next() override { m_taggingDone = true; }
0036 
0037     KisTagSP tag() const override
0038     {
0039         KisTagSP abrTag(new KisTag());
0040         abrTag->setUrl(QFileInfo(m_location).fileName());
0041         abrTag->setName(QFileInfo(m_location).fileName());
0042         abrTag->setComment(QFileInfo(m_location).fileName());
0043         abrTag->setFilename(QFileInfo(m_location).fileName());
0044         abrTag->setResourceType(m_resourceType);
0045         abrTag->setValid(true);
0046         QStringList brushes;
0047         Q_FOREACH(const KisAbrBrushSP brush, m_brushCollection->brushes()) {
0048             brushes << brush->filename();
0049         }
0050         abrTag->setDefaultResources(brushes);
0051 
0052         return abrTag;
0053     }
0054 
0055 private:
0056 
0057     bool m_taggingDone {false};
0058     KisAbrBrushCollectionSP m_brushCollection;
0059     QString m_location;
0060     QString m_resourceType;
0061 };
0062 
0063 class AbrIterator : public KisResourceStorage::ResourceIterator
0064 {
0065 public:
0066     KisAbrBrushCollectionSP m_brushCollection;
0067     QSharedPointer<QMap<QString, KisAbrBrushSP>> m_brushesMap;
0068     QMap<QString, KisAbrBrushSP>::const_iterator m_brushCollectionIterator;
0069     KisAbrBrushSP m_currentResource;
0070     bool isLoaded;
0071     QString m_currentUrl;
0072     QString m_resourceType;
0073 
0074 
0075     AbrIterator(KisAbrBrushCollectionSP brushCollection, const QString& resourceType)
0076         : m_brushCollection(brushCollection)
0077         , isLoaded(false)
0078         , m_resourceType(resourceType)
0079     {
0080     }
0081 
0082     bool hasNext() const override
0083     {
0084         if (m_resourceType != ResourceType::Brushes) {
0085             return false;
0086         }
0087 
0088         if (!isLoaded) {
0089             bool success = m_brushCollection->load();
0090             Q_UNUSED(success); // brush collection will be empty
0091             const_cast<AbrIterator*>(this)->m_brushesMap = m_brushCollection->brushesMap();
0092             const_cast<AbrIterator*>(this)->m_brushCollectionIterator = m_brushesMap->constBegin();
0093             const_cast<AbrIterator*>(this)->isLoaded = true;
0094         }
0095 
0096         if (m_brushCollectionIterator == m_brushesMap->constEnd()) {
0097             return false;
0098         }
0099 
0100         bool hasNext = (m_brushCollectionIterator != m_brushesMap->constEnd());
0101         return hasNext;
0102     }
0103 
0104     void next() override
0105     {
0106         if (m_resourceType != ResourceType::Brushes) {
0107             return;
0108         }
0109         KIS_SAFE_ASSERT_RECOVER_RETURN(m_brushCollectionIterator != m_brushesMap->constEnd());
0110         m_currentResource = m_brushCollectionIterator.value();
0111         m_currentUrl = m_brushCollectionIterator.key();
0112         m_brushCollectionIterator++;
0113     }
0114 
0115     QString url() const override { return m_currentUrl; }
0116     QString type() const override { return ResourceType::Brushes; }
0117     QDateTime lastModified() const override { return m_brushCollection->lastModified(); }
0118 
0119     KoResourceSP resourceImpl() const override
0120     {
0121         return m_currentResource;
0122     }
0123 };
0124 
0125 KisAbrStorage::KisAbrStorage(const QString &location)
0126     : KisStoragePlugin(location)
0127     , m_brushCollection(new KisAbrBrushCollection(location))
0128 {
0129 }
0130 
0131 KisAbrStorage::~KisAbrStorage()
0132 {
0133 
0134 }
0135 
0136 KisResourceStorage::ResourceItem KisAbrStorage::resourceItem(const QString &url)
0137 {
0138     KisResourceStorage::ResourceItem item;
0139     item.url = url;
0140     // last "_" with index is the suffix added by abr_collection
0141     int indexOfUnderscore = url.lastIndexOf("_");
0142     QString filenameUrl = url;
0143     // filenameUrl contains the name of the collection (filename without .abr, brush name without index)
0144     filenameUrl.remove(indexOfUnderscore, url.length() - indexOfUnderscore);
0145     item.folder = filenameUrl;
0146     item.resourceType = ResourceType::Brushes;
0147     item.lastModified = QFileInfo(m_brushCollection->filename()).lastModified();
0148     return item;
0149 }
0150 
0151 
0152 KoResourceSP KisAbrStorage::resource(const QString &url)
0153 {
0154     if (!m_brushCollection->isLoaded()) {
0155         m_brushCollection->load();
0156     }
0157     return m_brushCollection->brushByName(QFileInfo(url).fileName());
0158 }
0159 
0160 bool KisAbrStorage::loadVersionedResource(KoResourceSP /*resource*/)
0161 {
0162     return false;
0163 }
0164 
0165 bool KisAbrStorage::supportsVersioning() const
0166 {
0167     return false;
0168 }
0169 
0170 QSharedPointer<KisResourceStorage::ResourceIterator> KisAbrStorage::resources(const QString &resourceType)
0171 {
0172     return QSharedPointer<KisResourceStorage::ResourceIterator>(new AbrIterator(m_brushCollection, resourceType));
0173 }
0174 
0175 QSharedPointer<KisResourceStorage::TagIterator> KisAbrStorage::tags(const QString &resourceType)
0176 {
0177     return QSharedPointer<KisResourceStorage::TagIterator>(new AbrTagIterator(m_brushCollection, location(), resourceType));
0178 }
0179 
0180 QImage KisAbrStorage::thumbnail() const
0181 {
0182     return m_brushCollection->image();
0183 }