From d02c69d1bca61fa86d90d0a6dcb2484d8e2b3746 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 1 Aug 2020 23:57:01 +0300 Subject: [PATCH 01/25] DiffEditor: Improve initial size of description widget Fixes: QTCREATORBUG-24286 Change-Id: I8844b30d287fcdc5333906d00d92e00d05f5560a Reviewed-by: David Schulz --- src/plugins/diffeditor/diffeditor.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/plugins/diffeditor/diffeditor.cpp b/src/plugins/diffeditor/diffeditor.cpp index f303c22e708..533ad4d1279 100644 --- a/src/plugins/diffeditor/diffeditor.cpp +++ b/src/plugins/diffeditor/diffeditor.cpp @@ -56,6 +56,7 @@ #include #include #include +#include #include #include @@ -80,9 +81,13 @@ public: QSize sizeHint() const override; +signals: + void requestResize(); + protected: void setDisplaySettings(const DisplaySettings &ds) override; void setMarginSettings(const MarginSettings &ms) override; + void applyFontSettings() override; }; DescriptionEditorWidget::DescriptionEditorWidget(QWidget *parent) @@ -133,6 +138,12 @@ void DescriptionEditorWidget::setMarginSettings(const MarginSettings &ms) TextEditorWidget::setMarginSettings(MarginSettings()); } +void DescriptionEditorWidget::applyFontSettings() +{ + TextEditorWidget::applyFontSettings(); + emit requestResize(); +} + ///////////////////////////////// DiffEditor ////////////////////////////////// DiffEditor::DiffEditor() @@ -145,6 +156,18 @@ DiffEditor::DiffEditor() m_descriptionWidget = new DescriptionEditorWidget(splitter); m_descriptionWidget->setReadOnly(true); + connect(m_descriptionWidget, &DescriptionEditorWidget::requestResize, this, [splitter](){ + if (splitter->count() == 0) + return; + QList sizes = splitter->sizes(); + const int descHeight = splitter->widget(0)->fontMetrics().lineSpacing() * 8; + const int diff = descHeight - sizes[0]; + if (diff > 0) { + sizes[0] += diff; + sizes[1] -= diff; + splitter->setSizes(sizes); + } + }); splitter->addWidget(m_descriptionWidget); m_stackedWidget = new QStackedWidget(splitter); From b9cd1cc15e2574528fb40fcbc1d5219f63b5f132 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 8 Oct 2020 12:18:33 +0200 Subject: [PATCH 02/25] CMake Build: Fix PCH builds for non MSVC platforms Ammends 2129a04c5d61d5a55a76045f2727e5b7f9048c6b Change-Id: I50fc1bf2e5ef4742243aa08a4e5ad2bfee459eb1 Reviewed-by: Orgad Shaneh --- cmake/QtCreatorAPIInternal.cmake | 3 +-- src/tools/qml2puppet/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cmake/QtCreatorAPIInternal.cmake b/cmake/QtCreatorAPIInternal.cmake index 6105c9f00e8..5404680da0f 100644 --- a/cmake/QtCreatorAPIInternal.cmake +++ b/cmake/QtCreatorAPIInternal.cmake @@ -360,8 +360,7 @@ function(enable_pch target) endif() unset(PCH_TARGET) - if ("Qt5::Widgets" IN_LIST dependencies OR - "Qt5::Gui" IN_LIST dependencies) + if ("Qt5::Widgets" IN_LIST dependencies) set(PCH_TARGET QtCreatorPchGui) elseif ("Qt5::Core" IN_LIST dependencies) set(PCH_TARGET QtCreatorPchConsole) diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 7d1d32c19b9..3d2e53a48c3 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -8,7 +8,7 @@ endif() add_qtc_library(qml2puppet_static STATIC DEPENDS - Qt5::CorePrivate Qt5::Gui + Qt5::CorePrivate Qt5::Widgets PUBLIC_INCLUDES "${SRCDIR}/interfaces" SOURCES_PREFIX "${SRCDIR}/interfaces" SOURCES From cf460578ff205517f85ace5056dc91c063bef6c7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 8 Oct 2020 08:27:28 +0200 Subject: [PATCH 03/25] Debugger: fix various dumper tests for mingw since the gdb uses to hang on windows when calling functions we disabled that functionality reflect that in the QDateTime and QLocale tests. Change-Id: Ie212ab8c7634804e1054bfddfb753de055403c4f Reviewed-by: hjk --- tests/auto/debugger/tst_dumpers.cpp | 54 ++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 1ca3131caf4..d1a70c2ba23 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -511,6 +511,20 @@ struct Watcher : DumperOptions {} }; +enum AdditionalCriteria +{ + NeedsInferiorCall = 0x1, +}; + +static bool matchesAdditionalCriteria(int criteria) +{ +#ifdef Q_OS_UNIX + return true; +#else + return !(criteria & NeedsInferiorCall); +#endif +} + struct Check { Check() {} @@ -533,7 +547,8 @@ struct Check && gccVersionForCheck.covers(context.gccVersion) && clangVersionForCheck.covers(context.clangVersion) && msvcVersionForCheck.covers(context.msvcVersion) - && qtVersionForCheck.covers(context.qtVersion); + && qtVersionForCheck.covers(context.qtVersion) + && matchesAdditionalCriteria(additionalCriteria); } const Check &operator%(Optional) const @@ -595,6 +610,12 @@ struct Check return *this; } + const Check &operator%(AdditionalCriteria criteria) const + { + additionalCriteria = criteria; + return *this; + } + QString iname; Name expectedName; Value expectedValue; @@ -607,6 +628,7 @@ struct Check mutable VersionBase msvcVersionForCheck; mutable QtVersion qtVersionForCheck; mutable BoostVersion boostVersionForCheck; + mutable int additionalCriteria = 0; mutable bool optionallyPresent = false; }; @@ -2212,29 +2234,29 @@ void tst_Dumpers::dumper_data() + Check("d0", "(invalid)", "@QDate") + Check("d1", "Tue Jan 1 1980", "@QDate") - + Check("d1.(ISO)", "\"1980-01-01\"", "@QString") % Optional() - + Check("d1.toString", "\"Tue Jan 1 1980\"", "@QString") % Optional() - + CheckType("d1.(Locale)", "@QString") % Optional() - + CheckType("d1.(SystemLocale)", "@QString") % Optional() + + Check("d1.(ISO)", "\"1980-01-01\"", "@QString") % NeedsInferiorCall + + Check("d1.toString", "\"Tue Jan 1 1980\"", "@QString") % NeedsInferiorCall + + CheckType("d1.(Locale)", "@QString") % NeedsInferiorCall + + CheckType("d1.(SystemLocale)", "@QString") % NeedsInferiorCall + Check("t0", "(invalid)", "@QTime") + Check("t1", "13:15:32", "@QTime") - + Check("t1.(ISO)", "\"13:15:32\"", "@QString") % Optional() - + Check("t1.toString", "\"13:15:32\"", "@QString") % Optional() - + CheckType("t1.(Locale)", "@QString") % Optional() - + CheckType("t1.(SystemLocale)", "@QString") % Optional() + + Check("t1.(ISO)", "\"13:15:32\"", "@QString") % NeedsInferiorCall + + Check("t1.toString", "\"13:15:32\"", "@QString") % NeedsInferiorCall + + CheckType("t1.(Locale)", "@QString") % NeedsInferiorCall + + CheckType("t1.(SystemLocale)", "@QString") % NeedsInferiorCall + Check("dt0", "(invalid)", "@QDateTime") + Check("dt1", Value4("Tue Jan 1 13:15:32 1980"), "@QDateTime") + Check("dt1", Value5("Tue Jan 1 13:15:32 1980 GMT"), "@QDateTime") + Check("dt1.(ISO)", - "\"1980-01-01T13:15:32Z\"", "@QString") % Optional() - + CheckType("dt1.(Locale)", "@QString") % Optional() - + CheckType("dt1.(SystemLocale)", "@QString") % Optional() + "\"1980-01-01T13:15:32Z\"", "@QString") % NeedsInferiorCall + + CheckType("dt1.(Locale)", "@QString") % NeedsInferiorCall + + CheckType("dt1.(SystemLocale)", "@QString") % NeedsInferiorCall + Check("dt1.toString", - Value4("\"Tue Jan 1 13:15:32 1980\""), "@QString") % Optional() + Value4("\"Tue Jan 1 13:15:32 1980\""), "@QString") % NeedsInferiorCall + Check("dt1.toString", - Value5("\"Tue Jan 1 13:15:32 1980 GMT\""), "@QString") % Optional(); + Value5("\"Tue Jan 1 13:15:32 1980 GMT\""), "@QString") % NeedsInferiorCall; //+ Check("dt1.toUTC", // Value4("Tue Jan 1 13:15:32 1980"), "@QDateTime") % Optional() //+ Check("dt1.toUTC", @@ -2724,7 +2746,7 @@ void tst_Dumpers::dumper_data() + CheckType("loc", "@QLocale") + CheckType("m", "@QLocale::MeasurementSystem") - + Check("loc1", "\"en_US\"", "@QLocale") + + Check("loc1", "\"en_US\"", "@QLocale") % NeedsInferiorCall + Check("loc1.country", "@QLocale::UnitedStates (225)", "@QLocale::Country") % Qt5 + Check("loc1.language", "@QLocale::English (31)", "@QLocale::Language") % Qt5 + Check("loc1.numberOptions", "@QLocale::DefaultNumberOptions (0)", "@QLocale::NumberOptions") @@ -3306,7 +3328,7 @@ void tst_Dumpers::dumper_data() "QT_BEGIN_NAMESPACE\n" "uint qHash(const QMap &) { return 0; }\n" "uint qHash(const double & f) { return int(f); }\n" - "uint qHash(const QPointer &p) { return (ulong)p.data(); }\n" + "uint qHash(const QPointer &p) { return (quintptr)p.data(); }\n" "QT_END_NAMESPACE\n", "QSet s1;\n" From 3ee70780b4b61fe10a56871916a42b4e4f06941d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 28 Sep 2020 17:29:50 +0200 Subject: [PATCH 04/25] Qt6: Sprinkle QLatin1Strings for QStringView comparisons Task-number: QTCREATORBUG-24098 Change-Id: I2fb79bcfd0537a6704a1ee8db840401d6beca7a0 Reviewed-by: hjk --- .../dockcontainerwidget.cpp | 14 +-- .../advanceddockingsystem/dockmanager.cpp | 4 +- .../autotest/catch/catchoutputreader.cpp | 10 +- .../debugservers/uvsc/uvtargetdevicemodel.cpp | 50 ++++----- src/plugins/beautifier/abstractsettings.cpp | 2 +- src/plugins/coreplugin/externaltool.cpp | 34 +++--- .../cppeditor/resourcepreviewhoverhandler.cpp | 6 +- .../debugger/peripheralregisterhandler.cpp | 52 ++++----- src/plugins/designer/codemodelhelpers.cpp | 4 +- .../plugin_interface/scxmldocument.cpp | 2 +- .../scxmleditor/plugin_interface/scxmltag.cpp | 2 +- src/plugins/valgrind/xmlprotocol/parser.cpp | 104 +++++++++--------- 12 files changed, 142 insertions(+), 142 deletions(-) diff --git a/src/libs/advanceddockingsystem/dockcontainerwidget.cpp b/src/libs/advanceddockingsystem/dockcontainerwidget.cpp index 1b0af0dcf88..3b75ece3197 100644 --- a/src/libs/advanceddockingsystem/dockcontainerwidget.cpp +++ b/src/libs/advanceddockingsystem/dockcontainerwidget.cpp @@ -728,11 +728,11 @@ namespace ADS while (stateReader.readNextStartElement()) { QWidget *childNode = nullptr; bool result = true; - if (stateReader.name() == "splitter") { + if (stateReader.name() == QLatin1String("splitter")) { result = restoreSplitter(stateReader, childNode, testing); - } else if (stateReader.name() == "area") { + } else if (stateReader.name() == QLatin1String("area")) { result = restoreDockArea(stateReader, childNode, testing); - } else if (stateReader.name() == "sizes") { + } else if (stateReader.name() == QLatin1String("sizes")) { QString size = stateReader.readElementText().trimmed(); qCInfo(adsLog) << "Size: " << size; QTextStream textStream(&size); @@ -797,7 +797,7 @@ namespace ADS dockArea = new DockAreaWidget(m_dockManager, q); while (stateReader.readNextStartElement()) { - if (stateReader.name() != "widget") + if (stateReader.name() != QLatin1String("widget")) continue; auto objectName = stateReader.attributes().value("name"); @@ -849,10 +849,10 @@ namespace ADS { bool result = true; while (stateReader.readNextStartElement()) { - if (stateReader.name() == "splitter") { + if (stateReader.name() == QLatin1String("splitter")) { result = restoreSplitter(stateReader, createdWidget, testing); qCInfo(adsLog) << "Splitter"; - } else if (stateReader.name() == "area") { + } else if (stateReader.name() == QLatin1String("area")) { result = restoreDockArea(stateReader, createdWidget, testing); qCInfo(adsLog) << "DockAreaWidget"; } else { @@ -1302,7 +1302,7 @@ namespace ADS if (isFloating) { qCInfo(adsLog) << "Restore floating widget"; - if (!stateReader.readNextStartElement() || stateReader.name() != "geometry") + if (!stateReader.readNextStartElement() || stateReader.name() != QLatin1String("geometry")) return false; QByteArray geometryString = stateReader diff --git a/src/libs/advanceddockingsystem/dockmanager.cpp b/src/libs/advanceddockingsystem/dockmanager.cpp index a7d0653863a..eee95049f20 100644 --- a/src/libs/advanceddockingsystem/dockmanager.cpp +++ b/src/libs/advanceddockingsystem/dockmanager.cpp @@ -191,7 +191,7 @@ namespace ADS if (!stateReader.readNextStartElement()) return false; - if (stateReader.name() != "QtAdvancedDockingSystem") + if (stateReader.name() != QLatin1String("QtAdvancedDockingSystem")) return false; qCInfo(adsLog) << stateReader.attributes().value("version"); @@ -219,7 +219,7 @@ namespace ADS #endif int dockContainerCount = 0; while (stateReader.readNextStartElement()) { - if (stateReader.name() == "container") { + if (stateReader.name() == QLatin1String("container")) { result = restoreContainer(dockContainerCount, stateReader, testing); if (!result) break; diff --git a/src/plugins/autotest/catch/catchoutputreader.cpp b/src/plugins/autotest/catch/catchoutputreader.cpp index 760d5214cb2..4a46c7722ce 100644 --- a/src/plugins/autotest/catch/catchoutputreader.cpp +++ b/src/plugins/autotest/catch/catchoutputreader.cpp @@ -143,16 +143,16 @@ void CatchOutputReader::processOutputLine(const QByteArray &outputLineWithNewLin case QXmlStreamReader::EndElement: { const auto currentTag = m_xmlReader.name(); - if (currentTag == CatchXml::SectionElement) { + if (currentTag == QLatin1String(CatchXml::SectionElement)) { sendResult(ResultType::TestEnd); testOutputNodeFinished(SectionNode); - } else if (currentTag == CatchXml::TestCaseElement) { + } else if (currentTag == QLatin1String(CatchXml::TestCaseElement)) { sendResult(ResultType::TestEnd); testOutputNodeFinished(TestCaseNode); - } else if (currentTag == CatchXml::GroupElement) { + } else if (currentTag == QLatin1String(CatchXml::GroupElement)) { testOutputNodeFinished(GroupNode); - } else if (currentTag == CatchXml::ExpressionElement - || currentTag == CatchXml::BenchmarkResults) { + } else if (currentTag == QLatin1String(CatchXml::ExpressionElement) + || currentTag == QLatin1String(CatchXml::BenchmarkResults)) { sendResult(m_currentResult); m_currentExpression.clear(); m_testCaseInfo.pop(); diff --git a/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp b/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp index c8bf0fdea66..0fbf6ffdecb 100644 --- a/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp +++ b/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp @@ -249,7 +249,7 @@ void DeviceSelectionModel::parsePackage(const QString &packageFile) QXmlStreamReader in(&f); while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == "package") + if (elementName == QLatin1String("package")) parsePackage(in, packageFile); else in.skipCurrentElement(); @@ -265,18 +265,18 @@ void DeviceSelectionModel::parsePackage(QXmlStreamReader &in, const QString &pac child->version = extractPackVersion(packageFile); while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == "name") { + if (elementName == QLatin1String("name")) { fillElementProperty(in, child->name); - } else if (elementName == "description") { + } else if (elementName == QLatin1String("description")) { fillElementProperty(in, child->desc); - } else if (elementName == "vendor") { + } else if (elementName == QLatin1String("vendor")) { fillVendor(in, child->vendorName, child->vendorId); - } else if (elementName == "url") { + } else if (elementName == QLatin1String("url")) { fillElementProperty(in, child->url); - } else if (elementName == "devices") { + } else if (elementName == QLatin1String("devices")) { while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == "family") + if (elementName == QLatin1String("family")) parseFamily(in, child); else in.skipCurrentElement(); @@ -297,17 +297,17 @@ void DeviceSelectionModel::parseFamily(QXmlStreamReader &in, DeviceSelectionItem fillVendor(attrs.value("Dvendor").toString(), child->vendorName, child->vendorId); while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == "processor") { + if (elementName == QLatin1String("processor")) { fillCpu(in, child->cpu); - } else if (elementName == "algorithm") { + } else if (elementName == QLatin1String("algorithm")) { fillAlgorithms(in, child->algorithms); - } else if (elementName == "memory") { + } else if (elementName == QLatin1String("memory")) { fillMemories(in, child->memories); - } else if (elementName == "description") { + } else if (elementName == QLatin1String("description")) { fillElementProperty(in, child->desc); - } else if (elementName == "subFamily") { + } else if (elementName == QLatin1String("subFamily")) { parseSubFamily(in, child); - } else if (elementName == "device") { + } else if (elementName == QLatin1String("device")) { parseDevice(in, child); } else { in.skipCurrentElement(); @@ -324,11 +324,11 @@ void DeviceSelectionModel::parseSubFamily(QXmlStreamReader &in, DeviceSelectionI child->name = attrs.value("DsubFamily").toString(); while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == "processor") { + if (elementName == QLatin1String("processor")) { fillCpu(in, child->cpu); - } else if (elementName == "debug") { + } else if (elementName == QLatin1String("debug")) { fillSvd(in, child->svd); - } else if (elementName == "device") { + } else if (elementName == QLatin1String("device")) { parseDevice(in, child); } else { in.skipCurrentElement(); @@ -345,17 +345,17 @@ void DeviceSelectionModel::parseDevice(QXmlStreamReader &in, DeviceSelectionItem child->name = attrs.value("Dname").toString(); while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == "processor") { + if (elementName == QLatin1String("processor")) { fillCpu(in, child->cpu); - } else if (elementName == "debug") { + } else if (elementName == QLatin1String("debug")) { fillSvd(in, child->svd); - } else if (elementName == "description") { + } else if (elementName == QLatin1String("description")) { fillElementProperty(in, child->desc); - } else if (elementName == "memory") { + } else if (elementName == QLatin1String("memory")) { fillMemories(in, child->memories); - } else if (elementName == "algorithm") { + } else if (elementName == QLatin1String("algorithm")) { fillAlgorithms(in, child->algorithms); - } else if (elementName == "variant") { + } else if (elementName == QLatin1String("variant")) { parseDeviceVariant(in, child); } else { in.skipCurrentElement(); @@ -372,11 +372,11 @@ void DeviceSelectionModel::parseDeviceVariant(QXmlStreamReader &in, DeviceSelect child->name = attrs.value("Dvariant").toString(); while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == "processor") { + if (elementName == QLatin1String("processor")) { fillCpu(in, child->cpu); - } else if (elementName == "memory") { + } else if (elementName == QLatin1String("memory")) { fillMemories(in, child->memories); - } else if (elementName == "algorithm") { + } else if (elementName == QLatin1String("algorithm")) { fillAlgorithms(in, child->algorithms); } else { in.skipCurrentElement(); diff --git a/src/plugins/beautifier/abstractsettings.cpp b/src/plugins/beautifier/abstractsettings.cpp index 3c65322bc13..3d9bc75b1a5 100644 --- a/src/plugins/beautifier/abstractsettings.cpp +++ b/src/plugins/beautifier/abstractsettings.cpp @@ -319,7 +319,7 @@ void AbstractSettings::readDocumentation() QXmlStreamReader xml(&file); if (!xml.readNextStartElement()) return; - if (xml.name() != Constants::DOCUMENTATION_XMLROOT) { + if (xml.name() != QLatin1String(Constants::DOCUMENTATION_XMLROOT)) { BeautifierPlugin::showError(tr("The file \"%1\" is not a valid documentation file.") .arg(filename)); return; diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp index 8994686cace..1f46b9d6c33 100644 --- a/src/plugins/coreplugin/externaltool.cpp +++ b/src/plugins/coreplugin/externaltool.cpp @@ -352,11 +352,11 @@ static void localizedText(const QStringList &locales, QXmlStreamReader *reader, static bool parseOutputAttribute(const QString &attribute, QXmlStreamReader *reader, ExternalTool::OutputHandling *value) { const auto output = reader->attributes().value(attribute); - if (output == kOutputShowInPane) { + if (output == QLatin1String(kOutputShowInPane)) { *value = ExternalTool::ShowInPane; - } else if (output == kOutputReplaceSelection) { + } else if (output == QLatin1String(kOutputReplaceSelection)) { *value = ExternalTool::ReplaceSelection; - } else if (output == kOutputIgnore) { + } else if (output == QLatin1String(kOutputIgnore)) { *value = ExternalTool::Ignore; } else { reader->raiseError("Allowed values for output attribute are 'showinpane','replaceselection','ignore'"); @@ -374,19 +374,19 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error auto tool = new ExternalTool; QXmlStreamReader reader(xml); - if (!reader.readNextStartElement() || reader.name() != kExternalTool) + if (!reader.readNextStartElement() || reader.name() != QLatin1String(kExternalTool)) reader.raiseError("Missing start element "); tool->m_id = reader.attributes().value(kId).toString(); if (tool->m_id.isEmpty()) reader.raiseError("Missing or empty id attribute for "); while (reader.readNextStartElement()) { - if (reader.name() == kDescription) { + if (reader.name() == QLatin1String(kDescription)) { localizedText(locales, &reader, &descriptionLocale, &tool->m_description); - } else if (reader.name() == kDisplayName) { + } else if (reader.name() == QLatin1String(kDisplayName)) { localizedText(locales, &reader, &nameLocale, &tool->m_displayName); - } else if (reader.name() == kCategory) { + } else if (reader.name() == QLatin1String(kCategory)) { localizedText(locales, &reader, &categoryLocale, &tool->m_displayCategory); - } else if (reader.name() == kOrder) { + } else if (reader.name() == QLatin1String(kOrder)) { if (tool->m_order >= 0) { reader.raiseError("only one element allowed"); break; @@ -395,7 +395,7 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error tool->m_order = reader.readElementText().toInt(&ok); if (!ok || tool->m_order < 0) reader.raiseError(" element requires non-negative integer value"); - } else if (reader.name() == kExecutable) { + } else if (reader.name() == QLatin1String(kExecutable)) { if (reader.attributes().hasAttribute(kOutput)) { if (!parseOutputAttribute(kOutput, &reader, &tool->m_outputHandling)) break; @@ -406,9 +406,9 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error } if (reader.attributes().hasAttribute(kModifiesDocument)) { const auto value = reader.attributes().value(kModifiesDocument); - if (value == kYes || value == kTrue) { + if (value == QLatin1String(kYes) || value == QLatin1String(kTrue)) { tool->m_modifiesCurrentDocument = true; - } else if (value == kNo || value == kFalse) { + } else if (value == QLatin1String(kNo) || value == QLatin1String(kFalse)) { tool->m_modifiesCurrentDocument = false; } else { reader.raiseError("Allowed values for modifiesdocument attribute are 'yes','true','no','false'"); @@ -416,33 +416,33 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error } } while (reader.readNextStartElement()) { - if (reader.name() == kPath) { + if (reader.name() == QLatin1String(kPath)) { tool->m_executables.append(reader.readElementText()); - } else if (reader.name() == kArguments) { + } else if (reader.name() == QLatin1String(kArguments)) { if (!tool->m_arguments.isEmpty()) { reader.raiseError("only one element allowed"); break; } tool->m_arguments = reader.readElementText(); - } else if (reader.name() == kInput) { + } else if (reader.name() == QLatin1String(kInput)) { if (!tool->m_input.isEmpty()) { reader.raiseError("only one element allowed"); break; } tool->m_input = reader.readElementText(); - } else if (reader.name() == kWorkingDirectory) { + } else if (reader.name() == QLatin1String(kWorkingDirectory)) { if (!tool->m_workingDirectory.isEmpty()) { reader.raiseError("only one element allowed"); break; } tool->m_workingDirectory = reader.readElementText(); - } else if (reader.name() == kBaseEnvironmentId) { + } else if (reader.name() == QLatin1String(kBaseEnvironmentId)) { if (tool->m_baseEnvironmentProviderId.isValid()) { reader.raiseError("only one element allowed"); break; } tool->m_baseEnvironmentProviderId = Id::fromString(reader.readElementText()); - } else if (reader.name() == kEnvironment) { + } else if (reader.name() == QLatin1String(kEnvironment)) { if (!tool->m_environment.isEmpty()) { reader.raiseError("only one element allowed"); break; diff --git a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp index 003c97e37aa..07fb181d7b7 100644 --- a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp +++ b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp @@ -96,12 +96,12 @@ static QString findResourceInFile(const QString &resName, const QString &filePat while (!xmlr.atEnd() && !xmlr.hasError()) { const QXmlStreamReader::TokenType token = xmlr.readNext(); if (token == QXmlStreamReader::StartElement) { - if (xmlr.name() == "qresource") { + if (xmlr.name() == QLatin1String("qresource")) { const QXmlStreamAttributes sa = xmlr.attributes(); const QString prefixName = sa.value("prefix").toString(); if (!prefixName.isEmpty()) prefixStack.push_back(prefixName); - } else if (xmlr.name() == "file") { + } else if (xmlr.name() == QLatin1String("file")) { const QXmlStreamAttributes sa = xmlr.attributes(); const QString aliasName = sa.value("alias").toString(); const QString fileName = xmlr.readElementText(); @@ -117,7 +117,7 @@ static QString findResourceInFile(const QString &resName, const QString &filePat return fileName; } } else if (token == QXmlStreamReader::EndElement) { - if (xmlr.name() == "qresource") { + if (xmlr.name() == QLatin1String("qresource")) { if (!prefixStack.isEmpty()) prefixStack.pop_back(); } diff --git a/src/plugins/debugger/peripheralregisterhandler.cpp b/src/plugins/debugger/peripheralregisterhandler.cpp index 2642f2dc9b2..0236697d7e0 100644 --- a/src/plugins/debugger/peripheralregisterhandler.cpp +++ b/src/plugins/debugger/peripheralregisterhandler.cpp @@ -568,13 +568,13 @@ static void handleField(QXmlStreamReader &in, PeripheralRegister ®) PeripheralRegisterField fld; while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == kName) { + if (elementName == QLatin1String(kName)) { fld.name = in.readElementText(); - } else if (elementName == kDescription) { + } else if (elementName == QLatin1String(kDescription)) { fld.description = in.readElementText(); - } else if (elementName == kAccess) { + } else if (elementName == QLatin1String(kAccess)) { fld.access = decodeAccess(in.readElementText()); - } else if (elementName == kBitRange) { + } else if (elementName == QLatin1String(kBitRange)) { const QString elementText = in.readElementText(); const int startBracket = elementText.indexOf('['); const int endBracket = elementText.indexOf(']'); @@ -589,9 +589,9 @@ static void handleField(QXmlStreamReader &in, PeripheralRegister ®) const int to = int(decodeNumeric(items.at(MaxBit))); fld.bitOffset = from; fld.bitWidth = to - from + 1; - } else if (elementName == kBitOffset) { + } else if (elementName == QLatin1String(kBitOffset)) { fld.bitOffset = int(decodeNumeric(in.readElementText())); - } else if (elementName == kBitWidth) { + } else if (elementName == QLatin1String(kBitWidth)) { fld.bitWidth = int(decodeNumeric(in.readElementText())); } else { in.skipCurrentElement(); @@ -611,24 +611,24 @@ static void handleRegister(QXmlStreamReader &in, PeripheralRegisterGroup &group) PeripheralRegister reg; while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == kName) { + if (elementName == QLatin1String(kName)) { reg.name = in.readElementText(); - } else if (elementName == kDisplayName) { + } else if (elementName == QLatin1String(kDisplayName)) { reg.displayName = in.readElementText(); - } else if (elementName == kDescription) { + } else if (elementName == QLatin1String(kDescription)) { reg.description = in.readElementText(); - } else if (elementName == kAddressOffset) { + } else if (elementName == QLatin1String(kAddressOffset)) { reg.addressOffset = decodeNumeric(in.readElementText()); - } else if (elementName == kSize) { + } else if (elementName == QLatin1String(kSize)) { reg.size = int(decodeNumeric(in.readElementText())); - } else if (elementName == kAccess) { + } else if (elementName == QLatin1String(kAccess)) { reg.access = decodeAccess(in.readElementText()); - } else if (elementName == kResetvalue) { + } else if (elementName == QLatin1String(kResetvalue)) { reg.resetValue = decodeNumeric(in.readElementText()); - } else if (elementName == kFields) { + } else if (elementName == QLatin1String(kFields)) { while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == kField) + if (elementName == QLatin1String(kField)) handleField(in, reg); else in.skipCurrentElement(); @@ -657,22 +657,22 @@ static void handleGroup(QXmlStreamReader &in, PeripheralRegisterGroups &groups) while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == kName) { + if (elementName == QLatin1String(kName)) { group.name = in.readElementText(); - } else if (elementName == kDescription) { + } else if (elementName == QLatin1String(kDescription)) { group.description = in.readElementText(); - } else if (elementName == kGroupName) { + } else if (elementName == QLatin1String(kGroupName)) { group.displayName = in.readElementText(); - } else if (elementName == kBaseAddress) { + } else if (elementName == QLatin1String(kBaseAddress)) { group.baseAddress = decodeNumeric(in.readElementText()); - } else if (elementName == kSize) { + } else if (elementName == QLatin1String(kSize)) { group.size = int(decodeNumeric(in.readElementText())); - } else if (elementName == kAccess) { + } else if (elementName == QLatin1String(kAccess)) { group.access = decodeAccess(in.readElementText()); - } else if (elementName == kRegisters) { + } else if (elementName == QLatin1String(kRegisters)) { while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == kRegister) + if (elementName == QLatin1String(kRegister)) handleRegister(in, group); else in.skipCurrentElement(); @@ -694,13 +694,13 @@ static PeripheralRegisterGroups availablePeripheralRegisterGroups(const FilePath PeripheralRegisterGroups groups; while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == kDevice) { + if (elementName == QLatin1String(kDevice)) { while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == kPeripherals) { + if (elementName == QLatin1String(kPeripherals)) { while (in.readNextStartElement()) { const auto elementName = in.name(); - if (elementName == kPeripheral) + if (elementName == QLatin1String(kPeripheral)) handleGroup(in, groups); else in.skipCurrentElement(); diff --git a/src/plugins/designer/codemodelhelpers.cpp b/src/plugins/designer/codemodelhelpers.cpp index 7beed0874ac..67adc0d5885 100644 --- a/src/plugins/designer/codemodelhelpers.cpp +++ b/src/plugins/designer/codemodelhelpers.cpp @@ -137,7 +137,9 @@ bool navigateToSlot(const QString &uiFileName, SearchFunction searchFunc(setupUiC); const SearchFunction::FunctionList funcs = searchFunc(generatedHeaderDoc); if (funcs.size() != 1) { - *errorMessage = QString::fromLatin1("Internal error: The function \"%1\" could not be found in %2").arg(setupUiC, generatedHeaderFile); + *errorMessage = QString::fromLatin1( + "Internal error: The function \"%1\" could not be found in %2") + .arg(QLatin1String(setupUiC), generatedHeaderFile); return false; } return true; diff --git a/src/plugins/scxmleditor/plugin_interface/scxmldocument.cpp b/src/plugins/scxmleditor/plugin_interface/scxmldocument.cpp index 74f288e8990..a0c677ba464 100644 --- a/src/plugins/scxmleditor/plugin_interface/scxmldocument.cpp +++ b/src/plugins/scxmleditor/plugin_interface/scxmldocument.cpp @@ -214,7 +214,7 @@ bool ScxmlDocument::load(QIODevice *io) continue; if (token == QXmlStreamReader::StartElement) { - if (xml.name() == "scxml") { + if (xml.name() == QLatin1String("scxml")) { // Get and add namespaces QXmlStreamNamespaceDeclarations ns = xml.namespaceDeclarations(); for (int i = 0; i < ns.count(); ++i) diff --git a/src/plugins/scxmleditor/plugin_interface/scxmltag.cpp b/src/plugins/scxmleditor/plugin_interface/scxmltag.cpp index 248eeff99a4..924f5127293 100644 --- a/src/plugins/scxmleditor/plugin_interface/scxmltag.cpp +++ b/src/plugins/scxmleditor/plugin_interface/scxmltag.cpp @@ -579,7 +579,7 @@ void ScxmlTag::readXml(QXmlStreamReader &xml, bool checkCopyId) // Read and set attributes QXmlStreamAttributes attributes = xml.attributes(); for (int i = 0; i < attributes.count(); ++i) { - if (m_tagType == Scxml && attributes[i].qualifiedName() == "initial") + if (m_tagType == Scxml && attributes[i].qualifiedName() == QLatin1String("initial")) scxmlInitial = attributes[i].value().toString(); else { QString key = attributes[i].qualifiedName().toString(); diff --git a/src/plugins/valgrind/xmlprotocol/parser.cpp b/src/plugins/valgrind/xmlprotocol/parser.cpp index e4059112470..df2fe3cd1af 100644 --- a/src/plugins/valgrind/xmlprotocol/parser.cpp +++ b/src/plugins/valgrind/xmlprotocol/parser.cpp @@ -304,13 +304,13 @@ XWhat Parser::Private::parseXWhat() if (reader.isEndElement()) break; const auto name = reader.name(); - if (name == "text") + if (name == QLatin1String("text")) what.text = blockingReadElementText(); - else if (name == "leakedbytes") + else if (name == QLatin1String("leakedbytes")) what.leakedbytes = parseInt64(blockingReadElementText(), "error/xwhat[memcheck]/leakedbytes"); - else if (name == "leakedblocks") + else if (name == QLatin1String("leakedblocks")) what.leakedblocks = parseInt64(blockingReadElementText(), "error/xwhat[memcheck]/leakedblocks"); - else if (name == "hthreadid") + else if (name == QLatin1String("hthreadid")) what.hthreadid = parseInt64(blockingReadElementText(), "error/xwhat[memcheck]/hthreadid"); else if (reader.isStartElement()) reader.skipCurrentElement(); @@ -326,15 +326,15 @@ XauxWhat Parser::Private::parseXauxWhat() if (reader.isEndElement()) break; const auto name = reader.name(); - if (name == "text") + if (name == QLatin1String("text")) what.text = blockingReadElementText(); - else if (name == "file") + else if (name == QLatin1String("file")) what.file = blockingReadElementText(); - else if (name == "dir") + else if (name == QLatin1String("dir")) what.dir = blockingReadElementText(); - else if (name == "line") + else if (name == QLatin1String("line")) what.line = parseInt64(blockingReadElementText(), "error/xauxwhat/line"); - else if (name == "hthreadid") + else if (name == QLatin1String("hthreadid")) what.hthreadid = parseInt64(blockingReadElementText(), "error/xauxwhat/hthreadid"); else if (reader.isStartElement()) reader.skipCurrentElement(); @@ -434,27 +434,27 @@ void Parser::Private::parseError() if (reader.isStartElement()) lastAuxWhat++; const auto name = reader.name(); - if (name == "unique") { + if (name == QLatin1String("unique")) { e.setUnique(parseHex(blockingReadElementText(), "unique")); - } else if (name == "tid") { + } else if (name == QLatin1String("tid")) { e.setTid(parseInt64(blockingReadElementText(), "error/tid")); - } else if (name == "kind") { //TODO this is memcheck-specific: + } else if (name == QLatin1String("kind")) { //TODO this is memcheck-specific: e.setKind(parseErrorKind(blockingReadElementText())); - } else if (name == "suppression") { + } else if (name == QLatin1String("suppression")) { e.setSuppression(parseSuppression()); - } else if (name == "xwhat") { + } else if (name == QLatin1String("xwhat")) { const XWhat xw = parseXWhat(); e.setWhat(xw.text); e.setLeakedBlocks(xw.leakedblocks); e.setLeakedBytes(xw.leakedbytes); e.setHelgrindThreadId(xw.hthreadid); - } else if (name == "what") { + } else if (name == QLatin1String("what")) { e.setWhat(blockingReadElementText()); - } else if (name == "xauxwhat") { + } else if (name == QLatin1String("xauxwhat")) { if (!currentAux.text.isEmpty()) auxs.push_back(currentAux); currentAux = parseXauxWhat(); - } else if (name == "auxwhat") { + } else if (name == QLatin1String("auxwhat")) { const QString aux = blockingReadElementText(); //concatenate multiple consecutive tags if (lastAuxWhat > 1) { @@ -468,7 +468,7 @@ void Parser::Private::parseError() currentAux.text.append(aux); } lastAuxWhat = 0; - } else if (name == "stack") { + } else if (name == QLatin1String("stack")) { frames.push_back(parseStack()); } else if (reader.isStartElement()) { reader.skipCurrentElement(); @@ -505,17 +505,17 @@ Frame Parser::Private::parseFrame() break; if (reader.isStartElement()) { const auto name = reader.name(); - if (name == "ip") + if (name == QLatin1String("ip")) frame.setInstructionPointer(parseHex(blockingReadElementText(), "error/frame/ip")); - else if (name == "obj") + else if (name == QLatin1String("obj")) frame.setObject(blockingReadElementText()); - else if (name == "fn") + else if (name == QLatin1String("fn")) frame.setFunctionName( blockingReadElementText()); - else if (name == "dir") + else if (name == QLatin1String("dir")) frame.setDirectory(blockingReadElementText()); - else if (name == "file") + else if (name == QLatin1String("file")) frame.setFileName(blockingReadElementText()); - else if (name == "line") + else if (name == QLatin1String("line")) frame.setLine(parseInt64(blockingReadElementText(), "error/frame/line")); else if (reader.isStartElement()) reader.skipCurrentElement(); @@ -535,9 +535,9 @@ void Parser::Private::parseAnnounceThread() break; if (reader.isStartElement()) { const auto name = reader.name(); - if (name == "hthreadid") + if (name == QLatin1String("hthreadid")) at.setHelgrindThreadId(parseInt64(blockingReadElementText(), "announcethread/hthreadid")); - else if (name == "stack") + else if (name == QLatin1String("stack")) at.setStack(parseStack()); else if (reader.isStartElement()) reader.skipCurrentElement(); @@ -554,7 +554,7 @@ void Parser::Private::parseErrorCounts() if (reader.isEndElement()) break; if (reader.isStartElement()) { - if (reader.name() == "pair") { + if (reader.name() == QLatin1String("pair")) { qint64 unique = 0; qint64 count = 0; while (notAtEnd()) { @@ -563,17 +563,16 @@ void Parser::Private::parseErrorCounts() break; if (reader.isStartElement()) { const auto name = reader.name(); - if (name == "unique") + if (name == QLatin1String("unique")) unique = parseHex(blockingReadElementText(), "errorcounts/pair/unique"); - else if (name == "count") + else if (name == QLatin1String("count")) count = parseInt64(blockingReadElementText(), "errorcounts/pair/count"); else if (reader.isStartElement()) reader.skipCurrentElement(); } } emit q->errorCount(unique, count); - } - else if (reader.isStartElement()) + } else if (reader.isStartElement()) reader.skipCurrentElement(); } } @@ -587,7 +586,7 @@ void Parser::Private::parseSuppressionCounts() if (reader.isEndElement()) break; if (reader.isStartElement()) { - if (reader.name() == "pair") { + if (reader.name() == QLatin1String("pair")) { QString pairName; qint64 count = 0; while (notAtEnd()) { @@ -596,17 +595,16 @@ void Parser::Private::parseSuppressionCounts() break; if (reader.isStartElement()) { const auto name = reader.name(); - if (name == "name") + if (name == QLatin1String("name")) pairName = blockingReadElementText(); - else if (name == "count") + else if (name == QLatin1String("count")) count = parseInt64(blockingReadElementText(), "suppcounts/pair/count"); else if (reader.isStartElement()) reader.skipCurrentElement(); } } emit q->suppressionCount(pairName, count); - } - else if (reader.isStartElement()) + } else if (reader.isStartElement()) reader.skipCurrentElement(); } } @@ -622,9 +620,9 @@ void Parser::Private::parseStatus() break; if (reader.isStartElement()) { const auto name = reader.name(); - if (name == "state") + if (name == QLatin1String("state")) s.setState(parseState(blockingReadElementText())); - else if (name == "time") + else if (name == QLatin1String("time")) s.setTime(blockingReadElementText()); else if (reader.isStartElement()) reader.skipCurrentElement(); @@ -642,7 +640,7 @@ QVector Parser::Private::parseStack() if (reader.isEndElement()) break; if (reader.isStartElement()) { - if (reader.name() == "frame") + if (reader.name() == QLatin1String("frame")) frames.append(parseFrame()); } } @@ -660,9 +658,9 @@ SuppressionFrame Parser::Private::parseSuppressionFrame() break; if (reader.isStartElement()) { const auto name = reader.name(); - if (name == "obj") + if (name == QLatin1String("obj")) frame.setObject(blockingReadElementText()); - else if (name == "fun") + else if (name == QLatin1String("fun")) frame.setFunction( blockingReadElementText()); else if (reader.isStartElement()) reader.skipCurrentElement(); @@ -682,15 +680,15 @@ Suppression Parser::Private::parseSuppression() break; if (reader.isStartElement()) { const auto name = reader.name(); - if (name == "sname") + if (name == QLatin1String("sname")) supp.setName(blockingReadElementText()); - else if (name == "skind") + else if (name == QLatin1String("skind")) supp.setKind(blockingReadElementText()); - else if (name == "skaux") + else if (name == QLatin1String("skaux")) supp.setAuxKind(blockingReadElementText()); - else if (name == "rawtext") + else if (name == QLatin1String("rawtext")) supp.setRawText(blockingReadElementText()); - else if (name == "sframe") + else if (name == QLatin1String("sframe")) frames.push_back(parseSuppressionFrame()); } } @@ -708,19 +706,19 @@ void Parser::Private::parse(QIODevice *device) while (notAtEnd()) { blockingReadNext(); const auto name = reader.name(); - if (name == "error") + if (name == QLatin1String("error")) parseError(); - else if (name == "announcethread") + else if (name == QLatin1String("announcethread")) parseAnnounceThread(); - else if (name == "status") + else if (name == QLatin1String("status")) parseStatus(); - else if (name == "errorcounts") + else if (name == QLatin1String("errorcounts")) parseErrorCounts(); - else if (name == "suppcounts") + else if (name == QLatin1String("suppcounts")) parseSuppressionCounts(); - else if (name == "protocolversion") + else if (name == QLatin1String("protocolversion")) checkProtocolVersion(blockingReadElementText()); - else if (name == "protocoltool") + else if (name == QLatin1String("protocoltool")) checkTool(blockingReadElementText()); } } catch (const ParserException &e) { From 0f87be729c6442c07ea3032ec0903e920a9c6ca6 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Oct 2020 12:50:06 +0200 Subject: [PATCH 05/25] Bump version to 4.13.3 Change-Id: Ia546dc945af578105ad959005e7e710f5d592573 Reviewed-by: Eike Ziller --- cmake/QtCreatorIDEBranding.cmake | 4 ++-- qbs/modules/qtc/qtc.qbs | 4 ++-- qtcreator_ide_branding.pri | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index 0dea6a2eb35..2a22fb0a35d 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -1,8 +1,8 @@ #PROJECT_USER_FILE_EXTENSION = .user -set(IDE_VERSION "4.13.2") # The IDE version. +set(IDE_VERSION "4.13.3") # The IDE version. set(IDE_VERSION_COMPAT "4.13.0") # The IDE Compatibility version. -set(IDE_VERSION_DISPLAY "4.13.2") # The IDE display version. +set(IDE_VERSION_DISPLAY "4.13.3") # The IDE display version. set(IDE_COPYRIGHT_YEAR "2020") # The IDE current copyright year. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index c44068dc28e..db1db601b0c 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -4,10 +4,10 @@ import qbs.FileInfo import "qtc.js" as HelperFunctions Module { - property string qtcreator_display_version: '4.13.2' + property string qtcreator_display_version: '4.13.3' property string ide_version_major: '4' property string ide_version_minor: '13' - property string ide_version_release: '2' + property string ide_version_release: '3' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release diff --git a/qtcreator_ide_branding.pri b/qtcreator_ide_branding.pri index bdb4f4e5299..c09bdeb9f6c 100644 --- a/qtcreator_ide_branding.pri +++ b/qtcreator_ide_branding.pri @@ -1,6 +1,6 @@ -QTCREATOR_VERSION = 4.13.2 +QTCREATOR_VERSION = 4.13.3 QTCREATOR_COMPAT_VERSION = 4.13.0 -QTCREATOR_DISPLAY_VERSION = 4.13.2 +QTCREATOR_DISPLAY_VERSION = 4.13.3 QTCREATOR_COPYRIGHT_YEAR = 2020 IDE_DISPLAY_NAME = Qt Creator From 41a51a63f53281f1c5040fd80b1e803e18299658 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Oct 2020 12:55:35 +0200 Subject: [PATCH 06/25] ClangCodeModel, Puppet, CrashHandler: Compile with Qt6 Task-number: QTCREATORBUG-24098 Change-Id: Ic65e7a5dce0a512f48fb70915b9443ef7df2b787 Reviewed-by: Eike Ziller --- .../qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp | 2 ++ src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp | 2 +- src/tools/qtcreatorcrashhandler/backtracecollector.cpp | 2 +- src/tools/qtcreatorcrashhandler/backtracecollector.h | 2 +- src/tools/qtcreatorcrashhandler/main.cpp | 4 ++-- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp index 22482c81780..18370be9fcb 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp @@ -26,8 +26,10 @@ #include "valueschangedcommand.h" #include "sharedmemory.h" + #include #include +#include #include diff --git a/src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp b/src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp index 85312170d97..b1ce0cd6ebb 100644 --- a/src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp +++ b/src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp @@ -469,7 +469,7 @@ bool CompleteCommand::run() auto *processor = ClangEditorDocumentProcessor::get(documentFilePath); QTC_ASSERT(processor, return false); - return completionResults(editor, QStringList(), timeOutInMs()); + return !completionResults(editor, QStringList(), timeOutInMs()).isNull(); } Command::Ptr CompleteCommand::parse(BatchFileLineTokenizer &arguments, diff --git a/src/tools/qtcreatorcrashhandler/backtracecollector.cpp b/src/tools/qtcreatorcrashhandler/backtracecollector.cpp index b3bc1939f7f..3f77d4ac98e 100644 --- a/src/tools/qtcreatorcrashhandler/backtracecollector.cpp +++ b/src/tools/qtcreatorcrashhandler/backtracecollector.cpp @@ -63,7 +63,7 @@ BacktraceCollector::~BacktraceCollector() delete d; } -void BacktraceCollector::run(Q_PID pid) +void BacktraceCollector::run(qint64 pid) { d->debugger.start(QLatin1String("gdb"), QStringList({ "--nw", // Do not use a window interface. diff --git a/src/tools/qtcreatorcrashhandler/backtracecollector.h b/src/tools/qtcreatorcrashhandler/backtracecollector.h index 50d0bee0560..6750f7105af 100644 --- a/src/tools/qtcreatorcrashhandler/backtracecollector.h +++ b/src/tools/qtcreatorcrashhandler/backtracecollector.h @@ -36,7 +36,7 @@ public: explicit BacktraceCollector(QObject *parent = 0); ~BacktraceCollector(); - void run(Q_PID pid); + void run(qint64 pid); bool isRunning() const; void kill(); diff --git a/src/tools/qtcreatorcrashhandler/main.cpp b/src/tools/qtcreatorcrashhandler/main.cpp index 700e796ab3c..ca5c9250ab2 100644 --- a/src/tools/qtcreatorcrashhandler/main.cpp +++ b/src/tools/qtcreatorcrashhandler/main.cpp @@ -46,7 +46,7 @@ static void printErrorAndExit() exit(EXIT_FAILURE); } -static bool hasProcessOriginFromQtCreatorBuildDir(Q_PID pid) +static bool hasProcessOriginFromQtCreatorBuildDir(qint64 pid) { const QString executable = QFile::symLinkTarget(QString::fromLatin1("/proc/%1/exe") .arg(QString::number(pid))); @@ -73,7 +73,7 @@ int main(int argc, char *argv[]) if (positionalArguments.size() != 2) printErrorAndExit(); - Q_PID parentPid = getppid(); + qint64 parentPid = getppid(); if (!hasProcessOriginFromQtCreatorBuildDir(parentPid)) printErrorAndExit(); From 67c800af6e879757e6b78de7b47844050a84b941 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Oct 2020 13:49:42 +0200 Subject: [PATCH 07/25] PerfProfiler: Some Qt6 compilation Remaining issues operator<<(DataStream &...), the timeline dependency and qmlRegisterType. Change-Id: I51556e67cd93cb8bdced569ca509929705da80b4 Reviewed-by: Ulf Hermann --- .../perfprofiler/perfconfigeventsmodel.cpp | 2 +- src/plugins/perfprofiler/perftimelinemodel.cpp | 4 ++-- .../tests/perfresourcecounter_test.cpp | 17 ++++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/plugins/perfprofiler/perfconfigeventsmodel.cpp b/src/plugins/perfprofiler/perfconfigeventsmodel.cpp index 304adfa4a52..d6876b4774b 100644 --- a/src/plugins/perfprofiler/perfconfigeventsmodel.cpp +++ b/src/plugins/perfprofiler/perfconfigeventsmodel.cpp @@ -355,7 +355,7 @@ PerfConfigEventsModel::EventDescription PerfConfigEventsModel::parseEvent( if (event.startsWith('r') && event.length() == 4) { bool ok = false; - const uint eventNumber = event.midRef(1).toUInt(&ok, 16); + const uint eventNumber = QStringView{event}.mid(1).toUInt(&ok, 16); if (ok) { description.eventType = EventTypeRaw; description.numericEvent = eventNumber; diff --git a/src/plugins/perfprofiler/perftimelinemodel.cpp b/src/plugins/perfprofiler/perftimelinemodel.cpp index 234338ffe38..44083eea18e 100644 --- a/src/plugins/perfprofiler/perftimelinemodel.cpp +++ b/src/plugins/perfprofiler/perftimelinemodel.cpp @@ -179,8 +179,8 @@ QVariantMap PerfTimelineModel::details(int index) const result.insert(tr("Name"), orUnknown(manager->string(tracePoint.name))); const QHash &extraData = m_extraData[index]; for (auto it = extraData.constBegin(), end = extraData.constEnd(); it != end; ++it) { - result.insertMulti(QString::fromUtf8(manager->string(it.key())), - prettyPrintTraceData(it.value())); + result.insert(QString::fromUtf8(manager->string(it.key())), + prettyPrintTraceData(it.value())); } } if (!m_resourceBlocks.isEmpty()) { diff --git a/src/plugins/perfprofiler/tests/perfresourcecounter_test.cpp b/src/plugins/perfprofiler/tests/perfresourcecounter_test.cpp index f48d6aec45c..fc44c0e60f5 100644 --- a/src/plugins/perfprofiler/tests/perfresourcecounter_test.cpp +++ b/src/plugins/perfprofiler/tests/perfresourcecounter_test.cpp @@ -112,19 +112,20 @@ void PerfResourceCounterTest::testMallocFree() void PerfResourceCounterTest::testRandomFill() { + auto rg = QRandomGenerator::global(); for (int i = 0; i < 100; ++i) { SizeCounter::Container container; SizeCounter counter(&container); for (int i = 0; i < 10000; ++i) { - const int amount = qrand(); + const int amount = rg->generate(); counter.request(amount, i); - counter.obtain(qrand()); + counter.obtain(rg->generate()); if (sum(container) != counter.currentTotal()) qDebug() << "ouch"; QCOMPARE(sum(container), counter.currentTotal()); } for (int i = 0; i < 10000; ++i) { - counter.release(qrand()); + counter.release(rg->generate()); QCOMPARE(sum(container), counter.currentTotal()); } @@ -138,9 +139,10 @@ void PerfResourceCounterTest::testUnitSized() NoPayloadCounter::Container container; NoPayloadCounter counter(&container); QList ids; + auto rg = QRandomGenerator::global(); for (int i = 0; i < 10000; ++i) { counter.request(1); - const int id = qrand(); + const int id = rg->generate(); counter.obtain(id); if (id != 0) // Otherwise it's the invalid ID and that means the allocation "failed". ids.append(id); @@ -158,11 +160,12 @@ void PerfResourceCounterTest::testRandomAlternate() { NoPayloadCounter::Container container; NoPayloadCounter counter(&container); + auto rg = QRandomGenerator::global(); for (int i = 0; i < 1000; ++i) { for (int i = 0; i < 100; ++i) { - counter.request(qrand()); - counter.obtain(qrand()); - counter.release(qrand()); + counter.request(rg->generate()); + counter.obtain(rg->generate()); + counter.release(rg->generate()); } QCOMPARE(sum(container), counter.currentTotal()); } From 852985b2cade67d8b7a3fae898f5a52640428174 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Oct 2020 15:11:24 +0200 Subject: [PATCH 08/25] Help: Sprinkle some QLatin1String Change-Id: I395742c2255b50c0a9017f86c7e7dca5a8535542 Reviewed-by: Eike Ziller --- src/plugins/help/xbelsupport.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/plugins/help/xbelsupport.cpp b/src/plugins/help/xbelsupport.cpp index bf890c5e6db..f711fbde8fc 100644 --- a/src/plugins/help/xbelsupport.cpp +++ b/src/plugins/help/xbelsupport.cpp @@ -110,9 +110,8 @@ bool XbelReader::readFromFile(QIODevice *device) readNext(); if (isStartElement()) { - if (name() == "xbel" - && attributes().value("version") - == "1.0") { + if (name() == QLatin1String("xbel") + && attributes().value("version") == QLatin1String("1.0")) { readXBEL(); } else { raiseError(QCoreApplication::translate("Help::Internal::XbelReader", "The file is not an XBEL version 1.0 file.")); @@ -132,9 +131,9 @@ void XbelReader::readXBEL() break; if (isStartElement()) { - if (name() == "folder") + if (name() == QLatin1String("folder")) readFolder(nullptr); - else if (name() == "bookmark") + else if (name() == QLatin1String("bookmark")) readBookmark(nullptr); else readUnknownElement(); @@ -161,8 +160,7 @@ void XbelReader::readFolder(QStandardItem *item) folder->setIcon(folderIcon); folder->setData("Folder", Qt::UserRole + 10); - bool expanded = - (attributes().value("folded") != "no"); + const bool expanded = attributes().value("folded") != QLatin1String("no"); folder->setData(expanded, Qt::UserRole + 11); while (!atEnd()) { @@ -172,11 +170,11 @@ void XbelReader::readFolder(QStandardItem *item) break; if (isStartElement()) { - if (name() == "title") + if (name() == QLatin1String("title")) folder->setText(readElementText()); - else if (name() == "folder") + else if (name() == QLatin1String("folder")) readFolder(folder); - else if (name() == "bookmark") + else if (name() == QLatin1String("bookmark")) readBookmark(folder); else readUnknownElement(); @@ -199,7 +197,7 @@ void XbelReader::readBookmark(QStandardItem *item) break; if (isStartElement()) { - if (name() == "title") + if (name() == QLatin1String("title")) bookmark->setText(readElementText()); else readUnknownElement(); From fe0ee642b590996bf1a9d7d48c26c332ddcde346 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Oct 2020 15:30:55 +0200 Subject: [PATCH 09/25] QmlDesigner: Compile with Qt 6 Qt 6 does cannot handle forward-declared types in signal declarations. Change-Id: Iad4a810841df3d077750ad76c892bdb7eecc0a80 Reviewed-by: Knud Dollereder Reviewed-by: Eike Ziller --- .../qmldesigner/components/curveeditor/detail/selectionmodel.h | 2 +- .../qmldesigner/components/curveeditor/detail/treeview.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/selectionmodel.h b/src/plugins/qmldesigner/components/curveeditor/detail/selectionmodel.h index 5a9a52ba072..ff4a0bbf2fa 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/selectionmodel.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/selectionmodel.h @@ -25,13 +25,13 @@ #pragma once +#include "curveitem.h" #include "treeitem.h" #include namespace DesignTools { -class CurveItem; class TreeItem; class NodeTreeItem; class PropertyTreeItem; diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/treeview.h b/src/plugins/qmldesigner/components/curveeditor/detail/treeview.h index 9fa2de14ad6..338ab6f052b 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/treeview.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/treeview.h @@ -25,6 +25,7 @@ #pragma once +#include "curveitem.h" #include "selectionmodel.h" #include @@ -33,7 +34,6 @@ namespace DesignTools { class AnimationCurve; class CurveEditorModel; -class CurveItem; struct CurveEditorStyle; From a27b162407cffac38b2334a942a14b5a61f715ef Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Oct 2020 14:55:47 +0200 Subject: [PATCH 10/25] PerfProfiler: Compile fix for Qt5 Amends 67c800af6e879757e6b78de7b47844050a84b941. Change-Id: Ia0bb003d3e83027d060c97a1bcf8758db00d9281 Reviewed-by: Ulf Hermann --- src/plugins/perfprofiler/perfconfigeventsmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/perfprofiler/perfconfigeventsmodel.cpp b/src/plugins/perfprofiler/perfconfigeventsmodel.cpp index d6876b4774b..744885f3de8 100644 --- a/src/plugins/perfprofiler/perfconfigeventsmodel.cpp +++ b/src/plugins/perfprofiler/perfconfigeventsmodel.cpp @@ -355,7 +355,7 @@ PerfConfigEventsModel::EventDescription PerfConfigEventsModel::parseEvent( if (event.startsWith('r') && event.length() == 4) { bool ok = false; - const uint eventNumber = QStringView{event}.mid(1).toUInt(&ok, 16); + const uint eventNumber = event.mid(1).toUInt(&ok, 16); if (ok) { description.eventType = EventTypeRaw; description.numericEvent = eventNumber; From ce2c18dd6808e4cfc11de3251675799c7655fadb Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Oct 2020 16:29:46 +0200 Subject: [PATCH 11/25] Help: Some Qt 6 Change-Id: I30553e491e5dfc119ac1527c8a2419b6d18647fc Reviewed-by: Eike Ziller --- src/plugins/help/helpwidget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp index 7d25d631a90..65c468ac386 100644 --- a/src/plugins/help/helpwidget.cpp +++ b/src/plugins/help/helpwidget.cpp @@ -1008,9 +1008,9 @@ void HelpWidget::print(HelpViewer *viewer) QPrintDialog dlg(m_printer, this); dlg.setWindowTitle(tr("Print Documentation")); if (!viewer->selectedText().isEmpty()) - dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection); - dlg.addEnabledOption(QAbstractPrintDialog::PrintPageRange); - dlg.addEnabledOption(QAbstractPrintDialog::PrintCollateCopies); + dlg.setOption(QAbstractPrintDialog::PrintSelection, true); + dlg.setOption(QAbstractPrintDialog::PrintPageRange, true); + dlg.setOption(QAbstractPrintDialog::PrintCollateCopies, true); if (dlg.exec() == QDialog::Accepted) viewer->print(m_printer); From d1a42414c5d6ed0c3fca3d4baf0c03d50e889193 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Thu, 8 Oct 2020 14:27:49 +0300 Subject: [PATCH 12/25] Android: fix misleading warning when creating an AVD When no system images are installed in the used SDK path, the warning should point to install a system image because none are installed instead of blaming the SDK. Task-number: QTCREATORBUG-24754 Change-Id: Ic3dc6cb25f014f4216fd63636b3b312b14f76e6d Reviewed-by: Alessandro Portale Reviewed-by: Leena Miettinen --- src/plugins/android/avddialog.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index ded445e2cb1..f4eedb2876b 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -244,14 +244,16 @@ void AvdDialog::updateApiLevelComboBox() if (installedSystemImages.isEmpty()) { m_avdDialog.targetApiComboBox->setEnabled(false); m_avdDialog.warningText->setVisible(true); - m_avdDialog.warningText->setText(tr("Cannot create a new AVD. No sufficiently recent Android SDK available.\n" - "Install an SDK of at least API version %1.") - .arg(m_minApiLevel)); + m_avdDialog.warningText->setText( + tr("Cannot create a new AVD. No suitable Android system image is installed.\n" + "Install a system image of at least API version %1 from the SDK Manager tab.") + .arg(m_minApiLevel)); } else if (filteredList.isEmpty()) { m_avdDialog.targetApiComboBox->setEnabled(false); m_avdDialog.warningText->setVisible(true); - m_avdDialog.warningText->setText(tr("Cannot create a AVD for ABI %1. Install an image for it.") - .arg(abi())); + m_avdDialog.warningText->setText(tr("Cannot create an AVD for ABI %1. Install a system " + "image for it from the SDK Manager tab first.") + .arg(abi())); } else { m_avdDialog.warningText->setVisible(false); m_avdDialog.targetApiComboBox->setEnabled(true); From 4b6a6acc4e793bb60109f587861d9280de5b238a Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 8 Oct 2020 17:55:43 +0300 Subject: [PATCH 13/25] Core: De-pure IOutputPane::visibilityChanged() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most implementations are empty. Change-Id: I811cacfc2918c8b2803798c4f5d3dabc7d60ccd1 Reviewed-by: André Hartmann Reviewed-by: hjk --- src/plugins/autotest/testresultspane.cpp | 4 ---- src/plugins/autotest/testresultspane.h | 1 - src/plugins/coreplugin/ioutputpane.h | 2 +- src/plugins/coreplugin/messageoutputwindow.cpp | 4 ---- src/plugins/coreplugin/messageoutputwindow.h | 1 - src/plugins/coreplugin/outputpanemanager.cpp | 4 ++++ src/plugins/debugger/console/console.cpp | 4 ---- src/plugins/debugger/console/console.h | 1 - src/plugins/projectexplorer/appoutputpane.cpp | 4 ---- src/plugins/projectexplorer/appoutputpane.h | 1 - src/plugins/projectexplorer/compileoutputwindow.cpp | 3 --- src/plugins/projectexplorer/compileoutputwindow.h | 1 - src/plugins/serialterminal/serialoutputpane.cpp | 5 ----- src/plugins/serialterminal/serialoutputpane.h | 1 - src/plugins/todo/todooutputpane.cpp | 5 ----- src/plugins/todo/todooutputpane.h | 1 - 16 files changed, 5 insertions(+), 37 deletions(-) diff --git a/src/plugins/autotest/testresultspane.cpp b/src/plugins/autotest/testresultspane.cpp index c3518b44e7a..8a6ef9022d6 100644 --- a/src/plugins/autotest/testresultspane.cpp +++ b/src/plugins/autotest/testresultspane.cpp @@ -343,10 +343,6 @@ void TestResultsPane::clearContents() clearMarks(); } -void TestResultsPane::visibilityChanged(bool /*visible*/) -{ -} - void TestResultsPane::setFocus() { } diff --git a/src/plugins/autotest/testresultspane.h b/src/plugins/autotest/testresultspane.h index 658165f01db..0f3d05c1cff 100644 --- a/src/plugins/autotest/testresultspane.h +++ b/src/plugins/autotest/testresultspane.h @@ -85,7 +85,6 @@ public: QString displayName() const override; int priorityInStatusBar() const override; void clearContents() override; - void visibilityChanged(bool visible) override; void setFocus() override; bool hasFocus() const override; bool canFocus() const override; diff --git a/src/plugins/coreplugin/ioutputpane.h b/src/plugins/coreplugin/ioutputpane.h index 8d3bfc50ef5..68d62550a4e 100644 --- a/src/plugins/coreplugin/ioutputpane.h +++ b/src/plugins/coreplugin/ioutputpane.h @@ -58,7 +58,7 @@ public: virtual int priorityInStatusBar() const = 0; virtual void clearContents() = 0; - virtual void visibilityChanged(bool visible) = 0; + virtual void visibilityChanged(bool visible); virtual void setFocus() = 0; virtual bool hasFocus() const = 0; diff --git a/src/plugins/coreplugin/messageoutputwindow.cpp b/src/plugins/coreplugin/messageoutputwindow.cpp index 384b34c113a..97b47a1e2f9 100644 --- a/src/plugins/coreplugin/messageoutputwindow.cpp +++ b/src/plugins/coreplugin/messageoutputwindow.cpp @@ -105,10 +105,6 @@ QString MessageOutputWindow::displayName() const return tr("General Messages"); } -void MessageOutputWindow::visibilityChanged(bool /*b*/) -{ -} - void MessageOutputWindow::append(const QString &text) { m_widget->appendMessage(text, Utils::DebugFormat); diff --git a/src/plugins/coreplugin/messageoutputwindow.h b/src/plugins/coreplugin/messageoutputwindow.h index 152a707702b..e43688b3199 100644 --- a/src/plugins/coreplugin/messageoutputwindow.h +++ b/src/plugins/coreplugin/messageoutputwindow.h @@ -45,7 +45,6 @@ public: QString displayName() const override; int priorityInStatusBar() const override; void clearContents() override; - void visibilityChanged(bool visible) override; void append(const QString &text); bool canFocus() const override; diff --git a/src/plugins/coreplugin/outputpanemanager.cpp b/src/plugins/coreplugin/outputpanemanager.cpp index 4240c1120cd..92008d6b046 100644 --- a/src/plugins/coreplugin/outputpanemanager.cpp +++ b/src/plugins/coreplugin/outputpanemanager.cpp @@ -126,6 +126,10 @@ QList IOutputPane::toolBarWidgets() const return widgets << m_zoomInButton << m_zoomOutButton; } +void IOutputPane::visibilityChanged(bool /*visible*/) +{ +} + void IOutputPane::setFont(const QFont &font) { emit fontChanged(font); diff --git a/src/plugins/debugger/console/console.cpp b/src/plugins/debugger/console/console.cpp index 1b29f70d61f..074d1f3c8cd 100644 --- a/src/plugins/debugger/console/console.cpp +++ b/src/plugins/debugger/console/console.cpp @@ -175,10 +175,6 @@ void Console::clearContents() m_consoleItemModel->clear(); } -void Console::visibilityChanged(bool /*visible*/) -{ -} - bool Console::canFocus() const { return true; diff --git a/src/plugins/debugger/console/console.h b/src/plugins/debugger/console/console.h index 8ad12eac69d..10800e93ef6 100644 --- a/src/plugins/debugger/console/console.h +++ b/src/plugins/debugger/console/console.h @@ -61,7 +61,6 @@ public: QString displayName() const override { return tr("QML Debugger Console"); } int priorityInStatusBar() const override; void clearContents() override; - void visibilityChanged(bool visible) override; bool canFocus() const override; bool hasFocus() const override; void setFocus() override; diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index 63a9377df74..95f04e20c51 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -341,10 +341,6 @@ void AppOutputPane::clearContents() currentWindow->clear(); } -void AppOutputPane::visibilityChanged(bool /* b */) -{ -} - bool AppOutputPane::hasFocus() const { QWidget *widget = m_tabWidget->currentWidget(); diff --git a/src/plugins/projectexplorer/appoutputpane.h b/src/plugins/projectexplorer/appoutputpane.h index f682cfe2967..24728d5e716 100644 --- a/src/plugins/projectexplorer/appoutputpane.h +++ b/src/plugins/projectexplorer/appoutputpane.h @@ -70,7 +70,6 @@ public: QString displayName() const override; int priorityInStatusBar() const override; void clearContents() override; - void visibilityChanged(bool) override; bool canFocus() const override; bool hasFocus() const override; void setFocus() override; diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index 97ab9b69be1..9d8ad02a78a 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -215,9 +215,6 @@ void CompileOutputWindow::clearContents() m_taskPositions.clear(); } -void CompileOutputWindow::visibilityChanged(bool) -{ } - int CompileOutputWindow::priorityInStatusBar() const { return 50; diff --git a/src/plugins/projectexplorer/compileoutputwindow.h b/src/plugins/projectexplorer/compileoutputwindow.h index a146ea16cb7..babdfc17dfb 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.h +++ b/src/plugins/projectexplorer/compileoutputwindow.h @@ -60,7 +60,6 @@ public: QString displayName() const override { return tr("Compile Output"); } int priorityInStatusBar() const override; void clearContents() override; - void visibilityChanged(bool visible) override; bool canFocus() const override; bool hasFocus() const override; void setFocus() override; diff --git a/src/plugins/serialterminal/serialoutputpane.cpp b/src/plugins/serialterminal/serialoutputpane.cpp index 0ef4a3544ab..3d23606fa4c 100644 --- a/src/plugins/serialterminal/serialoutputpane.cpp +++ b/src/plugins/serialterminal/serialoutputpane.cpp @@ -210,11 +210,6 @@ void SerialOutputPane::clearContents() currentWindow->clear(); } -void SerialOutputPane::visibilityChanged(bool) -{ - // Unused but pure virtual -} - bool SerialOutputPane::canFocus() const { return m_tabWidget->currentWidget(); diff --git a/src/plugins/serialterminal/serialoutputpane.h b/src/plugins/serialterminal/serialoutputpane.h index 944b008ab17..24249fd8412 100644 --- a/src/plugins/serialterminal/serialoutputpane.h +++ b/src/plugins/serialterminal/serialoutputpane.h @@ -76,7 +76,6 @@ public: int priorityInStatusBar() const final; void clearContents() final; - void visibilityChanged(bool) final; bool canFocus() const final; bool hasFocus() const final; void setFocus() final; diff --git a/src/plugins/todo/todooutputpane.cpp b/src/plugins/todo/todooutputpane.cpp index a4a3fa1cce4..30be160d56f 100644 --- a/src/plugins/todo/todooutputpane.cpp +++ b/src/plugins/todo/todooutputpane.cpp @@ -94,11 +94,6 @@ void TodoOutputPane::clearContents() clearKeywordFilter(); } -void TodoOutputPane::visibilityChanged(bool visible) -{ - Q_UNUSED(visible) -} - void TodoOutputPane::setFocus() { m_todoTreeView->setFocus(); diff --git a/src/plugins/todo/todooutputpane.h b/src/plugins/todo/todooutputpane.h index 78b0aff45d4..11f259cfaf1 100644 --- a/src/plugins/todo/todooutputpane.h +++ b/src/plugins/todo/todooutputpane.h @@ -60,7 +60,6 @@ public: QString displayName() const override; int priorityInStatusBar() const override; void clearContents() override; - void visibilityChanged(bool visible) override; void setFocus() override; bool hasFocus() const override; bool canFocus() const override; From 7e4364fb702d5da63b4236b685d32b119531d63c Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 8 Oct 2020 17:56:50 +0300 Subject: [PATCH 14/25] VCS: Do not focus on the pane every time it becomes visible MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: QTCREATORBUG-24425 Change-Id: I727913eeeae34e6d656bfc5b17a737c5bcbffe88 Reviewed-by: André Hartmann --- src/plugins/vcsbase/vcsoutputwindow.cpp | 6 ------ src/plugins/vcsbase/vcsoutputwindow.h | 1 - 2 files changed, 7 deletions(-) diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp index 39b8d51d57b..ab9617ebb71 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.cpp +++ b/src/plugins/vcsbase/vcsoutputwindow.cpp @@ -363,12 +363,6 @@ void VcsOutputWindow::clearContents() d->widget.clear(); } -void VcsOutputWindow::visibilityChanged(bool visible) -{ - if (visible) - d->widget.setFocus(); -} - void VcsOutputWindow::setFocus() { d->widget.setFocus(); diff --git a/src/plugins/vcsbase/vcsoutputwindow.h b/src/plugins/vcsbase/vcsoutputwindow.h index 749e824c388..21bd81be974 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.h +++ b/src/plugins/vcsbase/vcsoutputwindow.h @@ -46,7 +46,6 @@ public: int priorityInStatusBar() const override; void clearContents() override; - void visibilityChanged(bool visible) override; void setFocus() override; bool hasFocus() const override; From 94b9b33a17e3f7760cbbf9abd021984839106647 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Oct 2020 15:25:33 +0200 Subject: [PATCH 15/25] Install pythonXY.zip for qtcreatorcdbext Fixes: QTCREATORBUG-24528 Change-Id: I0db1407c17ff00a7424b8b8c229f503dc4891a12 Reviewed-by: Cristian Adam --- src/libs/qtcreatorcdbext/CMakeLists.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/libs/qtcreatorcdbext/CMakeLists.txt b/src/libs/qtcreatorcdbext/CMakeLists.txt index 394405f37fb..0a45ef0cc33 100644 --- a/src/libs/qtcreatorcdbext/CMakeLists.txt +++ b/src/libs/qtcreatorcdbext/CMakeLists.txt @@ -52,14 +52,15 @@ if (_library_enabled) return() endif() - set(PythonRegex "^(.*)/(.*)/(python[0-9]+)${CMAKE_IMPORT_LIBRARY_SUFFIX}$") + set(PythonRegex "^(.*)/(.*)/(python([0-9]+))${CMAKE_IMPORT_LIBRARY_SUFFIX}$") if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(PythonRegex "^(.*)/(.*)/(python[0-9]+_d)${CMAKE_IMPORT_LIBRARY_SUFFIX}$") + set(PythonRegex "^(.*)/(.*)/(python([0-9]+)_d)${CMAKE_IMPORT_LIBRARY_SUFFIX}$") endif() foreach(lib IN LISTS PYTHON_LIBRARIES) if (lib MATCHES ${PythonRegex}) set(PythonDll "${CMAKE_MATCH_1}/${CMAKE_MATCH_3}${CMAKE_SHARED_LIBRARY_SUFFIX}") + set(PythonZip "${CMAKE_MATCH_1}/python${CMAKE_MATCH_4}.zip") break() endif() endforeach() @@ -84,13 +85,16 @@ if (_library_enabled) pyvalue.cpp pyvalue.h ) - install(FILES "${PythonDll}" + install(FILES + "${PythonDll}" + "${PythonZip}" DESTINATION lib/qtcreatorcdbext${ArchSuffix}/ COMPONENT qtcreatorcdbext) add_custom_target(copy_python_dll ALL VERBATIM) add_custom_command(TARGET copy_python_dll POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy "${PythonDll}" "${PROJECT_BINARY_DIR}/lib/qtcreatorcdbext${ArchSuffix}/" + COMMAND "${CMAKE_COMMAND}" -E copy "${PythonZip}" "${PROJECT_BINARY_DIR}/lib/qtcreatorcdbext${ArchSuffix}/" VERBATIM ) endif() From 2287def85e0b0a5415c879fc38dd3aeecf142185 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 8 Oct 2020 12:35:14 +0200 Subject: [PATCH 16/25] clangbackend: Fix crash We cannot assume that a Q_PROPERTY name is on the same line as the keyword. Fixes: QTCREATORBUG-24746 Change-Id: Ic2e02291e24c1abbaf72881b540a26c82899cb2c Reviewed-by: Christian Stenger --- .../clangbackend/source/fulltokeninfo.cpp | 13 ++++--- .../unit/unittest/data/highlightingmarks.cpp | 32 +++++++++++++++++ tests/unit/unittest/tokenprocessor-test.cpp | 36 +++++++++++++++++++ 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/tools/clangbackend/source/fulltokeninfo.cpp b/src/tools/clangbackend/source/fulltokeninfo.cpp index fd59d25766b..58b8398c972 100644 --- a/src/tools/clangbackend/source/fulltokeninfo.cpp +++ b/src/tools/clangbackend/source/fulltokeninfo.cpp @@ -106,13 +106,16 @@ static Utf8String getPropertyType(const SourceLocation &location, uint propertyP uint offset; clang_getFileLocation(location.cx(), &cxFile, nullptr, nullptr, &offset); const char *const contents = clang_getFileContents(location.tu(), cxFile, nullptr); - const char *const lineContents = &contents[offset - propertyPosition]; - - const char *typeStart = std::strstr(lineContents, "Q_PROPERTY") + 10; + const int keywordOffset = QByteArray::fromRawData(contents, propertyPosition) + .lastIndexOf("Q_PROPERTY"); + if (keywordOffset == -1) + return {}; + const char * const keywordStart = contents + keywordOffset; + const char *typeStart = keywordStart + 10; typeStart += std::strspn(typeStart, "( \t\n\r"); - if (typeStart - lineContents >= propertyPosition) + if (typeStart - keywordStart >= propertyPosition) return Utf8String(); - auto typeEnd = std::find_if(std::reverse_iterator(lineContents + propertyPosition), + auto typeEnd = std::find_if(std::reverse_iterator(keywordStart + propertyPosition), std::reverse_iterator(typeStart), Utils::unequalTo(' ')); diff --git a/tests/unit/unittest/data/highlightingmarks.cpp b/tests/unit/unittest/data/highlightingmarks.cpp index 2476cabfb22..33dfbe91dec 100644 --- a/tests/unit/unittest/data/highlightingmarks.cpp +++ b/tests/unit/unittest/data/highlightingmarks.cpp @@ -699,3 +699,35 @@ private: template struct S { }; template using spec = S; spec<2> s; + +class Property { + Q_PROPERTY( + + const + + volatile + + unsigned + + long + + long + + * + + prop + + READ + + getProp + + WRITE + + setProp + + NOTIFY + + propChanged + + ) +}; diff --git a/tests/unit/unittest/tokenprocessor-test.cpp b/tests/unit/unittest/tokenprocessor-test.cpp index 786b980f222..37c76d8ce6d 100644 --- a/tests/unit/unittest/tokenprocessor-test.cpp +++ b/tests/unit/unittest/tokenprocessor-test.cpp @@ -146,6 +146,7 @@ public: static void TearDownTestCase(); SourceRange sourceRange(uint line, uint columnEnd) const; + SourceRange sourceRangeMultiLine(uint firstLine, uint lastLine, uint columnEnd) const; protected: static Data *d; @@ -1574,6 +1575,14 @@ TEST_F(TokenProcessor, QtPropertyName) ASSERT_THAT(infos[8], HasOnlyType(HighlightingType::QtProperty)); } +TEST_F(TokenProcessor, QtPropertyNameMultiLine) +{ + const auto infos = translationUnit.fullTokenInfosInRange(sourceRangeMultiLine(704, 732, 14)); + + ASSERT_THAT(infos[0], HasOnlyType(HighlightingType::PreprocessorExpansion)); + ASSERT_THAT(infos[8], HasOnlyType(HighlightingType::QtProperty)); +} + TEST_F(TokenProcessor, QtPropertyFunction) { const auto infos = translationUnit.fullTokenInfosInRange(sourceRange(599, 103)); @@ -1581,6 +1590,13 @@ TEST_F(TokenProcessor, QtPropertyFunction) ASSERT_THAT(infos[10], HasOnlyType(HighlightingType::Function)); } +TEST_F(TokenProcessor, QtPropertyFunctionMultiLine) +{ + const auto infos = translationUnit.fullTokenInfosInRange(sourceRangeMultiLine(704, 732, 14)); + + ASSERT_THAT(infos[10], HasOnlyType(HighlightingType::Function)); +} + TEST_F(TokenProcessor, QtPropertyInternalKeyword) { const auto infos = translationUnit.fullTokenInfosInRange(sourceRange(599, 103)); @@ -1588,6 +1604,13 @@ TEST_F(TokenProcessor, QtPropertyInternalKeyword) ASSERT_THAT(infos[9], HasOnlyType(HighlightingType::Invalid)); } +TEST_F(TokenProcessor, QtPropertyInternalKeywordMultiLine) +{ + const auto infos = translationUnit.fullTokenInfosInRange(sourceRangeMultiLine(704, 732, 14)); + + ASSERT_THAT(infos[9], HasOnlyType(HighlightingType::Invalid)); +} + TEST_F(TokenProcessor, QtPropertyLastToken) { const auto infos = translationUnit.fullTokenInfosInRange(sourceRange(599, 103)); @@ -1595,6 +1618,13 @@ TEST_F(TokenProcessor, QtPropertyLastToken) ASSERT_THAT(infos[14], HasOnlyType(HighlightingType::Function)); } +TEST_F(TokenProcessor, QtPropertyLastTokenMultiLine) +{ + const auto infos = translationUnit.fullTokenInfosInRange(sourceRangeMultiLine(704, 732, 14)); + + ASSERT_THAT(infos[14], HasOnlyType(HighlightingType::Function)); +} + TEST_F(TokenProcessor, QtPropertyType) { const auto infos = translationUnit.fullTokenInfosInRange(sourceRange(600, 46)); @@ -1747,4 +1777,10 @@ ClangBackEnd::SourceRange TokenProcessor::sourceRange(uint line, uint columnEnd) return translationUnit.sourceRange(line, 1, line, columnEnd); } +ClangBackEnd::SourceRange TokenProcessor::sourceRangeMultiLine(uint firstLine, uint lastLine, + uint columnEnd) const +{ + return translationUnit.sourceRange(firstLine, 1, lastLine, columnEnd); +} + } From 9fe48b36e48745f835d3eef3aeeffa166962bf0b Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 5 Oct 2020 06:05:18 +0200 Subject: [PATCH 17/25] Utils: Re-use BaseAspect's m_settingsKey for SavedAction Change-Id: I7ebc8013f15970a56315b3da80969808e505b3bf Reviewed-by: Christian Stenger --- src/libs/utils/aspects.cpp | 30 ++++++++++++++++++++++++++++++ src/libs/utils/aspects.h | 5 +++-- src/libs/utils/savedaction.cpp | 32 -------------------------------- src/libs/utils/savedaction.h | 6 ------ 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 217a3abfa70..77b4eda3062 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -85,6 +85,36 @@ void BaseAspect::setConfigWidgetCreator(const ConfigWidgetCreator &configWidgetC m_configWidgetCreator = configWidgetCreator; } +/*! + Returns the key to be used when accessing the settings. + + \sa setSettingsKey() +*/ +QString BaseAspect::settingsKey() const +{ + return m_settingsKey; +} + +/*! + Sets the key to be used when accessing the settings. + + \sa settingsKey() +*/ +void BaseAspect::setSettingsKey(const QString &key) +{ + m_settingsKey = key; +} + +/*! + Sets the key and group to be used when accessing the settings. + + \sa settingsKey() +*/ +void BaseAspect::setSettingsKey(const QString &group, const QString &key) +{ + m_settingsKey = group + "/" + key; +} + /*! \internal */ diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index 6308a13e8c7..8313bcc83dc 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -59,11 +59,12 @@ public: void setId(Utils::Id id) { m_id = id; } void setDisplayName(const QString &displayName) { m_displayName = displayName; } - void setSettingsKey(const QString &settingsKey) { m_settingsKey = settingsKey; } + void setSettingsKey(const QString &settingsKey); + void setSettingsKey(const QString &group, const QString &key); Utils::Id id() const { return m_id; } QString displayName() const { return m_displayName; } - QString settingsKey() const { return m_settingsKey; } + QString settingsKey() const; bool isVisible() const { return m_visible; } void setVisible(bool visible) { m_visible = visible; } diff --git a/src/libs/utils/savedaction.cpp b/src/libs/utils/savedaction.cpp index 65f9492a6b0..6388818dcbb 100644 --- a/src/libs/utils/savedaction.cpp +++ b/src/libs/utils/savedaction.cpp @@ -113,38 +113,6 @@ void SavedAction::setDefaultValue(const QVariant &value) } -/*! - Returns the key to be used when accessing the settings. - - \sa settingsKey() -*/ -QString SavedAction::settingsKey() const -{ - return m_settingsKey; -} - - -/*! - Sets the key to be used when accessing the settings. - - \sa settingsKey() -*/ -void SavedAction::setSettingsKey(const QString &key) -{ - m_settingsKey = key; -} - - -/*! - Sets the key and group to be used when accessing the settings. - - \sa settingsKey() -*/ -void SavedAction::setSettingsKey(const QString &group, const QString &key) -{ - m_settingsKey = group + "/" + key; -} - QString SavedAction::toString() const { return QLatin1String("value: ") + m_value.toString() diff --git a/src/libs/utils/savedaction.h b/src/libs/utils/savedaction.h index 98403d683be..a6188ab5091 100644 --- a/src/libs/utils/savedaction.h +++ b/src/libs/utils/savedaction.h @@ -54,11 +54,6 @@ public: void trigger(const QVariant &data); - // used for persistency - QString settingsKey() const; - void setSettingsKey(const QString &key); - void setSettingsKey(const QString &group, const QString &key); - virtual void readSettings(const QSettings *settings); virtual void writeSettings(QSettings *settings); @@ -88,7 +83,6 @@ private: QVariant m_value; QVariant m_defaultValue; - QString m_settingsKey; QString m_dialogText; QWidget *m_widget = nullptr; QAction m_action; From a8e704bd8234725b4cc2ad986e372df3fd4d557c Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 28 Jul 2020 11:58:23 +0200 Subject: [PATCH 18/25] ManhattanStyle: Improve dark theme look of some widgets This improves the visibility of radiobuttons, checkboxes, lineedits, groupboxes, frames and tab-close indicator in dark themes. Scrollbars, spinboxes and the arrow button of an editable combobox are not handled by this change. Task-number: QTCREATORBUG-23505 Change-Id: Ieba94f3847a3c2e0da7e9b554e1026525618f49f Reviewed-by: David Schulz --- src/plugins/coreplugin/manhattanstyle.cpp | 151 +++++++++++++++++++++- 1 file changed, 149 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp index d1617534d51..92c59e77eae 100644 --- a/src/plugins/coreplugin/manhattanstyle.cpp +++ b/src/plugins/coreplugin/manhattanstyle.cpp @@ -34,11 +34,13 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -116,6 +118,12 @@ bool lightColored(const QWidget *widget) return false; } +static bool isDarkFusionStyle(const QStyle *style) +{ + return creatorTheme()->flag(Theme::DarkUserInterface) + && strcmp(style->metaObject()->className(), "QFusionStyle") == 0; +} + class ManhattanStylePrivate { public: @@ -385,11 +393,150 @@ int ManhattanStyle::styleHint(StyleHint hint, const QStyleOption *option, const return ret; } +static void drawPrimitiveTweakedForDarkTheme(QStyle::PrimitiveElement element, + const QStyleOption *option, + QPainter *painter, const QWidget *widget) +{ + const bool hasFocus = option->state & QStyle::State_HasFocus; + const bool isChecked = option->state & QStyle::State_On; + const bool isPartiallyChecked = option->state & QStyle::State_NoChange; + const bool isEnabled = option->state & QStyle::State_Enabled; + const bool isSunken = option->state & QStyle::State_Sunken; + + const QColor frameColor = isEnabled ? option->palette.color(QPalette::Mid).darker(132) + : creatorTheme()->color(Theme::BackgroundColorDisabled); + const QColor indicatorColor = isEnabled ? option->palette.color(QPalette::Mid).darker(90) + : creatorTheme()->color(Theme::BackgroundColorDisabled); + const QColor bgColor = isSunken ? option->palette.color(QPalette::Mid).darker() + : option->palette.color(QPalette::Window); + const QColor hlColor = option->palette.color(QPalette::Highlight); + + QPen framePen(hasFocus ? hlColor : frameColor, 1); + framePen.setJoinStyle(Qt::MiterJoin); + QPen indicatorPen(indicatorColor, 1); + indicatorPen.setJoinStyle(Qt::MiterJoin); + + painter->save(); + painter->setRenderHint(QPainter::Antialiasing); + + switch (element) { + case QStyle::PE_Frame: { + const QRectF frameRectF = QRectF(option->rect).adjusted(0.5, 0.5, -0.5, -0.5); + painter->setPen(framePen); + painter->drawRect(frameRectF); + break; + } + case QStyle::PE_FrameLineEdit: { + const bool isComboBox = widget->inherits("QComboBox"); + const QRectF frameRectF = + QRectF(option->rect).adjusted(0.5, 0.5, isComboBox ? -8.5 : -0.5, -0.5); + painter->setPen(framePen); + painter->drawRect(frameRectF); + break; + } + case QStyle::PE_FrameGroupBox: { + // Snippet from QFusionStyle::drawPrimitive - BEGIN + static const int groupBoxTopMargin = 3; + int topMargin = 0; + auto control = dynamic_cast(widget); + if (control && !control->isCheckable() && control->title().isEmpty()) { + // Shrinking the topMargin if Not checkable AND title is empty + topMargin = groupBoxTopMargin; + } else { + topMargin = qMax(widget->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight), + option->fontMetrics.height()) + groupBoxTopMargin; + } + // Snippet from QFusionStyle::drawPrimitive - END + + const QRectF frameRectF = QRectF(option->rect).adjusted(0.5, topMargin + 0.5, -0.5, -0.5); + painter->setPen(framePen); + if (isEnabled) + painter->setOpacity(0.5); + painter->drawRect(frameRectF); + break; + } + case QStyle::PE_IndicatorRadioButton: { + const double lineWidth = 1.666; + const double o = lineWidth / 2; + indicatorPen.setWidth(lineWidth); + painter->setPen(framePen); + if (isEnabled) + painter->setBrush(bgColor); + painter->drawRoundedRect(QRectF(option->rect).adjusted(o, o, -o, -o), + 100, 100, Qt::RelativeSize); + + if (isChecked) { + painter->setPen(Qt::NoPen); + painter->setBrush(indicatorColor); + const double o = 4.25; + painter->drawRoundedRect(QRectF(option->rect).adjusted(o, o, -o, -o), + 100, 100, Qt::RelativeSize); + } + break; + } + case QStyle::PE_IndicatorCheckBox: { + const QRectF frameRectF = QRectF(option->rect).adjusted(0.5, 0.5, -0.5, -0.5); + painter->setPen(framePen); + if (isEnabled) + painter->setBrush(bgColor); + painter->drawRect(frameRectF); + + if (isPartiallyChecked) { + QPen outline(indicatorColor, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); + painter->setPen(outline); + QColor fill(frameColor); + fill.setAlphaF(0.8); + painter->setBrush(fill); + const double o = 3.5; + painter->drawRect(QRectF(option->rect).adjusted(o, o, -o, -o)); + } else if (isChecked) { + const double o = 3; + const QRectF r = QRectF(option->rect).adjusted(o, o, -o, -o); + QPen checkMarkPen(indicatorColor, 1.75, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); + painter->setPen(checkMarkPen); + painter->drawPolyline(QPolygonF({QPointF(r.left(), r.top() + r.height() / 2), + QPointF(r.left() + r.width() / 2.3, r.bottom()), + r.topRight()})); + } + break; + } + case QStyle::PE_IndicatorTabClose: { + QWindow *window = widget->window()->windowHandle(); + QRect iconRect = QRect(0, 0, 16, 16); + iconRect.moveCenter(option->rect.center()); + const QIcon::Mode mode = !isEnabled ? QIcon::Disabled : QIcon::Normal; + const static QIcon closeIcon = Utils::Icons::CLOSE_FOREGROUND.icon(); + if (option->state & QStyle::State_MouseOver) + widget->style()->drawPrimitive(QStyle::PE_PanelButtonCommand, option, painter, widget); + const QPixmap iconPx = + closeIcon.pixmap(window, iconRect.size() * widget->devicePixelRatio(), mode); + painter->drawPixmap(iconRect, iconPx); + break; + } + default: + QTC_ASSERT_STRING("Unhandled QStyle::PrimitiveElement case"); + break; + } + painter->restore(); +} + void ManhattanStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { - if (!panelWidget(widget)) { - QProxyStyle::drawPrimitive(element, option, painter, widget); + const bool isPanelWidget = panelWidget(widget); + if (!isPanelWidget) { + const bool tweakDarkTheme = + (element == PE_Frame + || element == PE_FrameLineEdit + || element == PE_FrameGroupBox + || element == PE_IndicatorRadioButton + || element == PE_IndicatorCheckBox + || element == PE_IndicatorTabClose) + && isDarkFusionStyle(baseStyle()); + if (tweakDarkTheme) + drawPrimitiveTweakedForDarkTheme(element, option, painter, widget); + else + QProxyStyle::drawPrimitive(element, option, painter, widget); return; } From 7527bbcf2c6868391b224ee4496f34179276b366 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Oct 2020 07:24:19 +0200 Subject: [PATCH 19/25] ProjectExplorer: Move KitAspect related layout code ... from KitManagerConfigWidget to KitAspectWidget (which is not really a widget, but...) The modification for the alignment handling only affect this use here. Long term I hope this can be handled centrally (e.g. always use the special form label alignment for labels in the first column when some LayoutBuilder bool property is set, instead of doing that for each use), so this is not necessarily a final API. Change-Id: I678dba45ee68ca9706569715d232f98363de8636 Reviewed-by: Christian Kandeler --- src/libs/utils/layoutbuilder.cpp | 13 ++++-- src/libs/utils/layoutbuilder.h | 8 ++-- src/plugins/projectexplorer/kitmanager.cpp | 20 ++++++++++ src/plugins/projectexplorer/kitmanager.h | 9 +++++ .../kitmanagerconfigwidget.cpp | 40 ++++--------------- .../projectexplorer/kitmanagerconfigwidget.h | 2 - 6 files changed, 51 insertions(+), 41 deletions(-) diff --git a/src/libs/utils/layoutbuilder.cpp b/src/libs/utils/layoutbuilder.cpp index bc4e4c59f70..2edb07c343c 100644 --- a/src/libs/utils/layoutbuilder.cpp +++ b/src/libs/utils/layoutbuilder.cpp @@ -31,6 +31,7 @@ #include #include +#include #include namespace Utils { @@ -69,7 +70,7 @@ LayoutBuilder::LayoutItem::LayoutItem() Constructs a layout item proxy for \a layout, spanning the number of cells specified by \a span in the target layout, with alignment \a align. */ -LayoutBuilder::LayoutItem::LayoutItem(QLayout *layout, int span, Qt::Alignment align) +LayoutBuilder::LayoutItem::LayoutItem(QLayout *layout, int span, Alignment align) : layout(layout), span(span), align(align) {} @@ -77,7 +78,7 @@ LayoutBuilder::LayoutItem::LayoutItem(QLayout *layout, int span, Qt::Alignment a Constructs a layout item proxy for \a widget, spanning the number of cell specified by \a span in the target layout, with alignment \a align. */ -LayoutBuilder::LayoutItem::LayoutItem(QWidget *widget, int span, Qt::Alignment align) +LayoutBuilder::LayoutItem::LayoutItem(QWidget *widget, int span, Alignment align) : widget(widget), span(span), align(align) {} @@ -269,8 +270,12 @@ LayoutBuilder &LayoutBuilder::addItem(const LayoutItem &item) item.aspect->addToLayout(*this); } else { if (m_gridLayout) { - if (auto widget = item.widget) - m_gridLayout->addWidget(widget, m_currentGridRow, m_currentGridColumn, 1, item.span, item.align); + if (auto widget = item.widget) { + Qt::Alignment align; + if (item.align == AlignAsFormLabel) + align = Qt::Alignment(widget->style()->styleHint(QStyle::SH_FormLayoutLabelAlignment)); + m_gridLayout->addWidget(widget, m_currentGridRow, m_currentGridColumn, 1, item.span, align); + } m_currentGridColumn += item.span; } else { m_pendingFormItems.append(item); diff --git a/src/libs/utils/layoutbuilder.h b/src/libs/utils/layoutbuilder.h index ddf60185181..1a2ad1f5e51 100644 --- a/src/libs/utils/layoutbuilder.h +++ b/src/libs/utils/layoutbuilder.h @@ -45,6 +45,8 @@ class QTCREATOR_UTILS_EXPORT LayoutBuilder { public: enum LayoutType { GridLayout, FormLayout }; + enum Alignment { DefaultAlignment, AlignAsFormLabel }; + explicit LayoutBuilder(QWidget *parent, LayoutType layoutType = FormLayout); explicit LayoutBuilder(QLayout *layout); // Adds to existing layout. @@ -54,8 +56,8 @@ public: { public: LayoutItem(); - LayoutItem(QLayout *layout, int span = 1, Qt::Alignment align = {}); - LayoutItem(QWidget *widget, int span = 1, Qt::Alignment align = {}); + LayoutItem(QLayout *layout, int span = 1, Alignment align = {}); + LayoutItem(QWidget *widget, int span = 1, Alignment align = {}); LayoutItem(BaseAspect *aspect); LayoutItem(const QString &text); @@ -64,7 +66,7 @@ public: BaseAspect *aspect = nullptr; QString text; int span = 1; - Qt::Alignment align; + Alignment align; }; LayoutBuilder &addItem(const LayoutItem &item); diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index 70151b58002..bfbf58f57fb 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -44,12 +44,14 @@ #include #include +#include #include #include #include #include #include +#include #include #include @@ -729,6 +731,24 @@ Utils::Id KitAspectWidget::kitInformationId() const return m_kitInformation->id(); } +void KitAspectWidget::addToLayout(LayoutBuilder &builder) +{ + QTC_ASSERT(!m_label, delete m_label); + m_label = new QLabel(m_kitInformation->displayName() + ':'); + m_label->setToolTip(m_kitInformation->description()); + + builder.addRow({{m_label, 1, LayoutBuilder::AlignAsFormLabel}, mainWidget(), buttonWidget()}); +} + +void KitAspectWidget::setVisible(bool visible) +{ + mainWidget()->setVisible(visible); + if (buttonWidget()) + buttonWidget()->setVisible(visible); + QTC_ASSERT(m_label, return); + m_label->setVisible(visible); +} + QString KitAspectWidget::msgManage() { return tr("Manage..."); diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index ecf542e8518..7cbc661a5c1 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -37,9 +37,14 @@ #include +QT_BEGIN_NAMESPACE +class QLabel; +QT_END_NAMESPACE + namespace Utils { class Environment; class FilePath; +class LayoutBuilder; class MacroExpander; class OutputLineParser; } // namespace Utils @@ -136,6 +141,9 @@ public: virtual QWidget *mainWidget() const = 0; virtual QWidget *buttonWidget() const { return nullptr; } + void addToLayout(Utils::LayoutBuilder &builder); + void setVisible(bool visible); + bool isSticky() const { return m_isSticky; } static QString msgManage(); @@ -149,6 +157,7 @@ protected: Kit *m_kit; const KitAspect *m_kitInformation; bool m_isSticky; + QLabel *m_label = nullptr; }; class PROJECTEXPLORER_EXPORT KitManager : public QObject diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index caeed15cdf8..dc0797c29e7 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -46,16 +46,11 @@ #include #include #include -#include #include #include #include -#include -#include #include -#include #include -#include static const char WORKING_COPY_KIT_ID[] = "modified kit"; @@ -71,14 +66,12 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : m_kit(k), m_modifiedKit(std::make_unique(Utils::Id(WORKING_COPY_KIT_ID))) { - static auto alignment - = static_cast(style()->styleHint(QStyle::SH_FormLayoutLabelAlignment)); - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); LayoutBuilder builder(this, LayoutBuilder::GridLayout); - QLabel *label = createLabel(tr("Name:"), tr("Kit name and icon.")); - builder.addRow({{label, 1, alignment}, m_nameEdit, m_iconButton}); + QLabel *label = new QLabel(tr("Name:")); + label->setToolTip(tr("Kit name and icon.")); + builder.addRow({{label, 1, LayoutBuilder::AlignAsFormLabel}, m_nameEdit, m_iconButton}); QString toolTip = tr("

