Krita Source Code Documentation
Loading...
Searching...
No Matches
KisResourceStorage.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7#ifndef KISRESOURCESTORAGE_H
8#define KISRESOURCESTORAGE_H
9
10#include <QSharedPointer>
11#include <QScopedPointer>
12#include <QString>
13#include <QDateTime>
14#include <QMap>
15
16#include <KoResource.h>
17#include <KisTag.h>
18
19#include <klocalizedstring.h>
20
21#include <kritaresources_export.h>
22
24
26{
27public:
29 virtual KisStoragePlugin *create(const QString &/*location*/) { return 0; }
30};
31
32template<typename T>
34{
35public:
36 KisStoragePlugin *create(const QString &location) override {
37 return new T(location);
38 }
39};
40
43
44
51class KRITARESOURCES_EXPORT KisResourceStorage
52{
53public:
54
56 struct ResourceItem {
57
58 virtual ~ResourceItem() {}
59 QString url;
60 QString folder;
61 QString resourceType;
62 QDateTime lastModified;
63 };
64
65 class KRITARESOURCES_EXPORT TagIterator
66 {
67 public:
68 virtual ~TagIterator() {}
69 virtual bool hasNext() const = 0;
71 virtual void next() = 0;
72
74 virtual KisTagSP tag() const = 0;
75 };
76
77 class KRITARESOURCES_EXPORT ResourceIterator
78 {
79 public:
80
81 virtual ~ResourceIterator() {}
82
83 virtual bool hasNext() const = 0;
85 virtual void next() = 0;
86
87 virtual QString url() const = 0;
88 virtual QString type() const = 0;
89 virtual QDateTime lastModified() const = 0;
90 virtual int guessedVersion() const { return 0; }
92
93 KoResourceSP resource() const;
94
95 protected:
97 virtual KoResourceSP resourceImpl() const = 0;
98
99 private:
101 mutable QString m_cachedResourceUrl;
102 };
103
104 enum class StorageType : int {
105 Unknown = 1,
106 Folder = 2,
107 Bundle = 3,
108 AdobeBrushLibrary = 4,
109 AdobeStyleLibrary = 5,
110 Memory = 6,
111 FontStorage = 7
112 };
113
114 static QString storageTypeToString(StorageType storageType) {
115 switch (storageType) {
116 case StorageType::Unknown:
117 return i18n("Unknown");
118 case StorageType::Folder:
119 return i18n("Folder");
120 case StorageType::Bundle:
121 return i18n("Bundle");
122 case StorageType::AdobeBrushLibrary:
123 return i18n("Adobe Brush Library");
124 case StorageType::AdobeStyleLibrary:
125 return i18n("Adobe Style Library");
126 case StorageType::FontStorage:
127 return i18n("Font Storage");
128 case StorageType::Memory:
129 return i18n("Memory");
130 default:
131 return i18n("Invalid");
132 }
133 }
134
135
136 static QString storageTypeToUntranslatedString(StorageType storageType) {
137 switch (storageType) {
138 case StorageType::Unknown:
139 return ("Unknown");
140 case StorageType::Folder:
141 return ("Folder");
142 case StorageType::Bundle:
143 return ("Bundle");
144 case StorageType::AdobeBrushLibrary:
145 return ("Adobe Brush Library");
146 case StorageType::AdobeStyleLibrary:
147 return ("Adobe Style Library");
148 case StorageType::FontStorage:
149 return ("Font Storage");
150 case StorageType::Memory:
151 return ("Memory");
152 default:
153 return ("Invalid");
154 }
155 }
156
157
158 KisResourceStorage(const QString &location);
161 KisResourceStorage &operator=(const KisResourceStorage &rhs);
162 KisResourceStorageSP clone() const;
163
167 QString name() const;
168
170 QString location() const;
171
173 bool valid() const;
174
176 StorageType type() const;
177
179 QImage thumbnail() const;
180
183 QDateTime timestamp() const;
184
187 QDateTime timeStampForResource(const QString &resourceType, const QString &filename) const;
188
190 ResourceItem resourceItem(const QString &url);
191
193 KoResourceSP resource(const QString &url);
194
196 QString resourceMd5(const QString &url);
197
203 QString resourceFilePath(const QString &url);
204
206 QSharedPointer<ResourceIterator> resources(const QString &resourceType) const;
207
209 QSharedPointer<TagIterator> tags(const QString &resourceType) const;
210
213 bool addTag(const QString &resourceType, KisTagSP tag);
214
216 bool saveAsNewVersion(KoResourceSP resource);
217
221 bool addResource(KoResourceSP resource);
222
230 bool importResource(const QString &url, QIODevice *device);
231
238 bool exportResource(const QString &url, QIODevice *device);
239
242 bool supportsVersioning() const;
243
245 bool loadVersionedResource(KoResourceSP resource);
246
247 static const QString s_xmlns_meta;
248 static const QString s_xmlns_dc;
249
250 static const QString s_meta_generator;
251 static const QString s_meta_author;
252 static const QString s_meta_title;
253 static const QString s_meta_description;
254 static const QString s_meta_initial_creator;
255 static const QString s_meta_creator;
256 static const QString s_meta_creation_date;
257 static const QString s_meta_dc_date;
258 static const QString s_meta_user_defined;
259 static const QString s_meta_name;
260 static const QString s_meta_value;
261 static const QString s_meta_version;
262 static const QString s_meta_license;
263 static const QString s_meta_email;
264 static const QString s_meta_website;
265
266 void setMetaData(const QString &key, const QVariant &value);
267 QStringList metaDataKeys() const;
268 QVariant metaData(const QString &key) const;
269
270private:
271
272 friend class KisStorageModel;
273 friend class KisResourceLocator;
274 friend class KisResourceCacheDb;
275 friend class TestResourceLocator;
276
277 KisStoragePlugin* testingGetStoragePlugin();
278
279 void setStorageId(int storageId);
280 int storageId();
281
282 class Private;
283 QScopedPointer<Private> d;
284};
285
286
287
288inline QDebug operator<<(QDebug dbg, const KisResourceStorageSP storage)
289{
290 if (storage.isNull()) {
291 dbg.nospace() << "[RESOURCESTORAGE] NULL";
292 }
293 else {
294 dbg.nospace() << "[RESOURCESTORAGE] Name: " << storage->name()
295 << " Version: " << storage->location()
296 << " Valid: " << storage->valid()
297 << " Storage: " << KisResourceStorage::storageTypeToString(storage->type())
298 << " Timestamp: " << storage->timestamp()
299 << " Pointer: " << storage.data();
300 }
301 return dbg.space();
302}
303
304class KRITARESOURCES_EXPORT KisStoragePluginRegistry {
305public:
308
309 void addStoragePluginFactory(KisResourceStorage::StorageType storageType, KisStoragePluginFactoryBase *factory);
310 QList<KisResourceStorage::StorageType> storageTypes() const;
312private:
313 friend class KisResourceStorage;
314 QMap<KisResourceStorage::StorageType, KisStoragePluginFactoryBase*> m_storageFactoryMap;
315
316};
317
319{
321 QString filename;
323 QDateTime lastModified;
325 QString guessedKey;
326
328 bool operator()(const VersionedResourceEntry &lhs, const VersionedResourceEntry &rhs) const {
329 return lhs.guessedKey < rhs.guessedKey ||
330 (lhs.guessedKey == rhs.guessedKey && lhs.guessedVersion < rhs.guessedVersion);
331 }
332 };
333
334 struct KeyLess {
335 bool operator()(const VersionedResourceEntry &lhs, const VersionedResourceEntry &rhs) const {
336 return lhs.guessedKey < rhs.guessedKey;
337 }
338 };
339};
340
341class KRITARESOURCES_EXPORT KisStorageVersioningHelper {
342public:
343
344 static bool addVersionedResource(const QString &saveLocation, KoResourceSP resource, int minVersion);
345 static QString chooseUniqueName(KoResourceSP resource,
346 int minVersion,
347 std::function<bool(QString)> checkExists);
348
349 static void detectFileVersions(QVector<VersionedResourceEntry> &allFiles);
350
351
352};
353
385
386
387#endif // KISRESOURCESTORAGE_H
float value(const T *src, size_t ch)
QDebug operator<<(QDebug dbg, const KisResourceStorageSP storage)
QSharedPointer< KisResourceStorage > KisResourceStorageSP
PythonPluginManager * instance
The KisResourceCacheDb class encapsulates the database that caches information about the resources av...
virtual void next()=0
The iterator is only valid if next() has been called at least once.
virtual QString url() const =0
virtual KoResourceSP resourceImpl() const =0
This only loads the resource when called.
virtual bool hasNext() const =0
virtual QDateTime lastModified() const =0
virtual QString type() const =0
virtual void next()=0
The iterator is only valid if next() has been called at least once.
virtual KisTagSP tag() const =0
A tag object on which we can set properties and which we can save.
virtual bool hasNext() const =0
static const QString s_meta_author
static const QString s_meta_title
static const QString s_meta_user_defined
static const QString s_meta_creation_date
static const QString s_meta_value
static const QString s_meta_email
static QString storageTypeToString(StorageType storageType)
static const QString s_meta_license
static const QString s_xmlns_meta
static QString storageTypeToUntranslatedString(StorageType storageType)
bool addTag(const QString &resourceType, KisTagSP tag)
static const QString s_meta_description
static const QString s_meta_dc_date
static const QString s_meta_website
static const QString s_meta_generator
static const QString s_meta_version
static const QString s_meta_name
QScopedPointer< Private > d
static const QString s_xmlns_dc
static const QString s_meta_initial_creator
static const QString s_meta_creator
virtual KisStoragePlugin * create(const QString &)
KisStoragePlugin * create(const QString &location) override
QMap< KisResourceStorage::StorageType, KisStoragePluginFactoryBase * > m_storageFactoryMap
int guessedVersion() const override
const QVector< VersionedResourceEntry > m_entries
QString url() const override
QVector< VersionedResourceEntry >::const_iterator m_it
QDateTime lastModified() const override
KisVersionedStorageIterator(const QVector< VersionedResourceEntry > &entries, KisStoragePlugin *_q)
QVector< VersionedResourceEntry >::const_iterator m_begin
void next() override
The iterator is only valid if next() has been called at least once.
QVector< VersionedResourceEntry >::const_iterator m_chunkStart
QVector< VersionedResourceEntry >::const_iterator m_end
QString type() const override
QSharedPointer< KisResourceStorage::ResourceIterator > versions() const override
KoResourceSP resourceImpl() const override
This only loads the resource when called.
@ Unknown
Definition psd.h:44
A resource item is simply an entry in the storage,.
bool operator()(const VersionedResourceEntry &lhs, const VersionedResourceEntry &rhs) const
bool operator()(const VersionedResourceEntry &lhs, const VersionedResourceEntry &rhs) const