Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
properties.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "properties_p.h"
5#include "ui4_p.h"
9
10#include <QtCore/qdatetime.h>
11#include <QtCore/qurl.h>
12#include <QtCore/qdebug.h>
13
14#include <QtGui/qicon.h>
15#include <QtGui/qpixmap.h>
16#include <QtGui/qfont.h>
17#include <QtWidgets/qframe.h>
18#include <QtWidgets/qabstractscrollarea.h>
19
20#include <limits>
21
23
24using namespace Qt::StringLiterals;
25
26#ifdef QFORMINTERNAL_NAMESPACE
27namespace QFormInternal
28{
29#endif
30
31// Convert complex DOM types with the help of QAbstractFormBuilder
32QVariant domPropertyToVariant(QAbstractFormBuilder *afb,const QMetaObject *meta,const DomProperty *p)
33{
34 // Complex types that need functions from QAbstractFormBuilder
35 switch(p->kind()) {
36 case DomProperty::String: {
37 const int index = meta->indexOfProperty(p->attributeName().toUtf8());
38 if (index != -1 && meta->property(index).metaType().id() == QMetaType::QKeySequence)
39 return QVariant::fromValue(QKeySequence(p->elementString()->text()));
40 }
41 break;
42
43 case DomProperty::Palette: {
44 const DomPalette *dom = p->elementPalette();
45 QPalette palette;
46
47 if (dom->elementActive())
48 afb->setupColorGroup(palette, QPalette::Active, dom->elementActive());
49
50 if (dom->elementInactive())
51 afb->setupColorGroup(palette, QPalette::Inactive, dom->elementInactive());
52
53 if (dom->elementDisabled())
54 afb->setupColorGroup(palette, QPalette::Disabled, dom->elementDisabled());
55
56 palette.setCurrentColorGroup(QPalette::Active);
57 return QVariant::fromValue(palette);
58 }
59
60 case DomProperty::Set: {
61 const QByteArray pname = p->attributeName().toUtf8();
62 const int index = meta->indexOfProperty(pname);
63 if (index == -1) {
64 uiLibWarning(QCoreApplication::translate("QFormBuilder", "The set-type property %1 could not be read.").arg(p->attributeName()));
65 return QVariant();
66 }
67
68 const QMetaEnum e = meta->property(index).enumerator();
69 Q_ASSERT(e.isFlag() == true);
70 bool ok{};
71 QVariant result(e.keysToValue(p->elementSet().toUtf8().constData(), &ok));
72 if (!ok) {
73 uiLibWarning(QCoreApplication::translate("QFormBuilder",
74 "The value \"%1\" of the set-type property %2 could not be read.").
75 arg(p->attributeName(), p->elementSet()));
76 return {};
77 }
78 return result;
79 }
80
81 case DomProperty::Enum: {
82 const QByteArray pname = p->attributeName().toUtf8();
83 const int index = meta->indexOfProperty(pname);
84 const auto &enumValue = p->elementEnum();
85 // Triggers in case of objects in Designer like Spacer/Line for which properties
86 // are serialized using language introspection. On preview, however, these objects are
87 // emulated by hacks in the formbuilder (size policy/orientation)
88 if (index == -1) {
89 // ### special-casing for Line (QFrame) -- fix for 4.2. Jambi hack for enumerations
90 if (!qstrcmp(meta->className(), "QFrame")
91 && (pname == QByteArray("orientation"))) {
92 return QVariant(enumValue.endsWith("Horizontal"_L1) ? QFrame::HLine : QFrame::VLine);
93 }
94 uiLibWarning(QCoreApplication::translate("QFormBuilder", "The enumeration-type property %1 could not be read.").arg(p->attributeName()));
95 return QVariant();
96 }
97
98 const QMetaEnum e = meta->property(index).enumerator();
99 bool ok{};
100 QVariant result(e.keyToValue(enumValue.toUtf8().constData(), &ok));
101 if (!ok) {
102 uiLibWarning(QCoreApplication::translate("QFormBuilder",
103 "The value \"%1\" of the enum-type property %2 could not be read.").
104 arg(p->attributeName(), enumValue));
105 return {};
106 }
107 return result;
108 }
109 case DomProperty::Brush:
110 return QVariant::fromValue(afb->setupBrush(p->elementBrush()));
111 default:
112 if (afb->resourceBuilder()->isResourceProperty(p)) {
113 return afb->resourceBuilder()->loadResource(afb->workingDirectory(), p);
114 }
115
116 break;
117 }
118
119 // simple type
120 return domPropertyToVariant(p);
121}
122
123// Convert a legacy Qt 4 integer font weight to the closes enumeration value
124
126{
127 const QMetaEnum result = metaEnum<QAbstractFormBuilderGadget>("fontWeight");
128 Q_ASSERT(result.isValid());
129 return result;
130}
131
132// Convert simple DOM types
133QVariant domPropertyToVariant(const DomProperty *p)
134{
135 // requires non-const virtual nameToIcon, etc.
136 switch(p->kind()) {
137 case DomProperty::Bool:
138 return QVariant(p->elementBool() == "true"_L1);
139
140 case DomProperty::Cstring:
141 return QVariant(p->elementCstring().toUtf8());
142
143 case DomProperty::Point: {
144 const DomPoint *point = p->elementPoint();
145 return QVariant(QPoint(point->elementX(), point->elementY()));
146 }
147
148 case DomProperty::PointF: {
149 const DomPointF *pointf = p->elementPointF();
150 return QVariant(QPointF(pointf->elementX(), pointf->elementY()));
151 }
152
153 case DomProperty::Size: {
154 const DomSize *size = p->elementSize();
155 return QVariant(QSize(size->elementWidth(), size->elementHeight()));
156 }
157
158 case DomProperty::SizeF: {
159 const DomSizeF *sizef = p->elementSizeF();
160 return QVariant(QSizeF(sizef->elementWidth(), sizef->elementHeight()));
161 }
162
163 case DomProperty::Rect: {
164 const DomRect *rc = p->elementRect();
165 const QRect g(rc->elementX(), rc->elementY(), rc->elementWidth(), rc->elementHeight());
166 return QVariant(g);
167 }
168
169 case DomProperty::RectF: {
170 const DomRectF *rcf = p->elementRectF();
171 const QRectF g(rcf->elementX(), rcf->elementY(), rcf->elementWidth(), rcf->elementHeight());
172 return QVariant(g);
173 }
174
175 case DomProperty::String:
176 return QVariant(p->elementString()->text());
177
178 case DomProperty::Number:
179 return QVariant(p->elementNumber());
180
181 case DomProperty::UInt:
182 return QVariant(p->elementUInt());
183
184 case DomProperty::LongLong:
185 return QVariant(p->elementLongLong());
186
187 case DomProperty::ULongLong:
188 return QVariant(p->elementULongLong());
189
190 case DomProperty::Double:
191 return QVariant(p->elementDouble());
192
193 case DomProperty::Char: {
194 const DomChar *character = p->elementChar();
195 const QChar c(character->elementUnicode());
196 return QVariant::fromValue(c);
197 }
198
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);
205 }
206
207 case DomProperty::Font: {
208 const DomFont *font = p->elementFont();
209
210 QFont f;
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()));
228 }
229 if (font->hasElementHintingPreference()) {
230 f.setHintingPreference(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::HintingPreference>("hintingPreference",
231 font->elementHintingPreference().toLatin1().constData()));
232 }
233
234 if (font->hasElementFontWeight()) {
235 f.setWeight(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, QFont::Weight>(
236 "fontWeight",
237 font->elementFontWeight().toLatin1().constData()));
238 } else if (font->hasElementBold()) {
239 f.setBold(font->elementBold());
240 }
241
242 return QVariant::fromValue(f);
243 }
244
245 case DomProperty::Date: {
246 const DomDate *date = p->elementDate();
247 return QVariant(QDate(date->elementYear(), date->elementMonth(), date->elementDay()));
248 }
249
250 case DomProperty::Time: {
251 const DomTime *t = p->elementTime();
252 return QVariant(QTime(t->elementHour(), t->elementMinute(), t->elementSecond()));
253 }
254
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));
260 }
261
262 case DomProperty::Url: {
263 const DomUrl *url = p->elementUrl();
264 return QVariant(QUrl(url->elementString()->text()));
265 }
266
267#if QT_CONFIG(cursor)
268 case DomProperty::Cursor:
269 return QVariant::fromValue(QCursor(static_cast<Qt::CursorShape>(p->elementCursor())));
270
271 case DomProperty::CursorShape:
272 return QVariant::fromValue(QCursor(enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::CursorShape>("cursorShape",
273 p->elementCursorShape().toLatin1().constData())));
274#endif
275
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())));
282 }
283 case DomProperty::SizePolicy: {
284 const DomSizePolicy *sizep = p->elementSizePolicy();
285
286 QSizePolicy sizePolicy;
287 sizePolicy.setHorizontalStretch(sizep->elementHorStretch());
288 sizePolicy.setVerticalStretch(sizep->elementVerStretch());
289
290 const QMetaEnum sizeType_enum = metaEnum<QAbstractFormBuilderGadget>("sizeType");
291
292 if (sizep->hasElementHSizeType()) {
293 sizePolicy.setHorizontalPolicy((QSizePolicy::Policy) sizep->elementHSizeType());
294 } else if (sizep->hasAttributeHSizeType()) {
295 const QSizePolicy::Policy sp = enumKeyToValue<QSizePolicy::Policy>(sizeType_enum, sizep->attributeHSizeType().toLatin1());
296 sizePolicy.setHorizontalPolicy(sp);
297 }
298
299 if (sizep->hasElementVSizeType()) {
300 sizePolicy.setVerticalPolicy((QSizePolicy::Policy) sizep->elementVSizeType());
301 } else if (sizep->hasAttributeVSizeType()) {
302 const QSizePolicy::Policy sp = enumKeyToValue<QSizePolicy::Policy>(sizeType_enum, sizep->attributeVSizeType().toLatin1());
303 sizePolicy.setVerticalPolicy(sp);
304 }
305
306 return QVariant::fromValue(sizePolicy);
307 }
308
309 case DomProperty::StringList:
310 return QVariant(p->elementStringList()->elementString());
311
312 default:
313 uiLibWarning(QCoreApplication::translate("QFormBuilder", "Reading properties of the type %1 is not supported yet.").arg(p->kind()));
314 break;
315 }
316
317 return QVariant();
318}
319
320// Apply a simple variant type to a DOM property
321static bool applySimpleProperty(const QVariant &v, bool translateString, DomProperty *dom_prop)
322{
323 switch (v.metaType().id()) {
324 case QMetaType::QString: {
325 DomString *str = new DomString();
326 str->setText(v.toString());
327 if (!translateString)
328 str->setAttributeNotr(u"true"_s);
329 dom_prop->setElementString(str);
330 }
331 return true;
332
333 case QMetaType::QByteArray:
334 dom_prop->setElementCstring(QString::fromUtf8(v.toByteArray()));
335 return true;
336
337 case QMetaType::Int:
338 dom_prop->setElementNumber(v.toInt());
339 return true;
340
341 case QMetaType::UInt:
342 dom_prop->setElementUInt(v.toUInt());
343 return true;
344
345 case QMetaType::LongLong:
346 dom_prop->setElementLongLong(v.toLongLong());
347 return true;
348
349 case QMetaType::ULongLong:
350 dom_prop->setElementULongLong(v.toULongLong());
351 return true;
352
353 case QMetaType::Double:
354 dom_prop->setElementDouble(v.toDouble());
355 return true;
356
357 case QMetaType::Bool:
358 dom_prop->setElementBool(v.toBool() ? "true"_L1 : "false"_L1);
359 return true;
360
361 case QMetaType::QChar: {
362 DomChar *ch = new DomChar();
363 const QChar character = v.toChar();
364 ch->setElementUnicode(character.unicode());
365 dom_prop->setElementChar(ch);
366 }
367 return true;
368
369 case QMetaType::QPoint: {
370 DomPoint *pt = new DomPoint();
371 const QPoint point = v.toPoint();
372 pt->setElementX(point.x());
373 pt->setElementY(point.y());
374 dom_prop->setElementPoint(pt);
375 }
376 return true;
377
378 case QMetaType::QPointF: {
379 DomPointF *ptf = new DomPointF();
380 const QPointF pointf = v.toPointF();
381 ptf->setElementX(pointf.x());
382 ptf->setElementY(pointf.y());
383 dom_prop->setElementPointF(ptf);
384 }
385 return true;
386
387 case QMetaType::QColor: {
388 DomColor *clr = new DomColor();
389 const QColor color = qvariant_cast<QColor>(v);
390 clr->setElementRed(color.red());
391 clr->setElementGreen(color.green());
392 clr->setElementBlue(color.blue());
393 const int alphaChannel = color.alpha();
394 if (alphaChannel != 255)
395 clr->setAttributeAlpha(alphaChannel);
396 dom_prop->setElementColor(clr);
397 }
398 return true;
399
400 case QMetaType::QSize: {
401 DomSize *sz = new DomSize();
402 const QSize size = v.toSize();
403 sz->setElementWidth(size.width());
404 sz->setElementHeight(size.height());
405 dom_prop->setElementSize(sz);
406 }
407 return true;
408
409 case QMetaType::QSizeF: {
410 DomSizeF *szf = new DomSizeF();
411 const QSizeF sizef = v.toSizeF();
412 szf->setElementWidth(sizef.width());
413 szf->setElementHeight(sizef.height());
414 dom_prop->setElementSizeF(szf);
415 }
416 return true;
417
418 case QMetaType::QRect: {
419 DomRect *rc = new DomRect();
420 const QRect rect = v.toRect();
421 rc->setElementX(rect.x());
422 rc->setElementY(rect.y());
423 rc->setElementWidth(rect.width());
424 rc->setElementHeight(rect.height());
425 dom_prop->setElementRect(rc);
426 }
427 return true;
428
429 case QMetaType::QRectF: {
430 DomRectF *rcf = new DomRectF();
431 const QRectF rectf = v.toRectF();
432 rcf->setElementX(rectf.x());
433 rcf->setElementY(rectf.y());
434 rcf->setElementWidth(rectf.width());
435 rcf->setElementHeight(rectf.height());
436 dom_prop->setElementRectF(rcf);
437 }
438 return true;
439
440 case QMetaType::QFont: {
441 DomFont *fnt = new DomFont();
442 const QFont font = qvariant_cast<QFont>(v);
443 const uint mask = font.resolveMask();
444 if (mask & QFont::WeightResolved) {
445 switch (font.weight()) {
446 case QFont::Normal:
447 fnt->setElementBold(false);
448 break;
449 case QFont::Bold:
450 fnt->setElementBold(true);
451 break;
452 default: {
453 const QMetaEnum me = fontWeightMetaEnum();
454 const QString ws = QLatin1StringView(me.valueToKey(font.weight()));
455 fnt->setElementFontWeight(ws);
456 }
457 break;
458 }
459 }
460 if ((mask & (QFont::FamilyResolved | QFont::FamiliesResolved)) != 0)
461 fnt->setElementFamily(font.family());
462 if (mask & QFont::StyleResolved)
463 fnt->setElementItalic(font.italic());
464 if (mask & QFont::SizeResolved)
465 fnt->setElementPointSize(font.pointSize());
466 if (mask & QFont::StrikeOutResolved)
467 fnt->setElementStrikeOut(font.strikeOut());
468 if (mask & QFont::UnderlineResolved)
469 fnt->setElementUnderline(font.underline());
470 if (mask & QFont::KerningResolved)
471 fnt->setElementKerning(font.kerning());
472 if (mask & QFont::StyleStrategyResolved) {
473 const QMetaEnum styleStrategy_enum = metaEnum<QAbstractFormBuilderGadget>("styleStrategy");
474 fnt->setElementStyleStrategy(QLatin1StringView(styleStrategy_enum.valueToKey(font.styleStrategy())));
475 }
476 if (mask & QFont::HintingPreferenceResolved) {
477 const QMetaEnum hintingPreference_enum = metaEnum<QAbstractFormBuilderGadget>("hintingPreference");
478 fnt->setElementHintingPreference(QLatin1StringView(hintingPreference_enum.valueToKey(font.hintingPreference())));
479 }
480
481 dom_prop->setElementFont(fnt);
482 }
483 return true;
484
485#if QT_CONFIG(cursor)
486 case QMetaType::QCursor: {
487 const QMetaEnum cursorShape_enum = metaEnum<QAbstractFormBuilderGadget>("cursorShape");
488 dom_prop->setElementCursorShape(QLatin1StringView(cursorShape_enum.valueToKey(qvariant_cast<QCursor>(v).shape())));
489 }
490 return true;
491#endif
492
493 case QMetaType::QKeySequence: {
494 DomString *s = new DomString();
495 s->setText(qvariant_cast<QKeySequence>(v).toString(QKeySequence::PortableText));
496 dom_prop->setElementString(s);
497 }
498 return true;
499
500 case QMetaType::QLocale: {
501 DomLocale *dom = new DomLocale();
502 const QLocale locale = qvariant_cast<QLocale>(v);
503
504 const QMetaEnum language_enum = metaEnum<QAbstractFormBuilderGadget>("language");
505 const QMetaEnum territory_enum = metaEnum<QAbstractFormBuilderGadget>("country");
506
507 dom->setAttributeLanguage(QLatin1StringView(language_enum.valueToKey(locale.language())));
508 dom->setAttributeCountry(QLatin1StringView(territory_enum.valueToKey(locale.territory())));
509
510 dom_prop->setElementLocale(dom);
511 }
512 return true;
513
514 case QMetaType::QSizePolicy: {
515 DomSizePolicy *dom = new DomSizePolicy();
516 const QSizePolicy sizePolicy = qvariant_cast<QSizePolicy>(v);
517
518 dom->setElementHorStretch(sizePolicy.horizontalStretch());
519 dom->setElementVerStretch(sizePolicy.verticalStretch());
520
521 const QMetaEnum sizeType_enum = metaEnum<QAbstractFormBuilderGadget>("sizeType");
522
523 dom->setAttributeHSizeType(QLatin1StringView(sizeType_enum.valueToKey(sizePolicy.horizontalPolicy())));
524 dom->setAttributeVSizeType(QLatin1StringView(sizeType_enum.valueToKey(sizePolicy.verticalPolicy())));
525
526 dom_prop->setElementSizePolicy(dom);
527 }
528 return true;
529
530 case QMetaType::QDate: {
531 DomDate *dom = new DomDate();
532 const QDate date = qvariant_cast<QDate>(v);
533
534 dom->setElementYear(date.year());
535 dom->setElementMonth(date.month());
536 dom->setElementDay(date.day());
537
538 dom_prop->setElementDate(dom);
539 }
540 return true;
541
542 case QMetaType::QTime: {
543 DomTime *dom = new DomTime();
544 const QTime time = qvariant_cast<QTime>(v);
545
546 dom->setElementHour(time.hour());
547 dom->setElementMinute(time.minute());
548 dom->setElementSecond(time.second());
549
550 dom_prop->setElementTime(dom);
551 }
552 return true;
553
554 case QMetaType::QDateTime: {
555 DomDateTime *dom = new DomDateTime();
556 const QDateTime dateTime = qvariant_cast<QDateTime>(v);
557
558 dom->setElementHour(dateTime.time().hour());
559 dom->setElementMinute(dateTime.time().minute());
560 dom->setElementSecond(dateTime.time().second());
561 dom->setElementYear(dateTime.date().year());
562 dom->setElementMonth(dateTime.date().month());
563 dom->setElementDay(dateTime.date().day());
564
565 dom_prop->setElementDateTime(dom);
566 }
567 return true;
568
569 case QMetaType::QUrl: {
570 DomUrl *dom = new DomUrl();
571 const QUrl url = v.toUrl();
572
573 DomString *str = new DomString();
574 str->setText(url.toString());
575 dom->setElementString(str);
576
577 dom_prop->setElementUrl(dom);
578 }
579 return true;
580
581 case QMetaType::QStringList: {
582 DomStringList *sl = new DomStringList;
583 sl->setElementString(qvariant_cast<QStringList>(v));
584 dom_prop->setElementStringList(sl);
585 }
586 return true;
587
588 default:
589 break;
590 }
591
592 return false;
593}
594static QString msgCannotWriteProperty(const QString &pname, const QVariant &v)
595{
596 return QCoreApplication::translate("QFormBuilder", "The property %1 could not be written. The type %2 is not supported yet.").
597 arg(pname).arg(QLatin1StringView(v.typeName()));
598
599}
600
601static bool isOfType(const QMetaObject *what, const QMetaObject *type)
602{
603 do {
604 if (what == type)
605 return true;
606 } while ((what = what->superClass()));
607 return false;
608}
609
610static bool isTranslatable(const QString &pname, const QVariant &v, const QMetaObject *meta)
611{
612 if (pname == "objectName"_L1)
613 return false;
614 if (pname == "styleSheet"_L1 && v.metaType().id() == QMetaType::QString
615 && isOfType(meta, &QWidget::staticMetaObject)) {
616 return false;
617 }
618 return true;
619}
620
621// Convert complex variant types to DOM properties with the help of QAbstractFormBuilder
622// Does not perform a check using QAbstractFormBuilder::checkProperty().
623DomProperty *variantToDomProperty(QAbstractFormBuilder *afb, const QMetaObject *meta,
624 const QString &pname, const QVariant &v)
625{
626 DomProperty *dom_prop = new DomProperty();
627 dom_prop->setAttributeName(pname);
628
629 const int pindex = meta->indexOfProperty(pname.toLatin1());
630 if (pindex != -1) {
631 QMetaProperty meta_property = meta->property(pindex);
632 if ((v.metaType().id() == QMetaType::Int || v.metaType().id() == QMetaType::UInt) && meta_property.isEnumType()) {
633 const QMetaEnum e = meta_property.enumerator();
634 if (e.isFlag())
635 dom_prop->setElementSet(QString::fromLatin1(e.valueToKeys(v.toInt())));
636 else
637 dom_prop->setElementEnum(QString::fromLatin1(e.valueToKey(v.toInt())));
638 return dom_prop;
639 }
640 if (!meta_property.hasStdCppSet()
641 || (isOfType(meta, &QAbstractScrollArea::staticMetaObject)
642 && pname == "cursor"_L1)) {
643 dom_prop->setAttributeStdset(0);
644 }
645 }
646
647 // Try simple properties
648 if (applySimpleProperty(v, isTranslatable(pname, v, meta), dom_prop))
649 return dom_prop;
650
651 // Complex properties
652 switch (v.metaType().id()) {
653 case QMetaType::QPalette: {
654 DomPalette *dom = new DomPalette();
655 QPalette palette = qvariant_cast<QPalette>(v);
656
657 palette.setCurrentColorGroup(QPalette::Active);
658 dom->setElementActive(afb->saveColorGroup(palette));
659
660 palette.setCurrentColorGroup(QPalette::Inactive);
661 dom->setElementInactive(afb->saveColorGroup(palette));
662
663 palette.setCurrentColorGroup(QPalette::Disabled);
664 dom->setElementDisabled(afb->saveColorGroup(palette));
665
666 dom_prop->setElementPalette(dom);
667 } break;
668 case QMetaType::QBrush:
669 dom_prop->setElementBrush(afb->saveBrush(qvariant_cast<QBrush>(v)));
670 break;
671 default: {
672 const bool hadAttributeStdset = dom_prop->hasAttributeStdset();
673 const bool attributeStdset = dom_prop->attributeStdset();
674 delete dom_prop;
675 if (afb->resourceBuilder()->isResourceType(v)) {
676 dom_prop = afb->resourceBuilder()->saveResource(afb->workingDirectory(), v);
677 if (dom_prop) {
678 dom_prop->setAttributeName(pname);
679 if (hadAttributeStdset)
680 dom_prop->setAttributeStdset(attributeStdset);
681 }
682 break;
683 }
684 uiLibWarning(msgCannotWriteProperty(pname, v));
685 } return nullptr;
686 }
687 return dom_prop;
688}
689
690#ifdef QFORMINTERNAL_NAMESPACE
691}
692#endif
693
694QT_END_NAMESPACE
Combined button and popup list for selecting options.
static bool isOfType(const QMetaObject *what, const QMetaObject *type)
static bool applySimpleProperty(const QVariant &v, bool translateString, DomProperty *dom_prop)
static QMetaEnum fontWeightMetaEnum()
DomProperty * variantToDomProperty(QAbstractFormBuilder *afb, const QMetaObject *meta, const QString &pname, const QVariant &v)
static QString msgCannotWriteProperty(const QString &pname, const QVariant &v)
static bool isTranslatable(const QString &pname, const QVariant &v, const QMetaObject *meta)
QVariant domPropertyToVariant(QAbstractFormBuilder *afb, const QMetaObject *meta, const DomProperty *p)
QVariant domPropertyToVariant(const DomProperty *p)