The name of the kit suitable for generating " @@ -90,8 +83,9 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : Q_ASSERT(fileSystemFriendlyNameRegexp.isValid()); m_fileSystemFriendlyNameLineEdit->setValidator(new QRegularExpressionValidator(fileSystemFriendlyNameRegexp, m_fileSystemFriendlyNameLineEdit)); - label = createLabel(tr("File system name:"), toolTip); - builder.addRow({{label, 1, alignment}, m_fileSystemFriendlyNameLineEdit}); + label = new QLabel(tr("File system name:")); + label->setToolTip(toolTip); + builder.addRow({{label, 1, LayoutBuilder::AlignAsFormLabel}, m_fileSystemFriendlyNameLineEdit}); connect(m_fileSystemFriendlyNameLineEdit, &QLineEdit::textChanged, this, &KitManagerConfigWidget::setFileSystemFriendlyName); @@ -222,9 +216,6 @@ void KitManagerConfigWidget::addAspectToWorkingCopy(KitAspect *aspect) QTC_ASSERT(widget, return); QTC_ASSERT(!m_widgets.contains(widget), return); - const QString name = aspect->displayName() + ':'; - QString toolTip = aspect->description(); - auto action = new QAction(tr("Mark as Mutable"), nullptr); action->setCheckable(true); action->setChecked(workingCopy()->isMutable(aspect->id())); @@ -239,14 +230,9 @@ void KitManagerConfigWidget::addAspectToWorkingCopy(KitAspect *aspect) m_actions << action; - static auto alignment - = static_cast(style()->styleHint(QStyle::SH_FormLayoutLabelAlignment)); - - QLabel *label = createLabel(name, toolTip); LayoutBuilder builder(layout()); - builder.addRow({{label, 1, alignment}, widget->mainWidget(), widget->buttonWidget()}); + widget->addToLayout(builder); m_widgets.append(widget); - m_labels.append(label); } void KitManagerConfigWidget::updateVisibility() @@ -256,10 +242,7 @@ void KitManagerConfigWidget::updateVisibility() KitAspectWidget *widget = m_widgets.at(i); const bool visible = widget->visibleInKit() && !m_modifiedKit->irrelevantAspects().contains(widget->kitInformationId()); - widget->mainWidget()->setVisible(visible); - if (widget->buttonWidget()) - widget->buttonWidget()->setVisible(visible); - m_labels.at(i)->setVisible(visible); + widget->setVisible(visible); } } @@ -410,12 +393,5 @@ void KitManagerConfigWidget::showEvent(QShowEvent *event) widget->refresh(); } -QLabel *KitManagerConfigWidget::createLabel(const QString &name, const QString &toolTip) -{ - auto label = new QLabel(name); - label->setToolTip(toolTip); - return label; -} - } // namespace Internal } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.h b/src/plugins/projectexplorer/kitmanagerconfigwidget.h index b6e775579ea..89b74d7ee7c 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.h +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.h @@ -89,13 +89,11 @@ private: }; void showEvent(QShowEvent *event) override; - QLabel *createLabel(const QString &name, const QString &toolTip); QToolButton *m_iconButton; QLineEdit *m_nameEdit; QLineEdit *m_fileSystemFriendlyNameLineEdit; QList m_widgets; - QList m_labels; Kit *m_kit; std::unique_ptr m_modifiedKit; bool m_isDefaultKit = false; From b5af9151bc7365d3dd23dc0597e2a98b01300fb6 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 8 Oct 2020 16:14:17 +0200 Subject: [PATCH 20/25] Doc: Update info about using Clang tools Task-number: QTCREATORBUG-24529 Change-Id: I3abca4ae3061f1b940ad4f0ee0471bb84a05e63f Reviewed-by: David Schulz --- ...or-clang-copy-diagnostic-configuration.png | Bin 0 -> 4009 bytes ...creator-clang-tools-options-customized.png | Bin 9657 -> 9647 bytes .../images/qtcreator-clang-tools-options.png | Bin 9333 -> 9837 bytes .../qtcreator-diagnostics-configuration.png | Bin 12316 -> 13696 bytes .../creator-clang-static-analyzer.qdoc | 14 ++++++++++++-- 5 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-clang-copy-diagnostic-configuration.png diff --git a/doc/qtcreator/images/qtcreator-clang-copy-diagnostic-configuration.png b/doc/qtcreator/images/qtcreator-clang-copy-diagnostic-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..374d45132b2598be3736b2ef41cf445dcb892847 GIT binary patch literal 4009 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 z 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

