Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_dom_utils.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_DOM_UTILS_H
8#define __KIS_DOM_UTILS_H
9
10#include <float.h>
11
12#include <QPointF>
13#include <QDomElement>
14#include <QLocale>
15#include <QColor>
16#include <QIODevice>
17
18#include "kis_global.h"
19#include <klocalizedstring.h>
20
21#include "kritaglobal_export.h"
22#include "kis_debug.h"
24#include "KisPortingUtils.h"
25
26class QVector3D;
27
28namespace KisDomUtils {
29
30 inline QString toString(const QString &value) {
31 return value;
32 }
33
34 template<typename T>
35 inline QString toString(T value) {
36 return QString::number(value);
37 }
38
39 inline QString toString(float value) {
40 QString str;
41 QTextStream stream;
43 stream.setString(&str, QIODevice::WriteOnly);
44 stream.setRealNumberPrecision(FLT_DIG);
45 stream << value;
46 return str;
47 }
48
49 inline QString toString(double value) {
50 QString str;
51 QTextStream stream;
53 stream.setString(&str, QIODevice::WriteOnly);
54 stream.setRealNumberPrecision(15);
55 stream << value;
56 return str;
57 }
58
59 inline int toInt(const QString &str, bool *ok=nullptr) {
60 bool ok_locale = false;
61 int value = 0;
62
63 QLocale c(QLocale::German);
64
65 value = str.toInt(&ok_locale);
66 if (!ok_locale) {
67 value = c.toInt(str, &ok_locale);
68 }
69
70 if (!ok_locale && ok == nullptr) {
71 warnKrita << "WARNING: KisDomUtils::toInt failed:" << ppVar(str);
72 value = 0;
73 }
74
75 if (ok != nullptr) {
76 *ok = ok_locale;
77 }
78
79 return value;
80 }
81
82 inline double toDouble(const QString &str, bool *ok=nullptr) {
83 bool ok_locale = false;
84 double value = 0;
85
86 QLocale c(QLocale::German);
87
98 value = str.toDouble(&ok_locale);
99 if (!ok_locale) {
100 value = c.toDouble(str, &ok_locale);
101 }
102
103 if (!ok_locale && ok == nullptr) {
104 warnKrita << "WARNING: KisDomUtils::toDouble failed:" << ppVar(str);
105 value = 0.0;
106 }
107
108 if (ok != nullptr) {
109 *ok = ok_locale;
110 }
111
112 return value;
113 }
114
115
116 inline QString qColorToQString(QColor color)
117 {
118 // color channels will usually have 0-255
119 QString customColor = QString::number(color.red()).append(",")
120 .append(QString::number(color.green())).append(",")
121 .append(QString::number(color.blue())).append(",")
122 .append(QString::number(color.alpha()));
123
124 return customColor;
125 }
126
127 inline QColor qStringToQColor(QString colorString)
128 {
129 QStringList colorComponents = colorString.split(',');
130 return QColor(colorComponents[0].toInt(), colorComponents[1].toInt(), colorComponents[2].toInt(), colorComponents[3].toInt());
131 }
132
133
134
135
143void KRITAGLOBAL_EXPORT saveValue(QDomElement *parent, const QString &tag, const QRect &rc);
144void KRITAGLOBAL_EXPORT saveValue(QDomElement *parent, const QString &tag, const QRectF &rc);
145void KRITAGLOBAL_EXPORT saveValue(QDomElement *parent, const QString &tag, const QSize &size);
146void KRITAGLOBAL_EXPORT saveValue(QDomElement *parent, const QString &tag, const QPoint &pt);
147void KRITAGLOBAL_EXPORT saveValue(QDomElement *parent, const QString &tag, const QPointF &pt);
148void KRITAGLOBAL_EXPORT saveValue(QDomElement *parent, const QString &tag, const QVector3D &pt);
149void KRITAGLOBAL_EXPORT saveValue(QDomElement *parent, const QString &tag, const QTransform &t);
150void KRITAGLOBAL_EXPORT saveValue(QDomElement *parent, const QString &tag, const QColor &t);
151
159template <typename T>
160void saveValue(QDomElement *parent, const QString &tag, T value)
161{
162 QDomDocument doc = parent->ownerDocument();
163 QDomElement e = doc.createElement(tag);
164 parent->appendChild(e);
165
166 e.setAttribute("type", "value");
167 e.setAttribute("value", toString(value));
168}
169
178template <template <class...> class Container, typename T, typename ...Args>
179typename std::enable_if<KritaUtils::is_container<Container<T, Args...>>::value, void>::type
180saveValue(QDomElement *parent, const QString &tag, const Container<T, Args...> &array)
181{
182 QDomDocument doc = parent->ownerDocument();
183 QDomElement e = doc.createElement(tag);
184 parent->appendChild(e);
185
186 e.setAttribute("type", "array");
187
188 int i = 0;
189 Q_FOREACH (const T &v, array) {
190 saveValue(&e, QString("item_%1").arg(i++), v);
191 }
192}
193
200bool KRITAGLOBAL_EXPORT findOnlyElement(const QDomElement &parent, const QString &tag, QDomElement *el, QStringList *errorMessages = 0);
201
202
211bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, float *v);
212bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, double *v);
213bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QSize *size);
214bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QRect *rc);
215bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QRectF *rc);
216bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QPoint *pt);
217bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QPointF *pt);
218bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QVector3D *pt);
219bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QTransform *t);
220bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QString *value);
221bool KRITAGLOBAL_EXPORT loadValue(const QDomElement &e, QColor *value);
222
223
224namespace Private {
225 bool KRITAGLOBAL_EXPORT checkType(const QDomElement &e, const QString &expectedType);
226}
227
228
237template <typename T>
238 typename std::enable_if<std::is_arithmetic<T>::value, bool>::type
239loadValue(const QDomElement &e, T *value)
240{
241 if (!Private::checkType(e, "value")) return false;
242
243 QVariant v(e.attribute("value", "no-value"));
244 *value = v.value<T>();
245 return true;
246}
247
252template <typename T, typename E>
253 typename std::enable_if<std::is_empty<E>::value, bool>::type
254loadValue(const QDomElement &parent, T *value, const E &/*env*/) {
255 return loadValue(parent, value);
256}
257
267template <template <class ...> class Container, typename T, typename E, typename ...Args>
268typename std::enable_if<KritaUtils::is_appendable_container<Container<T, Args...>>::value, bool>::type
269loadValue(const QDomElement &e, Container<T, Args...> *array, const E &env = std::tuple<>())
270{
271 if (!Private::checkType(e, "array")) return false;
272
273 QDomElement child = e.firstChildElement();
274 while (!child.isNull()) {
275 T value;
276 if (!loadValue(child, &value, env)) return false;
277 array->push_back(value);
278 child = child.nextSiblingElement();
279 }
280 return true;
281}
282
283template <template <class ...> class Container, typename T, typename E, typename F, typename ...Args>
284typename std::enable_if<KritaUtils::is_appendable_container<Container<T, Args...>>::value, bool>::type
285loadValue(const QDomElement &e, Container<T, Args...> *array, const E &env1, const F &env2)
286{
287 if (!Private::checkType(e, "array")) return false;
288
289 QDomElement child = e.firstChildElement();
290 while (!child.isNull()) {
291 T value;
292 if (!loadValue(child, &value, env1, env2)) return false;
293 array->push_back(value);
294 child = child.nextSiblingElement();
295 }
296 return true;
297}
298
299template <typename T, typename E = std::tuple<>>
300 bool loadValue(const QDomElement &parent, const QString &tag, T *value, const E &env = E())
301{
302 QDomElement e;
303 if (!findOnlyElement(parent, tag, &e)) return false;
304
305 return loadValue(e, value, env);
306}
307
308template <typename T, typename E, typename F>
309 bool loadValue(const QDomElement &parent, const QString &tag, T *value, const E &env1, const F &env2)
310{
311 QDomElement e;
312 if (!findOnlyElement(parent, tag, &e)) return false;
313
314 return loadValue(e, value, env1, env2);
315}
316
317
318KRITAGLOBAL_EXPORT QDomElement findElementByAttribute(QDomNode parent,
319 const QString &tag,
320 const QString &attribute,
321 const QString &value);
322
323KRITAGLOBAL_EXPORT bool removeElements(QDomElement &parent, const QString &tag);
324
325}
326
327#endif /* __KIS_DOM_UTILS_H */
float value(const T *src, size_t ch)
qreal v
#define warnKrita
Definition kis_debug.h:87
#define ppVar(var)
Definition kis_debug.h:155
bool checkType(const QDomElement &e, const QString &expectedType)
void saveValue(QDomElement *parent, const QString &tag, const QSize &size)
bool removeElements(QDomElement &parent, const QString &tag)
QString qColorToQString(QColor color)
bool findOnlyElement(const QDomElement &parent, const QString &tag, QDomElement *el, QStringList *errorMessages)
QColor qStringToQColor(QString colorString)
double toDouble(const QString &str, bool *ok=nullptr)
int toInt(const QString &str, bool *ok=nullptr)
QDomElement findElementByAttribute(QDomNode parent, const QString &tag, const QString &attribute, const QString &value)
bool loadValue(const QDomElement &e, float *v)
QString toString(const QString &value)
void setUtf8OnStream(QTextStream &stream)