Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMetaData::Value Class Reference

#include <kis_meta_data_value.h>

Public Types

enum  ValueType {
  Invalid , Variant , OrderedArray , UnorderedArray ,
  AlternativeArray , LangArray , Structure , Rational
}
 Define the possible value type. More...
 

Public Member Functions

void addPropertyQualifier (const QString &_name, const Value &)
 
QList< KisMetaData::ValueasArray () const
 
double asDouble () const
 
int asInteger () const
 
QMap< QString, KisMetaData::ValueasLangArray () const
 
KisMetaData::Rational asRational () const
 
QMap< QString, KisMetaData::ValueasStructure () const
 
QVariant asVariant () const
 
bool isArray () const
 
Valueoperator+= (const Value &)
 
Valueoperator= (const Value &v)
 
bool operator== (const Value &) const
 
const QMap< QString, Value > & propertyQualifiers () const
 
bool setArrayVariant (int index, const QVariant &variant)
 
bool setStructureVariant (const QString &fieldNAme, const QVariant &variant)
 
bool setVariant (const QVariant &variant)
 
QString toString () const
 
ValueType type () const
 
 Value ()
 
 Value (const KisMetaData::Rational &rational)
 
 Value (const QList< Value > &array, ValueType type=OrderedArray)
 
 Value (const QMap< QString, Value > &structure)
 
 Value (const QVariant &value)
 
 Value (const Value &v)
 
 ~Value ()
 

Private Attributes

Private *const d
 

Detailed Description

Value is build on top of QVariant to extend it to support the various types and extensions through property qualifiers.

Definition at line 34 of file kis_meta_data_value.h.

Member Enumeration Documentation

◆ ValueType

Define the possible value type.

Enumerator
Invalid 
Variant 
OrderedArray 
UnorderedArray 
AlternativeArray 
LangArray 
Structure 
Rational 

Definition at line 39 of file kis_meta_data_value.h.

Constructor & Destructor Documentation

◆ Value() [1/6]

Value::Value ( )

Definition at line 31 of file kis_meta_data_value.cc.

31 : d(new Private)
32{
33 d->type = Invalid;
34}

References d, and Invalid.

◆ Value() [2/6]

KisMetaData::Value::Value ( const QVariant & value)

◆ Value() [3/6]

Value::Value ( const QList< Value > & array,
ValueType type = OrderedArray )
Parameters
typeis one of OrderedArray, UnorderedArray, AlternativeArray or LangArray

Definition at line 43 of file kis_meta_data_value.cc.

43 : d(new Private)
44{
46 d->value.array = new QList<Value>(array);
47 d->type = type; // TODO: I am hesitating about LangArray to keep them as array or convert them to maps
48}
ValueType type() const

References AlternativeArray, d, LangArray, OrderedArray, type(), and UnorderedArray.

◆ Value() [4/6]

Value::Value ( const QMap< QString, Value > & structure)

Definition at line 50 of file kis_meta_data_value.cc.

50 : d(new Private)
51{
52 d->type = Structure;
53 d->value.structure = new QMap<QString, Value>(structure);
54}

References d, and Structure.

◆ Value() [5/6]

KisMetaData::Value::Value ( const KisMetaData::Rational & rational)

◆ Value() [6/6]

Value::Value ( const Value & v)

Definition at line 63 of file kis_meta_data_value.cc.

63 : d(new Private)
64{
65 d->type = Invalid;
66 *this = v;
67}
qreal v

References d, Invalid, and v.

◆ ~Value()

Value::~Value ( )

Definition at line 95 of file kis_meta_data_value.cc.

96{
97 delete d;
98}

References d.

Member Function Documentation

◆ addPropertyQualifier()

void Value::addPropertyQualifier ( const QString & _name,
const Value & _value )

Definition at line 100 of file kis_meta_data_value.cc.

101{
102 d->propertyQualifiers[_name] = _value;
103}

References d.

◆ asArray()

QList< Value > Value::asArray ( ) const
Returns
the array hold by this Value, or an empty array if this Value is not either an OrderedArray, UnorderedArray or AlternativeArray

Definition at line 208 of file kis_meta_data_value.cc.

209{
210 if (isArray()) {
211 return *d->value.array;
212 }
213 return QList<Value>();
214}

References d, and isArray().

◆ asDouble()

double Value::asDouble ( ) const
Returns
the value as a double, or null if it's not possible, rationals are evaluated

