Krita Source Code Documentation
Loading...
Searching...
No Matches
KisReferenceImageCollection.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Jouni Pentikäinen <joupent@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7
8#include <QIODevice>
9#include <QMessageBox>
10
11#include <libs/store/KoStore.h>
12#include <KisReferenceImage.h>
14
15const QString METADATA_FILE = "reference_images.xml";
16
20
25
27{
28 QScopedPointer<KoStore> store(KoStore::createStore(io, KoStore::Write, "application/x-krita-reference-images]", KoStore::Zip));
29 if (store.isNull()) return false;
30
31 QDomDocument doc;
32 QDomElement root = doc.createElement("referenceimages");
33 doc.insertBefore(root, QDomNode());
34
35 std::sort(references.begin(), references.end(), KoShape::compareShapeZIndex);
36
37 int nextId = 0;
38 Q_FOREACH(KisReferenceImage *reference, references) {
39 reference->saveXml(doc, root, nextId++);
40
41 if (reference->embed()) {
42 bool ok = reference->saveImage(store.data());
43 if (!ok) return false;
44 }
45 }
46
47 if (!store->open(METADATA_FILE)) {
48 return false;
49 }
50
51 KoStoreDevice xmlDev(store.data());
52 xmlDev.write(doc.toByteArray());
53 xmlDev.close();
54 store->close();
55
56 return true;
57}
58
60{
61 QScopedPointer<KoStore> store(KoStore::createStore(io, KoStore::Read, "application/x-krita-reference-images", KoStore::Zip));
62 if (!store || store->bad()) {
63 return false;
64 }
65
66 if (!store->hasFile(METADATA_FILE) || !store->open(METADATA_FILE)) {
67 return false;
68 }
69
70 QByteArray xml = store->device()->readAll();
71 store->close();
72
73 QDomDocument doc;
74 doc.setContent(xml);
75 QDomElement root = doc.documentElement();
76
77 QStringList failures;
78
79 QDomElement element = root.firstChildElement("referenceimage");
80 while (!element.isNull()) {
82
83 if (reference->loadImage(store.data())) {
84 references.append(reference);
85 } else {
86 failures << (reference->embed() ? reference->internalFile() : reference->filename());
87 delete reference;
88 }
89 element = element.nextSiblingElement("referenceimage");
90 }
91
92 if (!failures.isEmpty()) {
93 QMessageBox::warning(
94 0,
95 i18nc("@title:window", "Krita"),
96 i18n("The following reference images could not be loaded:\n%1", failures.join('\n')),
97 QMessageBox::Ok, QMessageBox::Ok
98 );
99
100 }
101
102 return true;
103}
const QString METADATA_FILE
QVector< KisReferenceImage * > references
const QVector< KisReferenceImage * > & referenceImages() const
The KisReferenceImage class represents a single reference image.
bool saveImage(KoStore *store) const
bool loadImage(KoStore *store)
QString filename() const
void saveXml(QDomDocument &document, QDomElement &parentElement, int id)
QString internalFile() const
static KisReferenceImage * fromXml(const QDomElement &elem)
static bool compareShapeZIndex(KoShape *s1, KoShape *s2)
Definition KoShape.cpp:434
void close() override
@ Read
Definition KoStore.h:29
@ Write
Definition KoStore.h:29
@ Zip
Definition KoStore.h:30
static KoStore * createStore(const QString &fileName, Mode mode, const QByteArray &appIdentification=QByteArray(), Backend backend=Auto, bool writeMimetype=true)
Definition KoStore.cpp:39