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 }