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, KisResourceStorage::StorageType storageType);
159 KisResourceStorage(const QString &location);
162 KisResourceStorage &operator=(const KisResourceStorage &rhs);
163 KisResourceStorageSP clone() const;
164
168 QString name() const;
169
171 QString location() const;
172
174 bool valid() const;
175
177 StorageType type() const;
178
180 QImage thumbnail() const;
181
184 QDateTime timestamp() const;
185
188 QDateTime timeStampForResource(const QString &resourceType, const QString &filename) const;
189
191 ResourceItem resourceItem(const QString &url);
192
194 KoResourceSP resource(const QString &url);
195
197 QString resourceMd5(const QString &url);
198
204 QString resourceFilePath(const QString &url);
205
207 QSharedPointer<ResourceIterator> resources(const QString &resourceType) const;
208
210 QSharedPointer<TagIterator> tags(const QString &resourceType) const;
211
214 bool addTag(const QString &resourceType, KisTagSP tag);
215
217 bool saveAsNewVersion(KoResourceSP resource);
218
222 bool addResource(KoResourceSP resource);
223
231 bool importResource(const QString &url, QIODevice *device);
232
239 bool exportResource(const QString &url, QIODevice *device);
240
243 bool supportsVersioning() const;
244
246 bool loadVersionedResource(KoResourceSP resource);
247
248 static const QString s_xmlns_meta;
249 static const QString s_xmlns_dc;
250
251 static const QString s_meta_generator;
252 static const QString s_meta_author;
253 static const QString s_meta_title;
254 static const QString s_meta_description;
255 static const QString s_meta_initial_creator;
256 static const QString s_meta_creator;
257 static const QString s_meta_creation_date;
258 static const QString s_meta_dc_date;
259 static const QString s_meta_user_defined;
260 static const QString s_meta_name;
261 static const QString s_meta_value;
262 static const QString s_meta_version;
263 static const QString s_meta_license;
264 static const QString s_meta_email;
265 static const QString s_meta_website;
266
267 void setMetaData(const QString &key, const QVariant &value);
268 QStringList metaDataKeys() const;
269 QVariant metaData(const QString &key) const;
270
271private:
272
273 friend class KisStorageModel;
274 friend class KisResourceLocator;
275 friend class KisResourceCacheDb;
276 friend class TestResourceLocator;
277
278 KisStoragePlugin* testingGetStoragePlugin();
279
280 void setStorageId(int storageId);
281 int storageId();
282
283 class Private;
284 QScopedPointer<Private> d;
285};
286
287
288
289inline QDebug operator<<(QDebug dbg, const KisResourceStorageSP storage)
290{
291 if (storage.isNull()) {
292 dbg.nospace() << "[RESOURCESTORAGE] NULL";
293 }
294 else {
295 dbg.nospace() << "[RESOURCESTORAGE] Name: " << storage->name()
296 << " Location: " << storage->location()
297 << " Valid: " << storage->valid()
298 << " Storage: " << KisResourceStorage::storageTypeToString(storage->type())
299 << " Timestamp: " << storage->timestamp()
300 << " Pointer: " << storage.data();
301 }
302 return dbg.space();
303}
304
305class KRITARESOURCES_EXPORT KisStoragePluginRegistry {
306public:
309
310 void addStoragePluginFactory(KisResourceStorage::StorageType storageType, KisStoragePluginFactoryBase *factory);
311 QList<KisResourceStorage::StorageType> storageTypes() const;
313private:
314 friend class KisResourceStorage;
315 QMap<KisResourceStorage::StorageType, KisStoragePluginFactoryBase*> m_storageFactoryMap;
316
317};
318
320{
322 QString filename;
324 QDateTime lastModified;
326 QString guessedKey;
327
329 bool operator()(const VersionedResourceEntry &lhs, const VersionedResourceEntry &rhs) const {
330 return lhs.guessedKey < rhs.guessedKey ||
331 (lhs.guessedKey == rhs.guessedKey && lhs.guessedVersion < rhs.guessedVersion);
332 }
333 };
334
335 struct KeyLess {
336 bool operator()(const VersionedResourceEntry &lhs, const VersionedResourceEntry &rhs) const {
337 return lhs.guessedKey < rhs.guessedKey;
338 }
339 };
340};
341
342class KRITARESOURCES_EXPORT KisStorageVersioningHelper {
343public:
344
345 static bool addVersionedResource(const QString &saveLocation, KoResourceSP resource, int minVersion);
346 static QString chooseUniqueName(KoResourceSP resource,
347 int minVersion,
348 std::function<bool(QString)> checkExists);
349
350 static void detectFileVersions(QVector<VersionedResourceEntry> &allFiles);
351
352
353};
354
386
387
388#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