o+}l;k^0Wi&L{_&wJ&3R$}kDHTL<{$KP?x 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 literal 9333 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 KelF{r5}E*?g@bSa literal 12316 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 diff --git a/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc b/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc index 804b8695a12..4f1ce5a8bd9 100644 --- a/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc +++ b/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc @@ -113,10 +113,15 @@ icon, hover the mouse pointer over the line. Select the \inlineimage settings.png - button to configure Clang diagnostics globally for Clang tools. + button to customize Clang diagnostics for the current project. \image qtcreator-clang-tools-options-customized.png "Clang Tools customized settings" + To restore the global settings, select \uicontrol {Restore Global Settings}. + To view and modify the global settings, select + \uicontrol {Open Global Settings}. To open the Clang static analyzer, + select \uicontrol {Go to Analyzer}. + \section1 Configuring Clang Tools To configure Clang diagnostics globally for Clang tools: @@ -138,6 +143,9 @@ generated during the build. For big projects, not building the project might save some time. + \li To disable automatic analysis of open documents, deselect the + \uicontrol {Analyze open files} check box. + \li In the \uicontrol {Parallel jobs} field, select the number of jobs to run in parallel to make the analysis faster on multi-core processors. @@ -147,7 +155,7 @@ \li Select \uicontrol Copy to create a custom Clang configuration. - \image qtcreator-diagnostics-configuration.png "Diagnostics Configuration dialog" + \image qtcreator-clang-copy-diagnostic-configuration.png "Copy Diagnostic Configuration dialog" \li In the \uicontrol {Diagnostic configuration name} field, give the configuration a name, and then select \uicontrol OK. @@ -158,6 +166,8 @@ system to the Clang code model for displaying annotations in the code editor. + \image qtcreator-diagnostics-configuration.png "Diagnostics Configuration dialog" + \li In the \uicontrol {Clang-Tidy Checks} tab, select \uicontrol {Select Checks} to select the checks to perform. From 6e70ced1135ddf287c247013958d7c9ddcbe8c54 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 8 Oct 2020 19:11:11 +0200 Subject: [PATCH 21/25] ProjectExplorer: Show "" for "-ensure-kit-for-binary" Don't show double angle brackts: "<>" Change-Id: I19a346b216b9b96f28c40b2d9bd5659449926174 Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/ProjectExplorer.json.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/ProjectExplorer.json.in b/src/plugins/projectexplorer/ProjectExplorer.json.in index 9c1ee0eee44..8764d7d6eab 100644 --- a/src/plugins/projectexplorer/ProjectExplorer.json.in +++ b/src/plugins/projectexplorer/ProjectExplorer.json.in @@ -22,7 +22,7 @@ }, { \"Name\" : \"-ensure-kit-for-binary\", - \"Parameter\" : \"\", + \"Parameter\" : \"file path\", \"Description\" : \"Create kit with architecture matching a given application or library\" }, { From db4b3641f5235be9a67967e0cf33512da2b50f6b Mon Sep 17 00:00:00 2001 From: Dominik Holland Date: Fri, 9 Oct 2020 12:29:57 +0200 Subject: [PATCH 22/25] qmlprofiler: Fix a crash in the rangeFilter Always check the stack before popping an element. Fixes: QTCREATORBUG-24730 Change-Id: I7dc6363137ef002219fbc49b7343cff8112a58c2 Reviewed-by: Ulf Hermann --- src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index f1349d97d9c..868b481a19d 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -395,7 +395,7 @@ QmlProfilerModelManager::rangeFilter(qint64 rangeStart, qint64 rangeEnd) const if (type.rangeType() != MaximumRangeType) { if (event.rangeStage() == RangeStart) stack.push(event); - else if (event.rangeStage() == RangeEnd) + else if (event.rangeStage() == RangeEnd && !stack.isEmpty()) stack.pop(); return true; } else if (isStateful(type)) { From 96d33bb8f84732b014571955ee06363faa11a7f5 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Oct 2020 06:24:21 +0200 Subject: [PATCH 23/25] ProjectExplorer: Remove unused KitAspectWidget::dirty signal Change-Id: Iabf37b3806eae4dcde73927bd540723a7b8f88bb Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/kitmanager.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index 7cbc661a5c1..99e9a40ac6a 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -150,9 +150,6 @@ public: Kit *kit() const { return m_kit; } -signals: - void dirty(); - protected: Kit *m_kit; const KitAspect *m_kitInformation; From a722b7a09353bd34ca826888658ddf22437e40ff Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 9 Oct 2020 12:57:20 +0200 Subject: [PATCH 24/25] ProjectExplorer: Fix CustomProcessStep Only display worked, the command was not used for running. Change-Id: I6afc65d97310fe14a58136393bd0657127d8afca Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/processstep.cpp | 66 ++++++++++----------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp index 0ffde35238f..cdc5d3a4c70 100644 --- a/src/plugins/projectexplorer/processstep.cpp +++ b/src/plugins/projectexplorer/processstep.cpp @@ -51,37 +51,43 @@ class ProcessStep final : public AbstractProcessStep Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::ProcessStep) public: - ProcessStep(BuildStepList *bsl, Utils::Id id); + ProcessStep(BuildStepList *bsl, Id id); - void setupOutputFormatter(Utils::OutputFormatter *formatter); - void setupProcessParameters(ProcessParameters *pp); - - StringAspect *m_command; - StringAspect *m_arguments; - StringAspect *m_workingDirectory; + void setupOutputFormatter(OutputFormatter *formatter); }; -ProcessStep::ProcessStep(BuildStepList *bsl, Utils::Id id) +ProcessStep::ProcessStep(BuildStepList *bsl, Id id) : AbstractProcessStep(bsl, id) { - m_command = addAspect(); - m_command->setSettingsKey(PROCESS_COMMAND_KEY); - m_command->setDisplayStyle(StringAspect::PathChooserDisplay); - m_command->setLabelText(tr("Command:")); - m_command->setExpectedKind(Utils::PathChooser::Command); - m_command->setHistoryCompleter("PE.ProcessStepCommand.History"); + auto command = addAspect(); + command->setSettingsKey(PROCESS_COMMAND_KEY); + command->setDisplayStyle(StringAspect::PathChooserDisplay); + command->setLabelText(tr("Command:")); + command->setExpectedKind(PathChooser::Command); + command->setHistoryCompleter("PE.ProcessStepCommand.History"); - m_arguments = addAspect(); - m_arguments->setSettingsKey(PROCESS_ARGUMENTS_KEY); - m_arguments->setDisplayStyle(StringAspect::LineEditDisplay); - m_arguments->setLabelText(tr("Arguments:")); + auto arguments = addAspect(); + arguments->setSettingsKey(PROCESS_ARGUMENTS_KEY); + arguments->setDisplayStyle(StringAspect::LineEditDisplay); + arguments->setLabelText(tr("Arguments:")); - m_workingDirectory = addAspect(); - m_workingDirectory->setSettingsKey(PROCESS_WORKINGDIRECTORY_KEY); - m_workingDirectory->setValue(Constants::DEFAULT_WORKING_DIR); - m_workingDirectory->setDisplayStyle(StringAspect::PathChooserDisplay); - m_workingDirectory->setLabelText(tr("Working directory:")); - m_workingDirectory->setExpectedKind(Utils::PathChooser::Directory); + auto workingDirectory = addAspect(); + workingDirectory->setSettingsKey(PROCESS_WORKINGDIRECTORY_KEY); + workingDirectory->setValue(Constants::DEFAULT_WORKING_DIR); + workingDirectory->setDisplayStyle(StringAspect::PathChooserDisplay); + workingDirectory->setLabelText(tr("Working directory:")); + workingDirectory->setExpectedKind(PathChooser::Directory); + + setWorkingDirectoryProvider([this, workingDirectory] { + const FilePath workingDir = workingDirectory->filePath(); + if (workingDir.isEmpty()) + return FilePath::fromString(fallbackWorkingDirectory()); + return workingDir; + }); + + setCommandLineProvider([command, arguments] { + return CommandLine{command->filePath(), arguments->value(), CommandLine::Raw}; + }); setSummaryUpdater([this] { QString display = displayName(); @@ -101,18 +107,6 @@ void ProcessStep::setupOutputFormatter(OutputFormatter *formatter) AbstractProcessStep::setupOutputFormatter(formatter); } -void ProcessStep::setupProcessParameters(ProcessParameters *pp) -{ - QString workingDirectory = m_workingDirectory->value(); - if (workingDirectory.isEmpty()) - workingDirectory = fallbackWorkingDirectory(); - - pp->setMacroExpander(macroExpander()); - pp->setEnvironment(buildEnvironment()); - pp->setWorkingDirectory(FilePath::fromString(workingDirectory)); - pp->setCommandLine({m_command->filePath(), m_arguments->value(), CommandLine::Raw}); -} - // ProcessStepFactory ProcessStepFactory::ProcessStepFactory() From 75adba735bd85bb68b91923ce74762c2ca9be5f0 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 7 Oct 2020 13:31:13 +0200 Subject: [PATCH 25/25] CMake build: Build Qbs if the submodule is available Includes update of Qbs to current head of master, which enables this feature on the Qbs build system side. Fixes: QTCREATORBUG-23905 Change-Id: I9a537b640b7f7a753839ace3e44d174c8e0af526 Reviewed-by: Christian Kandeler Reviewed-by: Ivan Komissarov --- .github/workflows/build_cmake.yml | 4 +--- src/shared/CMakeLists.txt | 34 +++++++++++++++++++++++++++++++ src/shared/qbs | 2 +- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index 42254415db5..7ab0201d974 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -48,9 +48,7 @@ jobs: - name: Checkout submodules run: | git submodule set-url -- perfparser https://code.qt.io/qt-creator/perfparser.git - git submodule update --init src/plugins/help/qlitehtml/litehtml - git submodule update --init src/tools/perfparser - git submodule update --init tests/unit/unittest/3rdparty/googletest + git submodule update --init - name: Download Ninja and CMake shell: cmake -P {0} diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index eeaad66af22..4d702e889d1 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -4,3 +4,37 @@ add_subdirectory(qtsingleapplication) add_subdirectory(qtlockedfile) add_subdirectory(help) add_subdirectory(registryaccess) + +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/qbs/CMakeLists.txt) + set(BUILD_QBS_DEFAULT YES) +else() + set(BUILD_QBS_DEFAULT FALSE) +endif() + +option(BUILD_QBS "Build Qbs together with Qt Creator" ${BUILD_QBS_DEFAULT}) + +if (BUILD_QBS) + find_package(Qt5 COMPONENTS Script QUIET) + if (TARGET Qt5::Script) + set(ENABLE_BUILD_QBS YES) + endif() +else() + set(ENABLE_BUILD_QBS NO) +endif() + +add_feature_info("Build Qbs" ENABLE_BUILD_QBS "with CONDITION TARGET Qt5::Script") +if (ENABLE_BUILD_QBS) + file(RELATIVE_PATH _REL_PATH_TO_QTC "${CMAKE_BINARY_DIR}" "${PROJECT_BINARY_DIR}") + set(QBS_OUTPUT_PREFIX "${_REL_PATH_TO_QTC}/" CACHE STRING "" FORCE) + set(QBS_APP_INSTALL_DIR "${IDE_BIN_PATH}" CACHE STRING "" FORCE) + set(QBS_LIB_INSTALL_DIR "${IDE_LIBRARY_PATH}" CACHE STRING "" FORCE) + set(QBS_DLL_INSTALL_DIR "${IDE_BIN_PATH}" CACHE STRING "" FORCE) + set(QBS_LIBEXEC_INSTALL_DIR "${IDE_LIBEXEC_PATH}" CACHE STRING "" FORCE) + set(QBS_PLUGINS_INSTALL_BASE "${IDE_PLUGIN_PATH}" CACHE STRING "" FORCE) + set(QBS_RESOURCES_INSTALL_BASE "${IDE_DATA_PATH}/qbs" CACHE STRING "" FORCE) + set(QBS_HEADERS_INSTALL_DIR "${IDE_DATA_PATH}/qbs/include/qbs" CACHE STRING "" FORCE) + + set(INSTALL_PUBLIC_HEADERS OFF) + set(WITH_TESTS OFF) + add_subdirectory(qbs) +endif() diff --git a/src/shared/qbs b/src/shared/qbs index 1f2900f4181..0d5fdcee74b 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 1f2900f4181d44b53f2a36ee637b8570f611515f +Subproject commit 0d5fdcee74b76175e0b03269b12d9bd4b6eee9c4