78 QString *errorMessage)
81 while (!reader.atEnd()) {
82 switch (reader.readNext()) {
83 case QXmlStreamReader::Invalid:
84 *errorMessage = msgXmlError(reader);
86 case QXmlStreamReader::StartElement:
87 if (reader.name().compare(
"ui"_L1, Qt::CaseInsensitive) == 0) {
88 const QString versionAttribute = u"version"_s;
89 const QString languageAttribute = u"language"_s;
90 const QXmlStreamAttributes attributes = reader.attributes();
91 if (attributes.hasAttribute(versionAttribute)) {
92 const QVersionNumber version =
93 QVersionNumber::fromString(attributes.value(versionAttribute));
94 if (version < QVersionNumber(4)) {
96 QCoreApplication::translate(
"QAbstractFormBuilder",
97 "This file was created using Designer from Qt-%1 and cannot be read.")
98 .arg(attributes.value(versionAttribute));
102 if (attributes.hasAttribute(languageAttribute)) {
104 const QString formLanguage = attributes.value(languageAttribute).toString();
105 if (!formLanguage.isEmpty() && formLanguage.compare(language, Qt::CaseInsensitive)) {
107 QCoreApplication::translate(
"QAbstractFormBuilder",
108 "This file cannot be read because it was created using %1.")
121 *errorMessage = QCoreApplication::translate(
"QAbstractFormBuilder",
122 "Invalid UI file: The root element <ui> is missing.");
331inline bool parsePerCellProperty(Layout *l,
int count,
void (Layout::*setter)(
int,
int),
const QString &s,
int defaultValue = 0)
334 clearPerCellValue(l, count, setter, defaultValue);
337 const auto list = QStringView{s}.split(u',');
338 if (list.isEmpty()) {
339 clearPerCellValue(l, count, setter, defaultValue);
343 const int ac = qMin(count, list.size());
346 for ( ; i < ac; i++) {
347 const int value = list.at(i).toInt(&ok);
348 if (!ok || value < 0)
350 (l->*setter)(i, value);
353 for ( ; i < count; i++)
354 (l->*setter)(i, defaultValue);
365void QFormBuilderExtra::getLayoutMargins(
const QList<DomProperty*> &properties,
366 int *left,
int *top,
int *right,
int *bottom)
368 if (
const auto *p = propertyByName(properties,
"leftMargin"))
369 *left = p->elementNumber();
370 if (
const auto *p = propertyByName(properties,
"topMargin"))
371 *top = p->elementNumber();
372 if (
const auto *p = propertyByName(properties,
"rightMargin"))
373 *right = p->elementNumber();
374 if (
const auto *p = propertyByName(properties,
"bottomMargin"))
375 *bottom = p->elementNumber();
488void QFormBuilderExtra::setupColorGroup(QPalette *palette, QPalette::ColorGroup colorGroup,
489 const DomColorGroup *group)
492 const auto &colors = group->elementColor();
493 for (
int role = 0; role < colors.size(); ++role) {
494 const DomColor *color = colors.at(role);
495 const QColor c(color->elementRed(), color->elementGreen(), color->elementBlue());
496 palette->setColor(colorGroup, QPalette::ColorRole(role), c);
500 const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>(
"colorRole");
502 const auto colorRoles = group->elementColorRole();
503 for (
const DomColorRole *colorRole : colorRoles) {
504 if (colorRole->hasAttributeRole()) {
505 const int r = colorRole_enum.keyToValue(colorRole->attributeRole().toLatin1());
507 const QBrush br = setupBrush(colorRole->elementBrush());
508 palette->setBrush(colorGroup,
static_cast<QPalette::ColorRole>(r), br);
514DomColorGroup *QFormBuilderExtra::saveColorGroup(
const QPalette &palette,
515 QPalette::ColorGroup colorGroup)
518 const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>(
"colorRole");
520 DomColorGroup *group =
new DomColorGroup();
521 QList<DomColorRole *> colorRoles;
523 for (
int r = QPalette::WindowText; r < QPalette::NColorRoles; ++r) {
524 const auto role =
static_cast<QPalette::ColorRole>(r);
525 if (palette.isBrushSet(colorGroup, role)) {
526 const QBrush &br = palette.brush(colorGroup, role);
527 DomColorRole *colorRole =
new DomColorRole();
528 colorRole->setElementBrush(saveBrush(br));
529 colorRole->setAttributeRole(QLatin1StringView(colorRole_enum.valueToKey(role)));
530 colorRoles.append(colorRole);
534 group->setElementColorRole(colorRoles);
548QPalette QFormBuilderExtra::loadPalette(
const DomPalette *dom)
552 if (dom->elementActive())
553 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Active, dom->elementActive());
555 if (dom->elementInactive())
556 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Inactive, dom->elementInactive());
558 if (dom->elementDisabled())
559 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Disabled, dom->elementDisabled());
561 palette.setCurrentColorGroup(QPalette::Active);
565QBrush QFormBuilderExtra::setupBrush(
const DomBrush *brush)
568 if (!brush->hasAttributeBrushStyle())
571 const Qt::BrushStyle style = enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::BrushStyle>(
"brushStyle",
572 brush->attributeBrushStyle().toLatin1().constData());
574 if (style == Qt::LinearGradientPattern ||
575 style == Qt::RadialGradientPattern ||
576 style == Qt::ConicalGradientPattern) {
577 const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientType");
578 const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientSpread");
579 const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientCoordinate");
581 const DomGradient *gradient = brush->elementGradient();
582 const QGradient::Type type = enumKeyToValue<QGradient::Type>(gradientType_enum, gradient->attributeType().toLatin1());
585 QGradient *gr =
nullptr;
587 if (type == QGradient::LinearGradient) {
588 gr =
new QLinearGradient(QPointF(gradient->attributeStartX(), gradient->attributeStartY()),
589 QPointF(gradient->attributeEndX(), gradient->attributeEndY()));
590 }
else if (type == QGradient::RadialGradient) {
591 gr =
new QRadialGradient(QPointF(gradient->attributeCentralX(), gradient->attributeCentralY()),
592 gradient->attributeRadius(),
593 QPointF(gradient->attributeFocalX(), gradient->attributeFocalY()));
594 }
else if (type == QGradient::ConicalGradient) {
595 gr =
new QConicalGradient(QPointF(gradient->attributeCentralX(), gradient->attributeCentralY()),
596 gradient->attributeAngle());
601 const QGradient::Spread spread = enumKeyToValue<QGradient::Spread>(gradientSpread_enum, gradient->attributeSpread().toLatin1());
602 gr->setSpread(spread);
604 const QGradient::CoordinateMode coord = enumKeyToValue<QGradient::CoordinateMode>(gradientCoordinate_enum, gradient->attributeCoordinateMode().toLatin1());
605 gr->setCoordinateMode(coord);
607 const auto &stops = gradient->elementGradientStop();
608 for (
const DomGradientStop *stop : stops) {
609 const DomColor *color = stop->elementColor();
610 gr->setColorAt(stop->attributePosition(), QColor::fromRgb(color->elementRed(),
611 color->elementGreen(), color->elementBlue(), color->attributeAlpha()));
615 }
else if (style == Qt::TexturePattern) {
616 const DomProperty *texture = brush->elementTexture();
617 if (texture && texture->kind() == DomProperty::Pixmap) {
621 const DomColor *color = brush->elementColor();
622 br.setColor(QColor::fromRgb(color->elementRed(),
623 color->elementGreen(), color->elementBlue(), color->attributeAlpha()));
624 br.setStyle((Qt::BrushStyle)style);
629DomBrush *QFormBuilderExtra::saveBrush(
const QBrush &br)
631 const QMetaEnum brushStyle_enum = metaEnum<QAbstractFormBuilderGadget>(
"brushStyle");
633 DomBrush *brush =
new DomBrush();
634 const Qt::BrushStyle style = br.style();
635 brush->setAttributeBrushStyle(QLatin1StringView(brushStyle_enum.valueToKey(style)));
636 if (style == Qt::LinearGradientPattern ||
637 style == Qt::RadialGradientPattern ||
638 style == Qt::ConicalGradientPattern) {
639 const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientType");
640 const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientSpread");
641 const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientCoordinate");
643 DomGradient *gradient =
new DomGradient();
644 const QGradient *gr = br.gradient();
645 const QGradient::Type type = gr->type();
646 gradient->setAttributeType(QLatin1StringView(gradientType_enum.valueToKey(type)));
647 gradient->setAttributeSpread(QLatin1StringView(gradientSpread_enum.valueToKey(gr->spread())));
648 gradient->setAttributeCoordinateMode(QLatin1StringView(gradientCoordinate_enum.valueToKey(gr->coordinateMode())));
649 QList<DomGradientStop *> stops;
650 const QGradientStops st = gr->stops();
651 for (
const QGradientStop &pair : st) {
652 DomGradientStop *stop =
new DomGradientStop();
653 stop->setAttributePosition(pair.first);
654 DomColor *color =
new DomColor();
655 color->setElementRed(pair.second.red());
656 color->setElementGreen(pair.second.green());
657 color->setElementBlue(pair.second.blue());
658 color->setAttributeAlpha(pair.second.alpha());
659 stop->setElementColor(color);
662 gradient->setElementGradientStop(stops);
663 if (type == QGradient::LinearGradient) {
664 auto lgr =
static_cast<
const QLinearGradient *>(gr);
665 gradient->setAttributeStartX(lgr->start().x());
666 gradient->setAttributeStartY(lgr->start().y());
667 gradient->setAttributeEndX(lgr->finalStop().x());
668 gradient->setAttributeEndY(lgr->finalStop().y());
669 }
else if (type == QGradient::RadialGradient) {
670 auto rgr =
static_cast<
const QRadialGradient *>(gr);
671 gradient->setAttributeCentralX(rgr->center().x());
672 gradient->setAttributeCentralY(rgr->center().y());
673 gradient->setAttributeFocalX(rgr->focalPoint().x());
674 gradient->setAttributeFocalY(rgr->focalPoint().y());
675 gradient->setAttributeRadius(rgr->radius());
676 }
else if (type == QGradient::ConicalGradient) {
677 auto cgr =
static_cast<
const QConicalGradient *>(gr);
678 gradient->setAttributeCentralX(cgr->center().x());
679 gradient->setAttributeCentralY(cgr->center().y());
680 gradient->setAttributeAngle(cgr->angle());
683 brush->setElementGradient(gradient);
684 }
else if (style == Qt::TexturePattern) {
685 const QPixmap pixmap = br.texture();
686 if (!pixmap.isNull()) {
687 DomProperty *p =
new DomProperty;
688 QFormBuilderExtra::setPixmapProperty(p, {});
689 brush->setElementTexture(p);
692 const QColor &c = br.color();
693 DomColor *color =
new DomColor();
694 color->setElementRed(c.red());
695 color->setElementGreen(c.green());
696 color->setElementBlue(c.blue());
697 color->setAttributeAlpha(c.alpha());
698 brush->setElementColor(color);
714QFormBuilderStrings::QFormBuilderStrings() :
716 {Qt::FontRole,
"font"_L1},
717 {Qt::TextAlignmentRole,
"textAlignment"_L1},
718 {Qt::BackgroundRole,
"background"_L1},
719 {Qt::ForegroundRole,
"foreground"_L1},
720 {Qt::CheckStateRole,
"checkState"_L1}
723 { {Qt::EditRole, Qt::DisplayPropertyRole}, textAttribute},
724 { {Qt::ToolTipRole, Qt::ToolTipPropertyRole}, toolTipAttribute},
725 { {Qt::StatusTipRole, Qt::StatusTipPropertyRole},
"statusTip"_L1},
726 { {Qt::WhatsThisRole, Qt::WhatsThisPropertyRole}, whatsThisAttribute}
729 for (
const RoleNName &it : std::as_const(itemRoles))
730 treeItemRoleHash.insert(it.second, it.first);
733 auto it = itemTextRoles.constBegin();
734 const auto end = itemTextRoles.constEnd();
736 treeItemTextRoleHash.insert(it->second, it->first);