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.");
334inline bool parsePerCellProperty(Layout *l,
int count,
void (Layout::*setter)(
int,
int),
const QString &s,
int defaultValue = 0)
337 clearPerCellValue(l, count, setter, defaultValue);
340 const auto list = QStringView{s}.split(u',');
341 if (list.isEmpty()) {
342 clearPerCellValue(l, count, setter, defaultValue);
346 const int ac = qMin(count, list.size());
349 for ( ; i < ac; i++) {
350 const int value = list.at(i).toInt(&ok);
351 if (!ok || value < 0)
353 (l->*setter)(i, value);
356 for ( ; i < count; i++)
357 (l->*setter)(i, defaultValue);
368void QFormBuilderExtra::getLayoutMargins(
const QList<DomProperty*> &properties,
369 int *left,
int *top,
int *right,
int *bottom)
371 if (
const auto *p = propertyByName(properties,
"leftMargin"))
372 *left = p->elementNumber();
373 if (
const auto *p = propertyByName(properties,
"topMargin"))
374 *top = p->elementNumber();
375 if (
const auto *p = propertyByName(properties,
"rightMargin"))
376 *right = p->elementNumber();
377 if (
const auto *p = propertyByName(properties,
"bottomMargin"))
378 *bottom = p->elementNumber();
501void QFormBuilderExtra::setupColorGroup(QPalette *palette, QPalette::ColorGroup colorGroup,
502 const DomColorGroup *group)
505 const auto &colors = group->elementColor();
506 for (
int role = 0; role < colors.size(); ++role) {
507 const DomColor *color = colors.at(role);
508 const QColor c(color->elementRed(), color->elementGreen(), color->elementBlue());
509 palette->setColor(colorGroup, QPalette::ColorRole(role), c);
513 const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>(
"colorRole");
515 const auto colorRoles = group->elementColorRole();
516 for (
const DomColorRole *colorRole : colorRoles) {
517 if (colorRole->hasAttributeRole()) {
518 const int r = colorRole_enum.keyToValue(colorRole->attributeRole().toLatin1());
520 const QBrush br = setupBrush(colorRole->elementBrush());
521 palette->setBrush(colorGroup,
static_cast<QPalette::ColorRole>(r), br);
527DomColorGroup *QFormBuilderExtra::saveColorGroup(
const QPalette &palette,
528 QPalette::ColorGroup colorGroup)
531 const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>(
"colorRole");
533 DomColorGroup *group =
new DomColorGroup();
534 QList<DomColorRole *> colorRoles;
536 for (
int r = QPalette::WindowText; r < QPalette::NColorRoles; ++r) {
537 const auto role =
static_cast<QPalette::ColorRole>(r);
538 if (palette.isBrushSet(colorGroup, role)) {
539 const QBrush &br = palette.brush(colorGroup, role);
540 DomColorRole *colorRole =
new DomColorRole();
541 colorRole->setElementBrush(saveBrush(br));
542 colorRole->setAttributeRole(QLatin1StringView(colorRole_enum.valueToKey(role)));
543 colorRoles.append(colorRole);
547 group->setElementColorRole(colorRoles);
561QPalette QFormBuilderExtra::loadPalette(
const DomPalette *dom)
565 if (dom->elementActive())
566 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Active, dom->elementActive());
568 if (dom->elementInactive())
569 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Inactive, dom->elementInactive());
571 if (dom->elementDisabled())
572 QFormBuilderExtra::setupColorGroup(&palette, QPalette::Disabled, dom->elementDisabled());
574 palette.setCurrentColorGroup(QPalette::Active);
578QBrush QFormBuilderExtra::setupBrush(
const DomBrush *brush)
581 if (!brush->hasAttributeBrushStyle())
584 const Qt::BrushStyle style = enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::BrushStyle>(
"brushStyle",
585 brush->attributeBrushStyle().toLatin1().constData());
587 if (style == Qt::LinearGradientPattern ||
588 style == Qt::RadialGradientPattern ||
589 style == Qt::ConicalGradientPattern) {
590 const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientType");
591 const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientSpread");
592 const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientCoordinate");
594 const DomGradient *gradient = brush->elementGradient();
595 const QGradient::Type type = enumKeyToValue<QGradient::Type>(gradientType_enum, gradient->attributeType().toLatin1());
598 QGradient *gr =
nullptr;
600 if (type == QGradient::LinearGradient) {
601 gr =
new QLinearGradient(QPointF(gradient->attributeStartX(), gradient->attributeStartY()),
602 QPointF(gradient->attributeEndX(), gradient->attributeEndY()));
603 }
else if (type == QGradient::RadialGradient) {
604 gr =
new QRadialGradient(QPointF(gradient->attributeCentralX(), gradient->attributeCentralY()),
605 gradient->attributeRadius(),
606 QPointF(gradient->attributeFocalX(), gradient->attributeFocalY()));
607 }
else if (type == QGradient::ConicalGradient) {
608 gr =
new QConicalGradient(QPointF(gradient->attributeCentralX(), gradient->attributeCentralY()),
609 gradient->attributeAngle());
614 const QGradient::Spread spread = enumKeyToValue<QGradient::Spread>(gradientSpread_enum, gradient->attributeSpread().toLatin1());
615 gr->setSpread(spread);
617 const QGradient::CoordinateMode coord = enumKeyToValue<QGradient::CoordinateMode>(gradientCoordinate_enum, gradient->attributeCoordinateMode().toLatin1());
618 gr->setCoordinateMode(coord);
620 const auto &stops = gradient->elementGradientStop();
621 for (
const DomGradientStop *stop : stops) {
622 const DomColor *color = stop->elementColor();
623 gr->setColorAt(stop->attributePosition(), QColor::fromRgb(color->elementRed(),
624 color->elementGreen(), color->elementBlue(), color->attributeAlpha()));
628 }
else if (style == Qt::TexturePattern) {
629 const DomProperty *texture = brush->elementTexture();
630 if (texture && texture->kind() == DomProperty::Pixmap) {
634 const DomColor *color = brush->elementColor();
635 br.setColor(QColor::fromRgb(color->elementRed(),
636 color->elementGreen(), color->elementBlue(), color->attributeAlpha()));
637 br.setStyle((Qt::BrushStyle)style);
642DomBrush *QFormBuilderExtra::saveBrush(
const QBrush &br)
644 const QMetaEnum brushStyle_enum = metaEnum<QAbstractFormBuilderGadget>(
"brushStyle");
646 DomBrush *brush =
new DomBrush();
647 const Qt::BrushStyle style = br.style();
648 brush->setAttributeBrushStyle(QLatin1StringView(brushStyle_enum.valueToKey(style)));
649 if (style == Qt::LinearGradientPattern ||
650 style == Qt::RadialGradientPattern ||
651 style == Qt::ConicalGradientPattern) {
652 const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientType");
653 const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientSpread");
654 const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>(
"gradientCoordinate");
656 DomGradient *gradient =
new DomGradient();
657 const QGradient *gr = br.gradient();
658 const QGradient::Type type = gr->type();
659 gradient->setAttributeType(QLatin1StringView(gradientType_enum.valueToKey(type)));
660 gradient->setAttributeSpread(QLatin1StringView(gradientSpread_enum.valueToKey(gr->spread())));
661 gradient->setAttributeCoordinateMode(QLatin1StringView(gradientCoordinate_enum.valueToKey(gr->coordinateMode())));
662 QList<DomGradientStop *> stops;
663 const QGradientStops st = gr->stops();
664 for (
const QGradientStop &pair : st) {
665 DomGradientStop *stop =
new DomGradientStop();
666 stop->setAttributePosition(pair.first);
667 DomColor *color =
new DomColor();
668 color->setElementRed(pair.second.red());
669 color->setElementGreen(pair.second.green());
670 color->setElementBlue(pair.second.blue());
671 color->setAttributeAlpha(pair.second.alpha());
672 stop->setElementColor(color);
675 gradient->setElementGradientStop(stops);
676 if (type == QGradient::LinearGradient) {
677 auto lgr =
static_cast<
const QLinearGradient *>(gr);
678 gradient->setAttributeStartX(lgr->start().x());
679 gradient->setAttributeStartY(lgr->start().y());
680 gradient->setAttributeEndX(lgr->finalStop().x());
681 gradient->setAttributeEndY(lgr->finalStop().y());
682 }
else if (type == QGradient::RadialGradient) {
683 auto rgr =
static_cast<
const QRadialGradient *>(gr);
684 gradient->setAttributeCentralX(rgr->center().x());
685 gradient->setAttributeCentralY(rgr->center().y());
686 gradient->setAttributeFocalX(rgr->focalPoint().x());
687 gradient->setAttributeFocalY(rgr->focalPoint().y());
688 gradient->setAttributeRadius(rgr->radius());
689 }
else if (type == QGradient::ConicalGradient) {
690 auto cgr =
static_cast<
const QConicalGradient *>(gr);
691 gradient->setAttributeCentralX(cgr->center().x());
692 gradient->setAttributeCentralY(cgr->center().y());
693 gradient->setAttributeAngle(cgr->angle());
696 brush->setElementGradient(gradient);
697 }
else if (style == Qt::TexturePattern) {
698 const QPixmap pixmap = br.texture();
699 if (!pixmap.isNull()) {
700 DomProperty *p =
new DomProperty;
701 QFormBuilderExtra::setPixmapProperty(p, {});
702 brush->setElementTexture(p);
705 const QColor &c = br.color();
706 DomColor *color =
new DomColor();
707 color->setElementRed(c.red());
708 color->setElementGreen(c.green());
709 color->setElementBlue(c.blue());
710 color->setAttributeAlpha(c.alpha());
711 brush->setElementColor(color);
727QFormBuilderStrings::QFormBuilderStrings() :
729 {Qt::FontRole,
"font"_L1},
730 {Qt::TextAlignmentRole,
"textAlignment"_L1},
731 {Qt::BackgroundRole,
"background"_L1},
732 {Qt::ForegroundRole,
"foreground"_L1},
733 {Qt::CheckStateRole,
"checkState"_L1}
736 { {Qt::EditRole, Qt::DisplayPropertyRole}, textAttribute},
737 { {Qt::ToolTipRole, Qt::ToolTipPropertyRole}, toolTipAttribute},
738 { {Qt::StatusTipRole, Qt::StatusTipPropertyRole},
"statusTip"_L1},
739 { {Qt::WhatsThisRole, Qt::WhatsThisPropertyRole}, whatsThisAttribute}
742 for (
const RoleNName &it : std::as_const(itemRoles))
743 treeItemRoleHash.insert(it.second, it.first);
746 auto it = itemTextRoles.constBegin();
747 const auto end = itemTextRoles.constEnd();
749 treeItemTextRoleHash.insert(it->second, it->first);