Krita Source Code Documentation
Loading...
Searching...
No Matches
KoDocumentInfo.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 SPDX-FileCopyrightText: 1998, 1999, 2000 Torben Weis <weis@kde.org>
3 SPDX-FileCopyrightText: 2004 David Faure <faure@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "KoDocumentInfo.h"
9
10#include "KisDocument.h"
11#include "KoXmlNS.h"
12#include <KoResourcePaths.h>
13#include <QDateTime>
14#include <KoStoreDevice.h>
15#include <QDomDocument>
16#include <QDir>
17
18#include <kconfig.h>
19#include <kconfiggroup.h>
20#include <klocalizedstring.h>
21#include <kuser.h>
22#include <kemailsettings.h>
23
24#include <KritaVersionWrapper.h>
25
26
27KoDocumentInfo::KoDocumentInfo(QObject *parent) : QObject(parent)
28{
29 m_aboutTags << "title" << "description" << "subject" << "abstract"
30 << "keyword" << "initial-creator" << "editing-cycles" << "editing-time"
31 << "date" << "creation-date" << "language" << "license";
32
33 m_authorTags << "creator" << "creator-first-name" << "creator-last-name" << "initial" << "author-title" << "position" << "company";
34 m_contactTags << "email" << "telephone" << "telephone-work" << "fax" << "country" << "postal-code" << "city" << "street";
35 setAboutInfo("editing-cycles", "0");
36 setAboutInfo("time-elapsed", "0");
37 setAboutInfo("initial-creator", i18n("Unknown"));
38 setAboutInfo("creation-date", QDateTime::currentDateTime()
39 .toString(Qt::ISODate));
40}
41
43 : QObject(parent),
44 m_aboutTags(rhs.m_aboutTags),
45 m_authorTags(rhs.m_authorTags),
46 m_contact(rhs.m_contact),
47 m_authorInfo(rhs.m_authorInfo),
48 m_authorInfoOverride(rhs.m_authorInfoOverride),
49 m_aboutInfo(rhs.m_aboutInfo),
50 m_generator(rhs.m_generator)
51{
52}
53
57
58bool KoDocumentInfo::load(const QDomDocument &doc)
59{
60 m_authorInfo.clear();
61
62 if (!loadAboutInfo(doc.documentElement()))
63 return false;
64
65 if (!loadAuthorInfo(doc.documentElement()))
66 return false;
67
68 return true;
69}
70
71
72QDomDocument KoDocumentInfo::save(QDomDocument &doc)
73{
75
76 QDomElement s = saveAboutInfo(doc);
77 if (!s.isNull())
78 doc.documentElement().appendChild(s);
79
80 s = saveAuthorInfo(doc);
81 if (!s.isNull())
82 doc.documentElement().appendChild(s);
83
84
85 if (doc.documentElement().isNull())
86 return QDomDocument();
87
88 return doc;
89}
90
91void KoDocumentInfo::setAuthorInfo(const QString &info, const QString &data)
92{
93 if (!m_authorTags.contains(info) && !m_contactTags.contains(info) && !info.contains("contact-mode-")) {
94 return;
95 }
96
97 m_authorInfoOverride.insert(info, data);
98}
99
100void KoDocumentInfo::setActiveAuthorInfo(const QString &info, const QString &data)
101{
102 if (!m_authorTags.contains(info) && !m_contactTags.contains(info) && !info.contains("contact-mode-")) {
103 return;
104 }
105 if (m_contactTags.contains(info)) {
106 m_contact.insert(data, info);
107 } else {
108 m_authorInfo.insert(info, data);
109 }
110 Q_EMIT infoUpdated(info, data);
111}
112
113QString KoDocumentInfo::authorInfo(const QString &info) const
114{
115 if (!m_authorTags.contains(info) && !m_contactTags.contains(info) && !info.contains("contact-mode-"))
116 return QString();
117
118 return m_authorInfo[ info ];
119}
120
122{
123 return m_contact.keys();
124}
125
126void KoDocumentInfo::setAboutInfo(const QString &info, const QString &data)
127{
128 if (!m_aboutTags.contains(info))
129 return;
130
131 m_aboutInfo.insert(info, data);
132 Q_EMIT infoUpdated(info, data);
133}
134
135QString KoDocumentInfo::aboutInfo(const QString &info) const
136{
137 if (!m_aboutTags.contains(info)) {
138 return QString();
139 }
140
141 return m_aboutInfo[info];
142}
143
144
145bool KoDocumentInfo::loadAuthorInfo(const QDomElement &root)
146{
147 m_contact.clear();
148
149 QDomElement e = root.firstChildElement("author");
150 if(e.isNull()) {
151 return false;
152 }
153
154 for (e = e.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) {
155 QString field = e.tagName();
156 QString value = e.text();
157
158 if (field == "full-name") {
159 setActiveAuthorInfo("creator", value.trimmed());
160 } else if (field == "contact") {
161 m_contact.insert(value, e.attribute("type"));
162 } else {
163 setActiveAuthorInfo(field, value.trimmed());
164 }
165 }
166
167 return true;
168}
169
170QDomElement KoDocumentInfo::saveAuthorInfo(QDomDocument &doc)
171{
172 QDomElement e = doc.createElement("author");
173 QDomElement t;
174
175 Q_FOREACH (const QString &tag, m_authorTags) {
176 if (tag == "creator")
177 t = doc.createElement("full-name");
178 else
179 t = doc.createElement(tag);
180
181 e.appendChild(t);
182 t.appendChild(doc.createTextNode(authorInfo(tag)));
183 }
184 for (int i=0; i<m_contact.keys().size(); i++) {
185 t = doc.createElement("contact");
186 e.appendChild(t);
187 QString key = m_contact.keys().at(i);
188 t.setAttribute("type", m_contact[key]);
189 t.appendChild(doc.createTextNode(key));
190 }
191
192 return e;
193}
194
195
196bool KoDocumentInfo::loadAboutInfo(const QDomElement &root)
197{
198 QDomElement e = root.firstChildElement("about");
199 if(e.isNull()) {
200 return false;
201 }
202
203 for (e = e.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) {
204 setAboutInfo(e.tagName(), e.text());
205 }
206
207 return true;
208}
209
210QDomElement KoDocumentInfo::saveAboutInfo(QDomDocument &doc)
211{
212 QDomElement e = doc.createElement("about");
213 QDomElement t;
214
215 Q_FOREACH (const QString &tag, m_aboutTags) {
216 if (tag == "abstract") {
217 t = doc.createElement("abstract");
218 e.appendChild(t);
219 t.appendChild(doc.createCDATASection(aboutInfo(tag)));
220 } else {
221 t = doc.createElement(tag);
222 e.appendChild(t);
223 t.appendChild(doc.createTextNode(aboutInfo(tag)));
224 }
225 }
226
227 return e;
228}
229
231{
232 KisDocument *doc = dynamic_cast< KisDocument *>(parent());
233 if (doc && doc->isAutosaving()) {
234 return;
235 }
236
237 setAboutInfo("editing-cycles", QString::number(aboutInfo("editing-cycles").toInt() + 1));
238 setAboutInfo("date", QDateTime::currentDateTime().toString(Qt::ISODate));
239
241}
242
244{
245 KisDocument *doc = dynamic_cast< KisDocument *>(parent());
246 if (doc && (!doc->isModified())) {
247 return;
248 }
249
250 KConfig config("kritarc");
251 config.reparseConfiguration();
252 KConfigGroup appAuthorGroup(&config, "Author");
253 QString profile = appAuthorGroup.readEntry("active-profile", "");
254
255 QString authorInfo = KoResourcePaths::getAppDataLocation() + "/authorinfo/";
256 QDir dir(authorInfo);
257 QStringList filters = QStringList() << "*.authorinfo";
258
259 //Anon case
260 setActiveAuthorInfo("creator", QString());
261 setActiveAuthorInfo("initial", "");
262 setActiveAuthorInfo("author-title", "");
263 setActiveAuthorInfo("position", "");
264 setActiveAuthorInfo("company", "");
265 if (dir.entryList(filters).contains(profile+".authorinfo")) {
266 QFile file(dir.absoluteFilePath(profile+".authorinfo"));
267 if (file.exists()) {
268 file.open(QFile::ReadOnly);
269 QByteArray ba = file.readAll();
270 file.close();
271 QDomDocument doc = QDomDocument();
272 doc.setContent(ba);
273 QDomElement root = doc.firstChildElement();
274
275 QDomElement el = root.firstChildElement("nickname");
276 if (!el.isNull()) {
277 setActiveAuthorInfo("creator", el.text());
278 }
279 el = root.firstChildElement("givenname");
280 if (!el.isNull()) {
281 setActiveAuthorInfo("creator-first-name", el.text());
282 }
283 el = root.firstChildElement("middlename");
284 if (!el.isNull()) {
285 setActiveAuthorInfo("initial", el.text());
286 }
287 el = root.firstChildElement("familyname");
288 if (!el.isNull()) {
289 setActiveAuthorInfo("creator-last-name", el.text());
290 }
291 el = root.firstChildElement("title");
292 if (!el.isNull()) {
293 setActiveAuthorInfo("author-title", el.text());
294 }
295 el = root.firstChildElement("position");
296 if (!el.isNull()) {
297 setActiveAuthorInfo("position", el.text());
298 }
299 el = root.firstChildElement("company");
300 if (!el.isNull()) {
301 setActiveAuthorInfo("company", el.text());
302 }
303
304 m_contact.clear();
305 el = root.firstChildElement("contact");
306 while (!el.isNull()) {
307 m_contact.insert(el.text(), el.attribute("type"));
308 el = el.nextSiblingElement("contact");
309 }
310 }
311 }
312
313 //allow author info set programmatically to override info from author profile
314 Q_FOREACH (const QString &tag, m_authorTags) {
315 if (m_authorInfoOverride.contains(tag)) {
317 }
318 }
319}
320
322{
323 setAboutInfo("editing-cycles", QString::number(0));
324 setAboutInfo("initial-creator", authorInfo("creator"));
325 setAboutInfo("creation-date", QDateTime::currentDateTime().toString(Qt::ISODate));
326 setAboutInfo("editing-time", QString::number(0));
327}
328
330{
331 return m_generator;
332}
333
334void KoDocumentInfo::setOriginalGenerator(const QString &generator)
335{
336 m_generator = generator;
337}
float value(const T *src, size_t ch)
QList< QString > QStringList
bool isModified() const
The class containing all meta information about a document.
QMap< QString, QString > m_authorInfo
bool loadAuthorInfo(const QDomElement &e)
void setActiveAuthorInfo(const QString &info, const QString &data)
QStringList m_contactTags
bool load(const QDomDocument &doc)
QStringList m_authorTags
void infoUpdated(const QString &info, const QString &data)
QMap< QString, QString > m_aboutInfo
void setOriginalGenerator(const QString &generator)
QStringList m_aboutTags
KoDocumentInfo(QObject *parent=0)
void setAboutInfo(const QString &info, const QString &data)
void updateParametersAndBumpNumCycles()
Bumps the editing cycles count and save date, and then calls updateParameters.
bool loadAboutInfo(const QDomElement &e)
QDomElement saveAuthorInfo(QDomDocument &doc)
QMap< QString, QString > m_authorInfoOverride
QDomDocument save(QDomDocument &doc)
QStringList authorContactInfo() const
authorContactInfo
QString authorInfo(const QString &info) const
void setAuthorInfo(const QString &info, const QString &data)
QString originalGenerator() const
~KoDocumentInfo() override
QDomElement saveAboutInfo(QDomDocument &doc)
QMap< QString, QString > m_contact
QString aboutInfo(const QString &info) const
static QString getAppDataLocation()