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