Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
cppwriteinitialization.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
5#include "customwidgetsinfo.h"
6#include "driver.h"
7#include "ui4.h"
8#include "utils.h"
9#include "uic.h"
10#include "databaseinfo.h"
11
12#include <language.h>
13
14#include <qtextstream.h>
15#include <qversionnumber.h>
16#include <qdebug.h>
17
18#include <algorithm>
19
20#include <ctype.h>
21
23
24using namespace Qt::StringLiterals;
25
26namespace {
27
28 // Expand "Horizontal", "Qt::Horizontal" to "Qt::Orientation::Horizontal"
29 QString expandEnum(QString value, const QString &prefix)
30 {
31 if (value.startsWith(prefix))
32 return value;
33 const auto pos = value.lastIndexOf("::"_L1);
34 if (pos == -1)
35 return prefix + "::"_L1 + value;
36 value.replace(0, pos, prefix);
37 return value;
38 }
39
40 inline QString expandSizePolicyEnum(const QString &value)
41 {
42 return expandEnum(value, "QSizePolicy::Policy"_L1);
43 }
44
45 inline QString expandToolBarArea(const QString &value)
46 {
47 return expandEnum(value, "Qt::ToolBarArea"_L1);
48 }
49
50 inline QString expandDockWidgetArea(const QString &value)
51 {
52 return expandEnum(value, "Qt::DockWidgetArea"_L1);
53 }
54
55 // figure out the toolbar area of a DOM attrib list.
56 // By legacy, it is stored as an integer. As of 4.3.0, it is the enumeration value.
57 QString toolBarAreaStringFromDOMAttributes(const CPP::WriteInitialization::DomPropertyMap &attributes) {
58 const DomProperty *pstyle = attributes.value("toolBarArea"_L1);
60 if (!pstyle)
61 return result;
62 switch (pstyle->kind()) {
64 result = language::toolbarArea(pstyle->elementNumber());
65 break;
67 result = pstyle->elementEnum();
68 break;
69 default:
70 break;
71 }
72 return expandToolBarArea(result) + ", "_L1;
73 }
74
75 // Write a statement to create a spacer item.
76 void writeSpacerItem(const DomSpacer *node, QTextStream &output) {
77 const QHash<QString, DomProperty *> properties = propertyMap(node->elementProperty());
78 output << language::operatorNew << "QSpacerItem(";
79
80 int w = 0;
81 int h = 0;
82 if (const DomProperty *sh = properties.value("sizeHint"_L1)) {
83 if (const DomSize *sizeHint = sh->elementSize()) {
84 w = sizeHint->elementWidth();
85 h = sizeHint->elementHeight();
86 }
87 }
88 output << w << ", " << h << ", ";
89
90 // size type
91 const DomProperty *st = properties.value("sizeType"_L1);
92 QString horizType = st != nullptr ? st->elementEnum() : "Expanding"_L1;
93 QString vertType = "Minimum"_L1;
94
95 // orientation
96 const DomProperty *o = properties.value("orientation"_L1);
97 if (o != nullptr && o->elementEnum().endsWith("Vertical"_L1))
98 std::swap(horizType, vertType);
99
100 output << language::enumValue(expandSizePolicyEnum(horizType)) << ", "
101 << language::enumValue(expandSizePolicyEnum(vertType)) << ')';
102 }
103
104
105 // Helper for implementing comparison functions for integers.
106 int compareInt(int i1, int i2) {
107 if (i1 < i2) return -1;
108 if (i1 > i2) return 1;
109 return 0;
110 }
111
112 // Write object->setFoo(x);
113 template <class Value>
114 void writeSetter(const QString &indent, const QString &varName,const QString &setter, Value v, QTextStream &str) {
115 str << indent << varName << language::derefPointer
116 << setter << '(' << v << ')' << language::eol;
117 }
118
119 static inline bool iconHasStatePixmaps(const DomResourceIcon *i) {
120 return i->hasElementNormalOff() || i->hasElementNormalOn() ||
121 i->hasElementDisabledOff() || i->hasElementDisabledOn() ||
122 i->hasElementActiveOff() || i->hasElementActiveOn() ||
123 i->hasElementSelectedOff() || i->hasElementSelectedOn();
124 }
125
126 static inline bool isIconFormat44(const DomResourceIcon *i) {
127 return iconHasStatePixmaps(i) || !i->attributeTheme().isEmpty();
128 }
129
130 // Check on properties. Filter out empty legacy pixmap/icon properties
131 // as Designer pre 4.4 used to remove missing resource references.
132 // This can no longer be handled by the code as we have 'setIcon(QIcon())' as well as 'QIcon icon'
133 static bool checkProperty(const CustomWidgetsInfo *customWidgetsInfo,
134 const QString &fileName, const QString &className,
135 const DomProperty *p) {
136 switch (p->kind()) {
137 // ### fixme Qt 7 remove this: Exclude deprecated properties of Qt 5.
138 case DomProperty::Set:
139 if (p->attributeName() == u"features"
140 && customWidgetsInfo->extends(className, "QDockWidget")
141 && p->elementSet() == u"QDockWidget::AllDockWidgetFeatures") {
142 const QString msg = fileName + ": Warning: Deprecated enum value QDockWidget::AllDockWidgetFeatures was encountered."_L1;
143 qWarning("%s", qPrintable(msg));
144 return false;
145 }
146 break;
148 if (p->attributeName() == u"sizeAdjustPolicy"
149 && customWidgetsInfo->extends(className, "QComboBox")
150 && p->elementEnum() == u"QComboBox::AdjustToMinimumContentsLength") {
151 const QString msg = fileName + ": Warning: Deprecated enum value QComboBox::AdjustToMinimumContentsLength was encountered."_L1;
152 qWarning("%s", qPrintable(msg));
153 return false;
154 }
155 break;
157 if (const DomResourceIcon *dri = p->elementIconSet()) {
158 if (!isIconFormat44(dri)) {
159 if (dri->text().isEmpty()) {
160 const QString msg = QString::fromLatin1("%1: Warning: An invalid icon property '%2' was encountered.")
161 .arg(fileName, p->attributeName());
162 qWarning("%s", qPrintable(msg));
163 return false;
164 }
165 }
166 }
167 break;
169 if (const DomResourcePixmap *drp = p->elementPixmap())
170 if (drp->text().isEmpty()) {
171 const QString msg = QString::fromUtf8("%1: Warning: An invalid pixmap property '%2' was encountered.")
172 .arg(fileName, p->attributeName());
173 qWarning("%s", qPrintable(msg));
174 return false;
175 }
176 break;
177 default:
178 break;
179 }
180 return true;
181 }
182}
183
184// QtGui
185static inline QString accessibilityConfigKey() { return QStringLiteral("accessibility"); }
186static inline QString shortcutConfigKey() { return QStringLiteral("shortcut"); }
187static inline QString whatsThisConfigKey() { return QStringLiteral("whatsthis"); }
188// QtWidgets
189static inline QString statusTipConfigKey() { return QStringLiteral("statustip"); }
190static inline QString toolTipConfigKey() { return QStringLiteral("tooltip"); }
191
192namespace CPP {
193
195 m_domFont(domFont)
196{
197}
198
199static QString fontWeight(const DomFont *domFont)
200{
201 if (domFont->hasElementFontWeight())
202 return domFont->elementFontWeight();
203 if (domFont->hasElementBold())
204 return domFont->elementBold() ? u"Bold"_s : u"Normal"_s;
205 return {};
206}
207
208int FontHandle::compare(const FontHandle &rhs) const
209{
210 const QString family = m_domFont->hasElementFamily() ? m_domFont->elementFamily() : QString();
211 const QString rhsFamily = rhs.m_domFont->hasElementFamily() ? rhs.m_domFont->elementFamily() : QString();
212
213 if (const int frc = family.compare(rhsFamily))
214 return frc;
215
216 const int pointSize = m_domFont->hasElementPointSize() ? m_domFont->elementPointSize() : -1;
217 const int rhsPointSize = rhs.m_domFont->hasElementPointSize() ? rhs.m_domFont->elementPointSize() : -1;
218
219 if (const int crc = compareInt(pointSize, rhsPointSize))
220 return crc;
221
222 const QString fontWeight = CPP::fontWeight(m_domFont);
223 const QString rhsFontWeight = CPP::fontWeight(rhs.m_domFont);
224 if (const int wrc = fontWeight.compare(rhsFontWeight))
225 return wrc;
226
227 const int italic = m_domFont->hasElementItalic() ? (m_domFont->elementItalic() ? 1 : 0) : -1;
228 const int rhsItalic = rhs.m_domFont->hasElementItalic() ? (rhs.m_domFont->elementItalic() ? 1 : 0) : -1;
229 if (const int crc = compareInt(italic, rhsItalic))
230 return crc;
231
232 const int underline = m_domFont->hasElementUnderline() ? (m_domFont->elementUnderline() ? 1 : 0) : -1;
233 const int rhsUnderline = rhs.m_domFont->hasElementUnderline() ? (rhs.m_domFont->elementUnderline() ? 1 : 0) : -1;
234 if (const int crc = compareInt(underline, rhsUnderline))
235 return crc;
236
237 const int strikeOut = m_domFont->hasElementStrikeOut() ? (m_domFont->elementStrikeOut() ? 1 : 0) : -1;
238 const int rhsStrikeOut = rhs.m_domFont->hasElementStrikeOut() ? (rhs.m_domFont->elementStrikeOut() ? 1 : 0) : -1;
239 if (const int crc = compareInt(strikeOut, rhsStrikeOut))
240 return crc;
241
242 const int kerning = m_domFont->hasElementKerning() ? (m_domFont->elementKerning() ? 1 : 0) : -1;
243 const int rhsKerning = rhs.m_domFont->hasElementKerning() ? (rhs.m_domFont->elementKerning() ? 1 : 0) : -1;
244 if (const int crc = compareInt(kerning, rhsKerning))
245 return crc;
246
247 const int antialiasing = m_domFont->hasElementAntialiasing() ? (m_domFont->elementAntialiasing() ? 1 : 0) : -1;
248 const int rhsAntialiasing = rhs.m_domFont->hasElementAntialiasing() ? (rhs.m_domFont->elementAntialiasing() ? 1 : 0) : -1;
249 if (const int crc = compareInt(antialiasing, rhsAntialiasing))
250 return crc;
251
252 const QString styleStrategy = m_domFont->hasElementStyleStrategy() ? m_domFont->elementStyleStrategy() : QString();
253 const QString rhsStyleStrategy = rhs.m_domFont->hasElementStyleStrategy() ? rhs.m_domFont->elementStyleStrategy() : QString();
254
255 if (const int src = styleStrategy.compare(rhsStyleStrategy))
256 return src;
257
258 const QString hintingPreference = m_domFont->hasElementHintingPreference()
259 ? m_domFont->elementHintingPreference() : QString();
260 const QString rhsHintingPreference = rhs.m_domFont->hasElementHintingPreference()
261 ? rhs.m_domFont->elementHintingPreference() : QString();
262 if (const int src = hintingPreference.compare(rhsHintingPreference))
263 return src;
264
265 return 0;
266}
267
269 m_domIcon(domIcon)
270{
271}
272
273int IconHandle::compare(const IconHandle &rhs) const
274{
275 if (const int comp = m_domIcon->attributeTheme().compare(rhs.m_domIcon->attributeTheme()))
276 return comp;
277
278 const QString normalOff = m_domIcon->hasElementNormalOff() ? m_domIcon->elementNormalOff()->text() : QString();
279 const QString rhsNormalOff = rhs.m_domIcon->hasElementNormalOff() ? rhs.m_domIcon->elementNormalOff()->text() : QString();
280 if (const int comp = normalOff.compare(rhsNormalOff))
281 return comp;
282
283 const QString normalOn = m_domIcon->hasElementNormalOn() ? m_domIcon->elementNormalOn()->text() : QString();
284 const QString rhsNormalOn = rhs.m_domIcon->hasElementNormalOn() ? rhs.m_domIcon->elementNormalOn()->text() : QString();
285 if (const int comp = normalOn.compare(rhsNormalOn))
286 return comp;
287
288 const QString disabledOff = m_domIcon->hasElementDisabledOff() ? m_domIcon->elementDisabledOff()->text() : QString();
289 const QString rhsDisabledOff = rhs.m_domIcon->hasElementDisabledOff() ? rhs.m_domIcon->elementDisabledOff()->text() : QString();
290 if (const int comp = disabledOff.compare(rhsDisabledOff))
291 return comp;
292
293 const QString disabledOn = m_domIcon->hasElementDisabledOn() ? m_domIcon->elementDisabledOn()->text() : QString();
294 const QString rhsDisabledOn = rhs.m_domIcon->hasElementDisabledOn() ? rhs.m_domIcon->elementDisabledOn()->text() : QString();
295 if (const int comp = disabledOn.compare(rhsDisabledOn))
296 return comp;
297
298 const QString activeOff = m_domIcon->hasElementActiveOff() ? m_domIcon->elementActiveOff()->text() : QString();
299 const QString rhsActiveOff = rhs.m_domIcon->hasElementActiveOff() ? rhs.m_domIcon->elementActiveOff()->text() : QString();
300 if (const int comp = activeOff.compare(rhsActiveOff))
301 return comp;
302
303 const QString activeOn = m_domIcon->hasElementActiveOn() ? m_domIcon->elementActiveOn()->text() : QString();
304 const QString rhsActiveOn = rhs.m_domIcon->hasElementActiveOn() ? rhs.m_domIcon->elementActiveOn()->text() : QString();
305 if (const int comp = activeOn.compare(rhsActiveOn))
306 return comp;
307
308 const QString selectedOff = m_domIcon->hasElementSelectedOff() ? m_domIcon->elementSelectedOff()->text() : QString();
309 const QString rhsSelectedOff = rhs.m_domIcon->hasElementSelectedOff() ? rhs.m_domIcon->elementSelectedOff()->text() : QString();
310 if (const int comp = selectedOff.compare(rhsSelectedOff))
311 return comp;
312
313 const QString selectedOn = m_domIcon->hasElementSelectedOn() ? m_domIcon->elementSelectedOn()->text() : QString();
314 const QString rhsSelectedOn = rhs.m_domIcon->hasElementSelectedOn() ? rhs.m_domIcon->elementSelectedOn()->text() : QString();
315 if (const int comp = selectedOn.compare(rhsSelectedOn))
316 return comp;
317 // Pre 4.4 Legacy
318 if (const int comp = m_domIcon->text().compare(rhs.m_domIcon->text()))
319 return comp;
320
321 return 0;
322}
323
325 m_domSizePolicy(domSizePolicy)
326{
327}
328
330{
331
332 const int hSizeType = m_domSizePolicy->hasElementHSizeType() ? m_domSizePolicy->elementHSizeType() : -1;
333 const int rhsHSizeType = rhs.m_domSizePolicy->hasElementHSizeType() ? rhs.m_domSizePolicy->elementHSizeType() : -1;
334 if (const int crc = compareInt(hSizeType, rhsHSizeType))
335 return crc;
336
337 const int vSizeType = m_domSizePolicy->hasElementVSizeType() ? m_domSizePolicy->elementVSizeType() : -1;
338 const int rhsVSizeType = rhs.m_domSizePolicy->hasElementVSizeType() ? rhs.m_domSizePolicy->elementVSizeType() : -1;
339 if (const int crc = compareInt(vSizeType, rhsVSizeType))
340 return crc;
341
342 const int hStretch = m_domSizePolicy->hasElementHorStretch() ? m_domSizePolicy->elementHorStretch() : -1;
343 const int rhsHStretch = rhs.m_domSizePolicy->hasElementHorStretch() ? rhs.m_domSizePolicy->elementHorStretch() : -1;
344 if (const int crc = compareInt(hStretch, rhsHStretch))
345 return crc;
346
347 const int vStretch = m_domSizePolicy->hasElementVerStretch() ? m_domSizePolicy->elementVerStretch() : -1;
348 const int rhsVStretch = rhs.m_domSizePolicy->hasElementVerStretch() ? rhs.m_domSizePolicy->elementVerStretch() : -1;
349 if (const int crc = compareInt(vStretch, rhsVStretch))
350 return crc;
351
352 const QString attributeHSizeType = m_domSizePolicy->hasAttributeHSizeType() ? m_domSizePolicy->attributeHSizeType() : QString();
353 const QString rhsAttributeHSizeType = rhs.m_domSizePolicy->hasAttributeHSizeType() ? rhs.m_domSizePolicy->attributeHSizeType() : QString();
354
355 if (const int hrc = attributeHSizeType.compare(rhsAttributeHSizeType))
356 return hrc;
357
358 const QString attributeVSizeType = m_domSizePolicy->hasAttributeVSizeType() ? m_domSizePolicy->attributeVSizeType() : QString();
359 const QString rhsAttributeVSizeType = rhs.m_domSizePolicy->hasAttributeVSizeType() ? rhs.m_domSizePolicy->attributeVSizeType() : QString();
360
361 return attributeVSizeType.compare(rhsAttributeVSizeType);
362}
363
364// --- WriteInitialization: LayoutDefaultHandler
365
366WriteInitialization::LayoutDefaultHandler::LayoutDefaultHandler()
367{
368 std::fill_n(m_state, int(NumProperties), 0u);
369 std::fill_n(m_defaultValues, int(NumProperties), 0);
370}
371
372
373
374void WriteInitialization::LayoutDefaultHandler::acceptLayoutDefault(DomLayoutDefault *node)
375{
376 if (!node)
377 return;
378 if (node->hasAttributeMargin()) {
379 m_state[Margin] |= HasDefaultValue;
380 m_defaultValues[Margin] = node->attributeMargin();
381 }
382 if (node->hasAttributeSpacing()) {
383 m_state[Spacing] |= HasDefaultValue;
384 m_defaultValues[Spacing] = node->attributeSpacing();
385 }
386}
387
388void WriteInitialization::LayoutDefaultHandler::acceptLayoutFunction(DomLayoutFunction *node)
389{
390 if (!node)
391 return;
392 if (node->hasAttributeMargin()) {
393 m_state[Margin] |= HasDefaultFunction;
394 m_functions[Margin] = node->attributeMargin();
395 m_functions[Margin] += "()"_L1;
396 }
397 if (node->hasAttributeSpacing()) {
398 m_state[Spacing] |= HasDefaultFunction;
399 m_functions[Spacing] = node->attributeSpacing();
400 m_functions[Spacing] += "()"_L1;
401 }
402}
403
404static inline void writeContentsMargins(const QString &indent, const QString &objectName, int value, QTextStream &str)
405{
406 QString contentsMargins;
407 QTextStream(&contentsMargins) << value << ", " << value << ", " << value << ", " << value;
408 writeSetter(indent, objectName, "setContentsMargins"_L1, contentsMargins, str);
409 }
410
411void WriteInitialization::LayoutDefaultHandler::writeProperty(int p, const QString &indent, const QString &objectName,
412 const DomPropertyMap &properties, const QString &propertyName, const QString &setter,
413 int defaultStyleValue, bool suppressDefault, QTextStream &str) const
414{
415 // User value
416 if (const DomProperty *prop = properties.value(propertyName)) {
417 const int value = prop->elementNumber();
418 // Emulate the pre 4.3 behaviour: The value form default value was only used to determine
419 // the default value, layout properties were always written
420 const bool useLayoutFunctionPre43 = !suppressDefault && (m_state[p] == (HasDefaultFunction|HasDefaultValue)) && value == m_defaultValues[p];
421 if (!useLayoutFunctionPre43) {
422 bool ifndefMac = (!(m_state[p] & (HasDefaultFunction|HasDefaultValue))
423 && value == defaultStyleValue);
424 if (ifndefMac)
425 str << "#ifndef Q_OS_MAC\n";
426 if (p == Margin) { // Use setContentsMargins for numeric values
427 writeContentsMargins(indent, objectName, value, str);
428 } else {
429 writeSetter(indent, objectName, setter, value, str);
430 }
431 if (ifndefMac)
432 str << "#endif\n";
433 return;
434 }
435 }
436 if (suppressDefault)
437 return;
438 // get default.
439 if (m_state[p] & HasDefaultFunction) {
440 // Do not use setContentsMargins to avoid repetitive evaluations.
441 writeSetter(indent, objectName, setter, m_functions[p], str);
442 return;
443 }
444 if (m_state[p] & HasDefaultValue) {
445 if (p == Margin) { // Use setContentsMargins for numeric values
446 writeContentsMargins(indent, objectName, m_defaultValues[p], str);
447 } else {
448 writeSetter(indent, objectName, setter, m_defaultValues[p], str);
449 }
450 }
451 return;
452}
453
454
455void WriteInitialization::LayoutDefaultHandler::writeProperties(const QString &indent, const QString &varName,
456 const DomPropertyMap &properties, int marginType,
457 bool suppressMarginDefault,
458 QTextStream &str) const {
459 // Write out properties and ignore the ones found in
460 // subsequent writing of the property list.
461 int defaultSpacing = marginType == WriteInitialization::Use43UiFile ? -1 : 6;
462 writeProperty(Spacing, indent, varName, properties, "spacing"_L1, "setSpacing"_L1,
463 defaultSpacing, false, str);
464 // We use 9 as TopLevelMargin, since Designer seem to always use 9.
465 static const int layoutmargins[4] = {-1, 9, 9, 0};
466 writeProperty(Margin, indent, varName, properties, "margin"_L1, "setMargin"_L1,
467 layoutmargins[marginType], suppressMarginDefault, str);
468}
469
470template <class DomElement> // (DomString, DomStringList)
471static bool needsTranslation(const DomElement *element)
472{
473 if (!element)
474 return false;
475 return !element->hasAttributeNotr() || !toBool(element->attributeNotr());
476}
477
478// --- WriteInitialization
480 m_uic(uic),
481 m_driver(uic->driver()), m_output(uic->output()), m_option(uic->option()),
482 m_indent(m_option.indent + m_option.indent),
483 m_dindent(m_indent + m_option.indent),
484 m_delayedOut(&m_delayedInitialization, QIODevice::WriteOnly),
485 m_refreshOut(&m_refreshInitialization, QIODevice::WriteOnly),
486 m_actionOut(&m_delayedActionInitialization, QIODevice::WriteOnly)
487{
488}
489
491{
492 m_actionGroupChain.push(nullptr);
493 m_widgetChain.push(nullptr);
494 m_layoutChain.push(nullptr);
495
497 m_connectSlotsByName = node->attributeConnectslotsbyname();
498
499 if (auto customSlots = node->elementSlots()) {
500 m_customSlots = customSlots->elementSlot();
501 m_customSignals = customSlots->elementSignal();
502 }
503
506
507 if (node->elementCustomWidgets())
509
510 if (m_option.generateImplemetation)
511 m_output << "#include <" << m_driver->headerFileName() << ">\n\n";
512
513 m_stdsetdef = true;
514 if (node->hasAttributeStdSetDef())
515 m_stdsetdef = node->attributeStdSetDef();
516
517 const QString className = node->elementClass() + m_option.postfix;
518 m_generatedClass = className;
519
520 const QString varName = m_driver->findOrInsertWidget(node->elementWidget());
521 m_mainFormVarName = varName;
522
523 const QString widgetClassName = node->elementWidget()->attributeClass();
524
525 const QString parameterType = widgetClassName + " *"_L1;
526 m_output << m_option.indent
527 << language::startFunctionDefinition1("setupUi", parameterType, varName, m_option.indent);
528
529 const QStringList connections = m_uic->databaseInfo()->connections();
530 for (const auto &connection : connections) {
531 if (connection == "(default)"_L1)
532 continue;
533
534 const QString varConn = connection + "Connection"_L1;
535 m_output << m_indent << varConn << " = QSqlDatabase::database("
536 << language::charliteral(connection, m_dindent) << ")" << language::eol;
537 }
538
540
541 if (!m_buddies.empty())
543 for (const Buddy &b : std::as_const(m_buddies)) {
544 const QString buddyVarName = m_driver->widgetVariableName(b.buddyAttributeName);
545 if (buddyVarName.isEmpty()) {
546 fprintf(stderr, "%s: Warning: Buddy assignment: '%s' is not a valid widget.\n",
547 qPrintable(m_option.messagePrefix()),
548 qPrintable(b.buddyAttributeName));
549 continue;
550 }
551
552 m_output << m_indent << b.labelVarName << language::derefPointer
553 << "setBuddy(" << buddyVarName << ')' << language::eol;
554 }
555 if (!m_buddies.empty())
557
558 if (node->elementTabStops())
560
561 if (!m_delayedActionInitialization.isEmpty())
562 m_output << "\n" << m_delayedActionInitialization;
563
564 m_output << "\n" << m_indent << language::self
565 << "retranslateUi(" << varName << ')' << language::eol;
566
567 if (node->elementConnections())
569
570 if (!m_delayedInitialization.isEmpty())
571 m_output << "\n" << m_delayedInitialization << "\n";
572
573 if (m_option.autoConnection && m_connectSlotsByName) {
574 m_output << "\n" << m_indent << "QMetaObject" << language::qualifier
575 << "connectSlotsByName(" << varName << ')' << language::eol;
576 }
577
578 m_output << m_option.indent << language::endFunctionDefinition("setupUi");
579
580 if (!m_mainFormUsedInRetranslateUi) {
582 // Mark varName as unused to avoid compiler warnings.
583 m_refreshInitialization += m_indent;
584 m_refreshInitialization += "(void)"_L1;
585 m_refreshInitialization += varName ;
586 m_refreshInitialization += language::eol;
587 } else if (language::language() == Language::Python) {
588 // output a 'pass' to have an empty function
589 m_refreshInitialization += m_indent;
590 m_refreshInitialization += "pass"_L1;
591 m_refreshInitialization += language::eol;
592 }
593 }
594
595 m_output << m_option.indent
596 << language::startFunctionDefinition1("retranslateUi", parameterType, varName, m_option.indent)
597 << m_refreshInitialization
598 << m_option.indent << language::endFunctionDefinition("retranslateUi");
599
600 m_layoutChain.pop();
601 m_widgetChain.pop();
602 m_actionGroupChain.pop();
603}
604
605void WriteInitialization::addWizardPage(const QString &pageVarName, const DomWidget *page, const QString &parentWidget)
606{
607 /* If the node has a (free-format) string "pageId" attribute (which could
608 * an integer or an enumeration value), use setPage(), else addPage(). */
609 QString id;
610 const auto &attributes = page->elementAttribute();
611 if (!attributes.empty()) {
612 for (const DomProperty *p : attributes) {
613 if (p->attributeName() == "pageId"_L1) {
614 if (const DomString *ds = p->elementString())
615 id = ds->text();
616 break;
617 }
618 }
619 }
620 if (id.isEmpty()) {
621 m_output << m_indent << parentWidget << language::derefPointer
622 << "addPage(" << pageVarName << ')' << language::eol;
623 } else {
624 m_output << m_indent << parentWidget << language::derefPointer
625 << "setPage(" << id << ", " << pageVarName << ')' << language::eol;
626 }
627}
628
630{
631 m_layoutMarginType = m_widgetChain.size() == 1 ? TopLevelMargin : ChildMargin;
632 const QString className = node->attributeClass();
633 const QString varName = m_driver->findOrInsertWidget(node);
634
635 QString parentWidget, parentClass;
636 if (m_widgetChain.top()) {
637 parentWidget = m_driver->findOrInsertWidget(m_widgetChain.top());
638 parentClass = m_widgetChain.top()->attributeClass();
639 }
640
641 const QString savedParentWidget = parentWidget;
642
643 if (m_uic->isContainer(parentClass))
644 parentWidget.clear();
645
646 const auto *cwi = m_uic->customWidgetsInfo();
647
648 if (m_widgetChain.size() != 1) {
649 m_output << m_indent << varName << " = " << language::operatorNew
650 << language::fixClassName(cwi->realClassName(className))
651 << '(' << parentWidget << ')' << language::eol;
652 }
653
654 parentWidget = savedParentWidget;
655
656
657 if (cwi->extends(className, "QComboBox")) {
658 initializeComboBox(node);
659 } else if (cwi->extends(className, "QListWidget")) {
660 initializeListWidget(node);
661 } else if (cwi->extends(className, "QTreeWidget")) {
662 initializeTreeWidget(node);
663 } else if (cwi->extends(className, "QTableWidget")) {
664 initializeTableWidget(node);
665 }
666
667 if (m_uic->isButton(className))
668 addButtonGroup(node, varName);
669
670 writeProperties(varName, className, node->elementProperty());
671
672 if (!parentWidget.isEmpty()
673 && cwi->extends(className, "QMenu")) {
674 initializeMenu(node, parentWidget);
675 }
676
677 if (node->elementLayout().isEmpty())
678 m_layoutChain.push(nullptr);
679
680 m_layoutWidget = false;
681 if (className == "QWidget"_L1 && !node->hasAttributeNative()) {
682 if (const DomWidget* parentWidget = m_widgetChain.top()) {
683 const QString parentClass = parentWidget->attributeClass();
684 if (parentClass != "QMainWindow"_L1
685 && !m_uic->customWidgetsInfo()->isCustomWidgetContainer(parentClass)
686 && !m_uic->isContainer(parentClass))
687 m_layoutWidget = true;
688 }
689 }
690 m_widgetChain.push(node);
691 m_layoutChain.push(nullptr);
693 m_layoutChain.pop();
694 m_widgetChain.pop();
695 m_layoutWidget = false;
696
697 const DomPropertyMap attributes = propertyMap(node->elementAttribute());
698
699 const QString pageDefaultString = u"Page"_s;
700
701 if (cwi->extends(parentClass, "QMainWindow")) {
702 if (cwi->extends(className, "QMenuBar")) {
703 m_output << m_indent << parentWidget << language::derefPointer
704 << "setMenuBar(" << varName << ')' << language::eol;
705 } else if (cwi->extends(className, "QToolBar")) {
706 m_output << m_indent << parentWidget << language::derefPointer << "addToolBar("
707 << language::enumValue(toolBarAreaStringFromDOMAttributes(attributes)) << varName
708 << ')' << language::eol;
709
710 if (const DomProperty *pbreak = attributes.value("toolBarBreak"_L1)) {
711 if (pbreak->elementBool() == "true"_L1) {
712 m_output << m_indent << parentWidget << language::derefPointer
713 << "insertToolBarBreak(" << varName << ')' << language::eol;
714 }
715 }
716
717 } else if (cwi->extends(className, "QDockWidget")) {
718 m_output << m_indent << parentWidget << language::derefPointer << "addDockWidget(";
719 if (DomProperty *pstyle = attributes.value("dockWidgetArea"_L1)) {
720 QString a = expandDockWidgetArea(language::dockWidgetArea(pstyle->elementNumber()));
721 m_output << language::enumValue(a) << ", ";
722 }
723 m_output << varName << ")" << language::eol;
724 } else if (m_uic->customWidgetsInfo()->extends(className, "QStatusBar")) {
725 m_output << m_indent << parentWidget << language::derefPointer
726 << "setStatusBar(" << varName << ')' << language::eol;
727 } else {
728 m_output << m_indent << parentWidget << language::derefPointer
729 << "setCentralWidget(" << varName << ')' << language::eol;
730 }
731 }
732
733 // Check for addPageMethod of a custom plugin first
734 QString addPageMethod = cwi->customWidgetAddPageMethod(parentClass);
735 if (addPageMethod.isEmpty())
736 addPageMethod = cwi->simpleContainerAddPageMethod(parentClass);
737 if (!addPageMethod.isEmpty()) {
738 m_output << m_indent << parentWidget << language::derefPointer
739 << addPageMethod << '(' << varName << ')' << language::eol;
740 } else if (m_uic->customWidgetsInfo()->extends(parentClass, "QWizard")) {
741 addWizardPage(varName, node, parentWidget);
742 } else if (m_uic->customWidgetsInfo()->extends(parentClass, "QToolBox")) {
743 const DomProperty *plabel = attributes.value("label"_L1);
744 DomString *plabelString = plabel ? plabel->elementString() : nullptr;
746 if (const DomProperty *picon = attributes.value("icon"_L1))
747 icon = ", "_L1 + iconCall(picon); // Side effect: Writes icon definition
748 m_output << m_indent << parentWidget << language::derefPointer << "addItem("
749 << varName << icon << ", " << noTrCall(plabelString, pageDefaultString)
750 << ')' << language::eol;
751
752 autoTrOutput(plabelString, pageDefaultString) << m_indent << parentWidget
753 << language::derefPointer << "setItemText(" << parentWidget
754 << language::derefPointer << "indexOf(" << varName << "), "
755 << autoTrCall(plabelString, pageDefaultString) << ')' << language::eol;
756
757 if (DomProperty *ptoolTip = attributes.value("toolTip"_L1)) {
758 autoTrOutput(ptoolTip->elementString())
760 << m_indent << parentWidget << language::derefPointer << "setItemToolTip(" << parentWidget
761 << language::derefPointer << "indexOf(" << varName << "), "
762 << autoTrCall(ptoolTip->elementString()) << ')' << language::eol
764 }
765 } else if (m_uic->customWidgetsInfo()->extends(parentClass, "QTabWidget")) {
766 const DomProperty *ptitle = attributes.value("title"_L1);
767 DomString *ptitleString = ptitle ? ptitle->elementString() : nullptr;
769 if (const DomProperty *picon = attributes.value("icon"_L1))
770 icon = ", "_L1 + iconCall(picon); // Side effect: Writes icon definition
771 m_output << m_indent << parentWidget << language::derefPointer << "addTab("
772 << varName << icon << ", " << language::emptyString << ')' << language::eol;
773
774 autoTrOutput(ptitleString, pageDefaultString) << m_indent << parentWidget
775 << language::derefPointer << "setTabText(" << parentWidget
776 << language::derefPointer << "indexOf(" << varName << "), "
777 << autoTrCall(ptitleString, pageDefaultString) << ')' << language::eol;
778
779 if (const DomProperty *ptoolTip = attributes.value("toolTip"_L1)) {
780 autoTrOutput(ptoolTip->elementString())
782 << m_indent << parentWidget << language::derefPointer << "setTabToolTip("
783 << parentWidget << language::derefPointer << "indexOf(" << varName
784 << "), " << autoTrCall(ptoolTip->elementString()) << ')' << language::eol
786 }
787 if (const DomProperty *pwhatsThis = attributes.value("whatsThis"_L1)) {
788 autoTrOutput(pwhatsThis->elementString())
790 << m_indent << parentWidget << language::derefPointer << "setTabWhatsThis("
791 << parentWidget << language::derefPointer << "indexOf(" << varName
792 << "), " << autoTrCall(pwhatsThis->elementString()) << ')' << language::eol
794 }
795 }
796
797 //
798 // Special handling for qtableview/qtreeview fake header attributes
799 //
800 static const QLatin1StringView realPropertyNames[] = {
801 "visible"_L1,
802 "cascadingSectionResizes"_L1,
803 "minimumSectionSize"_L1, // before defaultSectionSize
804 "defaultSectionSize"_L1,
805 "highlightSections"_L1,
806 "showSortIndicator"_L1,
807 "stretchLastSection"_L1,
808 };
809
810 static const QStringList trees = {
811 u"QTreeView"_s, u"QTreeWidget"_s
812 };
813 static const QStringList tables = {
814 u"QTableView"_s, u"QTableWidget"_s
815 };
816
817 if (cwi->extendsOneOf(className, trees)) {
818 DomPropertyList headerProperties;
819 for (auto realPropertyName : realPropertyNames) {
820 const QString fakePropertyName = "header"_L1
821 + QChar(realPropertyName.at(0)).toUpper() + realPropertyName.mid(1);
822 if (DomProperty *fakeProperty = attributes.value(fakePropertyName)) {
823 fakeProperty->setAttributeName(realPropertyName);
824 headerProperties << fakeProperty;
825 }
826 }
827 writeProperties(varName + language::derefPointer + "header()"_L1,
828 "QHeaderView"_L1, headerProperties,
829 WritePropertyIgnoreObjectName);
830
831 } else if (cwi->extendsOneOf(className, tables)) {
832 static const QLatin1StringView headerPrefixes[] = {
833 "horizontalHeader"_L1,
834 "verticalHeader"_L1,
835 };
836
837 for (auto headerPrefix : headerPrefixes) {
838 DomPropertyList headerProperties;
839 for (auto realPropertyName : realPropertyNames) {
840 const QString fakePropertyName = headerPrefix
841 + QChar(realPropertyName.at(0)).toUpper() + realPropertyName.mid(1);
842 if (DomProperty *fakeProperty = attributes.value(fakePropertyName)) {
843 fakeProperty->setAttributeName(realPropertyName);
844 headerProperties << fakeProperty;
845 }
846 }
847 const QString headerVar = varName + language::derefPointer
848 + headerPrefix + "()"_L1;
849 writeProperties(headerVar, "QHeaderView"_L1,
850 headerProperties, WritePropertyIgnoreObjectName);
851 }
852 }
853
854 if (node->elementLayout().isEmpty())
855 m_layoutChain.pop();
856
857 const QStringList zOrder = node->elementZOrder();
858 for (const QString &name : zOrder) {
859 const QString varName = m_driver->widgetVariableName(name);
860 if (varName.isEmpty()) {
861 fprintf(stderr, "%s: Warning: Z-order assignment: '%s' is not a valid widget.\n",
862 qPrintable(m_option.messagePrefix()),
863 name.toLatin1().data());
864 } else {
865 m_output << m_indent << varName << language::derefPointer
866 << (language::language() != Language::Python ? "raise()" : "raise_()") << language::eol;
867 }
868 }
869}
870
871void WriteInitialization::addButtonGroup(const DomWidget *buttonNode, const QString &varName)
872{
873 const DomPropertyMap attributes = propertyMap(buttonNode->elementAttribute());
874 // Look up the button group name as specified in the attribute and find the uniquified name
875 const DomProperty *prop = attributes.value("buttonGroup"_L1);
876 if (!prop)
877 return;
878 const QString attributeName = toString(prop->elementString());
879 const DomButtonGroup *group = m_driver->findButtonGroup(attributeName);
880 // Legacy feature: Create missing groups on the fly as the UIC button group feature
881 // was present before the actual Designer support (4.5)
882 const bool createGroupOnTheFly = group == nullptr;
883 if (createGroupOnTheFly) {
884 DomButtonGroup *newGroup = new DomButtonGroup;
885 newGroup->setAttributeName(attributeName);
886 group = newGroup;
887 fprintf(stderr, "%s: Warning: Creating button group `%s'\n",
888 qPrintable(m_option.messagePrefix()),
889 attributeName.toLatin1().data());
890 }
891 const QString groupName = m_driver->findOrInsertButtonGroup(group);
892 // Create on demand
893 if (!m_buttonGroups.contains(groupName)) {
894 const QString className = u"QButtonGroup"_s;
895 m_output << m_indent;
896 if (createGroupOnTheFly)
897 m_output << className << " *";
898 m_output << groupName << " = " << language::operatorNew
899 << className << '(' << m_mainFormVarName << ')' << language::eol;
900 m_buttonGroups.insert(groupName);
901 writeProperties(groupName, className, group->elementProperty());
902 }
903 m_output << m_indent << groupName << language::derefPointer << "addButton("
904 << varName << ')' << language::eol;
905}
906
908{
909 const QString className = node->attributeClass();
910 const QString varName = m_driver->findOrInsertLayout(node);
911
913 const bool oldLayoutProperties = properties.value("margin"_L1) != nullptr;
914
915 bool isGroupBox = false;
916
917 m_output << m_indent << varName << " = " << language::operatorNew << className << '(';
918
919 if (!m_layoutChain.top() && !isGroupBox)
920 m_output << m_driver->findOrInsertWidget(m_widgetChain.top());
921
922 m_output << ")" << language::eol;
923
924 // Suppress margin on a read child layout
925 const bool suppressMarginDefault = m_layoutChain.top();
926 int marginType = Use43UiFile;
927 if (oldLayoutProperties)
928 marginType = m_layoutMarginType;
929 m_LayoutDefaultHandler.writeProperties(m_indent, varName, properties, marginType, suppressMarginDefault, m_output);
930
931 m_layoutMarginType = SubLayoutMargin;
932
933 DomPropertyList propList = node->elementProperty();
934 DomPropertyList newPropList;
935 if (m_layoutWidget) {
936 bool left, top, right, bottom;
937 left = top = right = bottom = false;
938 for (const DomProperty *p : propList) {
939 const QString propertyName = p->attributeName();
940 if (propertyName == "leftMargin"_L1 && p->kind() == DomProperty::Number)
941 left = true;
942 else if (propertyName == "topMargin"_L1 && p->kind() == DomProperty::Number)
943 top = true;
944 else if (propertyName == "rightMargin"_L1 && p->kind() == DomProperty::Number)
945 right = true;
946 else if (propertyName == "bottomMargin"_L1 && p->kind() == DomProperty::Number)
947 bottom = true;
948 }
949 if (!left) {
950 DomProperty *p = new DomProperty();
951 p->setAttributeName("leftMargin"_L1);
952 p->setElementNumber(0);
953 newPropList.append(p);
954 }
955 if (!top) {
956 DomProperty *p = new DomProperty();
957 p->setAttributeName("topMargin"_L1);
958 p->setElementNumber(0);
959 newPropList.append(p);
960 }
961 if (!right) {
962 DomProperty *p = new DomProperty();
963 p->setAttributeName("rightMargin"_L1);
964 p->setElementNumber(0);
965 newPropList.append(p);
966 }
967 if (!bottom) {
968 DomProperty *p = new DomProperty();
969 p->setAttributeName("bottomMargin"_L1);
970 p->setElementNumber(0);
971 newPropList.append(p);
972 }
973 m_layoutWidget = false;
974 }
975
976 propList.append(newPropList);
977
978 writeProperties(varName, className, propList, WritePropertyIgnoreMargin|WritePropertyIgnoreSpacing);
979
980 // Clean up again:
981 propList.clear();
982 qDeleteAll(newPropList);
983 newPropList.clear();
984
985 m_layoutChain.push(node);
987 m_layoutChain.pop();
988
989 // Stretch? (Unless we are compiling for UIC3)
990 const QString numberNull(u'0');
991 writePropertyList(varName, "setStretch"_L1, node->attributeStretch(), numberNull);
992 writePropertyList(varName, "setRowStretch"_L1, node->attributeRowStretch(), numberNull);
993 writePropertyList(varName, "setColumnStretch"_L1, node->attributeColumnStretch(), numberNull);
994 writePropertyList(varName, "setColumnMinimumWidth"_L1, node->attributeColumnMinimumWidth(), numberNull);
995 writePropertyList(varName, "setRowMinimumHeight"_L1, node->attributeRowMinimumHeight(), numberNull);
996}
997
998// Apply a comma-separated list of values using a function "setSomething(int idx, value)"
999void WriteInitialization::writePropertyList(const QString &varName,
1000 const QString &setFunction,
1001 const QString &value,
1002 const QString &defaultValue)
1003{
1004 if (value.isEmpty())
1005 return;
1006 const QStringList list = value.split(u',');
1007 const int count = list.size();
1008 for (int i = 0; i < count; i++) {
1009 if (list.at(i) != defaultValue) {
1010 m_output << m_indent << varName << language::derefPointer << setFunction
1011 << '(' << i << ", " << list.at(i) << ')' << language::eol;
1012 }
1013 }
1014}
1015
1017{
1018 m_output << m_indent << m_driver->findOrInsertSpacer(node) << " = ";
1019 writeSpacerItem(node, m_output);
1020 m_output << language::eol;
1021}
1022
1023static inline QString formLayoutRole(int column, int colspan)
1024{
1025 if (colspan > 1)
1026 return "QFormLayout::SpanningRole"_L1;
1027 return column == 0 ? "QFormLayout::LabelRole"_L1 : "QFormLayout::FieldRole"_L1;
1028}
1029
1030static QString layoutAddMethod(DomLayoutItem::Kind kind, const QString &layoutClass)
1031{
1032 const auto methodPrefix = layoutClass == "QFormLayout"_L1 ? "set"_L1 : "add"_L1;
1033 switch (kind) {
1035 return methodPrefix + "Widget"_L1;
1037 return methodPrefix + "Layout"_L1;
1039 return methodPrefix + "Item"_L1;
1041 Q_ASSERT( false );
1042 break;
1043 }
1044 Q_UNREACHABLE();
1045}
1046
1048{
1050
1051 DomLayout *layout = m_layoutChain.top();
1052
1053 if (!layout)
1054 return;
1055
1056 const QString layoutName = m_driver->findOrInsertLayout(layout);
1057 const QString itemName = m_driver->findOrInsertLayoutItem(node);
1058
1059 m_output << "\n" << m_indent << layoutName << language::derefPointer << ""
1060 << layoutAddMethod(node->kind(), layout->attributeClass()) << '(';
1061
1062 if (layout->attributeClass() == "QGridLayout"_L1) {
1063 const int row = node->attributeRow();
1064 const int col = node->attributeColumn();
1065
1066 const int rowSpan = node->hasAttributeRowSpan() ? node->attributeRowSpan() : 1;
1067 const int colSpan = node->hasAttributeColSpan() ? node->attributeColSpan() : 1;
1068 m_output << itemName << ", " << row << ", " << col << ", " << rowSpan << ", " << colSpan;
1069 if (!node->attributeAlignment().isEmpty())
1070 m_output << ", " << language::enumValue(node->attributeAlignment());
1071 } else if (layout->attributeClass() == "QFormLayout"_L1) {
1072 const int row = node->attributeRow();
1073 const int colSpan = node->hasAttributeColSpan() ? node->attributeColSpan() : 1;
1074 const QString role = formLayoutRole(node->attributeColumn(), colSpan);
1075 m_output << row << ", " << language::enumValue(role) << ", " << itemName;
1076 } else {
1077 m_output << itemName;
1078 if (layout->attributeClass().contains("Box"_L1) && !node->attributeAlignment().isEmpty())
1079 m_output << ", 0, " << language::enumValue(node->attributeAlignment());
1080 }
1081 m_output << ")" << language::eol << "\n";
1082}
1083
1085{
1086 const QString actionName = m_driver->findOrInsertActionGroup(node);
1087 QString varName = m_driver->findOrInsertWidget(m_widgetChain.top());
1088
1089 if (m_actionGroupChain.top())
1090 varName = m_driver->findOrInsertActionGroup(m_actionGroupChain.top());
1091
1092 m_output << m_indent << actionName << " = " << language::operatorNew
1093 << "QActionGroup(" << varName << ")" << language::eol;
1094 writeProperties(actionName, "QActionGroup"_L1, node->elementProperty());
1095
1096 m_actionGroupChain.push(node);
1098 m_actionGroupChain.pop();
1099}
1100
1102{
1103 if (node->hasAttributeMenu())
1104 return;
1105
1106 const QString actionName = m_driver->findOrInsertAction(node);
1107 QString varName = m_driver->findOrInsertWidget(m_widgetChain.top());
1108
1109 if (m_actionGroupChain.top())
1110 varName = m_driver->findOrInsertActionGroup(m_actionGroupChain.top());
1111
1112 m_output << m_indent << actionName << " = " << language::operatorNew
1113 << "QAction(" << varName << ')' << language::eol;
1114 writeProperties(actionName, "QAction"_L1, node->elementProperty());
1115}
1116
1118{
1119 QString actionName = node->attributeName();
1120 if (actionName.isEmpty() || !m_widgetChain.top()
1121 || m_driver->actionGroupByName(actionName)) {
1122 return;
1123 }
1124
1125 const QString varName = m_driver->findOrInsertWidget(m_widgetChain.top());
1126
1127 if (m_widgetChain.top() && actionName == "separator"_L1) {
1128 // separator is always reserved!
1129 m_actionOut << m_indent << varName << language::derefPointer
1130 << "addSeparator()" << language::eol;
1131 return;
1132 }
1133
1134 const DomWidget *domWidget = m_driver->widgetByName(actionName);
1135 if (domWidget && m_uic->isMenu(domWidget->attributeClass())) {
1136 m_actionOut << m_indent << varName << language::derefPointer
1137 << "addAction(" << m_driver->findOrInsertWidget(domWidget)
1138 << language::derefPointer << "menuAction())" << language::eol;
1139 return;
1140 }
1141
1142 const DomAction *domAction = m_driver->actionByName(actionName);
1143 if (!domAction) {
1144 fprintf(stderr, "%s: Warning: action `%s' not declared\n",
1145 qPrintable(m_option.messagePrefix()), qPrintable(actionName));
1146 return;
1147 }
1148
1149 m_actionOut << m_indent << varName << language::derefPointer
1150 << "addAction(" << m_driver->findOrInsertAction(domAction)
1151 << ')' << language::eol;
1152}
1153
1154QString WriteInitialization::writeStringListProperty(const DomStringList *list) const
1155{
1156 QString propertyValue;
1157 QTextStream str(&propertyValue);
1158 char trailingDelimiter = '}';
1159 switch (language::language()) {
1160 case Language::Cpp:
1161 str << "QStringList{";
1162 break;
1163 case Language::Python:
1164 str << '[';
1165 trailingDelimiter = ']';
1166 break;
1167 }
1168 const QStringList values = list->elementString();
1169 if (!values.isEmpty()) {
1170 if (needsTranslation(list)) {
1171 const QString comment = list->attributeComment();
1172 const qsizetype last = values.size() - 1;
1173 for (qsizetype i = 0; i <= last; ++i) {
1174 str << '\n' << m_indent << " " << trCall(values.at(i), comment);
1175 if (i != last)
1176 str << ',';
1177 }
1178 } else {
1179 for (qsizetype i = 0; i < values.size(); ++i) {
1180 if (i)
1181 str << ", ";
1182 str << language::qstring(values.at(i), m_dindent);
1183 }
1184 }
1185 }
1186 str << trailingDelimiter;
1187 return propertyValue;
1188}
1189
1190static QString configKeyForProperty(const QString &propertyName)
1191{
1192 if (propertyName == "toolTip"_L1)
1193 return toolTipConfigKey();
1194 if (propertyName == "whatsThis"_L1)
1195 return whatsThisConfigKey();
1196 if (propertyName == "statusTip"_L1)
1197 return statusTipConfigKey();
1198 if (propertyName == "shortcut"_L1)
1199 return shortcutConfigKey();
1200 if (propertyName == "accessibleName"_L1 || propertyName == "accessibleDescription"_L1)
1201 return accessibilityConfigKey();
1202 return QString();
1203}
1204
1205void WriteInitialization::writeProperties(const QString &varName,
1206 const QString &className,
1207 const DomPropertyList &lst,
1208 unsigned flags)
1209{
1210 const bool isTopLevel = m_widgetChain.size() == 1;
1211
1212 if (m_uic->customWidgetsInfo()->extends(className, "QAxWidget")) {
1214 if (DomProperty *p = properties.value("control"_L1)) {
1215 m_output << m_indent << varName << language::derefPointer << "setControl("
1216 << language::qstring(toString(p->elementString()), m_dindent)
1217 << ')' << language::eol;
1218 }
1219 }
1220
1221 QString indent;
1222 if (!m_widgetChain.top()) {
1223 indent = m_option.indent;
1224 switch (language::language()) {
1225 case Language::Cpp:
1226 m_output << m_indent << "if (" << varName << "->objectName().isEmpty())\n";
1227 break;
1228 case Language::Python:
1229 m_output << m_indent << "if not " << varName << ".objectName():\n";
1230 break;
1231 }
1232 }
1233 if (!(flags & WritePropertyIgnoreObjectName)) {
1234 QString objectName = varName;
1235 if (!language::self.isEmpty() && objectName.startsWith(language::self))
1236 objectName.remove(0, language::self.size());
1237 m_output << m_indent << indent
1238 << varName << language::derefPointer << "setObjectName("
1239 << language::charliteral(objectName, m_dindent) << ')' << language::eol;
1240 }
1241
1242 int leftMargin, topMargin, rightMargin, bottomMargin;
1243 leftMargin = topMargin = rightMargin = bottomMargin = -1;
1244 bool frameShadowEncountered = false;
1245
1246 for (const DomProperty *p : lst) {
1247 if (!checkProperty(m_uic->customWidgetsInfo(), m_option.inputFile, className, p))
1248 continue;
1249 QString propertyName = p->attributeName();
1250 QString propertyValue;
1251 bool delayProperty = false;
1252
1253 // special case for the property `geometry': Do not use position
1254 if (isTopLevel && propertyName == "geometry"_L1 && p->elementRect()) {
1255 const DomRect *r = p->elementRect();
1256 m_output << m_indent << varName << language::derefPointer << "resize("
1257 << r->elementWidth() << ", " << r->elementHeight() << ')' << language::eol;
1258 continue;
1259 }
1260 if (propertyName == "currentRow"_L1 // QListWidget::currentRow
1261 && m_uic->customWidgetsInfo()->extends(className, "QListWidget")) {
1262 m_delayedOut << m_indent << varName << language::derefPointer
1263 << "setCurrentRow(" << p->elementNumber() << ')' << language::eol;
1264 continue;
1265 }
1266 static const QStringList currentIndexWidgets = {
1267 u"QComboBox"_s, u"QStackedWidget"_s,
1268 u"QTabWidget"_s, u"QToolBox"_s
1269 };
1270 if (propertyName == "currentIndex"_L1 // set currentIndex later
1271 && (m_uic->customWidgetsInfo()->extendsOneOf(className, currentIndexWidgets))) {
1272 m_delayedOut << m_indent << varName << language::derefPointer
1273 << "setCurrentIndex(" << p->elementNumber() << ')' << language::eol;
1274 continue;
1275 }
1276 if (propertyName == "tabSpacing"_L1
1277 && m_uic->customWidgetsInfo()->extends(className, "QToolBox")) {
1278 m_delayedOut << m_indent << varName << language::derefPointer
1279 << "layout()" << language::derefPointer << "setSpacing("
1280 << p->elementNumber() << ')' << language::eol;
1281 continue;
1282 }
1283 if (propertyName == "control"_L1 // ActiveQt support
1284 && m_uic->customWidgetsInfo()->extends(className, "QAxWidget")) {
1285 // already done ;)
1286 continue;
1287 }
1288 if (propertyName == "default"_L1
1289 && m_uic->customWidgetsInfo()->extends(className, "QPushButton")) {
1290 // QTBUG-44406: Setting of QPushButton::default needs to be delayed until the parent is set
1291 delayProperty = true;
1292 } else if (propertyName == "database"_L1
1293 && p->elementStringList()) {
1294 // Sql support
1295 continue;
1296 } else if (propertyName == "frameworkCode"_L1
1297 && p->kind() == DomProperty::Bool) {
1298 // Sql support
1299 continue;
1300 } else if (propertyName == "orientation"_L1
1301 && m_uic->customWidgetsInfo()->extends(className, "Line")) {
1302 // Line support
1303 QString shape = u"QFrame::Shape::HLine"_s;
1304 if (p->elementEnum().endsWith("::Vertical"_L1))
1305 shape = u"QFrame::Shape::VLine"_s;
1306
1307 m_output << m_indent << varName << language::derefPointer << "setFrameShape("
1308 << language::enumValue(shape) << ')' << language::eol;
1309 // QFrame Default is 'Plain'. Make the line 'Sunken' unless otherwise specified
1310 if (!frameShadowEncountered) {
1311 m_output << m_indent << varName << language::derefPointer
1312 << "setFrameShadow("
1313 << language::enumValue("QFrame::Shadow::Sunken"_L1)
1314 << ')' << language::eol;
1315 }
1316 continue;
1317 } else if ((flags & WritePropertyIgnoreMargin) && propertyName == "margin"_L1) {
1318 continue;
1319 } else if ((flags & WritePropertyIgnoreSpacing) && propertyName == "spacing"_L1) {
1320 continue;
1321 } else if (propertyName == "leftMargin"_L1 && p->kind() == DomProperty::Number) {
1322 leftMargin = p->elementNumber();
1323 continue;
1324 } else if (propertyName == "topMargin"_L1 && p->kind() == DomProperty::Number) {
1325 topMargin = p->elementNumber();
1326 continue;
1327 } else if (propertyName == "rightMargin"_L1 && p->kind() == DomProperty::Number) {
1328 rightMargin = p->elementNumber();
1329 continue;
1330 } else if (propertyName == "bottomMargin"_L1 && p->kind() == DomProperty::Number) {
1331 bottomMargin = p->elementNumber();
1332 continue;
1333 } else if (propertyName == "numDigits"_L1 // Deprecated in Qt 4, removed in Qt 5.
1334 && m_uic->customWidgetsInfo()->extends(className, "QLCDNumber")) {
1335 qWarning("Widget '%s': Deprecated property QLCDNumber::numDigits encountered. It has been replaced by QLCDNumber::digitCount.",
1336 qPrintable(varName));
1337 propertyName = "digitCount"_L1;
1338 } else if (propertyName == "frameShadow"_L1) {
1339 frameShadowEncountered = true;
1340 }
1341
1342 bool stdset = m_stdsetdef;
1343 if (p->hasAttributeStdset())
1344 stdset = p->attributeStdset();
1345
1347
1348 {
1350 if (stdset) {
1351 str << language::derefPointer <<"set" << propertyName.at(0).toUpper()
1352 << QStringView{propertyName}.mid(1) << '(';
1353 } else {
1354 str << language::derefPointer << "setProperty(\""_L1
1355 << propertyName << "\", ";
1357 str << "QVariant";
1358 if (p->kind() == DomProperty::Enum)
1359 str << "::fromValue";
1360 str << '(';
1361 }
1362 }
1363 } // QTextStream
1364
1365 QString varNewName = varName;
1366
1367 switch (p->kind()) {
1368 case DomProperty::Bool: {
1369 propertyValue = language::boolValue(p->elementBool() == language::cppTrue);
1370 break;
1371 }
1372 case DomProperty::Color:
1373 propertyValue = domColor2QString(p->elementColor());
1374 break;
1376 if (propertyName == "buddy"_L1 && m_uic->customWidgetsInfo()->extends(className, "QLabel")) {
1377 Buddy buddy = { varName, p->elementCstring() };
1378 m_buddies.append(std::move(buddy));
1379 } else {
1380 const bool useQByteArray = !stdset && language::language() == Language::Cpp;
1381 QTextStream str(&propertyValue);
1382 if (useQByteArray)
1383 str << "QByteArray(";
1384 str << language::charliteral(p->elementCstring(), m_dindent);
1385 if (useQByteArray)
1386 str << ')';
1387 }
1388 break;
1390 propertyValue = QString::fromLatin1("QCursor(static_cast<Qt::CursorShape>(%1))")
1391 .arg(p->elementCursor());
1392 break;
1394 if (p->hasAttributeStdset() && !p->attributeStdset())
1395 varNewName += language::derefPointer + "viewport()"_L1;
1396 propertyValue = "QCursor(Qt"_L1 + language::qualifier + "CursorShape"_L1
1397 + language::qualifier + p->elementCursorShape() + u')';
1398 break;
1399 case DomProperty::Enum:
1400 propertyValue = p->elementEnum();
1401 if (propertyValue.contains(language::cppQualifier))
1402 propertyValue = language::enumValue(propertyValue);
1403 else
1404 propertyValue.prepend(className + language::qualifier);
1405 break;
1406 case DomProperty::Set:
1407 propertyValue = language::enumValue(p->elementSet());
1408 break;
1409 case DomProperty::Font:
1410 propertyValue = writeFontProperties(p->elementFont());
1411 break;
1413 propertyValue = writeIconProperties(p->elementIconSet());
1414 break;
1416 propertyValue = pixCall(p);
1417 break;
1418 case DomProperty::Palette: {
1419 const DomPalette *pal = p->elementPalette();
1420 const QString paletteName = m_driver->unique("palette"_L1);
1421 m_output << m_indent << language::stackVariable("QPalette", paletteName)
1422 << language::eol;
1423 writeColorGroup(pal->elementActive(), "QPalette::Active"_L1, paletteName);
1424 writeColorGroup(pal->elementInactive(), "QPalette::Inactive"_L1, paletteName);
1425 writeColorGroup(pal->elementDisabled(), "QPalette::Disabled"_L1, paletteName);
1426
1427 propertyValue = paletteName;
1428 break;
1429 }
1430 case DomProperty::Point: {
1431 const DomPoint *po = p->elementPoint();
1432 propertyValue = QString::fromLatin1("QPoint(%1, %2)")
1433 .arg(po->elementX()).arg(po->elementY());
1434 break;
1435 }
1436 case DomProperty::PointF: {
1437 const DomPointF *pof = p->elementPointF();
1438 propertyValue = QString::fromLatin1("QPointF(%1, %2)")
1439 .arg(pof->elementX()).arg(pof->elementY());
1440 break;
1441 }
1442 case DomProperty::Rect: {
1443 const DomRect *r = p->elementRect();
1444 propertyValue = QString::fromLatin1("QRect(%1, %2, %3, %4)")
1445 .arg(r->elementX()).arg(r->elementY())
1446 .arg(r->elementWidth()).arg(r->elementHeight());
1447 break;
1448 }
1449 case DomProperty::RectF: {
1450 const DomRectF *rf = p->elementRectF();
1451 propertyValue = QString::fromLatin1("QRectF(%1, %2, %3, %4)")
1452 .arg(rf->elementX()).arg(rf->elementY())
1453 .arg(rf->elementWidth()).arg(rf->elementHeight());
1454 break;
1455 }
1456 case DomProperty::Locale: {
1457 const DomLocale *locale = p->elementLocale();
1458 QTextStream(&propertyValue) << "QLocale(QLocale" << language::qualifier
1459 << locale->attributeLanguage() << ", QLocale" << language::qualifier
1460 << locale->attributeCountry() << ')';
1461 break;
1462 }
1464 const QString spName = writeSizePolicy( p->elementSizePolicy());
1465 m_output << m_indent << spName << ".setHeightForWidth("
1466 << varName << language::derefPointer << "sizePolicy().hasHeightForWidth())"
1467 << language::eol;
1468
1469 propertyValue = spName;
1470 break;
1471 }
1472 case DomProperty::Size: {
1473 const DomSize *s = p->elementSize();
1474 propertyValue = QString::fromLatin1("QSize(%1, %2)")
1475 .arg(s->elementWidth()).arg(s->elementHeight());
1476 break;
1477 }
1478 case DomProperty::SizeF: {
1479 const DomSizeF *sf = p->elementSizeF();
1480 propertyValue = QString::fromLatin1("QSizeF(%1, %2)")
1481 .arg(sf->elementWidth()).arg(sf->elementHeight());
1482 break;
1483 }
1484 case DomProperty::String: {
1485 if (propertyName == "objectName"_L1) {
1486 const QString v = p->elementString()->text();
1487 if (v == varName)
1488 break;
1489
1490 // ### qWarning("Deprecated: the property `objectName' is different from the variable name");
1491 }
1492
1493 propertyValue = autoTrCall(p->elementString());
1494 break;
1495 }
1497 propertyValue = QString::number(p->elementNumber());
1498 break;
1499 case DomProperty::UInt:
1500 propertyValue = QString::number(p->elementUInt());
1501 propertyValue += u'u';
1502 break;
1504 propertyValue = "Q_INT64_C("_L1;
1505 propertyValue += QString::number(p->elementLongLong());
1506 propertyValue += u')';
1507 break;
1509 propertyValue = "Q_UINT64_C("_L1;
1510 propertyValue += QString::number(p->elementULongLong());
1511 propertyValue += u')';
1512 break;
1513 case DomProperty::Float:
1514 propertyValue = QString::number(p->elementFloat(), 'f', 8);
1515 break;
1517 propertyValue = QString::number(p->elementDouble(), 'f', 15);
1518 break;
1519 case DomProperty::Char: {
1520 const DomChar *c = p->elementChar();
1521 propertyValue = QString::fromLatin1("QChar(%1)")
1522 .arg(c->elementUnicode());
1523 break;
1524 }
1525 case DomProperty::Date: {
1526 const DomDate *d = p->elementDate();
1527 propertyValue = QString::fromLatin1("QDate(%1, %2, %3)")
1528 .arg(d->elementYear())
1529 .arg(d->elementMonth())
1530 .arg(d->elementDay());
1531 break;
1532 }
1533 case DomProperty::Time: {
1534 const DomTime *t = p->elementTime();
1535 propertyValue = QString::fromLatin1("QTime(%1, %2, %3)")
1536 .arg(t->elementHour())
1537 .arg(t->elementMinute())
1538 .arg(t->elementSecond());
1539 break;
1540 }
1541 case DomProperty::DateTime: {
1542 const DomDateTime *dt = p->elementDateTime();
1543 propertyValue = QString::fromLatin1("QDateTime(QDate(%1, %2, %3), QTime(%4, %5, %6))")
1544 .arg(dt->elementYear())
1545 .arg(dt->elementMonth())
1546 .arg(dt->elementDay())
1547 .arg(dt->elementHour())
1548 .arg(dt->elementMinute())
1549 .arg(dt->elementSecond());
1550 break;
1551 }
1553 propertyValue = writeStringListProperty(p->elementStringList());
1554 break;
1555
1556 case DomProperty::Url: {
1557 const DomUrl* u = p->elementUrl();
1558 QTextStream(&propertyValue) << "QUrl("
1559 << language::qstring(u->elementString()->text(), m_dindent) << ")";
1560 break;
1561 }
1562 case DomProperty::Brush:
1563 propertyValue = writeBrushInitialization(p->elementBrush());
1564 break;
1566 break;
1567 }
1568
1569 if (!propertyValue.isEmpty()) {
1570 const QString configKey = configKeyForProperty(propertyName);
1571
1572 QTextStream &o = delayProperty ? m_delayedOut : autoTrOutput(p);
1573
1574 if (!configKey.isEmpty())
1575 o << language::openQtConfig(configKey);
1576 o << m_indent << varNewName << setFunction << propertyValue;
1577 if (!stdset && language::language() == Language::Cpp)
1578 o << ')';
1579 o << ')' << language::eol;
1580 if (!configKey.isEmpty())
1581 o << language::closeQtConfig(configKey);
1582
1583 if (varName == m_mainFormVarName && &o == &m_refreshOut) {
1584 // this is the only place (currently) where we output mainForm name to the retranslateUi().
1585 // Other places output merely instances of a certain class (which cannot be main form, e.g. QListWidget).
1586 m_mainFormUsedInRetranslateUi = true;
1587 }
1588 }
1589 }
1590 if (leftMargin != -1 || topMargin != -1 || rightMargin != -1 || bottomMargin != -1) {
1591 m_output << m_indent << varName << language::derefPointer << "setContentsMargins("
1592 << leftMargin << ", " << topMargin << ", "
1593 << rightMargin << ", " << bottomMargin << ")" << language::eol;
1594 }
1595}
1596
1597QString WriteInitialization::writeSizePolicy(const DomSizePolicy *sp)
1598{
1599
1600 // check cache
1601 const SizePolicyHandle sizePolicyHandle(sp);
1602 const SizePolicyNameMap::const_iterator it = m_sizePolicyNameMap.constFind(sizePolicyHandle);
1603 if ( it != m_sizePolicyNameMap.constEnd()) {
1604 return it.value();
1605 }
1606
1607
1608 // insert with new name
1609 const QString spName = m_driver->unique("sizePolicy"_L1);
1610 m_sizePolicyNameMap.insert(sizePolicyHandle, spName);
1611
1612 m_output << m_indent << language::stackVariableWithInitParameters("QSizePolicy", spName);
1613 QString horizPolicy;
1614 QString vertPolicy;
1615 if (sp->hasElementHSizeType() && sp->hasElementVSizeType()) {
1616 horizPolicy = language::sizePolicy(sp->elementHSizeType());
1617 vertPolicy = language::sizePolicy(sp->elementVSizeType());
1618 } else if (sp->hasAttributeHSizeType() && sp->hasAttributeVSizeType()) {
1619 horizPolicy = sp->attributeHSizeType();
1620 vertPolicy = sp->attributeVSizeType();
1621 }
1622 if (!horizPolicy.isEmpty() && !vertPolicy.isEmpty()) {
1623 m_output << language::enumValue(expandSizePolicyEnum(horizPolicy))
1624 << ", " << language::enumValue(expandSizePolicyEnum(vertPolicy));
1625 }
1626 m_output << ')' << language::eol;
1627
1628 m_output << m_indent << spName << ".setHorizontalStretch("
1629 << sp->elementHorStretch() << ")" << language::eol;
1630 m_output << m_indent << spName << ".setVerticalStretch("
1631 << sp->elementVerStretch() << ")" << language::eol;
1632 return spName;
1633}
1634// Check for a font with the given properties in the FontPropertiesNameMap
1635// or create a new one. Returns the name.
1636
1637QString WriteInitialization::writeFontProperties(const DomFont *f)
1638{
1639 // check cache
1640 const FontHandle fontHandle(f);
1641 const FontPropertiesNameMap::const_iterator it = m_fontPropertiesNameMap.constFind(fontHandle);
1642 if ( it != m_fontPropertiesNameMap.constEnd()) {
1643 return it.value();
1644 }
1645
1646 // insert with new name
1647 const QString fontName = m_driver->unique("font"_L1);
1648 m_fontPropertiesNameMap.insert(FontHandle(f), fontName);
1649
1650 m_output << m_indent << language::stackVariable("QFont", fontName)
1651 << language::eol;
1652 if (f->hasElementFamily() && !f->elementFamily().isEmpty()) {
1653 m_output << m_indent << fontName << ".setFamilies("
1655 << language::qstring(f->elementFamily(), m_dindent)
1656 << language::listEnd << ')' << language::eol;
1657 }
1658 if (f->hasElementPointSize() && f->elementPointSize() > 0) {
1659 m_output << m_indent << fontName << ".setPointSize(" << f->elementPointSize()
1660 << ")" << language::eol;
1661 }
1662
1663 if (f->hasElementFontWeight()) {
1664 m_output << m_indent << fontName << ".setWeight(QFont"
1665 << language::qualifier << f->elementFontWeight() << ')' << language::eol;
1666 } else if (f->hasElementBold()) {
1667 m_output << m_indent << fontName << ".setBold("
1668 << language::boolValue(f->elementBold()) << ')' << language::eol;
1669 }
1670
1671 if (f->hasElementItalic()) {
1672 m_output << m_indent << fontName << ".setItalic("
1673 << language::boolValue(f->elementItalic()) << ')' << language::eol;
1674 }
1675 if (f->hasElementUnderline()) {
1676 m_output << m_indent << fontName << ".setUnderline("
1677 << language::boolValue(f->elementUnderline()) << ')' << language::eol;
1678 }
1679 if (f->hasElementStrikeOut()) {
1680 m_output << m_indent << fontName << ".setStrikeOut("
1681 << language::boolValue(f->elementStrikeOut()) << ')' << language::eol;
1682 }
1683 if (f->hasElementKerning()) {
1684 m_output << m_indent << fontName << ".setKerning("
1685 << language::boolValue(f->elementKerning()) << ')' << language::eol;
1686 }
1687 if (f->hasElementAntialiasing()) {
1688 m_output << m_indent << fontName << ".setStyleStrategy(QFont"
1690 << (f->elementAntialiasing() ? "PreferDefault" : "NoAntialias")
1691 << ')' << language::eol;
1692 }
1693 if (f->hasElementStyleStrategy()) {
1694 m_output << m_indent << fontName << ".setStyleStrategy(QFont"
1695 << language::qualifier << f->elementStyleStrategy() << ')' << language::eol;
1696 }
1697 if (f->hasElementHintingPreference()) {
1698 m_output << m_indent << fontName << ".setHintingPreference(QFont"
1699 << language::qualifier << f->elementHintingPreference() << ')' << language::eol;
1700 }
1701
1702 return fontName;
1703}
1704
1705static void writeIconAddFile(QTextStream &output, const QString &indent,
1706 const QString &iconName, const QString &fileName,
1707 const char *mode, const char *state)
1708{
1709 output << indent << iconName << ".addFile("
1710 << language::qstring(fileName, indent) << ", QSize(), QIcon"
1712 << ", QIcon" << language::qualifier << "State" << language::qualifier << state
1713 << ')' << language::eol;
1714}
1715
1716// Post 4.4 write resource icon
1718 const QString &iconName,
1719 const QString &indent,
1720 const DomResourceIcon *i)
1721{
1722 if (i->hasElementNormalOff()) {
1723 writeIconAddFile(output, indent, iconName, i->elementNormalOff()->text(),
1724 "Normal", "Off");
1725 }
1726 if (i->hasElementNormalOn()) {
1727 writeIconAddFile(output, indent, iconName, i->elementNormalOn()->text(),
1728 "Normal", "On");
1729 }
1730 if (i->hasElementDisabledOff()) {
1731 writeIconAddFile(output, indent, iconName, i->elementDisabledOff()->text(),
1732 "Disabled", "Off");
1733 }
1734 if (i->hasElementDisabledOn()) {
1735 writeIconAddFile(output, indent, iconName, i->elementDisabledOn()->text(),
1736 "Disabled", "On");
1737 }
1738 if (i->hasElementActiveOff()) {
1739 writeIconAddFile(output, indent, iconName, i->elementActiveOff()->text(),
1740 "Active", "Off");
1741 }
1742 if (i->hasElementActiveOn()) {
1743 writeIconAddFile(output, indent, iconName, i->elementActiveOn()->text(),
1744 "Active", "On");
1745 }
1746 if (i->hasElementSelectedOff()) {
1747 writeIconAddFile(output, indent, iconName, i->elementSelectedOff()->text(),
1748 "Selected", "Off");
1749 }
1750 if (i->hasElementSelectedOn()) {
1751 writeIconAddFile(output, indent, iconName, i->elementSelectedOn()->text(),
1752 "Selected", "On");
1753 }
1754}
1755
1756static void writeIconAddPixmap(QTextStream &output, const QString &indent,
1757 const QString &iconName, const QString &call,
1758 const char *mode, const char *state)
1759{
1760 output << indent << iconName << ".addPixmap(" << call << ", QIcon"
1762 << ", QIcon" << language::qualifier << "State" << language::qualifier
1763 << state << ')' << language::eol;
1764}
1765
1766void WriteInitialization::writePixmapFunctionIcon(QTextStream &output,
1767 const QString &iconName,
1768 const QString &indent,
1769 const DomResourceIcon *i) const
1770{
1771 if (i->hasElementNormalOff()) {
1772 writeIconAddPixmap(output, indent, iconName,
1773 pixCall("QPixmap"_L1, i->elementNormalOff()->text()),
1774 "Normal", "Off");
1775 }
1776 if (i->hasElementNormalOn()) {
1777 writeIconAddPixmap(output, indent, iconName,
1778 pixCall("QPixmap"_L1, i->elementNormalOn()->text()),
1779 "Normal", "On");
1780 }
1781 if (i->hasElementDisabledOff()) {
1782 writeIconAddPixmap(output, indent, iconName,
1783 pixCall("QPixmap"_L1, i->elementDisabledOff()->text()),
1784 "Disabled", "Off");
1785 }
1786 if (i->hasElementDisabledOn()) {
1787 writeIconAddPixmap(output, indent, iconName,
1788 pixCall("QPixmap"_L1, i->elementDisabledOn()->text()),
1789 "Disabled", "On");
1790 }
1791 if (i->hasElementActiveOff()) {
1792 writeIconAddPixmap(output, indent, iconName,
1793 pixCall("QPixmap"_L1, i->elementActiveOff()->text()),
1794 "Active", "Off");
1795 }
1796 if (i->hasElementActiveOn()) {
1797 writeIconAddPixmap(output, indent, iconName,
1798 pixCall("QPixmap"_L1, i->elementActiveOn()->text()),
1799 "Active", "On");
1800 }
1801 if (i->hasElementSelectedOff()) {
1802 writeIconAddPixmap(output, indent, iconName,
1803 pixCall("QPixmap"_L1, i->elementSelectedOff()->text()),
1804 "Selected", "Off");
1805 }
1806 if (i->hasElementSelectedOn()) {
1807 writeIconAddPixmap(output, indent, iconName,
1808 pixCall("QPixmap"_L1, i->elementSelectedOn()->text()),
1809 "Selected", "On");
1810 }
1811}
1812
1813// Write QIcon::fromTheme() (value from enum or variable)
1815{
1816 explicit iconFromTheme(const QString &theme) : m_theme(theme) {}
1817
1819};
1820
1822{
1823 str << "QIcon" << language::qualifier << "fromTheme(" << i.m_theme << ')';
1824 return str;
1825}
1826
1827// Write QIcon::fromTheme() for an XDG icon from string literal
1829{
1830 explicit iconFromThemeStringLiteral(const QString &theme) : m_theme(theme) {}
1831
1833};
1834
1836{
1837 str << "QIcon" << language::qualifier << "fromTheme(" << language::qstring(i.m_theme) << ')';
1838 return str;
1839}
1840
1841// Write QIcon::fromTheme() with a path as fallback, add a check using
1842// QIcon::hasThemeIcon().
1843void WriteInitialization::writeThemeIconCheckAssignment(const QString &themeValue,
1844 const QString &iconName,
1845 const DomResourceIcon *i)
1846
1847{
1848 const bool isCpp = language::language() == Language::Cpp;
1849 m_output << m_indent << "if ";
1850 if (isCpp)
1851 m_output << '(';
1852 m_output << "QIcon" << language::qualifier << "hasThemeIcon("
1853 << themeValue << ')' << (isCpp ? ") {" : ":") << '\n'
1854 << m_dindent << iconName << " = " << iconFromTheme(themeValue)
1855 << language::eol;
1856 m_output << m_indent << (isCpp ? "} else {" : "else:") << '\n';
1857 if (m_uic->pixmapFunction().isEmpty())
1858 writeResourceIcon(m_output, iconName, m_dindent, i);
1859 else
1860 writePixmapFunctionIcon(m_output, iconName, m_dindent, i);
1861 if (isCpp)
1862 m_output << m_indent << '}';
1863 m_output << '\n';
1864}
1865
1866QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
1867{
1868 // check cache
1869 const IconHandle iconHandle(i);
1870 const IconPropertiesNameMap::const_iterator it = m_iconPropertiesNameMap.constFind(iconHandle);
1871 if (it != m_iconPropertiesNameMap.constEnd())
1872 return it.value();
1873
1874 // insert with new name
1875 const QString iconName = m_driver->unique("icon"_L1);
1876 m_iconPropertiesNameMap.insert(IconHandle(i), iconName);
1877
1878 const bool isCpp = language::language() == Language::Cpp;
1879
1880 if (Q_UNLIKELY(!isIconFormat44(i))) { // pre-4.4 legacy
1881 m_output << m_indent;
1882 if (isCpp)
1883 m_output << "const QIcon ";
1884 m_output << iconName << " = " << pixCall("QIcon"_L1, i->text())
1885 << language::eol;
1886 return iconName;
1887 }
1888
1889 // 4.4 onwards
1890 QString theme = i->attributeTheme();
1891 if (theme.isEmpty()) {
1892 // No theme: Write resource icon as is
1893 m_output << m_indent << language::stackVariable("QIcon", iconName)
1894 << language::eol;
1895 if (m_uic->pixmapFunction().isEmpty())
1896 writeResourceIcon(m_output, iconName, m_indent, i);
1897 else
1898 writePixmapFunctionIcon(m_output, iconName, m_indent, i);
1899 return iconName;
1900 }
1901
1902 const bool isThemeEnum = theme.startsWith("QIcon::"_L1);
1903 if (isThemeEnum)
1904 theme = language::enumValue(theme);
1905
1906 // Theme: Generate code to check the theme and default to resource
1907 if (iconHasStatePixmaps(i)) {
1908 // Theme + default state pixmaps:
1909 // Generate code to check the theme and default to state pixmaps
1910 m_output << m_indent << language::stackVariable("QIcon", iconName) << language::eol;
1911 if (isThemeEnum) {
1912 writeThemeIconCheckAssignment(theme, iconName, i);
1913 return iconName;
1914 }
1915
1916 static constexpr auto themeNameStringVariableC = "iconThemeName"_L1;
1917 // Store theme name in a variable
1918 m_output << m_indent;
1919 if (m_firstThemeIcon) { // Declare variable string
1920 if (isCpp)
1921 m_output << "QString ";
1922 m_firstThemeIcon = false;
1923 }
1924 m_output << themeNameStringVariableC << " = "
1925 << language::qstring(theme) << language::eol;
1926 writeThemeIconCheckAssignment(themeNameStringVariableC, iconName, i);
1927 return iconName;
1928 }
1929
1930 // Theme, but no state pixmaps: Construct from theme directly.
1931 m_output << m_indent
1932 << language::stackVariableWithInitParameters("QIcon", iconName);
1933 if (isThemeEnum)
1934 m_output << iconFromTheme(theme);
1935 else
1936 m_output << iconFromThemeStringLiteral(theme);
1937 m_output << ')' << language::eol;
1938 return iconName;
1939}
1940
1941QString WriteInitialization::domColor2QString(const DomColor *c)
1942{
1943 if (c->hasAttributeAlpha())
1944 return QString::fromLatin1("QColor(%1, %2, %3, %4)")
1945 .arg(c->elementRed())
1946 .arg(c->elementGreen())
1947 .arg(c->elementBlue())
1948 .arg(c->attributeAlpha());
1949 return QString::fromLatin1("QColor(%1, %2, %3)")
1950 .arg(c->elementRed())
1951 .arg(c->elementGreen())
1952 .arg(c->elementBlue());
1953}
1954
1955static inline QVersionNumber colorRoleVersionAdded(const QString &roleName)
1956{
1957 if (roleName == "PlaceholderText"_L1)
1958 return QVersionNumber(5, 12, 0);
1959 return QVersionNumber();
1960}
1961
1962void WriteInitialization::writeColorGroup(DomColorGroup *colorGroup, const QString &group, const QString &paletteName)
1963{
1964 if (!colorGroup)
1965 return;
1966
1967 // old format
1968 const auto &colors = colorGroup->elementColor();
1969 for (int i=0; i<colors.size(); ++i) {
1970 const DomColor *color = colors.at(i);
1971
1972 m_output << m_indent << paletteName << ".setColor(" << group
1973 << ", QPalette" << language::qualifier << language::paletteColorRole(i)
1974 << ", " << domColor2QString(color)
1975 << ")" << language::eol;
1976 }
1977
1978 // new format
1979 const auto &colorRoles = colorGroup->elementColorRole();
1980 for (const DomColorRole *colorRole : colorRoles) {
1981 if (colorRole->hasAttributeRole()) {
1982 const QString roleName = colorRole->attributeRole();
1983 const QVersionNumber versionAdded = colorRoleVersionAdded(roleName);
1984 const QString brushName = writeBrushInitialization(colorRole->elementBrush());
1985 if (!versionAdded.isNull()) {
1986 m_output << "#if QT_VERSION >= QT_VERSION_CHECK("
1987 << versionAdded.majorVersion() << ", " << versionAdded.minorVersion()
1988 << ", " << versionAdded.microVersion() << ")\n";
1989 }
1990 m_output << m_indent << paletteName << ".setBrush("
1991 << language::enumValue(group) << ", "
1992 << "QPalette" << language::qualifier << roleName
1993 << ", " << brushName << ")" << language::eol;
1994 if (!versionAdded.isNull())
1995 m_output << "#endif\n";
1996 }
1997 }
1998}
1999
2000// Write initialization for brush unless it is found in the cache. Returns the name to use
2001// in an expression.
2002QString WriteInitialization::writeBrushInitialization(const DomBrush *brush)
2003{
2004 // Simple solid, colored brushes are cached
2005 const bool solidColoredBrush = !brush->hasAttributeBrushStyle() || brush->attributeBrushStyle() == "SolidPattern"_L1;
2006 uint rgb = 0;
2007 if (solidColoredBrush) {
2008 if (const DomColor *color = brush->elementColor()) {
2009 rgb = ((color->elementRed() & 0xFF) << 24) |
2010 ((color->elementGreen() & 0xFF) << 16) |
2011 ((color->elementBlue() & 0xFF) << 8) |
2012 ((color->attributeAlpha() & 0xFF));
2013 const ColorBrushHash::const_iterator cit = m_colorBrushHash.constFind(rgb);
2014 if (cit != m_colorBrushHash.constEnd())
2015 return cit.value();
2016 }
2017 }
2018 // Create and enter into cache if simple
2019 const QString brushName = m_driver->unique("brush"_L1);
2020 writeBrush(brush, brushName);
2021 if (solidColoredBrush)
2022 m_colorBrushHash.insert(rgb, brushName);
2023 return brushName;
2024}
2025
2026void WriteInitialization::writeBrush(const DomBrush *brush, const QString &brushName)
2027{
2028 QString style = u"SolidPattern"_s;
2029 if (brush->hasAttributeBrushStyle())
2030 style = brush->attributeBrushStyle();
2031
2032 if (style == "LinearGradientPattern"_L1 ||
2033 style == "RadialGradientPattern"_L1 ||
2034 style == "ConicalGradientPattern"_L1) {
2035 const DomGradient *gradient = brush->elementGradient();
2036 const QString gradientType = gradient->attributeType();
2037 const QString gradientName = m_driver->unique("gradient"_L1);
2038 if (gradientType == "LinearGradient"_L1) {
2039 m_output << m_indent
2040 << language::stackVariableWithInitParameters("QLinearGradient", gradientName)
2041 << gradient->attributeStartX()
2042 << ", " << gradient->attributeStartY()
2043 << ", " << gradient->attributeEndX()
2044 << ", " << gradient->attributeEndY() << ')' << language::eol;
2045 } else if (gradientType == "RadialGradient"_L1) {
2046 m_output << m_indent
2047 << language::stackVariableWithInitParameters("QRadialGradient", gradientName)
2048 << gradient->attributeCentralX()
2049 << ", " << gradient->attributeCentralY()
2050 << ", " << gradient->attributeRadius()
2051 << ", " << gradient->attributeFocalX()
2052 << ", " << gradient->attributeFocalY() << ')' << language::eol;
2053 } else if (gradientType == "ConicalGradient"_L1) {
2054 m_output << m_indent
2055 << language::stackVariableWithInitParameters("QConicalGradient", gradientName)
2056 << gradient->attributeCentralX()
2057 << ", " << gradient->attributeCentralY()
2058 << ", " << gradient->attributeAngle() << ')' << language::eol;
2059 }
2060
2061 m_output << m_indent << gradientName << ".setSpread(QGradient"
2062 << language::qualifier << gradient->attributeSpread()
2063 << ')' << language::eol;
2064
2065 if (gradient->hasAttributeCoordinateMode()) {
2066 m_output << m_indent << gradientName << ".setCoordinateMode(QGradient"
2068 << ')' << language::eol;
2069 }
2070
2071 const auto &stops = gradient->elementGradientStop();
2072 for (const DomGradientStop *stop : stops) {
2073 const DomColor *color = stop->elementColor();
2074 m_output << m_indent << gradientName << ".setColorAt("
2075 << stop->attributePosition() << ", "
2076 << domColor2QString(color) << ')' << language::eol;
2077 }
2078 m_output << m_indent
2079 << language::stackVariableWithInitParameters("QBrush", brushName)
2080 << gradientName << ')' << language::eol;
2081 } else if (style == "TexturePattern"_L1) {
2082 const DomProperty *property = brush->elementTexture();
2083 const QString iconValue = iconCall(property);
2084
2085 m_output << m_indent
2086 << language::stackVariableWithInitParameters("QBrush", brushName)
2087 << iconValue << ')' << language::eol;
2088 } else {
2089 const DomColor *color = brush->elementColor();
2090 m_output << m_indent
2091 << language::stackVariableWithInitParameters("QBrush", brushName)
2092 << domColor2QString(color) << ')' << language::eol;
2093
2094 m_output << m_indent << brushName << ".setStyle("
2095 << language::qtQualifier << style << ')' << language::eol;
2096 }
2097}
2098
2103
2108
2110{
2111 QString lastName;
2112
2113 const QStringList l = tabStops->elementTabStop();
2114 for (int i=0; i<l.size(); ++i) {
2115 const QString name = m_driver->widgetVariableName(l.at(i));
2116
2117 if (name.isEmpty()) {
2118 fprintf(stderr, "%s: Warning: Tab-stop assignment: '%s' is not a valid widget.\n",
2119 qPrintable(m_option.messagePrefix()), qPrintable(l.at(i)));
2120 continue;
2121 }
2122
2123 if (i == 0) {
2124 lastName = name;
2125 continue;
2126 }
2127 if (name.isEmpty() || lastName.isEmpty())
2128 continue;
2129
2130 m_output << m_indent << "QWidget" << language::qualifier << "setTabOrder("
2131 << lastName << ", " << name << ')' << language::eol;
2132
2133 lastName = name;
2134 }
2135}
2136
2137QString WriteInitialization::iconCall(const DomProperty *icon)
2138{
2139 if (icon->kind() == DomProperty::IconSet)
2140 return writeIconProperties(icon->elementIconSet());
2141 return pixCall(icon);
2142}
2143
2144QString WriteInitialization::pixCall(const DomProperty *p) const
2145{
2147 QString s;
2148 switch (p->kind()) {
2150 type = "QIcon"_L1;
2151 s = p->elementIconSet()->text();
2152 break;
2154 type = "QPixmap"_L1;
2155 s = p->elementPixmap()->text();
2156 break;
2157 default:
2158 qWarning("%s: Warning: Unknown icon format encountered. The ui-file was generated with a too-recent version of Qt Widgets Designer.",
2159 qPrintable(m_option.messagePrefix()));
2160 return "QIcon()"_L1;
2161 break;
2162 }
2163 return pixCall(type, s);
2164}
2165
2166QString WriteInitialization::pixCall(QLatin1StringView t, const QString &text) const
2167{
2168 if (text.isEmpty())
2169 return t % "()"_L1;
2170
2173 str << t;
2174 str << '(';
2175 const QString pixFunc = m_uic->pixmapFunction();
2176 if (pixFunc.isEmpty())
2177 str << language::qstring(text, m_dindent);
2178 else
2179 str << pixFunc << '(' << language::charliteral(text, m_dindent) << ')';
2180 str << ')';
2181 return result;
2182}
2183
2184void WriteInitialization::initializeComboBox(DomWidget *w)
2185{
2186 const QString varName = m_driver->findOrInsertWidget(w);
2187
2188 const auto &items = w->elementItem();
2189
2190 if (items.isEmpty())
2191 return;
2192
2193 for (int i = 0; i < items.size(); ++i) {
2194 const DomItem *item = items.at(i);
2195 const DomPropertyMap properties = propertyMap(item->elementProperty());
2196 const DomProperty *text = properties.value("text"_L1);
2197 const DomProperty *icon = properties.value("icon"_L1);
2198
2199 QString iconValue;
2200 if (icon)
2201 iconValue = iconCall(icon);
2202
2203 m_output << m_indent << varName << language::derefPointer << "addItem(";
2204 if (icon)
2205 m_output << iconValue << ", ";
2206
2207 if (needsTranslation(text->elementString())) {
2208 m_output << language::emptyString << ')' << language::eol;
2209 m_refreshOut << m_indent << varName << language::derefPointer
2210 << "setItemText(" << i << ", " << trCall(text->elementString())
2211 << ')' << language::eol;
2212 } else {
2213 m_output << noTrCall(text->elementString()) << ")" << language::eol;
2214 }
2215 }
2216 m_refreshOut << "\n";
2217}
2218
2219QString WriteInitialization::disableSorting(DomWidget *w, const QString &varName)
2220{
2221 // turn off sortingEnabled to force programmatic item order (setItem())
2222 QString tempName;
2223 if (!w->elementItem().isEmpty()) {
2224 tempName = m_driver->unique("__sortingEnabled"_L1);
2225 m_refreshOut << "\n";
2226 m_refreshOut << m_indent;
2228 m_refreshOut << "const bool ";
2229 m_refreshOut << tempName << " = " << varName << language::derefPointer
2230 << "isSortingEnabled()" << language::eol
2231 << m_indent << varName << language::derefPointer
2232 << "setSortingEnabled(" << language::boolValue(false) << ')' << language::eol;
2233 }
2234 return tempName;
2235}
2236
2237void WriteInitialization::enableSorting(DomWidget *w, const QString &varName, const QString &tempName)
2238{
2239 if (!w->elementItem().isEmpty()) {
2240 m_refreshOut << m_indent << varName << language::derefPointer
2241 << "setSortingEnabled(" << tempName << ')' << language::eol << '\n';
2242 }
2243}
2244
2245/*
2246 * Initializers are just strings containing the function call and need to be prepended
2247 * the line indentation and the object they are supposed to initialize.
2248 * String initializers come with a preprocessor conditional (ifdef), so the code
2249 * compiles with QT_NO_xxx. A null pointer means no conditional. String initializers
2250 * are written to the retranslateUi() function, others to setupUi().
2251 */
2252
2253
2260void WriteInitialization::addInitializer(Item *item,
2261 const QString &name, int column, const QString &value, const QString &directive, bool translatable) const
2262{
2263 if (!value.isEmpty()) {
2265 QTextStream str(&setter);
2266 str << language::derefPointer << "set" << name.at(0).toUpper() << QStringView{name}.mid(1) << '(';
2267 if (column >= 0)
2268 str << column << ", ";
2269 str << value << ");";
2270 item->addSetter(setter, directive, translatable);
2271 }
2272}
2273
2283void WriteInitialization::addStringInitializer(Item *item,
2284 const DomPropertyMap &properties, const QString &name, int column, const QString &directive) const
2285{
2286 if (const DomProperty *p = properties.value(name)) {
2287 DomString *str = p->elementString();
2289 if (!text.isEmpty()) {
2290 bool translatable = needsTranslation(str);
2291 QString value = autoTrCall(str);
2292 addInitializer(item, name, column, value, directive, translatable);
2293 }
2294 }
2295}
2296
2297void WriteInitialization::addBrushInitializer(Item *item,
2298 const DomPropertyMap &properties, const QString &name, int column)
2299{
2300 if (const DomProperty *p = properties.value(name)) {
2301 if (p->elementBrush())
2302 addInitializer(item, name, column, writeBrushInitialization(p->elementBrush()));
2303 else if (p->elementColor())
2304 addInitializer(item, name, column, domColor2QString(p->elementColor()));
2305 }
2306}
2307
2312void WriteInitialization::addQtFlagsInitializer(Item *item,
2313 const DomPropertyMap &properties, const QString &name, int column) const
2314{
2315 if (const DomProperty *p = properties.value(name)) {
2316 const QString orOperator = u'|' + language::qtQualifier;
2317 QString v = p->elementSet();
2318 if (!v.isEmpty()) {
2319 v.replace(u'|', orOperator);
2320 addInitializer(item, name, column, language::qtQualifier + v);
2321 }
2322 }
2323}
2324
2329void WriteInitialization::addQtEnumInitializer(Item *item,
2330 const DomPropertyMap &properties, const QString &name, int column) const
2331{
2332 if (const DomProperty *p = properties.value(name)) {
2333 QString v = p->elementEnum();
2334 if (!v.isEmpty())
2335 addInitializer(item, name, column, language::qtQualifier + v);
2336 }
2337}
2338
2342void WriteInitialization::addCommonInitializers(Item *item,
2343 const DomPropertyMap &properties, int column)
2344{
2345 if (const DomProperty *icon = properties.value("icon"_L1))
2346 addInitializer(item, "icon"_L1, column, iconCall(icon));
2347 addBrushInitializer(item, properties, "foreground"_L1, column);
2348 addBrushInitializer(item, properties, "background"_L1, column);
2349 if (const DomProperty *font = properties.value("font"_L1))
2350 addInitializer(item, "font"_L1, column, writeFontProperties(font->elementFont()));
2351 addQtFlagsInitializer(item, properties, "textAlignment"_L1, column);
2352 addQtEnumInitializer(item, properties, "checkState"_L1, column);
2353 addStringInitializer(item, properties, "text"_L1, column);
2354 addStringInitializer(item, properties, "toolTip"_L1, column,
2356 addStringInitializer(item, properties, "whatsThis"_L1, column,
2358 addStringInitializer(item, properties, "statusTip"_L1, column,
2360}
2361
2362void WriteInitialization::initializeListWidget(DomWidget *w)
2363{
2364 const QString varName = m_driver->findOrInsertWidget(w);
2365
2366 const auto &items = w->elementItem();
2367
2368 if (items.isEmpty())
2369 return;
2370
2371 QString tempName = disableSorting(w, varName);
2372 // items
2373 // TODO: the generated code should be data-driven to reduce its size
2374 for (int i = 0; i < items.size(); ++i) {
2375 const DomItem *domItem = items.at(i);
2376
2378
2379 Item item("QListWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2380 addQtFlagsInitializer(&item, properties, "flags"_L1);
2381 addCommonInitializers(&item, properties);
2382
2383 item.writeSetupUi(varName);
2384 QString parentPath;
2385 QTextStream(&parentPath) << varName << language::derefPointer << "item(" << i << ')';
2386 item.writeRetranslateUi(parentPath);
2387 }
2388 enableSorting(w, varName, tempName);
2389}
2390
2391void WriteInitialization::initializeTreeWidget(DomWidget *w)
2392{
2393 const QString varName = m_driver->findOrInsertWidget(w);
2394
2395 // columns
2396 Item item("QTreeWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2397
2398 const auto &columns = w->elementColumn();
2399 for (int i = 0; i < columns.size(); ++i) {
2400 const DomColumn *column = columns.at(i);
2401
2402 const DomPropertyMap properties = propertyMap(column->elementProperty());
2403 addCommonInitializers(&item, properties, i);
2404
2405 if (const DomProperty *p = properties.value("text"_L1)) {
2406 DomString *str = p->elementString();
2407 if (str && str->text().isEmpty()) {
2408 m_output << m_indent << varName << language::derefPointer
2409 << "headerItem()" << language::derefPointer << "setText("
2410 << i << ", " << language::emptyString << ')' << language::eol;
2411 }
2412 }
2413 }
2414 const QString itemName = item.writeSetupUi(QString(), Item::DontConstruct);
2415 item.writeRetranslateUi(varName + language::derefPointer + "headerItem()"_L1);
2416 if (!itemName.isNull()) {
2417 m_output << m_indent << varName << language::derefPointer
2418 << "setHeaderItem(" << itemName << ')' << language::eol;
2419 }
2420
2421 if (w->elementItem().empty())
2422 return;
2423
2424 QString tempName = disableSorting(w, varName);
2425
2426 const auto items = initializeTreeWidgetItems(w->elementItem());
2427 for (int i = 0; i < items.size(); i++) {
2428 Item *itm = items[i];
2429 itm->writeSetupUi(varName);
2430 QString parentPath;
2431 QTextStream(&parentPath) << varName << language::derefPointer << "topLevelItem(" << i << ')';
2432 itm->writeRetranslateUi(parentPath);
2433 delete itm;
2434 }
2435
2436 enableSorting(w, varName, tempName);
2437}
2438
2448WriteInitialization::Items WriteInitialization::initializeTreeWidgetItems(const QList<DomItem *> &domItems)
2449{
2450 // items
2451 Items items;
2452 const int numDomItems = domItems.size();
2453 items.reserve(numDomItems);
2454
2455 for (int i = 0; i < numDomItems; ++i) {
2456 const DomItem *domItem = domItems.at(i);
2457
2458 Item *item = new Item("QTreeWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2459 items << item;
2460
2461 QHash<QString, DomProperty *> map;
2462
2463 int col = -1;
2464 const DomPropertyList properties = domItem->elementProperty();
2465 for (DomProperty *p : properties) {
2466 if (p->attributeName() == "text"_L1) {
2467 if (!map.isEmpty()) {
2468 addCommonInitializers(item, map, col);
2469 map.clear();
2470 }
2471 col++;
2472 }
2473 map.insert(p->attributeName(), p);
2474 }
2475 addCommonInitializers(item, map, col);
2476 // AbstractFromBuilder saves flags last, so they always end up in the last column's map.
2477 addQtFlagsInitializer(item, map, "flags"_L1);
2478
2479 const auto subItems = initializeTreeWidgetItems(domItem->elementItem());
2480 for (Item *subItem : subItems)
2481 item->addChild(subItem);
2482 }
2483 return items;
2484}
2485
2486void WriteInitialization::initializeTableWidget(DomWidget *w)
2487{
2488 const QString varName = m_driver->findOrInsertWidget(w);
2489
2490 // columns
2491 const auto &columns = w->elementColumn();
2492
2493 if (!columns.empty()) {
2494 m_output << m_indent << "if (" << varName << language::derefPointer
2495 << "columnCount() < " << columns.size() << ')';
2497 m_output << ':';
2498 m_output << '\n' << m_dindent << varName << language::derefPointer << "setColumnCount("
2499 << columns.size() << ')' << language::eol;
2500 }
2501
2502 for (int i = 0; i < columns.size(); ++i) {
2503 const DomColumn *column = columns.at(i);
2504 if (!column->elementProperty().isEmpty()) {
2505 const DomPropertyMap properties = propertyMap(column->elementProperty());
2506
2507 Item item("QTableWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2508 addCommonInitializers(&item, properties);
2509
2510 QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable);
2511 QString parentPath;
2512 QTextStream(&parentPath) << varName << language::derefPointer
2513 << "horizontalHeaderItem(" << i << ')';
2514 item.writeRetranslateUi(parentPath);
2515 m_output << m_indent << varName << language::derefPointer << "setHorizontalHeaderItem("
2516 << i << ", " << itemName << ')' << language::eol;
2517 }
2518 }
2519
2520 // rows
2521 const auto &rows = w->elementRow();
2522
2523 if (!rows.isEmpty()) {
2524 m_output << m_indent << "if (" << varName << language::derefPointer
2525 << "rowCount() < " << rows.size() << ')';
2527 m_output << ':';
2528 m_output << '\n' << m_dindent << varName << language::derefPointer << "setRowCount("
2529 << rows.size() << ')' << language::eol;
2530 }
2531
2532 for (int i = 0; i < rows.size(); ++i) {
2533 const DomRow *row = rows.at(i);
2534 if (!row->elementProperty().isEmpty()) {
2535 const DomPropertyMap properties = propertyMap(row->elementProperty());
2536
2537 Item item("QTableWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2538 addCommonInitializers(&item, properties);
2539
2540 QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable);
2541 QString parentPath;
2542 QTextStream(&parentPath) << varName << language::derefPointer << "verticalHeaderItem(" << i << ')';
2543 item.writeRetranslateUi(parentPath);
2544 m_output << m_indent << varName << language::derefPointer << "setVerticalHeaderItem("
2545 << i << ", " << itemName << ')' << language::eol;
2546 }
2547 }
2548
2549 // items
2550 QString tempName = disableSorting(w, varName);
2551
2552 const auto &items = w->elementItem();
2553
2554 for (const DomItem *cell : items) {
2555 if (cell->hasAttributeRow() && cell->hasAttributeColumn() && !cell->elementProperty().isEmpty()) {
2556 const int r = cell->attributeRow();
2557 const int c = cell->attributeColumn();
2558 const DomPropertyMap properties = propertyMap(cell->elementProperty());
2559
2560 Item item("QTableWidgetItem"_L1, m_indent, m_output, m_refreshOut, m_driver);
2561 addQtFlagsInitializer(&item, properties, "flags"_L1);
2562 addCommonInitializers(&item, properties);
2563
2564 QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable);
2565 QString parentPath;
2566 QTextStream(&parentPath) << varName << language::derefPointer << "item(" << r
2567 << ", " << c << ')';
2568 item.writeRetranslateUi(parentPath);
2569 m_output << m_indent << varName << language::derefPointer << "setItem("
2570 << r << ", " << c << ", " << itemName << ')' << language::eol;
2571 }
2572 }
2573 enableSorting(w, varName, tempName);
2574}
2575
2576QString WriteInitialization::trCall(const QString &str, const QString &commentHint, const QString &id) const
2577{
2578 if (str.isEmpty())
2579 return language::emptyString;
2580
2582 QTextStream ts(&result);
2583
2584 const bool idBasedTranslations = m_driver->useIdBasedTranslations();
2585 if (m_option.translateFunction.isEmpty()) {
2586 if (idBasedTranslations || m_option.idBased) {
2587 ts << "qtTrId(";
2588 } else {
2589 ts << "QCoreApplication" << language::qualifier << "translate("
2590 << '"' << m_generatedClass << "\", ";
2591 }
2592 } else {
2593 ts << m_option.translateFunction << '(';
2594 }
2595
2596 ts << language::charliteral(idBasedTranslations ? id : str, m_dindent);
2597
2598 if (!idBasedTranslations && !m_option.idBased) {
2599 ts << ", ";
2600 if (commentHint.isEmpty())
2601 ts << language::nullPtr;
2602 else
2603 ts << language::charliteral(commentHint, m_dindent);
2604 }
2605
2606 ts << ')';
2607 return result;
2608}
2609
2610void WriteInitialization::initializeMenu(DomWidget *w, const QString &/*parentWidget*/)
2611{
2612 const QString menuName = m_driver->findOrInsertWidget(w);
2613 const QString menuAction = menuName + "Action"_L1;
2614
2615 const DomAction *action = m_driver->actionByName(menuAction);
2616 if (action && action->hasAttributeMenu()) {
2617 m_output << m_indent << menuAction << " = " << menuName
2618 << language::derefPointer << "menuAction()" << language::eol;
2619 }
2620}
2621
2622QString WriteInitialization::trCall(DomString *str, const QString &defaultString) const
2623{
2624 QString value = defaultString;
2625 QString comment;
2626 QString id;
2627 if (str) {
2628 value = toString(str);
2629 comment = str->attributeComment();
2630 id = str->attributeId();
2631 }
2632 return trCall(value, comment, id);
2633}
2634
2635QString WriteInitialization::noTrCall(DomString *str, const QString &defaultString) const
2636{
2637 QString value = defaultString;
2638 if (!str && defaultString.isEmpty())
2639 return QString();
2640 if (str)
2641 value = str->text();
2642 QString ret;
2643 QTextStream ts(&ret);
2644 ts << language::qstring(value, m_dindent);
2645 return ret;
2646}
2647
2648QString WriteInitialization::autoTrCall(DomString *str, const QString &defaultString) const
2649{
2650 if ((!str && !defaultString.isEmpty()) || needsTranslation(str))
2651 return trCall(str, defaultString);
2652 return noTrCall(str, defaultString);
2653}
2654
2655QTextStream &WriteInitialization::autoTrOutput(const DomProperty *property)
2656{
2657 if (const DomString *str = property->elementString())
2658 return autoTrOutput(str);
2659 if (const DomStringList *list = property->elementStringList())
2661 return m_refreshOut;
2662 return m_output;
2663}
2664
2665QTextStream &WriteInitialization::autoTrOutput(const DomString *str, const QString &defaultString)
2666{
2667 if ((!str && !defaultString.isEmpty()) || needsTranslation(str))
2668 return m_refreshOut;
2669 return m_output;
2670}
2671
2672WriteInitialization::Declaration WriteInitialization::findDeclaration(const QString &name)
2673{
2674 if (const DomWidget *widget = m_driver->widgetByName(name))
2675 return {m_driver->findOrInsertWidget(widget), widget->attributeClass()};
2676 if (const DomAction *action = m_driver->actionByName(name))
2677 return {m_driver->findOrInsertAction(action), QStringLiteral("QAction")};
2678 if (const DomButtonGroup *group = m_driver->findButtonGroup(name))
2679 return {m_driver->findOrInsertButtonGroup(group), QStringLiteral("QButtonGroup")};
2680 return {};
2681}
2682
2683bool WriteInitialization::isCustomWidget(const QString &className) const
2684{
2685 return m_uic->customWidgetsInfo()->customWidget(className) != nullptr;
2686}
2687
2688ConnectionSyntax WriteInitialization::connectionSyntax(const language::SignalSlot &sender,
2689 const language::SignalSlot &receiver) const
2690{
2693 if (m_option.forceStringConnectionSyntax)
2695 // Auto mode: Use Qt 5 connection syntax for Qt classes and parameterless
2696 // connections. QAxWidget is special though since it has a fake Meta object.
2697 static const QStringList requiresStringSyntax{QStringLiteral("QAxWidget")};
2698 if (requiresStringSyntax.contains(sender.className)
2699 || requiresStringSyntax.contains(receiver.className)) {
2701 }
2702
2703 if ((sender.name == m_mainFormVarName && m_customSignals.contains(sender.signature))
2704 || (receiver.name == m_mainFormVarName && m_customSlots.contains(receiver.signature))) {
2706 }
2707
2708 return sender.signature.endsWith("()"_L1)
2709 || (!isCustomWidget(sender.className) && !isCustomWidget(receiver.className))
2711}
2712
2714{
2715 const QString senderName = connection->elementSender();
2716 const QString receiverName = connection->elementReceiver();
2717
2718 const auto senderDecl = findDeclaration(senderName);
2719 const auto receiverDecl = findDeclaration(receiverName);
2720
2721 if (senderDecl.name.isEmpty() || receiverDecl.name.isEmpty()) {
2723 QTextStream(&message) << m_option.messagePrefix()
2724 << ": Warning: Invalid signal/slot connection: \""
2725 << senderName << "\" -> \"" << receiverName << "\".";
2726 fprintf(stderr, "%s\n", qPrintable(message));
2727 return;
2728 }
2729 const QString senderSignature = connection->elementSignal();
2730 const QString slotSignature = connection->elementSlot();
2731 const bool senderAmbiguous = m_uic->customWidgetsInfo()->isAmbiguousSignal(senderDecl.className,
2732 senderSignature);
2733 const bool slotAmbiguous = m_uic->customWidgetsInfo()->isAmbiguousSlot(receiverDecl.className,
2734 slotSignature);
2735
2736 language::SignalSlotOptions signalOptions;
2737 signalOptions.setFlag(language::SignalSlotOption::Ambiguous, senderAmbiguous);
2738 language::SignalSlotOptions slotOptions;
2739 slotOptions.setFlag(language::SignalSlotOption::Ambiguous, slotAmbiguous);
2740
2741 language::SignalSlot theSignal{senderDecl.name, senderSignature,
2742 senderDecl.className, signalOptions};
2743 language::SignalSlot theSlot{receiverDecl.name, slotSignature,
2744 receiverDecl.className, slotOptions};
2745
2746 m_output << m_indent;
2747 language::formatConnection(m_output, theSignal, theSlot,
2748 connectionSyntax(theSignal, theSlot));
2749 m_output << language::eol;
2750}
2751
2752static void generateMultiDirectiveBegin(QTextStream &outputStream, const QSet<QString> &directives)
2753{
2754 if (directives.isEmpty())
2755 return;
2756
2757 if (directives.size() == 1) {
2758 outputStream << language::openQtConfig(*directives.cbegin());
2759 return;
2760 }
2761
2762 auto list = directives.values();
2763 // sort (always generate in the same order):
2764 std::sort(list.begin(), list.end());
2765
2766 outputStream << "#if " << language::qtConfig(list.constFirst());
2767 for (int i = 1, size = list.size(); i < size; ++i)
2768 outputStream << " || " << language::qtConfig(list.at(i));
2769 outputStream << Qt::endl;
2770}
2771
2772static void generateMultiDirectiveEnd(QTextStream &outputStream, const QSet<QString> &directives)
2773{
2774 if (directives.isEmpty())
2775 return;
2776
2777 outputStream << "#endif" << Qt::endl;
2778}
2779
2780WriteInitialization::Item::Item(const QString &itemClassName, const QString &indent, QTextStream &setupUiStream, QTextStream &retranslateUiStream, Driver *driver)
2781 :
2782 m_itemClassName(itemClassName),
2783 m_indent(indent),
2784 m_setupUiStream(setupUiStream),
2785 m_retranslateUiStream(retranslateUiStream),
2786 m_driver(driver)
2787{
2788
2789}
2790
2791WriteInitialization::Item::~Item()
2792{
2793 qDeleteAll(m_children);
2794}
2795
2796QString WriteInitialization::Item::writeSetupUi(const QString &parent, Item::EmptyItemPolicy emptyItemPolicy)
2797{
2798 if (emptyItemPolicy == Item::DontConstruct && m_setupUiData.policy == ItemData::DontGenerate)
2799 return QString();
2800
2801 bool generateMultiDirective = false;
2802 if (emptyItemPolicy == Item::ConstructItemOnly && m_children.isEmpty()) {
2803 if (m_setupUiData.policy == ItemData::DontGenerate) {
2804 m_setupUiStream << m_indent << language::operatorNew << m_itemClassName
2805 << '(' << parent << ')' << language::eol;
2806 return QString();
2807 }
2808 if (m_setupUiData.policy == ItemData::GenerateWithMultiDirective)
2809 generateMultiDirective = true;
2810 }
2811
2812 if (generateMultiDirective)
2813 generateMultiDirectiveBegin(m_setupUiStream, m_setupUiData.directives);
2814
2815 const QString uniqueName = m_driver->unique("__"_L1 + m_itemClassName.toLower());
2816 m_setupUiStream << m_indent;
2818 m_setupUiStream << m_itemClassName << " *";
2819 m_setupUiStream << uniqueName
2820 << " = " << language::operatorNew << m_itemClassName << '(' << parent
2821 << ')' << language::eol;
2822
2823 if (generateMultiDirective) {
2824 m_setupUiStream << "#else\n";
2825 m_setupUiStream << m_indent << language::operatorNew << m_itemClassName
2826 << '(' << parent << ')' << language::eol;
2827 generateMultiDirectiveEnd(m_setupUiStream, m_setupUiData.directives);
2828 }
2829
2831 while (it != m_setupUiData.setters.constEnd()) {
2832 if (!it.key().isEmpty())
2833 m_setupUiStream << language::openQtConfig(it.key());
2834 m_setupUiStream << m_indent << uniqueName << it.value() << Qt::endl;
2835 if (!it.key().isEmpty())
2836 m_setupUiStream << language::closeQtConfig(it.key());
2837 ++it;
2838 }
2839 for (Item *child : std::as_const(m_children))
2840 child->writeSetupUi(uniqueName);
2841 return uniqueName;
2842}
2843
2844void WriteInitialization::Item::writeRetranslateUi(const QString &parentPath)
2845{
2846 if (m_retranslateUiData.policy == ItemData::DontGenerate)
2847 return;
2848
2849 if (m_retranslateUiData.policy == ItemData::GenerateWithMultiDirective)
2850 generateMultiDirectiveBegin(m_retranslateUiStream, m_retranslateUiData.directives);
2851
2852 const QString uniqueName = m_driver->unique("___"_L1 + m_itemClassName.toLower());
2853 m_retranslateUiStream << m_indent;
2855 m_retranslateUiStream << m_itemClassName << " *";
2856 m_retranslateUiStream << uniqueName << " = " << parentPath << language::eol;
2857
2858 if (m_retranslateUiData.policy == ItemData::GenerateWithMultiDirective)
2859 generateMultiDirectiveEnd(m_retranslateUiStream, m_retranslateUiData.directives);
2860
2861 QString oldDirective;
2862 QMultiMap<QString, QString>::ConstIterator it = m_retranslateUiData.setters.constBegin();
2863 while (it != m_retranslateUiData.setters.constEnd()) {
2864 const QString newDirective = it.key();
2865 if (oldDirective != newDirective) {
2866 if (!oldDirective.isEmpty())
2867 m_retranslateUiStream << language::closeQtConfig(oldDirective);
2868 if (!newDirective.isEmpty())
2869 m_retranslateUiStream << language::openQtConfig(newDirective);
2870 oldDirective = newDirective;
2871 }
2872 m_retranslateUiStream << m_indent << uniqueName << it.value() << Qt::endl;
2873 ++it;
2874 }
2875 if (!oldDirective.isEmpty())
2876 m_retranslateUiStream << language::closeQtConfig(oldDirective);
2877
2878 for (int i = 0; i < m_children.size(); i++) {
2880 QTextStream(&method) << uniqueName << language::derefPointer << "child(" << i << ')';
2881 m_children[i]->writeRetranslateUi(method);
2882 }
2883}
2884
2885void WriteInitialization::Item::addSetter(const QString &setter, const QString &directive, bool translatable)
2886{
2887 const ItemData::TemporaryVariableGeneratorPolicy newPolicy = directive.isNull() ? ItemData::Generate : ItemData::GenerateWithMultiDirective;
2888 if (translatable) {
2889 m_retranslateUiData.setters.insert(directive, setter);
2890 if (ItemData::GenerateWithMultiDirective == newPolicy)
2891 m_retranslateUiData.directives << directive;
2892 if (m_retranslateUiData.policy < newPolicy)
2893 m_retranslateUiData.policy = newPolicy;
2894 } else {
2895 m_setupUiData.setters.insert(directive, setter);
2896 if (ItemData::GenerateWithMultiDirective == newPolicy)
2897 m_setupUiData.directives << directive;
2898 if (m_setupUiData.policy < newPolicy)
2899 m_setupUiData.policy = newPolicy;
2900 }
2901}
2902
2903void WriteInitialization::Item::addChild(Item *child)
2904{
2905 m_children << child;
2906 child->m_parent = this;
2907
2908 Item *c = child;
2909 Item *p = this;
2910 while (p) {
2911 p->m_setupUiData.directives |= c->m_setupUiData.directives;
2912 p->m_retranslateUiData.directives |= c->m_retranslateUiData.directives;
2913 if (p->m_setupUiData.policy < c->m_setupUiData.policy)
2914 p->m_setupUiData.policy = c->m_setupUiData.policy;
2915 if (p->m_retranslateUiData.policy < c->m_retranslateUiData.policy)
2916 p->m_retranslateUiData.policy = c->m_retranslateUiData.policy;
2917 c = p;
2918 p = p->m_parent;
2919 }
2920}
2921
2922
2923} // namespace CPP
2924
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
bool isCustomWidgetContainer(const QString &className) const
bool isAmbiguousSlot(const QString &className, const QString &slotSignature) const
bool isAmbiguousSignal(const QString &className, const QString &signalSignature) const
bool extendsOneOf(const QString &className, const QStringList &baseClassNames) const
bool extends(const QString &className, QAnyStringView baseClassName) const
DomCustomWidget * customWidget(const QString &name) const
QStringList connections() const
QList< DomProperty * > elementProperty() const
Definition ui4.h:449
QString attributeName() const
Definition ui4.h:532
QList< DomProperty * > elementProperty() const
Definition ui4.h:496
bool hasAttributeMenu() const
Definition ui4.h:490
void setAttributeName(const QString &a)
Definition ui4.h:554
QList< DomColor * > elementColor() const
Definition ui4.h:1529
QList< DomColorRole * > elementColorRole() const
Definition ui4.h:1526
bool hasElementStrikeOut() const
Definition ui4.h:1630
bool hasElementItalic() const
Definition ui4.h:1615
bool elementKerning() const
Definition ui4.h:1643
bool elementUnderline() const
Definition ui4.h:1623
bool hasElementStyleStrategy() const
Definition ui4.h:1640
QString elementStyleStrategy() const
Definition ui4.h:1638
int elementPointSize() const
Definition ui4.h:1603
bool hasElementFamily() const
Definition ui4.h:1600
QString elementFamily() const
Definition ui4.h:1598
bool hasElementAntialiasing() const
Definition ui4.h:1635
bool hasElementUnderline() const
Definition ui4.h:1625
bool elementAntialiasing() const
Definition ui4.h:1633
bool elementStrikeOut() const
Definition ui4.h:1628
QString elementHintingPreference() const
Definition ui4.h:1648
bool hasElementKerning() const
Definition ui4.h:1645
bool elementItalic() const
Definition ui4.h:1613
bool hasElementPointSize() const
Definition ui4.h:1605
bool hasElementHintingPreference() const
Definition ui4.h:1650
QString attributeSpread() const
Definition ui4.h:1372
QString attributeType() const
Definition ui4.h:1367
double attributeCentralX() const
Definition ui4.h:1337
double attributeFocalY() const
Definition ui4.h:1352
double attributeEndY() const
Definition ui4.h:1332
double attributeFocalX() const
Definition ui4.h:1347
QList< DomGradientStop * > elementGradientStop() const
Definition ui4.h:1382
double attributeAngle() const
Definition ui4.h:1362
double attributeStartY() const
Definition ui4.h:1322
double attributeRadius() const
Definition ui4.h:1357
double attributeStartX() const
Definition ui4.h:1317
bool hasAttributeCoordinateMode() const
Definition ui4.h:1376
double attributeEndX() const
Definition ui4.h:1327
QString attributeCoordinateMode() const
Definition ui4.h:1377
double attributeCentralY() const
Definition ui4.h:1342
QList< DomProperty * > elementProperty() const
Definition ui4.h:1059
QList< DomItem * > elementItem() const
Definition ui4.h:1062
int attributeMargin() const
Definition ui4.h:756
bool hasAttributeMargin() const
Definition ui4.h:755
bool hasAttributeSpacing() const
Definition ui4.h:750
int attributeSpacing() const
Definition ui4.h:751
QString attributeSpacing() const
Definition ui4.h:780
QString attributeMargin() const
Definition ui4.h:785
bool hasAttributeMargin() const
Definition ui4.h:784
bool hasAttributeSpacing() const
Definition ui4.h:779
bool hasAttributeRowSpan() const
Definition ui4.h:933
Kind kind() const
Definition ui4.h:950
int attributeRowSpan() const
Definition ui4.h:934
QString attributeAlignment() const
Definition ui4.h:944
bool hasAttributeColSpan() const
Definition ui4.h:938
int attributeColumn() const
Definition ui4.h:929
int attributeColSpan() const
Definition ui4.h:939
int attributeRow() const
Definition ui4.h:924
QString attributeStretch() const
Definition ui4.h:843
QList< DomProperty * > elementProperty() const
Definition ui4.h:868
QString attributeColumnMinimumWidth() const
Definition ui4.h:863
QString attributeRowStretch() const
Definition ui4.h:848
QString attributeClass() const
Definition ui4.h:833
QString attributeRowMinimumHeight() const
Definition ui4.h:858
QString attributeColumnStretch() const
Definition ui4.h:853
DomColorGroup * elementDisabled() const
Definition ui4.h:1567
DomColorGroup * elementInactive() const
Definition ui4.h:1561
DomColorGroup * elementActive() const
Definition ui4.h:1555
DomString * elementString() const
Definition ui4.h:2532
@ LongLong
Definition ui4.h:2471
@ IconSet
Definition ui4.h:2471
@ DateTime
Definition ui4.h:2471
@ Palette
Definition ui4.h:2471
@ Cstring
Definition ui4.h:2471
@ StringList
Definition ui4.h:2471
@ ULongLong
Definition ui4.h:2471
@ CursorShape
Definition ui4.h:2471
@ Unknown
Definition ui4.h:2471
@ SizePolicy
Definition ui4.h:2471
bool hasElementSelectedOn() const
Definition ui4.h:2198
DomResourcePixmap * elementActiveOff() const
Definition ui4.h:2177
DomResourcePixmap * elementSelectedOn() const
Definition ui4.h:2195
bool hasElementActiveOff() const
Definition ui4.h:2180
DomResourcePixmap * elementDisabledOn() const
Definition ui4.h:2171
DomResourcePixmap * elementSelectedOff() const
Definition ui4.h:2189
bool hasElementDisabledOn() const
Definition ui4.h:2174
QString text() const
Definition ui4.h:2138
QString attributeTheme() const
Definition ui4.h:2143
DomResourcePixmap * elementDisabledOff() const
Definition ui4.h:2165
bool hasElementSelectedOff() const
Definition ui4.h:2192
bool hasElementDisabledOff() const
Definition ui4.h:2168
bool hasElementNormalOff() const
Definition ui4.h:2156
DomResourcePixmap * elementNormalOff() const
Definition ui4.h:2153
DomResourcePixmap * elementNormalOn() const
Definition ui4.h:2159
DomResourcePixmap * elementActiveOn() const
Definition ui4.h:2183
bool hasElementNormalOn() const
Definition ui4.h:2162
bool hasElementActiveOn() const
Definition ui4.h:2186
QString text() const
Definition ui4.h:2104
Definition ui4.h:990
QString attributeVSizeType() const
Definition ui4.h:1816
int elementHSizeType() const
Definition ui4.h:1821
int elementVerStretch() const
Definition ui4.h:1836
bool hasElementHSizeType() const
Definition ui4.h:1823
bool hasElementVerStretch() const
Definition ui4.h:1838
int elementVSizeType() const
Definition ui4.h:1826
bool hasElementVSizeType() const
Definition ui4.h:1828
bool hasAttributeHSizeType() const
Definition ui4.h:1810
int elementHorStretch() const
Definition ui4.h:1831
bool hasElementHorStretch() const
Definition ui4.h:1833
QString attributeHSizeType() const
Definition ui4.h:1811
bool hasAttributeVSizeType() const
Definition ui4.h:1815
QList< DomProperty * > elementProperty() const
Definition ui4.h:1204
QString text() const
Definition ui4.h:2243
QStringList elementTabStop() const
Definition ui4.h:808
Definition ui4.h:116
bool hasAttributeStdSetDef() const
Definition ui4.h:156
DomSlots * elementSlots() const
Definition ui4.h:241
DomLayoutFunction * elementLayoutFunction() const
Definition ui4.h:194
int attributeStdSetDef() const
Definition ui4.h:157
DomWidget * elementWidget() const
Definition ui4.h:182
QString elementClass() const
Definition ui4.h:177
DomLayoutDefault * elementLayoutDefault() const
Definition ui4.h:188
bool attributeConnectslotsbyname() const
Definition ui4.h:147
DomCustomWidgets * elementCustomWidgets() const
Definition ui4.h:205
DomTabStops * elementTabStops() const
Definition ui4.h:211
bool hasAttributeConnectslotsbyname() const
Definition ui4.h:146
DomConnections * elementConnections() const
Definition ui4.h:229
Definition ui4.h:2423
DomString * elementString() const
Definition ui4.h:2433
QStringList elementZOrder() const
Definition ui4.h:1143
QList< DomProperty * > elementAttribute() const
Definition ui4.h:1116
QList< DomLayout * > elementLayout() const
Definition ui4.h:1128
QList< DomProperty * > elementProperty() const
Definition ui4.h:1113
QString attributeClass() const
Definition ui4.h:1095
bool hasAttributeNative() const
Definition ui4.h:1104
const DomAction * actionByName(const QString &attributeName) const
Definition driver.cpp:305
QString widgetVariableName(const QString &attributeName) const
Definition driver.cpp:294
const DomActionGroup * actionGroupByName(const QString &attributeName) const
Definition driver.cpp:300
QString unique(const QString &instanceName=QString(), const QString &className=QString())
Definition driver.cpp:136
QString findOrInsertButtonGroup(const DomButtonGroup *ui_group)
Definition driver.cpp:110
bool useIdBasedTranslations() const
Definition driver.h:67
QString findOrInsertWidget(const DomWidget *ui_widget)
Definition driver.cpp:65
const DomWidget * widgetByName(const QString &attributeName) const
Definition driver.cpp:289
QString findOrInsertActionGroup(const DomActionGroup *ui_group)
Definition driver.cpp:100
static QString headerFileName(const QString &fileName)
Definition driver.cpp:196
QString findOrInsertLayoutItem(const DomLayoutItem *ui_layoutItem)
Definition driver.cpp:82
const DomButtonGroup * findButtonGroup(const QString &attributeName) const
Definition driver.cpp:116
QString findOrInsertAction(const DomAction *ui_action)
Definition driver.cpp:105
QString findOrInsertLayout(const DomLayout *ui_layout)
Definition driver.cpp:77
QString findOrInsertSpacer(const DomSpacer *ui_spacer)
Definition driver.cpp:72
Definition lalr.h:84
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
Definition qbytearray.h:611
\inmodule QtCore
\inmodule QtCore
Definition qhash.h:820
const_iterator constFind(const Key &key) const noexcept
Definition qhash.h:1299
const_iterator constEnd() const noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the ...
Definition qhash.h:1219
T value(const Key &key) const noexcept
Definition qhash.h:1054
friend class const_iterator
Definition qhash.h:1182
bool empty() const noexcept
This function is provided for STL compatibility.
Definition qhash.h:1349
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition qhash.h:1303
\inmodule QtCore \reentrant
Definition qiodevice.h:34
qsizetype size() const noexcept
Definition qlist.h:397
bool isEmpty() const noexcept
Definition qlist.h:401
bool empty() const noexcept
Definition qlist.h:685
iterator end()
Definition qlist.h:626
const_reference at(qsizetype i) const noexcept
Definition qlist.h:446
iterator begin()
Definition qlist.h:625
const T & constFirst() const noexcept
Definition qlist.h:647
void reserve(qsizetype size)
Definition qlist.h:753
void append(parameter_type t)
Definition qlist.h:458
iterator insert(const Key &key, const T &value)
Definition qmap.h:688
const_iterator constFind(const Key &key) const
Definition qmap.h:655
void clear()
Definition qmap.h:289
bool isEmpty() const
Definition qmap.h:269
const_iterator constEnd() const
Definition qmap.h:604
bool isEmpty() const
Definition qset.h:52
const_iterator constBegin() const noexcept
Definition qset.h:139
const_iterator constEnd() const noexcept
Definition qset.h:143
bool contains(const T &value) const
Definition qset.h:71
iterator insert(const T &value)
Definition qset.h:155
T & top()
Returns a reference to the stack's top item.
Definition qstack.h:19
T pop()
Removes the top item from the stack and returns it.
Definition qstack.h:18
void push(const T &t)
Adds element t to the top of the stack.
Definition qstack.h:17
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:78
constexpr QStringView mid(qsizetype pos, qsizetype n=-1) const noexcept
Returns the substring of length length starting at position start in this object.
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QByteArray toLatin1() const &
Definition qstring.h:630
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
Definition qstring.cpp:5455
QString & replace(qsizetype i, qsizetype len, QChar after)
Definition qstring.cpp:3824
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5871
QString mid(qsizetype position, qsizetype n=-1) const &
Definition qstring.cpp:5300
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
void clear()
Clears the contents of the string and makes it null.
Definition qstring.h:1252
bool isNull() const
Returns true if this string is null; otherwise returns false.
Definition qstring.h:994
qsizetype size() const noexcept
Returns the number of characters in this string.
Definition qstring.h:186
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:6018
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
Definition qstring.h:1226
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
Definition qstring.cpp:5506
int compare(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition qstring.cpp:6664
bool contains(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition qstring.h:1369
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:8084
QString & remove(qsizetype i, qsizetype len)
Removes n characters from the string, starting at the given position index, and returns a reference t...
Definition qstring.cpp:3466
QString & prepend(QChar c)
Definition qstring.h:478
\inmodule QtCore
\inmodule QtCore
Definition uic.h:30
bool isButton(const QString &className) const
Definition uic.cpp:292
QString pixmapFunction() const
Definition uic.h:47
const DatabaseInfo * databaseInfo() const
Definition uic.h:53
const CustomWidgetsInfo * customWidgetsInfo() const
Definition uic.h:56
bool isMenu(const QString &className) const
Definition uic.cpp:314
bool isContainer(const QString &className) const
Definition uic.cpp:302
static QString whatsThisConfigKey()
static QString toolTipConfigKey()
static QString accessibilityConfigKey()
static QString statusTipConfigKey()
static QString shortcutConfigKey()
QOpenGLWidget * widget
[1]
QString str
[2]
QMap< QString, QString > map
[6]
QString text
type name READ getFunction WRITE setFunction
[0]
qDeleteAll(list.begin(), list.end())
QSet< QString >::iterator it
else opt state
[0]
ConnectionSyntax
Definition language.h:15
static void generateMultiDirectiveEnd(QTextStream &outputStream, const QSet< QString > &directives)
static QVersionNumber colorRoleVersionAdded(const QString &roleName)
QTextStream & operator<<(QTextStream &str, const iconFromTheme &i)
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)
Q_QML_EXPORT QV4::ReturnedValue locale(QV4::ExecutionEngine *engine, const QString &localeName)
Provides locale specific properties and formatted data.
QString uniqueName(const QString &key, const QStyleOption *option, const QSize &size, qreal dpr)
Combined button and popup list for selecting options.
void setter(QUntypedPropertyData *d, const void *value)
QTextStream & endl(QTextStream &stream)
Writes '\n' to the stream and flushes the stream.
Definition brush.cpp:5
QString self
Definition language.cpp:58
_stackVariable< true > stackVariableWithInitParameters
Definition language.h:174
Language language()
Definition language.cpp:16
QString qtQualifier
Definition language.cpp:56
QString enumValue(const QString &value)
Definition language.cpp:506
QLatin1StringView dockWidgetArea(int v)
Definition language.cpp:139
char listStart
Definition language.cpp:52
QString emptyString
Definition language.cpp:60
QString nullPtr
Definition language.cpp:54
QLatin1StringView paletteColorRole(int v)
Definition language.cpp:153
_string< false > charliteral
Definition language.h:110
_string< true > qstring
Definition language.h:111
QString eol
Definition language.cpp:59
char listEnd
Definition language.cpp:53
QString qualifier
Definition language.cpp:57
QString fixClassName(QString className)
Definition language.cpp:103
QString cppTrue
Definition language.cpp:63
void formatConnection(QTextStream &str, const SignalSlot &sender, const SignalSlot &receiver, ConnectionSyntax connectionSyntax)
Definition language.cpp:459
QString cppQualifier
Definition language.cpp:62
_stackVariable< false > stackVariable
Definition language.h:173
QLatin1StringView toolbarArea(int v)
Definition language.cpp:110
QString operatorNew
Definition language.cpp:55
QLatin1StringView sizePolicy(int v)
Definition language.cpp:124
QString derefPointer
Definition language.cpp:51
QString boolValue(bool v)
Definition language.cpp:493
#define rgb(r, g, b)
Definition qcolor.cpp:124
#define Q_UNLIKELY(x)
static const QCssKnownValue properties[NumProperties - 1]
DBusConnection * connection
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
static int writeProperty(QObject *obj, const QByteArray &property_name, QVariant value, int propFlags=QDBusConnection::ExportAllProperties)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static QFixed kerning(int left, int right, const QFontEngine::KernPair *pairs, int numPairs)
#define qWarning
Definition qlogging.h:166
return ret
GLenum GLsizei GLsizei GLint * values
[15]
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLenum mode
GLfloat GLfloat GLfloat w
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLboolean r
[2]
GLenum GLuint id
[7]
GLdouble GLdouble GLdouble GLdouble top
GLenum GLenum GLsizei count
GLdouble GLdouble right
GLfloat GLfloat f
GLenum src
GLuint color
[2]
GLint left
GLenum type
GLboolean GLuint group
GLint GLint bottom
GLbitfield flags
GLuint GLsizei const GLchar * message
GLenum const void * fontName
GLuint name
GLfloat GLfloat GLfloat GLfloat h
GLenum GLenum GLsizei void GLsizei void * column
GLdouble s
[6]
Definition qopenglext.h:235
const GLubyte * c
GLdouble GLdouble t
Definition qopenglext.h:243
GLenum GLenum GLsizei void * row
GLuint64EXT * result
[6]
GLfloat GLfloat p
[1]
GLuint GLenum option
static QT_BEGIN_NAMESPACE const QRgb colors[][14]
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define qPrintable(string)
Definition qstring.h:1531
#define QStringLiteral(str)
#define sp
#define Q_UNUSED(x)
ptrdiff_t qsizetype
Definition qtypes.h:165
unsigned int uint
Definition qtypes.h:34
QT_BEGIN_NAMESPACE typedef uchar * output
const char property[13]
Definition qwizard.cpp:101
const char className[16]
[1]
Definition qwizard.cpp:100
QList< int > list
[14]
QVBoxLayout * layout
QByteArray page
[45]
QGraphicsItem * item
QList< QTreeWidgetItem * > items
QLayoutItem * child
[0]
char * toString(const MyType &t)
[31]
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
void acceptConnection(DomConnection *connection) override
QHash< QString, DomProperty * > DomPropertyMap
void acceptWidget(DomWidget *node) override
iconFromTheme(const QString &theme)
unsigned int idBased
Definition option.h:28
unsigned int forceMemberFnPtrConnectionSyntax
Definition option.h:29
unsigned int forceStringConnectionSyntax
Definition option.h:30
QString indent
Definition option.h:38
QString postfix
Definition option.h:40
QString messagePrefix() const
Definition option.h:65
QString translateFunction
Definition option.h:41
unsigned int generateImplemetation
Definition option.h:22
QString inputFile
Definition option.h:35
unsigned int autoConnection
Definition option.h:24
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)
QT_BEGIN_NAMESPACE bool toBool(const QString &str)
Definition utils.h:14
QHash< QString, DomProperty * > propertyMap(const QList< DomProperty * > &properties)
Definition utils.h:20