diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-10-22 13:42:22 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-11-13 18:53:12 +0000 |
commit | 24d1565789cbd31ce383ac789bb6d69116a77a09 (patch) | |
tree | f5b4e15ac728ec08519146672ad35d1f12c88539 /src/tools | |
parent | dbffff0116f9618902cf4e9615a0ca6a7a6db9ed (diff) |
uic: Use the Qt configure system when generating code
Replace the generation of #ifdef's for the macros by QT_CONFIG
checks. Implement it using streamable classes to make it easier
to switch the output language later.
Task-number: PYSIDE-797
Change-Id: I28b5ed3ec80cd525a3df0cd54d9be4f09149cde4
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/uic/cpp/cppwriteinitialization.cpp | 91 | ||||
-rw-r--r-- | src/tools/uic/shared/language.cpp | 53 | ||||
-rw-r--r-- | src/tools/uic/shared/language.h | 76 | ||||
-rw-r--r-- | src/tools/uic/shared/shared.pri | 5 | ||||
-rw-r--r-- | src/tools/uic/uic.pro | 1 |
5 files changed, 190 insertions, 36 deletions
diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index 4f6ac1eb97..a75aa0abd7 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.cpp +++ b/src/tools/uic/cpp/cppwriteinitialization.cpp @@ -34,6 +34,8 @@ #include "databaseinfo.h" #include "globaldefs.h" +#include <language.h> + #include <qtextstream.h> #include <qdebug.h> @@ -172,17 +174,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) : @@ -520,7 +521,7 @@ 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", @@ -537,7 +538,7 @@ 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()); @@ -1124,6 +1125,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, @@ -1461,28 +1479,18 @@ void WriteInitialization::writeProperties(const QString &varName, } 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; + 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(). @@ -2127,9 +2135,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) @@ -2466,7 +2477,7 @@ static void generateMultiDirectiveBegin(QTextStream &outputStream, const QSet<QS return; if (directives.size() == 1) { - outputStream << "#ifndef " << *directives.cbegin() << endl; + outputStream << language::openQtConfig(*directives.cbegin()); return; } @@ -2474,7 +2485,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) @@ -2531,9 +2545,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)) @@ -2560,14 +2576,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/shared/language.cpp b/src/tools/uic/shared/language.cpp new file mode 100644 index 0000000000..2ab89c2d7b --- /dev/null +++ b/src/tools/uic/shared/language.cpp @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** 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; +} + +} // namespace language diff --git a/src/tools/uic/shared/language.h b/src/tools/uic/shared/language.h new file mode 100644 index 0000000000..71cfddd6b0 --- /dev/null +++ b/src/tools/uic/shared/language.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef LANGUAGE_H +#define LANGUAGE_H + +#include <QtCore/qstringview.h> + +QT_FORWARD_DECLARE_CLASS(QTextStream) + +namespace language { + +// Base class for streamable objects with one QStringView parameter +class StringViewStreamable +{ +public: + StringViewStreamable(QStringView parameter) : m_parameter(parameter) {} + + 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); + +} // 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/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 |