Definition at line 115 of file kis_meta_data_value.cc.

116{
117 switch (type()) {
118 case Variant:
119 return d->value.variant->toDouble(0);
120 case Rational:
121 return d->value.rational->numerator / (double)d->value.rational->denominator;
122 default:
123 return 0.0;
124 }
125 return 0.0;
126}

References d, Rational, type(), and Variant.

◆ asInteger()

int Value::asInteger ( ) const
Returns
the value as an integer, or null if it's not possible, rationals are evaluated

Definition at line 128 of file kis_meta_data_value.cc.

129{
130 switch (type()) {
131 case Variant:
132 return d->value.variant->toInt(0);
133 case Rational:
134 return d->value.rational->numerator / d->value.rational->denominator;
135 default:
136 return 0;
137 }
138 return 0;
139}

References d, Rational, type(), and Variant.

◆ asLangArray()

QMap< QString, KisMetaData::Value > Value::asLangArray ( ) const

It's a convenient function that build a map from a LangArray using the property qualifier "xml:lang" for the key of the map.

Definition at line 386 of file kis_meta_data_value.cc.

387{
388 Q_ASSERT(d->type == LangArray);
389 QMap<QString, KisMetaData::Value> langArray;
390 Q_FOREACH (const KisMetaData::Value& val, *d->value.array) {
391 Q_ASSERT(val.d->propertyQualifiers.contains("xml:lang")); // TODO probably worth to have an assert for this in the constructor as well
392 KisMetaData::Value valKeyVal = val.d->propertyQualifiers.value("xml:lang");
393 Q_ASSERT(valKeyVal.type() == Variant);
394 QVariant valKeyVar = valKeyVal.asVariant();
395 Q_ASSERT(valKeyVar.type() == QVariant::String);
396 langArray[valKeyVar.toString()] = val;
397 }
398 return langArray;
399}
QVariant asVariant() const

References asVariant(), d, LangArray, type(), and Variant.

◆ asRational()

KisMetaData::Rational Value::asRational ( ) const
Returns
the Rational hold by this Value, or a null rational if this Value is not an Rational

Definition at line 200 of file kis_meta_data_value.cc.

201{
202 if (d->type == Rational) {
203 return *d->value.rational;
204 }
205 return KisMetaData::Rational();
206}

References d.

◆ asStructure()

QMap< QString, KisMetaData::Value > Value::asStructure ( ) const
Returns
the structure hold by this Value, or an empty structure if this Value is not a Structure

Definition at line 222 of file kis_meta_data_value.cc.

223{
224 if (type() == Structure) {
225 return *d->value.structure;
226 }
227 return QMap<QString, KisMetaData::Value>();
228}

References d, Structure, and type().

◆ asVariant()

QVariant Value::asVariant ( ) const
Returns
the Variant hold by this Value, or an empty QVariant if this Value is not a Variant

Definition at line 141 of file kis_meta_data_value.cc.

142{
143 switch (type()) {
144 case Variant:
145 return *d->value.variant;
146 case Rational:
147 return QVariant(QString("%1 / %2").arg(d->value.rational->numerator).arg(d->value.rational->denominator));
148 default: break;
149 }
150 return QVariant();
151}

References d, Rational, type(), and Variant.

◆ isArray()

bool Value::isArray ( ) const
Returns
true if this Value is either an OrderedArray, UnorderedArray or AlternativeArray

Definition at line 217 of file kis_meta_data_value.cc.

218{
219 return type() == OrderedArray || type() == UnorderedArray || type() == AlternativeArray;
220}

References AlternativeArray, OrderedArray, type(), and UnorderedArray.

◆ operator+=()

Value & Value::operator+= ( const Value & v)

Definition at line 276 of file kis_meta_data_value.cc.

