Krita Source Code Documentation
Loading...
Searching...
No Matches
KisTag.cpp
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#include "KisTag.h"
8
9#include <QIODevice>
10#include <QLocale>
11#include <QBuffer>
12#include <QStandardPaths>
13#include <QFile>
14#include <QTextCodec>
15#include <QTextStream>
16
17#include <KLocalizedString>
18
19#include <kis_debug.h>
20#include <KisPortingUtils.h>
21
22const QString KisTag::s_group {"Desktop Entry"};
23const QString KisTag::s_type {"Type"};
24const QString KisTag::s_tag {"Tag"};
25const QString KisTag::s_name {"Name"};
26const QString KisTag::s_resourceType {"ResourceType"};
27const QString KisTag::s_url {"URL"};
28const QString KisTag::s_comment {"Comment"};
29const QString KisTag::s_defaultResources {"Default Resources"};
30const QString KisTag::s_desktop {"[Desktop Entry]"};
31
33public:
34 bool valid {false};
35 QString url; // This is the actual tag
36 QString name;
37 QString comment;
38 QMap<QString, QString> names; // The translated tag names
39 QMap<QString, QString> comments; // The translated tag comments
40 QStringList defaultResources; // The list of resources as defined in the tag file
41 QString resourceType; // The resource type this tag can be applied to
42 QString filename; // the original filename for the tag
43 int id {-1};
44 bool active{true};
45};
46
48 : d(new Private)
49{
50}
51
55
57 : d(new Private)
58{
59 *this = rhs;
60}
61
63{
64 if (this != &rhs) {
65 d->valid = rhs.d->valid;
66 d->url = rhs.d->url;
67 d->name = rhs.d->name;
68 d->comment = rhs.d->comment;
69 d->names = rhs.d->names;
70 d->comments = rhs.d->comments;
71 d->defaultResources = rhs.d->defaultResources; d->resourceType = rhs.d->resourceType;
72 d->filename = rhs.d->filename;
73 d->id = rhs.d->id;
74 d->active = rhs.d->active;
75 }
76 return *this;
77}
78
80{
81 return KisTagSP(new KisTag(*this));
82}
83
85{
86 const QStringList languages = KLocalizedString::languages();
87 QString locale;
88 if (languages.isEmpty()) {
89 locale = QLocale().name();
90 }
91 else {
92 locale = languages.first();
93 }
94 return locale;
95}
96
97bool KisTag::valid() const
98{
99 return d->valid;
100}
101
102int KisTag::id() const
103{
104 return d->id;
105}
106
107bool KisTag::active() const
108{
109 return d->active;
110}
111
113{
114 return d->filename;
115}
116
117void KisTag::setFilename(const QString &filename)
118{
119 d->filename = filename;
120}
121
122QString KisTag::name(bool translated) const
123{
124 if (translated && d->names.contains(currentLocale())) {
125 return d->names[currentLocale()];
126 }
127 Q_ASSERT(!d->name.isEmpty());
128 return d->name;
129}
130
131void KisTag::setName(const QString &name)
132{
133 d->name = name;
134}
135
136QMap<QString, QString> KisTag::names() const
137{
138 return d->names;
139}
140
141void KisTag::setNames(const QMap<QString, QString> &names)
142{
143 d->names = names;
144}
145
146QString KisTag::comment(bool translated) const
147{
148 if (translated && d->comments.contains(currentLocale())) {
149 return d->comments[currentLocale()];
150 }
151 return d->comment;
152}
153
154void KisTag::setComment(const QString comment)
155{
156 d->comment = comment;
157}
158
159QString KisTag::url() const
160{
161 return d->url;
162}
163
164void KisTag::setUrl(const QString &url)
165{
166 d->url = url;
167}
168
169
170QMap<QString, QString> KisTag::comments() const
171{
172 return d->comments;
173}
174
175void KisTag::setComments(const QMap<QString, QString> &comments)
176{
177 d->comments = comments;
178}
179
180QString KisTag::resourceType() const
181{
182 return d->resourceType;
183}
184
185void KisTag::setResourceType(const QString &resourceType)
186{
187 d->resourceType = resourceType;
188}
189
191{
192 return d->defaultResources;
193}
194
195void KisTag::setDefaultResources(const QStringList &defaultResources)
196{
197 d->defaultResources = defaultResources;
198}
199
200bool KisTag::load(QIODevice &io)
201{
202 if (!io.isOpen()) {
203 io.open(QIODevice::ReadOnly);
204 }
205 KIS_ASSERT(io.isOpen());
206
207 setValid(false);
208
209 QTextStream stream(&io);
211 QStringList lines;
212 QString line;
213
214 while (stream.readLineInto(&line)) {
215 lines << line;
216 }
217
218 if (lines.length() < 6 ) {
219 qWarning() << d->filename << ": Incomplete tag file" << lines.length();
220 return false;
221 }
222 if (lines[0].toUpper() != s_desktop.toUpper()) {
223 qWarning() << d->filename << ":Invalid tag file" << lines[0];
224 return false;
225 }
226
227 lines.removeFirst();
228
229 Q_FOREACH(const QString line, lines) {
230 if (line.isEmpty()) {
231 continue;
232 }
233
234 if (!line.contains("=")) {
235 qWarning() << "Found invalid line:" << line;
236 continue;
237 }
238 int isPos = line.indexOf("=");
239 QString key = line.left(isPos).trimmed();
240 QString value = line.right(line.size() - (isPos + 1)).trimmed();
241
242 if (key == s_url) {
243 d->url = value;
244 }
245 else if (key == s_resourceType) {
246 d->resourceType = value;
247 }
248 else if (key == s_defaultResources) {
249 d->defaultResources = value.split(',', Qt::SkipEmptyParts);
250 }
251 else if (key == s_name) {
252 d->name = value;
253 }
254 else if (key == s_comment) {
255 d->comment = value;
256 }
257 else if (key.startsWith(s_name + "[")) {
258 int start = key.indexOf('[') + 1;
259 int len = key.size() - (s_name.size() + 2);
260 QString language = key.mid(start, len);
261 d->names[language] = value;
262 }
263 else if (key.startsWith(s_comment + "[")) {
264 int start = key.indexOf('[') + 1;
265 int len = key.size() - (s_comment.size() + 2);
266 QString language = key.mid(start, len);
267 d->comments[language] = value;
268 }
269 }
270
271 setValid(true);
272
273 return true;
274}
275
276bool KisTag::save(QIODevice &io)
277{
278 if (!io.isOpen()) {
279 io.open(QIODevice::WriteOnly | QIODevice::Text);
280 }
281
282 QTextStream stream(&io);
284 stream << s_desktop << '\n';
285 stream << s_type << '=' << s_tag << '\n';
286 stream << s_url << '=' << d->url << '\n';
287 stream << s_resourceType << '=' << d->resourceType << '\n';
288 stream << s_name << '=' << d->name << '\n';
289 stream << s_comment << '=' << d->comment << '\n';
290 stream << s_defaultResources << '=' << d->defaultResources.join(',') << '\n';
291
292 Q_FOREACH(const QString &language, d->names) {
293 stream << s_name << '[' << language << "]=" << d->names[language] << '\n';
294 }
295
296 Q_FOREACH(const QString &language, d->comments) {
297 stream << s_comment << '[' << language << "]=" << d->comments[language] << '\n';
298 }
299
300 return true;
301}
302
303void KisTag::setId(int id)
304{
305 d->id = id;
306}
307
308void KisTag::setActive(bool active)
309{
310 d->active = active;
311}
312
313void KisTag::setValid(bool valid)
314{
315 d->valid = valid;
316}
317
float value(const T *src, size_t ch)
QSharedPointer< KisTag > KisTagSP
Definition KisTag.h:20
QString resourceType
Definition KisTag.cpp:41
QString name
Definition KisTag.cpp:36
QMap< QString, QString > comments
Definition KisTag.cpp:39
QString url
Definition KisTag.cpp:35
QStringList defaultResources
Definition KisTag.cpp:40
QString comment
Definition KisTag.cpp:37
QMap< QString, QString > names
Definition KisTag.cpp:38
QString filename
Definition KisTag.cpp:42
The KisTag loads a tag from a .tag file. A .tag file is a .desktop file. The following fields are imp...
Definition KisTag.h:34
static const QString s_desktop
Definition KisTag.h:30
QString name(bool translated=true) const
The translated names of the tag.
Definition KisTag.cpp:122
virtual ~KisTag()
Definition KisTag.cpp:52
void setName(const QString &name)
Definition KisTag.cpp:131
void setUrl(const QString &url)
Definition KisTag.cpp:164
KisTag()
Definition KisTag.cpp:47
void setComments(const QMap< QString, QString > &comments)
Definition KisTag.cpp:175
static QString currentLocale()
Definition KisTag.cpp:84
static const QString s_defaultResources
Definition KisTag.h:29
void setValid(bool valid)
Definition KisTag.cpp:313
static const QString s_url
Definition KisTag.h:27
static const QString s_comment
Definition KisTag.h:28
static const QString s_name
Definition KisTag.h:25
static const QString s_tag
Definition KisTag.h:24
QString comment(bool translated=true) const
The translated tooltips for the tag.
Definition KisTag.cpp:146
KisTag & operator=(const KisTag &rhs)
Definition KisTag.cpp:62
QString filename()
Definition KisTag.cpp:112
void setDefaultResources(const QStringList &defaultResources)
Definition KisTag.cpp:195
QStringList defaultResources() const
Definition KisTag.cpp:190
QString resourceType() const
Definition KisTag.cpp:180
void setActive(bool active)
Definition KisTag.cpp:308
void setNames(const QMap< QString, QString > &names)
Definition KisTag.cpp:141
static const QString s_resourceType
Definition KisTag.h:26
QScopedPointer< Private > d
Definition KisTag.h:105
bool valid() const
Definition KisTag.cpp:97
bool load(QIODevice &io)
Definition KisTag.cpp:200
bool active() const
Definition KisTag.cpp:107
KisTagSP clone() const
Definition KisTag.cpp:79
void setResourceType(const QString &resourceType)
Definition KisTag.cpp:185
QMap< QString, QString > names() const
Definition KisTag.cpp:136
static const QString s_type
Definition KisTag.h:23
int id() const
Definition KisTag.cpp:102
void setId(int id)
Definition KisTag.cpp:303
void setComment(const QString comment)
Definition KisTag.cpp:154
QMap< QString, QString > comments() const
Definition KisTag.cpp:170
QString url() const
The unique identifier for the tag. Since tag urls are compared COLLATE NOCASE, tag urls must be ASCII...
Definition KisTag.cpp:159
void setFilename(const QString &fileName)
Definition KisTag.cpp:117
static const QString s_group
Definition KisTag.h:22
bool save(QIODevice &io)
Definition KisTag.cpp:276
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
void setUtf8OnStream(QTextStream &stream)