82 QString *errorMessage)
85 while (!reader.atEnd()) {
86 switch (reader.readNext()) {
87 case QXmlStreamReader::Invalid:
88 *errorMessage = msgXmlError(reader);
90 case QXmlStreamReader::StartElement:
91 if (reader.name().compare(
"ui"_L1, Qt::CaseInsensitive) == 0) {
92 const QString versionAttribute = u"version"_s;
93 const QString languageAttribute = u"language"_s;
94 const QXmlStreamAttributes attributes = reader.attributes();
95 if (attributes.hasAttribute(versionAttribute)) {
96 const QVersionNumber version =
97 QVersionNumber::fromString(attributes.value(versionAttribute));
98 if (version < QVersionNumber(4)) {
100 QCoreApplication::translate(
"QAbstractFormBuilder",
101 "This file was created using Designer from Qt-%1 and cannot be read.")
102 .arg(attributes.value(versionAttribute));
106 if (attributes.hasAttribute(languageAttribute)) {
108 const QString formLanguage = attributes.value(languageAttribute).toString();
109 if (!formLanguage.isEmpty() && formLanguage.compare(language, Qt::CaseInsensitive)) {
111 QCoreApplication::translate(
"QAbstractFormBuilder",
112 "This file cannot be read because it was created using %1.")
125 *errorMessage = QCoreApplication::translate(
"QAbstractFormBuilder",
126 "Invalid UI file: The root element <ui> is missing.");
171bool QFormBuilderExtra::applyBuddy(
const QString &buddyName, BuddyMode applyMode, QLabel *label)
173 if (buddyName.isEmpty()) {
174 label->setBuddy(
nullptr);
184 QWidget *parent = label->parentWidget();
185 while (parent && widgets.isEmpty()) {
186 widgets = parent->findChildren<QWidget*>(buddyName);
187 parent = parent->parentWidget();
190 if (widgets.isEmpty()) {
191 label->setBuddy(
nullptr);
195 for (
auto *w : std::as_const(widgets)) {
196 if (applyMode == BuddyApplyAll || !w->isHidden()) {
202 label->setBuddy(
nullptr);
346inline bool parsePerCellProperty(Layout *l,
int count,
void (Layout::*setter)(
int,
int),
const QString &s,
int defaultValue = 0)
349 clearPerCellValue(l, count, setter, defaultValue);
352 const auto list = QStringView{s}.split(u',');
353 if (list.isEmpty()) {
354 clearPerCellValue(l, count, setter, defaultValue);
358 const int ac = qMin(count, list.size());
361 for ( ; i < ac; i++) {
362 const int value = list.at(i).toInt(&ok);
363 if (!ok || value < 0)
365 (l->*setter)(i, value);
368 for ( ; i < count; i++)
369 (l->*setter)(i, defaultValue);
380void QFormBuilderExtra::getLayoutMargins(
const QList<DomProperty*> &properties,
381 int *left,
int *top,
int *right,
int *bottom)
383 if (
const auto *p = propertyByName(properties,
"leftMargin"))
384 *left = p->elementNumber();
385 if (
const auto *p = propertyByName(properties,
"topMargin"))
386 *top = p->elementNumber();
387 if (
const auto *p = propertyByName(properties,
"rightMargin"))
388 *right = p->elementNumber();
389 if (
const auto *p = propertyByName(properties,
"bottomMargin"))
390 *bottom = p->elementNumber();
513void QFormBuilderExtra::setupColorGroup(QPalette *palette, QPalette::ColorGroup colorGroup,
514 const DomColorGroup *group)
517 const auto &colors = group->elementColor();
518 for (
int role = 0; role < colors.size(); ++role) {
519 const DomColor *color = colors.at(role);
520 const QColor c(color->elementRed(), color->elementGreen(), color->elementBlue());
521 palette->setColor(colorGroup, QPalette::ColorRole(role), c);
525 const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>(
"colorRole");
527 const auto colorRoles = group->elementColorRole();
528 for (
const DomColorRole *colorRole : colorRoles) {
529 if (colorRole->hasAttributeRole()) {
530 const auto &roleName = colorRole->attributeRole().toLatin1();
531 const int r = colorRole_enum.keyToValue(roleName.constData());
533 const QBrush br = setupBrush(colorRole->elementBrush());
534 palette->setBrush(colorGroup,
static_cast<QPalette::ColorRole>(r), br);
540DomColorGroup *QFormBuilderExtra::saveColorGroup(
const QPalette &palette,
541 QPalette::ColorGroup colorGroup)
544 const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>(
"colorRole");
546 auto *group =
new DomColorGroup();
547 QList<DomColorRole *> colorRoles;
549 for (
int r = QPalette::WindowText; r < QPalette::NColorRoles; ++r) {
550 const auto role =
static_cast<QPalette::ColorRole>(r);
551 if (palette.isBrushSet(colorGroup, role)) {
552 const QBrush &br = palette.brush(colorGroup, role);
553 auto *colorRole =
new DomColorRole();
554 colorRole->setElementBrush(saveBrush(br));
555 colorRole->setAttributeRole(QLatin1StringView(colorRole_enum.valueToKey(role)));
556 colorRoles.append(colorRole);
560 group->setElementColorRole(colorRoles);
574QPalette QFormBuilderExtra::loadPalette(
const DomPalette *dom)
578 if (dom->elementActive())
579 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Active, dom->elementActive());
581 if (dom->elementInactive())
582 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Inactive, dom->elementInactive());
584 if (dom->elementDisabled())
585 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Disabled, dom->elementDisabled());
587 palette.setCurrentColorGroup(QPalette::Active);
591QBrush QFormBuilderExtra::setupBrush(
const DomBrush *brush)
594 if (!brush->hasAttributeBrushStyle())
597 const Qt::BrushStyle style = enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::BrushStyle>(
"brushStyle",
598 brush->attributeBrushStyle().toLatin1().constData());
600 if (style == Qt::LinearGradientPattern ||
601 style == Qt::RadialGradientPattern ||
602 style == Qt::ConicalGradientPattern) {
603 const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientType");
604 const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientSpread");
605 const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientCoordinate");
607 const DomGradient *gradient = brush->elementGradient();
608 const auto type = enumKeyToValue<QGradient::Type>(
609 gradientType_enum, gradient->attributeType().toLatin1().constData());
611 QGradient *gr =
nullptr;
613 if (type == QGradient::LinearGradient) {
614 gr =
new QLinearGradient(QPointF(gradient->attributeStartX(), gradient->attributeStartY()),
615 QPointF(gradient->attributeEndX(), gradient->attributeEndY()));
616 }
else if (type == QGradient::RadialGradient) {
617 gr =
new QRadialGradient(QPointF(gradient->attributeCentralX(), gradient->attributeCentralY()),
618 gradient->attributeRadius(),
619 QPointF(gradient->attributeFocalX(), gradient->attributeFocalY()));
620 }
else if (type == QGradient::ConicalGradient) {
621 gr =
new QConicalGradient(QPointF(gradient->attributeCentralX(), gradient->attributeCentralY()),
622 gradient->attributeAngle());
627 const auto spread = enumKeyToValue<QGradient::Spread>(
628 gradientSpread_enum, gradient->attributeSpread().toLatin1().constData());
629 gr->setSpread(spread);
631 const auto coord = enumKeyToValue<QGradient::CoordinateMode>(
632 gradientCoordinate_enum,
633 gradient->attributeCoordinateMode().toLatin1().constData());
634 gr->setCoordinateMode(coord);
636 const auto &stops = gradient->elementGradientStop();
637 for (
const DomGradientStop *stop : stops) {
638 const DomColor *color = stop->elementColor();
639 gr->setColorAt(stop->attributePosition(), QColor::fromRgb(color->elementRed(),
640 color->elementGreen(), color->elementBlue(), color->attributeAlpha()));
644 }
else if (style == Qt::TexturePattern) {
645 const DomProperty *texture = brush->elementTexture();
646 if (texture && texture->kind() == DomProperty::Pixmap) {
650 const DomColor *color = brush->elementColor();
651 br.setColor(QColor::fromRgb(color->elementRed(),
652 color->elementGreen(), color->elementBlue(), color->attributeAlpha()));
653 br.setStyle((Qt::BrushStyle)style);
658DomBrush *QFormBuilderExtra::saveBrush(
const QBrush &br)
660 const QMetaEnum brushStyle_enum = metaEnum<QAbstractFormBuilderGadget>(
"brushStyle");
662 auto *brush =
new DomBrush();
663 const Qt::BrushStyle style = br.style();
664 brush->setAttributeBrushStyle(QLatin1StringView(brushStyle_enum.valueToKey(style)));
665 if (style == Qt::LinearGradientPattern ||
666 style == Qt::RadialGradientPattern ||
667 style == Qt::ConicalGradientPattern) {
668 const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientType");
669 const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientSpread");
670 const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientCoordinate");
672 auto *gradient =
new DomGradient();
673 const QGradient *gr = br.gradient();
674 const QGradient::Type type = gr->type();
675 gradient->setAttributeType(QLatin1StringView(gradientType_enum.valueToKey(type)));
676 gradient->setAttributeSpread(QLatin1StringView(gradientSpread_enum.valueToKey(gr->spread())));
677 gradient->setAttributeCoordinateMode(QLatin1StringView(gradientCoordinate_enum.valueToKey(gr->coordinateMode())));
678 QList<DomGradientStop *> stops;
679 const QGradientStops st = gr->stops();
680 for (
const QGradientStop &pair : st) {
681 auto *stop =
new DomGradientStop();
682 stop->setAttributePosition(pair.first);
683 auto *color =
new DomColor();
684 color->setElementRed(pair.second.red());
685 color->setElementGreen(pair.second.green());
686 color->setElementBlue(pair.second.blue());
687 color->setAttributeAlpha(pair.second.alpha());
688 stop->setElementColor(color);
691 gradient->setElementGradientStop(stops);
692 if (type == QGradient::LinearGradient) {
693 const auto *lgr =
static_cast<
const QLinearGradient *>(gr);
694 gradient->setAttributeStartX(lgr->start().x());
695 gradient->setAttributeStartY(lgr->start().y());
696 gradient->setAttributeEndX(lgr->finalStop().x());
697 gradient->setAttributeEndY(lgr->finalStop().y());
698 }
else if (type == QGradient::RadialGradient) {
699 const auto *rgr =
static_cast<
const QRadialGradient *>(gr);
700 gradient->setAttributeCentralX(rgr->center().x());
701 gradient->setAttributeCentralY(rgr->center().y());
702 gradient->setAttributeFocalX(rgr->focalPoint().x());
703 gradient->setAttributeFocalY(rgr->focalPoint().y());
704 gradient->setAttributeRadius(rgr->radius());
705 }
else if (type == QGradient::ConicalGradient) {
706 const auto *cgr =
static_cast<
const QConicalGradient *>(gr);
707 gradient->setAttributeCentralX(cgr->center().x());
708 gradient->setAttributeCentralY(cgr->center().y());
709 gradient->setAttributeAngle(cgr->angle());
712 brush->setElementGradient(gradient);
713 }
else if (style == Qt::TexturePattern) {
714 const QPixmap pixmap = br.texture();
715 if (!pixmap.isNull()) {
716 auto *p =
new DomProperty;
717 QFormBuilderExtra::setPixmapProperty(p, {});
718 brush->setElementTexture(p);
721 const QColor &c = br.color();
722 auto *color =
new DomColor();
723 color->setElementRed(c.red());
724 color->setElementGreen(c.green());
725 color->setElementBlue(c.blue());
726 color->setAttributeAlpha(c.alpha());
727 brush->setElementColor(color);
743QFormBuilderStrings::QFormBuilderStrings() :
745 {Qt::FontRole,
"font"_L1},
746 {Qt::TextAlignmentRole,
"textAlignment"_L1},
747 {Qt::BackgroundRole,
"background"_L1},
748 {Qt::ForegroundRole,
"foreground"_L1},
749 {Qt::CheckStateRole,
"checkState"_L1}
752 { {Qt::EditRole, Qt::DisplayPropertyRole}, textAttribute},
753 { {Qt::ToolTipRole, Qt::ToolTipPropertyRole}, toolTipAttribute},
754 { {Qt::StatusTipRole, Qt::StatusTipPropertyRole},
"statusTip"_L1},
755 { {Qt::WhatsThisRole, Qt::WhatsThisPropertyRole}, whatsThisAttribute}
758 for (
const RoleNName &it : std::as_const(itemRoles))
759 treeItemRoleHash.insert(it.second, it.first);
762 auto it = itemTextRoles.constBegin();
763 const auto end = itemTextRoles.constEnd();
765 treeItemTextRoleHash.insert(it->second, it->first);