277{
278 switch (d->type) {
279 case Value::Invalid:
280 Q_ASSERT(v.type() == Value::Invalid);
281 break;
282 case Value::Variant:
283 Q_ASSERT(v.type() == Value::Variant);
284 {
285 QVariant v1 = *d->value.variant;
286 QVariant v2 = *v.d->value.variant;
287 Q_ASSERT(v2.canConvert(v1.type()));
288 switch (v1.type()) {
289 default:
290 warnMetaData << "KisMetaData: Merging metadata of type" << v1.type() << "is unsupported!";
291 break;
292 case QVariant::Date:
293 *d->value.variant = qMax(v1.toDate(), v2.toDate());
294 break;
295 case QVariant::DateTime:
296 *d->value.variant = qMax(v1.toDate(), v2.toDate());
297 break;
298 case QVariant::Double:
299 *d->value.variant = v1.toDouble() + v2.toDouble();
300 break;
301 case QVariant::Int:
302 *d->value.variant = v1.toInt() + v2.toInt();
303 break;
304 case QVariant::List:
305 *d->value.variant = v1.toList() + v2.toList();
306 break;
307 case QVariant::LongLong:
308 *d->value.variant = v1.toLongLong() + v2.toLongLong();
309 break;
310 case QVariant::Point:
311 *d->value.variant = v1.toPoint() + v2.toPoint();
312 break;
313 case QVariant::PointF:
314 *d->value.variant = v1.toPointF() + v2.toPointF();
315 break;
316 case QVariant::String:
317 *d->value.variant = QVariant(v1.toString() + v2.toString());
318 break;
319 case QVariant::StringList:
320 *d->value.variant = v1.toStringList() + v2.toStringList();
321 break;
322 case QVariant::Time: {
323 QTime t1 = v1.toTime();
324 QTime t2 = v2.toTime();
325 int h = t1.hour() + t2.hour();
326 int m = t1.minute() + t2.minute();
327 int s = t1.second() + t2.second();
328 int ms = t1.msec() + t2.msec();
329 if (ms > 999) {
330 ms -= 999; s++;
331 }
332 if (s > 60) {
333 s -= 60; m++;
334 }
335 if (m > 60) {
336 m -= 60; h++;
337 }
338 if (h > 24) {
339 h -= 24;
340 }
341 *d->value.variant = QTime(h, m, s, ms);
342 }
343 break;
344 case QVariant::UInt:
345 *d->value.variant = v1.toUInt() + v2.toUInt();
346 break;
347 case QVariant::ULongLong:
348 *d->value.variant = v1.toULongLong() + v2.toULongLong();
349 break;
350 }
351
352 }
353 break;
357 if (v.isArray()) {
358 *(d->value.array) += *(v.d->value.array);
359 } else {
360 d->value.array->append(v);
361 }
362 }
363 break;
364 case Value::LangArray: {
365 Q_ASSERT(v.type() == Value::LangArray);
366 }
367 break;
368 case Value::Structure: {
369 Q_ASSERT(v.type() == Value::Structure);
370 break;
371 }
372 case Value::Rational: {
373 Q_ASSERT(v.type() == Value::Rational);
374 d->value.rational->numerator =
375 (d->value.rational->numerator
376 * v.d->value.rational->denominator)
377 + (v.d->value.rational->numerator
378 * d->value.rational->denominator);
379 d->value.rational->denominator *= v.d->value.rational->denominator;
380 break;
381 }
382 }
383 return *this;
384}
#define warnMetaData
Definition kis_debug.h:103

References AlternativeArray, d, Invalid, LangArray, OrderedArray, Rational, Structure, UnorderedArray, v, Variant, and warnMetaData.

◆ operator=()

Value & Value::operator= ( const Value & v)

Definition at line 69 of file kis_meta_data_value.cc.

70{
71 d->type = v.d->type;
72 d->propertyQualifiers = v.d->propertyQualifiers;
73 switch (d->type) {
74 case Invalid:
75 break;
76 case Variant:
77 d->value.variant = new QVariant(*v.d->value.variant);
78 break;
79 case OrderedArray:
80 case UnorderedArray:
82 case LangArray:
83 d->value.array = new QList<Value>(*v.d->value.array);
84 break;
85 case Structure:
86 d->value.structure = new QMap<QString, Value>(*v.d->value.structure);
87 break;
88 case Rational:
89 d->value.rational = new KisMetaData::Rational(*v.d->value.rational);
90 }
91 return *this;
92}

References AlternativeArray, d, Invalid, LangArray, OrderedArray, Rational, Structure, UnorderedArray, v, and Variant.

◆ operator==()

bool Value::operator== ( const Value & rhs) const

Definition at line 255 of file kis_meta_data_value.cc.

