Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSeExprScript.cpp
Go to the documentation of this file.
1/*
2 * This file is part of Krita
3 *
4 * SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include <FlakeDebug.h>
10#include <KoStore.h>
11#include <KoStoreDevice.h>
12#include <QBuffer>
13#include <QDir>
14#include <QFileInfo>
15#include <QTextDecoder>
16#include <kis_assert.h>
17
18#include "KisSeExprScript.h"
19
21 QString script;
22 QByteArray data;
23};
24
25KisSeExprScript::KisSeExprScript(const QString &filename)
26 : KoResource(filename)
27 , d(new Private)
28{
29 setName(name().replace("_", " "));
30 if (name().endsWith(defaultFileExtension())) {
31 const QFileInfo f(name());
32 setName(f.completeBaseName());
33 }
34}
35
36KisSeExprScript::KisSeExprScript(const QImage &image, const QString &script, const QString &name, const QString &folderName)
37 : KoResource(QString())
38 , d(new Private)
39{
43
44 QFileInfo fileInfo(folderName + QDir::separator() + name + defaultFileExtension());
45
46 int i = 1;
47 while (fileInfo.exists()) {
48 fileInfo.setFile(folderName + QDir::separator() + name + QString::number(i) + defaultFileExtension());
49 i++;
50 }
51
52 setFilename(fileInfo.filePath());
53}
54
59
61 : KoResource(rhs)
62 , d(new Private)
63{
65 // only valid if we could clone the settings
66 setScript(rhs.script());
67 setValid(rhs.valid());
68}
69
74
75bool KisSeExprScript::loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface)
76{
77 Q_UNUSED(resourcesInterface);
78
79 if (!dev->isOpen())
80 dev->open(QIODevice::ReadOnly);
81
82 d->data = dev->readAll();
83
84 // TODO: test
85 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(d->data.size() != 0, false);
86
87 if (filename().isNull()) {
88 warnFlake << "Cannot load SeExpr script" << name() << ", there is no filename set";
89 return false;
90 }
91
92 if (d->data.isNull()) {
93 QFile file(filename());
94 if (file.size() == 0) {
95 warnFlake << "Cannot load SeExpr script" << name() << "there is no data available";
96 return false;
97 }
98
99 file.open(QIODevice::ReadOnly);
100 d->data = file.readAll();
101 file.close();
102 }
103
104 QBuffer buf(&d->data);
105 buf.open(QBuffer::ReadOnly);
106
107 QScopedPointer<KoStore> store(KoStore::createStore(&buf, KoStore::Read, "application/x-krita-seexpr-script", KoStore::Zip));
108 if (!store || store->bad())
109 return false;
110
111 bool storeOpened = store->open("script.se");
112 if (!storeOpened) {
113 return false;
114 }
115
116 d->script = QString(store->read(store->size()));
117 store->close();
118
119 if (store->open("preview.png")) {
120 KoStoreDevice previewDev(store.data());
121 previewDev.open(QIODevice::ReadOnly);
122
123 QImage preview = QImage();
124 preview.load(&previewDev, "PNG");
125 setImage(preview);
126
127 (void)store->close();
128 }
129
130 buf.close();
131
132 setValid(true);
133 setDirty(false);
134
135 return true;
136}
137
138bool KisSeExprScript::saveToDevice(QIODevice *dev) const
139{
140 KoStore *store(KoStore::createStore(dev, KoStore::Write, "application/x-krita-seexpr-script", KoStore::Zip));
141 if (!store || store->bad())
142 return false;
143
144 if (!store->open("script.se")) {
145 return false;
146 }
147
148 KoStoreDevice storeDev(store);
149 storeDev.open(QIODevice::WriteOnly);
150
151 storeDev.write(d->script.toUtf8());
152
153 if (!store->close()) {
154 return false;
155 }
156
157 if (!store->open("preview.png")) {
158 return false;
159 }
160
161 KoStoreDevice previewDev(store);
162 previewDev.open(QIODevice::WriteOnly);
163
164 image().save(&previewDev, "PNG");
165 if (!store->close()) {
166 return false;
167 }
168
169 return store->finalize();
170}
171
172QPair<QString, QString> KisSeExprScript::resourceType() const
173{
174 return QPair<QString, QString>(ResourceType::SeExprScripts, "");
175}
176
178{
179 return QString(".kse");
180}
181
183{
184 return d->script;
185}
186
187void KisSeExprScript::setScript(const QString &script)
188{
189 d->script = script;
190}
191
193{
194 return KoResourceSP(new KisSeExprScript(*this));
195}
196
198{
199 return KoResource::name().replace("_", " ");
200}
#define warnFlake
Definition FlakeDebug.h:16
void setScript(const QString &script)
set SeExpr expression script
QString name() const override
QString defaultFileExtension() const override
bool loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface) override
KoResourceSP clone() const override
Private *const d
KisSeExprScript(const QString &filename)
QPair< QString, QString > resourceType() const override
QString script() const
script the actual script
bool saveToDevice(QIODevice *dev) const override
bool open(OpenMode m) override
bool close()
Definition KoStore.cpp:156
@ Read
Definition KoStore.h:29
@ Write
Definition KoStore.h:29
@ Zip
Definition KoStore.h:30
bool bad() const
Definition KoStore.cpp:414
static KoStore * createStore(const QString &fileName, Mode mode, const QByteArray &appIdentification=QByteArray(), Backend backend=Auto, bool writeMimetype=true)
Definition KoStore.cpp:39
bool finalize()
Definition KoStore.cpp:395
bool open(const QString &name)
Definition KoStore.cpp:109
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
QSharedPointer< KoResource > KoResourceSP
const QString SeExprScripts
void setValid(bool valid)
void setName(const QString &name)
QImage image
void setFilename(const QString &filename)
QString filename
void setDirty(bool value)
Mark the preset as modified but not saved.
void setImage(const QImage &image)
bool isDirty() const
QString name