38 case DomProperty::String: {
39 const int index = meta->indexOfProperty(p->attributeName().toUtf8().constData());
40 if (index != -1 && meta->property(index).metaType().id() == QMetaType::QKeySequence)
41 return QVariant::fromValue(QKeySequence(p->elementString()->text()));
45 case DomProperty::Palette: {
46 const DomPalette *dom = p->elementPalette();
49 if (dom->elementActive())
50 afb->setupColorGroup(palette, QPalette::Active, dom->elementActive());
52 if (dom->elementInactive())
53 afb->setupColorGroup(palette, QPalette::Inactive, dom->elementInactive());
55 if (dom->elementDisabled())
56 afb->setupColorGroup(palette, QPalette::Disabled, dom->elementDisabled());
58 palette.setCurrentColorGroup(QPalette::Active);
59 return QVariant::fromValue(palette);
62 case DomProperty::Set: {
63 const QByteArray pname = p->attributeName().toUtf8();
64 const int index = meta->indexOfProperty(pname.constData());
66 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"The set-type property %1 could not be read.").arg(p->attributeName()));
70 const QMetaEnum e = meta->property(index).enumerator();
71 Q_ASSERT(e.isFlag() ==
true);
73 QVariant result(e.keysToValue(p->elementSet().toUtf8().constData(), &ok));
75 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
76 "The value \"%1\" of the set-type property %2 could not be read.").
77 arg(p->elementSet(), p->attributeName()));
83 case DomProperty::Enum: {
84 const QByteArray pname = p->attributeName().toUtf8().constData();
85 const int index = meta->indexOfProperty(pname.constData());
86 const auto &enumValue = p->elementEnum();
92 if (!qstrcmp(meta->className(),
"QFrame")
93 && (pname == QByteArray(
"orientation"))) {
94 return QVariant(enumValue.endsWith(
"Horizontal"_L1) ? QFrame::HLine : QFrame::VLine);
96 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"The enumeration-type property %1 could not be read.").arg(p->attributeName()));
100 const QMetaEnum e = meta->property(index).enumerator();
102 QVariant result(e.keyToValue(enumValue.toUtf8().constData(), &ok));
104 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
105 "The value \"%1\" of the enum-type property %2 could not be read.").
106 arg(enumValue, p->attributeName()));
111 case DomProperty::Brush:
112 return QVariant::fromValue(afb->setupBrush(p->elementBrush()));
114 if (afb->resourceBuilder()->isResourceProperty(p)) {
115 return afb->resourceBuilder()->loadResource(afb->workingDirectory(), p);
122 return domPropertyToVariant(p);
139 case DomProperty::Bool:
140 return QVariant(p->elementBool() ==
"true"_L1);
142 case DomProperty::Cstring:
143 return QVariant(p->elementCstring().toUtf8());
145 case DomProperty::Point: {
146 const DomPoint *point = p->elementPoint();
147 return QVariant(QPoint(point->elementX(), point->elementY()));
150 case DomProperty::PointF: {
151 const DomPointF *pointf = p->elementPointF();
152 return QVariant(QPointF(pointf->elementX(), pointf->elementY()));
155 case DomProperty::Size: {
156 const DomSize *size = p->elementSize();
157 return QVariant(QSize(size->elementWidth(), size->elementHeight()));
160 case DomProperty::SizeF: {
161 const DomSizeF *sizef = p->elementSizeF();
162 return QVariant(QSizeF(sizef->elementWidth(), sizef->elementHeight()));
165 case DomProperty::Rect: {
166 const DomRect *rc = p->elementRect();
167 const QRect g(rc->elementX(), rc->elementY(), rc->elementWidth(), rc->elementHeight());
171 case DomProperty::RectF: {
172 const DomRectF *rcf = p->elementRectF();
173 const QRectF g(rcf->elementX(), rcf->elementY(), rcf->elementWidth(), rcf->elementHeight());
177 case DomProperty::String:
178 return QVariant(p->elementString()->text());
180 case DomProperty::Number:
181 return QVariant(p->elementNumber());
183 case DomProperty::UInt:
184 return QVariant(p->elementUInt());
186 case DomProperty::LongLong:
187 return QVariant(p->elementLongLong());
189 case DomProperty::ULongLong:
190 return QVariant(p->elementULongLong());
192 case DomProperty::Double:
193 return QVariant(p->elementDouble());
195 case DomProperty::Char: {
196 const DomChar *character = p->elementChar();
197 const QChar c(character->elementUnicode());
198 return QVariant::fromValue(c);
201 case DomProperty::Color: {
202 const DomColor *color = p->elementColor();
203 QColor c(color->elementRed(), color->elementGreen(), color->elementBlue());
204 if (color->hasAttributeAlpha())
205 c.setAlpha(color->attributeAlpha());
206 return QVariant::fromValue(c);
209 case DomProperty::Font: {
210 const DomFont *font = p->elementFont();
213 if (font->hasElementFamily() && !font->elementFamily().isEmpty())
214 f.setFamily(font->elementFamily());
215 if (font->hasElementPointSize() && font->elementPointSize() > 0)
216 f.setPointSize(font->elementPointSize());
217 if (font->hasElementItalic())
218 f.setItalic(font->elementItalic());
219 if (font->hasElementUnderline())
220 f.setUnderline(font->elementUnderline());
221 if (font->hasElementStrikeOut())
222 f.setStrikeOut(font->elementStrikeOut());
223 if (font->hasElementKerning())
224 f.setKerning(font->elementKerning());
225 if (font->hasElementAntialiasing())
226 f.setStyleStrategy(font->elementAntialiasing() ? QFont::PreferDefault : QFont::NoAntialias);
227 if (font->hasElementStyleStrategy()) {
228 f.setStyleStrategy(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::StyleStrategy>(
"styleStrategy",
229 font->elementStyleStrategy().toLatin1().constData()));
231 if (font->hasElementHintingPreference()) {
232 f.setHintingPreference(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::HintingPreference>(
"hintingPreference",
233 font->elementHintingPreference().toLatin1().constData()));
236 if (font->hasElementFontWeight()) {
237 f.setWeight(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::Weight>(
239 font->elementFontWeight().toLatin1().constData()));
240 }
else if (font->hasElementBold()) {
241 f.setBold(font->elementBold());
244 return QVariant::fromValue(f);
247 case DomProperty::Date: {
248 const DomDate *date = p->elementDate();
249 return QVariant(QDate(date->elementYear(), date->elementMonth(), date->elementDay()));
252 case DomProperty::Time: {
253 const DomTime *t = p->elementTime();
254 return QVariant(QTime(t->elementHour(), t->elementMinute(), t->elementSecond()));
257 case DomProperty::DateTime: {
258 const DomDateTime *dateTime = p->elementDateTime();
259 const QDate d(dateTime->elementYear(), dateTime->elementMonth(), dateTime->elementDay());
260 const QTime tm(dateTime->elementHour(), dateTime->elementMinute(), dateTime->elementSecond());
261 return QVariant(QDateTime(d, tm));
264 case DomProperty::Url: {
265 const DomUrl *url = p->elementUrl();
266 return QVariant(QUrl(url->elementString()->text()));
270 case DomProperty::Cursor:
271 return QVariant::fromValue(QCursor(
static_cast<Qt::CursorShape>(p->elementCursor())));
273 case DomProperty::CursorShape:
274 return QVariant::fromValue(QCursor(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::CursorShape>(
"cursorShape",
275 p->elementCursorShape().toLatin1().constData())));
278 case DomProperty::Locale: {
279 const DomLocale *locale = p->elementLocale();
280 return QVariant::fromValue(QLocale(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QLocale::Language>(
"language",
281 locale->attributeLanguage().toLatin1().constData()),
282 enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QLocale::Territory>(
"country",
283 locale->attributeCountry().toLatin1().constData())));
285 case DomProperty::SizePolicy: {
286 const DomSizePolicy *sizep = p->elementSizePolicy();
288 QSizePolicy sizePolicy;
289 sizePolicy.setHorizontalStretch(sizep->elementHorStretch());
290 sizePolicy.setVerticalStretch(sizep->elementVerStretch());
294 if (sizep->hasElementHSizeType()) {
295 sizePolicy.setHorizontalPolicy((QSizePolicy::Policy) sizep->elementHSizeType());
296 }
else if (sizep->hasAttributeHSizeType()) {
297 const auto sp = enumKeyToValue<QSizePolicy::Policy>(
298 sizeType_enum, sizep->attributeHSizeType().toLatin1().constData());
299 sizePolicy.setHorizontalPolicy(sp);
302 if (sizep->hasElementVSizeType()) {
303 sizePolicy.setVerticalPolicy((QSizePolicy::Policy) sizep->elementVSizeType());
304 }
else if (sizep->hasAttributeVSizeType()) {
305 const auto sp = enumKeyToValue<QSizePolicy::Policy>(
306 sizeType_enum, sizep->attributeVSizeType().toLatin1().constData());
307 sizePolicy.setVerticalPolicy(sp);
310 return QVariant::fromValue(sizePolicy);
313 case DomProperty::StringList:
314 return QVariant(p->elementStringList()->elementString());
317 uiLibWarning(QCoreApplication::translate(
"QFormBuilder",
"Reading properties of the type %1 is not supported yet.").arg(p->kind()));
327 switch (v.metaType().id()) {
328 case QMetaType::QString: {
329 auto *str =
new DomString();
330 str->setText(v.toString());
331 if (!translateString)
332 str->setAttributeNotr(u"true"_s);
333 dom_prop->setElementString(str);
337 case QMetaType::QByteArray:
338 dom_prop->setElementCstring(QString::fromUtf8(v.toByteArray()));
342 dom_prop->setElementNumber(v.toInt());
345 case QMetaType::UInt:
346 dom_prop->setElementUInt(v.toUInt());
349 case QMetaType::LongLong:
350 dom_prop->setElementLongLong(v.toLongLong());
353 case QMetaType::ULongLong:
354 dom_prop->setElementULongLong(v.toULongLong());
357 case QMetaType::Double:
358 dom_prop->setElementDouble(v.toDouble());
361 case QMetaType::Bool:
362 dom_prop->setElementBool(v.toBool() ?
"true"_L1 :
"false"_L1);
365 case QMetaType::QChar: {
366 auto *ch =
new DomChar();
367 const QChar character = v.toChar();
368 ch->setElementUnicode(character.unicode());
369 dom_prop->setElementChar(ch);
373 case QMetaType::QPoint: {
374 auto *pt =
new DomPoint();
375 const QPoint point = v.toPoint();
376 pt->setElementX(point.x());
377 pt->setElementY(point.y());
378 dom_prop->setElementPoint(pt);
382 case QMetaType::QPointF: {
383 auto *ptf =
new DomPointF();
384 const QPointF pointf = v.toPointF();
385 ptf->setElementX(pointf.x());
386 ptf->setElementY(pointf.y());
387 dom_prop->setElementPointF(ptf);
391 case QMetaType::QColor: {
392 auto *clr =
new DomColor();
393 const auto color = qvariant_cast<QColor>(v);
394 clr->setElementRed(color.red());
395 clr->setElementGreen(color.green());
396 clr->setElementBlue(color.blue());
397 const int alphaChannel = color.alpha();
398 if (alphaChannel != 255)
399 clr->setAttributeAlpha(alphaChannel);
400 dom_prop->setElementColor(clr);
404 case QMetaType::QSize: {
405 auto *sz =
new DomSize();
406 const QSize size = v.toSize();
407 sz->setElementWidth(size.width());
408 sz->setElementHeight(size.height());
409 dom_prop->setElementSize(sz);
413 case QMetaType::QSizeF: {
414 auto *szf =
new DomSizeF();
415 const QSizeF sizef = v.toSizeF();
416 szf->setElementWidth(sizef.width());
417 szf->setElementHeight(sizef.height());
418 dom_prop->setElementSizeF(szf);
422 case QMetaType::QRect: {
423 auto *rc =
new DomRect();
424 const QRect rect = v.toRect();
425 rc->setElementX(rect.x());
426 rc->setElementY(rect.y());
427 rc->setElementWidth(rect.width());
428 rc->setElementHeight(rect.height());
429 dom_prop->setElementRect(rc);
433 case QMetaType::QRectF: {
434 auto *rcf =
new DomRectF();
435 const QRectF rectf = v.toRectF();
436 rcf->setElementX(rectf.x());
437 rcf->setElementY(rectf.y());
438 rcf->setElementWidth(rectf.width());
439 rcf->setElementHeight(rectf.height());
440 dom_prop->setElementRectF(rcf);
444 case QMetaType::QFont: {
445 auto *fnt =
new DomFont();
446 const auto font = qvariant_cast<QFont>(v);
447 const uint mask = font.resolveMask();
448 if (mask & QFont::WeightResolved) {
449 switch (font.weight()) {
451 fnt->setElementBold(
false);
454 fnt->setElementBold(
true);
457 const QMetaEnum me = fontWeightMetaEnum();
458 const QString ws = QLatin1StringView(me.valueToKey(font.weight()));
459 fnt->setElementFontWeight(ws);
464 if ((mask & (QFont::FamilyResolved | QFont::FamiliesResolved)) != 0)
465 fnt->setElementFamily(font.family());
466 if (mask & QFont::StyleResolved)
467 fnt->setElementItalic(font.italic());
468 if (mask & QFont::SizeResolved)
469 fnt->setElementPointSize(font.pointSize());
470 if (mask & QFont::StrikeOutResolved)
471 fnt->setElementStrikeOut(font.strikeOut());
472 if (mask & QFont::UnderlineResolved)
473 fnt->setElementUnderline(font.underline());
474 if (mask & QFont::KerningResolved)
475 fnt->setElementKerning(font.kerning());
476 if (mask & QFont::StyleStrategyResolved) {
478 fnt->setElementStyleStrategy(QLatin1StringView(styleStrategy_enum.valueToKey(font.styleStrategy())));
480 if (mask & QFont::HintingPreferenceResolved) {
482 fnt->setElementHintingPreference(QLatin1StringView(hintingPreference_enum.valueToKey(font.hintingPreference())));
485 dom_prop->setElementFont(fnt);
490 case QMetaType::QCursor: {
491 const QMetaEnum cursorShape_enum = metaEnum<QAbstractFormBuilderGadget>(
"cursorShape");
492 dom_prop->setElementCursorShape(QLatin1StringView(cursorShape_enum.valueToKey(qvariant_cast<QCursor>(v).shape())));
497 case QMetaType::QKeySequence: {
498 auto *s =
new DomString();
499 s->setText(qvariant_cast<QKeySequence>(v).toString(QKeySequence::PortableText));
500 dom_prop->setElementString(s);
504 case QMetaType::QLocale: {
505 auto *dom =
new DomLocale();
506 const auto locale = qvariant_cast<QLocale>(v);
511 dom->setAttributeLanguage(QLatin1StringView(language_enum.valueToKey(locale.language())));
512 dom->setAttributeCountry(QLatin1StringView(territory_enum.valueToKey(locale.territory())));
514 dom_prop->setElementLocale(dom);
518 case QMetaType::QSizePolicy: {
519 auto *dom =
new DomSizePolicy();
520 const auto sizePolicy = qvariant_cast<QSizePolicy>(v);
522 dom->setElementHorStretch(sizePolicy.horizontalStretch());
523 dom->setElementVerStretch(sizePolicy.verticalStretch());
527 dom->setAttributeHSizeType(QLatin1StringView(sizeType_enum.valueToKey(sizePolicy.horizontalPolicy())));
528 dom->setAttributeVSizeType(QLatin1StringView(sizeType_enum.valueToKey(sizePolicy.verticalPolicy())));
530 dom_prop->setElementSizePolicy(dom);
534 case QMetaType::QDate: {
535 auto *dom =
new DomDate();
536 const auto date = qvariant_cast<QDate>(v);
538 dom->setElementYear(date.year());
539 dom->setElementMonth(date.month());
540 dom->setElementDay(date.day());
542 dom_prop->setElementDate(dom);
546 case QMetaType::QTime: {
547 auto *dom =
new DomTime();
548 const auto time = qvariant_cast<QTime>(v);
550 dom->setElementHour(time.hour());
551 dom->setElementMinute(time.minute());
552 dom->setElementSecond(time.second());
554 dom_prop->setElementTime(dom);
558 case QMetaType::QDateTime: {
559 auto *dom =
new DomDateTime();
560 const auto dateTime = qvariant_cast<QDateTime>(v);
562 dom->setElementHour(dateTime.time().hour());
563 dom->setElementMinute(dateTime.time().minute());
564 dom->setElementSecond(dateTime.time().second());
565 dom->setElementYear(dateTime.date().year());
566 dom->setElementMonth(dateTime.date().month());
567 dom->setElementDay(dateTime.date().day());
569 dom_prop->setElementDateTime(dom);
573 case QMetaType::QUrl: {
574 auto *dom =
new DomUrl();
575 const QUrl url = v.toUrl();
577 auto *str =
new DomString();
578 str->setText(url.toString());
579 dom->setElementString(str);
581 dom_prop->setElementUrl(dom);
585 case QMetaType::QStringList: {
586 auto *sl =
new DomStringList;
587 sl->setElementString(qvariant_cast<QStringList>(v));
588 dom_prop->setElementStringList(sl);
664 const QString &pname,
const QVariant &v)
666 auto dom_prop =
std::make_unique<DomProperty>();
667 dom_prop->setAttributeName(pname);
669 const int pindex = meta->indexOfProperty(pname.toLatin1().constData());
671 QMetaProperty meta_property = meta->property(pindex);
672 if (v.canConvert<
int>() && meta_property.isEnumType()) {
673 const QMetaEnum e = meta_property.enumerator();
675 const QString sv = flagsValue(e, v.toInt(), afb->d->m_saveVersion);
678 dom_prop->setElementSet(sv);
680 dom_prop->setElementEnum(enumValue(e, v.toInt(), afb->d->m_saveVersion));
682 return dom_prop.release();
684 if (!meta_property.hasStdCppSet()
685 || (isOfType(meta, &QAbstractScrollArea::staticMetaObject)
686 && pname ==
"cursor"_L1)) {
687 dom_prop->setAttributeStdset(0);
692 if (applySimpleProperty(v, isTranslatable(pname, v, meta), dom_prop.get()))
693 return dom_prop.release();
696 switch (v.metaType().id()) {
697 case QMetaType::QPalette: {
698 auto *dom =
new DomPalette();
699 auto palette = qvariant_cast<QPalette>(v);
701 palette.setCurrentColorGroup(QPalette::Active);
702 dom->setElementActive(afb->saveColorGroup(palette));
704 palette.setCurrentColorGroup(QPalette::Inactive);
705 dom->setElementInactive(afb->saveColorGroup(palette));
707 palette.setCurrentColorGroup(QPalette::Disabled);
708 dom->setElementDisabled(afb->saveColorGroup(palette));
710 dom_prop->setElementPalette(dom);
712 case QMetaType::QBrush:
713 dom_prop->setElementBrush(afb->saveBrush(qvariant_cast<QBrush>(v)));
716 const bool hadAttributeStdset = dom_prop->hasAttributeStdset();
717 const bool attributeStdset = dom_prop->attributeStdset();
718 if (afb->resourceBuilder()->isResourceType(v)) {
719 dom_prop.reset(afb->resourceBuilder()->saveResource(afb->workingDirectory(), v));
721 dom_prop->setAttributeName(pname);
722 if (hadAttributeStdset)
723 dom_prop->setAttributeStdset(attributeStdset);
727 uiLibWarning(msgCannotWriteProperty(pname, v));
730 return dom_prop.release();