diff options
Diffstat (limited to 'src/tools/uic')
-rw-r--r-- | src/tools/uic/cpp/cppwriteincludes.cpp | 16 | ||||
-rw-r--r-- | src/tools/uic/cpp/cppwriteincludes.h | 6 | ||||
-rw-r--r-- | src/tools/uic/cpp/cppwriteinitialization.cpp | 401 | ||||
-rw-r--r-- | src/tools/uic/cpp/cppwriteinitialization.h | 5 | ||||
-rw-r--r-- | src/tools/uic/customwidgetsinfo.cpp | 39 | ||||
-rw-r--r-- | src/tools/uic/customwidgetsinfo.h | 8 | ||||
-rw-r--r-- | src/tools/uic/databaseinfo.h | 6 | ||||
-rw-r--r-- | src/tools/uic/driver.cpp | 151 | ||||
-rw-r--r-- | src/tools/uic/driver.h | 57 | ||||
-rw-r--r-- | src/tools/uic/main.cpp | 2 | ||||
-rw-r--r-- | src/tools/uic/shared/language.cpp | 144 | ||||
-rw-r--r-- | src/tools/uic/shared/language.h (renamed from src/tools/uic/globaldefs.h) | 58 | ||||
-rw-r--r-- | src/tools/uic/shared/shared.pri | 5 | ||||
-rw-r--r-- | src/tools/uic/treewalker.h | 1 | ||||
-rw-r--r-- | src/tools/uic/uic.cpp | 61 | ||||
-rw-r--r-- | src/tools/uic/uic.h | 7 | ||||
-rw-r--r-- | src/tools/uic/uic.pri | 1 | ||||
-rw-r--r-- | src/tools/uic/uic.pro | 1 |
18 files changed, 536 insertions, 433 deletions
diff --git a/src/tools/uic/cpp/cppwriteincludes.cpp b/src/tools/uic/cpp/cppwriteincludes.cpp index d51fddffea..0ba49627c0 100644 --- a/src/tools/uic/cpp/cppwriteincludes.cpp +++ b/src/tools/uic/cpp/cppwriteincludes.cpp @@ -119,7 +119,7 @@ void WriteIncludes::acceptUI(DomUI *node) writeHeaders(m_globalIncludes, true); writeHeaders(m_localIncludes, false); - m_output << QLatin1Char('\n'); + m_output << '\n'; } void WriteIncludes::acceptWidget(DomWidget *node) @@ -214,14 +214,14 @@ void WriteIncludes::add(const QString &className, bool determineHeader, const QS m_knownClasses.insert(className); const CustomWidgetsInfo *cwi = m_uic->customWidgetsInfo(); - if (cwi->extends(className, QLatin1String("QTreeView")) - || cwi->extends(className, QLatin1String("QTreeWidget")) - || cwi->extends(className, QLatin1String("QTableView")) - || cwi->extends(className, QLatin1String("QTableWidget"))) { + static const QStringList treeViewsWithHeaders = { + QLatin1String("QTreeView"), QLatin1String("QTreeWidget"), + QLatin1String("QTableView"), QLatin1String("QTableWidget") + }; + if (cwi->extendsOneOf(className, treeViewsWithHeaders)) add(QLatin1String("QHeaderView")); - } - if (!m_laidOut && m_uic->customWidgetsInfo()->extends(className, QLatin1String("QToolBox"))) + if (!m_laidOut && cwi->extends(className, QLatin1String("QToolBox"))) add(QLatin1String("QLayout")); // spacing property of QToolBox) if (className == QLatin1String("Line")) { // ### hmm, deprecate me! @@ -314,7 +314,7 @@ void WriteIncludes::writeHeaders(const OrderedSet &headers, bool global) const QString value = m_oldHeaderToNewHeader.value(header, header); const auto trimmed = QStringRef(&value).trimmed(); if (!trimmed.isEmpty()) - m_output << "#include " << openingQuote << trimmed << closingQuote << QLatin1Char('\n'); + m_output << "#include " << openingQuote << trimmed << closingQuote << '\n'; } } diff --git a/src/tools/uic/cpp/cppwriteincludes.h b/src/tools/uic/cpp/cppwriteincludes.h index 7f03849798..e9247f4cc4 100644 --- a/src/tools/uic/cpp/cppwriteincludes.h +++ b/src/tools/uic/cpp/cppwriteincludes.h @@ -58,9 +58,9 @@ struct WriteIncludes : public TreeWalker // // actions // - void acceptActionGroup(DomActionGroup *node) Q_DECL_OVERRIDE; - void acceptAction(DomAction *node) Q_DECL_OVERRIDE; - void acceptActionRef(DomActionRef *node) Q_DECL_OVERRIDE; + void acceptActionGroup(DomActionGroup *node) override; + void acceptAction(DomAction *node) override; + void acceptActionRef(DomActionRef *node) override; // // custom widgets diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index 0adc91ddb9..2fb3e502c5 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.cpp +++ b/src/tools/uic/cpp/cppwriteinitialization.cpp @@ -32,7 +32,8 @@ #include "utils.h" #include "uic.h" #include "databaseinfo.h" -#include "globaldefs.h" + +#include <language.h> #include <qtextstream.h> #include <qversionnumber.h> @@ -45,35 +46,26 @@ QT_BEGIN_NAMESPACE namespace { - // Fixup an enumeration name from class Qt. - // They are currently stored as "BottomToolBarArea" instead of "Qt::BottomToolBarArea". - // due to MO issues. This might be fixed in the future. - QLatin1String qtEnumerationPrefix(const QString &name) { - static const QLatin1String prefix("Qt::"); - if (name.indexOf(prefix) != 0) - return prefix; - return QLatin1String(); - } // figure out the toolbar area of a DOM attrib list. // By legacy, it is stored as an integer. As of 4.3.0, it is the enumeration value. QString toolBarAreaStringFromDOMAttributes(const CPP::WriteInitialization::DomPropertyMap &attributes) { const DomProperty *pstyle = attributes.value(QLatin1String("toolBarArea")); + QString result; if (!pstyle) - return QString(); - + return result; switch (pstyle->kind()) { - case DomProperty::Number: { - return QLatin1String("static_cast<Qt::ToolBarArea>(") - + QString::number(pstyle->elementNumber()) + QLatin1String("), "); - } - case DomProperty::Enum: { - const QString area = pstyle->elementEnum(); - return qtEnumerationPrefix(area) + area + QLatin1String(", "); - } + case DomProperty::Number: + result = QLatin1String(language::toolbarArea(pstyle->elementNumber())); + break; + case DomProperty::Enum: + result = pstyle->elementEnum(); + break; default: break; } - return QString(); + if (!result.startsWith(QLatin1String("Qt::"))) + result.prepend(QLatin1String("Qt::")); + return result + QLatin1String(", "); } // Write a statement to create a spacer item. @@ -173,17 +165,16 @@ namespace { } return true; } - - inline void openIfndef(QTextStream &str, const QString &symbol) { if (!symbol.isEmpty()) str << QLatin1String("#ifndef ") << symbol << endl; } - inline void closeIfndef(QTextStream &str, const QString &symbol) { if (!symbol.isEmpty()) str << QLatin1String("#endif // ") << symbol << endl; } - - const char *accessibilityDefineC = "QT_NO_ACCESSIBILITY"; - const char *toolTipDefineC = "QT_NO_TOOLTIP"; - const char *whatsThisDefineC = "QT_NO_WHATSTHIS"; - const char *statusTipDefineC = "QT_NO_STATUSTIP"; - const char *shortcutDefineC = "QT_NO_SHORTCUT"; } +// QtGui +static inline QString accessibilityConfigKey() { return QStringLiteral("accessibility"); } +static inline QString shortcutConfigKey() { return QStringLiteral("shortcut"); } +static inline QString whatsThisConfigKey() { return QStringLiteral("whatsthis"); } +// QtWidgets +static inline QString statusTipConfigKey() { return QStringLiteral("statustip"); } +static inline QString toolTipConfigKey() { return QStringLiteral("tooltip"); } + namespace CPP { FontHandle::FontHandle(const DomFont *domFont) : @@ -521,14 +512,15 @@ void WriteInitialization::acceptUI(DomUI *node) acceptWidget(node->elementWidget()); if (!m_buddies.empty()) - openIfndef(m_output, QLatin1String(shortcutDefineC)); + m_output << language::openQtConfig(shortcutConfigKey()); for (const Buddy &b : qAsConst(m_buddies)) { if (!m_registeredWidgets.contains(b.objName)) { fprintf(stderr, "%s: Warning: Buddy assignment: '%s' is not a valid widget.\n", qPrintable(m_option.messagePrefix()), b.objName.toLatin1().data()); continue; - } else if (!m_registeredWidgets.contains(b.buddy)) { + } + if (!m_registeredWidgets.contains(b.buddy)) { fprintf(stderr, "%s: Warning: Buddy assignment: '%s' is not a valid widget.\n", qPrintable(m_option.messagePrefix()), b.buddy.toLatin1().data()); @@ -538,12 +530,12 @@ void WriteInitialization::acceptUI(DomUI *node) m_output << m_indent << b.objName << "->setBuddy(" << b.buddy << ");\n"; } if (!m_buddies.empty()) - closeIfndef(m_output, QLatin1String(shortcutDefineC)); + m_output << language::closeQtConfig(shortcutConfigKey()); if (node->elementTabStops()) acceptTabStops(node->elementTabStops()); - if (m_delayedActionInitialization.size()) + if (!m_delayedActionInitialization.isEmpty()) m_output << "\n" << m_delayedActionInitialization; m_output << "\n" << m_indent << "retranslateUi(" << varName << ");\n"; @@ -616,18 +608,23 @@ void WriteInitialization::acceptWidget(DomWidget *node) if (m_uic->isContainer(parentClass)) parentWidget.clear(); - if (m_widgetChain.size() != 1) - m_output << m_indent << varName << " = new " << m_uic->customWidgetsInfo()->realClassName(className) << '(' << parentWidget << ");\n"; + const auto *cwi = m_uic->customWidgetsInfo(); + + if (m_widgetChain.size() != 1) { + m_output << m_indent << varName << " = new " << cwi->realClassName(className) + << '(' << parentWidget << ");\n"; + } parentWidget = savedParentWidget; - if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QComboBox"))) { + + if (cwi->extends(className, QLatin1String("QComboBox"))) { initializeComboBox(node); - } else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QListWidget"))) { + } else if (cwi->extends(className, QLatin1String("QListWidget"))) { initializeListWidget(node); - } else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTreeWidget"))) { + } else if (cwi->extends(className, QLatin1String("QTreeWidget"))) { initializeTreeWidget(node); - } else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTableWidget"))) { + } else if (cwi->extends(className, QLatin1String("QTableWidget"))) { initializeTableWidget(node); } @@ -636,7 +633,8 @@ void WriteInitialization::acceptWidget(DomWidget *node) writeProperties(varName, className, node->elementProperty()); - if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QMenu")) && parentWidget.size()) { + if (!parentWidget.isEmpty() + && cwi->extends(className, QLatin1String("QMenu"))) { initializeMenu(node, parentWidget); } @@ -648,7 +646,7 @@ void WriteInitialization::acceptWidget(DomWidget *node) if (const DomWidget* parentWidget = m_widgetChain.top()) { const QString parentClass = parentWidget->attributeClass(); if (parentClass != QLatin1String("QMainWindow") - && !m_uic->isCustomWidgetContainer(parentClass) + && !m_uic->customWidgetsInfo()->isCustomWidgetContainer(parentClass) && !m_uic->isContainer(parentClass)) m_layoutWidget = true; } @@ -664,10 +662,10 @@ void WriteInitialization::acceptWidget(DomWidget *node) const QString pageDefaultString = QLatin1String("Page"); - if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QMainWindow"))) { - if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QMenuBar"))) { + if (cwi->extends(parentClass, QLatin1String("QMainWindow"))) { + if (cwi->extends(className, QLatin1String("QMenuBar"))) { m_output << m_indent << parentWidget << "->setMenuBar(" << varName <<");\n"; - } else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QToolBar"))) { + } else if (cwi->extends(className, QLatin1String("QToolBar"))) { m_output << m_indent << parentWidget << "->addToolBar(" << toolBarAreaStringFromDOMAttributes(attributes) << varName << ");\n"; @@ -677,15 +675,11 @@ void WriteInitialization::acceptWidget(DomWidget *node) } } - } else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QDockWidget"))) { - QString area; - if (DomProperty *pstyle = attributes.value(QLatin1String("dockWidgetArea"))) { - area += QLatin1String("static_cast<Qt::DockWidgetArea>("); - area += QString::number(pstyle->elementNumber()); - area += QLatin1String("), "); - } - - m_output << m_indent << parentWidget << "->addDockWidget(" << area << varName << ");\n"; + } else if (cwi->extends(className, QLatin1String("QDockWidget"))) { + m_output << m_indent << parentWidget << "->addDockWidget("; + if (DomProperty *pstyle = attributes.value(QLatin1String("dockWidgetArea"))) + m_output << "Qt::" << language::dockWidgetArea(pstyle->elementNumber()) << ", "; + m_output << varName << ");\n"; } else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QStatusBar"))) { m_output << m_indent << parentWidget << "->setStatusBar(" << varName << ");\n"; } else { @@ -694,71 +688,62 @@ void WriteInitialization::acceptWidget(DomWidget *node) } // Check for addPageMethod of a custom plugin first - const QString addPageMethod = m_uic->customWidgetsInfo()->customWidgetAddPageMethod(parentClass); + QString addPageMethod = cwi->customWidgetAddPageMethod(parentClass); + if (addPageMethod.isEmpty()) + addPageMethod = cwi->simpleContainerAddPageMethod(parentClass); if (!addPageMethod.isEmpty()) { m_output << m_indent << parentWidget << "->" << addPageMethod << '(' << varName << ");\n"; - } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QStackedWidget"))) { - m_output << m_indent << parentWidget << "->addWidget(" << varName << ");\n"; - } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QToolBar"))) { - m_output << m_indent << parentWidget << "->addWidget(" << varName << ");\n"; - } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QDockWidget"))) { - m_output << m_indent << parentWidget << "->setWidget(" << varName << ");\n"; - } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QScrollArea"))) { - m_output << m_indent << parentWidget << "->setWidget(" << varName << ");\n"; - } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QSplitter"))) { - m_output << m_indent << parentWidget << "->addWidget(" << varName << ");\n"; - } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QMdiArea"))) { - m_output << m_indent << parentWidget << "->addSubWindow(" << varName << ");\n"; } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QWizard"))) { addWizardPage(varName, node, parentWidget); } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QToolBox"))) { - QString icon; - if (const DomProperty *picon = attributes.value(QLatin1String("icon"))) { - icon += QLatin1String(", ") ; - icon += iconCall(picon); - } - const DomProperty *plabel = attributes.value(QLatin1String("label")); DomString *plabelString = plabel ? plabel->elementString() : 0; + QString icon; + if (const DomProperty *picon = attributes.value(QLatin1String("icon"))) + icon = QLatin1String(", ") + iconCall(picon); // Side effect: Writes icon definition - m_output << m_indent << parentWidget << "->addItem(" << varName << icon << ", " << noTrCall(plabelString, pageDefaultString) << ");\n"; + m_output << m_indent << parentWidget << "->addItem(" << varName << icon + << ", " << noTrCall(plabelString, pageDefaultString) << ");\n"; autoTrOutput(plabelString, pageDefaultString) << m_indent << parentWidget << "->setItemText(" << parentWidget << "->indexOf(" << varName << "), " << autoTrCall(plabelString, pageDefaultString) << ");\n"; -#ifndef QT_NO_TOOLTIP if (DomProperty *ptoolTip = attributes.value(QLatin1String("toolTip"))) { - autoTrOutput(ptoolTip->elementString()) << m_indent << parentWidget << "->setItemToolTip(" - << parentWidget << "->indexOf(" << varName << "), " << autoTrCall(ptoolTip->elementString()) << ");\n"; + autoTrOutput(ptoolTip->elementString()) + << language::openQtConfig(toolTipConfigKey()) + << m_indent << parentWidget << "->setItemToolTip(" << parentWidget + << "->indexOf(" << varName << "), " + << autoTrCall(ptoolTip->elementString()) << ");\n" + << language::closeQtConfig(toolTipConfigKey()); } -#endif // QT_NO_TOOLTIP } else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QTabWidget"))) { - QString icon; - if (const DomProperty *picon = attributes.value(QLatin1String("icon"))) { - icon += QLatin1String(", "); - icon += iconCall(picon); - } - const DomProperty *ptitle = attributes.value(QLatin1String("title")); DomString *ptitleString = ptitle ? ptitle->elementString() : 0; - - m_output << m_indent << parentWidget << "->addTab(" << varName << icon << ", " << "QString());\n"; + QString icon; + if (const DomProperty *picon = attributes.value(QLatin1String("icon"))) + icon = QLatin1String(", ") + iconCall(picon); // Side effect: Writes icon definition + m_output << m_indent << parentWidget << "->addTab(" << varName << icon + << ", " << "QString());\n"; autoTrOutput(ptitleString, pageDefaultString) << m_indent << parentWidget << "->setTabText(" << parentWidget << "->indexOf(" << varName << "), " << autoTrCall(ptitleString, pageDefaultString) << ");\n"; -#ifndef QT_NO_TOOLTIP if (const DomProperty *ptoolTip = attributes.value(QLatin1String("toolTip"))) { - autoTrOutput(ptoolTip->elementString()) << m_indent << parentWidget << "->setTabToolTip(" - << parentWidget << "->indexOf(" << varName << "), " << autoTrCall(ptoolTip->elementString()) << ");\n"; + autoTrOutput(ptoolTip->elementString()) + << language::openQtConfig(toolTipConfigKey()) + << m_indent << parentWidget << "->setTabToolTip(" << parentWidget + << "->indexOf(" << varName << "), " + << autoTrCall(ptoolTip->elementString()) << ");\n" + << language::closeQtConfig(toolTipConfigKey()); } -#endif // QT_NO_TOOLTIP -#ifndef QT_NO_WHATSTHIS if (const DomProperty *pwhatsThis = attributes.value(QLatin1String("whatsThis"))) { - autoTrOutput(pwhatsThis->elementString()) << m_indent << parentWidget << "->setTabWhatsThis(" - << parentWidget << "->indexOf(" << varName << "), " << autoTrCall(pwhatsThis->elementString()) << ");\n"; + autoTrOutput(pwhatsThis->elementString()) + << language::openQtConfig(whatsThisConfigKey()) + << m_indent << parentWidget << "->setTabWhatsThis(" << parentWidget + << "->indexOf(" << varName << "), " + << autoTrCall(pwhatsThis->elementString()) << ");\n" + << language::closeQtConfig(whatsThisConfigKey()); } -#endif // QT_NO_WHATSTHIS } // @@ -774,8 +759,14 @@ void WriteInitialization::acceptWidget(DomWidget *node) QLatin1String("stretchLastSection"), }; - if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTreeView")) - || m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTreeWidget"))) { + static const QStringList trees = { + QLatin1String("QTreeView"), QLatin1String("QTreeWidget") + }; + static const QStringList tables = { + QLatin1String("QTableView"), QLatin1String("QTableWidget") + }; + + if (cwi->extendsOneOf(className, trees)) { DomPropertyList headerProperties; for (auto realPropertyName : realPropertyNames) { const QString fakePropertyName = QLatin1String("header") @@ -788,9 +779,7 @@ void WriteInitialization::acceptWidget(DomWidget *node) writeProperties(varName + QLatin1String("->header()"), QLatin1String("QHeaderView"), headerProperties, WritePropertyIgnoreObjectName); - } else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTableView")) - || m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTableWidget"))) { - + } else if (cwi->extendsOneOf(className, tables)) { static const QLatin1String headerPrefixes[] = { QLatin1String("horizontalHeader"), QLatin1String("verticalHeader"), @@ -984,6 +973,24 @@ static inline QString formLayoutRole(int column, int colspan) return column == 0 ? QLatin1String("QFormLayout::LabelRole") : QLatin1String("QFormLayout::FieldRole"); } +static QString layoutAddMethod(DomLayoutItem::Kind kind, const QString &layoutClass) +{ + const QString methodPrefix = layoutClass == QLatin1String("QFormLayout") + ? QLatin1String("set") : QLatin1String("add"); + switch (kind) { + case DomLayoutItem::Widget: + return methodPrefix + QLatin1String("Widget"); + case DomLayoutItem::Layout: + return methodPrefix + QLatin1String("Layout"); + case DomLayoutItem::Spacer: + return methodPrefix + QLatin1String("Item"); + case DomLayoutItem::Unknown: + Q_ASSERT( false ); + break; + } + Q_UNREACHABLE(); +} + void WriteInitialization::acceptLayoutItem(DomLayoutItem *node) { TreeWalker::acceptLayoutItem(node); @@ -996,47 +1003,27 @@ void WriteInitialization::acceptLayoutItem(DomLayoutItem *node) const QString layoutName = m_driver->findOrInsertLayout(layout); const QString itemName = m_driver->findOrInsertLayoutItem(node); - QString addArgs; - QString methodPrefix = QLatin1String("add"); //Consistent API-design galore! + m_output << "\n" << m_indent << layoutName << "->" + << layoutAddMethod(node->kind(), layout->attributeClass()) << '('; + if (layout->attributeClass() == QLatin1String("QGridLayout")) { const int row = node->attributeRow(); const int col = node->attributeColumn(); const int rowSpan = node->hasAttributeRowSpan() ? node->attributeRowSpan() : 1; const int colSpan = node->hasAttributeColSpan() ? node->attributeColSpan() : 1; - - addArgs = QString::fromLatin1("%1, %2, %3, %4, %5").arg(itemName).arg(row).arg(col).arg(rowSpan).arg(colSpan); + m_output << itemName << ", " << row << ", " << col << ", " << rowSpan << ", " << colSpan; if (!node->attributeAlignment().isEmpty()) - addArgs += QLatin1String(", ") + node->attributeAlignment(); + m_output << ", " << node->attributeAlignment(); + } else if (layout->attributeClass() == QLatin1String("QFormLayout")) { + const int row = node->attributeRow(); + const int colSpan = node->hasAttributeColSpan() ? node->attributeColSpan() : 1; + const QString role = formLayoutRole(node->attributeColumn(), colSpan); + m_output << row << ", " << role << ", " << itemName; } else { - if (layout->attributeClass() == QLatin1String("QFormLayout")) { - methodPrefix = QLatin1String("set"); - const int row = node->attributeRow(); - const int colSpan = node->hasAttributeColSpan() ? node->attributeColSpan() : 1; - const QString role = formLayoutRole(node->attributeColumn(), colSpan); - addArgs = QString::fromLatin1("%1, %2, %3").arg(row).arg(role, itemName); - } else { - addArgs = itemName; - if (layout->attributeClass().contains(QLatin1String("Box")) && !node->attributeAlignment().isEmpty()) - addArgs += QLatin1String(", 0, ") + node->attributeAlignment(); - } - } - - // figure out "add" method - m_output << "\n" << m_indent << layoutName << "->"; - switch (node->kind()) { - case DomLayoutItem::Widget: - m_output << methodPrefix << "Widget(" << addArgs; - break; - case DomLayoutItem::Layout: - m_output << methodPrefix << "Layout(" << addArgs; - break; - case DomLayoutItem::Spacer: - m_output << methodPrefix << "Item(" << addArgs; - break; - case DomLayoutItem::Unknown: - Q_ASSERT( 0 ); - break; + m_output << itemName; + if (layout->attributeClass().contains(QLatin1String("Box")) && !node->attributeAlignment().isEmpty()) + m_output << ", 0, " << node->attributeAlignment(); } m_output << ");\n\n"; } @@ -1076,16 +1063,16 @@ void WriteInitialization::acceptAction(DomAction *node) void WriteInitialization::acceptActionRef(DomActionRef *node) { QString actionName = node->attributeName(); + if (actionName.isEmpty() || !m_widgetChain.top() + || m_driver->actionGroupByName(actionName)) { + return; + } + + const QString varName = m_driver->findOrInsertWidget(m_widgetChain.top()); const bool isSeparator = actionName == QLatin1String("separator"); bool isMenu = false; - QString varName = m_driver->findOrInsertWidget(m_widgetChain.top()); - - if (actionName.isEmpty() || !m_widgetChain.top()) { - return; - } else if (m_driver->actionGroupByName(actionName)) { - return; - } else if (const DomWidget *w = m_driver->widgetByName(actionName)) { + if (const DomWidget *w = m_driver->widgetByName(actionName)) { isMenu = m_uic->isMenu(w->attributeClass()); } else if (!(m_driver->actionByName(actionName) || isSeparator)) { fprintf(stderr, "%s: Warning: action `%s' not declared\n", @@ -1125,6 +1112,23 @@ QString WriteInitialization::writeStringListProperty(const DomStringList *list) return propertyValue; } +static QString configKeyForProperty(const QString &propertyName) +{ + if (propertyName == QLatin1String("toolTip")) + return toolTipConfigKey(); + if (propertyName == QLatin1String("whatsThis")) + return whatsThisConfigKey(); + if (propertyName == QLatin1String("statusTip")) + return statusTipConfigKey(); + if (propertyName == QLatin1String("shortcut")) + return shortcutConfigKey(); + if (propertyName == QLatin1String("accessibleName") + || propertyName == QLatin1String("accessibleDescription")) { + return accessibilityConfigKey(); + } + return QString(); +} + void WriteInitialization::writeProperties(const QString &varName, const QString &className, const DomPropertyList &lst, @@ -1172,11 +1176,12 @@ void WriteInitialization::writeProperties(const QString &varName, << p->elementNumber() << ");\n"; continue; } + static const QStringList currentIndexWidgets = { + QLatin1String("QComboBox"), QLatin1String("QStackedWidget"), + QLatin1String("QTabWidget"), QLatin1String("QToolBox") + }; if (propertyName == QLatin1String("currentIndex") // set currentIndex later - && (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QComboBox")) - || m_uic->customWidgetsInfo()->extends(className, QLatin1String("QStackedWidget")) - || m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTabWidget")) - || m_uic->customWidgetsInfo()->extends(className, QLatin1String("QToolBox")))) { + && (m_uic->customWidgetsInfo()->extendsOneOf(className, currentIndexWidgets))) { m_delayedOut << m_indent << varName << "->setCurrentIndex(" << p->elementNumber() << ");\n"; continue; @@ -1461,29 +1466,19 @@ void WriteInitialization::writeProperties(const QString &varName, break; } - if (propertyValue.size()) { - const char* defineC = 0; - if (propertyName == QLatin1String("toolTip")) - defineC = toolTipDefineC; - else if (propertyName == QLatin1String("whatsThis")) - defineC = whatsThisDefineC; - else if (propertyName == QLatin1String("statusTip")) - defineC = statusTipDefineC; - else if (propertyName == QLatin1String("shortcut")) - defineC = shortcutDefineC; - else if (propertyName == QLatin1String("accessibleName") || propertyName == QLatin1String("accessibleDescription")) - defineC = accessibilityDefineC; + if (!propertyValue.isEmpty()) { + const QString configKey = configKeyForProperty(propertyName); QTextStream &o = delayProperty ? m_delayedOut : autoTrOutput(p); - if (defineC) - openIfndef(o, QLatin1String(defineC)); + if (!configKey.isEmpty()) + o << language::openQtConfig(configKey); o << m_indent << varNewName << setFunction << propertyValue; if (!stdset) o << ')'; o << ");\n"; - if (defineC) - closeIfndef(o, QLatin1String(defineC)); + if (!configKey.isEmpty()) + o << language::closeQtConfig(configKey); if (varName == m_mainFormVarName && &o == &m_refreshOut) { // this is the only place (currently) where we output mainForm name to the retranslateUi(). @@ -1493,11 +1488,9 @@ void WriteInitialization::writeProperties(const QString &varName, } } if (leftMargin != -1 || topMargin != -1 || rightMargin != -1 || bottomMargin != -1) { - m_output << m_indent << varName << QLatin1String("->setContentsMargins(") - << leftMargin << QLatin1String(", ") - << topMargin << QLatin1String(", ") - << rightMargin << QLatin1String(", ") - << bottomMargin << QLatin1String(");\n"); + m_output << m_indent << varName << "->setContentsMargins(" + << leftMargin << ", " << topMargin << ", " + << rightMargin << ", " << bottomMargin << ");\n"; } } @@ -1519,8 +1512,8 @@ QString WriteInitialization::writeSizePolicy(const DomSizePolicy *sp) m_output << m_indent << "QSizePolicy " << spName; do { if (sp->hasElementHSizeType() && sp->hasElementVSizeType()) { - m_output << "(static_cast<QSizePolicy::Policy>(" << sp->elementHSizeType() - << "), static_cast<QSizePolicy::Policy>(" << sp->elementVSizeType() << "));\n"; + m_output << "(QSizePolicy::" << language::sizePolicy(sp->elementHSizeType()) + << ", QSizePolicy::" << language::sizePolicy(sp->elementVSizeType()) << ");\n"; break; } if (sp->hasAttributeHSizeType() && sp->hasAttributeVSizeType()) { @@ -1784,7 +1777,7 @@ void WriteInitialization::writeColorGroup(DomColorGroup *colorGroup, const QStri const DomColor *color = colors.at(i); m_output << m_indent << paletteName << ".setColor(" << group - << ", " << "static_cast<QPalette::ColorRole>(" << QString::number(i) << ')' + << ", QPalette::" << language::paletteColorRole(i) << ", " << domColor2QString(color) << ");\n"; } @@ -2059,10 +2052,15 @@ void WriteInitialization::enableSorting(DomWidget *w, const QString &varName, co void WriteInitialization::addInitializer(Item *item, const QString &name, int column, const QString &value, const QString &directive, bool translatable) const { - if (!value.isEmpty()) - item->addSetter(QLatin1String("->set") + name.at(0).toUpper() + name.midRef(1) + - QLatin1Char('(') + (column < 0 ? QString() : QString::number(column) + - QLatin1String(", ")) + value + QLatin1String(");"), directive, translatable); + if (!value.isEmpty()) { + QString setter; + QTextStream str(&setter); + str << "->set" << name.at(0).toUpper() << name.midRef(1) << '('; + if (column >= 0) + str << column << ", "; + str << value << ");"; + item->addSetter(setter, directive, translatable); + } } /*! @@ -2144,9 +2142,12 @@ void WriteInitialization::addCommonInitializers(Item *item, addQtFlagsInitializer(item, properties, QLatin1String("textAlignment"), column); addQtEnumInitializer(item, properties, QLatin1String("checkState"), column); addStringInitializer(item, properties, QLatin1String("text"), column); - addStringInitializer(item, properties, QLatin1String("toolTip"), column, QLatin1String(toolTipDefineC)); - addStringInitializer(item, properties, QLatin1String("whatsThis"), column, QLatin1String(whatsThisDefineC)); - addStringInitializer(item, properties, QLatin1String("statusTip"), column, QLatin1String(statusTipDefineC)); + addStringInitializer(item, properties, QLatin1String("toolTip"), column, + toolTipConfigKey()); + addStringInitializer(item, properties, QLatin1String("whatsThis"), column, + whatsThisConfigKey()); + addStringInitializer(item, properties, QLatin1String("statusTip"), column, + statusTipConfigKey()); } void WriteInitialization::initializeListWidget(DomWidget *w) @@ -2286,7 +2287,7 @@ void WriteInitialization::initializeTableWidget(DomWidget *w) QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable); item.writeRetranslateUi(varName + QLatin1String("->horizontalHeaderItem(") + QString::number(i) + QLatin1Char(')')); - m_output << m_indent << varName << "->setHorizontalHeaderItem(" << QString::number(i) << ", " << itemName << ");\n"; + m_output << m_indent << varName << "->setHorizontalHeaderItem(" << i << ", " << itemName << ");\n"; } } @@ -2308,7 +2309,7 @@ void WriteInitialization::initializeTableWidget(DomWidget *w) QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable); item.writeRetranslateUi(varName + QLatin1String("->verticalHeaderItem(") + QString::number(i) + QLatin1Char(')')); - m_output << m_indent << varName << "->setVerticalHeaderItem(" << QString::number(i) << ", " << itemName << ");\n"; + m_output << m_indent << varName << "->setVerticalHeaderItem(" << i << ", " << itemName << ");\n"; } } @@ -2329,7 +2330,7 @@ void WriteInitialization::initializeTableWidget(DomWidget *w) QString itemName = item.writeSetupUi(QString(), Item::ConstructItemAndVariable); item.writeRetranslateUi(varName + QLatin1String("->item(") + QString::number(r) + QLatin1String(", ") + QString::number(c) + QLatin1Char(')')); - m_output << m_indent << varName << "->setItem(" << QString::number(r) << ", " << QString::number(c) << ", " << itemName << ");\n"; + m_output << m_indent << varName << "->setItem(" << r << ", " << c << ", " << itemName << ");\n"; } } enableSorting(w, varName, tempName); @@ -2348,7 +2349,7 @@ QString WriteInitialization::trCall(const QString &str, const QString &commentHi if (idBasedTranslations || m_option.idBased) { result += QLatin1String("qtTrId("); } else { - result += QLatin1String("QApplication::translate(\"") + result += QLatin1String("QCoreApplication::translate(\"") + m_generatedClass + QLatin1String("\", "); } @@ -2427,19 +2428,13 @@ QTextStream &WriteInitialization::autoTrOutput(const DomString *str, const QStri return m_output; } -bool WriteInitialization::isValidObject(const QString &name) const -{ - return m_registeredWidgets.contains(name) - || m_registeredActions.contains(name); -} - QString WriteInitialization::findDeclaration(const QString &name) { const QString normalized = Driver::normalizedName(name); - if (DomWidget *widget = m_driver->widgetByName(normalized)) + if (const DomWidget *widget = m_driver->widgetByName(normalized)) return m_driver->findOrInsertWidget(widget); - if (DomAction *action = m_driver->actionByName(normalized)) + if (const DomAction *action = m_driver->actionByName(normalized)) return m_driver->findOrInsertAction(action); if (const DomButtonGroup *group = m_driver->findButtonGroup(normalized)) return m_driver->findOrInsertButtonGroup(group); @@ -2465,25 +2460,13 @@ void WriteInitialization::acceptConnection(DomConnection *connection) << ");\n"; } -DomWidget *WriteInitialization::findWidget(QLatin1String widgetClass) -{ - for (int i = m_widgetChain.count() - 1; i >= 0; --i) { - DomWidget *widget = m_widgetChain.at(i); - - if (widget && m_uic->customWidgetsInfo()->extends(widget->attributeClass(), widgetClass)) - return widget; - } - - return 0; -} - static void generateMultiDirectiveBegin(QTextStream &outputStream, const QSet<QString> &directives) { if (directives.isEmpty()) return; if (directives.size() == 1) { - outputStream << "#ifndef " << *directives.cbegin() << endl; + outputStream << language::openQtConfig(*directives.cbegin()); return; } @@ -2491,7 +2474,10 @@ static void generateMultiDirectiveBegin(QTextStream &outputStream, const QSet<QS // sort (always generate in the same order): std::sort(list.begin(), list.end()); - outputStream << "#if !defined(" << list.join(QLatin1String(") || !defined(")) << ')' << endl; + outputStream << "#if " << language::qtConfig(list.constFirst()); + for (int i = 1, size = list.size(); i < size; ++i) + outputStream << " || " << language::qtConfig(list.at(i)); + outputStream << endl; } static void generateMultiDirectiveEnd(QTextStream &outputStream, const QSet<QString> &directives) @@ -2548,9 +2534,11 @@ QString WriteInitialization::Item::writeSetupUi(const QString &parent, Item::Emp QMultiMap<QString, QString>::ConstIterator it = m_setupUiData.setters.constBegin(); while (it != m_setupUiData.setters.constEnd()) { - openIfndef(m_setupUiStream, it.key()); + if (!it.key().isEmpty()) + m_setupUiStream << language::openQtConfig(it.key()); m_setupUiStream << m_indent << uniqueName << it.value() << endl; - closeIfndef(m_setupUiStream, it.key()); + if (!it.key().isEmpty()) + m_setupUiStream << language::closeQtConfig(it.key()); ++it; } for (Item *child : qAsConst(m_children)) @@ -2577,14 +2565,17 @@ void WriteInitialization::Item::writeRetranslateUi(const QString &parentPath) while (it != m_retranslateUiData.setters.constEnd()) { const QString newDirective = it.key(); if (oldDirective != newDirective) { - closeIfndef(m_retranslateUiStream, oldDirective); - openIfndef(m_retranslateUiStream, newDirective); + if (!oldDirective.isEmpty()) + m_retranslateUiStream << language::closeQtConfig(oldDirective); + if (!newDirective.isEmpty()) + m_retranslateUiStream << language::openQtConfig(newDirective); oldDirective = newDirective; } m_retranslateUiStream << m_indent << uniqueName << it.value() << endl; ++it; } - closeIfndef(m_retranslateUiStream, oldDirective); + if (!oldDirective.isEmpty()) + m_retranslateUiStream << language::closeQtConfig(oldDirective); for (int i = 0; i < m_children.size(); i++) m_children[i]->writeRetranslateUi(uniqueName + QLatin1String("->child(") + QString::number(i) + QLatin1Char(')')); diff --git a/src/tools/uic/cpp/cppwriteinitialization.h b/src/tools/uic/cpp/cppwriteinitialization.h index cce83bd677..c408c44b40 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.h +++ b/src/tools/uic/cpp/cppwriteinitialization.h @@ -174,8 +174,6 @@ private: void writeRetranslateUi(const QString &parentPath); void addSetter(const QString &setter, const QString &directive = QString(), bool translatable = false); // don't call it if you already added *this as a child of another Item void addChild(Item *child); // all setters should already been added - int setupUiCount() const { return m_setupUiData.setters.count(); } - int retranslateUiCount() const { return m_retranslateUiData.setters.count(); } private: struct ItemData { @@ -223,9 +221,6 @@ private: void enableSorting(DomWidget *w, const QString &varName, const QString &tempName); QString findDeclaration(const QString &name); - DomWidget *findWidget(QLatin1String widgetClass); - - bool isValidObject(const QString &name) const; private: QString writeFontProperties(const DomFont *f); diff --git a/src/tools/uic/customwidgetsinfo.cpp b/src/tools/uic/customwidgetsinfo.cpp index 0ac0c2b6a3..d6a409152b 100644 --- a/src/tools/uic/customwidgetsinfo.cpp +++ b/src/tools/uic/customwidgetsinfo.cpp @@ -31,6 +31,8 @@ #include "ui4.h" #include "utils.h" +#include <utility> + QT_BEGIN_NAMESPACE CustomWidgetsInfo::CustomWidgetsInfo() = default; @@ -73,6 +75,24 @@ bool CustomWidgetsInfo::extends(const QString &classNameIn, QLatin1String baseCl return false; } +bool CustomWidgetsInfo::extendsOneOf(const QString &classNameIn, + const QStringList &baseClassNames) const +{ + if (baseClassNames.contains(classNameIn)) + return true; + + QString className = classNameIn; + while (const DomCustomWidget *c = customWidget(className)) { + const QString extends = c->elementExtends(); + if (className == extends) // Faulty legacy custom widget entries exist. + return false; + if (baseClassNames.contains(extends)) + return true; + className = extends; + } + return false; +} + bool CustomWidgetsInfo::isCustomWidgetContainer(const QString &className) const { if (const DomCustomWidget *dcw = m_customWidgets.value(className, 0)) @@ -96,5 +116,24 @@ QString CustomWidgetsInfo::customWidgetAddPageMethod(const QString &name) const return QString(); } +// add page methods for simple containers taking only the widget parameter +QString CustomWidgetsInfo::simpleContainerAddPageMethod(const QString &name) const +{ + using AddPageMethod = std::pair<const char *, const char *>; + + static AddPageMethod addPageMethods[] = { + {"QStackedWidget", "addWidget"}, + {"QToolBar", "addWidget"}, + {"QDockWidget", "setWidget"}, + {"QScrollArea", "setWidget"}, + {"QSplitter", "addWidget"}, + {"QMdiArea", "addSubWindow"} + }; + for (const auto &m : addPageMethods) { + if (extends(name, QLatin1String(m.first))) + return QLatin1String(m.second); + } + return QString(); +} QT_END_NAMESPACE diff --git a/src/tools/uic/customwidgetsinfo.h b/src/tools/uic/customwidgetsinfo.h index 944ed59215..8a10999027 100644 --- a/src/tools/uic/customwidgetsinfo.h +++ b/src/tools/uic/customwidgetsinfo.h @@ -48,20 +48,16 @@ public: void acceptCustomWidgets(DomCustomWidgets *node) override; void acceptCustomWidget(DomCustomWidget *node) override; - inline QStringList customWidgets() const - { return m_customWidgets.keys(); } - - inline bool hasCustomWidget(const QString &name) const - { return m_customWidgets.contains(name); } - inline DomCustomWidget *customWidget(const QString &name) const { return m_customWidgets.value(name); } QString customWidgetAddPageMethod(const QString &name) const; + QString simpleContainerAddPageMethod(const QString &name) const; QString realClassName(const QString &className) const; bool extends(const QString &className, QLatin1String baseClassName) const; + bool extendsOneOf(const QString &className, const QStringList &baseClassNames) const; bool isCustomWidgetContainer(const QString &className) const; diff --git a/src/tools/uic/databaseinfo.h b/src/tools/uic/databaseinfo.h index bebf139c5a..4015e39dbc 100644 --- a/src/tools/uic/databaseinfo.h +++ b/src/tools/uic/databaseinfo.h @@ -48,12 +48,6 @@ public: inline QStringList connections() const { return m_connections; } - inline QStringList cursors(const QString &connection) const - { return m_cursors.value(connection); } - - inline QStringList fields(const QString &connection) const - { return m_fields.value(connection); } - private: QStringList m_connections; QMap<QString, QStringList> m_cursors; diff --git a/src/tools/uic/driver.cpp b/src/tools/uic/driver.cpp index 91a48815fd..03fa1e17cf 100644 --- a/src/tools/uic/driver.cpp +++ b/src/tools/uic/driver.cpp @@ -33,6 +33,8 @@ #include <qfileinfo.h> #include <qdebug.h> +#include <algorithm> + QT_BEGIN_NAMESPACE Driver::Driver() @@ -43,39 +45,37 @@ Driver::Driver() Driver::~Driver() = default; -QString Driver::findOrInsertWidget(DomWidget *ui_widget) -{ - if (!m_widgets.contains(ui_widget)) - m_widgets.insert(ui_widget, unique(ui_widget->attributeName(), ui_widget->attributeClass())); +static inline QString spacerItemClass() { return QStringLiteral("QSpacerItem"); } +static inline QString actionGroupClass() { return QStringLiteral("QActionGroup"); } +static inline QString actionClass() { return QStringLiteral("QAction"); } +static inline QString buttonGroupClass() { return QStringLiteral("QButtonGroup"); } - return m_widgets.value(ui_widget); +template <class DomClass> +QString Driver::findOrInsert(DomObjectHash<DomClass> *domHash, const DomClass *dom, + const QString &className) +{ + auto it = domHash->find(dom); + if (it == domHash->end()) + it = domHash->insert(dom, this->unique(dom->attributeName(), className)); + return it.value(); } -QString Driver::findOrInsertSpacer(DomSpacer *ui_spacer) +QString Driver::findOrInsertWidget(const DomWidget *ui_widget) { - if (!m_spacers.contains(ui_spacer)) { - QString name; - if (ui_spacer->hasAttributeName()) - name = ui_spacer->attributeName(); - m_spacers.insert(ui_spacer, unique(name, QLatin1String("QSpacerItem"))); - } - - return m_spacers.value(ui_spacer); + return findOrInsert(&m_widgets, ui_widget, ui_widget->attributeClass()); } -QString Driver::findOrInsertLayout(DomLayout *ui_layout) +QString Driver::findOrInsertSpacer(const DomSpacer *ui_spacer) { - if (!m_layouts.contains(ui_layout)) { - QString name; - if (ui_layout->hasAttributeName()) - name = ui_layout->attributeName(); - m_layouts.insert(ui_layout, unique(name, ui_layout->attributeClass())); - } + return findOrInsert(&m_spacers, ui_spacer, spacerItemClass()); +} - return m_layouts.value(ui_layout); +QString Driver::findOrInsertLayout(const DomLayout *ui_layout) +{ + return findOrInsert(&m_layouts, ui_layout, ui_layout->attributeClass()); } -QString Driver::findOrInsertLayoutItem(DomLayoutItem *ui_layoutItem) +QString Driver::findOrInsertLayoutItem(const DomLayoutItem *ui_layoutItem) { switch (ui_layoutItem->kind()) { case DomLayoutItem::Widget: @@ -93,38 +93,29 @@ QString Driver::findOrInsertLayoutItem(DomLayoutItem *ui_layoutItem) return QString(); } -QString Driver::findOrInsertActionGroup(DomActionGroup *ui_group) +QString Driver::findOrInsertActionGroup(const DomActionGroup *ui_group) { - if (!m_actionGroups.contains(ui_group)) - m_actionGroups.insert(ui_group, unique(ui_group->attributeName(), QLatin1String("QActionGroup"))); - - return m_actionGroups.value(ui_group); + return findOrInsert(&m_actionGroups, ui_group, actionGroupClass()); } -QString Driver::findOrInsertAction(DomAction *ui_action) +QString Driver::findOrInsertAction(const DomAction *ui_action) { - if (!m_actions.contains(ui_action)) - m_actions.insert(ui_action, unique(ui_action->attributeName(), QLatin1String("QAction"))); - - return m_actions.value(ui_action); + return findOrInsert(&m_actions, ui_action, actionClass()); } QString Driver::findOrInsertButtonGroup(const DomButtonGroup *ui_group) { - ButtonGroupNameHash::iterator it = m_buttonGroups.find(ui_group); - if (it == m_buttonGroups.end()) - it = m_buttonGroups.insert(ui_group, unique(ui_group->attributeName(), QLatin1String("QButtonGroup"))); - return it.value(); + return findOrInsert(&m_buttonGroups, ui_group, buttonGroupClass()); } // Find a group by its non-uniqified name const DomButtonGroup *Driver::findButtonGroup(const QString &attributeName) const { - const ButtonGroupNameHash::const_iterator cend = m_buttonGroups.constEnd(); - for (ButtonGroupNameHash::const_iterator it = m_buttonGroups.constBegin(); it != cend; ++it) + for (auto it = m_buttonGroups.cbegin(), end = m_buttonGroups.cend(); it != end; ++it) { if (it.key()->attributeName() == attributeName) return it.key(); - return 0; + } + return nullptr; } @@ -136,11 +127,9 @@ QString Driver::findOrInsertName(const QString &name) QString Driver::normalizedName(const QString &name) { QString result = name; - QChar *data = result.data(); - for (int i = name.size(); --i >= 0; ++data) { - if (!data->isLetterOrNumber()) - *data = QLatin1Char('_'); - } + std::replace_if(result.begin(), result.end(), + [] (QChar c) { return !c.isLetterOrNumber(); }, + QLatin1Char('_')); return result; } @@ -149,23 +138,21 @@ QString Driver::unique(const QString &instanceName, const QString &className) QString name; bool alreadyUsed = false; - if (instanceName.size()) { - int id = 1; - name = instanceName; - name = normalizedName(name); + if (!instanceName.isEmpty()) { + name = normalizedName(instanceName); QString base = name; - while (m_nameRepository.contains(name)) { + for (int id = 1; m_nameRepository.contains(name); ++id) { alreadyUsed = true; - name = base + QString::number(id++); + name = base + QString::number(id); } - } else if (className.size()) { + } else if (!className.isEmpty()) { name = unique(qtify(className)); } else { name = unique(QLatin1String("var")); } - if (alreadyUsed && className.size()) { + if (alreadyUsed && !className.isEmpty()) { fprintf(stderr, "%s: Warning: The name '%s' (%s) is already in use, defaulting to '%s'.\n", qPrintable(m_option.messagePrefix()), qPrintable(instanceName), qPrintable(className), @@ -181,17 +168,10 @@ QString Driver::qtify(const QString &name) QString qname = name; if (qname.at(0) == QLatin1Char('Q') || qname.at(0) == QLatin1Char('K')) - qname = qname.mid(1); + qname.remove(0, 1); - int i=0; - while (i < qname.length()) { - if (qname.at(i).toLower() != qname.at(i)) - qname[i] = qname.at(i).toLower(); - else - break; - - ++i; - } + for (int i = 0, size = qname.size(); i < size && qname.at(i).isUpper(); ++i) + qname[i] = qname.at(i).toLower(); return qname; } @@ -306,56 +286,17 @@ bool Driver::uic(const QString &fileName, QTextStream *out) return rtn; } -void Driver::reset() -{ - Q_ASSERT( m_output == 0 ); - - m_option = Option(); - m_output = 0; - m_problems.clear(); - - QStringList m_problems; - - m_widgets.clear(); - m_spacers.clear(); - m_layouts.clear(); - m_actionGroups.clear(); - m_actions.clear(); - m_nameRepository.clear(); - m_pixmaps.clear(); -} - -void Driver::insertPixmap(const QString &pixmap) -{ - m_pixmaps.insert(pixmap, true); -} - -bool Driver::containsPixmap(const QString &pixmap) const -{ - return m_pixmaps.contains(pixmap); -} - -DomWidget *Driver::widgetByName(const QString &name) const +const DomWidget *Driver::widgetByName(const QString &name) const { return m_widgets.key(name); } -DomSpacer *Driver::spacerByName(const QString &name) const -{ - return m_spacers.key(name); -} - -DomLayout *Driver::layoutByName(const QString &name) const -{ - return m_layouts.key(name); -} - -DomActionGroup *Driver::actionGroupByName(const QString &name) const +const DomActionGroup *Driver::actionGroupByName(const QString &name) const { return m_actionGroups.key(name); } -DomAction *Driver::actionByName(const QString &name) const +const DomAction *Driver::actionByName(const QString &name) const { return m_actions.key(name); } diff --git a/src/tools/uic/driver.h b/src/tools/uic/driver.h index 1563bdbd83..1303d0bf8a 100644 --- a/src/tools/uic/driver.h +++ b/src/tools/uic/driver.h @@ -49,7 +49,7 @@ class DomButtonGroup; class Driver { - Q_DISABLE_COPY(Driver) + Q_DISABLE_COPY_MOVE(Driver) public: Driver(); virtual ~Driver(); @@ -63,13 +63,6 @@ public: inline QTextStream &output() const { return *m_output; } inline Option &option() { return m_option; } - // initialization - void reset(); - - // error - inline QStringList problems() { return m_problems; } - inline void addProblem(const QString &problem) { m_problems.append(problem); } - // utils static QString headerFileName(const QString &fileName); QString headerFileName() const; @@ -80,50 +73,42 @@ public: const QString &className=QString()); // symbol table - QString findOrInsertWidget(DomWidget *ui_widget); - QString findOrInsertSpacer(DomSpacer *ui_spacer); - QString findOrInsertLayout(DomLayout *ui_layout); - QString findOrInsertLayoutItem(DomLayoutItem *ui_layoutItem); + QString findOrInsertWidget(const DomWidget *ui_widget); + QString findOrInsertSpacer(const DomSpacer *ui_spacer); + QString findOrInsertLayout(const DomLayout *ui_layout); + QString findOrInsertLayoutItem(const DomLayoutItem *ui_layoutItem); QString findOrInsertName(const QString &name); - QString findOrInsertActionGroup(DomActionGroup *ui_group); - QString findOrInsertAction(DomAction *ui_action); + QString findOrInsertActionGroup(const DomActionGroup *ui_group); + QString findOrInsertAction(const DomAction *ui_action); QString findOrInsertButtonGroup(const DomButtonGroup *ui_group); // Find a group by its non-uniqified name const DomButtonGroup *findButtonGroup(const QString &attributeName) const; - inline bool hasName(const QString &name) const - { return m_nameRepository.contains(name); } - - DomWidget *widgetByName(const QString &name) const; - DomSpacer *spacerByName(const QString &name) const; - DomLayout *layoutByName(const QString &name) const; - DomActionGroup *actionGroupByName(const QString &name) const; - DomAction *actionByName(const QString &name) const; - - // pixmap - void insertPixmap(const QString &pixmap); - bool containsPixmap(const QString &pixmap) const; + const DomWidget *widgetByName(const QString &name) const; + const DomActionGroup *actionGroupByName(const QString &name) const; + const DomAction *actionByName(const QString &name) const; bool useIdBasedTranslations() const { return m_idBasedTranslations; } void setUseIdBasedTranslations(bool u) { m_idBasedTranslations = u; } private: + template <class DomClass> using DomObjectHash = QHash<const DomClass *, QString>; + + template <class DomClass> + QString findOrInsert(DomObjectHash<DomClass> *domHash, const DomClass *dom, const QString &className); + Option m_option; QTextStream m_stdout; QTextStream *m_output; - QStringList m_problems; - // symbol tables - QHash<DomWidget*, QString> m_widgets; - QHash<DomSpacer*, QString> m_spacers; - QHash<DomLayout*, QString> m_layouts; - QHash<DomActionGroup*, QString> m_actionGroups; - typedef QHash<const DomButtonGroup*, QString> ButtonGroupNameHash; - ButtonGroupNameHash m_buttonGroups; - QHash<DomAction*, QString> m_actions; + DomObjectHash<DomWidget> m_widgets; + DomObjectHash<DomSpacer> m_spacers; + DomObjectHash<DomLayout> m_layouts; + DomObjectHash<DomActionGroup> m_actionGroups; + DomObjectHash<DomButtonGroup> m_buttonGroups; + DomObjectHash<DomAction> m_actions; QHash<QString, bool> m_nameRepository; - QHash<QString, bool> m_pixmaps; bool m_idBasedTranslations = false; }; diff --git a/src/tools/uic/main.cpp b/src/tools/uic/main.cpp index 41bd62bbf4..0516b854ff 100644 --- a/src/tools/uic/main.cpp +++ b/src/tools/uic/main.cpp @@ -131,7 +131,7 @@ int runUic(int argc, char *argv[]) QTextStream *out = 0; QFile f; - if (driver.option().outputFile.size()) { + if (!driver.option().outputFile.isEmpty()) { f.setFileName(driver.option().outputFile); if (!f.open(QIODevice::WriteOnly | QFile::Text)) { fprintf(stderr, "Could not create output file\n"); diff --git a/src/tools/uic/shared/language.cpp b/src/tools/uic/shared/language.cpp new file mode 100644 index 0000000000..730e1562bc --- /dev/null +++ b/src/tools/uic/shared/language.cpp @@ -0,0 +1,144 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "language.h" + +#include <QtCore/qtextstream.h> + +namespace language { + +QTextStream &operator<<(QTextStream &str, const qtConfig &c) +{ + str << "QT_CONFIG(" << c.parameter() << ')'; + return str; +} + +QTextStream &operator<<(QTextStream &str, const openQtConfig &c) +{ + str << "#if " << qtConfig(c.parameter()) << '\n'; + return str; +} + +QTextStream &operator<<(QTextStream &str, const closeQtConfig &c) +{ + str << "#endif // " << qtConfig(c.parameter()) << '\n'; + return str; +} + +struct EnumLookup +{ + int value; + const char *valueString; +}; + +template <int N> +const char *lookupEnum(const EnumLookup(&array)[N], int value, int defaultIndex = 0) +{ + for (int i = 0; i < N; ++i) { + if (value == array[i].value) + return array[i].valueString; + } + const char *defaultValue = array[defaultIndex].valueString; + qWarning("uic: Warning: Invalid enumeration value %d, defaulting to %s", + value, defaultValue); + return defaultValue; +} + +const char *toolbarArea(int v) +{ + static const EnumLookup toolBarAreas[] = + { + {0, "NoToolBarArea"}, + {0x1, "LeftToolBarArea"}, + {0x2, "RightToolBarArea"}, + {0x4, "TopToolBarArea"}, + {0x8, "BottomToolBarArea"}, + {0xf, "AllToolBarAreas"} + }; + return lookupEnum(toolBarAreas, v); +} + +const char *sizePolicy(int v) +{ + static const EnumLookup sizePolicies[] = + { + {0, "Fixed"}, + {0x1, "Minimum"}, + {0x4, "Maximum"}, + {0x5, "Preferred"}, + {0x3, "MinimumExpanding"}, + {0x7, "Expanding"}, + {0xD, "Ignored"} + }; + return lookupEnum(sizePolicies, v, 3); +} + +const char *dockWidgetArea(int v) +{ + static const EnumLookup dockWidgetAreas[] = + { + {0, "NoDockWidgetArea"}, + {0x1, "LeftDockWidgetArea"}, + {0x2, "RightDockWidgetArea"}, + {0x4, "TopDockWidgetArea"}, + {0x8, "BottomDockWidgetArea"}, + {0xf, "AllDockWidgetAreas"} + }; + return lookupEnum(dockWidgetAreas, v); +} + +const char *paletteColorRole(int v) +{ + static const EnumLookup colorRoles[] = + { + {0, "WindowText"}, + {1, "Button"}, + {2, "Light"}, + {3, "Midlight"}, + {4, "Dark"}, + {5, "Mid"}, + {6, "Text"}, + {7, "BrightText"}, + {8, "ButtonText"}, + {9, "Base"}, + {10, "Window"}, + {11, "Shadow"}, + {12, "Highlight"}, + {13, "HighlightedText"}, + {14, "Link"}, + {15, "LinkVisited"}, + {16, "AlternateBase"}, + {17, "NoRole"}, + {18, "ToolTipBase"}, + {19, "ToolTipText"}, + {20, "PlaceholderText"}, + }; + return lookupEnum(colorRoles, v); +} + +} // namespace language diff --git a/src/tools/uic/globaldefs.h b/src/tools/uic/shared/language.h index 5ad193c29a..e7201b6529 100644 --- a/src/tools/uic/globaldefs.h +++ b/src/tools/uic/shared/language.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -26,16 +26,56 @@ ** ****************************************************************************/ -#ifndef GLOBALDEFS_H -#define GLOBALDEFS_H +#ifndef LANGUAGE_H +#define LANGUAGE_H -#include <qglobal.h> +#include <QtCore/qstringview.h> -QT_BEGIN_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QTextStream) -enum { BOXLAYOUT_DEFAULT_MARGIN = 11 }; -enum { BOXLAYOUT_DEFAULT_SPACING = 6 }; +namespace language { -QT_END_NAMESPACE +// Base class for streamable objects with one QStringView parameter +class StringViewStreamable +{ +public: + StringViewStreamable(QStringView parameter) : m_parameter(parameter) {} -#endif // GLOBALDEFS_H + QStringView parameter() const { return m_parameter; } + +private: + QStringView m_parameter; +}; + +class qtConfig : public StringViewStreamable +{ +public: + qtConfig(QStringView name) : StringViewStreamable(name) {} +}; + +QTextStream &operator<<(QTextStream &str, const qtConfig &c); + +class openQtConfig : public StringViewStreamable +{ +public: + openQtConfig(QStringView name) : StringViewStreamable(name) {} +}; + +QTextStream &operator<<(QTextStream &str, const openQtConfig &c); + +class closeQtConfig : public StringViewStreamable +{ +public: + closeQtConfig(QStringView name) : StringViewStreamable(name) {} +}; + +QTextStream &operator<<(QTextStream &, const closeQtConfig &c); + +const char *toolbarArea(int v); +const char *sizePolicy(int v); +const char *dockWidgetArea(int v); +const char *paletteColorRole(int v); + +} // namespace language + +#endif // LANGUAGE_H diff --git a/src/tools/uic/shared/shared.pri b/src/tools/uic/shared/shared.pri new file mode 100644 index 0000000000..dce2af8bf1 --- /dev/null +++ b/src/tools/uic/shared/shared.pri @@ -0,0 +1,5 @@ +INCLUDEPATH += $$PWD + +HEADERS += $$PWD/language.h + +SOURCES += $$PWD/language.cpp diff --git a/src/tools/uic/treewalker.h b/src/tools/uic/treewalker.h index 43d4633d83..7e8eda57d9 100644 --- a/src/tools/uic/treewalker.h +++ b/src/tools/uic/treewalker.h @@ -101,7 +101,6 @@ struct TreeWalker virtual void acceptTime(DomTime *time); virtual void acceptDateTime(DomDateTime *dateTime); virtual void acceptProperty(DomProperty *property); - typedef QVector<DomScript *> DomScripts; typedef QVector<DomWidget *> DomWidgets; virtual void acceptIncludes(DomIncludes *includes); virtual void acceptInclude(DomInclude *incl); diff --git a/src/tools/uic/uic.cpp b/src/tools/uic/uic.cpp index a5b331192f..225dc6aeb2 100644 --- a/src/tools/uic/uic.cpp +++ b/src/tools/uic/uic.cpp @@ -106,13 +106,13 @@ bool Uic::printDependencies() void Uic::writeCopyrightHeader(DomUI *ui) { QString comment = ui->elementComment(); - if (comment.size()) + if (!comment.isEmpty()) out << "/*\n" << comment << "\n*/\n\n"; out << "/********************************************************************************\n"; out << "** Form generated from reading UI file '" << QFileInfo(opt.inputFile).fileName() << "'\n"; out << "**\n"; - out << "** Created by: Qt User Interface Compiler version " << QLatin1String(QT_VERSION_STR) << "\n"; + out << "** Created by: Qt User Interface Compiler version " << QT_VERSION_STR << "\n"; out << "**\n"; out << "** WARNING! All changes made in this file will be lost when recompiling UI file!\n"; out << "********************************************************************************/\n\n"; @@ -243,55 +243,34 @@ void Uic::writeHeaderProtectionEnd() out << "#endif // " << h << "\n"; } -bool Uic::isMainWindow(const QString &className) const -{ - return customWidgetsInfo()->extends(className, QLatin1String("QMainWindow")); -} - -bool Uic::isToolBar(const QString &className) const -{ - return customWidgetsInfo()->extends(className, QLatin1String("QToolBar")); -} - bool Uic::isButton(const QString &className) const { - return customWidgetsInfo()->extends(className, QLatin1String("QRadioButton")) - || customWidgetsInfo()->extends(className, QLatin1String("QToolButton")) - || customWidgetsInfo()->extends(className, QLatin1String("QCheckBox")) - || customWidgetsInfo()->extends(className, QLatin1String("QPushButton")) - || customWidgetsInfo()->extends(className, QLatin1String("QCommandLinkButton")); + static const QStringList buttons = { + QLatin1String("QRadioButton"), QLatin1String("QToolButton"), + QLatin1String("QCheckBox"), QLatin1String("QPushButton"), + QLatin1String("QCommandLinkButton") + }; + return customWidgetsInfo()->extendsOneOf(className, buttons); } bool Uic::isContainer(const QString &className) const { - return customWidgetsInfo()->extends(className, QLatin1String("QStackedWidget")) - || customWidgetsInfo()->extends(className, QLatin1String("QToolBox")) - || customWidgetsInfo()->extends(className, QLatin1String("QTabWidget")) - || customWidgetsInfo()->extends(className, QLatin1String("QScrollArea")) - || customWidgetsInfo()->extends(className, QLatin1String("QMdiArea")) - || customWidgetsInfo()->extends(className, QLatin1String("QWizard")) - || customWidgetsInfo()->extends(className, QLatin1String("QDockWidget")); -} - -bool Uic::isCustomWidgetContainer(const QString &className) const -{ - return customWidgetsInfo()->isCustomWidgetContainer(className); -} - -bool Uic::isStatusBar(const QString &className) const -{ - return customWidgetsInfo()->extends(className, QLatin1String("QStatusBar")); -} - -bool Uic::isMenuBar(const QString &className) const -{ - return customWidgetsInfo()->extends(className, QLatin1String("QMenuBar")); + static const QStringList containers = { + QLatin1String("QStackedWidget"), QLatin1String("QToolBox"), + QLatin1String("QTabWidget"), QLatin1String("QScrollArea"), + QLatin1String("QMdiArea"), QLatin1String("QWizard"), + QLatin1String("QDockWidget") + }; + + return customWidgetsInfo()->extendsOneOf(className, containers); } bool Uic::isMenu(const QString &className) const { - return customWidgetsInfo()->extends(className, QLatin1String("QMenu")) - || customWidgetsInfo()->extends(className, QLatin1String("QPopupMenu")); + static const QStringList menus = { + QLatin1String("QMenu"), QLatin1String("QPopupMenu") + }; + return customWidgetsInfo()->extendsOneOf(className, menus); } QT_END_NAMESPACE diff --git a/src/tools/uic/uic.h b/src/tools/uic/uic.h index 4c961aa0a5..af5f42c6db 100644 --- a/src/tools/uic/uic.h +++ b/src/tools/uic/uic.h @@ -53,7 +53,7 @@ struct Option; class Uic { - Q_DISABLE_COPY(Uic) + Q_DISABLE_COPY_MOVE(Uic) public: Uic(Driver *driver); ~Uic(); @@ -85,13 +85,8 @@ public: bool write(DomUI *ui); - bool isMainWindow(const QString &className) const; - bool isToolBar(const QString &className) const; - bool isStatusBar(const QString &className) const; bool isButton(const QString &className) const; bool isContainer(const QString &className) const; - bool isCustomWidgetContainer(const QString &className) const; - bool isMenuBar(const QString &className) const; bool isMenu(const QString &className) const; private: diff --git a/src/tools/uic/uic.pri b/src/tools/uic/uic.pri index 3f0bab05dd..1c9098dcf9 100644 --- a/src/tools/uic/uic.pri +++ b/src/tools/uic/uic.pri @@ -5,7 +5,6 @@ HEADERS += \ $$PWD/customwidgetsinfo.h \ $$PWD/databaseinfo.h \ $$PWD/driver.h \ - $$PWD/globaldefs.h \ $$PWD/option.h \ $$PWD/treewalker.h \ $$PWD/utils.h \ diff --git a/src/tools/uic/uic.pro b/src/tools/uic/uic.pro index 18511395d9..4469ce50e5 100644 --- a/src/tools/uic/uic.pro +++ b/src/tools/uic/uic.pro @@ -5,6 +5,7 @@ option(host_build) DEFINES += QT_UIC QT_NO_CAST_FROM_ASCII QT_NO_FOREACH include(uic.pri) +include(shared/shared.pri) include(cpp/cpp.pri) HEADERS += uic.h |