15#include <qtextstream.h>
16#include <qversionnumber.h>
23using namespace Qt::StringLiterals;
28 QString expandEnum(QString value,
const QString &prefix)
30 if (value.startsWith(prefix))
32 const auto pos = value.lastIndexOf(
"::"_L1);
34 return prefix +
"::"_L1 + value;
35 value.replace(0, pos, prefix);
39 inline QString expandSizePolicyEnum(
const QString &value)
41 return expandEnum(value,
"QSizePolicy::Policy"_L1);
44 inline QString expandToolBarArea(
const QString &value)
46 return expandEnum(value,
"Qt::ToolBarArea"_L1);
49 inline QString expandDockWidgetArea(
const QString &value)
51 return expandEnum(value,
"Qt::DockWidgetArea"_L1);
57 const DomProperty *pstyle = attributes.value(
"toolBarArea"_L1);
61 switch (pstyle->kind()) {
62 case DomProperty::Number:
63 result = language::toolbarArea(pstyle->elementNumber());
65 case DomProperty::Enum:
66 result = pstyle->elementEnum();
71 return expandToolBarArea(result) +
", "_L1;
75 void writeSpacerItem(
const DomSpacer *node, QTextStream &output) {
76 const QHash<QString, DomProperty *> properties = propertyMap(node->elementProperty());
81 if (
const DomProperty *sh = properties.value(
"sizeHint"_L1)) {
82 if (
const DomSize *sizeHint = sh->elementSize()) {
83 w = sizeHint->elementWidth();
84 h = sizeHint->elementHeight();
87 output << w <<
", " << h <<
", ";
90 const DomProperty *st = properties.value(
"sizeType"_L1);
91 QString horizType = st !=
nullptr ? st->elementEnum() :
"Expanding"_L1;
92 QString vertType =
"Minimum"_L1;
95 const DomProperty *o = properties.value(
"orientation"_L1);
96 if (o !=
nullptr && o->elementEnum().endsWith(
"Vertical"_L1))
97 std::swap(horizType, vertType);
105 int compareInt(
int i1,
int i2) {
106 if (i1 < i2)
return -1;
107 if (i1 > i2)
return 1;
112 template <
class Value>
113 void writeSetter(
const QString &indent,
const QString &varName,
const QString &setter, Value v, QTextStream &str) {
118 static inline bool iconHasStatePixmaps(
const DomResourceIcon *i) {
119 return i->hasElementNormalOff() || i->hasElementNormalOn() ||
120 i->hasElementDisabledOff() || i->hasElementDisabledOn() ||
121 i->hasElementActiveOff() || i->hasElementActiveOn() ||
122 i->hasElementSelectedOff() || i->hasElementSelectedOn();
125 static inline bool isIconFormat44(
const DomResourceIcon *i) {
126 return iconHasStatePixmaps(i) || !i->attributeTheme().isEmpty();
133 const QString &fileName,
const QString &className,
134 const DomProperty *p) {
136 const QString &name = p->attributeName();
140 case DomProperty::Set:
141 if (name == u"features"
142 && customWidgetsInfo->extends(className,
"QDockWidget")
143 && p->elementSet() == u"QDockWidget::AllDockWidgetFeatures") {
144 const QString msg = fileName +
": Warning: Deprecated enum value QDockWidget::AllDockWidgetFeatures was encountered."_L1;
149 case DomProperty::Enum:
150 if (name == u"sizeAdjustPolicy"
151 && customWidgetsInfo->extends(className,
"QComboBox")
152 && p->elementEnum() == u"QComboBox::AdjustToMinimumContentsLength") {
153 const QString msg = fileName +
": Warning: Deprecated enum value QComboBox::AdjustToMinimumContentsLength was encountered."_L1;
158 if (name ==
"verticalSizeConstraint"_L1 && className.contains(
"Layout"_L1))
161 case DomProperty::IconSet:
162 if (
const DomResourceIcon *dri = p->elementIconSet()) {
163 if (!isIconFormat44(dri)) {
164 if (dri->text().isEmpty()) {
165 const QString msg =
"%1: Warning: An invalid icon property '%2' was encountered."_L1
166 .arg(fileName, name);
173 case DomProperty::Pixmap:
174 if (
const DomResourcePixmap *drp = p->elementPixmap())
175 if (drp->text().isEmpty()) {
176 const QString msg =
"%1: Warning: An invalid pixmap property '%2' was encountered."_L1
177 .arg(fileName, name);
206 if (domFont->hasElementFontWeight())
207 return domFont->elementFontWeight();
208 if (domFont->hasElementBold())
209 return domFont->elementBold() ? u"Bold"_s : u"Normal"_s;
215 const QString family = m_domFont->hasElementFamily() ? m_domFont->elementFamily() : QString();
216 const QString rhsFamily = rhs.m_domFont->hasElementFamily() ? rhs.m_domFont->elementFamily() : QString();
218 if (
const int frc = family.compare(rhsFamily))
221 const int pointSize = m_domFont->hasElementPointSize() ? m_domFont->elementPointSize() : -1;
222 const int rhsPointSize = rhs.m_domFont->hasElementPointSize() ? rhs.m_domFont->elementPointSize() : -1;
224 if (
const int crc = compareInt(pointSize, rhsPointSize))
227 const QString fontWeight = CPP::fontWeight(m_domFont);
228 const QString rhsFontWeight = CPP::fontWeight(rhs.m_domFont);
229 if (
const int wrc = fontWeight.compare(rhsFontWeight))
232 const int italic = m_domFont->hasElementItalic() ? (m_domFont->elementItalic() ? 1 : 0) : -1;
233 const int rhsItalic = rhs.m_domFont->hasElementItalic() ? (rhs.m_domFont->elementItalic() ? 1 : 0) : -1;
234 if (
const int crc = compareInt(italic, rhsItalic))
237 const int underline = m_domFont->hasElementUnderline() ? (m_domFont->elementUnderline() ? 1 : 0) : -1;
238 const int rhsUnderline = rhs.m_domFont->hasElementUnderline() ? (rhs.m_domFont->elementUnderline() ? 1 : 0) : -1;
239 if (
const int crc = compareInt(underline, rhsUnderline))
242 const int strikeOut = m_domFont->hasElementStrikeOut() ? (m_domFont->elementStrikeOut() ? 1 : 0) : -1;
243 const int rhsStrikeOut = rhs.m_domFont->hasElementStrikeOut() ? (rhs.m_domFont->elementStrikeOut() ? 1 : 0) : -1;
244 if (
const int crc = compareInt(strikeOut, rhsStrikeOut))
247 const int kerning = m_domFont->hasElementKerning() ? (m_domFont->elementKerning() ? 1 : 0) : -1;
248 const int rhsKerning = rhs.m_domFont->hasElementKerning() ? (rhs.m_domFont->elementKerning() ? 1 : 0) : -1;
249 if (
const int crc = compareInt(kerning, rhsKerning))
252 const int antialiasing = m_domFont->hasElementAntialiasing() ? (m_domFont->elementAntialiasing() ? 1 : 0) : -1;
253 const int rhsAntialiasing = rhs.m_domFont->hasElementAntialiasing() ? (rhs.m_domFont->elementAntialiasing() ? 1 : 0) : -1;
254 if (
const int crc = compareInt(antialiasing, rhsAntialiasing))
257 const QString styleStrategy = m_domFont->hasElementStyleStrategy() ? m_domFont->elementStyleStrategy() : QString();
258 const QString rhsStyleStrategy = rhs.m_domFont->hasElementStyleStrategy() ? rhs.m_domFont->elementStyleStrategy() : QString();
260 if (
const int src = styleStrategy.compare(rhsStyleStrategy))
263 const QString hintingPreference = m_domFont->hasElementHintingPreference()
264 ? m_domFont->elementHintingPreference() : QString();
265 const QString rhsHintingPreference = rhs.m_domFont->hasElementHintingPreference()
266 ? rhs.m_domFont->elementHintingPreference() : QString();
267 if (
const int src = hintingPreference.compare(rhsHintingPreference))
280 if (
const int comp = m_domIcon->attributeTheme().compare(rhs.m_domIcon->attributeTheme()))
283 const QString normalOff = m_domIcon->hasElementNormalOff() ? m_domIcon->elementNormalOff()->text() : QString();
284 const QString rhsNormalOff = rhs.m_domIcon->hasElementNormalOff() ? rhs.m_domIcon->elementNormalOff()->text() : QString();
285 if (
const int comp = normalOff.compare(rhsNormalOff))
288 const QString normalOn = m_domIcon->hasElementNormalOn() ? m_domIcon->elementNormalOn()->text() : QString();
289 const QString rhsNormalOn = rhs.m_domIcon->hasElementNormalOn() ? rhs.m_domIcon->elementNormalOn()->text() : QString();
290 if (
const int comp = normalOn.compare(rhsNormalOn))
293 const QString disabledOff = m_domIcon->hasElementDisabledOff() ? m_domIcon->elementDisabledOff()->text() : QString();
294 const QString rhsDisabledOff = rhs.m_domIcon->hasElementDisabledOff() ? rhs.m_domIcon->elementDisabledOff()->text() : QString();
295 if (
const int comp = disabledOff.compare(rhsDisabledOff))
298 const QString disabledOn = m_domIcon->hasElementDisabledOn() ? m_domIcon->elementDisabledOn()->text() : QString();
299 const QString rhsDisabledOn = rhs.m_domIcon->hasElementDisabledOn() ? rhs.m_domIcon->elementDisabledOn()->text() : QString();
300 if (
const int comp = disabledOn.compare(rhsDisabledOn))
303 const QString activeOff = m_domIcon->hasElementActiveOff() ? m_domIcon->elementActiveOff()->text() : QString();
304 const QString rhsActiveOff = rhs.m_domIcon->hasElementActiveOff() ? rhs.m_domIcon->elementActiveOff()->text() : QString();
305 if (
const int comp = activeOff.compare(rhsActiveOff))
308 const QString activeOn = m_domIcon->hasElementActiveOn() ? m_domIcon->elementActiveOn()->text() : QString();
309 const QString rhsActiveOn = rhs.m_domIcon->hasElementActiveOn() ? rhs.m_domIcon->elementActiveOn()->text() : QString();
310 if (
const int comp = activeOn.compare(rhsActiveOn))
313 const QString selectedOff = m_domIcon->hasElementSelectedOff() ? m_domIcon->elementSelectedOff()->text() : QString();
314 const QString rhsSelectedOff = rhs.m_domIcon->hasElementSelectedOff() ? rhs.m_domIcon->elementSelectedOff()->text() : QString();
315 if (
const int comp = selectedOff.compare(rhsSelectedOff))
318 const QString selectedOn = m_domIcon->hasElementSelectedOn() ? m_domIcon->elementSelectedOn()->text() : QString();
319 const QString rhsSelectedOn = rhs.m_domIcon->hasElementSelectedOn() ? rhs.m_domIcon->elementSelectedOn()->text() : QString();
320 if (
const int comp = selectedOn.compare(rhsSelectedOn))
323 if (
const int comp = m_domIcon->text().compare(rhs.m_domIcon->text()))
330 m_domSizePolicy(domSizePolicy)
337 const int hSizeType = m_domSizePolicy->hasElementHSizeType() ? m_domSizePolicy->elementHSizeType() : -1;
338 const int rhsHSizeType = rhs.m_domSizePolicy->hasElementHSizeType() ? rhs.m_domSizePolicy->elementHSizeType() : -1;
339 if (
const int crc = compareInt(hSizeType, rhsHSizeType))
342 const int vSizeType = m_domSizePolicy->hasElementVSizeType() ? m_domSizePolicy->elementVSizeType() : -1;
343 const int rhsVSizeType = rhs.m_domSizePolicy->hasElementVSizeType() ? rhs.m_domSizePolicy->elementVSizeType() : -1;
344 if (
const int crc = compareInt(vSizeType, rhsVSizeType))
347 const int hStretch = m_domSizePolicy->hasElementHorStretch() ? m_domSizePolicy->elementHorStretch() : -1;
348 const int rhsHStretch = rhs.m_domSizePolicy->hasElementHorStretch() ? rhs.m_domSizePolicy->elementHorStretch() : -1;
349 if (
const int crc = compareInt(hStretch, rhsHStretch))
352 const int vStretch = m_domSizePolicy->hasElementVerStretch() ? m_domSizePolicy->elementVerStretch() : -1;
353 const int rhsVStretch = rhs.m_domSizePolicy->hasElementVerStretch() ? rhs.m_domSizePolicy->elementVerStretch() : -1;
354 if (
const int crc = compareInt(vStretch, rhsVStretch))
357 const QString attributeHSizeType = m_domSizePolicy->hasAttributeHSizeType() ? m_domSizePolicy->attributeHSizeType() : QString();
358 const QString rhsAttributeHSizeType = rhs.m_domSizePolicy->hasAttributeHSizeType() ? rhs.m_domSizePolicy->attributeHSizeType() : QString();
360 if (
const int hrc = attributeHSizeType.compare(rhsAttributeHSizeType))
363 const QString attributeVSizeType = m_domSizePolicy->hasAttributeVSizeType() ? m_domSizePolicy->attributeVSizeType() : QString();
364 const QString rhsAttributeVSizeType = rhs.m_domSizePolicy->hasAttributeVSizeType() ? rhs.m_domSizePolicy->attributeVSizeType() : QString();
366 return attributeVSizeType.compare(rhsAttributeVSizeType);
373 std::fill_n(m_state,
int(NumProperties), 0U);
374 std::fill_n(m_defaultValues,
int(NumProperties), 0);
383 if (node->hasAttributeMargin()) {
384 m_state[Margin] |= HasDefaultValue;
385 m_defaultValues[Margin] = node->attributeMargin();
387 if (node->hasAttributeSpacing()) {
388 m_state[Spacing] |= HasDefaultValue;
389 m_defaultValues[Spacing] = node->attributeSpacing();
393void WriteInitialization::LayoutDefaultHandler::acceptLayoutFunction(DomLayoutFunction *node)
397 if (node->hasAttributeMargin()) {
398 m_state[Margin] |= HasDefaultFunction;
399 m_functions[Margin] = node->attributeMargin();
400 m_functions[Margin] +=
"()"_L1;
402 if (node->hasAttributeSpacing()) {
403 m_state[Spacing] |= HasDefaultFunction;
404 m_functions[Spacing] = node->attributeSpacing();
405 m_functions[Spacing] +=
"()"_L1;
409static inline void writeContentsMargins(
const QString &indent,
const QString &objectName,
int value, QTextStream &str)
411 QString contentsMargins;
412 QTextStream(&contentsMargins) << value <<
", " << value <<
", " << value <<
", " << value;
413 writeSetter(indent, objectName,
"setContentsMargins"_L1, contentsMargins, str);
416void WriteInitialization::LayoutDefaultHandler::writeProperty(
int p,
const QString &indent,
const QString &objectName,
417 const DomPropertyMap &properties,
const QString &propertyName,
const QString &setter,
418 int defaultStyleValue,
bool suppressDefault, QTextStream &str)
const
421 if (
const DomProperty *prop = properties.value(propertyName)) {
422 const int value = prop->elementNumber();
425 const bool useLayoutFunctionPre43 = !suppressDefault && (m_state[p] == (HasDefaultFunction|HasDefaultValue)) && value == m_defaultValues[p];
426 if (!useLayoutFunctionPre43) {
427 bool ifndefMac = (!(m_state[p] & (HasDefaultFunction|HasDefaultValue))
428 && value == defaultStyleValue);
430 str <<
"#ifndef Q_OS_MACOS\n";
434 writeSetter(indent, objectName, setter, value, str);
444 if (m_state[p] & HasDefaultFunction) {
446 writeSetter(indent, objectName, setter, m_functions[p], str);
449 if (m_state[p] & HasDefaultValue) {
453 writeSetter(indent, objectName, setter, m_defaultValues[p], str);
459void WriteInitialization::LayoutDefaultHandler::writeProperties(
const QString &indent,
const QString &varName,
461 bool suppressMarginDefault,
462 QTextStream &str)
const {
466 writeProperty(Spacing, indent, varName, properties,
"spacing"_L1,
"setSpacing"_L1,
467 defaultSpacing,
false, str);
469 static const int layoutmargins[4] = {-1, 9, 9, 0};
470 writeProperty(Margin, indent, varName, properties,
"margin"_L1,
"setMargin"_L1,
471 layoutmargins[marginType], suppressMarginDefault, str);
474template <
class DomElement>
479 return !element->hasAttributeNotr() || !toBool(element->attributeNotr());
496 m_actionGroupChain.push(
nullptr);
497 m_widgetChain.push(
nullptr);
498 m_layoutChain.push(
nullptr);
500 if (node->hasAttributeConnectslotsbyname())
501 m_connectSlotsByName = node->attributeConnectslotsbyname();
503 if (
auto *customSlots = node->elementSlots()) {
504 m_customSlots = customSlots->elementSlot();
505 m_customSignals = customSlots->elementSignal();
511 if (node->elementCustomWidgets())
514 if (m_option.generateImplemetation)
515 m_output <<
"#include <" << m_driver->headerFileName() <<
">\n\n";
518 if (node->hasAttributeStdSetDef())
519 m_stdsetdef = node->attributeStdSetDef();
521 const QString className = node->elementClass() + m_option.postfix;
522 m_generatedClass = className;
524 const QString varName = m_driver->findOrInsertWidget(node->elementWidget());
525 m_mainFormVarName = varName;
527 const QString widgetClassName = node->elementWidget()->attributeClass();
529 const QString parameterType = widgetClassName +
" *"_L1;
530 m_output << m_option.indent
531 << language::startFunctionDefinition1(
"setupUi", parameterType, varName, m_option.indent);
534 for (
const auto &connection : connections) {
535 if (connection ==
"(default)"_L1)
538 const QString varConn = connection +
"Connection"_L1;
539 m_output << m_indent << varConn <<
" = QSqlDatabase::database("
540 << language::charliteral(connection, m_dindent) <<
")" << language::eol;
545 if (!m_buddies.empty())
546 m_output << language::openQtConfig(shortcutConfigKey());
547 for (
const Buddy &b : std::as_const(m_buddies)) {
548 const QString buddyVarName = m_driver->widgetVariableName(b.buddyAttributeName);
549 if (buddyVarName.isEmpty()) {
550 fprintf(stderr,
"%s: Warning: Buddy assignment: '%s' is not a valid widget.\n",
556 m_output << m_indent << b.labelVarName << language::derefPointer
557 <<
"setBuddy(" << buddyVarName <<
')' << language::eol;
559 if (!m_buddies.empty())
560 m_output << language::closeQtConfig(shortcutConfigKey());
562 if (node->elementTabStops())
565 if (!m_delayedActionInitialization.isEmpty())
566 m_output <<
"\n" << m_delayedActionInitialization;
568 m_output <<
"\n" << m_indent << language::self
569 <<
"retranslateUi(" << varName <<
')' << language::eol;
571 if (node->elementConnections())
574 if (!m_delayedInitialization.isEmpty())
575 m_output <<
"\n" << m_delayedInitialization <<
"\n";
578 m_output <<
"\n" << m_indent <<
"QMetaObject" << language::qualifier
579 <<
"connectSlotsByName(" << varName <<
')' << language::eol;
582 m_output << m_option.indent << language::endFunctionDefinition(
"setupUi");
584 if (!m_mainFormUsedInRetranslateUi) {
587 m_refreshInitialization += m_indent;
588 m_refreshInitialization +=
"(void)"_L1;
589 m_refreshInitialization += varName ;
590 m_refreshInitialization += language::eol;
593 m_refreshInitialization += m_indent;
594 m_refreshInitialization +=
"pass"_L1;
595 m_refreshInitialization += language::eol;
599 m_output << m_option.indent
600 << language::startFunctionDefinition1(
"retranslateUi", parameterType, varName, m_option.indent)
601 << m_refreshInitialization
602 << m_option.indent << language::endFunctionDefinition(
"retranslateUi");
606 m_actionGroupChain.pop();
609void WriteInitialization::addWizardPage(
const QString &pageVarName,
const DomWidget *page,
const QString &parentWidget)
612
614 const auto &attributes = page->elementAttribute();
615 if (!attributes.empty()) {
616 for (
const DomProperty *p : attributes) {
617 if (p->attributeName() ==
"pageId"_L1) {
618 if (
const DomString *ds = p->elementString())
625 m_output << m_indent << parentWidget << language::derefPointer
626 <<
"addPage(" << pageVarName <<
')' << language::eol;
628 m_output << m_indent << parentWidget << language::derefPointer
629 <<
"setPage(" << id <<
", " << pageVarName <<
')' << language::eol;
635 m_layoutMarginType = m_widgetChain.size() == 1 ? TopLevelMargin : ChildMargin;
636 const QString className = node->attributeClass();
637 const QString varName = m_driver->findOrInsertWidget(node);
639 QString parentWidget;
641 if (m_widgetChain.top()) {
643 parentClass = m_widgetChain.top()->attributeClass();
646 const QString savedParentWidget = parentWidget;
649 parentWidget.clear();
653 if (m_widgetChain.size() != 1) {
654 m_output << m_indent << varName <<
" = " << language::operatorNew
655 << language::fixClassName(CustomWidgetsInfo::realClassName(className))
656 <<
'(' << parentWidget <<
')' << language::eol;
659 parentWidget = savedParentWidget;
662 if (cwi->extends(className,
"QComboBox")) {
663 initializeComboBox(node);
664 }
else if (cwi->extends(className,
"QListWidget")) {
665 initializeListWidget(node);
666 }
else if (cwi->extends(className,
"QTreeWidget")) {
667 initializeTreeWidget(node);
668 }
else if (cwi->extends(className,
"QTableWidget")) {
669 initializeTableWidget(node);
673 addButtonGroup(node, varName);
675 writeProperties(varName, className, node->elementProperty());
677 if (!parentWidget.isEmpty()
678 && cwi->extends(className,
"QMenu")) {
679 initializeMenu(node, parentWidget);
682 if (node->elementLayout().isEmpty())
683 m_layoutChain.push(
nullptr);
685 m_layoutWidget =
false;
686 if (className ==
"QWidget"_L1 && !node->hasAttributeNative()) {
687 if (
const DomWidget* parentWidget = m_widgetChain.top()) {
688 const QString parentClass = parentWidget->attributeClass();
689 if (parentClass !=
"QMainWindow"_L1
690 && !m_uic->customWidgetsInfo()->isCustomWidgetContainer(parentClass)
691 && !m_uic->isContainer(parentClass))
692 m_layoutWidget =
true;
695 m_widgetChain.push(node);
696 m_layoutChain.push(
nullptr);
700 m_layoutWidget =
false;
702 const DomPropertyMap attributes = propertyMap(node->elementAttribute());
704 const QString pageDefaultString = u"Page"_s;
706 if (cwi->extends(parentClass,
"QMainWindow")) {
707 if (cwi->extends(className,
"QMenuBar")) {
708 m_output << m_indent << parentWidget << language::derefPointer
709 <<
"setMenuBar(" << varName <<
')' << language::eol;
710 }
else if (cwi->extends(className,
"QToolBar")) {
711 m_output << m_indent << parentWidget << language::derefPointer <<
"addToolBar("
712 << language::enumValue(toolBarAreaStringFromDOMAttributes(attributes)) << varName
713 <<
')' << language::eol;
715 if (
const DomProperty *pbreak = attributes.value(
"toolBarBreak"_L1)) {
716 if (pbreak->elementBool() ==
"true"_L1) {
717 m_output << m_indent << parentWidget << language::derefPointer
718 <<
"insertToolBarBreak(" << varName <<
')' << language::eol;
722 }
else if (cwi->extends(className,
"QDockWidget")) {
723 m_output << m_indent << parentWidget << language::derefPointer <<
"addDockWidget(";
724 if (DomProperty *pstyle = attributes.value(
"dockWidgetArea"_L1)) {
725 QString a = expandDockWidgetArea(language::dockWidgetArea(pstyle->elementNumber()));
726 m_output << language::enumValue(a) <<
", ";
728 m_output << varName <<
")" << language::eol;
730 m_output << m_indent << parentWidget << language::derefPointer
731 <<
"setStatusBar(" << varName <<
')' << language::eol;
733 m_output << m_indent << parentWidget << language::derefPointer
734 <<
"setCentralWidget(" << varName <<
')' << language::eol;
739 QString addPageMethod = cwi->customWidgetAddPageMethod(parentClass);
740 if (addPageMethod.isEmpty())
742 if (!addPageMethod.isEmpty()) {
743 m_output << m_indent << parentWidget << language::derefPointer
744 << addPageMethod <<
'(' << varName <<
')' << language::eol;
746 addWizardPage(varName, node, parentWidget);
748 const DomProperty *plabel = attributes.value(
"label"_L1);
749 DomString *plabelString = plabel ? plabel->elementString() :
nullptr;
751 if (
const DomProperty *picon = attributes.value(
"icon"_L1))
752 icon =
", "_L1 + iconCall(picon);
753 m_output << m_indent << parentWidget << language::derefPointer <<
"addItem("
754 << varName << icon <<
", " << noTrCall(plabelString, pageDefaultString)
755 <<
')' << language::eol;
757 autoTrOutput(plabelString, pageDefaultString) << m_indent << parentWidget
758 << language::derefPointer <<
"setItemText(" << parentWidget
759 << language::derefPointer <<
"indexOf(" << varName <<
"), "
760 << autoTrCall(plabelString, pageDefaultString) <<
')' << language::eol;
762 if (DomProperty *ptoolTip = attributes.value(
"toolTip"_L1)) {
763 autoTrOutput(ptoolTip->elementString())
764 << language::openQtConfig(toolTipConfigKey())
765 << m_indent << parentWidget << language::derefPointer <<
"setItemToolTip(" << parentWidget
766 << language::derefPointer <<
"indexOf(" << varName <<
"), "
767 << autoTrCall(ptoolTip->elementString()) <<
')' << language::eol
768 << language::closeQtConfig(toolTipConfigKey());
771 const DomProperty *ptitle = attributes.value(
"title"_L1);
772 DomString *ptitleString = ptitle ? ptitle->elementString() :
nullptr;
774 if (
const DomProperty *picon = attributes.value(
"icon"_L1))
775 icon =
", "_L1 + iconCall(picon);
776 m_output << m_indent << parentWidget << language::derefPointer <<
"addTab("
777 << varName << icon <<
", " << language::emptyString <<
')' << language::eol;
779 autoTrOutput(ptitleString, pageDefaultString) << m_indent << parentWidget
780 << language::derefPointer <<
"setTabText(" << parentWidget
781 << language::derefPointer <<
"indexOf(" << varName <<
"), "
782 << autoTrCall(ptitleString, pageDefaultString) <<
')' << language::eol;
784 if (
const DomProperty *ptoolTip = attributes.value(
"toolTip"_L1)) {
785 autoTrOutput(ptoolTip->elementString())
786 << language::openQtConfig(toolTipConfigKey())
787 << m_indent << parentWidget << language::derefPointer <<
"setTabToolTip("
788 << parentWidget << language::derefPointer <<
"indexOf(" << varName
789 <<
"), " << autoTrCall(ptoolTip->elementString()) <<
')' << language::eol
790 << language::closeQtConfig(toolTipConfigKey());
792 if (
const DomProperty *pwhatsThis = attributes.value(
"whatsThis"_L1)) {
793 autoTrOutput(pwhatsThis->elementString())
794 << language::openQtConfig(whatsThisConfigKey())
795 << m_indent << parentWidget << language::derefPointer <<
"setTabWhatsThis("
796 << parentWidget << language::derefPointer <<
"indexOf(" << varName
797 <<
"), " << autoTrCall(pwhatsThis->elementString()) <<
')' << language::eol
798 << language::closeQtConfig(whatsThisConfigKey());
805 static const QLatin1StringView realPropertyNames[] = {
807 "cascadingSectionResizes"_L1,
808 "minimumSectionSize"_L1,
809 "defaultSectionSize"_L1,
810 "highlightSections"_L1,
811 "showSortIndicator"_L1,
812 "stretchLastSection"_L1,
815 static const QStringList trees = {
816 u"QTreeView"_s, u"QTreeWidget"_s
818 static const QStringList tables = {
819 u"QTableView"_s, u"QTableWidget"_s
822 if (cwi->extendsOneOf(className, trees)) {
824 for (
auto realPropertyName : realPropertyNames) {
825 const QString fakePropertyName =
"header"_L1
826 + QChar(realPropertyName.at(0)).toUpper() + realPropertyName.mid(1);
827 if (DomProperty *fakeProperty = attributes.value(fakePropertyName)) {
828 fakeProperty->setAttributeName(realPropertyName);
829 headerProperties << fakeProperty;
832 writeProperties(varName + language::derefPointer +
"header()"_L1,
833 "QHeaderView"_L1, headerProperties,
834 WritePropertyIgnoreObjectName);
836 }
else if (cwi->extendsOneOf(className, tables)) {
837 static const QLatin1StringView headerPrefixes[] = {
838 "horizontalHeader"_L1,
842 for (
auto headerPrefix : headerPrefixes) {
843 DomPropertyList headerProperties;
844 for (
auto realPropertyName : realPropertyNames) {
845 const QString fakePropertyName = headerPrefix
846 + QChar(realPropertyName.at(0)).toUpper() + realPropertyName.mid(1);
847 if (DomProperty *fakeProperty = attributes.value(fakePropertyName)) {
848 fakeProperty->setAttributeName(realPropertyName);
849 headerProperties << fakeProperty;
852 const QString headerVar = varName + language::derefPointer
853 + headerPrefix +
"()"_L1;
854 writeProperties(headerVar,
"QHeaderView"_L1,
855 headerProperties, WritePropertyIgnoreObjectName);
859 if (node->elementLayout().isEmpty())
862 const QStringList zOrder = node->elementZOrder();
863 for (
const QString &name : zOrder) {
864 const QString varName = m_driver->widgetVariableName(name);
865 if (varName.isEmpty()) {
866 fprintf(stderr,
"%s: Warning: Z-order assignment: '%s' is not a valid widget.\n",
868 name.toLatin1().data());
870 m_output << m_indent << varName << language::derefPointer
871 << (language::language() != Language::Python ?
"raise()" :
"raise_()") << language::eol;
876void WriteInitialization::addButtonGroup(
const DomWidget *buttonNode,
const QString &varName)
878 const DomPropertyMap attributes = propertyMap(buttonNode->elementAttribute());
880 const DomProperty *prop = attributes.value(
"buttonGroup"_L1);
883 const QString attributeName = toString(prop->elementString());
887 const bool createGroupOnTheFly = group ==
nullptr;
888 if (createGroupOnTheFly) {
889 auto *newGroup =
new DomButtonGroup;
890 newGroup->setAttributeName(attributeName);
892 fprintf(stderr,
"%s: Warning: Creating button group `%s'\n",
894 attributeName.toLatin1().data());
896 const QString groupName = m_driver->findOrInsertButtonGroup(group);
898 if (!m_buttonGroups.contains(groupName)) {
899 const QString className = u"QButtonGroup"_s;
900 m_output << m_indent;
901 if (createGroupOnTheFly)
902 m_output << className <<
" *";
903 m_output << groupName <<
" = " << language::operatorNew
904 << className <<
'(' << m_mainFormVarName <<
')' << language::eol;
905 m_buttonGroups.insert(groupName);
906 writeProperties(groupName, className, group->elementProperty());
908 m_output << m_indent << groupName << language::derefPointer <<
"addButton("
909 << varName <<
')' << language::eol;
914 const QString className = node->attributeClass();
915 const QString varName = m_driver->findOrInsertLayout(node);
917 const DomPropertyMap properties = propertyMap(node->elementProperty());
918 const bool oldLayoutProperties = properties.value(
"margin"_L1) !=
nullptr;
920 bool isGroupBox =
false;
922 m_output << m_indent << varName <<
" = " << language::operatorNew << className <<
'(';
924 if (!m_layoutChain.top() && !isGroupBox)
925 m_output << m_driver->findOrInsertWidget(m_widgetChain.top());
927 m_output <<
")" << language::eol;
930 const bool suppressMarginDefault = m_layoutChain.top();
932 if (oldLayoutProperties)
933 marginType = m_layoutMarginType;
934 m_LayoutDefaultHandler.writeProperties(m_indent, varName, properties, marginType, suppressMarginDefault, m_output);
940 if (m_layoutWidget) {
945 for (
const DomProperty *p : propList) {
946 const QString propertyName = p->attributeName();
947 if (propertyName ==
"leftMargin"_L1 && p->kind() == DomProperty::Number)
949 else if (propertyName ==
"topMargin"_L1 && p->kind() == DomProperty::Number)
951 else if (propertyName ==
"rightMargin"_L1 && p->kind() == DomProperty::Number)
953 else if (propertyName ==
"bottomMargin"_L1 && p->kind() == DomProperty::Number)
957 auto *p =
new DomProperty();
958 p->setAttributeName(
"leftMargin"_L1);
959 p->setElementNumber(0);
960 newPropList.append(p);
963 auto *p =
new DomProperty();
964 p->setAttributeName(
"topMargin"_L1);
965 p->setElementNumber(0);
966 newPropList.append(p);
969 auto *p =
new DomProperty();
970 p->setAttributeName(
"rightMargin"_L1);
971 p->setElementNumber(0);
972 newPropList.append(p);
975 auto *p =
new DomProperty();
976 p->setAttributeName(
"bottomMargin"_L1);
977 p->setElementNumber(0);
978 newPropList.append(p);
980 m_layoutWidget =
false;
983 propList.append(newPropList);
985 writeProperties(varName, className, propList, WritePropertyIgnoreMargin|WritePropertyIgnoreSpacing);
989 qDeleteAll(newPropList);
992 m_layoutChain.push(node);
997 const QString numberNull(u'0');
998 writePropertyList(varName,
"setStretch"_L1, node->attributeStretch(), numberNull);
999 writePropertyList(varName,
"setRowStretch"_L1, node->attributeRowStretch(), numberNull);
1000 writePropertyList(varName,
"setColumnStretch"_L1, node->attributeColumnStretch(), numberNull);
1001 writePropertyList(varName,
"setColumnMinimumWidth"_L1, node->attributeColumnMinimumWidth(), numberNull);
1002 writePropertyList(varName,
"setRowMinimumHeight"_L1, node->attributeRowMinimumHeight(), numberNull);
1007 const QString &setFunction,
1008 const QString &value,
1009 const QString &defaultValue)
1011 if (value.isEmpty())
1013 const auto list = QStringView{value}.split(u',');
1014 for (qsizetype i = 0, count = list.size(); i < count; i++) {
1015 if (list.at(i) != defaultValue) {
1016 m_output << m_indent << varName << language::derefPointer << setFunction
1017 <<
'(' << i <<
", " << list.at(i) <<
')' << language::eol;
1024 m_output << m_indent << m_driver->findOrInsertSpacer(node) <<
" = ";
1025 writeSpacerItem(node, m_output);
1026 m_output << language::eol;
1032 return "QFormLayout::ItemRole::SpanningRole"_L1;
1034 ?
"QFormLayout::ItemRole::LabelRole"_L1 :
"QFormLayout::ItemRole::FieldRole"_L1;
1058 DomLayout *layout = m_layoutChain.top();
1063 const QString layoutName = m_driver->findOrInsertLayout(layout);
1064 const QString itemName = m_driver->findOrInsertLayoutItem(node);
1066 m_output <<
"\n" << m_indent << layoutName << language::derefPointer <<
""
1067 << layoutAddMethod(node->kind(), layout->attributeClass()) <<
'(';
1069 if (layout->attributeClass() ==
"QGridLayout"_L1) {
1070 const int row = node->attributeRow();
1071 const int col = node->attributeColumn();
1073 const int rowSpan = node->hasAttributeRowSpan() ? node->attributeRowSpan() : 1;
1074 const int colSpan = node->hasAttributeColSpan() ? node->attributeColSpan() : 1;
1075 m_output << itemName <<
", " << row <<
", " << col <<
", " << rowSpan <<
", " << colSpan;
1076 if (!node->attributeAlignment().isEmpty())
1077 m_output <<
", " << language::enumValue(node->attributeAlignment());
1078 }
else if (layout->attributeClass() ==
"QFormLayout"_L1) {
1079 const int row = node->attributeRow();
1080 const int colSpan = node->hasAttributeColSpan() ? node->attributeColSpan() : 1;
1081 const QString role = formLayoutRole(node->attributeColumn(), colSpan);
1082 m_output << row <<
", " << language::enumValue(role) <<
", " << itemName;
1084 m_output << itemName;
1085 if (layout->attributeClass().contains(
"Box"_L1) && !node->attributeAlignment().isEmpty())
1086 m_output <<
", 0, " << language::enumValue(node->attributeAlignment());
1088 m_output <<
")" << language::eol <<
"\n";
1093 const QString actionName = m_driver->findOrInsertActionGroup(node);
1094 QString varName = m_driver->findOrInsertWidget(m_widgetChain.top());
1096 if (m_actionGroupChain.top())
1099 m_output << m_indent << actionName <<
" = " << language::operatorNew
1100 <<
"QActionGroup(" << varName <<
")" << language::eol;
1101 writeProperties(actionName,
"QActionGroup"_L1, node->elementProperty());
1103 m_actionGroupChain.push(node);
1105 m_actionGroupChain.pop();
1110 if (node->hasAttributeMenu())
1113 const QString actionName = m_driver->findOrInsertAction(node);
1114 QString varName = m_driver->findOrInsertWidget(m_widgetChain.top());
1116 if (m_actionGroupChain.top())
1119 m_output << m_indent << actionName <<
" = " << language::operatorNew
1120 <<
"QAction(" << varName <<
')' << language::eol;
1121 writeProperties(actionName,
"QAction"_L1, node->elementProperty());
1126 QString actionName = node->attributeName();
1127 if (actionName.isEmpty() || !m_widgetChain.top()
1128 || m_driver->actionGroupByName(actionName)) {
1132 const QString varName = m_driver->findOrInsertWidget(m_widgetChain.top());
1134 if (m_widgetChain.top() && actionName ==
"separator"_L1) {
1136 m_actionOut << m_indent << varName << language::derefPointer
1137 <<
"addSeparator()" << language::eol;
1142 if (domWidget && m_uic
->isMenu(domWidget->attributeClass()
)) {
1143 m_actionOut << m_indent << varName << language::derefPointer
1144 <<
"addAction(" << m_driver->findOrInsertWidget(domWidget)
1145 << language::derefPointer <<
"menuAction())" << language::eol;
1151 fprintf(stderr,
"%s: Warning: action `%s' not declared\n",
1156 m_actionOut << m_indent << varName << language::derefPointer
1157 <<
"addAction(" << m_driver->findOrInsertAction(domAction)
1158 <<
')' << language::eol;
1163 QString propertyValue;
1164 QTextStream str(&propertyValue);
1165 char trailingDelimiter =
'}';
1168 str <<
"QStringList{";
1172 trailingDelimiter =
']';
1175 const QStringList values = list->elementString();
1176 if (!values.isEmpty()) {
1177 if (needsTranslation(list)) {
1178 const QString comment = list->attributeComment();
1179 const qsizetype last = values.size() - 1;
1180 for (qsizetype i = 0; i <= last; ++i) {
1181 str <<
'\n' << m_indent <<
" " << trCall(values.at(i), comment);
1186 for (qsizetype i = 0; i < values.size(); ++i) {
1189 str << language::qstring(values.at(i), m_dindent);
1193 str << trailingDelimiter;
1194 return propertyValue;
1199 if (propertyName ==
"toolTip"_L1)
1200 return toolTipConfigKey();
1201 if (propertyName ==
"whatsThis"_L1)
1202 return whatsThisConfigKey();
1203 if (propertyName ==
"statusTip"_L1)
1204 return statusTipConfigKey();
1205 if (propertyName ==
"shortcut"_L1)
1206 return shortcutConfigKey();
1207 if (propertyName ==
"accessibleName"_L1 || propertyName ==
"accessibleDescription"_L1)
1208 return accessibilityConfigKey();
1213 const QString &className,
1217 const bool isTopLevel = m_widgetChain.size() == 1;
1221 if (DomProperty *p = properties.value(
"control"_L1)) {
1222 m_output << m_indent << varName << language::derefPointer <<
"setControl("
1223 << language::qstring(toString(p->elementString()), m_dindent)
1224 <<
')' << language::eol;
1229 if (!m_widgetChain.top()) {
1230 indent = m_option.indent;
1233 m_output << m_indent <<
"if (" << varName <<
"->objectName().isEmpty())\n";
1235 case Language::Python:
1236 m_output << m_indent <<
"if not " << varName <<
".objectName():\n";
1240 if (!(flags & WritePropertyIgnoreObjectName)) {
1241 QString objectName = varName;
1244 m_output << m_indent << indent
1245 << varName << language::derefPointer <<
"setObjectName("
1246 << language::charliteral(objectName, m_dindent) <<
')' << language::eol;
1249 int leftMargin = -1;
1251 int rightMargin = -1;
1252 int bottomMargin = -1;
1253 bool frameShadowEncountered =
false;
1255 for (
const DomProperty *p : lst) {
1256 if (!checkProperty(m_uic->customWidgetsInfo(), m_option.inputFile, className, p))
1258 QString propertyName = p->attributeName();
1260 if (propertyName ==
"horizontalSizeConstraint"_L1 && className.contains(
"Layout"_L1))
1261 propertyName =
"sizeConstraint"_L1;
1262 QString propertyValue;
1263 bool delayProperty =
false;
1266 if (isTopLevel && propertyName ==
"geometry"_L1 && p->elementRect()) {
1267 const DomRect *r = p->elementRect();
1268 m_output << m_indent << varName << language::derefPointer <<
"resize("
1269 << r->elementWidth() <<
", " << r->elementHeight() <<
')' << language::eol;
1272 if (propertyName ==
"currentRow"_L1
1273 && m_uic->customWidgetsInfo()->extends(className,
"QListWidget")) {
1274 m_delayedOut << m_indent << varName << language::derefPointer
1275 <<
"setCurrentRow(" << p->elementNumber() <<
')' << language::eol;
1278 static const QStringList currentIndexWidgets = {
1279 u"QComboBox"_s, u"QStackedWidget"_s,
1280 u"QTabWidget"_s, u"QToolBox"_s
1282 if (propertyName ==
"currentIndex"_L1
1283 && (m_uic->customWidgetsInfo()->extendsOneOf(className, currentIndexWidgets))) {
1284 m_delayedOut << m_indent << varName << language::derefPointer
1285 <<
"setCurrentIndex(" << p->elementNumber() <<
')' << language::eol;
1288 if (propertyName ==
"tabSpacing"_L1
1289 && m_uic->customWidgetsInfo()->extends(className,
"QToolBox")) {
1290 m_delayedOut << m_indent << varName << language::derefPointer
1291 <<
"layout()" << language::derefPointer <<
"setSpacing("
1292 << p->elementNumber() <<
')' << language::eol;
1295 if (propertyName ==
"control"_L1
1296 && m_uic->customWidgetsInfo()->extends(className,
"QAxWidget")) {
1300 if (propertyName ==
"default"_L1
1301 && m_uic->customWidgetsInfo()->extends(className,
"QPushButton")) {
1303 delayProperty =
true;
1304 }
else if (propertyName ==
"database"_L1
1305 && p->elementStringList()) {
1308 }
else if (propertyName ==
"frameworkCode"_L1
1309 && p->kind() == DomProperty::Bool) {
1312 }
else if (propertyName ==
"orientation"_L1
1313 && m_uic->customWidgetsInfo()->extends(className,
"Line")) {
1315 QString shape = u"QFrame::Shape::HLine"_s;
1316 if (p->elementEnum().endsWith(
"::Vertical"_L1))
1317 shape = u"QFrame::Shape::VLine"_s;
1319 m_output << m_indent << varName << language::derefPointer <<
"setFrameShape("
1320 << language::enumValue(shape) <<
')' << language::eol;
1322 if (!frameShadowEncountered) {
1323 m_output << m_indent << varName << language::derefPointer
1324 <<
"setFrameShadow("
1325 << language::enumValue(
"QFrame::Shadow::Sunken"_L1)
1326 <<
')' << language::eol;
1329 }
else if ((flags & WritePropertyIgnoreMargin) && propertyName ==
"margin"_L1) {
1331 }
else if ((flags & WritePropertyIgnoreSpacing) && propertyName ==
"spacing"_L1) {
1333 }
else if (propertyName ==
"leftMargin"_L1 && p->kind() == DomProperty::Number) {
1334 leftMargin = p->elementNumber();
1336 }
else if (propertyName ==
"topMargin"_L1 && p->kind() == DomProperty::Number) {
1337 topMargin = p->elementNumber();
1339 }
else if (propertyName ==
"rightMargin"_L1 && p->kind() == DomProperty::Number) {
1340 rightMargin = p->elementNumber();
1342 }
else if (propertyName ==
"bottomMargin"_L1 && p->kind() == DomProperty::Number) {
1343 bottomMargin = p->elementNumber();
1345 }
else if (propertyName ==
"numDigits"_L1
1346 && m_uic->customWidgetsInfo()->extends(className,
"QLCDNumber")) {
1347 qWarning(
"Widget '%s': Deprecated property QLCDNumber::numDigits encountered. It has been replaced by QLCDNumber::digitCount.",
1349 propertyName =
"digitCount"_L1;
1350 }
else if (propertyName ==
"frameShadow"_L1) {
1351 frameShadowEncountered =
true;
1354 bool stdset = m_stdsetdef;
1355 if (p->hasAttributeStdset())
1356 stdset = p->attributeStdset();
1358 QString setFunction;
1361 QTextStream str(&setFunction);
1363 str << language::derefPointer <<
"set" << propertyName.at(0).toUpper()
1364 << QStringView{propertyName}.mid(1) <<
'(';
1366 str << language::derefPointer <<
"setProperty("_L1
1367 << language::charliteral(propertyName) <<
", ";
1368 if (language::language() == Language::Cpp) {
1370 if (p->kind() == DomProperty::Enum)
1371 str <<
"::fromValue";
1377 QString varNewName = varName;
1379 switch (p->kind()) {
1380 case DomProperty::Bool: {
1381 propertyValue = language::boolValue(p->elementBool() == language::cppTrue);
1384 case DomProperty::Color:
1385 propertyValue = domColor2QString(p->elementColor());
1387 case DomProperty::Cstring:
1388 if (propertyName ==
"buddy"_L1 && m_uic->customWidgetsInfo()->extends(className,
"QLabel")) {
1389 Buddy buddy = { varName, p->elementCstring() };
1390 m_buddies.append(std::move(buddy));
1392 const bool useQByteArray = !stdset && language::language() == Language::Cpp;
1393 QTextStream str(&propertyValue);
1395 str <<
"QByteArray(";
1396 str << language::charliteral(p->elementCstring(), m_dindent);
1401 case DomProperty::Cursor:
1402 propertyValue = QString::fromLatin1(
"QCursor(static_cast<Qt::CursorShape>(%1))")
1403 .arg(p->elementCursor());
1405 case DomProperty::CursorShape:
1406 if (p->hasAttributeStdset() && !p->attributeStdset())
1407 varNewName += language::derefPointer +
"viewport()"_L1;
1408 propertyValue =
"QCursor(Qt"_L1 + language::qualifier +
"CursorShape"_L1
1409 + language::qualifier + p->elementCursorShape() + u')';
1411 case DomProperty::Enum:
1412 propertyValue = p->elementEnum();
1413 if (propertyValue.contains(language::cppQualifier))
1414 propertyValue = language::enumValue(propertyValue);
1416 propertyValue.prepend(className + language::qualifier);
1418 case DomProperty::Set:
1419 propertyValue = language::enumValue(p->elementSet());
1421 case DomProperty::Font:
1422 propertyValue = writeFontProperties(p->elementFont());
1424 case DomProperty::IconSet:
1425 propertyValue = writeIconProperties(p->elementIconSet());
1427 case DomProperty::Pixmap:
1428 propertyValue = pixCall(p);
1430 case DomProperty::Palette: {
1431 const DomPalette *pal = p->elementPalette();
1432 const QString paletteName = m_driver->unique(
"palette"_L1);
1433 m_output << m_indent << language::stackVariable(
"QPalette", paletteName)
1435 writeColorGroup(pal->elementActive(),
1436 "QPalette::ColorGroup::Active"_L1, paletteName);
1437 writeColorGroup(pal->elementInactive(),
1438 "QPalette::ColorGroup::Inactive"_L1, paletteName);
1439 writeColorGroup(pal->elementDisabled(),
1440 "QPalette::ColorGroup::Disabled"_L1, paletteName);
1442 propertyValue = paletteName;
1445 case DomProperty::Point: {
1446 const DomPoint *po = p->elementPoint();
1447 propertyValue = QString::fromLatin1(
"QPoint(%1, %2)")
1448 .arg(po->elementX()).arg(po->elementY());
1451 case DomProperty::PointF: {
1452 const DomPointF *pof = p->elementPointF();
1453 propertyValue = QString::fromLatin1(
"QPointF(%1, %2)")
1454 .arg(pof->elementX()).arg(pof->elementY());
1457 case DomProperty::Rect: {
1458 const DomRect *r = p->elementRect();
1459 propertyValue = QString::fromLatin1(
"QRect(%1, %2, %3, %4)")
1460 .arg(r->elementX()).arg(r->elementY())
1461 .arg(r->elementWidth()).arg(r->elementHeight());
1464 case DomProperty::RectF: {
1465 const DomRectF *rf = p->elementRectF();
1466 propertyValue = QString::fromLatin1(
"QRectF(%1, %2, %3, %4)")
1467 .arg(rf->elementX()).arg(rf->elementY())
1468 .arg(rf->elementWidth()).arg(rf->elementHeight());
1471 case DomProperty::Locale: {
1472 const DomLocale *locale = p->elementLocale();
1473 QTextStream(&propertyValue) <<
"QLocale(QLocale" << language::qualifier
1474 << locale->attributeLanguage() <<
", QLocale" << language::qualifier
1475 << locale->attributeCountry() <<
')';
1478 case DomProperty::SizePolicy: {
1479 const QString spName = writeSizePolicy( p->elementSizePolicy());
1480 m_output << m_indent << spName <<
".setHeightForWidth("
1481 << varName << language::derefPointer <<
"sizePolicy().hasHeightForWidth())"
1484 propertyValue = spName;
1487 case DomProperty::Size: {
1488 const DomSize *s = p->elementSize();
1489 propertyValue = QString::fromLatin1(
"QSize(%1, %2)")
1490 .arg(s->elementWidth()).arg(s->elementHeight());
1493 case DomProperty::SizeF: {
1494 const DomSizeF *sf = p->elementSizeF();
1495 propertyValue = QString::fromLatin1(
"QSizeF(%1, %2)")
1496 .arg(sf->elementWidth()).arg(sf->elementHeight());
1499 case DomProperty::String: {
1500 if (propertyName ==
"objectName"_L1) {
1501 const QString v = p->elementString()->text();
1508 propertyValue = autoTrCall(p->elementString());
1511 case DomProperty::Number:
1512 propertyValue = QString::number(p->elementNumber());
1514 case DomProperty::UInt:
1515 propertyValue = QString::number(p->elementUInt());
1516 propertyValue += u'u';
1518 case DomProperty::LongLong:
1519 propertyValue =
"Q_INT64_C("_L1;
1520 propertyValue += QString::number(p->elementLongLong());
1521 propertyValue += u')';
1523 case DomProperty::ULongLong:
1524 propertyValue =
"Q_UINT64_C("_L1;
1525 propertyValue += QString::number(p->elementULongLong());
1526 propertyValue += u')';
1528 case DomProperty::Float:
1529 propertyValue = QString::number(p->elementFloat(),
'f', 8);
1531 case DomProperty::Double:
1532 propertyValue = QString::number(p->elementDouble(),
'f', 15);
1534 case DomProperty::Char: {
1535 const DomChar *c = p->elementChar();
1536 propertyValue = QString::fromLatin1(
"QChar(%1)")
1537 .arg(c->elementUnicode());
1540 case DomProperty::Date: {
1541 const DomDate *d = p->elementDate();
1542 propertyValue = QString::fromLatin1(
"QDate(%1, %2, %3)")
1543 .arg(d->elementYear())
1544 .arg(d->elementMonth())
1545 .arg(d->elementDay());
1548 case DomProperty::Time: {
1549 const DomTime *t = p->elementTime();
1550 propertyValue = QString::fromLatin1(
"QTime(%1, %2, %3)")
1551 .arg(t->elementHour())
1552 .arg(t->elementMinute())
1553 .arg(t->elementSecond());
1556 case DomProperty::DateTime: {
1557 const DomDateTime *dt = p->elementDateTime();
1558 propertyValue = QString::fromLatin1(
"QDateTime(QDate(%1, %2, %3), QTime(%4, %5, %6))")
1559 .arg(dt->elementYear())
1560 .arg(dt->elementMonth())
1561 .arg(dt->elementDay())
1562 .arg(dt->elementHour())
1563 .arg(dt->elementMinute())
1564 .arg(dt->elementSecond());
1567 case DomProperty::StringList:
1568 propertyValue = writeStringListProperty(p->elementStringList());
1571 case DomProperty::Url: {
1572 const DomUrl* u = p->elementUrl();
1573 QTextStream(&propertyValue) <<
"QUrl("
1574 << language::qstring(u->elementString()->text(), m_dindent) <<
")";
1577 case DomProperty::Brush:
1578 propertyValue = writeBrushInitialization(p->elementBrush());
1580 case DomProperty::Unknown:
1584 if (!propertyValue.isEmpty()) {
1585 const QString configKey = configKeyForProperty(propertyName);
1587 QTextStream &o = delayProperty ? m_delayedOut : autoTrOutput(p);
1589 if (!configKey.isEmpty())
1590 o << language::openQtConfig(configKey);
1591 o << m_indent << varNewName << setFunction << propertyValue;
1592 if (!stdset && language::language() == Language::Cpp)
1594 o <<
')' << language::eol;
1595 if (!configKey.isEmpty())
1596 o << language::closeQtConfig(configKey);
1598 if (varName == m_mainFormVarName && &o == &m_refreshOut) {
1601 m_mainFormUsedInRetranslateUi =
true;
1605 if (leftMargin != -1 || topMargin != -1 || rightMargin != -1 || bottomMargin != -1) {
1606 m_output << m_indent << varName << language::derefPointer <<
"setContentsMargins("
1607 << leftMargin <<
", " << topMargin <<
", "
1608 << rightMargin <<
", " << bottomMargin <<
")" << language::eol;
1617 const SizePolicyNameMap::const_iterator it = m_sizePolicyNameMap.constFind(sizePolicyHandle);
1618 if ( it != m_sizePolicyNameMap.constEnd()) {
1624 const QString spName = m_driver->unique(
"sizePolicy"_L1);
1625 m_sizePolicyNameMap.insert(sizePolicyHandle, spName);
1627 m_output << m_indent << language::stackVariableWithInitParameters(
"QSizePolicy", spName);
1628 QString horizPolicy;
1630 if (sp->hasElementHSizeType() && sp->hasElementVSizeType()) {
1631 horizPolicy = language::sizePolicy(sp->elementHSizeType());
1632 vertPolicy = language::sizePolicy(sp->elementVSizeType());
1633 }
else if (sp->hasAttributeHSizeType() && sp->hasAttributeVSizeType()) {
1634 horizPolicy = sp->attributeHSizeType();
1635 vertPolicy = sp->attributeVSizeType();
1637 if (!horizPolicy.isEmpty() && !vertPolicy.isEmpty()) {
1638 m_output << language::enumValue(expandSizePolicyEnum(horizPolicy))
1639 <<
", " << language::enumValue(expandSizePolicyEnum(vertPolicy));
1641 m_output <<
')' << language::eol;
1643 m_output << m_indent << spName <<
".setHorizontalStretch("
1644 << sp->elementHorStretch() <<
")" << language::eol;
1645 m_output << m_indent << spName <<
".setVerticalStretch("
1646 << sp->elementVerStretch() <<
")" << language::eol;
1656 const FontPropertiesNameMap::const_iterator it = m_fontPropertiesNameMap.constFind(fontHandle);
1657 if ( it != m_fontPropertiesNameMap.constEnd()) {
1662 const QString fontName = m_driver->unique(
"font"_L1);
1663 m_fontPropertiesNameMap.insert(FontHandle(f), fontName);
1665 m_output << m_indent << language::stackVariable(
"QFont", fontName)
1667 if (f->hasElementFamily() && !f->elementFamily().isEmpty()) {
1668 m_output << m_indent << fontName <<
".setFamilies("
1669 << language::listStart
1670 << language::qstring(f->elementFamily(), m_dindent)
1671 << language::listEnd <<
')' << language::eol;
1673 if (f->hasElementPointSize() && f->elementPointSize() > 0) {
1674 m_output << m_indent << fontName <<
".setPointSize(" << f->elementPointSize()
1675 <<
")" << language::eol;
1678 if (f->hasElementFontWeight()) {
1679 m_output << m_indent << fontName <<
".setWeight(QFont"
1680 << language::qualifier << f->elementFontWeight() <<
')' << language::eol;
1681 }
else if (f->hasElementBold()) {
1682 m_output << m_indent << fontName <<
".setBold("
1683 << language::boolValue(f->elementBold()) <<
')' << language::eol;
1686 if (f->hasElementItalic()) {
1687 m_output << m_indent << fontName <<
".setItalic("
1688 << language::boolValue(f->elementItalic()) <<
')' << language::eol;
1690 if (f->hasElementUnderline()) {
1691 m_output << m_indent << fontName <<
".setUnderline("
1692 << language::boolValue(f->elementUnderline()) <<
')' << language::eol;
1694 if (f->hasElementStrikeOut()) {
1695 m_output << m_indent << fontName <<
".setStrikeOut("
1696 << language::boolValue(f->elementStrikeOut()) <<
')' << language::eol;
1698 if (f->hasElementKerning()) {
1699 m_output << m_indent << fontName <<
".setKerning("
1700 << language::boolValue(f->elementKerning()) <<
')' << language::eol;
1702 if (f->hasElementAntialiasing()) {
1703 m_output << m_indent << fontName <<
".setStyleStrategy(QFont"
1704 << language::qualifier
1705 << (f->elementAntialiasing() ?
"PreferDefault" :
"NoAntialias")
1706 <<
')' << language::eol;
1708 if (f->hasElementStyleStrategy()) {
1709 m_output << m_indent << fontName <<
".setStyleStrategy(QFont"
1710 << language::qualifier << f->elementStyleStrategy() <<
')' << language::eol;
1712 if (f->hasElementHintingPreference()) {
1713 m_output << m_indent << fontName <<
".setHintingPreference(QFont"
1714 << language::qualifier << f->elementHintingPreference() <<
')' << language::eol;
1721 const QString &iconName,
const QString &fileName,
1722 const char *mode,
const char *state)
1724 output << indent << iconName <<
".addFile("
1725 << language::qstring(fileName, indent) <<
", QSize(), QIcon"
1733 const QString &iconName,
1734 const QString &indent,
1735 const DomResourceIcon *i)
1737 if (i->hasElementNormalOff()) {
1738 writeIconAddFile(output, indent, iconName, i->elementNormalOff()->text(),
1741 if (i->hasElementNormalOn()) {
1742 writeIconAddFile(output, indent, iconName, i->elementNormalOn()->text(),
1745 if (i->hasElementDisabledOff()) {
1746 writeIconAddFile(output, indent, iconName, i->elementDisabledOff()->text(),
1749 if (i->hasElementDisabledOn()) {
1750 writeIconAddFile(output, indent, iconName, i->elementDisabledOn()->text(),
1753 if (i->hasElementActiveOff()) {
1754 writeIconAddFile(output, indent, iconName, i->elementActiveOff()->text(),
1757 if (i->hasElementActiveOn()) {
1758 writeIconAddFile(output, indent, iconName, i->elementActiveOn()->text(),
1761 if (i->hasElementSelectedOff()) {
1762 writeIconAddFile(output, indent, iconName, i->elementSelectedOff()->text(),
1765 if (i->hasElementSelectedOn()) {
1766 writeIconAddFile(output, indent, iconName, i->elementSelectedOn()->text(),
1772 const QString &iconName,
const QString &call,
1773 const char *mode,
const char *state)
1775 output << indent << iconName <<
".addPixmap(" << call <<
", QIcon"
1782 const QString &iconName,
1783 const QString &indent,
1784 const DomResourceIcon *i)
const
1786 if (i->hasElementNormalOff()) {
1787 writeIconAddPixmap(output, indent, iconName,
1788 pixCall(
"QPixmap"_L1, i->elementNormalOff()->text()),
1791 if (i->hasElementNormalOn()) {
1792 writeIconAddPixmap(output, indent, iconName,
1793 pixCall(
"QPixmap"_L1, i->elementNormalOn()->text()),
1796 if (i->hasElementDisabledOff()) {
1797 writeIconAddPixmap(output, indent, iconName,
1798 pixCall(
"QPixmap"_L1, i->elementDisabledOff()->text()),
1801 if (i->hasElementDisabledOn()) {
1802 writeIconAddPixmap(output, indent, iconName,
1803 pixCall(
"QPixmap"_L1, i->elementDisabledOn()->text()),
1806 if (i->hasElementActiveOff()) {
1807 writeIconAddPixmap(output, indent, iconName,
1808 pixCall(
"QPixmap"_L1, i->elementActiveOff()->text()),
1811 if (i->hasElementActiveOn()) {
1812 writeIconAddPixmap(output, indent, iconName,
1813 pixCall(
"QPixmap"_L1, i->elementActiveOn()->text()),
1816 if (i->hasElementSelectedOff()) {
1817 writeIconAddPixmap(output, indent, iconName,
1818 pixCall(
"QPixmap"_L1, i->elementSelectedOff()->text()),
1821 if (i->hasElementSelectedOn()) {
1822 writeIconAddPixmap(output, indent, iconName,
1823 pixCall(
"QPixmap"_L1, i->elementSelectedOn()->text()),
1859 const QString &iconName,
1860 const DomResourceIcon *i)
1864 m_output << m_indent <<
"if ";
1867 m_output <<
"QIcon" << language::qualifier <<
"hasThemeIcon("
1868 << themeValue <<
')' << (isCpp ?
") {" :
":") <<
'\n'
1869 << m_dindent << iconName <<
" = " << iconFromTheme(themeValue)
1871 m_output << m_indent << (isCpp ?
"} else {" :
"else:") <<
'\n';
1872 if (m_uic->pixmapFunction().isEmpty())
1873 writeResourceIcon(m_output, iconName, m_dindent, i);
1875 writePixmapFunctionIcon(m_output, iconName, m_dindent, i);
1877 m_output << m_indent <<
'}';
1885 const IconPropertiesNameMap::const_iterator it = m_iconPropertiesNameMap.constFind(iconHandle);
1886 if (it != m_iconPropertiesNameMap.constEnd())
1890 const QString iconName = m_driver->unique(
"icon"_L1);
1891 m_iconPropertiesNameMap.insert(IconHandle(i), iconName);
1895 if (Q_UNLIKELY(!isIconFormat44(i))) {
1896 m_output << m_indent;
1898 m_output <<
"const QIcon ";
1899 m_output << iconName <<
" = " << pixCall(
"QIcon"_L1, i->text())
1905 QString theme = i->attributeTheme();
1906 if (theme.isEmpty()) {
1908 m_output << m_indent << language::stackVariable(
"QIcon", iconName)
1910 if (m_uic->pixmapFunction().isEmpty())
1911 writeResourceIcon(m_output, iconName, m_indent, i);
1913 writePixmapFunctionIcon(m_output, iconName, m_indent, i);
1917 const bool isThemeEnum = theme.startsWith(
"QIcon::"_L1);
1922 if (iconHasStatePixmaps(i)) {
1925 m_output << m_indent << language::stackVariable(
"QIcon", iconName) << language::eol;
1927 writeThemeIconCheckAssignment(theme, iconName, i);
1931 static constexpr auto themeNameStringVariableC =
"iconThemeName"_L1;
1933 m_output << m_indent;
1934 if (m_firstThemeIcon) {
1936 m_output <<
"QString ";
1937 m_firstThemeIcon =
false;
1939 m_output << themeNameStringVariableC <<
" = "
1940 << language::qstring(theme) << language::eol;
1941 writeThemeIconCheckAssignment(themeNameStringVariableC, iconName, i);
1946 m_output << m_indent
1947 << language::stackVariableWithInitParameters(
"QIcon", iconName);
1949 m_output << iconFromTheme(theme);
1951 m_output << iconFromThemeStringLiteral(theme);
1952 m_output <<
')' << language::eol;
1958 if (c->hasAttributeAlpha())
1959 return QString::fromLatin1(
"QColor(%1, %2, %3, %4)")
1960 .arg(c->elementRed())
1961 .arg(c->elementGreen())
1962 .arg(c->elementBlue())
1963 .arg(c->attributeAlpha());
1964 return QString::fromLatin1(
"QColor(%1, %2, %3)")
1965 .arg(c->elementRed())
1966 .arg(c->elementGreen())
1967 .arg(c->elementBlue());
1972 if (roleName ==
"PlaceholderText"_L1)
1974 if (roleName ==
"Accent"_L1)
1979void WriteInitialization::writeColorGroup(DomColorGroup *colorGroup,
const QString &group,
const QString &paletteName)
1985 const auto &colors = colorGroup->elementColor();
1986 for (
int i=0; i<colors.size(); ++i) {
1987 const DomColor *color = colors.at(i);
1989 m_output << m_indent << paletteName <<
".setColor(" << group
1990 <<
", QPalette" << language::qualifier <<
"ColorRole"
1991 << language::qualifier << language::paletteColorRole(i)
1992 <<
", " << domColor2QString(color)
1993 <<
")" << language::eol;
1997 const auto &colorRoles = colorGroup->elementColorRole();
1998 for (
const DomColorRole *colorRole : colorRoles) {
1999 if (colorRole->hasAttributeRole()) {
2000 const QString roleName = colorRole->attributeRole();
2001 const QVersionNumber versionAdded = colorRoleVersionAdded(roleName);
2002 const QString brushName = writeBrushInitialization(colorRole->elementBrush());
2003 if (!versionAdded.isNull()) {
2004 m_output <<
"#if QT_VERSION >= QT_VERSION_CHECK("
2005 << versionAdded.majorVersion() <<
", " << versionAdded.minorVersion()
2006 <<
", " << versionAdded.microVersion() <<
")\n";
2008 m_output << m_indent << paletteName <<
".setBrush("
2009 << language::enumValue(group) <<
", "
2010 <<
"QPalette" << language::qualifier <<
"ColorRole"
2011 << language::qualifier << roleName <<
", " << brushName <<
')' << language::eol;
2012 if (!versionAdded.isNull())
2013 m_output <<
"#endif\n";
2023 const bool solidColoredBrush = !brush->hasAttributeBrushStyle() || brush->attributeBrushStyle() ==
"SolidPattern"_L1;
2025 if (solidColoredBrush) {
2026 if (
const DomColor *color = brush->elementColor()) {
2027 rgb = ((color->elementRed() & 0xFF) << 24) |
2028 ((color->elementGreen() & 0xFF) << 16) |
2029 ((color->elementBlue() & 0xFF) << 8) |
2030 ((color->attributeAlpha() & 0xFF));
2031 const ColorBrushHash::const_iterator cit = m_colorBrushHash.constFind(rgb);
2032 if (cit != m_colorBrushHash.constEnd())
2037 const QString brushName = m_driver->unique(
"brush"_L1);
2038 writeBrush(brush, brushName);
2039 if (solidColoredBrush)
2040 m_colorBrushHash.insert(rgb, brushName);
2046 QString style = u"SolidPattern"_s;
2047 if (brush->hasAttributeBrushStyle())
2048 style = brush->attributeBrushStyle();
2050 if (style ==
"LinearGradientPattern"_L1 ||
2051 style ==
"RadialGradientPattern"_L1 ||
2052 style ==
"ConicalGradientPattern"_L1) {
2053 const DomGradient *gradient = brush->elementGradient();
2054 const QString gradientType = gradient->attributeType();
2055 const QString gradientName = m_driver->unique(
"gradient"_L1);
2056 if (gradientType ==
"LinearGradient"_L1) {
2057 m_output << m_indent
2058 << language::stackVariableWithInitParameters(
"QLinearGradient", gradientName)
2059 << gradient->attributeStartX()
2060 <<
", " << gradient->attributeStartY()
2061 <<
", " << gradient->attributeEndX()
2062 <<
", " << gradient->attributeEndY() <<
')' << language::eol;
2063 }
else if (gradientType ==
"RadialGradient"_L1) {
2064 m_output << m_indent
2065 << language::stackVariableWithInitParameters(
"QRadialGradient", gradientName)
2066 << gradient->attributeCentralX()
2067 <<
", " << gradient->attributeCentralY()
2068 <<
", " << gradient->attributeRadius()
2069 <<
", " << gradient->attributeFocalX()
2070 <<
", " << gradient->attributeFocalY() <<
')' << language::eol;
2071 }
else if (gradientType ==
"ConicalGradient"_L1) {
2072 m_output << m_indent
2073 << language::stackVariableWithInitParameters(
"QConicalGradient", gradientName)
2074 << gradient->attributeCentralX()
2075 <<
", " << gradient->attributeCentralY()
2076 <<
", " << gradient->attributeAngle() <<
')' << language::eol;
2079 m_output << m_indent << gradientName <<
".setSpread(QGradient"
2080 << language::qualifier <<
"Spread" << language::qualifier << gradient->attributeSpread()
2081 <<
')' << language::eol;
2083 if (gradient->hasAttributeCoordinateMode()) {
2084 m_output << m_indent << gradientName <<
".setCoordinateMode(QGradient"
2085 << language::qualifier <<
"CoordinateMode" << language::qualifier
2086 << gradient->attributeCoordinateMode() <<
')' << language::eol;
2089 const auto &stops = gradient->elementGradientStop();
2090 for (
const DomGradientStop *stop : stops) {
2091 const DomColor *color = stop->elementColor();
2092 m_output << m_indent << gradientName <<
".setColorAt("
2093 << stop->attributePosition() <<
", "
2094 << domColor2QString(color) <<
')' << language::eol;
2096 m_output << m_indent
2097 << language::stackVariableWithInitParameters(
"QBrush", brushName)
2098 << gradientName <<
')' << language::eol;
2099 }
else if (style ==
"TexturePattern"_L1) {
2100 const DomProperty *property = brush->elementTexture();
2101 const QString iconValue = iconCall(property);
2103 m_output << m_indent
2104 << language::stackVariableWithInitParameters(
"QBrush", brushName)
2105 << iconValue <<
')' << language::eol;
2107 const DomColor *color = brush->elementColor();
2108 m_output << m_indent
2109 << language::stackVariableWithInitParameters(
"QBrush", brushName)
2110 << domColor2QString(color) <<
')' << language::eol;
2112 m_output << m_indent << brushName <<
".setStyle("
2113 << language::qtQualifier <<
"BrushStyle" << language::qualifier
2114 << style <<
')' << language::eol;
2132 const QStringList l = tabStops->elementTabStop();
2133 for (
int i=0; i<l.size(); ++i) {
2134 const QString name = m_driver->widgetVariableName(l.at(i));
2136 if (name.isEmpty()) {
2137 fprintf(stderr,
"%s: Warning: Tab-stop assignment: '%s' is not a valid widget.\n",
2146 if (name.isEmpty() || lastName.isEmpty())
2149 m_output << m_indent <<
"QWidget" << language::qualifier <<
"setTabOrder("
2150 << lastName <<
", " << name <<
')' << language::eol;
2158 if (icon->kind() == DomProperty::IconSet)
2159 return writeIconProperties(icon->elementIconSet());
2160 return pixCall(icon);
2165 QLatin1StringView type;
2167 switch (p->kind()) {
2168 case DomProperty::IconSet:
2170 s = p->elementIconSet()->text();
2172 case DomProperty::Pixmap:
2173 type =
"QPixmap"_L1;
2174 s = p->elementPixmap()->text();
2177 qWarning(
"%s: Warning: Unknown icon format encountered. The ui-file was generated with a too-recent version of Qt Widgets Designer.",
2179 return "QIcon()"_L1;
2182 return pixCall(type, s);
2191 QTextStream str(&result);
2194 const QString pixFunc = m_uic->pixmapFunction();
2195 if (pixFunc.isEmpty())
2196 str << language::qstring(text, m_dindent);
2198 str << pixFunc <<
'(' << language::charliteral(text, m_dindent) <<
')';
2205 const QString varName = m_driver->findOrInsertWidget(w);
2207 const auto &items = w->elementItem();
2209 if (items.isEmpty())
2212 for (
int i = 0; i < items.size(); ++i) {
2213 const DomItem *item = items.at(i);
2214 const DomPropertyMap properties = propertyMap(item->elementProperty());
2215 const DomProperty *text = properties.value(
"text"_L1);
2216 const DomProperty *icon = properties.value(
"icon"_L1);
2220 iconValue = iconCall(icon);
2222 m_output << m_indent << varName << language::derefPointer <<
"addItem(";
2224 m_output << iconValue <<
", ";
2226 if (needsTranslation(text->elementString())) {
2227 m_output << language::emptyString <<
')' << language::eol;
2228 m_refreshOut << m_indent << varName << language::derefPointer
2229 <<
"setItemText(" << i <<
", " << trCall(text->elementString())
2230 <<
')' << language::eol;
2232 m_output << noTrCall(text->elementString()) <<
")" << language::eol;
2235 m_refreshOut <<
"\n";
2242 if (!w->elementItem().isEmpty()) {
2243 tempName = m_driver
->unique(
"__sortingEnabled"_L1);
2244 m_refreshOut <<
"\n";
2245 m_refreshOut << m_indent;
2246 if (language::language() == Language::Cpp)
2247 m_refreshOut <<
"const bool ";
2248 m_refreshOut << tempName <<
" = " << varName << language::derefPointer
2249 <<
"isSortingEnabled()" << language::eol
2250 << m_indent << varName << language::derefPointer
2251 <<
"setSortingEnabled(" << language::boolValue(
false) <<
')' << language::eol;
2256void WriteInitialization::enableSorting(DomWidget *w,
const QString &varName,
const QString &tempName)
2258 if (!w->elementItem().isEmpty()) {
2259 m_refreshOut << m_indent << varName << language::derefPointer
2260 <<
"setSortingEnabled(" << tempName <<
')' << language::eol <<
'\n';
2265
2266
2267
2268
2269
2270
2274
2275
2276
2277
2278
2280 int column,
const QString &value,
2281 const QString &directive,
bool translatable)
2283 if (!value.isEmpty()) {
2285 QTextStream str(&setter);
2286 str << language::derefPointer <<
"set" << name.at(0).toUpper() << QStringView{name}.mid(1) <<
'(';
2288 str << column <<
", ";
2289 str << value <<
')';
2292 item->addSetter(setter, directive, translatable);
2297
2298
2299
2300
2301
2302
2303
2304
2306 const DomPropertyMap &properties,
const QString &name,
int column,
const QString &directive)
const
2308 if (
const DomProperty *p = properties.value(name)) {
2309 DomString *str = p->elementString();
2310 QString text = toString(str);
2311 if (!text.isEmpty()) {
2312 bool translatable = needsTranslation(str);
2313 QString value = autoTrCall(str);
2314 addInitializer(item, name, column, value, directive, translatable);
2320 const DomPropertyMap &properties,
const QString &name,
int column)
2322 if (
const DomProperty *p = properties.value(name)) {
2323 if (p->elementBrush())
2324 addInitializer(item, name, column, writeBrushInitialization(p->elementBrush()));
2325 else if (p->elementColor())
2326 addInitializer(item, name, column, domColor2QString(p->elementColor()));
2331
2332
2333
2335 const QString &name,
int column)
2337 if (
const DomProperty *p = properties.value(name)) {
2338 QString v = p->elementSet();
2340 if (v.contains(u':')) {
2343 const QString orOperator = u'|' + language::qtQualifier;
2344 v.replace(u'|', orOperator);
2347 addInitializer(item, name, column, v);
2353
2354
2355
2357 const DomPropertyMap &properties,
const QString &name,
int column)
const
2359 if (
const DomProperty *p = properties.value(name)) {
2360 QString v = p->elementEnum();
2364 addInitializer(item, name, column, v);
2370
2371
2375 if (
const DomProperty *icon = properties.value(
"icon"_L1))
2376 addInitializer(item,
"icon"_L1, column, iconCall(icon));
2377 addBrushInitializer(item, properties,
"foreground"_L1, column);
2378 addBrushInitializer(item, properties,
"background"_L1, column);
2379 if (
const DomProperty *font = properties.value(
"font"_L1))
2380 addInitializer(item,
"font"_L1, column, writeFontProperties(font->elementFont()));
2381 addQtFlagsInitializer(item, properties,
"textAlignment"_L1, column);
2382 addQtEnumInitializer(item, properties,
"checkState"_L1, column);
2383 addStringInitializer(item, properties,
"text"_L1, column);
2384 addStringInitializer(item, properties,
"toolTip"_L1, column,
2385 toolTipConfigKey());
2386 addStringInitializer(item, properties,
"whatsThis"_L1, column,
2387 whatsThisConfigKey());
2388 addStringInitializer(item, properties,
"statusTip"_L1, column,
2389 statusTipConfigKey());
2394 const QString varName = m_driver->findOrInsertWidget(w);
2396 const auto &items = w->elementItem();
2398 if (items.isEmpty())
2401 QString tempName = disableSorting(w, varName);
2404 for (
int i = 0; i < items.size(); ++i) {
2405 const DomItem *domItem = items.at(i);
2407 const DomPropertyMap properties = propertyMap(domItem->elementProperty());
2409 Item item(
"QListWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2410 addQtFlagsInitializer(&item, properties,
"flags"_L1);
2411 addCommonInitializers(&item, properties);
2413 item.writeSetupUi(varName);
2416 item.writeRetranslateUi(parentPath);
2418 enableSorting(w, varName, tempName);
2423 const QString varName = m_driver->findOrInsertWidget(w);
2426 Item item(
"QTreeWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2428 const auto &columns = w->elementColumn();
2429 for (
int i = 0; i < columns.size(); ++i) {
2430 const DomColumn *column = columns.at(i);
2432 const DomPropertyMap properties = propertyMap(column->elementProperty());
2433 addCommonInitializers(&item, properties, i);
2435 if (
const DomProperty *p = properties.value(
"text"_L1)) {
2436 DomString *str = p->elementString();
2437 if (str && str->text().isEmpty()) {
2438 m_output << m_indent << varName << language::derefPointer
2439 <<
"headerItem()" << language::derefPointer <<
"setText("
2440 << i <<
", " << language::emptyString <<
')' << language::eol;
2444 const QString itemName = item.writeSetupUi(QString(), Item::DontConstruct);
2445 item.writeRetranslateUi(varName + language::derefPointer +
"headerItem()"_L1);
2446 if (!itemName.isNull()) {
2447 m_output << m_indent << varName << language::derefPointer
2448 <<
"setHeaderItem(" << itemName <<
')' << language::eol;
2451 if (w->elementItem().empty())
2454 QString tempName = disableSorting(w, varName);
2456 const auto items = initializeTreeWidgetItems(w->elementItem());
2457 for (
int i = 0; i < items.size(); i++) {
2458 Item *itm = items[i];
2459 itm->writeSetupUi(varName);
2462 itm->writeRetranslateUi(parentPath);
2466 enableSorting(w, varName, tempName);
2470
2471
2472
2473
2474
2475
2476
2477
2482 const qsizetype numDomItems = domItems.size();
2483 items.reserve(numDomItems);
2485 for (qsizetype i = 0; i < numDomItems; ++i) {
2486 const DomItem *domItem = domItems.at(i);
2488 Item *item =
new Item(
"QTreeWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2491 QHash<QString, DomProperty *> map;
2495 for (DomProperty *p : properties) {
2496 if (p->attributeName() ==
"text"_L1) {
2497 if (!map.isEmpty()) {
2498 addCommonInitializers(item, map, col);
2503 map.insert(p->attributeName(), p);
2505 addCommonInitializers(item, map, col);
2507 addQtFlagsInitializer(item, map,
"flags"_L1);
2509 const auto subItems = initializeTreeWidgetItems(domItem->elementItem());
2510 for (Item *subItem : subItems)
2511 item->addChild(subItem);
2518 const QString varName = m_driver->findOrInsertWidget(w);
2521 const auto &columns = w->elementColumn();
2523 if (!columns.empty()) {
2524 m_output << m_indent <<
"if (" << varName << language::derefPointer
2525 <<
"columnCount() < " << columns.size() <<
')';
2526 if (language::language() == Language::Python)
2528 m_output <<
'\n' << m_dindent << varName << language::derefPointer <<
"setColumnCount("
2529 << columns.size() <<
')' << language::eol;
2532 for (
int i = 0; i < columns.size(); ++i) {
2533 const DomColumn *column = columns.at(i);
2534 if (!column->elementProperty().isEmpty()) {
2535 const DomPropertyMap properties = propertyMap(column->elementProperty());
2537 Item item(
"QTableWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2538 addCommonInitializers(&item, properties);
2540 QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable);
2543 <<
"horizontalHeaderItem(" << i <<
')';
2544 item.writeRetranslateUi(parentPath);
2545 m_output << m_indent << varName << language::derefPointer <<
"setHorizontalHeaderItem("
2546 << i <<
", " << itemName <<
')' << language::eol;
2551 const auto &rows = w->elementRow();
2553 if (!rows.isEmpty()) {
2554 m_output << m_indent <<
"if (" << varName << language::derefPointer
2555 <<
"rowCount() < " << rows.size() <<
')';
2556 if (language::language() == Language::Python)
2558 m_output <<
'\n' << m_dindent << varName << language::derefPointer <<
"setRowCount("
2559 << rows.size() <<
')' << language::eol;
2562 for (
int i = 0; i < rows.size(); ++i) {
2563 const DomRow *row = rows.at(i);
2564 if (!row->elementProperty().isEmpty()) {
2565 const DomPropertyMap properties = propertyMap(row->elementProperty());
2567 Item item(
"QTableWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2568 addCommonInitializers(&item, properties);
2570 QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable);
2573 item.writeRetranslateUi(parentPath);
2574 m_output << m_indent << varName << language::derefPointer <<
"setVerticalHeaderItem("
2575 << i <<
", " << itemName <<
')' << language::eol;
2580 QString tempName = disableSorting(w, varName);
2582 const auto &items = w->elementItem();
2584 for (
const DomItem *cell : items) {
2585 if (cell->hasAttributeRow() && cell->hasAttributeColumn() && !cell->elementProperty().isEmpty()) {
2586 const int r = cell->attributeRow();
2587 const int c = cell->attributeColumn();
2588 const DomPropertyMap properties = propertyMap(cell->elementProperty());
2590 Item item(
"QTableWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2591 addQtFlagsInitializer(&item, properties,
"flags"_L1);
2592 addCommonInitializers(&item, properties);
2594 QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable);
2596 QTextStream(&parentPath) << varName << language::derefPointer <<
"item(" << r
2597 <<
", " << c <<
')';
2598 item.writeRetranslateUi(parentPath);
2599 m_output << m_indent << varName << language::derefPointer <<
"setItem("
2600 << r <<
", " << c <<
", " << itemName <<
')' << language::eol;
2603 enableSorting(w, varName, tempName);
2606QString
WriteInitialization::trCall(
const QString &str,
const QString &commentHint,
const QString &id)
const
2612 QTextStream ts(&result);
2615 if (m_option.translateFunction.isEmpty()) {
2616 if (idBasedTranslations || m_option
.idBased) {
2619 ts <<
"QCoreApplication" << language::qualifier <<
"translate("
2620 <<
'"' << m_generatedClass <<
"\", ";
2623 ts << m_option.translateFunction <<
'(';
2626 ts << language::charliteral(idBasedTranslations ? id : str, m_dindent);
2628 if (!idBasedTranslations && !m_option
.idBased) {
2630 if (commentHint.isEmpty())
2633 ts << language::charliteral(commentHint, m_dindent);
2642 const QString menuName = m_driver->findOrInsertWidget(w);
2643 const QString menuAction = menuName +
"Action"_L1;
2646 if (action && action->hasAttributeMenu()) {
2647 m_output << m_indent << menuAction <<
" = " << menuName
2648 << language::derefPointer <<
"menuAction()" << language::eol;
2654 QString value = defaultString;
2658 value = toString(str);
2659 comment = str->attributeComment();
2660 id = str->attributeId();
2662 return trCall(value, comment, id);
2667 QString value = defaultString;
2668 if (!str && defaultString.isEmpty())
2671 value = str->text();
2673 QTextStream ts(&ret);
2674 ts << language::qstring(value, m_dindent);
2678QString
WriteInitialization::autoTrCall(DomString *str,
const QString &defaultString)
const
2680 if ((!str && !defaultString.isEmpty()) || needsTranslation(str))
2681 return trCall(str, defaultString);
2682 return noTrCall(str, defaultString);
2687 if (
const DomString *str = property->elementString())
2688 return autoTrOutput(str);
2689 if (
const DomStringList *list = property->elementStringList())
2690 if (needsTranslation(list))
2691 return m_refreshOut;
2695QTextStream &
WriteInitialization::autoTrOutput(
const DomString *str,
const QString &defaultString)
2697 if ((!str && !defaultString.isEmpty()) || needsTranslation(str))
2698 return m_refreshOut;
2706 if (
const DomAction *action = m_driver->actionByName(name))
2707 return {m_driver->findOrInsertAction(action),
QStringLiteral(
"QAction")};
2708 if (
const DomButtonGroup *group = m_driver->findButtonGroup(name))
2709 return {m_driver->findOrInsertButtonGroup(group),
QStringLiteral(
"QButtonGroup")};
2727 static const QStringList requiresStringSyntax{
QStringLiteral(
"QAxWidget")};
2728 if (requiresStringSyntax.contains(sender.className)
2729 || requiresStringSyntax.contains(receiver.className)) {
2733 if ((sender.name == m_mainFormVarName && m_customSignals.contains(sender.signature))
2734 || (receiver.name == m_mainFormVarName && m_customSlots.contains(receiver.signature))) {
2738 return sender.signature.endsWith(
"()"_L1)
2739 || (!isCustomWidget(sender.className) && !isCustomWidget(receiver.className))
2745 const QString senderName = connection->elementSender();
2746 const QString receiverName = connection->elementReceiver();
2748 const auto senderDecl = findDeclaration(senderName);
2749 const auto receiverDecl = findDeclaration(receiverName);
2751 if (senderDecl.name.isEmpty() || receiverDecl.name.isEmpty()) {
2753 QTextStream(&message) << m_option.messagePrefix()
2754 <<
": Warning: Invalid signal/slot connection: \""
2755 << senderName <<
"\" -> \"" << receiverName <<
"\".";
2759 const QString senderSignature = connection->elementSignal();
2760 const QString slotSignature = connection->elementSlot();
2766 language::SignalSlotOptions signalOptions;
2768 language::SignalSlotOptions slotOptions;
2772 senderDecl.className, signalOptions};
2774 receiverDecl.className, slotOptions};
2776 m_output << m_indent;
2778 connectionSyntax(theSignal, theSlot));
2779 m_output << language::eol;
2784 if (directives.isEmpty())
2787 if (directives.size() == 1) {
2788 outputStream << language::openQtConfig(*directives.cbegin());
2792 auto list = directives.values();
2794 std::sort(list.begin(), list.end());
2797 for (qsizetype i = 1, size = list.size(); i < size; ++i)
2798 outputStream <<
" || " << language::qtConfig(list.at(i));
2799 outputStream << Qt::endl;
2804 if (directives.isEmpty())
2807 outputStream <<
"#endif" << Qt::endl;
2810WriteInitialization::Item::Item(
const QString &itemClassName,
const QString &indent, QTextStream &setupUiStream, QTextStream &retranslateUiStream,
Driver *driver)
2812 m_itemClassName(itemClassName),
2814 m_setupUiStream(setupUiStream),
2815 m_retranslateUiStream(retranslateUiStream),
2823 qDeleteAll(m_children);
2826QString
WriteInitialization::Item::writeSetupUi(
const QString &parent, Item::EmptyItemPolicy emptyItemPolicy)
2828 if (emptyItemPolicy == Item::DontConstruct && m_setupUiData.policy == ItemData::DontGenerate)
2831 bool generateMultiDirective =
false;
2832 if (emptyItemPolicy == Item::ConstructItemOnly && m_children.isEmpty()) {
2833 if (m_setupUiData.policy == ItemData::DontGenerate) {
2834 m_setupUiStream << m_indent << language::operatorNew << m_itemClassName
2835 <<
'(' << parent <<
')' << language::eol;
2838 if (m_setupUiData.policy == ItemData::GenerateWithMultiDirective)
2839 generateMultiDirective =
true;
2842 if (generateMultiDirective)
2843 generateMultiDirectiveBegin(m_setupUiStream, m_setupUiData.directives);
2845 const QString uniqueName = m_driver->unique(
"__"_L1 + m_itemClassName.toLower());
2846 m_setupUiStream << m_indent;
2847 if (language::language() == Language::Cpp)
2848 m_setupUiStream << m_itemClassName <<
" *";
2849 m_setupUiStream << uniqueName
2850 <<
" = " << language::operatorNew << m_itemClassName <<
'(' << parent
2851 <<
')' << language::eol;
2853 if (generateMultiDirective) {
2854 m_setupUiStream <<
"#else\n";
2855 m_setupUiStream << m_indent << language::operatorNew << m_itemClassName
2856 <<
'(' << parent <<
')' << language::eol;
2857 generateMultiDirectiveEnd(m_setupUiStream, m_setupUiData.directives);
2860 QMultiMap<QString, QString>::ConstIterator it = m_setupUiData.setters.constBegin();
2861 while (it != m_setupUiData.setters.constEnd()) {
2862 if (!it.key().isEmpty())
2863 m_setupUiStream << language::openQtConfig(it.key());
2864 m_setupUiStream << m_indent << uniqueName << it.value() << Qt::endl;
2865 if (!it.key().isEmpty())
2866 m_setupUiStream << language::closeQtConfig(it.key());
2869 for (Item *child : std::as_const(m_children))
2870 child->writeSetupUi(uniqueName);
2876 if (m_retranslateUiData.policy == ItemData::DontGenerate)
2879 if (m_retranslateUiData.policy == ItemData::GenerateWithMultiDirective)
2880 generateMultiDirectiveBegin(m_retranslateUiStream, m_retranslateUiData.directives);
2882 const QString uniqueName = m_driver->unique(
"___"_L1 + m_itemClassName.toLower());
2883 m_retranslateUiStream << m_indent;
2884 if (language::language() == Language::Cpp)
2885 m_retranslateUiStream << m_itemClassName <<
" *";
2886 m_retranslateUiStream << uniqueName <<
" = " << parentPath << language::eol;
2888 if (m_retranslateUiData.policy == ItemData::GenerateWithMultiDirective)
2889 generateMultiDirectiveEnd(m_retranslateUiStream, m_retranslateUiData.directives);
2891 QString oldDirective;
2892 QMultiMap<QString, QString>::ConstIterator it = m_retranslateUiData.setters.constBegin();
2893 while (it != m_retranslateUiData.setters.constEnd()) {
2894 const QString newDirective = it.key();
2895 if (oldDirective != newDirective) {
2896 if (!oldDirective.isEmpty())
2897 m_retranslateUiStream << language::closeQtConfig(oldDirective);
2898 if (!newDirective.isEmpty())
2899 m_retranslateUiStream << language::openQtConfig(newDirective);
2900 oldDirective = newDirective;
2902 m_retranslateUiStream << m_indent << uniqueName << it.value() << Qt::endl;
2905 if (!oldDirective.isEmpty())
2906 m_retranslateUiStream << language::closeQtConfig(oldDirective);
2908 for (
int i = 0; i < m_children.size(); i++) {
2911 m_children[i]->writeRetranslateUi(method);
2915void WriteInitialization::Item::addSetter(
const QString &setter,
const QString &directive,
bool translatable)
2919 m_retranslateUiData.setters.insert(directive, setter);
2920 if (ItemData::GenerateWithMultiDirective == newPolicy)
2921 m_retranslateUiData.directives << directive;
2922 if (m_retranslateUiData.policy < newPolicy)
2923 m_retranslateUiData.policy = newPolicy;
2925 m_setupUiData.setters.insert(directive, setter);
2926 if (ItemData::GenerateWithMultiDirective == newPolicy)
2927 m_setupUiData.directives << directive;
2928 if (m_setupUiData.policy < newPolicy)
2929 m_setupUiData.policy = newPolicy;
2935 m_children << child;
2936 child->m_parent =
this;
2941 p->m_setupUiData.directives |= c->m_setupUiData.directives;
2942 p->m_retranslateUiData.directives |= c->m_retranslateUiData.directives;
2943 if (p->m_setupUiData.policy < c->m_setupUiData.policy)
2944 p->m_setupUiData.policy = c->m_setupUiData.policy;
2945 if (p->m_retranslateUiData.policy < c->m_retranslateUiData.policy)
2946 p->m_retranslateUiData.policy = c->m_retranslateUiData.policy;
FontHandle(const DomFont *domFont)
int compare(const FontHandle &) const
int compare(const IconHandle &) const
IconHandle(const DomResourceIcon *domIcon)
SizePolicyHandle(const DomSizePolicy *domSizePolicy)
int compare(const SizePolicyHandle &) const
const DomAction * actionByName(const QString &attributeName) const
QString unique(const QString &instanceName=QString(), const QString &className=QString())
bool useIdBasedTranslations() const
QString findOrInsertWidget(const DomWidget *ui_widget)
const DomWidget * widgetByName(const QString &attributeName) const
QString findOrInsertActionGroup(const DomActionGroup *ui_group)
const DomButtonGroup * findButtonGroup(const QString &attributeName) const
QVersionNumber() noexcept
Produces a null version.
bool isButton(const QString &className) const
const DatabaseInfo * databaseInfo() const
const CustomWidgetsInfo * customWidgetsInfo() const
bool isMenu(const QString &className) const
bool isContainer(const QString &className) const
const Option & option() const
static QString whatsThisConfigKey()
static QString toolTipConfigKey()
static QString accessibilityConfigKey()
static QString statusTipConfigKey()
static QString shortcutConfigKey()
static void generateMultiDirectiveEnd(QTextStream &outputStream, const QSet< QString > &directives)
static QVersionNumber colorRoleVersionAdded(const QString &roleName)
static bool needsTranslation(const DomElement *element)
static void writeResourceIcon(QTextStream &output, const QString &iconName, const QString &indent, const DomResourceIcon *i)
static void generateMultiDirectiveBegin(QTextStream &outputStream, const QSet< QString > &directives)
static QString configKeyForProperty(const QString &propertyName)
static QString fontWeight(const DomFont *domFont)
static QString layoutAddMethod(DomLayoutItem::Kind kind, const QString &layoutClass)
static QString formLayoutRole(int column, int colspan)
static void writeIconAddPixmap(QTextStream &output, const QString &indent, const QString &iconName, const QString &call, const char *mode, const char *state)
static void writeContentsMargins(const QString &indent, const QString &objectName, int value, QTextStream &str)
static void writeIconAddFile(QTextStream &output, const QString &indent, const QString &iconName, const QString &fileName, const char *mode, const char *state)
Combined button and popup list for selecting options.
const QString & asString(const QString &s)
QString enumValue(const QString &value)
void formatConnection(QTextStream &str, const SignalSlot &sender, const SignalSlot &receiver, ConnectionSyntax connectionSyntax)
#define qPrintable(string)
#define QStringLiteral(str)
TemporaryVariableGeneratorPolicy
@ GenerateWithMultiDirective
void acceptCustomWidgets(DomCustomWidgets *node) override
void acceptActionGroup(DomActionGroup *node) override
void acceptSpacer(DomSpacer *node) override
void acceptLayoutItem(DomLayoutItem *node) override
void acceptTabStops(DomTabStops *tabStops) override
void acceptUI(DomUI *node) override
QList< DomProperty * > DomPropertyList
void acceptLayoutDefault(DomLayoutDefault *node) override
void acceptLayout(DomLayout *node) override
void acceptAction(DomAction *node) override
void acceptCustomWidget(DomCustomWidget *node) override
void acceptLayoutFunction(DomLayoutFunction *node) override
void acceptActionRef(DomActionRef *node) override
WriteInitialization(Uic *uic)
void acceptConnection(DomConnection *connection) override
QHash< QString, DomProperty * > DomPropertyMap
void acceptWidget(DomWidget *node) override
iconFromThemeStringLiteral(const QString &theme)
iconFromTheme(const QString &theme)
unsigned int forceMemberFnPtrConnectionSyntax
unsigned int forceStringConnectionSyntax
unsigned int autoConnection
virtual void acceptActionGroup(DomActionGroup *actionGroup)
virtual void acceptLayoutItem(DomLayoutItem *layoutItem)
virtual void acceptCustomWidgets(DomCustomWidgets *customWidgets)
virtual void acceptWidget(DomWidget *widget)
virtual void acceptConnections(DomConnections *connections)
virtual void acceptLayout(DomLayout *layout)