81 QString *errorMessage)
84 while (!reader.atEnd()) {
85 switch (reader.readNext()) {
86 case QXmlStreamReader::Invalid:
87 *errorMessage = msgXmlError(reader);
89 case QXmlStreamReader::StartElement:
90 if (reader.name().compare(
"ui"_L1, Qt::CaseInsensitive) == 0) {
91 const QString versionAttribute = u"version"_s;
92 const QString languageAttribute = u"language"_s;
93 const QXmlStreamAttributes attributes = reader.attributes();
94 if (attributes.hasAttribute(versionAttribute)) {
95 const QVersionNumber version =
96 QVersionNumber::fromString(attributes.value(versionAttribute));
97 if (version < QVersionNumber(4)) {
99 QCoreApplication::translate(
"QAbstractFormBuilder",
100 "This file was created using Designer from Qt-%1 and cannot be read.")
101 .arg(attributes.value(versionAttribute));
105 if (attributes.hasAttribute(languageAttribute)) {
107 const QString formLanguage = attributes.value(languageAttribute).toString();
108 if (!formLanguage.isEmpty() && formLanguage.compare(language, Qt::CaseInsensitive)) {
110 QCoreApplication::translate(
"QAbstractFormBuilder",
111 "This file cannot be read because it was created using %1.")
124 *errorMessage = QCoreApplication::translate(
"QAbstractFormBuilder",
125 "Invalid UI file: The root element <ui> is missing.");
170bool QFormBuilderExtra::applyBuddy(
const QString &buddyName, BuddyMode applyMode, QLabel *label)
172 if (buddyName.isEmpty()) {
173 label->setBuddy(
nullptr);
183 QWidget *parent = label->parentWidget();
184 while (parent && widgets.isEmpty()) {
185 widgets = parent->findChildren<QWidget*>(buddyName);
186 parent = parent->parentWidget();
189 if (widgets.isEmpty()) {
190 label->setBuddy(
nullptr);
194 for (
auto *w : std::as_const(widgets)) {
195 if (applyMode == BuddyApplyAll || !w->isHidden()) {
201 label->setBuddy(
nullptr);
345inline bool parsePerCellProperty(Layout *l,
int count,
void (Layout::*setter)(
int,
int),
const QString &s,
int defaultValue = 0)
348 clearPerCellValue(l, count, setter, defaultValue);
351 const auto list = QStringView{s}.split(u',');
352 if (list.isEmpty()) {
353 clearPerCellValue(l, count, setter, defaultValue);
357 const int ac = qMin(count, list.size());
360 for ( ; i < ac; i++) {
361 const int value = list.at(i).toInt(&ok);
362 if (!ok || value < 0)
364 (l->*setter)(i, value);
367 for ( ; i < count; i++)
368 (l->*setter)(i, defaultValue);
379void QFormBuilderExtra::getLayoutMargins(
const QList<DomProperty*> &properties,
380 int *left,
int *top,
int *right,
int *bottom)
382 if (
const auto *p = propertyByName(properties,
"leftMargin"))
383 *left = p->elementNumber();
384 if (
const auto *p = propertyByName(properties,
"topMargin"))
385 *top = p->elementNumber();
386 if (
const auto *p = propertyByName(properties,
"rightMargin"))
387 *right = p->elementNumber();
388 if (
const auto *p = propertyByName(properties,
"bottomMargin"))
389 *bottom = p->elementNumber();
512void QFormBuilderExtra::setupColorGroup(QPalette *palette, QPalette::ColorGroup colorGroup,
513 const DomColorGroup *group)
516 const auto &colors = group->elementColor();
517 for (
int role = 0; role < colors.size(); ++role) {
518 const DomColor *color = colors.at(role);
519 const QColor c(color->elementRed(), color->elementGreen(), color->elementBlue());
520 palette->setColor(colorGroup, QPalette::ColorRole(role), c);
524 const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>(
"colorRole");
526 const auto colorRoles = group->elementColorRole();
527 for (
const DomColorRole *colorRole : colorRoles) {
528 if (colorRole->hasAttributeRole()) {
529 const auto &roleName = colorRole->attributeRole().toLatin1();
530 const int r = colorRole_enum.keyToValue(roleName.constData());
532 const QBrush br = setupBrush(colorRole->elementBrush());
533 palette->setBrush(colorGroup,
static_cast<QPalette::ColorRole>(r), br);
539DomColorGroup *QFormBuilderExtra::saveColorGroup(
const QPalette &palette,
540 QPalette::ColorGroup colorGroup)
543 const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>(
"colorRole");
545 auto *group =
new DomColorGroup();
546 QList<DomColorRole *> colorRoles;
548 for (
int r = QPalette::WindowText; r < QPalette::NColorRoles; ++r) {
549 const auto role =
static_cast<QPalette::ColorRole>(r);
550 if (palette.isBrushSet(colorGroup, role)) {
551 const QBrush &br = palette.brush(colorGroup, role);
552 auto *colorRole =
new DomColorRole();
553 colorRole->setElementBrush(saveBrush(br));
554 colorRole->setAttributeRole(QLatin1StringView(colorRole_enum.valueToKey(role)));
555 colorRoles.append(colorRole);
559 group->setElementColorRole(colorRoles);
573QPalette QFormBuilderExtra::loadPalette(
const DomPalette *dom)
577 if (dom->elementActive())
578 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Active, dom->elementActive());
580 if (dom->elementInactive())
581 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Inactive, dom->elementInactive());
583 if (dom->elementDisabled())
584 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Disabled, dom->elementDisabled());
586 palette.setCurrentColorGroup(QPalette::Active);
590QBrush QFormBuilderExtra::setupBrush(
const DomBrush *brush)
593 if (!brush->hasAttributeBrushStyle())
596 const Qt::BrushStyle style = enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::BrushStyle>(
"brushStyle",
597 brush->attributeBrushStyle().toLatin1().constData());
599 if (style == Qt::LinearGradientPattern ||
600 style == Qt::RadialGradientPattern ||
601 style == Qt::ConicalGradientPattern) {
602 const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientType");
603 const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientSpread");
604 const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientCoordinate");
606 const DomGradient *gradient = brush->elementGradient();
607 const auto type = enumKeyToValue<QGradient::Type>(
608 gradientType_enum, gradient->attributeType().toLatin1().constData());
610 QGradient *gr =
nullptr;
612 if (type == QGradient::LinearGradient) {
613 gr =
new QLinearGradient(QPointF(gradient->attributeStartX(), gradient->attributeStartY()),
614 QPointF(gradient->attributeEndX(), gradient->attributeEndY()));
615 }
else if (type == QGradient::RadialGradient) {
616 gr =
new QRadialGradient(QPointF(gradient->attributeCentralX(), gradient->attributeCentralY()),
617 gradient->attributeRadius(),
618 QPointF(gradient->attributeFocalX(), gradient->attributeFocalY()));
619 }
else if (type == QGradient::ConicalGradient) {
620 gr =
new QConicalGradient(QPointF(gradient->attributeCentralX(), gradient->attributeCentralY()),
621 gradient->attributeAngle());
626 const auto spread = enumKeyToValue<QGradient::Spread>(
627 gradientSpread_enum, gradient->attributeSpread().toLatin1().constData());
628 gr->setSpread(spread);
630 const auto coord = enumKeyToValue<QGradient::CoordinateMode>(
631 gradientCoordinate_enum,
632 gradient->attributeCoordinateMode().toLatin1().constData());
633 gr->setCoordinateMode(coord);
635 const auto &stops = gradient->elementGradientStop();
636 for (
const DomGradientStop *stop : stops) {
637 const DomColor *color = stop->elementColor();
638 gr->setColorAt(stop->attributePosition(), QColor::fromRgb(color->elementRed(),
639 color->elementGreen(), color->elementBlue(), color->attributeAlpha()));
643 }
else if (style == Qt::TexturePattern) {
644 const DomProperty *texture = brush->elementTexture();
645 if (texture && texture->kind() == DomProperty::Pixmap) {
649 const DomColor *color = brush->elementColor();
650 br.setColor(QColor::fromRgb(color->elementRed(),
651 color->elementGreen(), color->elementBlue(), color->attributeAlpha()));
652 br.setStyle((Qt::BrushStyle)style);
657DomBrush *QFormBuilderExtra::saveBrush(
const QBrush &br)
659 const QMetaEnum brushStyle_enum = metaEnum<QAbstractFormBuilderGadget>(
"brushStyle");
661 auto *brush =
new DomBrush();
662 const Qt::BrushStyle style = br.style();
663 brush->setAttributeBrushStyle(QLatin1StringView(brushStyle_enum.valueToKey(style)));
664 if (style == Qt::LinearGradientPattern ||
665 style == Qt::RadialGradientPattern ||
666 style == Qt::ConicalGradientPattern) {
667 const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientType");
668 const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientSpread");
669 const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientCoordinate");
671 auto *gradient =
new DomGradient();
672 const QGradient *gr = br.gradient();
673 const QGradient::Type type = gr->type();
674 gradient->setAttributeType(QLatin1StringView(gradientType_enum.valueToKey(type)));
675 gradient->setAttributeSpread(QLatin1StringView(gradientSpread_enum.valueToKey(gr->spread())));
676 gradient->setAttributeCoordinateMode(QLatin1StringView(gradientCoordinate_enum.valueToKey(gr->coordinateMode())));
677 QList<DomGradientStop *> stops;
678 const QGradientStops st = gr->stops();
679 for (
const QGradientStop &pair : st) {
680 auto *stop =
new DomGradientStop();
681 stop->setAttributePosition(pair.first);
682 auto *color =
new DomColor();
683 color->setElementRed(pair.second.red());
684 color->setElementGreen(pair.second.green());
685 color->setElementBlue(pair.second.blue());
686 color->setAttributeAlpha(pair.second.alpha());
687 stop->setElementColor(color);
690 gradient->setElementGradientStop(stops);
691 if (type == QGradient::LinearGradient) {
692 const auto *lgr =
static_cast<
const QLinearGradient *>(gr);
693 gradient->setAttributeStartX(lgr->start().x());
694 gradient->setAttributeStartY(lgr->start().y());
695 gradient->setAttributeEndX(lgr->finalStop().x());
696 gradient->setAttributeEndY(lgr->finalStop().y());
697 }
else if (type == QGradient::RadialGradient) {
698 const auto *rgr =
static_cast<
const QRadialGradient *>(gr);
699 gradient->setAttributeCentralX(rgr->center().x());
700 gradient->setAttributeCentralY(rgr->center().y());
701 gradient->setAttributeFocalX(rgr->focalPoint().x());
702 gradient->setAttributeFocalY(rgr->focalPoint().y());
703 gradient->setAttributeRadius(rgr->radius());
704 }
else if (type == QGradient::ConicalGradient) {
705 const auto *cgr =
static_cast<
const QConicalGradient *>(gr);
706 gradient->setAttributeCentralX(cgr->center().x());
707 gradient->setAttributeCentralY(cgr->center().y());
708 gradient->setAttributeAngle(cgr->angle());
711 brush->setElementGradient(gradient);
712 }
else if (style == Qt::TexturePattern) {
713 const QPixmap pixmap = br.texture();
714 if (!pixmap.isNull()) {
715 auto *p =
new DomProperty;
716 QFormBuilderExtra::setPixmapProperty(p, {});
717 brush->setElementTexture(p);
720 const QColor &c = br.color();
721 auto *color =
new DomColor();
722 color->setElementRed(c.red());
723 color->setElementGreen(c.green());
724 color->setElementBlue(c.blue());
725 color->setAttributeAlpha(c.alpha());
726 brush->setElementColor(color);
742QFormBuilderStrings::QFormBuilderStrings() :
744 {Qt::FontRole,
"font"_L1},
745 {Qt::TextAlignmentRole,
"textAlignment"_L1},
746 {Qt::BackgroundRole,
"background"_L1},
747 {Qt::ForegroundRole,
"foreground"_L1},
748 {Qt::CheckStateRole,
"checkState"_L1}
751 { {Qt::EditRole, Qt::DisplayPropertyRole}, textAttribute},
752 { {Qt::ToolTipRole, Qt::ToolTipPropertyRole}, toolTipAttribute},
753 { {Qt::StatusTipRole, Qt::StatusTipPropertyRole},
"statusTip"_L1},
754 { {Qt::WhatsThisRole, Qt::WhatsThisPropertyRole}, whatsThisAttribute}
757 for (
const RoleNName &it : std::as_const(itemRoles))
758 treeItemRoleHash.insert(it.second, it.first);
761 auto it = itemTextRoles.constBegin();
762 const auto end = itemTextRoles.constEnd();
764 treeItemTextRoleHash.insert(it->second, it->first);