37 case DomProperty::String: {
38 const int index = meta->indexOfProperty(p->attributeName().toUtf8().constData());
39 if (index != -1 && meta->property(index).metaType().id() == QMetaType::QKeySequence)
40 return QVariant::fromValue(QKeySequence(p->elementString()->text()));
44 case DomProperty::Palette: {
45 const DomPalette *dom = p->elementPalette();
48 if (dom->elementActive())
49 afb->setupColorGroup(palette, QPalette::Active, dom->elementActive());
51 if (dom->elementInactive())
52 afb->setupColorGroup(palette, QPalette::Inactive, dom->elementInactive());
54 if (dom->elementDisabled())
55 afb->setupColorGroup(palette, QPalette::Disabled, dom->elementDisabled());
57 palette.setCurrentColorGroup(QPalette::Active);
58 return QVariant::fromValue(palette);
61 case DomProperty::Set: {
62 const QByteArray pname = p->attributeName().toUtf8();
63 const int index = meta->indexOfProperty(pname.constData());
65 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"The set-type property %1 could not be read.").arg(p->attributeName()));
69 const QMetaEnum e = meta->property(index).enumerator();
70 Q_ASSERT(e.isFlag() ==
true);
72 QVariant result(e.keysToValue(p->elementSet().toUtf8().constData(), &ok));
74 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
75 "The value \"%1\" of the set-type property %2 could not be read.").
76 arg(p->elementSet(), p->attributeName()));
82 case DomProperty::Enum: {
83 const QByteArray pname = p->attributeName().toUtf8().constData();
84 const int index = meta->indexOfProperty(pname.constData());
85 const auto &enumValue = p->elementEnum();
91 if (!qstrcmp(meta->className(),
"QFrame")
92 && (pname == QByteArray(
"orientation"))) {
93 return QVariant(enumValue.endsWith(
"Horizontal"_L1) ? QFrame::HLine : QFrame::VLine);
95 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"The enumeration-type property %1 could not be read.").arg(p->attributeName()));
99 const QMetaEnum e = meta->property(index).enumerator();
101 QVariant result(e.keyToValue(enumValue.toUtf8().constData(), &ok));
103 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
104 "The value \"%1\" of the enum-type property %2 could not be read.").
105 arg(enumValue, p->attributeName()));
110 case DomProperty::Brush:
111 return QVariant::fromValue(afb->setupBrush(p->elementBrush()));
113 if (afb->resourceBuilder()->isResourceProperty(p)) {
114 return afb->resourceBuilder()->loadResource(afb->workingDirectory(), p);
121 return domPropertyToVariant(p);
138 case DomProperty::Bool:
139 return QVariant(p->elementBool() ==
"true"_L1);
141 case DomProperty::Cstring:
142 return QVariant(p->elementCstring().toUtf8());
144 case DomProperty::Point: {
145 const DomPoint *point = p->elementPoint();
146 return QVariant(QPoint(point->elementX(), point->elementY()));
149 case DomProperty::PointF: {
150 const DomPointF *pointf = p->elementPointF();
151 return QVariant(QPointF(pointf->elementX(), pointf->elementY()));
154 case DomProperty::Size: {
155 const DomSize *size = p->elementSize();
156 return QVariant(QSize(size->elementWidth(), size->elementHeight()));
159 case DomProperty::SizeF: {
160 const DomSizeF *sizef = p->elementSizeF();
161 return QVariant(QSizeF(sizef->elementWidth(), sizef->elementHeight()));
164 case DomProperty::Rect: {
165 const DomRect *rc = p->elementRect();
166 const QRect g(rc->elementX(), rc->elementY(), rc->elementWidth(), rc->elementHeight());
170 case DomProperty::RectF: {
171 const DomRectF *rcf = p->elementRectF();
172 const QRectF g(rcf->elementX(), rcf->elementY(), rcf->elementWidth(), rcf->elementHeight());
176 case DomProperty::String:
177 return QVariant(p->elementString()->text());
179 case DomProperty::Number:
180 return QVariant(p->elementNumber());
182 case DomProperty::UInt:
183 return QVariant(p->elementUInt());
185 case DomProperty::LongLong:
186 return QVariant(p->elementLongLong());
188 case DomProperty::ULongLong:
189 return QVariant(p->elementULongLong());
191 case DomProperty::Double:
192 return QVariant(p->elementDouble());
194 case DomProperty::Char: {
195 const DomChar *character = p->elementChar();
196 const QChar c(character->elementUnicode());
197 return QVariant::fromValue(c);
200 case DomProperty::Color: {
201 const DomColor *color = p->elementColor();
202 QColor c(color->elementRed(), color->elementGreen(), color->elementBlue());
203 if (color->hasAttributeAlpha())
204 c.setAlpha(color->attributeAlpha());
205 return QVariant::fromValue(c);
208 case DomProperty::Font: {
209 const DomFont *font = p->elementFont();
212 if (font->hasElementFamily() && !font->elementFamily().isEmpty())
213 f.setFamily(font->elementFamily());
214 if (font->hasElementPointSize() && font->elementPointSize() > 0)
215 f.setPointSize(font->elementPointSize());
216 if (font->hasElementItalic())
217 f.setItalic(font->elementItalic());
218 if (font->hasElementUnderline())
219 f.setUnderline(font->elementUnderline());
220 if (font->hasElementStrikeOut())
221 f.setStrikeOut(font->elementStrikeOut());
222 if (font->hasElementKerning())
223 f.setKerning(font->elementKerning());
224 if (font->hasElementAntialiasing())
225 f.setStyleStrategy(font->elementAntialiasing() ? QFont::PreferDefault : QFont::NoAntialias);
226 if (font->hasElementStyleStrategy()) {
227 f.setStyleStrategy(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::StyleStrategy>(
"styleStrategy",
228 font->elementStyleStrategy().toLatin1().constData()));
230 if (font->hasElementHintingPreference()) {
231 f.setHintingPreference(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::HintingPreference>(
"hintingPreference",
232 font->elementHintingPreference().toLatin1().constData()));
235 if (font->hasElementFontWeight()) {
236 f.setWeight(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::Weight>(
238 font->elementFontWeight().toLatin1().constData()));
239 }
else if (font->hasElementBold()) {
240 f.setBold(font->elementBold());
243 return QVariant::fromValue(f);
246 case DomProperty::Date: {
247 const DomDate *date = p->elementDate();
248 return QVariant(QDate(date->elementYear(), date->elementMonth(), date->elementDay()));
251 case DomProperty::Time: {
252 const DomTime *t = p->elementTime();
253 return QVariant(QTime(t->elementHour(), t->elementMinute(), t->elementSecond()));
256 case DomProperty::DateTime: {
257 const DomDateTime *dateTime = p->elementDateTime();
258 const QDate d(dateTime->elementYear(), dateTime->elementMonth(), dateTime->elementDay());
259 const QTime tm(dateTime->elementHour(), dateTime->elementMinute(), dateTime->elementSecond());
260 return QVariant(QDateTime(d, tm));
263 case DomProperty::Url: {
264 const DomUrl *url = p->elementUrl();
265 return QVariant(QUrl(url->elementString()->text()));
269 case DomProperty::Cursor:
270 return QVariant::fromValue(QCursor(
static_cast<Qt::CursorShape>(p->elementCursor())));
272 case DomProperty::CursorShape:
273 return QVariant::fromValue(QCursor(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::CursorShape>(
"cursorShape",
274 p->elementCursorShape().toLatin1().constData())));
277 case DomProperty::Locale: {
278 const DomLocale *locale = p->elementLocale();
279 return QVariant::fromValue(QLocale(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QLocale::Language>(
"language",
280 locale->attributeLanguage().toLatin1().constData()),
281 enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QLocale::Territory>(
"country",
282 locale->attributeCountry().toLatin1().constData())));
284 case DomProperty::SizePolicy: {
285 const DomSizePolicy *sizep = p->elementSizePolicy();
287 QSizePolicy sizePolicy;
288 sizePolicy.setHorizontalStretch(sizep->elementHorStretch());
289 sizePolicy.setVerticalStretch(sizep->elementVerStretch());
293 if (sizep->hasElementHSizeType()) {
294 sizePolicy.setHorizontalPolicy((QSizePolicy::Policy) sizep->elementHSizeType());
295 }
else if (sizep->hasAttributeHSizeType()) {
296 const auto sp = enumKeyToValue<QSizePolicy::Policy>(
297 sizeType_enum, sizep->attributeHSizeType().toLatin1().constData());
298 sizePolicy.setHorizontalPolicy(sp);
301 if (sizep->hasElementVSizeType()) {
302 sizePolicy.setVerticalPolicy((QSizePolicy::Policy) sizep->elementVSizeType());
303 }
else if (sizep->hasAttributeVSizeType()) {
304 const auto sp = enumKeyToValue<QSizePolicy::Policy>(
305 sizeType_enum, sizep->attributeVSizeType().toLatin1().constData());
306 sizePolicy.setVerticalPolicy(sp);
309 return QVariant::fromValue(sizePolicy);
312 case DomProperty::StringList:
313 return QVariant(p->elementStringList()->elementString());
316 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"Reading properties of the type %1 is not supported yet.").arg(p->kind()));
326 switch (v.metaType().id()) {
327 case QMetaType::QString: {
328 auto *str =
new DomString();
329 str->setText(v.toString());
330 if (!translateString)
331 str->setAttributeNotr(u"true"_s);
332 dom_prop->setElementString(str);
336 case QMetaType::QByteArray:
337 dom_prop->setElementCstring(QString::fromUtf8(v.toByteArray()));
341 dom_prop->setElementNumber(v.toInt());
344 case QMetaType::UInt:
345 dom_prop->setElementUInt(v.toUInt());
348 case QMetaType::LongLong:
349 dom_prop->setElementLongLong(v.toLongLong());
352 case QMetaType::ULongLong:
353 dom_prop->setElementULongLong(v.toULongLong());
356 case QMetaType::Double:
357 dom_prop->setElementDouble(v.toDouble());
360 case QMetaType::Bool:
361 dom_prop->setElementBool(v.toBool() ?
"true"_L1 :
"false"_L1);
364 case QMetaType::QChar: {
365 auto *ch =
new DomChar();
366 const QChar character = v.toChar();
367 ch->setElementUnicode(character.unicode());
368 dom_prop->setElementChar(ch);
372 case QMetaType::QPoint: {
373 auto *pt =
new DomPoint();
374 const QPoint point = v.toPoint();
375 pt->setElementX(point.x());
376 pt->setElementY(point.y());
377 dom_prop->setElementPoint(pt);
381 case QMetaType::QPointF: {
382 auto *ptf =
new DomPointF();
383 const QPointF pointf = v.toPointF();
384 ptf->setElementX(pointf.x());
385 ptf->setElementY(pointf.y());
386 dom_prop->setElementPointF(ptf);
390 case QMetaType::QColor: {
391 auto *clr =
new DomColor();
392 const auto color = qvariant_cast<QColor>(v);
393 clr->setElementRed(color.red());
394 clr->setElementGreen(color.green());
395 clr->setElementBlue(color.blue());
396 const int alphaChannel = color.alpha();
397 if (alphaChannel != 255)
398 clr->setAttributeAlpha(alphaChannel);
399 dom_prop->setElementColor(clr);
403 case QMetaType::QSize: {
404 auto *sz =
new DomSize();
405 const QSize size = v.toSize();
406 sz->setElementWidth(size.width());
407 sz->setElementHeight(size.height());
408 dom_prop->setElementSize(sz);
412 case QMetaType::QSizeF: {
413 auto *szf =
new DomSizeF();
414 const QSizeF sizef = v.toSizeF();
415 szf->setElementWidth(sizef.width());
416 szf->setElementHeight(sizef.height());
417 dom_prop->setElementSizeF(szf);
421 case QMetaType::QRect: {
422 auto *rc =
new DomRect();
423 const QRect rect = v.toRect();
424 rc->setElementX(rect.x());
425 rc->setElementY(rect.y());
426 rc->setElementWidth(rect.width());
427 rc->setElementHeight(rect.height());
428 dom_prop->setElementRect(rc);
432 case QMetaType::QRectF: {
433 auto *rcf =
new DomRectF();
434 const QRectF rectf = v.toRectF();
435 rcf->setElementX(rectf.x());
436 rcf->setElementY(rectf.y());
437 rcf->setElementWidth(rectf.width());
438 rcf->setElementHeight(rectf.height());
439 dom_prop->setElementRectF(rcf);
443 case QMetaType::QFont: {
444 auto *fnt =
new DomFont();
445 const auto font = qvariant_cast<QFont>(v);
446 const uint mask = font.resolveMask();
447 if (mask & QFont::WeightResolved) {
448 switch (font.weight()) {
450 fnt->setElementBold(
false);
453 fnt->setElementBold(
true);
456 const QMetaEnum me = fontWeightMetaEnum();
457 const QString ws = QLatin1StringView(me.valueToKey(font.weight()));
458 fnt->setElementFontWeight(ws);
463 if ((mask & (QFont::FamilyResolved | QFont::FamiliesResolved)) != 0)
464 fnt->setElementFamily(font.family());
465 if (mask & QFont::StyleResolved)
466 fnt->setElementItalic(font.italic());
467 if (mask & QFont::SizeResolved)
468 fnt->setElementPointSize(font.pointSize());
469 if (mask & QFont::StrikeOutResolved)
470 fnt->setElementStrikeOut(font.strikeOut());
471 if (mask & QFont::UnderlineResolved)
472 fnt->setElementUnderline(font.underline());
473 if (mask & QFont::KerningResolved)
474 fnt->setElementKerning(font.kerning());
475 if (mask & QFont::StyleStrategyResolved) {
477 fnt->setElementStyleStrategy(QLatin1StringView(styleStrategy_enum.valueToKey(font.styleStrategy())));
479 if (mask & QFont::HintingPreferenceResolved) {
481 fnt->setElementHintingPreference(QLatin1StringView(hintingPreference_enum.valueToKey(font.hintingPreference())));
484 dom_prop->setElementFont(fnt);
489 case QMetaType::QCursor: {
490 const QMetaEnum cursorShape_enum = metaEnum<QAbstractFormBuilderGadget>(
"cursorShape");
491 dom_prop->setElementCursorShape(QLatin1StringView(cursorShape_enum.valueToKey(qvariant_cast<QCursor>(v).shape())));
496 case QMetaType::QKeySequence: {
497 auto *s =
new DomString();
498 s->setText(qvariant_cast<QKeySequence>(v).toString(QKeySequence::PortableText));
499 dom_prop->setElementString(s);
503 case QMetaType::QLocale: {
504 auto *dom =
new DomLocale();
505 const auto locale = qvariant_cast<QLocale>(v);
510 dom->setAttributeLanguage(QLatin1StringView(language_enum.valueToKey(locale.language())));
511 dom->setAttributeCountry(QLatin1StringView(territory_enum.valueToKey(locale.territory())));
513 dom_prop->setElementLocale(dom);
517 case QMetaType::QSizePolicy: {
518 auto *dom =
new DomSizePolicy();
519 const auto sizePolicy = qvariant_cast<QSizePolicy>(v);
521 dom->setElementHorStretch(sizePolicy.horizontalStretch());
522 dom->setElementVerStretch(sizePolicy.verticalStretch());
526 dom->setAttributeHSizeType(QLatin1StringView(sizeType_enum.valueToKey(sizePolicy.horizontalPolicy())));
527 dom->setAttributeVSizeType(QLatin1StringView(sizeType_enum.valueToKey(sizePolicy.verticalPolicy())));
529 dom_prop->setElementSizePolicy(dom);
533 case QMetaType::QDate: {
534 auto *dom =
new DomDate();
535 const auto date = qvariant_cast<QDate>(v);
537 dom->setElementYear(date.year());
538 dom->setElementMonth(date.month());
539 dom->setElementDay(date.day());
541 dom_prop->setElementDate(dom);
545 case QMetaType::QTime: {
546 auto *dom =
new DomTime();
547 const auto time = qvariant_cast<QTime>(v);
549 dom->setElementHour(time.hour());
550 dom->setElementMinute(time.minute());
551 dom->setElementSecond(time.second());
553 dom_prop->setElementTime(dom);
557 case QMetaType::QDateTime: {
558 auto *dom =
new DomDateTime();
559 const auto dateTime = qvariant_cast<QDateTime>(v);
561 dom->setElementHour(dateTime.time().hour());
562 dom->setElementMinute(dateTime.time().minute());
563 dom->setElementSecond(dateTime.time().second());
564 dom->setElementYear(dateTime.date().year());
565 dom->setElementMonth(dateTime.date().month());
566 dom->setElementDay(dateTime.date().day());
568 dom_prop->setElementDateTime(dom);
572 case QMetaType::QUrl: {
573 auto *dom =
new DomUrl();
574 const QUrl url = v.toUrl();
576 auto *str =
new DomString();
577 str->setText(url.toString());
578 dom->setElementString(str);
580 dom_prop->setElementUrl(dom);
584 case QMetaType::QStringList: {
585 auto *sl =
new DomStringList;
586 sl->setElementString(qvariant_cast<QStringList>(v));
587 dom_prop->setElementStringList(sl);
663 const QString &pname,
const QVariant &v)
665 auto *dom_prop =
new DomProperty();
666 dom_prop->setAttributeName(pname);
668 const int pindex = meta->indexOfProperty(pname.toLatin1().constData());
670 QMetaProperty meta_property = meta->property(pindex);
671 if (v.canConvert<
int>() && meta_property.isEnumType()) {
672 const QMetaEnum e = meta_property.enumerator();
674 dom_prop->setElementSet(flagsValue(e, v.toInt(), afb->d->m_saveVersion));
676 dom_prop->setElementEnum(enumValue(e, v.toInt(), afb->d->m_saveVersion));
679 if (!meta_property.hasStdCppSet()
680 || (isOfType(meta, &QAbstractScrollArea::staticMetaObject)
681 && pname ==
"cursor"_L1)) {
682 dom_prop->setAttributeStdset(0);
687 if (applySimpleProperty(v, isTranslatable(pname, v, meta), dom_prop))
691 switch (v.metaType().id()) {
692 case QMetaType::QPalette: {
693 auto *dom =
new DomPalette();
694 auto palette = qvariant_cast<QPalette>(v);
696 palette.setCurrentColorGroup(QPalette::Active);
697 dom->setElementActive(afb->saveColorGroup(palette));
699 palette.setCurrentColorGroup(QPalette::Inactive);
700 dom->setElementInactive(afb->saveColorGroup(palette));
702 palette.setCurrentColorGroup(QPalette::Disabled);
703 dom->setElementDisabled(afb->saveColorGroup(palette));
705 dom_prop->setElementPalette(dom);
707 case QMetaType::QBrush:
708 dom_prop->setElementBrush(afb->saveBrush(qvariant_cast<QBrush>(v)));
711 const bool hadAttributeStdset = dom_prop->hasAttributeStdset();
712 const bool attributeStdset = dom_prop->attributeStdset();
714 if (afb->resourceBuilder()->isResourceType(v)) {
715 dom_prop = afb->resourceBuilder()->saveResource(afb->workingDirectory(), v);
717 dom_prop->setAttributeName(pname);
718 if (hadAttributeStdset)
719 dom_prop->setAttributeStdset(attributeStdset);
723 uiLibWarning(msgCannotWriteProperty(pname, v));