Krita Source Code Documentation
Loading...
Searching...
No Matches
KoResource.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 SPDX-FileCopyrightText: 2003 Patrick Julien <freak@codepimps.org>
3 SPDX-FileCopyrightText: 2005 Boudewijn Rempt <boud@valdyas.org>
4 SPDX-FileCopyrightText: 2007 Jan Hambrecht <jaham@gmx.net>
5
6 SPDX-License-Identifier: LGPL-2.1-or-later
7 */
8#include <KoResource.h>
9
10#include <QDomElement>
11#include <QFileInfo>
12#include <QDebug>
13#include <QImage>
14#include <QBuffer>
15
16#include <kis_debug.h>
17#include "KoMD5Generator.h"
18#include "kis_assert.h"
19
22
24 qRegisterMetaType<KoResourceSP>("KoResourceSP");
25}
26
27struct Q_DECL_HIDDEN KoResource::Private {
28 int version {-1};
29 int resourceId {-1};
30 bool valid {false};
31 bool active {true};
32 bool permanent {false};
33 bool modified {false};
34 QString name;
35 QString filename;
37 QString md5sum;
38 QImage image;
39 QMap<QString, QVariant> metadata;
40};
41
43 : d(new Private)
44{
45}
46
47KoResource::KoResource(const QString& filename)
48 : d(new Private)
49{
50 d->filename = filename;
51 d->name = QFileInfo(filename).fileName();
52}
53
55{
56 delete d;
57}
58
60 : d(new Private(*rhs.d))
61{
62}
63
65{
66 QFile file(filename());
67
68 if (!file.exists()) {
69 qWarning() << "Resource file doesn't exist: " << filename();
70 return false;
71 }
72
73 if (file.size() == 0) {
74 qWarning() << "Resource file is empty: " << filename();
75 return false;
76 }
77
78 if (!file.open(QIODevice::ReadOnly)) {
79 qWarning() << "Cannot open resource file for reading" << filename();
80 return false;
81 }
82
83 const bool res = loadFromDevice(&file, resourcesInterface);
84
85 if (!res) {
86 qWarning() << "Could not load resource file" << filename();
87 }
88
89 file.close();
90
91 return res;
92}
93
95{
96 if (filename().isEmpty()) return false;
97
98 QFile file(filename());
99
100 if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
101 warnKrita << "Can't open file for writing" << filename();
102 return false;
103 }
104
105 saveToDevice(&file);
106
107 file.close();
108 return true;
109}
110
111bool KoResource::saveToDevice(QIODevice *dev) const
112{
113 Q_UNUSED(dev);
114 return true;
115}
116
117QImage KoResource::image() const
118{
119 return d->image;
120}
121
125
127{
128 return image();
129}
130
132{
133 return QString();
134}
135
136void KoResource::setImage(const QImage &image)
137{
138 d->image = image;
139}
140
141QString KoResource::md5Sum(bool generateIfEmpty) const
142{
143 // [this assert is disputable] ephemeral resources have no md5
145
146 if (d->md5sum.isEmpty() && generateIfEmpty) {
147 // non-serializable resources should always have an externally generated md5
149 dbgResources << "No MD5 for" << this << this->name();
150 QBuffer buf;
151 buf.open(QFile::WriteOnly);
152 saveToDevice(&buf);
153 buf.close();
154 const_cast<KoResource*>(this)->setMD5Sum(KoMD5Generator::generateHash(buf.data()));
155 }
156 return d->md5sum;
157}
158
159void KoResource::setMD5Sum(const QString &md5sum)
160{
164
165 if (valid()) {
166 Q_ASSERT(!md5sum.isEmpty());
167 }
168 d->md5sum = md5sum;
169}
170
171QString KoResource::filename() const
172{
173 return d->filename;
174}
175
176void KoResource::setFilename(const QString& filename)
177{
178 d->filename = QFileInfo(filename).fileName();
179}
180
181QString KoResource::name() const
182{
183 return d->name;
184}
185
186void KoResource::setName(const QString& name)
187{
188 d->name = name;
189}
190
191bool KoResource::valid() const
192{
193 return d->valid;
194}
195
196void KoResource::setValid(bool valid)
197{
198 d->valid = valid;
199}
200
201bool KoResource::active() const
202{
203 return d->active;
204}
205
206void KoResource::setActive(bool active)
207{
208 d->active = active;
209}
210
211
213{
214 return QString();
215}
216
217bool KoResource::permanent() const
218{
219 return d->permanent;
220}
221
222void KoResource::setPermanent(bool permanent)
223{
224 d->permanent = permanent;
225}
226
227int KoResource::resourceId() const
228{
229 return d->resourceId;
230}
231
233{
234 return linkedResources(globalResourcesInterface) + embeddedResources(globalResourcesInterface);
235}
236
238{
240 Q_UNUSED(list);
241
242 Q_UNUSED(globalResourcesInterface);
243 return {};
244}
245
247{
248 Q_UNUSED(globalResourcesInterface);
249 return {};
250}
251
253{
254 QList<KoResourceLoadResult> result = sideLoadedResources(globalResourcesInterface);
256 return result;
257}
258
260{
261 Q_UNUSED(globalResourcesInterface);
262 return {};
263}
264
268
270{
271 return {};
272}
273
274QString KoResource::storageLocation() const
275{
276 return d->storageLocation;
277}
278
280{
281 d->modified = value;
282}
283
285{
286 return d->modified;
287}
288
289void KoResource::addMetaData(QString key, QVariant value)
290{
300 d->metadata.insert(key, value);
301}
302
303QMap<QString, QVariant> KoResource::metadata() const
304{
305 return d->metadata;
306}
307
308int KoResource::version() const
309{
310 return d->version;
311}
312
313void KoResource::setVersion(int version)
314{
315 d->version = version;
316}
317
319{
320 d->resourceId = id;
321}
322
327
329{
330 return false;
331}
332
334{
335 return !isEphemeral();
336}
337
338void KoResource::setStorageLocation(const QString &location)
339{
340 d->storageLocation = location;
341}
float value(const T *src, size_t ch)
KIS_DECLARE_STATIC_INITIALIZER
static QString generateHash(const QString &filename)
generateHash reads the given file and generates a hex-encoded md5sum for the file.
A simple wrapper object for the main information about the resource.
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
#define warnKrita
Definition kis_debug.h:87
#define dbgResources
Definition kis_debug.h:43
QList< KoResourceLoadResult > takeSideLoadedResources(KisResourcesInterfaceSP globalResourcesInterface)
QString storageLocation
void setValid(bool valid)
QList< KoResourceLoadResult > requiredResources(KisResourcesInterfaceSP globalResourcesInterface) const
virtual QList< KoResourceLoadResult > embeddedResources(KisResourcesInterfaceSP globalResourcesInterface) const
void setName(const QString &name)
virtual QPair< QString, QString > resourceType() const =0
virtual bool isSerializable() const
virtual void clearSideLoadedResources()
virtual QList< int > requiredCanvasResources() const
void addMetaData(QString key, QVariant value)
store the given key, value pair in the resource
QImage image
void setMD5Sum(const QString &md5sum)
Set the md5sum of this resource. It must be in hex-encoded string format.
void setFilename(const QString &filename)
void setPermanent(bool permanent)
virtual QString defaultFileExtension() const
virtual QString thumbnailPath() const
thumbnailPath returns the path to a separate thumbnail image, outside the actual resource file itself...
Private *const d
Definition KoResource.h:274
void setStorageLocation(const QString &location)
QString filename
void setResourceId(int id)
virtual ~KoResource()
void setDirty(bool value)
Mark the preset as modified but not saved.
virtual bool saveToDevice(QIODevice *dev) const
void setImage(const QImage &image)
virtual bool isEphemeral() const
QString md5Sum(bool generateIfEmpty=true) const
virtual void updateThumbnail()
updateThumbnail updates the thumbnail for this resource. Reimplement if your thumbnail is something e...
QMap< QString, QVariant > metadata
KoResourceSignature signature() const
void setActive(bool active)
virtual QImage thumbnail() const
thumbnail the thumbnail image to use in resource selectors
virtual bool loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface)=0
bool isDirty() const
bool save()
void setVersion(int version)
bool load(KisResourcesInterfaceSP resourcesInterface)
virtual QList< KoResourceLoadResult > sideLoadedResources(KisResourcesInterfaceSP globalResourcesInterface) const
QString md5sum
virtual QList< KoResourceLoadResult > linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const
QString name