36 case DomProperty::String: {
37 const int index = meta->indexOfProperty(p->attributeName().toUtf8().constData());
38 if (index != -1 && meta->property(index).metaType().id() == QMetaType::QKeySequence)
39 return QVariant::fromValue(QKeySequence(p->elementString()->text()));
43 case DomProperty::Palette: {
44 const DomPalette *dom = p->elementPalette();
47 if (dom->elementActive())
48 afb->setupColorGroup(palette, QPalette::Active, dom->elementActive());
50 if (dom->elementInactive())
51 afb->setupColorGroup(palette, QPalette::Inactive, dom->elementInactive());
53 if (dom->elementDisabled())
54 afb->setupColorGroup(palette, QPalette::Disabled, dom->elementDisabled());
56 palette.setCurrentColorGroup(QPalette::Active);
57 return QVariant::fromValue(palette);
60 case DomProperty::Set: {
61 const QByteArray pname = p->attributeName().toUtf8();
62 const int index = meta->indexOfProperty(pname.constData());
64 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"The set-type property %1 could not be read.").arg(p->attributeName()));
68 const QMetaEnum e = meta->property(index).enumerator();
69 Q_ASSERT(e.isFlag() ==
true);
71 QVariant result(e.keysToValue(p->elementSet().toUtf8().constData(), &ok));
73 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
74 "The value \"%1\" of the set-type property %2 could not be read.").
75 arg(p->elementSet(), p->attributeName()));
81 case DomProperty::Enum: {
82 const QByteArray pname = p->attributeName().toUtf8().constData();
83 const int index = meta->indexOfProperty(pname.constData());
84 const auto &enumValue = p->elementEnum();
90 if (!qstrcmp(meta->className(),
"QFrame")
91 && (pname == QByteArray(
"orientation"))) {
92 return QVariant(enumValue.endsWith(
"Horizontal"_L1) ? QFrame::HLine : QFrame::VLine);
94 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"The enumeration-type property %1 could not be read.").arg(p->attributeName()));
98 const QMetaEnum e = meta->property(index).enumerator();
100 QVariant result(e.keyToValue(enumValue.toUtf8().constData(), &ok));
102 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
103 "The value \"%1\" of the enum-type property %2 could not be read.").
104 arg(enumValue, p->attributeName()));
109 case DomProperty::Brush:
110 return QVariant::fromValue(afb->setupBrush(p->elementBrush()));
112 if (afb->resourceBuilder()->isResourceProperty(p)) {
113 return afb->resourceBuilder()->loadResource(afb->workingDirectory(), p);
120 return domPropertyToVariant(p);
137 case DomProperty::Bool:
138 return QVariant(p->elementBool() ==
"true"_L1);
140 case DomProperty::Cstring:
141 return QVariant(p->elementCstring().toUtf8());
143 case DomProperty::Point: {
144 const DomPoint *point = p->elementPoint();
145 return QVariant(QPoint(point->elementX(), point->elementY()));
148 case DomProperty::PointF: {
149 const DomPointF *pointf = p->elementPointF();
150 return QVariant(QPointF(pointf->elementX(), pointf->elementY()));
153 case DomProperty::Size: {
154 const DomSize *size = p->elementSize();
155 return QVariant(QSize(size->elementWidth(), size->elementHeight()));
158 case DomProperty::SizeF: {
159 const DomSizeF *sizef = p->elementSizeF();
160 return QVariant(QSizeF(sizef->elementWidth(), sizef->elementHeight()));
163 case DomProperty::Rect: {
164 const DomRect *rc = p->elementRect();
165 const QRect g(rc->elementX(), rc->elementY(), rc->elementWidth(), rc->elementHeight());
169 case DomProperty::RectF: {
170 const DomRectF *rcf = p->elementRectF();
171 const QRectF g(rcf->elementX(), rcf->elementY(), rcf->elementWidth(), rcf->elementHeight());
175 case DomProperty::String:
176 return QVariant(p->elementString()->text());
178 case DomProperty::Number:
179 return QVariant(p->elementNumber());
181 case DomProperty::UInt:
182 return QVariant(p->elementUInt());
184 case DomProperty::LongLong:
185 return QVariant(p->elementLongLong());
187 case DomProperty::ULongLong:
188 return QVariant(p->elementULongLong());
190 case DomProperty::Double:
191 return QVariant(p->elementDouble());
193 case DomProperty::Char: {
194 const DomChar *character = p->elementChar();
195 const QChar c(character->elementUnicode());
196 return QVariant::fromValue(c);
199 case DomProperty::Color: {
200 const DomColor *color = p->elementColor();
201 QColor c(color->elementRed(), color->elementGreen(), color->elementBlue());
202 if (color->hasAttributeAlpha())
203 c.setAlpha(color->attributeAlpha());
204 return QVariant::fromValue(c);
207 case DomProperty::Font: {
208 const DomFont *font = p->elementFont();
211 if (font->hasElementFamily() && !font->elementFamily().isEmpty())
212 f.setFamily(font->elementFamily());
213 if (font->hasElementPointSize() && font->elementPointSize() > 0)
214 f.setPointSize(font->elementPointSize());
215 if (font->hasElementItalic())
216 f.setItalic(font->elementItalic());
217 if (font->hasElementUnderline())
218 f.setUnderline(font->elementUnderline());
219 if (font->hasElementStrikeOut())
220 f.setStrikeOut(font->elementStrikeOut());
221 if (font->hasElementKerning())
222 f.setKerning(font->elementKerning());
223 if (font->hasElementAntialiasing())
224 f.setStyleStrategy(font->elementAntialiasing() ? QFont::PreferDefault : QFont::NoAntialias);
225 if (font->hasElementStyleStrategy()) {
226 f.setStyleStrategy(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::StyleStrategy>(
"styleStrategy",
227 font->elementStyleStrategy().toLatin1().constData()));
229 if (font->hasElementHintingPreference()) {
230 f.setHintingPreference(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::HintingPreference>(
"hintingPreference",
231 font->elementHintingPreference().toLatin1().constData()));
234 if (font->hasElementFontWeight()) {
235 f.setWeight(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::Weight>(
237 font->elementFontWeight().toLatin1().constData()));
238 }
else if (font->hasElementBold()) {
239 f.setBold(font->elementBold());
242 return QVariant::fromValue(f);
245 case DomProperty::Date: {
246 const DomDate *date = p->elementDate();
247 return QVariant(QDate(date->elementYear(), date->elementMonth(), date->elementDay()));
250 case DomProperty::Time: {
251 const DomTime *t = p->elementTime();
252 return QVariant(QTime(t->elementHour(), t->elementMinute(), t->elementSecond()));
255 case DomProperty::DateTime: {
256 const DomDateTime *dateTime = p->elementDateTime();
257 const QDate d(dateTime->elementYear(), dateTime->elementMonth(), dateTime->elementDay());
258 const QTime tm(dateTime->elementHour(), dateTime->elementMinute(), dateTime->elementSecond());
259 return QVariant(QDateTime(d, tm));
262 case DomProperty::Url: {
263 const DomUrl *url = p->elementUrl();
264 return QVariant(QUrl(url->elementString()->text()));
268 case DomProperty::Cursor:
269 return QVariant::fromValue(QCursor(
static_cast<Qt::CursorShape>(p->elementCursor())));
271 case DomProperty::CursorShape:
272 return QVariant::fromValue(QCursor(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::CursorShape>(
"cursorShape",
273 p->elementCursorShape().toLatin1().constData())));
276 case DomProperty::Locale: {
277 const DomLocale *locale = p->elementLocale();
278 return QVariant::fromValue(QLocale(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QLocale::Language>(
"language",
279 locale->attributeLanguage().toLatin1().constData()),
280 enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QLocale::Territory>(
"country",
281 locale->attributeCountry().toLatin1().constData())));
283 case DomProperty::SizePolicy: {
284 const DomSizePolicy *sizep = p->elementSizePolicy();
286 QSizePolicy sizePolicy;
287 sizePolicy.setHorizontalStretch(sizep->elementHorStretch());
288 sizePolicy.setVerticalStretch(sizep->elementVerStretch());
292 if (sizep->hasElementHSizeType()) {
293 sizePolicy.setHorizontalPolicy((QSizePolicy::Policy) sizep->elementHSizeType());
294 }
else if (sizep->hasAttributeHSizeType()) {
295 const auto sp = enumKeyToValue<QSizePolicy::Policy>(
296 sizeType_enum, sizep->attributeHSizeType().toLatin1().constData());
297 sizePolicy.setHorizontalPolicy(sp);
300 if (sizep->hasElementVSizeType()) {
301 sizePolicy.setVerticalPolicy((QSizePolicy::Policy) sizep->elementVSizeType());
302 }
else if (sizep->hasAttributeVSizeType()) {
303 const auto sp = enumKeyToValue<QSizePolicy::Policy>(
304 sizeType_enum, sizep->attributeVSizeType().toLatin1().constData());
305 sizePolicy.setVerticalPolicy(sp);
308 return QVariant::fromValue(sizePolicy);
311 case DomProperty::StringList:
312 return QVariant(p->elementStringList()->elementString());
315 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"Reading properties of the type %1 is not supported yet.").arg(p->kind()));
325 switch (v.metaType().id()) {
326 case QMetaType::QString: {
327 auto *str =
new DomString();
328 str->setText(v.toString());
329 if (!translateString)
330 str->setAttributeNotr(u"true"_s);
331 dom_prop->setElementString(str);
335 case QMetaType::QByteArray:
336 dom_prop->setElementCstring(QString::fromUtf8(v.toByteArray()));
340 dom_prop->setElementNumber(v.toInt());
343 case QMetaType::UInt:
344 dom_prop->setElementUInt(v.toUInt());
347 case QMetaType::LongLong:
348 dom_prop->setElementLongLong(v.toLongLong());
351 case QMetaType::ULongLong:
352 dom_prop->setElementULongLong(v.toULongLong());
355 case QMetaType::Double:
356 dom_prop->setElementDouble(v.toDouble());
359 case QMetaType::Bool:
360 dom_prop->setElementBool(v.toBool() ?
"true"_L1 :
"false"_L1);
363 case QMetaType::QChar: {
364 auto *ch =
new DomChar();
365 const QChar character = v.toChar();
366 ch->setElementUnicode(character.unicode());
367 dom_prop->setElementChar(ch);
371 case QMetaType::QPoint: {
372 auto *pt =
new DomPoint();
373 const QPoint point = v.toPoint();
374 pt->setElementX(point.x());
375 pt->setElementY(point.y());
376 dom_prop->setElementPoint(pt);
380 case QMetaType::QPointF: {
381 auto *ptf =
new DomPointF();
382 const QPointF pointf = v.toPointF();
383 ptf->setElementX(pointf.x());
384 ptf->setElementY(pointf.y());
385 dom_prop->setElementPointF(ptf);
389 case QMetaType::QColor: {
390 auto *clr =
new DomColor();
391 const auto color = qvariant_cast<QColor>(v);
392 clr->setElementRed(color.red());
393 clr->setElementGreen(color.green());
394 clr->setElementBlue(color.blue());
395 const int alphaChannel = color.alpha();
396 if (alphaChannel != 255)
397 clr->setAttributeAlpha(alphaChannel);
398 dom_prop->setElementColor(clr);
402 case QMetaType::QSize: {
403 auto *sz =
new DomSize();
404 const QSize size = v.toSize();
405 sz->setElementWidth(size.width());
406 sz->setElementHeight(size.height());
407 dom_prop->setElementSize(sz);
411 case QMetaType::QSizeF: {
412 auto *szf =
new DomSizeF();
413 const QSizeF sizef = v.toSizeF();
414 szf->setElementWidth(sizef.width());
415 szf->setElementHeight(sizef.height());
416 dom_prop->setElementSizeF(szf);
420 case QMetaType::QRect: {
421 auto *rc =
new DomRect();
422 const QRect rect = v.toRect();
423 rc->setElementX(rect.x());
424 rc->setElementY(rect.y());
425 rc->setElementWidth(rect.width());
426 rc->setElementHeight(rect.height());
427 dom_prop->setElementRect(rc);
431 case QMetaType::QRectF: {
432 auto *rcf =
new DomRectF();
433 const QRectF rectf = v.toRectF();
434 rcf->setElementX(rectf.x());
435 rcf->setElementY(rectf.y());
436 rcf->setElementWidth(rectf.width());
437 rcf->setElementHeight(rectf.height());
438 dom_prop->setElementRectF(rcf);
442 case QMetaType::QFont: {
443 auto *fnt =
new DomFont();
444 const auto font = qvariant_cast<QFont>(v);
445 const uint mask = font.resolveMask();
446 if (mask & QFont::WeightResolved) {
447 switch (font.weight()) {
449 fnt->setElementBold(
false);
452 fnt->setElementBold(
true);
455 const QMetaEnum me = fontWeightMetaEnum();
456 const QString ws = QLatin1StringView(me.valueToKey(font.weight()));
457 fnt->setElementFontWeight(ws);
462 if ((mask & (QFont::FamilyResolved | QFont::FamiliesResolved)) != 0)
463 fnt->setElementFamily(font.family());
464 if (mask & QFont::StyleResolved)
465 fnt->setElementItalic(font.italic());
466 if (mask & QFont::SizeResolved)
467 fnt->setElementPointSize(font.pointSize());
468 if (mask & QFont::StrikeOutResolved)
469 fnt->setElementStrikeOut(font.strikeOut());
470 if (mask & QFont::UnderlineResolved)
471 fnt->setElementUnderline(font.underline());
472 if (mask & QFont::KerningResolved)
473 fnt->setElementKerning(font.kerning());
474 if (mask & QFont::StyleStrategyResolved) {
476 fnt->setElementStyleStrategy(QLatin1StringView(styleStrategy_enum.valueToKey(font.styleStrategy())));
478 if (mask & QFont::HintingPreferenceResolved) {
480 fnt->setElementHintingPreference(QLatin1StringView(hintingPreference_enum.valueToKey(font.hintingPreference())));
483 dom_prop->setElementFont(fnt);
488 case QMetaType::QCursor: {
489 const QMetaEnum cursorShape_enum = metaEnum<QAbstractFormBuilderGadget>(
"cursorShape");
490 dom_prop->setElementCursorShape(QLatin1StringView(cursorShape_enum.valueToKey(qvariant_cast<QCursor>(v).shape())));
495 case QMetaType::QKeySequence: {
496 auto *s =
new DomString();
497 s->setText(qvariant_cast<QKeySequence>(v).toString(QKeySequence::PortableText));
498 dom_prop->setElementString(s);
502 case QMetaType::QLocale: {
503 auto *dom =
new DomLocale();
504 const auto locale = qvariant_cast<QLocale>(v);
509 dom->setAttributeLanguage(QLatin1StringView(language_enum.valueToKey(locale.language())));
510 dom->setAttributeCountry(QLatin1StringView(territory_enum.valueToKey(locale.territory())));
512 dom_prop->setElementLocale(dom);
516 case QMetaType::QSizePolicy: {
517 auto *dom =
new DomSizePolicy();
518 const auto sizePolicy = qvariant_cast<QSizePolicy>(v);
520 dom->setElementHorStretch(sizePolicy.horizontalStretch());
521 dom->setElementVerStretch(sizePolicy.verticalStretch());
525 dom->setAttributeHSizeType(QLatin1StringView(sizeType_enum.valueToKey(sizePolicy.horizontalPolicy())));
526 dom->setAttributeVSizeType(QLatin1StringView(sizeType_enum.valueToKey(sizePolicy.verticalPolicy())));
528 dom_prop->setElementSizePolicy(dom);
532 case QMetaType::QDate: {
533 auto *dom =
new DomDate();
534 const auto date = qvariant_cast<QDate>(v);
536 dom->setElementYear(date.year());
537 dom->setElementMonth(date.month());
538 dom->setElementDay(date.day());
540 dom_prop->setElementDate(dom);
544 case QMetaType::QTime: {
545 auto *dom =
new DomTime();
546 const auto time = qvariant_cast<QTime>(v);
548 dom->setElementHour(time.hour());
549 dom->setElementMinute(time.minute());
550 dom->setElementSecond(time.second());
552 dom_prop->setElementTime(dom);
556 case QMetaType::QDateTime: {
557 auto *dom =
new DomDateTime();
558 const auto dateTime = qvariant_cast<QDateTime>(v);
560 dom->setElementHour(dateTime.time().hour());
561 dom->setElementMinute(dateTime.time().minute());
562 dom->setElementSecond(dateTime.time().second());
563 dom->setElementYear(dateTime.date().year());
564 dom->setElementMonth(dateTime.date().month());
565 dom->setElementDay(dateTime.date().day());
567 dom_prop->setElementDateTime(dom);
571 case QMetaType::QUrl: {
572 auto *dom =
new DomUrl();
573 const QUrl url = v.toUrl();
575 auto *str =
new DomString();
576 str->setText(url.toString());
577 dom->setElementString(str);
579 dom_prop->setElementUrl(dom);
583 case QMetaType::QStringList: {
584 auto *sl =
new DomStringList;
585 sl->setElementString(qvariant_cast<QStringList>(v));
586 dom_prop->setElementStringList(sl);
662 const QString &pname,
const QVariant &v)
664 auto *dom_prop =
new DomProperty();
665 dom_prop->setAttributeName(pname);
667 const int pindex = meta->indexOfProperty(pname.toLatin1().constData());
669 QMetaProperty meta_property = meta->property(pindex);
670 if (v.canConvert<
int>() && meta_property.isEnumType()) {
671 const QMetaEnum e = meta_property.enumerator();
673 dom_prop->setElementSet(flagsValue(e, v.toInt(), afb->d->m_saveVersion));
675 dom_prop->setElementEnum(enumValue(e, v.toInt(), afb->d->m_saveVersion));
678 if (!meta_property.hasStdCppSet()
679 || (isOfType(meta, &QAbstractScrollArea::staticMetaObject)
680 && pname ==
"cursor"_L1)) {
681 dom_prop->setAttributeStdset(0);
686 if (applySimpleProperty(v, isTranslatable(pname, v, meta), dom_prop))
690 switch (v.metaType().id()) {
691 case QMetaType::QPalette: {
692 auto *dom =
new DomPalette();
693 auto palette = qvariant_cast<QPalette>(v);
695 palette.setCurrentColorGroup(QPalette::Active);
696 dom->setElementActive(afb->saveColorGroup(palette));
698 palette.setCurrentColorGroup(QPalette::Inactive);
699 dom->setElementInactive(afb->saveColorGroup(palette));
701 palette.setCurrentColorGroup(QPalette::Disabled);
702 dom->setElementDisabled(afb->saveColorGroup(palette));
704 dom_prop->setElementPalette(dom);
706 case QMetaType::QBrush:
707 dom_prop->setElementBrush(afb->saveBrush(qvariant_cast<QBrush>(v)));
710 const bool hadAttributeStdset = dom_prop->hasAttributeStdset();
711 const bool attributeStdset = dom_prop->attributeStdset();
713 if (afb->resourceBuilder()->isResourceType(v)) {
714 dom_prop = afb->resourceBuilder()->saveResource(afb->workingDirectory(), v);
716 dom_prop->setAttributeName(pname);
717 if (hadAttributeStdset)
718 dom_prop->setAttributeStdset(attributeStdset);
722 uiLibWarning(msgCannotWriteProperty(pname, v));