diff options
Diffstat (limited to 'src/tools')
31 files changed, 891 insertions, 520 deletions
diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index 20b1befc38..3af5237f3d 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -1400,8 +1400,8 @@ bool updateAndroidManifest(Options &options) options.packageName = reader.attributes().value(QLatin1String("package")).toString(); } else if (reader.name() == QLatin1String("uses-sdk")) { if (reader.attributes().hasAttribute(QLatin1String("android:minSdkVersion"))) - if (reader.attributes().value(QLatin1String("android:minSdkVersion")).toInt() < 16) { - fprintf(stderr, "Invalid minSdkVersion version, minSdkVersion must be >= 16\n"); + if (reader.attributes().value(QLatin1String("android:minSdkVersion")).toInt() < 21) { + fprintf(stderr, "Invalid minSdkVersion version, minSdkVersion must be >= 21\n"); return false; } } else if ((reader.name() == QLatin1String("application") || diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index fd76646f4c..02c1fbd394 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -619,7 +619,7 @@ void Generator::generateCode() fprintf(out, "// a) You are using a NOTIFY signal that does not exist. Fix it.\n"); fprintf(out, "// b) You are using a NOTIFY signal that does exist (in a parent class) but has a non-empty parameter list. This is a moc limitation.\n"); fprintf(out, "Q_DECL_UNUSED static void checkNotifySignalValidity_%s(%s *t) {\n", qualifiedClassNameIdentifier.constData(), cdef->qualified.constData()); - for (const QByteArray &nonClassSignal : cdef->nonClassSignalList) + for (const QByteArray &nonClassSignal : qAsConst(cdef->nonClassSignalList)) fprintf(out, " t->%s();\n", nonClassSignal.constData()); fprintf(out, "}\n"); } @@ -1549,16 +1549,16 @@ void Generator::generateSignal(FunctionDef *def,int index) fprintf(out, "nullptr"); } else { if (def->returnTypeIsVolatile) - fprintf(out, "const_cast<void*>(reinterpret_cast<const volatile void*>(&_t0))"); + fprintf(out, "const_cast<void*>(reinterpret_cast<const volatile void*>(std::addressof(_t0)))"); else - fprintf(out, "const_cast<void*>(reinterpret_cast<const void*>(&_t0))"); + fprintf(out, "const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t0)))"); } int i; for (i = 1; i < offset; ++i) if (i <= def->arguments.count() && def->arguments.at(i - 1).type.isVolatile) - fprintf(out, ", const_cast<void*>(reinterpret_cast<const volatile void*>(&_t%d))", i); + fprintf(out, ", const_cast<void*>(reinterpret_cast<const volatile void*>(std::addressof(_t%d)))", i); else - fprintf(out, ", const_cast<void*>(reinterpret_cast<const void*>(&_t%d))", i); + fprintf(out, ", const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t%d)))", i); fprintf(out, " };\n"); fprintf(out, " QMetaObject::activate(%s, &staticMetaObject, %d, _a);\n", thisPtr.constData(), index); if (def->normalizedType != "void") diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 7272df4265..5d777ece2e 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -992,7 +992,7 @@ void Moc::generate(FILE *out) fprintf(out, "** WARNING! All changes made in this file will be lost!\n" "*****************************************************************************/\n\n"); - + fprintf(out, "#include <memory>\n"); // For std::addressof if (!noInclude) { if (includePath.size() && !includePath.endsWith('/')) includePath += '/'; diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index d98c73e1a0..d6482f4e44 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -83,57 +83,53 @@ Q_DECLARE_TYPEINFO(ArgumentDef, Q_MOVABLE_TYPE); struct FunctionDef { - FunctionDef(): returnTypeIsVolatile(false), access(Private), isConst(false), isVirtual(false), isStatic(false), - inlineCode(false), wasCloned(false), isCompat(false), isInvokable(false), - isScriptable(false), isSlot(false), isSignal(false), isPrivateSignal(false), - isConstructor(false), isDestructor(false), isAbstract(false), revision(0) {} Type type; + QVector<ArgumentDef> arguments; QByteArray normalizedType; QByteArray tag; QByteArray name; - bool returnTypeIsVolatile; - - QVector<ArgumentDef> arguments; + QByteArray inPrivateClass; enum Access { Private, Protected, Public }; - Access access; - bool isConst; - bool isVirtual; - bool isStatic; - bool inlineCode; - bool wasCloned; - - QByteArray inPrivateClass; - bool isCompat; - bool isInvokable; - bool isScriptable; - bool isSlot; - bool isSignal; - bool isPrivateSignal; - bool isConstructor; - bool isDestructor; - bool isAbstract; - - int revision; + Access access = Private; + int revision = 0; + + bool isConst = false; + bool isVirtual = false; + bool isStatic = false; + bool inlineCode = false; + bool wasCloned = false; + + bool returnTypeIsVolatile = false; + + bool isCompat = false; + bool isInvokable = false; + bool isScriptable = false; + bool isSlot = false; + bool isSignal = false; + bool isPrivateSignal = false; + bool isConstructor = false; + bool isDestructor = false; + bool isAbstract = false; }; Q_DECLARE_TYPEINFO(FunctionDef, Q_MOVABLE_TYPE); struct PropertyDef { - PropertyDef():notifyId(-1), constant(false), final(false), gspec(ValueSpec), revision(0){} - QByteArray name, type, member, read, write, reset, designable, scriptable, editable, stored, user, notify, inPrivateClass; - int notifyId; // -1 means no notifyId, >= 0 means signal defined in this class, < -1 means signal not defined in this class - bool constant; - bool final; - enum Specification { ValueSpec, ReferenceSpec, PointerSpec }; - Specification gspec; bool stdCppSet() const { QByteArray s("set"); s += toupper(name[0]); s += name.mid(1); return (s == write); } - int revision; + + QByteArray name, type, member, read, write, reset, designable, scriptable, editable, stored, user, notify, inPrivateClass; + int notifyId = -1; // -1 means no notifyId, >= 0 means signal defined in this class, < -1 means signal not defined in this class + enum Specification { ValueSpec, ReferenceSpec, PointerSpec }; + Specification gspec = ValueSpec; + int revision = 0; + bool constant = false; + bool final = false; }; Q_DECLARE_TYPEINFO(PropertyDef, Q_MOVABLE_TYPE); @@ -169,9 +165,6 @@ struct ClassDef : BaseDef { }; QVector<QVector<Interface> >interfaceList; - bool hasQObject = false; - bool hasQGadget = false; - struct PluginData { QByteArray iid; QMap<QString, QJsonArray> metaArgs; @@ -181,11 +174,14 @@ struct ClassDef : BaseDef { QVector<FunctionDef> constructorList; QVector<FunctionDef> signalList, slotList, methodList, publicList; QVector<QByteArray> nonClassSignalList; - int notifyableProperties = 0; QVector<PropertyDef> propertyList; + int notifyableProperties = 0; int revisionedMethods = 0; int revisionedProperties = 0; + bool hasQObject = false; + bool hasQGadget = false; + }; Q_DECLARE_TYPEINFO(ClassDef, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(ClassDef::Interface, Q_MOVABLE_TYPE); diff --git a/src/tools/moc/util/generate.sh b/src/tools/moc/util/generate.sh index 3894be1309..5460d28924 100755 --- a/src/tools/moc/util/generate.sh +++ b/src/tools/moc/util/generate.sh @@ -27,6 +27,8 @@ ## ############################################################################# +set -ex + qmake make cat licenseheader.txt > ../keywords.cpp diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp index ab7726a01f..ea410cd257 100644 --- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp +++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp @@ -326,7 +326,6 @@ static void writeArgList(QTextStream &ts, const QStringList &argNames, // yes, starting from 1 for (int i = 1; i < outputArgs.count(); ++i) { const QDBusIntrospection::Argument &arg = outputArgs.at(i); - QString name = arg.name; if (!first) ts << ", "; @@ -531,8 +530,6 @@ static void writeProxy(const QString &filename, const QDBusIntrospection::Interf // properties: for (const QDBusIntrospection::Property &property : interface->properties) { QByteArray type = qtTypeName(property.type, property.annotations); - QString templateType = templateArg(type); - QString constRefType = constRefArg(type); QString getter = propertyGetter(property); QString setter = propertySetter(property); diff --git a/src/tools/qfloat16-tables/gen_qfloat16_tables.cpp b/src/tools/qfloat16-tables/gen_qfloat16_tables.cpp index f5051e25fc..17fc978039 100644 --- a/src/tools/qfloat16-tables/gen_qfloat16_tables.cpp +++ b/src/tools/qfloat16-tables/gen_qfloat16_tables.cpp @@ -68,7 +68,7 @@ qint32 main(qint32 argc, char **argv) return -1; } - QFile fid(argv[1]); + QFile fid(QFile::decodeName(argv[1])); if (!fid.open(QIODevice::WriteOnly | QIODevice::Text)) { qWarning() << "Abort: Failed to open/create file" << fid.fileName(); return -1; @@ -79,6 +79,7 @@ qint32 main(qint32 argc, char **argv) fid.write("#include <QtCore/qfloat16.h>\n\n"); fid.write("QT_BEGIN_NAMESPACE\n\n"); + fid.write("#if !defined(__F16C__) && !defined(__ARM_FP16_FORMAT_IEEE)\n\n"); fid.write("const quint32 qfloat16::mantissatable[2048] = {\n"); fid.write("0,\n"); @@ -155,6 +156,7 @@ qint32 main(qint32 argc, char **argv) fid.write("};\n\n"); + fid.write("#endif // !__F16C__ && !__ARM_FP16_FORMAT_IEEE\n\n"); fid.write("QT_END_NAMESPACE\n"); fid.close(); return 0; diff --git a/src/tools/qlalr/cppgenerator.cpp b/src/tools/qlalr/cppgenerator.cpp index b14c73a8fe..508db696b1 100644 --- a/src/tools/qlalr/cppgenerator.cpp +++ b/src/tools/qlalr/cppgenerator.cpp @@ -460,7 +460,7 @@ void CppGenerator::generateDecl (QTextStream &out) << "public:" << endl << " enum VariousConstants {" << endl; - for (Name t : qAsConst(grammar.terminals)) + for (const Name &t : qAsConst(grammar.terminals)) { QString name = *t; int value = std::distance (grammar.names.begin (), t); diff --git a/src/tools/qlalr/lalr.h b/src/tools/qlalr/lalr.h index 6a2baaa462..8eadee400d 100644 --- a/src/tools/qlalr/lalr.h +++ b/src/tools/qlalr/lalr.h @@ -61,6 +61,8 @@ public: public: const_iterator () {} + const_iterator (const typename _Base::iterator &it): + _M_iterator (typename _Base::const_iterator(it)) {} const_iterator (const typename _Base::const_iterator &it): _M_iterator (it) {} diff --git a/src/tools/rcc/main.cpp b/src/tools/rcc/main.cpp index 12f986b1e2..6e8c13be15 100644 --- a/src/tools/rcc/main.cpp +++ b/src/tools/rcc/main.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2018 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -127,10 +128,25 @@ int runRcc(int argc, char *argv[]) QCommandLineOption rootOption(QStringLiteral("root"), QStringLiteral("Prefix resource access path with root path."), QStringLiteral("path")); parser.addOption(rootOption); +#if QT_CONFIG(zstd) && !defined(QT_NO_COMPRESS) +# define ALGOS "[zstd], zlib, none" +#elif QT_CONFIG(zstd) +# define ALGOS "[zstd], none" +#elif !defined(QT_NO_COMPRESS) +# define ALGOS "[zlib], none" +#else +# define ALGOS "[none]" +#endif + const QString &algoDescription = + QStringLiteral("Compress input files using algorithm <algo> (" ALGOS ")."); + QCommandLineOption compressionAlgoOption(QStringLiteral("compress-algo"), algoDescription, QStringLiteral("algo")); + parser.addOption(compressionAlgoOption); +#undef ALGOS + QCommandLineOption compressOption(QStringLiteral("compress"), QStringLiteral("Compress input files by <level>."), QStringLiteral("level")); parser.addOption(compressOption); - QCommandLineOption nocompressOption(QStringLiteral("no-compress"), QStringLiteral("Disable all compression.")); + QCommandLineOption nocompressOption(QStringLiteral("no-compress"), QStringLiteral("Disable all compression. Same as --compress-algo=none.")); parser.addOption(nocompressOption); QCommandLineOption thresholdOption(QStringLiteral("threshold"), QStringLiteral("Threshold to consider compressing files."), QStringLiteral("level")); @@ -169,13 +185,13 @@ int runRcc(int argc, char *argv[]) QString errorMsg; - quint8 formatVersion = 2; + quint8 formatVersion = 3; if (parser.isSet(formatVersionOption)) { bool ok = false; formatVersion = parser.value(formatVersionOption).toUInt(&ok); if (!ok) { errorMsg = QLatin1String("Invalid format version specified"); - } else if (formatVersion != 1 && formatVersion != 2) { + } else if (formatVersion < 1 || formatVersion > 3) { errorMsg = QLatin1String("Unsupported format version specified"); } } @@ -189,10 +205,17 @@ int runRcc(int argc, char *argv[]) || library.resourceRoot().at(0) != QLatin1Char('/')) errorMsg = QLatin1String("Root must start with a /"); } - if (parser.isSet(compressOption)) - library.setCompressLevel(parser.value(compressOption).toInt()); + + if (parser.isSet(compressionAlgoOption)) + library.setCompressionAlgorithm(RCCResourceLibrary::parseCompressionAlgorithm(parser.value(compressionAlgoOption), &errorMsg)); + if (formatVersion < 3 && library.compressionAlgorithm() == RCCResourceLibrary::CompressionAlgorithm::Zstd) + errorMsg = QLatin1String("Zstandard compression requires format version 3 or higher"); if (parser.isSet(nocompressOption)) - library.setCompressLevel(-2); + library.setCompressionAlgorithm(RCCResourceLibrary::CompressionAlgorithm::None); + if (parser.isSet(compressOption) && errorMsg.isEmpty()) { + int level = library.parseCompressionLevel(library.compressionAlgorithm(), parser.value(compressOption), &errorMsg); + library.setCompressLevel(level); + } if (parser.isSet(thresholdOption)) library.setCompressThreshold(parser.value(thresholdOption).toInt()); if (parser.isSet(binaryOption)) diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp index 1a7cab01df..862e574f2d 100644 --- a/src/tools/rcc/rcc.cpp +++ b/src/tools/rcc/rcc.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2018 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -41,6 +42,10 @@ #include <algorithm> +#if QT_CONFIG(zstd) +# include <zstd.h> +#endif + // Note: A copy of this file is used in Qt Designer (qttools/src/designer/src/lib/shared/rcc.cpp) QT_BEGIN_NAMESPACE @@ -48,9 +53,18 @@ QT_BEGIN_NAMESPACE enum { CONSTANT_USENAMESPACE = 1, CONSTANT_COMPRESSLEVEL_DEFAULT = -1, + CONSTANT_ZSTDCOMPRESSLEVEL_CHECK = 1, // Zstd level to check if compressing is a good idea + CONSTANT_ZSTDCOMPRESSLEVEL_STORE = 14, // Zstd level to actually store the data CONSTANT_COMPRESSTHRESHOLD_DEFAULT = 70 }; +#if QT_CONFIG(zstd) +# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::Zstd +#elif !defined(QT_NO_COMPRESS) +# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::Zlib +#else +# define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::None +#endif #define writeString(s) write(s, sizeof(s)) @@ -88,15 +102,18 @@ class RCCFileInfo public: enum Flags { + // must match qresource.cpp NoFlags = 0x00, Compressed = 0x01, - Directory = 0x02 + Directory = 0x02, + CompressedZstd = 0x04 }; RCCFileInfo(const QString &name = QString(), const QFileInfo &fileInfo = QFileInfo(), QLocale::Language language = QLocale::C, QLocale::Country country = QLocale::AnyCountry, uint flags = NoFlags, + RCCResourceLibrary::CompressionAlgorithm compressAlgo = CONSTANT_COMPRESSALGO_DEFAULT, int compressLevel = CONSTANT_COMPRESSLEVEL_DEFAULT, int compressThreshold = CONSTANT_COMPRESSTHRESHOLD_DEFAULT); ~RCCFileInfo(); @@ -115,6 +132,7 @@ public: QFileInfo m_fileInfo; RCCFileInfo *m_parent; QHash<QString, RCCFileInfo*> m_children; + RCCResourceLibrary::CompressionAlgorithm m_compressAlgo; int m_compressLevel; int m_compressThreshold; @@ -125,7 +143,7 @@ public: RCCFileInfo::RCCFileInfo(const QString &name, const QFileInfo &fileInfo, QLocale::Language language, QLocale::Country country, uint flags, - int compressLevel, int compressThreshold) + RCCResourceLibrary::CompressionAlgorithm compressAlgo, int compressLevel, int compressThreshold) { m_name = name; m_fileInfo = fileInfo; @@ -136,6 +154,7 @@ RCCFileInfo::RCCFileInfo(const QString &name, const QFileInfo &fileInfo, m_nameOffset = 0; m_dataOffset = 0; m_childOffset = 0; + m_compressAlgo = compressAlgo; m_compressLevel = compressLevel; m_compressThreshold = compressThreshold; } @@ -211,6 +230,9 @@ void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib) static const quint64 sourceDate = 1000 * qgetenv("QT_RCC_SOURCE_DATE_OVERRIDE").toULongLong(); if (sourceDate != 0) lastmod = sourceDate; + static const quint64 sourceDate2 = 1000 * qgetenv("SOURCE_DATE_EPOCH").toULongLong(); + if (sourceDate2 != 0) + lastmod = sourceDate2; lib.writeNumber8(lastmod); if (text || pass1) lib.writeChar('\n'); @@ -236,19 +258,82 @@ qint64 RCCFileInfo::writeDataBlob(RCCResourceLibrary &lib, qint64 offset, } QByteArray data = file.readAll(); -#ifndef QT_NO_COMPRESS // Check if compression is useful for this file - if (m_compressLevel != 0 && data.size() != 0) { - QByteArray compressed = - qCompress(reinterpret_cast<uchar *>(data.data()), data.size(), m_compressLevel); - - int compressRatio = int(100.0 * (data.size() - compressed.size()) / data.size()); - if (compressRatio >= m_compressThreshold) { - data = compressed; - m_flags |= Compressed; + if (data.size() != 0) { +#if QT_CONFIG(zstd) + if (m_compressAlgo == RCCResourceLibrary::CompressionAlgorithm::Best) { + m_compressAlgo = RCCResourceLibrary::CompressionAlgorithm::Zstd; + m_compressLevel = 19; // not ZSTD_maxCLevel(), as 20+ are experimental + } + if (m_compressAlgo == RCCResourceLibrary::CompressionAlgorithm::Zstd) { + if (lib.m_zstdCCtx == nullptr) + lib.m_zstdCCtx = ZSTD_createCCtx(); + qsizetype size = data.size(); + size = ZSTD_COMPRESSBOUND(size); + + int compressLevel = m_compressLevel; + if (compressLevel < 0) + compressLevel = CONSTANT_ZSTDCOMPRESSLEVEL_CHECK; + + QByteArray compressed(size, Qt::Uninitialized); + char *dst = const_cast<char *>(compressed.constData()); + size_t n = ZSTD_compressCCtx(lib.m_zstdCCtx, dst, size, + data.constData(), data.size(), + compressLevel); + if (n * 100.0 < data.size() * 1.0 * (100 - m_compressThreshold) ) { + // compressing is worth it + if (m_compressLevel < 0) { + // heuristic compression, so recompress + n = ZSTD_compressCCtx(lib.m_zstdCCtx, dst, size, + data.constData(), data.size(), + CONSTANT_ZSTDCOMPRESSLEVEL_STORE); + } + if (ZSTD_isError(n)) { + QString msg = QString::fromLatin1("%1: error: compression with zstd failed: %2\n") + .arg(m_name, QString::fromUtf8(ZSTD_getErrorName(n))); + lib.m_errorDevice->write(msg.toUtf8()); + } else if (lib.verbose()) { + QString msg = QString::fromLatin1("%1: note: compressed using zstd (%2 -> %3)\n") + .arg(m_name).arg(data.size()).arg(n); + lib.m_errorDevice->write(msg.toUtf8()); + } + + lib.m_overallFlags |= CompressedZstd; + m_flags |= CompressedZstd; + data = std::move(compressed); + data.truncate(n); + } else if (lib.verbose()) { + QString msg = QString::fromLatin1("%1: note: not compressed\n").arg(m_name); + lib.m_errorDevice->write(msg.toUtf8()); + } + } +#endif +#ifndef QT_NO_COMPRESS + if (m_compressAlgo == RCCResourceLibrary::CompressionAlgorithm::Best) { + m_compressAlgo = RCCResourceLibrary::CompressionAlgorithm::Zlib; + m_compressLevel = 9; + } + if (m_compressAlgo == RCCResourceLibrary::CompressionAlgorithm::Zlib) { + QByteArray compressed = + qCompress(reinterpret_cast<uchar *>(data.data()), data.size(), m_compressLevel); + + int compressRatio = int(100.0 * (data.size() - compressed.size()) / data.size()); + if (compressRatio >= m_compressThreshold) { + if (lib.verbose()) { + QString msg = QString::fromLatin1("%1: note: compressed using zlib (%2 -> %3)\n") + .arg(m_name).arg(data.size()).arg(compressed.size()); + lib.m_errorDevice->write(msg.toUtf8()); + } + data = compressed; + lib.m_overallFlags |= Compressed; + m_flags |= Compressed; + } else if (lib.verbose()) { + QString msg = QString::fromLatin1("%1: note: not compressed\n").arg(m_name); + lib.m_errorDevice->write(msg.toUtf8()); + } } - } #endif // QT_NO_COMPRESS + } // some info if (text || pass1) { @@ -343,7 +428,8 @@ RCCResourceLibrary::Strings::Strings() : ATTRIBUTE_PREFIX(QLatin1String("prefix")), ATTRIBUTE_ALIAS(QLatin1String("alias")), ATTRIBUTE_THRESHOLD(QLatin1String("threshold")), - ATTRIBUTE_COMPRESS(QLatin1String("compress")) + ATTRIBUTE_COMPRESS(QLatin1String("compress")), + ATTRIBUTE_COMPRESSALGO(QStringLiteral("compression-algorithm")) { } @@ -351,22 +437,30 @@ RCCResourceLibrary::RCCResourceLibrary(quint8 formatVersion) : m_root(0), m_format(C_Code), m_verbose(false), + m_compressionAlgo(CONSTANT_COMPRESSALGO_DEFAULT), m_compressLevel(CONSTANT_COMPRESSLEVEL_DEFAULT), m_compressThreshold(CONSTANT_COMPRESSTHRESHOLD_DEFAULT), m_treeOffset(0), m_namesOffset(0), m_dataOffset(0), + m_overallFlags(0), m_useNameSpace(CONSTANT_USENAMESPACE), m_errorDevice(0), m_outDevice(0), m_formatVersion(formatVersion) { m_out.reserve(30 * 1000 * 1000); +#if QT_CONFIG(zstd) + m_zstdCCtx = nullptr; +#endif } RCCResourceLibrary::~RCCResourceLibrary() { delete m_root; +#if QT_CONFIG(zstd) + ZSTD_freeCCtx(m_zstdCCtx); +#endif } enum RCCXmlTag { @@ -391,6 +485,7 @@ bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice, QLocale::Language language = QLocale::c().language(); QLocale::Country country = QLocale::c().country(); QString alias; + auto compressAlgo = m_compressionAlgo; int compressLevel = m_compressLevel; int compressThreshold = m_compressThreshold; @@ -444,17 +539,27 @@ bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice, if (attributes.hasAttribute(m_strings.ATTRIBUTE_ALIAS)) alias = attributes.value(m_strings.ATTRIBUTE_ALIAS).toString(); + compressAlgo = m_compressionAlgo; compressLevel = m_compressLevel; - if (attributes.hasAttribute(m_strings.ATTRIBUTE_COMPRESS)) - compressLevel = attributes.value(m_strings.ATTRIBUTE_COMPRESS).toString().toInt(); - compressThreshold = m_compressThreshold; + + QString errorString; + if (attributes.hasAttribute(m_strings.ATTRIBUTE_COMPRESSALGO)) + compressAlgo = parseCompressionAlgorithm(attributes.value(m_strings.ATTRIBUTE_COMPRESSALGO), &errorString); + if (errorString.isEmpty() && attributes.hasAttribute(m_strings.ATTRIBUTE_COMPRESS)) { + QString value = attributes.value(m_strings.ATTRIBUTE_COMPRESS).toString(); + compressLevel = parseCompressionLevel(compressAlgo, value, &errorString); + } + + // Special case for -no-compress + if (m_compressLevel == -2) + compressAlgo = CompressionAlgorithm::None; + if (attributes.hasAttribute(m_strings.ATTRIBUTE_THRESHOLD)) compressThreshold = attributes.value(m_strings.ATTRIBUTE_THRESHOLD).toString().toInt(); - // Special case for -no-compress. Overrides all other settings. - if (m_compressLevel == -2) - compressLevel = 0; + if (!errorString.isEmpty()) + reader.raiseError(errorString); } } else { reader.raiseError(QString(QLatin1String("unexpected tag: %1")).arg(reader.name().toString())); @@ -520,6 +625,7 @@ bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice, language, country, child.isDir() ? RCCFileInfo::Directory : RCCFileInfo::NoFlags, + compressAlgo, compressLevel, compressThreshold) ); @@ -535,6 +641,7 @@ bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice, language, country, RCCFileInfo::NoFlags, + compressAlgo, compressLevel, compressThreshold) ); @@ -729,6 +836,55 @@ RCCResourceLibrary::ResourceDataFileMap RCCResourceLibrary::resourceDataFileMap( return rc; } +RCCResourceLibrary::CompressionAlgorithm RCCResourceLibrary::parseCompressionAlgorithm(QStringView value, QString *errorMsg) +{ + if (value == QLatin1String("best")) + return CompressionAlgorithm::Best; + if (value == QLatin1String("zlib")) { +#ifdef QT_NO_COMPRESS + *errorMsg = QLatin1String("zlib support not compiled in"); +#else + return CompressionAlgorithm::Zlib; +#endif + } else if (value == QLatin1String("zstd")) { +#if QT_CONFIG(zstd) + return CompressionAlgorithm::Zstd; +#else + *errorMsg = QLatin1String("Zstandard support not compiled in"); +#endif + } else if (value != QLatin1String("none")) { + *errorMsg = QString::fromLatin1("Unknown compression algorithm '%1'").arg(value); + } + + return CompressionAlgorithm::None; +} + +int RCCResourceLibrary::parseCompressionLevel(CompressionAlgorithm algo, const QString &level, QString *errorMsg) +{ + bool ok; + int c = level.toInt(&ok); + if (ok) { + switch (algo) { + case CompressionAlgorithm::None: + case CompressionAlgorithm::Best: + return 0; + case CompressionAlgorithm::Zlib: + if (c >= 1 && c <= 9) + return c; + break; + case CompressionAlgorithm::Zstd: +#if QT_CONFIG(zstd) + if (c >= 0 && c <= ZSTD_maxCLevel()) + return c; +#endif + break; + } + } + + *errorMsg = QString::fromLatin1("invalid compression level '%1'").arg(level); + return 0; +} + bool RCCResourceLibrary::output(QIODevice &outDevice, QIODevice &tempDevice, QIODevice &errorDevice) { m_errorDevice = &errorDevice; @@ -795,6 +951,14 @@ bool RCCResourceLibrary::output(QIODevice &outDevice, QIODevice &tempDevice, QIO return true; } +void RCCResourceLibrary::writeDecimal(int value) +{ + Q_ASSERT(m_format != RCCResourceLibrary::Binary); + char buf[std::numeric_limits<int>::digits10 + 2]; + int n = snprintf(buf, sizeof(buf), "%d", value); + write(buf, n + 1); // write() takes a size including terminating NUL +} + void RCCResourceLibrary::writeHex(quint8 tmp) { const char digits[] = "0123456789abcdef"; @@ -889,6 +1053,8 @@ bool RCCResourceLibrary::writeHeader() writeNumber4(0); writeNumber4(0); writeNumber4(0); + if (m_formatVersion >= 3) + writeNumber4(m_overallFlags); } return true; } @@ -1091,10 +1257,35 @@ bool RCCResourceLibrary::writeInitializer() if (m_root) { writeString("bool qRegisterResourceData" "(int, const unsigned char *, " - "const unsigned char *, const unsigned char *);\n\n"); + "const unsigned char *, const unsigned char *);\n"); writeString("bool qUnregisterResourceData" "(int, const unsigned char *, " "const unsigned char *, const unsigned char *);\n\n"); + + if (m_overallFlags & (RCCFileInfo::Compressed | RCCFileInfo::CompressedZstd)) { + // use variable relocations with ELF and Mach-O + writeString("#if defined(__ELF__) || defined(__APPLE__)\n"); + if (m_overallFlags & RCCFileInfo::Compressed) { + writeString("static inline unsigned char qResourceFeatureZlib()\n" + "{\n" + " extern const unsigned char qt_resourceFeatureZlib;\n" + " return qt_resourceFeatureZlib;\n" + "}\n"); + } + if (m_overallFlags & RCCFileInfo::CompressedZstd) { + writeString("static inline unsigned char qResourceFeatureZstd()\n" + "{\n" + " extern const unsigned char qt_resourceFeatureZstd;\n" + " return qt_resourceFeatureZstd;\n" + "}\n"); + } + writeString("#else\n"); + if (m_overallFlags & RCCFileInfo::Compressed) + writeString("unsigned char qResourceFeatureZlib();\n"); + if (m_overallFlags & RCCFileInfo::CompressedZstd) + writeString("unsigned char qResourceFeatureZstd();\n"); + writeString("#endif\n\n"); + } } if (m_useNameSpace) @@ -1113,12 +1304,12 @@ bool RCCResourceLibrary::writeInitializer() writeString("()\n{\n"); if (m_root) { - writeString(" "); + writeString(" int version = "); + writeDecimal(m_formatVersion); + writeString(";\n "); writeAddNamespaceFunction("qRegisterResourceData"); - writeString("\n ("); - writeHex(m_formatVersion); - writeString(" qt_resource_struct, " - "qt_resource_name, qt_resource_data);\n"); + writeString("\n (version, qt_resource_struct, " + "qt_resource_name, qt_resource_data);\n"); } writeString(" return 1;\n"); writeString("}\n\n"); @@ -1136,11 +1327,24 @@ bool RCCResourceLibrary::writeInitializer() writeMangleNamespaceFunction(cleanResources); writeString("()\n{\n"); if (m_root) { - writeString(" "); + writeString(" int version = "); + writeDecimal(m_formatVersion); + writeString(";\n "); + + // ODR-use certain symbols from QtCore if we require optional features + if (m_overallFlags & RCCFileInfo::Compressed) { + writeString("version += "); + writeAddNamespaceFunction("qResourceFeatureZlib()"); + writeString(";\n "); + } + if (m_overallFlags & RCCFileInfo::CompressedZstd) { + writeString("version += "); + writeAddNamespaceFunction("qResourceFeatureZstd()"); + writeString(";\n "); + } + writeAddNamespaceFunction("qUnregisterResourceData"); - writeString("\n ("); - writeHex(m_formatVersion); - writeString(" qt_resource_struct, " + writeString("\n (version, qt_resource_struct, " "qt_resource_name, qt_resource_data);\n"); } writeString(" return 1;\n"); @@ -1176,6 +1380,13 @@ bool RCCResourceLibrary::writeInitializer() p[i++] = (m_namesOffset >> 16) & 0xff; p[i++] = (m_namesOffset >> 8) & 0xff; p[i++] = (m_namesOffset >> 0) & 0xff; + + if (m_formatVersion >= 3) { + p[i++] = (m_overallFlags >> 24) & 0xff; + p[i++] = (m_overallFlags >> 16) & 0xff; + p[i++] = (m_overallFlags >> 8) & 0xff; + p[i++] = (m_overallFlags >> 0) & 0xff; + } } return true; } diff --git a/src/tools/rcc/rcc.h b/src/tools/rcc/rcc.h index 36984cf38a..ad1c5cd166 100644 --- a/src/tools/rcc/rcc.h +++ b/src/tools/rcc/rcc.h @@ -1,6 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2018 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -35,6 +36,8 @@ #include <qhash.h> #include <qstring.h> +typedef struct ZSTD_CCtx_s ZSTD_CCtx; + QT_BEGIN_NAMESPACE class RCCFileInfo; @@ -77,6 +80,19 @@ public: void setOutputName(const QString &name) { m_outputName = name; } QString outputName() const { return m_outputName; } + enum class CompressionAlgorithm { + Zlib, + Zstd, + + Best = 99, + None = -1 + }; + + static CompressionAlgorithm parseCompressionAlgorithm(QStringView algo, QString *errorMsg); + void setCompressionAlgorithm(CompressionAlgorithm algo) { m_compressionAlgo = algo; } + CompressionAlgorithm compressionAlgorithm() const { return m_compressionAlgo; } + + static int parseCompressionLevel(CompressionAlgorithm algo, const QString &level, QString *errorMsg); void setCompressLevel(int c) { m_compressLevel = c; } int compressLevel() const { return m_compressLevel; } @@ -104,6 +120,7 @@ private: const QString ATTRIBUTE_ALIAS; const QString ATTRIBUTE_THRESHOLD; const QString ATTRIBUTE_COMPRESS; + const QString ATTRIBUTE_COMPRESSALGO; }; friend class RCCFileInfo; void reset(); @@ -117,6 +134,7 @@ private: bool writeInitializer(); void writeMangleNamespaceFunction(const QByteArray &name); void writeAddNamespaceFunction(const QByteArray &name); + void writeDecimal(int value); void writeHex(quint8 number); void writeNumber2(quint16 number); void writeNumber4(quint32 number); @@ -125,6 +143,10 @@ private: void writeByteArray(const QByteArray &); void write(const char *, int len); +#if QT_CONFIG(zstd) + ZSTD_CCtx *m_zstdCCtx; +#endif + const Strings m_strings; RCCFileInfo *m_root; QStringList m_fileNames; @@ -133,11 +155,13 @@ private: QString m_outputName; Format m_format; bool m_verbose; + CompressionAlgorithm m_compressionAlgo; int m_compressLevel; int m_compressThreshold; int m_treeOffset; int m_namesOffset; int m_dataOffset; + quint32 m_overallFlags; bool m_useNameSpace; QStringList m_failedResources; QIODevice *m_errorDevice; diff --git a/src/tools/rcc/rcc.pro b/src/tools/rcc/rcc.pro index 208ec54a73..ae55b5d8af 100644 --- a/src/tools/rcc/rcc.pro +++ b/src/tools/rcc/rcc.pro @@ -8,3 +8,14 @@ SOURCES += main.cpp QMAKE_TARGET_DESCRIPTION = "Qt Resource Compiler" load(qt_tool) + +# RCC is a bootstrapped tool, so qglobal.h #includes qconfig-bootstrapped.h +# and that has a #define saying zstd isn't present (for qresource.cpp, which is +# part of the bootstrap lib). So we inform the presence of the feature in the +# command-line. +qtConfig(zstd):!cross_compile { + DEFINES += QT_FEATURE_zstd=1 + QMAKE_USE_PRIVATE += zstd +} else { + DEFINES += QT_FEATURE_zstd=-1 +} diff --git a/src/tools/tracegen/helpers.cpp b/src/tools/tracegen/helpers.cpp index f0ac7ed47f..a5526065d6 100644 --- a/src/tools/tracegen/helpers.cpp +++ b/src/tools/tracegen/helpers.cpp @@ -46,7 +46,7 @@ QString includeGuard(const QString &filename) for (int i = 0; i < guard.size(); ++i) { if (!guard.at(i).isLetterOrNumber()) - guard[i] = QChar('_'); + guard[i] = QLatin1Char('_'); } return guard; 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/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 |