256{
257 if (d->type != rhs.d->type) return false;
258 switch (d->type) {
259 case Value::Invalid:
260 return true;
261 case Value::Variant:
262 return asVariant() == rhs.asVariant();
266 case Value::LangArray:
267 return asArray() == rhs.asArray();
268 case Value::Structure:
269 return asStructure() == rhs.asStructure();
270 case Value::Rational:
271 return asRational() == rhs.asRational();
272 }
273 return false;
274}
QList< KisMetaData::Value > asArray() const
QMap< QString, KisMetaData::Value > asStructure() const
KisMetaData::Rational asRational() const
ValueType type

References AlternativeArray, asArray(), asRational(), asStructure(), asVariant(), d, Invalid, LangArray, OrderedArray, Rational, Structure, UnorderedArray, and Variant.

◆ propertyQualifiers()

const QMap< QString, Value > & KisMetaData::Value::propertyQualifiers ( ) const

◆ setArrayVariant()

bool Value::setArrayVariant ( int index,
const QVariant & variant )

Definition at line 189 of file kis_meta_data_value.cc.

190{
191 if (isArray()) {
192 for (int i = d->value.array->size(); i <= index; ++i) {
193 d->value.array->append(Value());
194 }
195 (*d->value.array)[index].setVariant(variant);
196 }
197 return false;
198}
bool setVariant(const QVariant &variant)

References d, isArray(), setVariant(), and Value().

◆ setStructureVariant()

bool Value::setStructureVariant ( const QString & fieldNAme,
const QVariant & variant )

Definition at line 181 of file kis_meta_data_value.cc.

182{
183 if (type() == Structure) {
184 return (*d->value.structure)[fieldNAme].setVariant(variant);
185 }
186 return false;
187}

References d, Structure, and type().

◆ setVariant()

bool Value::setVariant ( const QVariant & variant)

Set this Value to the given variant, or does nothing if this Value is not a Variant.

Returns
true if the value was changed

Definition at line 153 of file kis_meta_data_value.cc.

154{
155 switch (type()) {
157 *this = KisMetaData::Value(variant);
158 return true;
159 case Rational: {
160 QRegExp rx("([^\\/]*)\\/([^\\/]*)");
161 rx.indexIn(variant.toString());
162 // TODO: erm... did someone forgot to write actual code here?
163
164 // for now just safe assert and return a failure
165 KIS_SAFE_ASSERT_RECOVER_NOOP(0 && "Rational metadata values are not implemented!");
166 return false;
167 }
169 if (d->value.variant->type() == variant.type()) {
170 *d->value.variant = variant;
171 return true;
172 }
173 }
174 return true;
175 default:
176 break;
177 }
178 return false;
179}
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130

References d, Invalid, KIS_SAFE_ASSERT_RECOVER_NOOP, Rational, type(), and Variant.

◆ toString()

QString Value::toString ( ) const

Definition at line 401 of file kis_meta_data_value.cc.

402{
403 switch (type()) {
404 case Value::Invalid:
405 return i18n("Invalid value.");
406 case Value::Variant:
407 return d->value.variant->toString();
408 break;
412 case Value::LangArray: {
413 QString r = QString("[%1]{ ").arg(d->value.array->size());
414 for (int i = 0; i < d->value.array->size(); ++i) {
415 const Value& val = d->value.array->at(i);
416 r += val.toString();
417 if (i != d->value.array->size() - 1) {
418 r += ',';
419 }
420 r += ' ';
421 }
422 r += '}';
423 return r;
424 }
425 case Value::Structure: {
426 QString r = "{ ";
427 QList<QString> fields = d->value.structure->keys();
428 for (int i = 0; i < fields.count(); ++i) {
429 const QString& field = fields[i];
430 const Value& val = d->value.structure->value(field);
431 r += field + " => " + val.toString();
432 if (i != d->value.array->size() - 1) {
433 r += ',';
434 }
435 r += ' ';
436 }
437 r += '}';
438 return r;
439 }
440 break;
441 case Value::Rational:
442 return QString("%1 / %2").arg(d->value.rational->numerator).arg(d->value.rational->denominator);
443 }
444 return i18n("Invalid value.");
445}

References AlternativeArray, d, Invalid, LangArray, OrderedArray, Rational, Structure, toString(), type(), UnorderedArray, and Variant.

◆ type()

ValueType KisMetaData::Value::type ( ) const
Returns
the type of this Value

Member Data Documentation

◆ d

Private* const KisMetaData::Value::d
private

Definition at line 115 of file kis_meta_data_value.h.


The documentation for this class was generated from the following files: