From 87663b68668d9c226fda817ecda61fec13db98f4 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 1 Feb 2022 15:06:00 +0100 Subject: [PATCH 01/67] QmlDesigner: Fix performance bottleneck in navigator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NavigatorTreeModel::filteredList is relativly slow and it is frequently called by ::index and ::rowCount. We introduce the cache and also improve appendForcedNodes to avoid quadratic blow up by using a set. Task-number: QDS-6110 Change-Id: I83b860158ad2cdc1c83a9e8a72b2d13781e91f86 Reviewed-by: Henning Gründl --- .../navigator/navigatortreemodel.cpp | 27 +++++++++++++------ .../components/navigator/navigatortreemodel.h | 2 ++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index ffdd105d39b..7e7b650da82 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -304,24 +304,28 @@ Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const void static appendForcedNodes(const NodeListProperty &property, QList &list) { - const QStringList visibleProperties = NodeHints::fromModelNode(property.parentModelNode()).visibleNonDefaultProperties(); + const QSet set = QSet(list.constBegin(), list.constEnd()); for (const ModelNode &node : property.parentModelNode().directSubModelNodes()) { - if (!list.contains(node) && visibleProperties.contains(QString::fromUtf8(node.parentProperty().name()))) - list.append(node); + if (!set.contains(node)) { + const QStringList visibleProperties = NodeHints::fromModelNode(property.parentModelNode()).visibleNonDefaultProperties(); + if (visibleProperties.contains(QString::fromUtf8(node.parentProperty().name()))) + list.append(node); + } } } -QList filteredList(const NodeListProperty &property, bool filter, bool reverseOrder) +QList NavigatorTreeModel::filteredList(const NodeListProperty &property, bool filter, bool reverseOrder) const { + auto it = m_rowCache.find(property.parentModelNode()); + + if (it != m_rowCache.end()) + return it.value(); + QList list; if (filter) { list.append(Utils::filtered(property.toModelNodeList(), [] (const ModelNode &arg) { - const char auxProp[] = "showInNavigator@Internal"; - if (arg.hasAuxiliaryData(auxProp)) - return arg.auxiliaryData(auxProp).toBool(); const bool value = QmlItemNode::isValidQmlItemNode(arg) || NodeHints::fromModelNode(arg).visibleInNavigator(); - arg.setAuxiliaryDataWithoutLock(auxProp, value); return value; })); } else { @@ -333,6 +337,7 @@ QList filteredList(const NodeListProperty &property, bool filter, boo if (reverseOrder) std::reverse(list.begin(), list.end()); + m_rowCache.insert(property.parentModelNode(), list); return list; } @@ -1137,6 +1142,7 @@ QList NavigatorTreeModel::nodesToPersistentIndex(const QL void NavigatorTreeModel::notifyModelNodesRemoved(const QList &modelNodes) { + m_rowCache.clear(); QList indexes = nodesToPersistentIndex(collectParents(modelNodes)); emit layoutAboutToBeChanged(indexes); emit layoutChanged(indexes); @@ -1144,6 +1150,7 @@ void NavigatorTreeModel::notifyModelNodesRemoved(const QList &modelNo void NavigatorTreeModel::notifyModelNodesInserted(const QList &modelNodes) { + m_rowCache.clear(); QList indexes = nodesToPersistentIndex(collectParents(modelNodes)); emit layoutAboutToBeChanged(indexes); emit layoutChanged(indexes); @@ -1151,6 +1158,7 @@ void NavigatorTreeModel::notifyModelNodesInserted(const QList &modelN void NavigatorTreeModel::notifyModelNodesMoved(const QList &modelNodes) { + m_rowCache.clear(); QList indexes = nodesToPersistentIndex(collectParents(modelNodes)); emit layoutAboutToBeChanged(indexes); emit layoutChanged(indexes); @@ -1164,18 +1172,21 @@ void NavigatorTreeModel::notifyIconsChanged() void NavigatorTreeModel::setFilter(bool showOnlyVisibleItems) { m_showOnlyVisibleItems = showOnlyVisibleItems; + m_rowCache.clear(); resetModel(); } void NavigatorTreeModel::setOrder(bool reverseItemOrder) { m_reverseItemOrder = reverseItemOrder; + m_rowCache.clear(); resetModel(); } void NavigatorTreeModel::resetModel() { beginResetModel(); + m_rowCache.clear(); m_nodeIndexHash.clear(); endResetModel(); } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h index cb2d9451b42..ab7cd60b931 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h @@ -129,9 +129,11 @@ private: ModelNode createTextureNode(const NodeAbstractProperty &targetProp, const QString &imagePath); QList nodesToPersistentIndex(const QList &modelNodes); void addImport(const QString &importName); + QList filteredList(const NodeListProperty &property, bool filter, bool reverseOrder) const; QPointer m_view; mutable QHash m_nodeIndexHash; + mutable QHash > m_rowCache; bool m_showOnlyVisibleItems = true; bool m_reverseItemOrder = false; DesignerActionManager *m_actionManager = nullptr; From 8f288bd7e4f10278c8610446a8293b84883fe7dd Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 1 Feb 2022 19:42:24 +0100 Subject: [PATCH 02/67] ProjectExplorer: Improve layout in TargetTripleWidget This gives the triple lineedit a bit of stretch. Change-Id: Ib1742bc39c64b797b86e1740650a177689657557 Reviewed-by: Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/gcctoolchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 061636cf427..e4f4098c5ff 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -1277,7 +1277,7 @@ public: m_overrideCheckBox.setText(tr("Override for code model")); m_overrideCheckBox.setToolTip(tr("Check this button in the rare case that the code model\n" "fails because clang does not understand the target architecture.")); - layout->addWidget(&m_tripleLineEdit); + layout->addWidget(&m_tripleLineEdit, 1); layout->addWidget(&m_overrideCheckBox); layout->addStretch(1); From 779c59a3e6fe6ac13427b6b07e6fa3e2c5bbe3a3 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 2 Feb 2022 11:27:02 +0100 Subject: [PATCH 03/67] CMake build: Fix missing tool button icon - for the branding feature CMake uses a different, generated qrc file - move the Qt logo out of the Qt Creator logo files, it doesn't belong there Amends 5eafa345edcd9fa91ab81e2289611d99422c60b8 Fixes: QTCREATORBUG-26969 Change-Id: I6f3d87abd52810d42142073ac944e6553c38caf1 Reviewed-by: Alessandro Portale --- src/plugins/coreplugin/core.qrc | 4 ++-- src/plugins/coreplugin/core.qrc.cmakein | 2 ++ .../{logo/16/Qt_logo_green.png => qtlogo.png} | Bin .../{logo/32/Qt_logo_green.png => qtlogo@2x.png} | Bin 4 files changed, 4 insertions(+), 2 deletions(-) rename src/plugins/coreplugin/images/{logo/16/Qt_logo_green.png => qtlogo.png} (100%) rename src/plugins/coreplugin/images/{logo/32/Qt_logo_green.png => qtlogo@2x.png} (100%) diff --git a/src/plugins/coreplugin/core.qrc b/src/plugins/coreplugin/core.qrc index 3804d793098..4389dba12b3 100644 --- a/src/plugins/coreplugin/core.qrc +++ b/src/plugins/coreplugin/core.qrc @@ -6,7 +6,7 @@ images/settingscategory_core@2x.png images/settingscategory_design.png images/settingscategory_design@2x.png - images/logo/16/Qt_logo_green.png - images/logo/32/Qt_logo_green.png + images/qtlogo.png + images/qtlogo@2x.png diff --git a/src/plugins/coreplugin/core.qrc.cmakein b/src/plugins/coreplugin/core.qrc.cmakein index 6d5cd0bc6d9..dae636db832 100644 --- a/src/plugins/coreplugin/core.qrc.cmakein +++ b/src/plugins/coreplugin/core.qrc.cmakein @@ -6,5 +6,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/images/settingscategory_core@2x.png ${CMAKE_CURRENT_SOURCE_DIR}/images/settingscategory_design.png ${CMAKE_CURRENT_SOURCE_DIR}/images/settingscategory_design@2x.png + ${CMAKE_CURRENT_SOURCE_DIR}/images/qtlogo.png + ${CMAKE_CURRENT_SOURCE_DIR}/images/qtlogo@2x.png diff --git a/src/plugins/coreplugin/images/logo/16/Qt_logo_green.png b/src/plugins/coreplugin/images/qtlogo.png similarity index 100% rename from src/plugins/coreplugin/images/logo/16/Qt_logo_green.png rename to src/plugins/coreplugin/images/qtlogo.png diff --git a/src/plugins/coreplugin/images/logo/32/Qt_logo_green.png b/src/plugins/coreplugin/images/qtlogo@2x.png similarity index 100% rename from src/plugins/coreplugin/images/logo/32/Qt_logo_green.png rename to src/plugins/coreplugin/images/qtlogo@2x.png From d9f1421841d1cc06c79858185431f6eda402e2c1 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 1 Feb 2022 12:08:59 +0100 Subject: [PATCH 04/67] Manual test: Silence deprecation warning of proparser test with Qt6 Change-Id: I89fcc27e9d8f87fc35f677eea09a50ae3226a3a1 Reviewed-by: Christian Kandeler --- tests/manual/proparser/main.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/manual/proparser/main.cpp b/tests/manual/proparser/main.cpp index 74710314902..aed9eefc8d3 100644 --- a/tests/manual/proparser/main.cpp +++ b/tests/manual/proparser/main.cpp @@ -142,8 +142,13 @@ int main(int argc, char **argv) QMakeGlobals option; QString qmake = QString::fromLocal8Bit(qgetenv("TESTREADER_QMAKE")); - if (qmake.isEmpty()) + if (qmake.isEmpty()) { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) qmake = QLibraryInfo::location(QLibraryInfo::BinariesPath) + QLatin1String("/qmake"); +#else + qmake = QLibraryInfo::path(QLibraryInfo::BinariesPath) + QLatin1String("/qmake"); +#endif + } option.qmake_abslocation = QDir::cleanPath(qmake); option.initProperties(); From 435a4e9dd49aeae1939fa9aa980bafa6f2f22460 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 1 Feb 2022 12:10:48 +0100 Subject: [PATCH 05/67] Shootout: Fix compile with Qt6 ...and fix location of build directories used by the test. Change-Id: I483739e8dedb9a1915115ae9895490cb79de5c94 Reviewed-by: Christian Kandeler --- tests/manual/shootout/tst_codesize.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/tests/manual/shootout/tst_codesize.cpp b/tests/manual/shootout/tst_codesize.cpp index 630053987f1..738d3b032c3 100644 --- a/tests/manual/shootout/tst_codesize.cpp +++ b/tests/manual/shootout/tst_codesize.cpp @@ -72,7 +72,7 @@ struct TempStuff { TempStuff() : buildTemp(QLatin1String("qt_tst_codesize")) { - buildPath = QDir::currentPath() + QLatin1Char('/') + buildTemp.path(); + buildPath = buildTemp.path(); buildTemp.setAutoRemove(false); QVERIFY(!buildPath.isEmpty()); } @@ -214,9 +214,8 @@ void tst_CodeSize::codesize() QProcess qmake; qmake.setWorkingDirectory(t->buildPath); - QString cmd = QString::fromLatin1(m_qmakeBinary + " -r doit.pro"); - qDebug() << "Starting qmake: " << cmd; - qmake.start(cmd); + qDebug() << "Starting qmake: " << QString::fromLatin1(m_qmakeBinary + " -r doit.pro"); + qmake.start(QString::fromLatin1(m_qmakeBinary), {"-r", "doit.pro"}); // QVERIFY(qmake.waitForFinished()); qmake.waitForFinished(); QByteArray output = qmake.readAllStandardOutput(); @@ -255,20 +254,24 @@ void tst_CodeSize::codesize() << "\nExtra CXX Flags: " << c.extraCxxFlags.data(); #ifdef Q_OS_WIN # ifdef Q_CC_MSVC - QByteArray finalCommand = suite.cmd + ' ' + "release\\" + c.file + ".obj"; + QString arguments = "release\\" + c.file + ".obj"; # else - QByteArray finalCommand = suite.cmd + ' ' + "release\\" + c.file + ".o"; + QString arguments = "release\\" + c.file + ".o"; # endif #else - QByteArray finalCommand = suite.cmd + ' ' + c.file + ".o"; + QString arguments = QString(c.file + ".o"); #endif + const int index = suite.cmd.indexOf(' '); + QString command = suite.cmd.left(index); + arguments = QString::fromLatin1(suite.cmd.mid(index + 1)) + arguments; QProcess final; final.setWorkingDirectory(t->buildPath); final.setProcessEnvironment(m_env); - cout << "\nCommand: " << finalCommand.data() + cout << "\nCommand: " << suite.cmd.data() << arguments.data() << "\n\n--------------------- OUTPUT " << suiteCount << '.' << i << ' ' << " ---------------------------------\n\n"; - final.start(finalCommand); + + final.start(command, arguments.split(' ')); QVERIFY(final.waitForFinished()); QByteArray stdOut = final.readAllStandardOutput(); QByteArray stdErr = final.readAllStandardError(); From b864496238f76a9af40d977da325da874ad2ee7a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 1 Feb 2022 12:13:56 +0100 Subject: [PATCH 06/67] Manual tests: Adapt to upstream changes Change-Id: If7a3cfe94f96c64efbd43636ab0d054f9dbce32c Reviewed-by: Christian Kandeler --- tests/manual/ssh/shell/argumentscollector.cpp | 3 ++- tests/manual/ssh/shell/shell.cpp | 6 ------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/manual/ssh/shell/argumentscollector.cpp b/tests/manual/ssh/shell/argumentscollector.cpp index 1a34b4e53df..e9e7e61888b 100644 --- a/tests/manual/ssh/shell/argumentscollector.cpp +++ b/tests/manual/ssh/shell/argumentscollector.cpp @@ -58,7 +58,8 @@ SshConnectionParameters ArgumentsCollector::collect(bool &success) const } else if (checkAndSetIntArg(pos, port, portGiven, "-p") || checkAndSetIntArg(pos, parameters.timeout, timeoutGiven, "-t")) { continue; - } else if (checkAndSetStringArg(pos, parameters.privateKeyFile, "-k")) { + } else if (checkAndSetStringArg(pos, str, "-k")) { + parameters.privateKeyFile = Utils::FilePath::fromString(str); parameters.authenticationType = SshConnectionParameters::AuthenticationTypeSpecificKey; authTypeGiven = true; diff --git a/tests/manual/ssh/shell/shell.cpp b/tests/manual/ssh/shell/shell.cpp index 85f639faf0e..a588a17c908 100644 --- a/tests/manual/ssh/shell/shell.cpp +++ b/tests/manual/ssh/shell/shell.cpp @@ -42,7 +42,6 @@ Shell::Shell(const SshConnectionParameters ¶meters, QObject *parent) m_stdin(new QFile(this)) { connect(m_connection, &SshConnection::connected, this, &Shell::handleConnected); - connect(m_connection, &SshConnection::dataAvailable, this, &Shell::handleShellMessage); connect(m_connection, &SshConnection::errorOccurred, this, &Shell::handleConnectionError); } @@ -68,11 +67,6 @@ void Shell::handleConnectionError() QCoreApplication::exit(EXIT_FAILURE); } -void Shell::handleShellMessage(const QString &message) -{ - std::cout << qPrintable(message); -} - void Shell::handleConnected() { m_shell = m_connection->createRemoteShell(); From a3ca2f4c312707b2d8cbe430a2ad6ee07d74d66d Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 2 Feb 2022 14:53:00 +0100 Subject: [PATCH 07/67] Doc: Describe new search options In incremental search, you can now Select All occurrences of a search term and open Advanced search. Task-number: QTCREATORBUG-26610 Change-Id: I264f9c7ae7f73aab0ef63e5b70914ff6cdb2f02c Reviewed-by: Eike Ziller --- .../images/qtcreator-find-incremental.png | Bin 0 -> 2618 bytes doc/qtcreator/src/editors/creator-search.qdoc | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-find-incremental.png diff --git a/doc/qtcreator/images/qtcreator-find-incremental.png b/doc/qtcreator/images/qtcreator-find-incremental.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb17a1a41fb0130c1422be985421a83c189b875 GIT binary patch literal 2618 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 \uicontrol {Find/Replace} > \uicontrol {Find/Replace}. - \li Enter the text you are looking for. + \li In \uicontrol Find, enter the text you are looking for. + + \image qtcreator-find-incremental.png If the text is found, all occurrences are highlighted as you type. @@ -46,10 +48,14 @@ occurrence click \inlineimage icons/prev.png (\uicontrol {Find Previous}), or press \key {Shift+F3}. + \li To select all found occurrences in a file, select + \uicontrol {Select All}. + \endlist - You can restrict the search in the \uicontrol Find field by selecting one - or several search criteria: + You can restrict the search in the \uicontrol Find field by selecting + \inlineimage icons/qtcreator-new-search-icon.png + . Select one or several search criteria: \list @@ -114,6 +120,8 @@ \uicontrol Tools > \uicontrol Options > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Highlight search results on the scrollbar}. + To search using more advanced options, select \uicontrol Advanced. + \section1 Advanced Search To search through projects, files on a file system, files in all project From 0020ef7e302121b1506a1d9a16c7c10d2dec96c7 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 1 Feb 2022 11:08:14 +0100 Subject: [PATCH 08/67] CMakePM: Settings list UI changes The CMake parameters QTreeView has now: - alternating row colors - row selection Both key and value get the same font and foreground stylings. - bold when the key is new or the value has been changed by user - italic when the key has been inherited from kit or initial config - red when there are differences between the inherited value and the current value Change-Id: If09bb2c3e25f59938c5f56e6dd0d6817dfe442cc Reviewed-by: Reviewed-by: Alessandro Portale --- .../cmakebuildconfiguration.cpp | 3 +- .../cmakeprojectmanager/configmodel.cpp | 108 +++++++++--------- src/plugins/cmakeprojectmanager/configmodel.h | 1 + 3 files changed, 60 insertions(+), 52 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 02f596728dd..e55dbbb2faf 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -252,7 +252,8 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_configView->sortByColumn(0, Qt::AscendingOrder); auto stretcher = new HeaderViewStretcher(m_configView->header(), 0); m_configView->setSelectionMode(QAbstractItemView::ExtendedSelection); - m_configView->setSelectionBehavior(QAbstractItemView::SelectItems); + m_configView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_configView->setAlternatingRowColors(true); m_configView->setFrameShape(QFrame::NoFrame); m_configView->setItemDelegate(new ConfigModelItemDelegate(m_buildConfiguration->project()->projectDirectory(), m_configView)); diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index af33564d5da..5938b329519 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -64,6 +64,18 @@ QVariant ConfigModel::data(const QModelIndex &idx, int role) const return Utils::TreeModel<>::data(idx, role); } +bool ConfigModel::setData(const QModelIndex &idx, const QVariant &data, int role) +{ + Utils::TreeItem *item = itemForIndex(idx); + bool res = item ? item->setData(idx.column(), data, role) : false; + if (res) { + const QModelIndex keyIdx = idx.sibling(idx.row(), 0); + const QModelIndex valueIdx = idx.sibling(idx.row(), 1); + emit dataChanged(keyIdx, valueIdx); + } + return res; +} + ConfigModel::~ConfigModel() = default; void ConfigModel::appendConfiguration(const QString &key, @@ -439,59 +451,53 @@ QVariant ConfigModelTreeItem::data(int column, int role) const return dataItem->isInitial ? "1" : "0"; } - switch (column) { - case 0: - switch (role) { - case Qt::DisplayRole: - return dataItem->key.isEmpty() ? QCoreApplication::translate("CMakeProjectManager::ConfigModel", "") : dataItem->key; - case Qt::EditRole: - return dataItem->key; - case Qt::ToolTipRole: - return toolTip(); - case Qt::FontRole: { - QFont font; - font.setBold(dataItem->isUserNew); - font.setStrikeOut((!dataItem->inCMakeCache && !dataItem->isUserNew) || dataItem->isUnset); - return font; - } - default: - return QVariant(); - } - case 1: { - const QString value = currentValue(); - const auto boolValue = CMakeConfigItem::toBool(value); - const bool isTrue = boolValue.has_value() && boolValue.value(); + auto fontRole = [this]() -> QFont { + QFont font; + font.setBold((dataItem->isUserChanged || dataItem->isUserNew) && !dataItem->isUnset); + font.setStrikeOut((!dataItem->inCMakeCache && !dataItem->isUserNew) || dataItem->isUnset); + font.setItalic((dataItem->isInitial && !dataItem->kitValue.isEmpty()) + || (!dataItem->isInitial && !dataItem->initialValue.isEmpty())); + return font; + }; - switch (role) { - case Qt::CheckStateRole: - return (dataItem->type == ConfigModel::DataItem::BOOLEAN) - ? QVariant(isTrue ? Qt::Checked : Qt::Unchecked) : QVariant(); - case Qt::DisplayRole: - return value; - case Qt::EditRole: - return (dataItem->type == ConfigModel::DataItem::BOOLEAN) ? QVariant(isTrue) : QVariant(value); - case Qt::FontRole: { - QFont font; - font.setBold((dataItem->isUserChanged || dataItem->isUserNew) && !dataItem->isUnset); - font.setStrikeOut((!dataItem->inCMakeCache && !dataItem->isUserNew) || dataItem->isUnset); - return font; - } - case Qt::ForegroundRole: { - bool mismatch = false; - if (dataItem->isInitial) - mismatch = !dataItem->kitValue.isEmpty() && dataItem->kitValue != value; - else - mismatch = !dataItem->initialValue.isEmpty() && dataItem->initialValue != value; - return Utils::creatorTheme()->color(mismatch ? Utils::Theme::TextColorHighlight - : Utils::Theme::TextColorNormal); - } - case Qt::ToolTipRole: { - return toolTip(); - } - default: + auto foregroundRole = [this](const QString &value) -> QColor { + bool mismatch = false; + if (dataItem->isInitial) + mismatch = !dataItem->kitValue.isEmpty() && dataItem->kitValue != value; + else + mismatch = !dataItem->initialValue.isEmpty() && dataItem->initialValue != value; + return Utils::creatorTheme()->color(mismatch ? Utils::Theme::TextColorHighlight + : Utils::Theme::TextColorNormal); + }; + + const QString value = currentValue(); + const auto boolValue = CMakeConfigItem::toBool(value); + const bool isTrue = boolValue.has_value() && boolValue.value(); + + switch (role) { + case Qt::CheckStateRole: + if (column == 0) return QVariant(); - } - } + return (dataItem->type == ConfigModel::DataItem::BOOLEAN) + ? QVariant(isTrue ? Qt::Checked : Qt::Unchecked) + : QVariant(); + case Qt::DisplayRole: + if (column == 0) + return dataItem->key.isEmpty() + ? QCoreApplication::translate("CMakeProjectManager::ConfigModel", "") + : dataItem->key; + return value; + case Qt::EditRole: + if (column == 0) + return dataItem->key; + return (dataItem->type == ConfigModel::DataItem::BOOLEAN) ? QVariant(isTrue) + : QVariant(value); + case Qt::FontRole: + return fontRole(); + case Qt::ForegroundRole: + return foregroundRole(value); + case Qt::ToolTipRole: + return toolTip(); default: return QVariant(); } diff --git a/src/plugins/cmakeprojectmanager/configmodel.h b/src/plugins/cmakeprojectmanager/configmodel.h index b50aea536a8..da702df40db 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.h +++ b/src/plugins/cmakeprojectmanager/configmodel.h @@ -133,6 +133,7 @@ public: ~ConfigModel() override; QVariant data(const QModelIndex &idx, int role) const final; + bool setData(const QModelIndex &idx, const QVariant &data, int role) final; void appendConfiguration(const QString &key, const QString &value = QString(), From ccafc11fa648f9e88345bb2c84d46ea5b6ddeaef Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 1 Feb 2022 22:40:13 +0100 Subject: [PATCH 09/67] Utils: Remove unused theme role TextColorHighlight TextColorHighlight is a harsh "egineer red" #ff0000 in all themes except one, where it is grey. Actually, TextColorHighlight was used in one place, which now instead uses TextColorError. Change-Id: Idcd61637edaa045fc718cf35a9d34ff1d5a64dad Reviewed-by: Cristian Adam --- share/qtcreator/themes/dark.creatortheme | 1 - share/qtcreator/themes/default.creatortheme | 1 - share/qtcreator/themes/design-light.creatortheme | 1 - share/qtcreator/themes/design.creatortheme | 1 - share/qtcreator/themes/flat-dark.creatortheme | 1 - share/qtcreator/themes/flat-light.creatortheme | 1 - share/qtcreator/themes/flat.creatortheme | 1 - src/libs/utils/theme/theme.h | 1 - src/plugins/cmakeprojectmanager/configmodel.cpp | 2 +- 9 files changed, 1 insertion(+), 9 deletions(-) diff --git a/share/qtcreator/themes/dark.creatortheme b/share/qtcreator/themes/dark.creatortheme index 12c8019b0da..6976c246842 100644 --- a/share/qtcreator/themes/dark.creatortheme +++ b/share/qtcreator/themes/dark.creatortheme @@ -263,7 +263,6 @@ ProgressBarBackgroundColor=normalBackground SplitterColor=splitterColor TextColorDisabled=textDisabled TextColorError=ffff4040 -TextColorHighlight=ffff0000 TextColorHighlightBackground=7a6f1c TextColorLink=textColorLink TextColorLinkVisited=textColorLinkVisited diff --git a/share/qtcreator/themes/default.creatortheme b/share/qtcreator/themes/default.creatortheme index 6cf1402c1e6..d8e9190f38d 100644 --- a/share/qtcreator/themes/default.creatortheme +++ b/share/qtcreator/themes/default.creatortheme @@ -254,7 +254,6 @@ ProgressBarBackgroundColor=18ffffff SplitterColor=splitterColor TextColorDisabled=55000000 TextColorError=ffff0000 -TextColorHighlight=ffa0a0a4 TextColorHighlightBackground=ffef0b TextColorLink=ff0057ae TextColorLinkVisited=ff644a9b diff --git a/share/qtcreator/themes/design-light.creatortheme b/share/qtcreator/themes/design-light.creatortheme index 8a826ad1810..bb060639e8f 100644 --- a/share/qtcreator/themes/design-light.creatortheme +++ b/share/qtcreator/themes/design-light.creatortheme @@ -268,7 +268,6 @@ ProgressBarBackgroundColor=28000000 SplitterColor=splitter TextColorDisabled=textDisabled TextColorError=ffff4040 -TextColorHighlight=ffff0000 TextColorHighlightBackground=ffef0b TextColorLink=ff007af4 TextColorLinkVisited=ffa57aff diff --git a/share/qtcreator/themes/design.creatortheme b/share/qtcreator/themes/design.creatortheme index 628938b5f72..4b3af2e59ef 100644 --- a/share/qtcreator/themes/design.creatortheme +++ b/share/qtcreator/themes/design.creatortheme @@ -265,7 +265,6 @@ ProgressBarBackgroundColor=a0606060 SplitterColor=splitter TextColorDisabled=textDisabled TextColorError=ffff4040 -TextColorHighlight=ffff0000 TextColorHighlightBackground=8a7f2c TextColorLink=textColorLink TextColorLinkVisited=textColorLinkVisited diff --git a/share/qtcreator/themes/flat-dark.creatortheme b/share/qtcreator/themes/flat-dark.creatortheme index 981c4819454..7bd64b856f0 100644 --- a/share/qtcreator/themes/flat-dark.creatortheme +++ b/share/qtcreator/themes/flat-dark.creatortheme @@ -267,7 +267,6 @@ ProgressBarBackgroundColor=a0606060 SplitterColor=splitter TextColorDisabled=textDisabled TextColorError=ffff4040 -TextColorHighlight=ffff0000 TextColorHighlightBackground=7a6f1c TextColorLink=textColorLink TextColorLinkVisited=textColorLinkVisited diff --git a/share/qtcreator/themes/flat-light.creatortheme b/share/qtcreator/themes/flat-light.creatortheme index 5690e4db91a..4c90c7720f8 100644 --- a/share/qtcreator/themes/flat-light.creatortheme +++ b/share/qtcreator/themes/flat-light.creatortheme @@ -263,7 +263,6 @@ ProgressBarBackgroundColor=28000000 SplitterColor=splitter TextColorDisabled=textDisabled TextColorError=ffff4040 -TextColorHighlight=ffff0000 TextColorHighlightBackground=ffef0b TextColorLink=ff007af4 TextColorLinkVisited=ffa57aff diff --git a/share/qtcreator/themes/flat.creatortheme b/share/qtcreator/themes/flat.creatortheme index beac6c91c8d..9b45d8708bb 100644 --- a/share/qtcreator/themes/flat.creatortheme +++ b/share/qtcreator/themes/flat.creatortheme @@ -261,7 +261,6 @@ ProgressBarBackgroundColor=a0606060 SplitterColor=splitter TextColorDisabled=textDisabled TextColorError=ffff4040 -TextColorHighlight=ffff0000 TextColorHighlightBackground=ffef0b TextColorLink=ff007af4 TextColorLinkVisited=ffa57aff diff --git a/src/libs/utils/theme/theme.h b/src/libs/utils/theme/theme.h index fb41d3b1964..07f57bfa455 100644 --- a/src/libs/utils/theme/theme.h +++ b/src/libs/utils/theme/theme.h @@ -109,7 +109,6 @@ public: SplitterColor, TextColorDisabled, TextColorError, - TextColorHighlight, TextColorHighlightBackground, TextColorLink, TextColorLinkVisited, diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index 5938b329519..9a3f6c4e286 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -466,7 +466,7 @@ QVariant ConfigModelTreeItem::data(int column, int role) const mismatch = !dataItem->kitValue.isEmpty() && dataItem->kitValue != value; else mismatch = !dataItem->initialValue.isEmpty() && dataItem->initialValue != value; - return Utils::creatorTheme()->color(mismatch ? Utils::Theme::TextColorHighlight + return Utils::creatorTheme()->color(mismatch ? Utils::Theme::TextColorError : Utils::Theme::TextColorNormal); }; From bc160ebe6381be91a5b6f9386f6253036f14f7c1 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 2 Feb 2022 22:11:47 +0100 Subject: [PATCH 10/67] CMakePM: Revert selectedRows back to selectedItems As it turns out changing to selectedRows resulted in having the keys copied twice to clipboard. The change would require some code adaptation. Amends 0020ef7e302121b1506a1d9a16c7c10d2dec96c7 Change-Id: Ie1decd154f7d22825f4d4eecd0bf544ecac7aa26 Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index e55dbbb2faf..cec02706263 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -252,7 +252,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_configView->sortByColumn(0, Qt::AscendingOrder); auto stretcher = new HeaderViewStretcher(m_configView->header(), 0); m_configView->setSelectionMode(QAbstractItemView::ExtendedSelection); - m_configView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_configView->setSelectionBehavior(QAbstractItemView::SelectItems); m_configView->setAlternatingRowColors(true); m_configView->setFrameShape(QFrame::NoFrame); m_configView->setItemDelegate(new ConfigModelItemDelegate(m_buildConfiguration->project()->projectDirectory(), From 841bd52e07c07aec8efcd48d459c9cc4d2b210b9 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 1 Feb 2022 12:05:20 +0100 Subject: [PATCH 11/67] PluginView: Fix crash Without a running QC we still need to initialize the plugin manager properly. Change-Id: Ia2a83080f68de9f88d214f5afbcb6a07f31daea9 Reviewed-by: Eike Ziller --- tests/manual/pluginview/plugindialog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/manual/pluginview/plugindialog.cpp b/tests/manual/pluginview/plugindialog.cpp index 550852ed529..9a0af5d449e 100644 --- a/tests/manual/pluginview/plugindialog.cpp +++ b/tests/manual/pluginview/plugindialog.cpp @@ -129,6 +129,8 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); ExtensionSystem::PluginManager manager; + manager.setSettings(new QtcSettings); + manager.setPluginIID(QLatin1String("plugin")); setCreatorTheme(new Theme("default", &app)); QObject::connect(&app, &QCoreApplication::aboutToQuit, From b822b3f9e207cd8817adbe03baf2cbdcbb80a561 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 1 Feb 2022 12:18:21 +0100 Subject: [PATCH 12/67] Tests: Provide qbs files for some manual tests Change-Id: I6c5c839dc199379edaf4c43ae4d6a0ed6ebdf751 Reviewed-by: Reviewed-by: Christian Kandeler --- qbs/imports/QtcManualtest.qbs | 21 ++++++ tests/manual/debugger/gui/gui.qbs | 13 ++++ tests/manual/debugger/simple/simple.qbs | 13 ++++ .../debugger/simple/simple_test_app.qbs | 73 +++++++++++++++++++ .../debugger/simple/simple_test_plugin.qbs | 16 ++++ tests/manual/fakevim/fakevim.qbs | 29 ++++++++ tests/manual/manual.qbs | 9 +++ .../pluginview/plugins/plugin1/plugin1.qbs | 14 ++++ .../pluginview/plugins/plugin2/plugin2.qbs | 12 +++ .../pluginview/plugins/plugin3/plugin3.qbs | 13 ++++ tests/manual/pluginview/pluginview.qbs | 21 ++++++ tests/manual/process/process.qbs | 14 ++++ tests/manual/proparser/testreader.qbs | 61 ++++++++++++++++ tests/manual/shootout/shootout.qbs | 7 ++ tests/manual/ssh/sftpfsmodel/sftpfsmodel.qbs | 38 ++++++++++ tests/manual/ssh/shell/shell.qbs | 17 +++++ 16 files changed, 371 insertions(+) create mode 100644 qbs/imports/QtcManualtest.qbs create mode 100644 tests/manual/debugger/gui/gui.qbs create mode 100644 tests/manual/debugger/simple/simple.qbs create mode 100644 tests/manual/debugger/simple/simple_test_app.qbs create mode 100644 tests/manual/debugger/simple/simple_test_plugin.qbs create mode 100644 tests/manual/fakevim/fakevim.qbs create mode 100644 tests/manual/pluginview/plugins/plugin1/plugin1.qbs create mode 100644 tests/manual/pluginview/plugins/plugin2/plugin2.qbs create mode 100644 tests/manual/pluginview/plugins/plugin3/plugin3.qbs create mode 100644 tests/manual/pluginview/pluginview.qbs create mode 100644 tests/manual/process/process.qbs create mode 100644 tests/manual/proparser/testreader.qbs create mode 100644 tests/manual/shootout/shootout.qbs create mode 100644 tests/manual/ssh/sftpfsmodel/sftpfsmodel.qbs create mode 100644 tests/manual/ssh/shell/shell.qbs diff --git a/qbs/imports/QtcManualtest.qbs b/qbs/imports/QtcManualtest.qbs new file mode 100644 index 00000000000..cc21c8e3fa6 --- /dev/null +++ b/qbs/imports/QtcManualtest.qbs @@ -0,0 +1,21 @@ +import qbs +import qbs.FileInfo + +QtcProduct { + type: ["application"] + + Depends { name: "Qt.testlib" } + Depends { name: "copyable_resource" } + targetName: "tst_" + name.split(' ').join("") + + cpp.rpaths: [ + project.buildDirectory + '/' + qtc.ide_library_path, + project.buildDirectory + '/' + qtc.ide_plugin_path + ] + cpp.defines: { + var defines = base.filter(function(d) { return d !== "QT_RESTRICTED_CAST_FROM_ASCII"; }); + return defines; + } + + install: false +} diff --git a/tests/manual/debugger/gui/gui.qbs b/tests/manual/debugger/gui/gui.qbs new file mode 100644 index 00000000000..7a464f77c17 --- /dev/null +++ b/tests/manual/debugger/gui/gui.qbs @@ -0,0 +1,13 @@ +QtApplication { + name: "Manual debugger gui test" + Depends { name: "Qt.widgets" } + + files: [ + "mainwindow.cpp", + "mainwindow.h", + "mainwindow.ui", + "tst_gui.cpp", + ] + + install: false +} diff --git a/tests/manual/debugger/simple/simple.qbs b/tests/manual/debugger/simple/simple.qbs new file mode 100644 index 00000000000..c05ef68ac8a --- /dev/null +++ b/tests/manual/debugger/simple/simple.qbs @@ -0,0 +1,13 @@ +import qbs +import qbs.FileInfo + +Project { + name: "Manual debugger simple tests" + + condition: project.withAutotests + + references: [ + "simple_test_app.qbs", + "simple_test_plugin.qbs" + ] +} diff --git a/tests/manual/debugger/simple/simple_test_app.qbs b/tests/manual/debugger/simple/simple_test_app.qbs new file mode 100644 index 00000000000..59cf3fe3074 --- /dev/null +++ b/tests/manual/debugger/simple/simple_test_app.qbs @@ -0,0 +1,73 @@ +import qbs.File +import qbs.FileInfo + +CppApplication { + name: "Manual Test Simple Application" + targetName: "simple_test_app" + + Depends { name: "Qt.core" } + Depends { name: "Qt.core-private"; required: false; condition: Qt.core.versionMajor > 4 } + Depends { name: "Qt.core5compat"; condition: Qt.core.versionMajor > 5 } + Depends { name: "Qt.gui" } + Depends { name: "Qt.xml"; condition: Qt.core.versionMajor < 6 } + Depends { name: "Qt.widgets"; condition: Qt.core.versionMajor > 4 } + Depends { name: "Qt.network" } + Depends { name: "Qt.script"; required: false } + Depends { name: "Qt.webkit"; required: false } + Depends { name: "Qt.webkitwidgets"; required: false; condition: Qt.core.versionMajor > 4 } + + cpp.cxxLanguageVersion: "c++11" + + cpp.defines: { + var additional = ["USE_GUILIB"]; + + if (File.exists("/usr/include/boost/optional.hpp")) + additional = additional.concat(["HAS_BOOST"]); + + if (File.exists("/usr/include/eigen2/Eigen/Core") || File.exists("/usr/local/include/eigen2/Eigen/Core")) + additional = additional.concat(["HAS_EIGEN2"]); + if (File.exists("/usr/include/eigen3/Eigen/Core") || File.exists("/usr/local/include/eigen3/Eigen/Core")) + additional = additional.concat(["HAS_EIGEN3"]); + + if (Qt.core.versionMajor > 4) + additional = additional.concat(["HAS_PRIVATE"]); + + if (Qt.script.present) + additional = additional.concat(["HAS_SCRIPT"]); + + if (qbs.toolchain.contains("msvc")) + additional = additional.concat(["_CRT_SECURE_NO_WARNINGS"]); + + /* use following for semi-automated testing */ + /* additional.concat(["USE_AUTORUN=1"]); */ + + return additional; + } + + cpp.includePaths: { + var additional = []; + + if (File.exists("/usr/include/eigen2/Eigen/Core")) + additional = additional.concat(["/usr/include/eigen2"]); + if (File.exists("/usr/include/eigen3/Eigen/Core")) + additional = additional.concat(["/usr/include/eigen3"]); + if (File.exists("/usr/local/include/eigen2/Eigen/Core")) + additional.concat(["/usr/local/include/eigen2"]); + if (File.exists("/usr/local/include/eigen3/Eigen/Core")) + additional = additional.concat(["/usr/include/eigen3"]); + + return additional; + } + + files: [ + "simple_test_app.cpp" + ] + + destinationDirectory: FileInfo.joinPaths( + FileInfo.path(project.buildDirectory + '/' + + FileInfo.relativePath(project.ide_source_tree, + sourceDirectory)), + "simple") + + install: false +} diff --git a/tests/manual/debugger/simple/simple_test_plugin.qbs b/tests/manual/debugger/simple/simple_test_plugin.qbs new file mode 100644 index 00000000000..33f257c449b --- /dev/null +++ b/tests/manual/debugger/simple/simple_test_plugin.qbs @@ -0,0 +1,16 @@ +import qbs.FileInfo + +DynamicLibrary { + name: "Manual Test Simple Plugin" + targetName: "simple_test_plugin" + + Depends { name: "Qt.core" } + + files: [ "simple_test_plugin.cpp" ] + + destinationDirectory: FileInfo.joinPaths( + FileInfo.path(project.buildDirectory + '/' + + FileInfo.relativePath(project.ide_source_tree, + sourceDirectory)), + "simple") +} diff --git a/tests/manual/fakevim/fakevim.qbs b/tests/manual/fakevim/fakevim.qbs new file mode 100644 index 00000000000..77e7253830a --- /dev/null +++ b/tests/manual/fakevim/fakevim.qbs @@ -0,0 +1,29 @@ +import qbs.FileInfo + +QtcManualtest { + name: "Manual FakeVim test" + type: ["application"] + + Depends { name: "Utils" } + + property string fakeVimDir: FileInfo.joinPaths(project.ide_source_tree, "src", "plugins", "fakevim") + + cpp.defines: base.concat(["FAKEVIM_STANDALONE"]) + cpp.includePaths: fakeVimDir + + files: [ + "main.cpp" + ] + + Group { + name: "FakeVim files" + + prefix: fakeVimDir + "/" + files: [ + "fakevimactions.cpp", + "fakevimactions.h", + "fakevimhandler.cpp", + "fakevimhandler.h", + ] + } +} diff --git a/tests/manual/manual.qbs b/tests/manual/manual.qbs index d79742c5f03..5a5bddbf29d 100644 --- a/tests/manual/manual.qbs +++ b/tests/manual/manual.qbs @@ -6,6 +6,15 @@ Project { condition: project.withAutotests references: [ + "debugger/gui/gui.qbs", + "debugger/simple/simple.qbs", + "fakevim/fakevim.qbs", + "pluginview/pluginview.qbs", + "process/process.qbs", + "proparser/testreader.qbs", + "shootout/shootout.qbs", + "ssh/shell/shell.qbs", + "ssh/sftpfsmodel/sftpfsmodel.qbs", "widgets/widgets.qbs", ] } diff --git a/tests/manual/pluginview/plugins/plugin1/plugin1.qbs b/tests/manual/pluginview/plugins/plugin1/plugin1.qbs new file mode 100644 index 00000000000..631d08088d3 --- /dev/null +++ b/tests/manual/pluginview/plugins/plugin1/plugin1.qbs @@ -0,0 +1,14 @@ +QtcManualtest { + name: "Manual test plugin1" + targetName: "plugin1" + type: [ "dynamiclibrary" ] + + Depends { name: "ExtensionSystem" } + Depends { name: "Manual test plugin2"} + Depends { name: "Manual test plugin3"} + + files: [ + "plugin1.cpp", + "plugin1.h" + ] +} diff --git a/tests/manual/pluginview/plugins/plugin2/plugin2.qbs b/tests/manual/pluginview/plugins/plugin2/plugin2.qbs new file mode 100644 index 00000000000..f2cb5036f1b --- /dev/null +++ b/tests/manual/pluginview/plugins/plugin2/plugin2.qbs @@ -0,0 +1,12 @@ +QtcManualtest { + name: "Manual test plugin2" + targetName: "plugin2" + type: [ "dynamiclibrary" ] + + Depends { name: "ExtensionSystem" } + + files: [ + "plugin2.cpp", + "plugin2.h" + ] +} diff --git a/tests/manual/pluginview/plugins/plugin3/plugin3.qbs b/tests/manual/pluginview/plugins/plugin3/plugin3.qbs new file mode 100644 index 00000000000..884b850c6f9 --- /dev/null +++ b/tests/manual/pluginview/plugins/plugin3/plugin3.qbs @@ -0,0 +1,13 @@ +QtcManualtest { + name: "Manual test plugin3" + targetName: "plugin3" + type: [ "dynamiclibrary" ] + + Depends { name: "ExtensionSystem" } + Depends { name: "Manual test plugin2" } + + files: [ + "plugin3.cpp", + "plugin3.h" + ] +} diff --git a/tests/manual/pluginview/pluginview.qbs b/tests/manual/pluginview/pluginview.qbs new file mode 100644 index 00000000000..e7ea64bf5be --- /dev/null +++ b/tests/manual/pluginview/pluginview.qbs @@ -0,0 +1,21 @@ +Project { + name: "Manual plugin test" + + QtcManualtest { + name: "Manual plugin view test" + + Depends { name: "ExtensionSystem" } + Depends { name: "Utils" } + + files: [ + "plugindialog.cpp", + "plugindialog.h" + ] + } + + references: [ + "plugins/plugin1/plugin1.qbs", + "plugins/plugin2/plugin2.qbs", + "plugins/plugin3/plugin3.qbs", + ] +} diff --git a/tests/manual/process/process.qbs b/tests/manual/process/process.qbs new file mode 100644 index 00000000000..41302a2a724 --- /dev/null +++ b/tests/manual/process/process.qbs @@ -0,0 +1,14 @@ +import qbs + +QtcManualtest { + name: "Manual QtcProcess test" + condition: qbs.targetOS.contains("unix") + Depends { name: "Utils" } + targetName: "process" + + files: [ + "main.cpp", + "mainwindow.cpp", + "mainwindow.h" + ] +} diff --git a/tests/manual/proparser/testreader.qbs b/tests/manual/proparser/testreader.qbs new file mode 100644 index 00000000000..0bc7b9387f3 --- /dev/null +++ b/tests/manual/proparser/testreader.qbs @@ -0,0 +1,61 @@ +QtcManualtest { + name: "Manual ProParser test" + Depends { name: "Qt.core" } + + cpp.includePaths: base.concat(["../../../src/shared/proparser/", + "../../../src/libs/"]) + + cpp.defines: ["QMAKE_BUILTIN_PRFS", + "QT_NO_CAST_TO_ASCII", + "QT_RESTRICTED_CAST_FROM_ASCII", + "QT_USE_QSTRINGBUILDER", + "PROEVALUATOR_FULL", + "PROEVALUATOR_CUMULATIVE", + "PROEVALUATOR_INIT_PROPS"] + + Properties { + condition: qbs.targetOS.contains("windows") + cpp.dynamicLibraries: "advapi32" + } + + files: [ + "main.cpp", + ] + + Group { + name: "ProParser files" + prefix: "../../../src/shared/proparser/" + + files: [ + "ioutils.cpp", + "ioutils.h", + "profileevaluator.cpp", + "profileevaluator.h", + "proitems.cpp", + "proitems.h", + "proparser.qrc", + "qmake_global.h", + "qmakebuiltins.cpp", + "qmakeevaluator.cpp", + "qmakeevaluator.h", + "qmakeevaluator_p.h", + "qmakeglobals.cpp", + "qmakeglobals.h", + "qmakeparser.cpp", + "qmakeparser.h", + "qmakevfs.cpp", + "qmakevfs.h", + "registry.cpp", + "registry_p.h", + ] + } + + Group { + name: "Porting Helper" + prefix: "../../../src/libs/utils/" + + files: [ + "porting.h" + ] + } +} diff --git a/tests/manual/shootout/shootout.qbs b/tests/manual/shootout/shootout.qbs new file mode 100644 index 00000000000..85626c5b0d8 --- /dev/null +++ b/tests/manual/shootout/shootout.qbs @@ -0,0 +1,7 @@ +QtcManualtest { + name: "Manual debugger shootout test" + + files: [ + "tst_codesize.cpp", + ] +} diff --git a/tests/manual/ssh/sftpfsmodel/sftpfsmodel.qbs b/tests/manual/ssh/sftpfsmodel/sftpfsmodel.qbs new file mode 100644 index 00000000000..1216d806ec1 --- /dev/null +++ b/tests/manual/ssh/sftpfsmodel/sftpfsmodel.qbs @@ -0,0 +1,38 @@ +import qbs +import qbs.FileInfo + +QtcManualtest { + name: "Manual sftpfs model test" + condition: qbs.targetOS.contains("unix") + Depends { name: "Utils" } + Depends { name: "QtcSsh" } + Depends { name: "Qt.widgets" } + + cpp.includePaths: [ "../../../../src/shared/modeltest" ] + + cpp.defines: { + var defines = base; + var absLibExecPath = FileInfo.joinPaths(qbs.installRoot, qbs.installPrefix, + qtc.ide_libexec_path); + var relLibExecPath = FileInfo.relativePath(destinationDirectory, absLibExecPath); + defines.push('TEST_RELATIVE_LIBEXEC_PATH="' + relLibExecPath + '"'); + return defines; + } + + files: [ + "main.cpp", + "window.cpp", + "window.h", + "window.ui", + ] + + Group { + name: "Model test files" + prefix: "../../../../src/shared/modeltest/" + + files: [ + "modeltest.cpp", + "modeltest.h" + ] + } +} diff --git a/tests/manual/ssh/shell/shell.qbs b/tests/manual/ssh/shell/shell.qbs new file mode 100644 index 00000000000..e2308fc7d0a --- /dev/null +++ b/tests/manual/ssh/shell/shell.qbs @@ -0,0 +1,17 @@ +import qbs + +QtcManualtest { + name: "Manual ssh shell test" + condition: qbs.targetOS.contains("unix") + Depends { name: "Utils" } + Depends { name: "QtcSsh" } + Depends { name: "Qt.network" } + + files: [ + "argumentscollector.cpp", + "argumentscollector.h", + "main.cpp", + "shell.cpp", + "shell.h", + ] +} From 2be0fc2537ec06350e4ebb9346282228fcc82473 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 31 Jan 2022 18:08:39 +0100 Subject: [PATCH 13/67] ProjectExplorer: Use CommandLine instead of Runnable Lighter and sufficient for all use cases. Change-Id: Ic6749a1a9e3e6906ce71b87b237cc94a6d8a4cbf Reviewed-by: Reviewed-by: Jarek Kobus --- src/plugins/docker/dockerdevice.cpp | 8 +++----- .../projectexplorer/devicesupport/desktopdevice.cpp | 11 +++++------ .../devicesupport/deviceusedportsgatherer.cpp | 3 ++- src/plugins/projectexplorer/devicesupport/idevice.h | 3 +-- src/plugins/qnx/qnxdevice.cpp | 6 ++---- src/plugins/remotelinux/linuxdevice.cpp | 8 +++----- 6 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 383f05e9c0d..32597808140 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -148,7 +148,7 @@ void DockerDeviceProcess::interrupt() class DockerPortsGatheringMethod : public PortsGatheringMethod { - Runnable runnable(QAbstractSocket::NetworkLayerProtocol protocol) const override + CommandLine commandLine(QAbstractSocket::NetworkLayerProtocol protocol) const override { // We might encounter the situation that protocol is given IPv6 // but the consumer of the free port information decides to open @@ -161,10 +161,8 @@ class DockerPortsGatheringMethod : public PortsGatheringMethod Q_UNUSED(protocol) // /proc/net/tcp* covers /proc/net/tcp and /proc/net/tcp6 - Runnable runnable; - runnable.command.setExecutable("sed"); - runnable.command.setArguments("-e 's/.*: [[:xdigit:]]*:\\([[:xdigit:]]\\{4\\}\\).*/\\1/g' /proc/net/tcp*"); - return runnable; + return {"sed", "-e 's/.*: [[:xdigit:]]*:\\([[:xdigit:]]\\{4\\}\\).*/\\1/g' /proc/net/tcp*", + CommandLine::Raw}; } QList usedPorts(const QByteArray &output) const override diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index 33969239f76..87efde505e9 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -125,7 +125,7 @@ DeviceEnvironmentFetcher::Ptr DesktopDevice::environmentFetcher() const class DesktopPortsGatheringMethod : public PortsGatheringMethod { - Runnable runnable(QAbstractSocket::NetworkLayerProtocol protocol) const override + CommandLine commandLine(QAbstractSocket::NetworkLayerProtocol protocol) const override { // We might encounter the situation that protocol is given IPv6 // but the consumer of the free port information decides to open @@ -137,12 +137,11 @@ class DesktopPortsGatheringMethod : public PortsGatheringMethod Q_UNUSED(protocol) - Runnable runnable; if (HostOsInfo::isWindowsHost() || HostOsInfo::isMacHost()) - runnable.command = CommandLine{"netstat", {"-a", "-n"}}; - else if (HostOsInfo::isLinuxHost()) - runnable.command = CommandLine{"/bin/sh", {"-c", "cat /proc/net/tcp*"}}; - return runnable; + return {"netstat", {"-a", "-n"}}; + if (HostOsInfo::isLinuxHost()) + return {"/bin/sh", {"-c", "cat /proc/net/tcp*"}}; + return {}; } QList usedPorts(const QByteArray &output) const override diff --git a/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp b/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp index d2d3961a015..567cf5d41f5 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp @@ -86,7 +86,8 @@ void DeviceUsedPortsGatherer::start(const IDevice::ConstPtr &device) connect(d->process.data(), &DeviceProcess::readyReadStandardError, this, &DeviceUsedPortsGatherer::handleRemoteStdErr); - const Runnable runnable = d->portsGatheringMethod->runnable(protocol); + Runnable runnable; + runnable.command = d->portsGatheringMethod->commandLine(protocol); d->process->start(runnable); } diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 144daffbfda..8e395368a8c 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -63,7 +63,6 @@ class Connection; class DeviceProcess; class DeviceProcessList; class Kit; -class Runnable; class Task; namespace Internal { class IDevicePrivate; } @@ -116,7 +115,7 @@ public: using Ptr = QSharedPointer; virtual ~PortsGatheringMethod() = default; - virtual Runnable runnable(QAbstractSocket::NetworkLayerProtocol protocol) const = 0; + virtual Utils::CommandLine commandLine(QAbstractSocket::NetworkLayerProtocol protocol) const = 0; virtual QList usedPorts(const QByteArray &commandOutput) const = 0; }; diff --git a/src/plugins/qnx/qnxdevice.cpp b/src/plugins/qnx/qnxdevice.cpp index 4c88743f2ad..318761c1255 100644 --- a/src/plugins/qnx/qnxdevice.cpp +++ b/src/plugins/qnx/qnxdevice.cpp @@ -58,12 +58,10 @@ class QnxPortsGatheringMethod : public PortsGatheringMethod { // TODO: The command is probably needlessly complicated because the parsing method // used to be fixed. These two can now be matched to each other. - Runnable runnable(QAbstractSocket::NetworkLayerProtocol protocol) const override + CommandLine commandLine(QAbstractSocket::NetworkLayerProtocol protocol) const override { Q_UNUSED(protocol) - Runnable runnable; - runnable.command = {"netstat", {"-na"}}; - return runnable; + return {"netstat", {"-na"}}; } QList usedPorts(const QByteArray &output) const override diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 63f7e0ff72c..0e1962ae9a9 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -146,7 +146,7 @@ private: class LinuxPortsGatheringMethod : public PortsGatheringMethod { - Runnable runnable(QAbstractSocket::NetworkLayerProtocol protocol) const override + CommandLine commandLine(QAbstractSocket::NetworkLayerProtocol protocol) const override { // We might encounter the situation that protocol is given IPv6 // but the consumer of the free port information decides to open @@ -159,10 +159,8 @@ class LinuxPortsGatheringMethod : public PortsGatheringMethod Q_UNUSED(protocol) // /proc/net/tcp* covers /proc/net/tcp and /proc/net/tcp6 - Runnable runnable; - runnable.command.setExecutable("sed"); - runnable.command.setArguments("-e 's/.*: [[:xdigit:]]*:\\([[:xdigit:]]\\{4\\}\\).*/\\1/g' /proc/net/tcp*"); - return runnable; + return {"sed", "-e 's/.*: [[:xdigit:]]*:\\([[:xdigit:]]\\{4\\}\\).*/\\1/g' /proc/net/tcp*", + CommandLine::Raw}; } QList usedPorts(const QByteArray &output) const override From 239688180dab207bc0df8b6407be576124e5f787 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 1 Feb 2022 14:51:23 +0100 Subject: [PATCH 14/67] Fix running as root There is no need for TerminalRunner::setRunAsRoot() as debugger is already being run as root. Implement runAsRoot for non-terminal QtcProcess, too. Fixes: QTCREATORBUG-26964 Change-Id: Id5110db86b7b809a5608714464241cee73875f2b Reviewed-by: Reviewed-by: hjk --- src/libs/utils/qtcprocess.cpp | 92 ++++++++++++------- src/libs/utils/qtcprocess.h | 1 + src/libs/utils/terminalprocess.cpp | 8 -- src/libs/utils/terminalprocess_p.h | 2 - src/plugins/debugger/debuggerruncontrol.cpp | 3 - src/plugins/debugger/gdb/gdbengine.cpp | 7 +- src/plugins/debugger/terminal.cpp | 16 +--- src/plugins/debugger/terminal.h | 2 - .../projectexplorer/applicationlauncher.cpp | 8 +- 9 files changed, 62 insertions(+), 77 deletions(-) diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 04561a5af8b..7bd1891efa8 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -263,9 +263,6 @@ public: void setAbortOnMetaChars(bool abort) { m_abortOnMetaChars = abort; } bool isAbortOnMetaChars() const { return m_abortOnMetaChars; } - void setRunAsRoot(bool on) { m_runAsRoot = on; } - bool runAsRoot() const { return m_runAsRoot; } - void setBelowNormalPriority() { m_belowNormalPriority = true; } bool isBelowNormalPriority() const { return m_belowNormalPriority; } void setNativeArguments(const QString &arguments) { m_nativeArguments = arguments; } @@ -287,7 +284,6 @@ private: bool m_lowPriority = false; bool m_unixTerminalDisabled = false; bool m_abortOnMetaChars = true; - bool m_runAsRoot = false; }; class TerminalImpl : public ProcessInterface @@ -319,7 +315,6 @@ public: void customStart(const CommandLine &command, const FilePath &workingDirectory, const Environment &environment) override { - m_terminal.setRunAsRoot(runAsRoot()); m_terminal.setAbortOnMetaChars(isAbortOnMetaChars()); m_terminal.setCommand(command); m_terminal.setWorkingDirectory(workingDirectory); @@ -606,11 +601,10 @@ public: return filePath.searchInPath(); } - void defaultStart() + void defaultStart(const CommandLine &commandLine, const FilePath &workingDirectory, + const Environment &environment) { - clearForRun(); - - if (m_commandLine.executable().needsDevice()) { + if (commandLine.executable().needsDevice()) { QTC_ASSERT(s_deviceHooks.startProcessHook, return); s_deviceHooks.startProcessHook(*q); return; @@ -618,33 +612,24 @@ public: if (processLog().isDebugEnabled()) { static int n = 0; - qCDebug(processLog) << "STARTING PROCESS: " << ++n << " " << m_commandLine.toUserOutput(); + qCDebug(processLog) << "STARTING PROCESS: " << ++n << " " << commandLine.toUserOutput(); } - Environment env; - if (m_haveEnv) { - if (m_environment.size() == 0) - qWarning("QtcProcess::start: Empty environment set when running '%s'.", - qPrintable(m_commandLine.executable().toString())); - env = m_environment; - } else { - env = Environment::systemEnvironment(); - } - m_process->setProcessEnvironment(env.toProcessEnvironment()); - m_process->setWorkingDirectory(m_workingDirectory.path()); + m_process->setProcessEnvironment(environment.toProcessEnvironment()); + m_process->setWorkingDirectory(workingDirectory.path()); - QString command; + QString commandString; ProcessArgs arguments; - const bool success = ProcessArgs::prepareCommand(m_commandLine, &command, &arguments, &env, - &m_workingDirectory); + const bool success = ProcessArgs::prepareCommand(commandLine, &commandString, &arguments, + &environment, &workingDirectory); - if (m_commandLine.executable().osType() == OsTypeWindows) { + if (commandLine.executable().osType() == OsTypeWindows) { QString args; if (m_useCtrlCStub) { if (m_process->isLowPriority()) ProcessArgs::addArg(&args, "-nice"); - ProcessArgs::addArg(&args, QDir::toNativeSeparators(command)); - command = QCoreApplication::applicationDirPath() + ProcessArgs::addArg(&args, QDir::toNativeSeparators(commandString)); + commandString = QCoreApplication::applicationDirPath() + QLatin1String("/qtcreator_ctrlc_stub.exe"); } else if (m_process->isLowPriority()) { m_process->setBelowNormalPriority(); @@ -655,7 +640,7 @@ public: #endif // Note: Arguments set with setNativeArgs will be appended to the ones // passed with start() below. - start(command, QStringList(), m_writeData); + start(commandString, QStringList(), workingDirectory, m_writeData); } else { if (!success) { q->setErrorString(tr("Error in command line.")); @@ -664,13 +649,14 @@ public: emit q->errorOccurred(QProcess::UnknownError); return; } - start(command, arguments.toUnixArgs(), m_writeData); + start(commandString, arguments.toUnixArgs(), workingDirectory, m_writeData); } } - void start(const QString &program, const QStringList &arguments, const QByteArray &writeData) + void start(const QString &program, const QStringList &arguments, + const FilePath &workingDirectory, const QByteArray &writeData) { - const FilePath programFilePath = resolve(m_workingDirectory, FilePath::fromString(program)); + const FilePath programFilePath = resolve(workingDirectory, FilePath::fromString(program)); if (programFilePath.exists() && programFilePath.isExecutableFile()) { s_start.measureAndRun(&ProcessInterface::start, m_process, program, arguments, writeData); } else { @@ -680,6 +666,33 @@ public: } } + CommandLine fullCommandLine() const + { + if (!m_runAsRoot || HostOsInfo::isWindowsHost()) + return m_commandLine; + CommandLine rootCommand("sudo", {"-A"}); + rootCommand.addCommandLineAsArgs(m_commandLine); + return rootCommand; + } + + Environment fullEnvironment() const + { + Environment env; + if (m_haveEnv) { + if (m_environment.size() == 0) + qWarning("QtcProcess::start: Empty environment set when running '%s'.", + qPrintable(m_commandLine.executable().toString())); + env = m_environment; + } else { + env = Environment::systemEnvironment(); + } + +// TODO: needs SshSettings +// if (m_runAsRoot) +// RunControl::provideAskPassEntry(env); + return env; + } + QtcProcess *q; ProcessInterface *m_process; const ProcessMode m_processMode; @@ -687,6 +700,7 @@ public: FilePath m_workingDirectory; Environment m_environment; QByteArray m_writeData; + bool m_runAsRoot = false; bool m_haveEnv = false; bool m_useCtrlCStub = false; @@ -796,7 +810,7 @@ void QtcProcess::setCommand(const CommandLine &cmdLine) if (d->m_workingDirectory.needsDevice() && cmdLine.executable().needsDevice()) { QTC_CHECK(d->m_workingDirectory.host() == cmdLine.executable().host()); } - d->m_commandLine = cmdLine; + d->m_commandLine = cmdLine; } const CommandLine &QtcProcess::commandLine() const @@ -831,10 +845,13 @@ void QtcProcess::setUseCtrlCStub(bool enabled) void QtcProcess::start() { + d->clearForRun(); + const CommandLine cmd = d->fullCommandLine(); + const Environment env = d->fullEnvironment(); if (d->m_process->isCustomStart()) - d->m_process->customStart(d->m_commandLine, d->m_workingDirectory, d->m_environment); + d->m_process->customStart(cmd, d->m_workingDirectory, env); else - d->defaultStart(); + d->defaultStart(cmd, d->m_workingDirectory, env); } #ifdef Q_OS_WIN @@ -905,7 +922,12 @@ void QtcProcess::setAbortOnMetaChars(bool abort) void QtcProcess::setRunAsRoot(bool on) { - d->m_process->setRunAsRoot(on); + d->m_runAsRoot = on; +} + +bool QtcProcess::isRunAsRoot() const +{ + return d->m_runAsRoot; } void QtcProcess::setStandardInputFile(const QString &inputFile) diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index eb2bff71331..d64991f759b 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -122,6 +122,7 @@ public: void setLowPriority(); void setDisableUnixTerminal(); void setRunAsRoot(bool on); + bool isRunAsRoot() const; void setAbortOnMetaChars(bool abort); diff --git a/src/libs/utils/terminalprocess.cpp b/src/libs/utils/terminalprocess.cpp index a12107e1715..f24b6aaf952 100644 --- a/src/libs/utils/terminalprocess.cpp +++ b/src/libs/utils/terminalprocess.cpp @@ -142,7 +142,6 @@ public: QProcess::ProcessError m_error = QProcess::UnknownError; QString m_errorString; bool m_abortOnMetaChars = true; - bool m_runAsRoot = false; // Used on Unix only QtcProcess m_process; @@ -431,8 +430,6 @@ void TerminalProcess::start() + QLatin1String("/" RELATIVE_LIBEXEC_PATH "/qtcreator_process_stub"); QStringList allArgs = terminalArgs.toUnixArgs(); - if (d->m_runAsRoot) - allArgs << "sudo" << "-A"; allArgs << stubPath << modeOption(d->m_terminalMode) @@ -797,11 +794,6 @@ const Environment &TerminalProcess::environment() const return d->m_environment; } -void TerminalProcess::setRunAsRoot(bool on) -{ - d->m_runAsRoot = on; -} - QProcess::ProcessError TerminalProcess::error() const { return d->m_error; diff --git a/src/libs/utils/terminalprocess_p.h b/src/libs/utils/terminalprocess_p.h index 006b3c3d8a0..0fb2006049e 100644 --- a/src/libs/utils/terminalprocess_p.h +++ b/src/libs/utils/terminalprocess_p.h @@ -52,8 +52,6 @@ public: void setEnvironment(const Environment &env); const Environment &environment() const; - void setRunAsRoot(bool on); - QProcess::ProcessError error() const; QString errorString() const; diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 736acadaf0e..ca638e41036 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -316,7 +316,6 @@ void DebuggerRunTool::setUseTerminal(bool on) if (on && !d->terminalRunner && !useCdbConsole) { d->terminalRunner = new TerminalRunner(runControl(), [this] { return m_runParameters.inferior; }); - d->terminalRunner->setRunAsRoot(m_runParameters.runAsRoot); addStartDependency(d->terminalRunner); } if (!on && d->terminalRunner) { @@ -327,8 +326,6 @@ void DebuggerRunTool::setUseTerminal(bool on) void DebuggerRunTool::setRunAsRoot(bool on) { m_runParameters.runAsRoot = on; - if (d->terminalRunner) - d->terminalRunner->setRunAsRoot(on); } void DebuggerRunTool::setCommandsAfterConnect(const QString &commands) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 811f8d42e4e..6a644892fea 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3852,12 +3852,9 @@ void GdbEngine::setupEngine() Environment gdbEnv = rp.debugger.environment; gdbEnv.setupEnglishOutput(); - if (rp.runAsRoot) { - CommandLine wrapped("sudo", {"-A"}); - wrapped.addCommandLineAsArgs(gdbCommand); - gdbCommand = wrapped; + if (rp.runAsRoot) RunControl::provideAskPassEntry(gdbEnv); - } + m_gdbProc.setRunAsRoot(rp.runAsRoot); showMessage("STARTING " + gdbCommand.toUserOutput()); diff --git a/src/plugins/debugger/terminal.cpp b/src/plugins/debugger/terminal.cpp index 1856e7620b0..fc1d228d787 100644 --- a/src/plugins/debugger/terminal.cpp +++ b/src/plugins/debugger/terminal.cpp @@ -188,11 +188,6 @@ void TerminalRunner::interruptProcess() m_stubProc->interruptProcess(); } -void TerminalRunner::setRunAsRoot(bool on) -{ - m_runAsRoot = on; -} - void TerminalRunner::start() { QTC_ASSERT(m_stubRunnable, reportFailure({}); return); @@ -209,20 +204,11 @@ void TerminalRunner::start() connect(m_stubProc, &QtcProcess::finished, this, &TerminalRunner::reportDone); - CommandLine commandLine = stub.command; - if (m_runAsRoot) { // TODO: fix me - m_stubProc->setRunAsRoot(true); -// CommandLine wrapped("sudo", {"-A"}); -// wrapped.addCommandLineAsArgs(commandLine); -// commandLine = wrapped; - RunControl::provideAskPassEntry(stub.environment); - } - m_stubProc->setEnvironment(stub.environment); m_stubProc->setWorkingDirectory(stub.workingDirectory); // Error message for user is delivered via a signal. - m_stubProc->setCommand(commandLine); + m_stubProc->setCommand(stub.command); m_stubProc->start(); } diff --git a/src/plugins/debugger/terminal.h b/src/plugins/debugger/terminal.h index 4d3679f31ab..2227bdbce4b 100644 --- a/src/plugins/debugger/terminal.h +++ b/src/plugins/debugger/terminal.h @@ -79,7 +79,6 @@ public: void kickoffProcess(); void interruptProcess(); - void setRunAsRoot(bool on); private: void start() final; @@ -92,7 +91,6 @@ private: std::function m_stubRunnable; qint64 m_applicationPid = 0; qint64 m_applicationMainThreadId = 0; - bool m_runAsRoot = false; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/applicationlauncher.cpp b/src/plugins/projectexplorer/applicationlauncher.cpp index b3dfc5a2161..ea9dbd4a059 100644 --- a/src/plugins/projectexplorer/applicationlauncher.cpp +++ b/src/plugins/projectexplorer/applicationlauncher.cpp @@ -381,13 +381,7 @@ void ApplicationLauncherPrivate::start(const Runnable &runnable, const IDevice:: cmdLine = disclaim; } - if (m_runAsRoot) { - CommandLine wrapped("sudo", {"-A"}); - wrapped.addCommandLineAsArgs(cmdLine); - cmdLine = wrapped; - } - // TODO: QtcProcess::setRunAsRoot() doens't work as expected currently - // m_localProcess->setRunAsRoot(m_runAsRoot); + m_localProcess->setRunAsRoot(m_runAsRoot); m_localProcess->setCommand(cmdLine); m_localProcess->start(); } else { From 10fe71546c837784eda98813381ee96b181a45ce Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Mon, 31 Jan 2022 19:50:38 +0200 Subject: [PATCH 15/67] QmlDesigner: Implement renaming assets folders Fixes: QDS-6123 Change-Id: I1923f78fe2a6739f1cf32fd86c0919965190d8ca Reviewed-by: Reviewed-by: Miikka Heikkinen Reviewed-by: Samuel Ghinet Reviewed-by: Thomas Hartmann --- .../itemLibraryQmlSources/Assets.qml | 105 ++++++++++++++++++ .../itemlibrary/itemlibraryassetsmodel.cpp | 12 ++ .../itemlibrary/itemlibraryassetsmodel.h | 1 + 3 files changed, 118 insertions(+) diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml index ab403d203b2..115309c1277 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml @@ -90,6 +90,103 @@ Item { selectedAssetsChanged() } + RegExpValidator { + id: folderNameValidator + regExp: /^(\w[^*/> Date: Thu, 3 Feb 2022 12:03:04 +0100 Subject: [PATCH 16/67] qbs build: Update minimum qbs version Change-Id: If734b0051b98c8d3963afa54ad66b9b990db2a88 Reviewed-by: Christian Stenger --- qtcreator.qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtcreator.qbs b/qtcreator.qbs index 64bc0b741dc..f586a12237b 100644 --- a/qtcreator.qbs +++ b/qtcreator.qbs @@ -4,7 +4,7 @@ import qbs.FileInfo Project { name: "Qt Creator" - minimumQbsVersion: "1.8.0" + minimumQbsVersion: "1.19.0" property string minimumMacosVersion: "10.12" property bool withAutotests: qbs.buildVariant === "debug" property path ide_source_tree: path From 5af00873cf69ce2ba1a750c80e1a20b24e306680 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 31 Jan 2022 07:42:30 +0100 Subject: [PATCH 17/67] FakeVim: Support backslashes in substitute command patterns Change-Id: Ibfcea7fdc550082e4975e1fc4d2fba6563dbfd02 Done-by: Jochen Baier Fixes: QTCREATORBUG-26955 Reviewed-by: Christian Stenger --- src/plugins/fakevim/fakevim_test.cpp | 44 ++++++++++++++++++++++++++ src/plugins/fakevim/fakevimhandler.cpp | 11 ++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/plugins/fakevim/fakevim_test.cpp b/src/plugins/fakevim/fakevim_test.cpp index f8b37bd8149..07ab92c1911 100644 --- a/src/plugins/fakevim/fakevim_test.cpp +++ b/src/plugins/fakevim/fakevim_test.cpp @@ -3029,6 +3029,50 @@ void FakeVimPlugin::test_vim_substitute() COMMAND("undo | s/\\(b...E\\)/\\U\\1/g", "aBC DEfGh"); COMMAND("undo | s/\\(C..E\\)/\\l\\1/g", "abc dEfGh"); COMMAND("undo | s/\\(b...E\\)/\\L\\1/g", "abc defGh"); + + // replace 1 backslash with 1 forward slash (separator: /) + data.setText(R"(abc\def)"); + COMMAND(R"(s/\\/\/)", X "abc/def"); + + // replace 1 backslash with X normal on line (separator: /) + data.setText(R"(abc\def\ghi)"); + COMMAND(R"(s/\\/X/g)", X "abcXdefXghi"); + + // replace 1 backslash with 1 forward slash on line (separator: /) + data.setText(R"(abc\def\ghi)"); + COMMAND(R"(s/\\/\//g)", X "abc/def/ghi"); + + // replace 1 backslash with 1 forward slash + data.setText(R"(abc\def)"); + COMMAND(R"(s#\\#/)", X "abc/def"); + + // replace 1 backslash with 1 forward slash on line + data.setText(R"(abc\def\ghi)"); + COMMAND(R"(s#\\#/#g)", X "abc/def/ghi"); + + // replace 2 backslash with 2 forward slash + data.setText(R"(abc\\def)"); + COMMAND(R"(s#\\\\#//)", X "abc//def"); + + // replace 2 backslash with 2 forward slash on line + data.setText(R"(abc\\def\\ghi)"); + COMMAND(R"(s#\\\\#//#g)", X "abc//def//ghi"); + + // replace 1 backslash with 1 forward slash last char + data.setText(R"(abc\)"); + COMMAND(R"(s#\\#/)", X "abc/"); + + // replace 1 backslash with 1 forward slash first char + data.setText(R"(\abc)"); + COMMAND(R"(s#\\#/)", X "/abc"); + + // replace 1 # with 2 # on line + data.setText(R"(abc#def#ghi)"); + COMMAND(R"(s#\##\#\##g)", X "abc##def##ghi"); + + // replace 2 # with 4 # on line + data.setText(R"(abc##def##ghi)"); + COMMAND(R"(s#\#\##\#\#\#\##g)", X "abc####def####ghi"); } void FakeVimPlugin::test_vim_ex_commandbuffer_paste() diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index aa8b74a00e3..79e8153c01b 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -816,9 +816,18 @@ static bool substituteText(QString *text, static int findUnescaped(QChar c, const QString &line, int from) { + bool singleBackSlashBefore = false; for (int i = from; i < line.size(); ++i) { - if (line.at(i) == c && (i == 0 || line.at(i - 1) != '\\')) + const QChar currentChar = line.at(i); + if (currentChar == '\\') { + singleBackSlashBefore = !singleBackSlashBefore; + continue; + } + + if (currentChar == c && !singleBackSlashBefore) return i; + + singleBackSlashBefore = false; } return -1; } From ca5d52dcd661ed9c691d44f455006d246d8cb595 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 3 Feb 2022 12:26:27 +0100 Subject: [PATCH 18/67] QmlDesigner: Update studioplugin.metainfo These are the last updates from qtquickdesigner/6.0. Change-Id: I81302a42f4dfb3da6379eea0e5d2a3f09a2c9e7e Reviewed-by: Thomas Hartmann --- .../studioplugin/studioplugin.metainfo | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/studioplugin/studioplugin.metainfo b/src/plugins/qmldesigner/studioplugin/studioplugin.metainfo index d80aa0cd3fe..5468269e83c 100644 --- a/src/plugins/qmldesigner/studioplugin/studioplugin.metainfo +++ b/src/plugins/qmldesigner/studioplugin/studioplugin.metainfo @@ -1,4 +1,18 @@ MetaInfo { + Type { + name: "QtStudio3D.Studio3D" + icon: ":/qtquickplugin/images/item-icon16.png" + + ItemLibraryEntry { + name: "Studio 3D" + category: "Qt 3D Studio" + libraryIcon: ":/qtquickplugin/images/item-icon.png" + version: "2.0" + requiredImport: "QtStudio3D" + + QmlSource { source: ":/studioplugin/data/qt3ditem.qml" } + } + } Imports { blacklistImports: [ @@ -15,7 +29,18 @@ MetaInfo { "QtTest", "QtWebEngine", "QtWebSockets", - "QtQuick.Dialogs." + "QtQuick.Dialogs.", + "QtSensors", + "QtRemoveObjects", + "QtQuick.tooling", + "QtWebView", + "QtCore", + "QtQuick.Controls.Basic", + "QtQuick.Controls.Fusion", + "QtQuick.Controls.Imagine", + "QtQuick.Controls.Universal", + "QtQuick.Controls.Material", + "QtQuick.Controls.NativeStyle" ] showTagsForImports: [ From 748cc38c26f9829112cb67cf4a8384bce37e23b0 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 26 Jan 2022 10:19:53 +0100 Subject: [PATCH 19/67] BareMetal: Allow stlink_version to stay unspecified Fixes: QTCREATORBUG-26928 Change-Id: Ia6dedb62c1e41472e176d8d247c7967fe5a430ee Reviewed-by: Christian Stenger --- .../debugservers/gdb/stlinkutilgdbserverprovider.cpp | 6 +++++- .../debugservers/gdb/stlinkutilgdbserverprovider.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/baremetal/debugservers/gdb/stlinkutilgdbserverprovider.cpp b/src/plugins/baremetal/debugservers/gdb/stlinkutilgdbserverprovider.cpp index c853df8b265..7cd8d3f7002 100644 --- a/src/plugins/baremetal/debugservers/gdb/stlinkutilgdbserverprovider.cpp +++ b/src/plugins/baremetal/debugservers/gdb/stlinkutilgdbserverprovider.cpp @@ -96,7 +96,8 @@ CommandLine StLinkUtilGdbServerProvider::command() const if (!m_resetBoard) cmd.addArg("--no-reset"); - cmd.addArg("--stlink_version=" + QString::number(m_transport)); + if (m_transport != UnspecifiedTransport) + cmd.addArg("--stlink_version=" + QString::number(m_transport)); cmd.addArg("--listen_port=" + QString::number(channel().port())); cmd.addArg("--verbose=" + QString::number(m_verboseLevel)); @@ -301,6 +302,9 @@ void StLinkUtilGdbServerProviderConfigWidget::populateTransportLayers() m_transportLayerComboBox->insertItem( m_transportLayerComboBox->count(), tr("ST-LINK/V2"), StLinkUtilGdbServerProvider::RawUsb); + m_transportLayerComboBox->insertItem( + m_transportLayerComboBox->count(), tr("Keep unspecified"), + StLinkUtilGdbServerProvider::UnspecifiedTransport); } void StLinkUtilGdbServerProviderConfigWidget::setFromProvider() diff --git a/src/plugins/baremetal/debugservers/gdb/stlinkutilgdbserverprovider.h b/src/plugins/baremetal/debugservers/gdb/stlinkutilgdbserverprovider.h index a5d8a6f82a7..6cef0ea9c2c 100644 --- a/src/plugins/baremetal/debugservers/gdb/stlinkutilgdbserverprovider.h +++ b/src/plugins/baremetal/debugservers/gdb/stlinkutilgdbserverprovider.h @@ -42,7 +42,7 @@ namespace Internal { class StLinkUtilGdbServerProvider final : public GdbServerProvider { public: - enum TransportLayer { ScsiOverUsb = 1, RawUsb = 2 }; + enum TransportLayer { ScsiOverUsb = 1, RawUsb = 2, UnspecifiedTransport }; QVariantMap toMap() const final; bool fromMap(const QVariantMap &data) final; From eb2fc79a3fc92a04563b6876adf9e484f83ae994 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 2 Feb 2022 10:53:36 +0100 Subject: [PATCH 20/67] Docker: Fix handling of ui applications on macOS Using graphical applications inside a docker image needs the same handling on macOS as on Windows. Change-Id: Ic9fb6a8330164f7acdaab4146a70e7e308192f4e Reviewed-by: hjk --- src/plugins/docker/dockerdevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 32597808140..eda67d973f9 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -823,8 +823,8 @@ static QString getLocalIPv4Address() void DockerDevicePrivate::startContainer() { - const QString display = HostOsInfo::isWindowsHost() ? QString(getLocalIPv4Address() + ":0.0") - : QString(":0"); + const QString display = HostOsInfo::isLinuxHost() ? QString(":0") + : QString(getLocalIPv4Address() + ":0.0"); CommandLine dockerCreate{"docker", {"create", "-i", "--rm", From 9a5cb5896edc796f4950d2f6c7a126378dcaf1bb Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 3 Feb 2022 10:58:01 +0100 Subject: [PATCH 21/67] Tests: Fix cmake file Change-Id: Iebe454bee2037c0d150d5ea537419044745abc10 Reviewed-by: Reviewed-by: Cristian Adam Reviewed-by: Samuel Ghinet --- tests/auto/qml/qmldesigner/wizard/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt b/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt index de84a6e931e..0606be1a550 100644 --- a/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt +++ b/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt @@ -9,11 +9,11 @@ add_qtc_test(tst_qml_wizard DEFINES QT_CREATOR QMLDESIGNER_TEST - INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins" - "${StudioWelcomeDir}" IDE_PLUGIN_PATH="${PROJECT_BINARY_DIR}/${IDE_PLUGIN_PATH}" IDE_DATA_PATH="${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" + INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins" + "${StudioWelcomeDir}" SOURCES wizardfactories-test.cpp stylemodel-test.cpp From f5b946abbe1fd0ba4af13d2f76c32434d56d109b Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 3 Feb 2022 13:20:15 +0100 Subject: [PATCH 22/67] LinuxDevice: Implement runProcess() Change-Id: I5300d36119ffb9fdd82a2ba7e02f76edc0fe2eda Reviewed-by: hjk --- src/libs/ssh/sshconnection.h | 1 + src/libs/utils/qtcprocess.cpp | 23 ++++++++--- src/libs/utils/qtcprocess.h | 2 + src/plugins/remotelinux/linuxdevice.cpp | 55 ++++++++++++++++++++++--- src/plugins/remotelinux/linuxdevice.h | 2 +- 5 files changed, 71 insertions(+), 12 deletions(-) diff --git a/src/libs/ssh/sshconnection.h b/src/libs/ssh/sshconnection.h index 3447f3c195c..381bd463c91 100644 --- a/src/libs/ssh/sshconnection.h +++ b/src/libs/ssh/sshconnection.h @@ -61,6 +61,7 @@ public: QString host() const { return url.host(); } quint16 port() const { return url.port(); } QString userName() const { return url.userName(); } + QString userAtHost() const { return userName().isEmpty() ? host() : userName() + '@' + host(); } void setHost(const QString &host) { url.setHost(host); } void setPort(int port) { url.setPort(port); } void setUserName(const QString &name) { url.setUserName(name); } diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 7bd1891efa8..9e56fe0f1be 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -563,6 +563,7 @@ public: , q(parent) , m_process(newProcessInstance(parent, processImpl, processMode, terminalMode)) , m_processMode(processMode) + , m_terminalMode(terminalMode) { connect(m_process, &ProcessInterface::started, q, &QtcProcess::started); @@ -604,12 +605,6 @@ public: void defaultStart(const CommandLine &commandLine, const FilePath &workingDirectory, const Environment &environment) { - if (commandLine.executable().needsDevice()) { - QTC_ASSERT(s_deviceHooks.startProcessHook, return); - s_deviceHooks.startProcessHook(*q); - return; - } - if (processLog().isDebugEnabled()) { static int n = 0; qCDebug(processLog) << "STARTING PROCESS: " << ++n << " " << commandLine.toUserOutput(); @@ -696,6 +691,7 @@ public: QtcProcess *q; ProcessInterface *m_process; const ProcessMode m_processMode; + const QtcProcess::TerminalMode m_terminalMode; CommandLine m_commandLine; FilePath m_workingDirectory; Environment m_environment; @@ -788,6 +784,11 @@ ProcessMode QtcProcess::processMode() const return d->m_processMode; } +QtcProcess::TerminalMode QtcProcess::terminalMode() const +{ + return d->m_terminalMode; +} + void QtcProcess::setEnvironment(const Environment &env) { d->m_environment = env; @@ -805,6 +806,11 @@ const Environment &QtcProcess::environment() const return d->m_environment; } +bool QtcProcess::hasEnvironment() const +{ + return d->m_haveEnv; +} + void QtcProcess::setCommand(const CommandLine &cmdLine) { if (d->m_workingDirectory.needsDevice() && cmdLine.executable().needsDevice()) { @@ -845,6 +851,11 @@ void QtcProcess::setUseCtrlCStub(bool enabled) void QtcProcess::start() { + if (d->m_commandLine.executable().needsDevice()) { + QTC_ASSERT(s_deviceHooks.startProcessHook, return); + s_deviceHooks.startProcessHook(*this); + return; + } d->clearForRun(); const CommandLine cmd = d->fullCommandLine(); const Environment env = d->fullEnvironment(); diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index d64991f759b..fa844d18955 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -90,6 +90,7 @@ public: ~QtcProcess(); ProcessMode processMode() const; + TerminalMode terminalMode() const; enum Result { // Finished successfully. Unless an ExitCodeInterpreter is set @@ -111,6 +112,7 @@ public: void setEnvironment(const Environment &env); void unsetEnvironment(); const Environment &environment() const; + bool hasEnvironment() const; void setCommand(const CommandLine &cmdLine); const CommandLine &commandLine() const; diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 0e1962ae9a9..2fa40838e50 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -286,6 +286,9 @@ public: explicit LinuxDevicePrivate(LinuxDevice *parent); ~LinuxDevicePrivate(); + CommandLine fullLocalCommandLine(const CommandLine &remoteCommand, + QtcProcess::TerminalMode terminalMode, + bool hasDisplay) const; bool setupShell(); bool runInShell(const CommandLine &cmd, const QByteArray &data = {}); QString outputForRunInShell(const QString &cmd); @@ -414,9 +417,7 @@ DeviceEnvironmentFetcher::Ptr LinuxDevice::environmentFetcher() const QString LinuxDevice::userAtHost() const { - if (sshParameters().userName().isEmpty()) - return sshParameters().host(); - return sshParameters().userName() + '@' + sshParameters().host(); + return sshParameters().userAtHost(); } FilePath LinuxDevice::mapToGlobalPath(const FilePath &pathOnDevice) const @@ -438,9 +439,53 @@ bool LinuxDevice::handlesFile(const FilePath &filePath) const return filePath.scheme() == "ssh" && filePath.host() == userAtHost(); } -void LinuxDevice::runProcess(QtcProcess &) const +CommandLine LinuxDevicePrivate::fullLocalCommandLine(const CommandLine &remoteCommand, + QtcProcess::TerminalMode terminalMode, + bool hasDisplay) const { - QTC_CHECK(false); // FIXME: Implement + Utils::CommandLine cmd{SshSettings::sshFilePath()}; + const SshConnectionParameters parameters = q->sshParameters(); + + if (hasDisplay) + cmd.addArg("-X"); + if (terminalMode != QtcProcess::TerminalOff) + cmd.addArg("-tt"); + + cmd.addArg("-q"); + // TODO: currently this drops shared connection (-o ControlPath=socketFilePath) + cmd.addArgs(parameters.connectionOptions(SshSettings::sshFilePath()) << parameters.host()); + + CommandLine remoteWithLocalPath = remoteCommand; + FilePath executable = remoteWithLocalPath.executable(); + executable.setScheme({}); + executable.setHost({}); + remoteWithLocalPath.setExecutable(executable); + cmd.addArg(remoteWithLocalPath.toUserOutput()); + return cmd; +} + +void LinuxDevice::runProcess(QtcProcess &process) const +{ + QTC_ASSERT(!process.isRunning(), return); + + Utils::Environment env = process.hasEnvironment() ? process.environment() + : Utils::Environment::systemEnvironment(); + const bool hasDisplay = env.hasKey("DISPLAY") && (env.value("DISPLAY") != QString(":0")); + if (SshSettings::askpassFilePath().exists()) { + env.set("SSH_ASKPASS", SshSettings::askpassFilePath().toUserOutput()); + + // OpenSSH only uses the askpass program if DISPLAY is set, regardless of the platform. + if (!env.hasKey("DISPLAY")) + env.set("DISPLAY", ":0"); + } + process.setEnvironment(env); + + // Otherwise, ssh will ignore SSH_ASKPASS and read from /dev/tty directly. + process.setDisableUnixTerminal(); + + process.setCommand(d->fullLocalCommandLine(process.commandLine(), process.terminalMode(), + hasDisplay)); + process.start(); } LinuxDevicePrivate::LinuxDevicePrivate(LinuxDevice *parent) diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index d914e8b223b..d2906b230c3 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -82,7 +82,7 @@ public: QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override; - void runProcess(Utils::QtcProcess &) const override; + void runProcess(Utils::QtcProcess &process) const override; qint64 fileSize(const Utils::FilePath &filePath) const override; qint64 bytesAvailable(const Utils::FilePath &filePath) const override; QFileDevice::Permissions permissions(const Utils::FilePath &filePath) const override; From 1e34d6ee2218a74c1f7be8f903bcd0a0101755b7 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 3 Feb 2022 12:08:36 +0100 Subject: [PATCH 23/67] Debugger: Fix autodetection Fixes: QTCREATORBUG-26978 Change-Id: I32585251d47729f7fde9ee6e707d9e9cfed4c1a7 Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggeritemmanager.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index 93b91c55591..8b3a31d2d5b 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -32,6 +32,7 @@ #include +#include #include #include @@ -957,8 +958,10 @@ void DebuggerItemManagerPrivate::restoreDebuggers() readDebuggers(userSettingsFileName(), false); // Auto detect current. + IDevice::ConstPtr desktop = DeviceManager::defaultDesktopDevice(); + QTC_ASSERT(desktop, return); + autoDetectGdbOrLldbDebuggers(desktop->systemEnvironment().path(), {}); autoDetectCdbDebuggers(); - autoDetectGdbOrLldbDebuggers({}, {}); autoDetectUvscDebuggers(); } From 9bc9fb5a0d9a235b06356fc03d50dab0719d905a Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 2 Feb 2022 16:32:24 +0100 Subject: [PATCH 24/67] Fix avdmanageroutputparser test - There is no PLUGIN_DEPENDS for tests, and it wouldn't work anyhow because of duplicated symbols. It was interpreted as a dependency and the test disabled because no such target exists. - Move the platformNameToApiLevel(...) function to avdmanageroutputparser.h to break the dependency to a lot of Android support code. Amends 78da7e2922274c429bb677abf63157b8ae679d03 Change-Id: I6933684a76e5291d415c72388caa3df2bee7cbfb Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/android/androidconfigurations.cpp | 22 ---------------- src/plugins/android/androidconfigurations.h | 1 - src/plugins/android/androidsdkmanager.cpp | 5 ++-- .../android/avdmanageroutputparser.cpp | 25 ++++++++++++++++++- src/plugins/android/avdmanageroutputparser.h | 1 + tests/auto/android/CMakeLists.txt | 3 --- 6 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 34383bad3a4..9de48da0ee5 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -473,28 +473,6 @@ QString AndroidConfig::apiLevelNameFor(const SdkPlatform *platform) QString("android-%1").arg(platform->apiLevel()) : ""; } -int AndroidConfig::platformNameToApiLevel(const QString &platformName) -{ - int apiLevel = -1; - static const QRegularExpression re("(android-)(?[0-9A-Z]{1,})", - QRegularExpression::CaseInsensitiveOption); - QRegularExpressionMatch match = re.match(platformName); - if (match.hasMatch()) { - QString apiLevelStr = match.captured("apiLevel"); - bool isUInt; - apiLevel = apiLevelStr.toUInt(&isUInt); - if (!isUInt) { - if (apiLevelStr == 'Q') - apiLevel = 29; - else if (apiLevelStr == 'R') - apiLevel = 30; - else if (apiLevelStr == 'S') - apiLevel = 31; - } - } - return apiLevel; -} - bool AndroidConfig::isCmdlineSdkToolsInstalled() const { QString toolPath("cmdline-tools/latest/bin/sdkmanager"); diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 701e10190e9..7492ae0f2a3 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -91,7 +91,6 @@ public: static QStringList apiLevelNamesFor(const SdkPlatformList &platforms); static QString apiLevelNameFor(const SdkPlatform *platform); - static int platformNameToApiLevel(const QString &platformName); Utils::FilePath sdkLocation() const; void setSdkLocation(const Utils::FilePath &sdkLocation); diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index 16c75a8e622..15636de0789 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -28,6 +28,7 @@ #include "androidconfigurations.h" #include "androidconstants.h" #include "androidmanager.h" +#include "avdmanageroutputparser.h" #include #include @@ -691,7 +692,7 @@ AndroidSdkPackage *SdkManagerOutputParser::parsePlatform(const QStringList &data SdkPlatform *platform = nullptr; GenericPackageData packageData; if (parseAbstractData(packageData, data, 2, "Platform")) { - const int apiLevel = AndroidConfig::platformNameToApiLevel(packageData.headerParts.at(1)); + const int apiLevel = platformNameToApiLevel(packageData.headerParts.at(1)); if (apiLevel == -1) { qCDebug(sdkManagerLog) << "Platform: Cannot parse api level:"<< data; return nullptr; @@ -711,7 +712,7 @@ QPair SdkManagerOutputParser::parseSystemImage(const QString QPair result(nullptr, -1); GenericPackageData packageData; if (parseAbstractData(packageData, data, 4, "System-image")) { - const int apiLevel = AndroidConfig::platformNameToApiLevel(packageData.headerParts.at(1)); + const int apiLevel = platformNameToApiLevel(packageData.headerParts.at(1)); if (apiLevel == -1) { qCDebug(sdkManagerLog) << "System-image: Cannot parse api level:"<< data; return result; diff --git a/src/plugins/android/avdmanageroutputparser.cpp b/src/plugins/android/avdmanageroutputparser.cpp index 2cb8a9ac0b1..8140719aee2 100644 --- a/src/plugins/android/avdmanageroutputparser.cpp +++ b/src/plugins/android/avdmanageroutputparser.cpp @@ -34,6 +34,7 @@ #include #include +#include #include namespace { @@ -98,7 +99,7 @@ static Utils::optional parseAvd(const QStringList &deviceInfo QSettings avdInfo(avdInfoFile.toString(), QSettings::IniFormat); value = avdInfo.value(avdInfoTargetKey).toString(); if (!value.isEmpty()) - avd.sdk = AndroidConfig::platformNameToApiLevel(value); + avd.sdk = platformNameToApiLevel(value); else qCDebug(avdOutputParserLog) << "Avd Parsing: Cannot find sdk API:" << avdInfoFile.toString(); @@ -164,5 +165,27 @@ AndroidDeviceInfoList parseAvdList(const QString &output, QStringList *avdErrorP return avdList; } +int platformNameToApiLevel(const QString &platformName) +{ + int apiLevel = -1; + static const QRegularExpression re("(android-)(?[0-9A-Z]{1,})", + QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match = re.match(platformName); + if (match.hasMatch()) { + QString apiLevelStr = match.captured("apiLevel"); + bool isUInt; + apiLevel = apiLevelStr.toUInt(&isUInt); + if (!isUInt) { + if (apiLevelStr == 'Q') + apiLevel = 29; + else if (apiLevelStr == 'R') + apiLevel = 30; + else if (apiLevelStr == 'S') + apiLevel = 31; + } + } + return apiLevel; +} + } // namespace Internal } // namespace Android diff --git a/src/plugins/android/avdmanageroutputparser.h b/src/plugins/android/avdmanageroutputparser.h index e5a50beae34..3788e6079d8 100644 --- a/src/plugins/android/avdmanageroutputparser.h +++ b/src/plugins/android/avdmanageroutputparser.h @@ -31,6 +31,7 @@ namespace Internal { const char avdManufacturerError[] = "no longer exists as a device"; AndroidDeviceInfoList parseAvdList(const QString &output, QStringList *avdErrorPaths); +int platformNameToApiLevel(const QString &platformName); } // namespace Internal } // namespace Android diff --git a/tests/auto/android/CMakeLists.txt b/tests/auto/android/CMakeLists.txt index bf132fe599a..8f328fe98e2 100644 --- a/tests/auto/android/CMakeLists.txt +++ b/tests/auto/android/CMakeLists.txt @@ -1,6 +1,5 @@ add_qtc_test(tst_avdmanageroutputparser DEPENDS Utils - PLUGIN_DEPENDS Android INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins" "${PROJECT_SOURCE_DIR}/src/plugins/android" @@ -10,8 +9,6 @@ add_qtc_test(tst_avdmanageroutputparser "${PROJECT_SOURCE_DIR}/src/plugins/android/avdmanageroutputparser.h" "${PROJECT_SOURCE_DIR}/src/plugins/android/androiddeviceinfo.cpp" "${PROJECT_SOURCE_DIR}/src/plugins/android/androiddeviceinfo.h" - "${PROJECT_SOURCE_DIR}/src/plugins/android/androidmanager.cpp" - "${PROJECT_SOURCE_DIR}/src/plugins/android/androidmanager.h" ) qtc_add_resources(tst_avdmanageroutputparser tst_avdmanageroutputparser_rcc From b243a8d728491b8375e94407756640c9d9f931b4 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 3 Feb 2022 12:18:09 +0100 Subject: [PATCH 25/67] Wizards: Modernize qbs project templates Change-Id: Ib6f6315f9730425d4fd3b566f66ed26aa1718695 Reviewed-by: Reviewed-by: Christian Stenger --- .../templates/wizards/projects/consoleapp/file.qbs | 9 +-------- .../qtcreator/templates/wizards/projects/plainc/file.qbs | 7 +------ .../templates/wizards/projects/plaincpp/file.qbs | 7 +------ .../wizards/projects/qtquickapplication/app.qbs | 7 ++----- 4 files changed, 5 insertions(+), 25 deletions(-) diff --git a/share/qtcreator/templates/wizards/projects/consoleapp/file.qbs b/share/qtcreator/templates/wizards/projects/consoleapp/file.qbs index 35ce99c77ac..6406f0cb013 100644 --- a/share/qtcreator/templates/wizards/projects/consoleapp/file.qbs +++ b/share/qtcreator/templates/wizards/projects/consoleapp/file.qbs @@ -1,8 +1,6 @@ import qbs QtApplication { - cpp.cxxLanguageVersion: "c++11" - cpp.defines: [ // You can make your code fail to compile if it uses deprecated APIs. // In order to do so, uncomment the following line. @@ -10,6 +8,7 @@ QtApplication { ] consoleApplication: true + install: true files: [ "%{CppFileName}", @if %{HasTranslation} @@ -24,10 +23,4 @@ QtApplication { fileTags: "qt.core.resource_data" } @endif - - Group { // Properties for the produced executable - fileTagsFilter: "application" - qbs.install: true - qbs.installDir: "bin" - } } diff --git a/share/qtcreator/templates/wizards/projects/plainc/file.qbs b/share/qtcreator/templates/wizards/projects/plainc/file.qbs index a2bd3fb9439..0e9eb0288db 100644 --- a/share/qtcreator/templates/wizards/projects/plainc/file.qbs +++ b/share/qtcreator/templates/wizards/projects/plainc/file.qbs @@ -2,11 +2,6 @@ import qbs CppApplication { consoleApplication: true + install: true files: "%{CFileName}" - - Group { // Properties for the produced executable - fileTagsFilter: "application" - qbs.install: true - qbs.installDir: "bin" - } } diff --git a/share/qtcreator/templates/wizards/projects/plaincpp/file.qbs b/share/qtcreator/templates/wizards/projects/plaincpp/file.qbs index b07ba3fd424..6ce956cc6ee 100644 --- a/share/qtcreator/templates/wizards/projects/plaincpp/file.qbs +++ b/share/qtcreator/templates/wizards/projects/plaincpp/file.qbs @@ -2,11 +2,6 @@ import qbs CppApplication { consoleApplication: true + install: true files: "%{CppFileName}" - - Group { // Properties for the produced executable - fileTagsFilter: "application" - qbs.install: true - qbs.installDir: "bin" - } } diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs b/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs index 31320cad6a9..14025b37b82 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs @@ -7,6 +7,8 @@ CppApplication { Depends { name: "Qt.quick" } @endif + install: true + // Additional import path used to resolve QML modules in Qt Creator's code model property pathList qmlImportPaths: [] @if !%{IsQt6} @@ -43,9 +45,4 @@ CppApplication { fileTags: ["qt.qml.qml", "qt.core.resource_data"] } @endif - Group { // Properties for the produced executable - fileTagsFilter: "application" - qbs.install: true - qbs.installDir: "bin" - } } From 633a9a04e242da9e13169749962d676376d813f6 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Sat, 29 Jan 2022 15:03:54 +0100 Subject: [PATCH 26/67] CMakePM: Add "Kit Configuration" button in Settings page This "Kit Configuration" button opens a dialog with the kit's CMake settings. This way a user can change all CMake related settings in the project's Settings page. Change-Id: I76b6e69ea7a9b96823f6583aef007cf413410407 Reviewed-by: Alessandro Portale --- .../cmakebuildconfiguration.cpp | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index cec02706263..bd605f7c2d9 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -135,6 +135,7 @@ private: void batchEditConfiguration(); void reconfigureWithInitialParameters(CMakeBuildConfiguration *bc); void updateInitialCMakeArguments(); + void kitCMakeConfiguration(); CMakeBuildConfiguration *m_buildConfiguration; QTreeView *m_configView; @@ -155,6 +156,7 @@ private: InfoLabel *m_warningMessageLabel; QPushButton *m_batchEditButton = nullptr; + QPushButton *m_kitConfiguration = nullptr; }; static QModelIndex mapToSource(const QAbstractItemView *view, const QModelIndex &idx) @@ -220,6 +222,11 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) updateConfigurationStateIndex(index); }); + m_kitConfiguration = new QPushButton(tr("Kit Configuration")); + m_kitConfiguration->setToolTip(tr("Edit the current kit's CMake configuration.")); + m_kitConfiguration->setFixedWidth(m_kitConfiguration->sizeHint().width()); + connect(m_kitConfiguration, &QPushButton::clicked, this, [this]() { kitCMakeConfiguration(); }); + m_filterEdit = new FancyLineEdit; m_filterEdit->setPlaceholderText(tr("Filter")); m_filterEdit->setFiltering(true); @@ -333,7 +340,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) }, m_warningMessageLabel, Space(10), - m_configurationStates, + Row{m_kitConfiguration, m_configurationStates}, Group { cmakeConfiguration, Row { @@ -603,6 +610,38 @@ void CMakeBuildSettingsWidget::updateInitialCMakeArguments() m_buildConfiguration->aspect()->value())); } +void CMakeBuildSettingsWidget::kitCMakeConfiguration() +{ + m_buildConfiguration->kit()->blockNotification(); + + auto dialog = new QDialog(this); + dialog->setWindowTitle(tr("Kit CMake Configuration")); + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->setModal(true); + connect(dialog, &QDialog::finished, this, [=]{ + m_buildConfiguration->kit()->unblockNotification(); + }); + + CMakeKitAspect kitAspect; + CMakeGeneratorKitAspect generatorAspect; + CMakeConfigurationKitAspect configurationKitAspect; + + auto layout = new QGridLayout(dialog); + + kitAspect.createConfigWidget(m_buildConfiguration->kit()) + ->addToLayoutWithLabel(layout->parentWidget()); + generatorAspect.createConfigWidget(m_buildConfiguration->kit()) + ->addToLayoutWithLabel(layout->parentWidget()); + configurationKitAspect.createConfigWidget(m_buildConfiguration->kit()) + ->addToLayoutWithLabel(layout->parentWidget()); + + layout->setColumnStretch(1, 1); + + dialog->setMinimumWidth(400); + dialog->resize(800, 1); + dialog->show(); +} + void CMakeBuildSettingsWidget::setError(const QString &message) { m_buildConfiguration->buildDirectoryAspect()->setProblem(message); From 8d12fd07e2e07ae3bd360556fd8397d117139ef2 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 3 Feb 2022 11:24:56 +0100 Subject: [PATCH 27/67] CMakePM: Rename "Additional CMake parameters" to "... options" CMake documentation calls them Options, and we should use the same terminology. See https://cmake.org/cmake/help/v3.22/manual/cmake.1.html?#options Change-Id: Ibb8ed9dd5a830290770a7fa89e7e5e1ce2d8c74a Reviewed-by: Leena Miettinen Reviewed-by: Alessandro Portale --- .../cmakebuildconfiguration.cpp | 46 +++++++++---------- .../cmakebuildconfiguration.h | 4 +- .../cmakeprojectmanager/cmakeconfigitem.cpp | 4 +- .../cmakeprojectmanager/cmakeconfigitem.h | 2 +- .../cmakekitinformation.cpp | 10 ++-- .../cmakeprojectmanager/fileapireader.cpp | 4 +- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index bd605f7c2d9..dac88ee842b 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -345,7 +345,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) cmakeConfiguration, Row { bc->aspect(), - bc->aspect() + bc->aspect() }, m_reconfigureButton, } @@ -533,9 +533,9 @@ void CMakeBuildSettingsWidget::batchEditConfiguration() return expander->expand(s); }); const bool isInitial = isInitialConfiguration(); - QStringList unknownArguments; + QStringList unknownOptions; CMakeConfig config = CMakeConfig::fromArguments(isInitial ? lines : expandedLines, - unknownArguments); + unknownOptions); for (auto &ci : config) ci.isInitial = isInitial; @@ -698,10 +698,10 @@ void CMakeBuildSettingsWidget::updateButtonState() m_resetButton->setEnabled(m_configModel->hasChanges(isInitial) && !isParsing); m_buildConfiguration->aspect()->setVisible(isInitialConfiguration()); - m_buildConfiguration->aspect()->setVisible(!isInitialConfiguration()); + m_buildConfiguration->aspect()->setVisible(!isInitialConfiguration()); m_buildConfiguration->aspect()->setEnabled(!isParsing); - m_buildConfiguration->aspect()->setEnabled(!isParsing); + m_buildConfiguration->aspect()->setEnabled(!isParsing); // Update label and text boldness of the reconfigure button QFont reconfigureButtonFont = m_reconfigureButton->font(); @@ -1092,7 +1092,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id) auto initialCMakeArgumentsAspect = addAspect(); initialCMakeArgumentsAspect->setMacroExpanderProvider([this] { return macroExpander(); }); - auto additionalCMakeArgumentsAspect = addAspect(); + auto additionalCMakeArgumentsAspect = addAspect(); additionalCMakeArgumentsAspect->setMacroExpanderProvider([this] { return macroExpander(); }); macroExpander()->registerVariable(DEVELOPMENT_TEAM_FLAG, @@ -1392,7 +1392,7 @@ void CMakeBuildConfiguration::setInitialCMakeArguments(const QStringList &args) QStringList CMakeBuildConfiguration::additionalCMakeArguments() const { - return ProcessArgs::splitArgs(aspect()->value()); + return ProcessArgs::splitArgs(aspect()->value()); } void CMakeBuildConfiguration::setAdditionalCMakeArguments(const QStringList &args) @@ -1404,7 +1404,7 @@ void CMakeBuildConfiguration::setAdditionalCMakeArguments(const QStringList &arg [](const QString &s) { return !s.isEmpty(); }); - aspect()->setValue( + aspect()->setValue( ProcessArgs::joinArgs(nonEmptyAdditionalArguments)); } @@ -1413,13 +1413,13 @@ void CMakeBuildConfiguration::filterConfigArgumentsFromAdditionalCMakeArguments( // On iOS the %{Ios:DevelopmentTeam:Flag} evalues to something like // -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM:STRING=MAGICSTRING // which is already part of the CMake variables and should not be also - // in the addtional CMake parameters + // in the addtional CMake options const QStringList arguments = ProcessArgs::splitArgs( - aspect()->value()); - QStringList unknownArguments; - const CMakeConfig config = CMakeConfig::fromArguments(arguments, unknownArguments); + aspect()->value()); + QStringList unknownOptions; + const CMakeConfig config = CMakeConfig::fromArguments(arguments, unknownOptions); - aspect()->setValue(ProcessArgs::joinArgs(unknownArguments)); + aspect()->setValue(ProcessArgs::joinArgs(unknownOptions)); } void CMakeBuildConfiguration::setError(const QString &message) @@ -1675,7 +1675,7 @@ const QStringList InitialCMakeArgumentsAspect::allValues() const return initialCMakeArguments; } -void InitialCMakeArgumentsAspect::setAllValues(const QString &values, QStringList &additionalArguments) +void InitialCMakeArgumentsAspect::setAllValues(const QString &values, QStringList &additionalOptions) { QStringList arguments = values.split('\n', Qt::SkipEmptyParts); for (QString &arg: arguments) { @@ -1686,13 +1686,13 @@ void InitialCMakeArgumentsAspect::setAllValues(const QString &values, QStringLis if (arg.startsWith("-T")) arg.replace("-T", "-DCMAKE_GENERATOR_TOOLSET:STRING="); } - m_cmakeConfiguration = CMakeConfig::fromArguments(arguments, additionalArguments); + m_cmakeConfiguration = CMakeConfig::fromArguments(arguments, additionalOptions); for (CMakeConfigItem &ci : m_cmakeConfiguration) ci.isInitial = true; - // Display the unknown arguments in "Additional CMake parameters" - const QString additionalArgumentsValue = ProcessArgs::joinArgs(additionalArguments); - BaseAspect::setValueQuietly(additionalArgumentsValue); + // Display the unknown arguments in "Additional CMake Options" + const QString additionalOptionsValue = ProcessArgs::joinArgs(additionalOptions); + BaseAspect::setValueQuietly(additionalOptionsValue); } void InitialCMakeArgumentsAspect::setCMakeConfiguration(const CMakeConfig &config) @@ -1717,18 +1717,18 @@ void InitialCMakeArgumentsAspect::toMap(QVariantMap &map) const InitialCMakeArgumentsAspect::InitialCMakeArgumentsAspect() { setSettingsKey("CMake.Initial.Parameters"); - setLabelText(tr("Additional CMake parameters:")); + setLabelText(tr("Additional CMake options:")); setDisplayStyle(LineEditDisplay); } // ---------------------------------------------------------------------- -// - AdditionalCMakeParametersAspect: +// - AdditionalCMakeOptionsAspect: // ---------------------------------------------------------------------- -AdditionalCMakeArgumentsAspect::AdditionalCMakeArgumentsAspect() +AdditionalCMakeOptionsAspect::AdditionalCMakeOptionsAspect() { - setSettingsKey("CMake.Additional.Parameters"); - setLabelText(tr("Additional CMake parameters:")); + setSettingsKey("CMake.Additional.Options"); + setLabelText(tr("Additional CMake options:")); setDisplayStyle(LineEditDisplay); } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 4f6b909592e..2ac05c33d3a 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -164,12 +164,12 @@ public: void toMap(QVariantMap &map) const final; }; -class AdditionalCMakeArgumentsAspect final : public Utils::StringAspect +class AdditionalCMakeOptionsAspect final : public Utils::StringAspect { Q_OBJECT public: - AdditionalCMakeArgumentsAspect(); + AdditionalCMakeOptionsAspect(); }; class SourceDirectoryAspect final : public Utils::StringAspect diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp index a2eabe627ab..9347d84eccb 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp @@ -310,7 +310,7 @@ static CMakeConfigItem unsetItemFromString(const QString &input) return item; } -CMakeConfig CMakeConfig::fromArguments(const QStringList &list, QStringList &unknownArguments) +CMakeConfig CMakeConfig::fromArguments(const QStringList &list, QStringList &unknownOptions) { CMakeConfig result; bool inSet = false; @@ -343,7 +343,7 @@ CMakeConfig CMakeConfig::fromArguments(const QStringList &list, QStringList &unk continue; } - unknownArguments.append(i); + unknownOptions.append(i); } return result; } diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.h b/src/plugins/cmakeprojectmanager/cmakeconfigitem.h index 056a31ac986..10a8d8b7174 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.h +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.h @@ -91,7 +91,7 @@ public: const QList &toList() const { return *this; } - static CMakeConfig fromArguments(const QStringList &list, QStringList &unknownArguments); + static CMakeConfig fromArguments(const QStringList &list, QStringList &unknownOptions); static CMakeConfig fromFile(const Utils::FilePath &input, QString *errorMessage); QByteArray valueOf(const QByteArray &key) const; diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index 14783dcf4e9..dcf50d5df10 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -942,7 +942,7 @@ private: m_additionalEditor = new QLineEdit; auto additionalLabel = new QLabel(m_dialog); - additionalLabel->setText(tr("Additional CMake parameters: ")); + additionalLabel->setText(tr("Additional CMake options: ")); auto additionalChooser = new VariableChooser(m_dialog); additionalChooser->addSupportedWidget(m_additionalEditor); @@ -984,16 +984,16 @@ private: QTC_ASSERT(m_editor, return); KitGuard guard(kit()); - QStringList unknownArguments; + QStringList unknownOptions; const CMakeConfig config = CMakeConfig::fromArguments(m_editor->toPlainText().split('\n'), - unknownArguments); + unknownOptions); CMakeConfigurationKitAspect::setConfiguration(kit(), config); QString additionalConfiguration = m_additionalEditor->text(); - if (!unknownArguments.isEmpty()) { + if (!unknownOptions.isEmpty()) { if (!additionalConfiguration.isEmpty()) additionalConfiguration += " "; - additionalConfiguration += ProcessArgs::joinArgs(unknownArguments); + additionalConfiguration += ProcessArgs::joinArgs(unknownOptions); } CMakeConfigurationKitAspect::setAdditionalConfiguration(kit(), additionalConfiguration); } diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index 3233dbe1922..aa50147aab4 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -325,10 +325,10 @@ void FileApiReader::writeConfigurationIntoBuildDirectory(const QStringList &conf QTC_CHECK(buildDir.ensureWritableDir()); QByteArray contents; - QStringList unknownArguments; + QStringList unknownOptions; contents.append("# This file is managed by Qt Creator, do not edit!\n\n"); contents.append( - transform(CMakeConfig::fromArguments(configurationArguments, unknownArguments).toList(), + transform(CMakeConfig::fromArguments(configurationArguments, unknownOptions).toList(), [](const CMakeConfigItem &item) { return item.toCMakeSetLine(nullptr); }) .join('\n') .toUtf8()); From ac41f83232fb26a5accdce0353aebf78d0642359 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 2 Feb 2022 12:01:05 +0100 Subject: [PATCH 28/67] Core: Split branded logo from other resources We only need the special resource generation for the logo. Keep the other resources shared with Qbs, so issues like QTCREATORBUG-26969 don't happen. Change-Id: Ibe418dffba19e342d0aa5ff30c34409cee184fc0 Reviewed-by: Reviewed-by: Alessandro Portale Reviewed-by: Qt CI Bot --- src/plugins/coreplugin/CMakeLists.txt | 5 +++-- src/plugins/coreplugin/core.qrc | 2 -- src/plugins/coreplugin/core.qrc.cmakein | 12 ------------ src/plugins/coreplugin/core_logo.qrc | 6 ++++++ src/plugins/coreplugin/core_logo.qrc.cmakein | 6 ++++++ src/plugins/coreplugin/coreplugin.qbs | 1 + 6 files changed, 16 insertions(+), 16 deletions(-) delete mode 100644 src/plugins/coreplugin/core.qrc.cmakein create mode 100644 src/plugins/coreplugin/core_logo.qrc create mode 100644 src/plugins/coreplugin/core_logo.qrc.cmakein diff --git a/src/plugins/coreplugin/CMakeLists.txt b/src/plugins/coreplugin/CMakeLists.txt index a68132707f5..d73fafd14e5 100644 --- a/src/plugins/coreplugin/CMakeLists.txt +++ b/src/plugins/coreplugin/CMakeLists.txt @@ -1,7 +1,7 @@ if (NOT IS_ABSOLUTE ${IDE_LOGO_PATH}) set(IDE_LOGO_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${IDE_LOGO_PATH}") endif() -configure_file(core.qrc.cmakein core_cmake.qrc) +configure_file(core_logo.qrc.cmakein core_logo_cmake.qrc) add_qtc_plugin(Core DEPENDS Qt5::PrintSupport Qt5::Qml Qt5::Sql Qt5::Gui Qt5::GuiPrivate @@ -15,7 +15,8 @@ add_qtc_plugin(Core actionmanager/commandsfile.cpp actionmanager/commandsfile.h basefilewizard.cpp basefilewizard.h basefilewizardfactory.cpp basefilewizardfactory.h - ${CMAKE_CURRENT_BINARY_DIR}/core_cmake.qrc + ${CMAKE_CURRENT_BINARY_DIR}/core_logo_cmake.qrc + core.qrc core_global.h coreconstants.h coreicons.cpp coreicons.h diff --git a/src/plugins/coreplugin/core.qrc b/src/plugins/coreplugin/core.qrc index 4389dba12b3..ff855e3f4b8 100644 --- a/src/plugins/coreplugin/core.qrc +++ b/src/plugins/coreplugin/core.qrc @@ -1,7 +1,5 @@ - images/logo/128/QtProject-qtcreator.png - images/logo/256/QtProject-qtcreator.png images/settingscategory_core.png images/settingscategory_core@2x.png images/settingscategory_design.png diff --git a/src/plugins/coreplugin/core.qrc.cmakein b/src/plugins/coreplugin/core.qrc.cmakein deleted file mode 100644 index dae636db832..00000000000 --- a/src/plugins/coreplugin/core.qrc.cmakein +++ /dev/null @@ -1,12 +0,0 @@ - - - ${IDE_LOGO_PATH}/images/logo/128/QtProject-qtcreator.png - ${IDE_LOGO_PATH}/images/logo/256/QtProject-qtcreator.png - ${CMAKE_CURRENT_SOURCE_DIR}/images/settingscategory_core.png - ${CMAKE_CURRENT_SOURCE_DIR}/images/settingscategory_core@2x.png - ${CMAKE_CURRENT_SOURCE_DIR}/images/settingscategory_design.png - ${CMAKE_CURRENT_SOURCE_DIR}/images/settingscategory_design@2x.png - ${CMAKE_CURRENT_SOURCE_DIR}/images/qtlogo.png - ${CMAKE_CURRENT_SOURCE_DIR}/images/qtlogo@2x.png - - diff --git a/src/plugins/coreplugin/core_logo.qrc b/src/plugins/coreplugin/core_logo.qrc new file mode 100644 index 00000000000..4e9d9c87576 --- /dev/null +++ b/src/plugins/coreplugin/core_logo.qrc @@ -0,0 +1,6 @@ + + + images/logo/128/QtProject-qtcreator.png + images/logo/256/QtProject-qtcreator.png + + diff --git a/src/plugins/coreplugin/core_logo.qrc.cmakein b/src/plugins/coreplugin/core_logo.qrc.cmakein new file mode 100644 index 00000000000..f595e107031 --- /dev/null +++ b/src/plugins/coreplugin/core_logo.qrc.cmakein @@ -0,0 +1,6 @@ + + + ${IDE_LOGO_PATH}/images/logo/128/QtProject-qtcreator.png + ${IDE_LOGO_PATH}/images/logo/256/QtProject-qtcreator.png + + diff --git a/src/plugins/coreplugin/coreplugin.qbs b/src/plugins/coreplugin/coreplugin.qbs index 3af3e92f9d1..eee6b60018e 100644 --- a/src/plugins/coreplugin/coreplugin.qbs +++ b/src/plugins/coreplugin/coreplugin.qbs @@ -37,6 +37,7 @@ Project { "basefilewizardfactory.h", "core.qrc", "core_global.h", + "core_logo.qrc", "coreconstants.h", "coreicons.cpp", "coreicons.h", From 9007c12a5e88a21ca407108ad263162487f4835b Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 4 Feb 2022 06:12:34 +0100 Subject: [PATCH 29/67] TextEditor: Initialize TextStyles::mainStyle Avoids some valgrind warnings. Change-Id: Ib93af9655149e79829b6477469554368f54e0d08 Reviewed-by: David Schulz --- src/plugins/texteditor/textstyles.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/texteditor/textstyles.h b/src/plugins/texteditor/textstyles.h index bf6d04eb995..41bfbff5474 100644 --- a/src/plugins/texteditor/textstyles.h +++ b/src/plugins/texteditor/textstyles.h @@ -29,11 +29,13 @@ #include +#include + namespace TextEditor { using MixinTextStyles = Utils::SizedArray; struct TextStyles { - TextStyle mainStyle; + TextStyle mainStyle = C_TEXT; MixinTextStyles mixinStyles; static TextStyles mixinStyle(TextStyle main, const QList &mixins) From 7c128638eaf14e5c2b653afff63b2bec7102d501 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 3 Feb 2022 17:56:28 +0100 Subject: [PATCH 30/67] Docker/Linux: Fix outputForRunInShell ... in case there is embedded NUL in the output. Change-Id: Ic899bcf8d01cceed4ea6e16d4991fb80b7ac70ca Reviewed-by: Christian Stenger Reviewed-by: Jarek Kobus Reviewed-by: --- src/libs/utils/mimetypes/mimedatabase.cpp | 2 ++ src/plugins/docker/dockerdevice.cpp | 2 +- src/plugins/remotelinux/linuxdevice.cpp | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp index 656797c44fd..35e0257e5e7 100644 --- a/src/libs/utils/mimetypes/mimedatabase.cpp +++ b/src/libs/utils/mimetypes/mimedatabase.cpp @@ -738,6 +738,8 @@ MimeType Utils::mimeTypeForFile(const QFileInfo &fileInfo, MimeMatchMode mode) MimeType Utils::mimeTypeForFile(const FilePath &filePath, MimeMatchMode mode) { MimeDatabase mdb; + if (filePath.needsDevice()) + return mdb.mimeTypeForUrl(filePath.toUrl()); return mdb.mimeTypeForFile(filePath.toString(), MimeDatabase::MatchMode(mode)); } diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index eda67d973f9..cf355fed182 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1733,7 +1733,7 @@ QString DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) const LOG("Run command in shell:" << cmd.toUserOutput() << "output size:" << output.size()); if (QTC_GUARD(output.endsWith(markerWithNewLine))) output.chop(markerWithNewLine.size()); - return QString::fromUtf8(output); + return QString::fromUtf8(output, output.size()); } // Factory diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 2fa40838e50..abf8667018f 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -270,7 +270,7 @@ public: if (pos >= 0) output = output.left(pos); DEBUG("CHOPPED2 " << output); - return QString::fromUtf8(output); + return QString::fromUtf8(output, output.size()); } bool isRunning() const { return m_shell; } From 9ff851a204ecfcb8a6aa380679ad8d142f8c334c Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 3 Feb 2022 18:09:06 +0100 Subject: [PATCH 31/67] Docker/RL: Be more lazy with output decoding Conversion to QString is often not needed. Change-Id: I22fe0ec89419f784d2fe02245094fbe6da719f75 Reviewed-by: Jarek Kobus Reviewed-by: --- src/plugins/docker/dockerdevice.cpp | 36 ++++++++++++----------- src/plugins/remotelinux/linuxdevice.cpp | 38 +++++++++++++------------ 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index cf355fed182..2f81b4d4f67 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -263,7 +263,7 @@ public: bool runInContainer(const CommandLine &cmd) const; bool runInShell(const CommandLine &cmd) const; - QString outputForRunInShell(const CommandLine &cmd) const; + QByteArray outputForRunInShell(const CommandLine &cmd) const; void updateContainerAccess(); void updateFileSystemAccess(); @@ -1318,7 +1318,7 @@ QDateTime DockerDevice::lastModified(const FilePath &filePath) const return res; } - const QString output = d->outputForRunInShell({"stat", {"-c", "%Y", filePath.path()}}); + const QByteArray output = d->outputForRunInShell({"stat", {"-c", "%Y", filePath.path()}}); qint64 secs = output.toLongLong(); const QDateTime dt = QDateTime::fromSecsSinceEpoch(secs, Qt::UTC); return dt; @@ -1337,8 +1337,9 @@ FilePath DockerDevice::symLinkTarget(const FilePath &filePath) const return mapToGlobalPath(target); } - const QString output = d->outputForRunInShell({"readlink", {"-n", "-e", filePath.path()}}); - return output.isEmpty() ? FilePath() : filePath.withNewPath(output); + const QByteArray output = d->outputForRunInShell({"readlink", {"-n", "-e", filePath.path()}}); + const QString out = QString::fromUtf8(output.data(), output.size()); + return out.isEmpty() ? FilePath() : filePath.withNewPath(out); } qint64 DockerDevice::fileSize(const FilePath &filePath) const @@ -1351,7 +1352,7 @@ qint64 DockerDevice::fileSize(const FilePath &filePath) const return localAccess.fileSize(); } - const QString output = d->outputForRunInShell({"stat", {"-c", "%s", filePath.path()}}); + const QByteArray output = d->outputForRunInShell({"stat", {"-c", "%s", filePath.path()}}); return output.toLongLong(); } @@ -1365,7 +1366,7 @@ QFileDevice::Permissions DockerDevice::permissions(const FilePath &filePath) con return localAccess.permissions(); } - const QString output = d->outputForRunInShell({"stat", {"-c", "%a", filePath.path()}}); + const QByteArray output = d->outputForRunInShell({"stat", {"-c", "%a", filePath.path()}}); const uint bits = output.toUInt(nullptr, 8); QFileDevice::Permissions perm = {}; #define BIT(n, p) if (bits & (1<outputForRunInShell({"find", arguments}); - if (!output.isEmpty() && !output.startsWith(filePath.path())) { // missing find, unknown option - LOG("Setting 'do not use find'" << output.left(output.indexOf('\n'))); + const QByteArray output = d->outputForRunInShell({"find", arguments}); + const QString out = QString::fromUtf8(output.data(), output.size()); + if (!output.isEmpty() && !out.startsWith(filePath.path())) { // missing find, unknown option + LOG("Setting 'do not use find'" << out.left(out.indexOf('\n'))); d->m_useFind = false; return; } - const QStringList entries = output.split("\n", Qt::SkipEmptyParts); + const QStringList entries = out.split("\n", Qt::SkipEmptyParts); for (const QString &entry : entries) { if (entry.startsWith("find: ")) continue; @@ -1531,8 +1533,9 @@ void DockerDevice::iterateDirectory(const FilePath &filePath, } // if we do not have find - use ls as fallback - const QString output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}); - const QStringList entries = output.split('\n', Qt::SkipEmptyParts); + const QByteArray output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}); + const QString out = QString::fromUtf8(output.data(), output.size()); + const QStringList entries = out.split('\n', Qt::SkipEmptyParts); filterEntriesHelper(filePath, callBack, entries, filter); } @@ -1652,8 +1655,9 @@ void DockerDevice::aboutToBeRemoved() const void DockerDevicePrivate::fetchSystemEnviroment() { if (m_shell) { - const QString remoteOutput = outputForRunInShell({"env", {}}); - m_cachedEnviroment = Environment(remoteOutput.split('\n', Qt::SkipEmptyParts), q->osType()); + const QByteArray output = outputForRunInShell({"env", {}}); + const QString out = QString::fromUtf8(output.data(), output.size()); + m_cachedEnviroment = Environment(out.split('\n', Qt::SkipEmptyParts), q->osType()); return; } @@ -1715,7 +1719,7 @@ static QByteArray randomHex() return QString::number(val, 16).toUtf8(); } -QString DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) const +QByteArray DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) const { if (!DockerPlugin::isDaemonRunning().value_or(false)) return {}; @@ -1733,7 +1737,7 @@ QString DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) const LOG("Run command in shell:" << cmd.toUserOutput() << "output size:" << output.size()); if (QTC_GUARD(output.endsWith(markerWithNewLine))) output.chop(markerWithNewLine.size()); - return QString::fromUtf8(output, output.size()); + return output; } // Factory diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index abf8667018f..79028450c7e 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -246,7 +246,7 @@ public: return ok && result == 0; } - QString outputForRunInShell(const QString &cmd) + QByteArray outputForRunInShell(const QString &cmd) { QTC_ASSERT(m_shell, return {}); @@ -270,7 +270,7 @@ public: if (pos >= 0) output = output.left(pos); DEBUG("CHOPPED2 " << output); - return QString::fromUtf8(output, output.size()); + return output; } bool isRunning() const { return m_shell; } @@ -291,8 +291,8 @@ public: bool hasDisplay) const; bool setupShell(); bool runInShell(const CommandLine &cmd, const QByteArray &data = {}); - QString outputForRunInShell(const QString &cmd); - QString outputForRunInShell(const CommandLine &cmd); + QByteArray outputForRunInShell(const QString &cmd); + QByteArray outputForRunInShell(const CommandLine &cmd); LinuxDevice *q = nullptr; QThread m_shellThread; @@ -528,7 +528,7 @@ bool LinuxDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &da return ret; } -QString LinuxDevicePrivate::outputForRunInShell(const QString &cmd) +QByteArray LinuxDevicePrivate::outputForRunInShell(const QString &cmd) { QMutexLocker locker(&m_shellMutex); DEBUG(cmd); @@ -537,14 +537,14 @@ QString LinuxDevicePrivate::outputForRunInShell(const QString &cmd) QTC_ASSERT(ok, return {}); } - QString ret; + QByteArray ret; QMetaObject::invokeMethod(m_handler, [this, &cmd] { return m_handler->outputForRunInShell(cmd); }, Qt::BlockingQueuedConnection, &ret); return ret; } -QString LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd) +QByteArray LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd) { return outputForRunInShell(cmd.toUserOutput()); } @@ -658,7 +658,7 @@ bool LinuxDevice::renameFile(const FilePath &filePath, const FilePath &target) c QDateTime LinuxDevice::lastModified(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QString output = d->outputForRunInShell({"stat", {"-c", "%Y", filePath.path()}}); + const QByteArray output = d->outputForRunInShell({"stat", {"-c", "%Y", filePath.path()}}); const qint64 secs = output.toLongLong(); const QDateTime dt = QDateTime::fromSecsSinceEpoch(secs, Qt::UTC); return dt; @@ -667,14 +667,15 @@ QDateTime LinuxDevice::lastModified(const FilePath &filePath) const FilePath LinuxDevice::symLinkTarget(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QString output = d->outputForRunInShell({"readlink", {"-n", "-e", filePath.path()}}); - return output.isEmpty() ? FilePath() : filePath.withNewPath(output); + const QByteArray output = d->outputForRunInShell({"readlink", {"-n", "-e", filePath.path()}}); + const QString out = QString::fromUtf8(output.data(), output.size()); + return output.isEmpty() ? FilePath() : filePath.withNewPath(out); } qint64 LinuxDevice::fileSize(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return -1); - const QString output = d->outputForRunInShell({"stat", {"-c", "%s", filePath.path()}}); + const QByteArray output = d->outputForRunInShell({"stat", {"-c", "%s", filePath.path()}}); return output.toLongLong(); } @@ -684,7 +685,7 @@ qint64 LinuxDevice::bytesAvailable(const FilePath &filePath) const CommandLine cmd("df", {"-k"}); cmd.addArg(filePath.path()); cmd.addArgs("|tail -n 1 |sed 's/ */ /g'|cut -d ' ' -f 4", CommandLine::Raw); - const QString output = d->outputForRunInShell(cmd.toUserOutput()); + const QByteArray output = d->outputForRunInShell(cmd.toUserOutput()); bool ok = false; const qint64 size = output.toLongLong(&ok); if (ok) @@ -695,7 +696,7 @@ qint64 LinuxDevice::bytesAvailable(const FilePath &filePath) const QFileDevice::Permissions LinuxDevice::permissions(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QString output = d->outputForRunInShell({"stat", {"-c", "%a", filePath.path()}}); + const QByteArray output = d->outputForRunInShell({"stat", {"-c", "%a", filePath.path()}}); const uint bits = output.toUInt(nullptr, 8); QFileDevice::Permissions perm = {}; #define BIT(n, p) if (bits & (1<outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}); - const QStringList entries = output.split('\n', Qt::SkipEmptyParts); + const QByteArray output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}); + const QString out = QString::fromUtf8(output.data(), output.size()); + const QStringList entries = out.split('\n', Qt::SkipEmptyParts); filterEntriesHelper(filePath, callBack, entries, filter); } @@ -774,9 +776,9 @@ QByteArray LinuxDevice::fileContents(const FilePath &filePath, qint64 limit, qin } CommandLine cmd(FilePath::fromString("dd"), args, CommandLine::Raw); - const QString output = d->outputForRunInShell(cmd); - DEBUG(output << output.toLatin1() << QByteArray::fromHex(output.toLatin1())); - return output.toLatin1(); + const QByteArray output = d->outputForRunInShell(cmd); + DEBUG(output << output << QByteArray::fromHex(output)); + return output; } bool LinuxDevice::writeFileContents(const FilePath &filePath, const QByteArray &data) const From 0d812cd59b0c26f92f062920650ad59756c0f600 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 3 Feb 2022 12:29:52 +0100 Subject: [PATCH 32/67] QmlDesigner: Update wizard templates These are the latest changes from qtquickdesigner/6.0 branch. Since 7.0 these templates are now part of qt-creator. Change-Id: I533c005734518eaf7dcd94f3f94167d973af68a5 Reviewed-by: Thomas Hartmann --- .../projects/application-3d/wizard.json | 6 ++-- .../projects/application-mcu/wizard.json | 4 +-- .../projects/application/wizard.json | 6 ++-- .../projects/common/app.qmlproject.tpl | 35 ++++++++++++++++--- .../projects/desktop-launcher/wizard.json | 6 ++-- .../projects/mobile-scroll/wizard.json | 4 +-- .../projects/mobile-stack/wizard.json | 4 +-- .../projects/mobile-swipe/wizard.json | 4 +-- 8 files changed, 48 insertions(+), 21 deletions(-) diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/wizard.json index cc5d8246293..dbbf7331195 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/wizard.json @@ -65,7 +65,7 @@ })" }, { - "trKey": "2560 x 1440 (QHD)", + "trKey": "2560 x 1440", "value": "({ 'ScreenWidth': '2560', @@ -73,7 +73,7 @@ })" }, { - "trKey": "1920 x 1080 (FullHD)", + "trKey": "1920 x 1080", "value": "({ 'ScreenWidth': '1920', @@ -97,7 +97,7 @@ })" }, { - "trKey": "1280 x 720 (HD)", + "trKey": "1280 x 720", "value": "({ 'ScreenWidth': '1280', diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/wizard.json index 1ba63959053..a6288939eac 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/wizard.json @@ -70,7 +70,7 @@ })" }, { - "trKey": "720 x 1280 (HD)", + "trKey": "720 x 1280", "value": "({ 'ScreenWidth': '720', @@ -78,7 +78,7 @@ })" }, { - "trKey": "1280 x 720 (HD)", + "trKey": "1280 x 720", "value": "({ 'ScreenWidth': '1280', diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/application/wizard.json index 54d495f9fbc..db5c4128bed 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application/wizard.json @@ -67,7 +67,7 @@ })" }, { - "trKey": "2560 x 1440 (QHD)", + "trKey": "2560 x 1440", "value": "({ 'ScreenWidth': '2560', @@ -75,7 +75,7 @@ })" }, { - "trKey": "1920 x 1080 (FullHD)", + "trKey": "1920 x 1080", "value": "({ 'ScreenWidth': '1920', @@ -99,7 +99,7 @@ })" }, { - "trKey": "1280 x 720 (HD)", + "trKey": "1280 x 720", "value": "({ 'ScreenWidth': '1280', diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/common/app.qmlproject.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/common/app.qmlproject.tpl index fcea02a93b5..f24482bcac8 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/common/app.qmlproject.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/common/app.qmlproject.tpl @@ -9,15 +9,23 @@ Project { /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { - directory: "." + directory: "content" + } + + QmlFiles { + directory: "imports" } JavaScriptFiles { - directory: "." + directory: "content" + } + + JavaScriptFiles { + directory: "imports" } ImageFiles { - directory: "." + directory: "content" } Files { @@ -34,6 +42,18 @@ Project { filter: "*.ttf;*.otf" } + Files { + filter: "*.wav;*.mp3" + } + + Files { + filter: "*.mp4" + } + + Files { + filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag" + } + Files { filter: "*.mesh" directory: "asset_imports" @@ -61,13 +81,20 @@ Project { @endif /* List of plugin directories passed to QML runtime */ - importPaths: [ ".", "imports", "asset_imports" ] + importPaths: [ "imports", "asset_imports" ] /* Required for deployment */ targetDirectory: "/opt/%{ProjectName}" + qdsVersion: "3.0" + @if %{IsQt6Project} /* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */ widgetApp: true @endif + + multilanguageSupport: true + supportedLanguages: ["en"] + primaryLanguage: "en" + } diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/desktop-launcher/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/desktop-launcher/wizard.json index bd055220e13..5b157ec2c57 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/desktop-launcher/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/desktop-launcher/wizard.json @@ -55,7 +55,7 @@ "items": [ { - "trKey": "2960 x 1440 (QHD)", + "trKey": "2960 x 1440", "value": "({ 'ScreenWidth': '2960', @@ -71,7 +71,7 @@ })" }, { - "trKey": "1920 x 1080 (FullHD)", + "trKey": "1920 x 1080", "value": "({ 'ScreenWidth': '1920', @@ -95,7 +95,7 @@ })" }, { - "trKey": "1280 x 720 (HD)", + "trKey": "1280 x 720", "value": "({ 'ScreenWidth': '1280', diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-scroll/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-scroll/wizard.json index 1673f857ad6..318dbdac5e1 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-scroll/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-scroll/wizard.json @@ -55,7 +55,7 @@ "items": [ { - "trKey": "1080 x 1920 (FullHD)", + "trKey": "1080 x 1920", "value": "({ 'ScreenWidth': '1080', @@ -79,7 +79,7 @@ })" }, { - "trKey": "720 x 1280 (HD)", + "trKey": "720 x 1280", "value": "({ 'ScreenWidth': '720', diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-stack/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-stack/wizard.json index 8bba34e22d9..986c8cbdb8c 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-stack/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-stack/wizard.json @@ -53,7 +53,7 @@ "items": [ { - "trKey": "1080 x 1920 (FullHD)", + "trKey": "1080 x 1920", "value": "({ 'ScreenWidth': '1080', @@ -77,7 +77,7 @@ })" }, { - "trKey": "720 x 1280 (HD)", + "trKey": "720 x 1280", "value": "({ 'ScreenWidth': '720', diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-swipe/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-swipe/wizard.json index 5a7faa7364d..3773a615f50 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-swipe/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-swipe/wizard.json @@ -53,7 +53,7 @@ "items": [ { - "trKey": "1080 x 1920 (FullHD)", + "trKey": "1080 x 1920", "value": "({ 'ScreenWidth': '1080', @@ -77,7 +77,7 @@ })" }, { - "trKey": "720 x 1280 (HD)", + "trKey": "720 x 1280", "value": "({ 'ScreenWidth': '720', From 394bfb508f11f949336723412164a86c185ba024 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 3 Feb 2022 07:59:33 +0100 Subject: [PATCH 33/67] Scripts: Fix output for python 3 Change-Id: Ie914e04b25bdd4e41a9d2b3a9002385f5867ad6b Reviewed-by: Eike Ziller --- scripts/uichanges.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/scripts/uichanges.py b/scripts/uichanges.py index 0dcc054a8f3..126cbfc9a31 100755 --- a/scripts/uichanges.py +++ b/scripts/uichanges.py @@ -181,6 +181,15 @@ def diffContext(ctx, old, new): return report + +def stringify(obj): + stringTypes = (str, unicode) if sys.version_info.major == 2 else (str) + if isinstance(obj, stringTypes): + return obj + if isinstance(obj, bytes): + tmp = obj.decode('cp1252') if platform.system() in ('Microsoft','Windows') else obj.decode() + return tmp + # --- The main program oldGenerator = Generator() @@ -203,21 +212,21 @@ newContextSet = set(newTree.keys()) for c in sorted(oldContextSet.difference(newContextSet)): report = diffContext(c, oldTree[c], {}) if report: - print(report.encode('utf-8')) + print(stringify(report.encode('utf-8'))) else: unchangedContexts += 1 for c in sorted(newContextSet.difference(oldContextSet)): report = diffContext(c, {}, newTree[c]) if report: - print(report.encode('utf-8')) + print(stringify(report.encode('utf-8'))) else: unchangedContexts += 1 for c in sorted(newContextSet.intersection(oldContextSet)): report = diffContext(c, oldTree[c], newTree[c]) if report: - print(report.encode('utf-8')) + print(stringify(report.encode('utf-8'))) else: unchangedContexts += 1 From 8e900a83e8aab248431103c776b2c9d7fe4a858d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 4 Feb 2022 10:23:17 +0100 Subject: [PATCH 34/67] CMake build: Fix static build of cdbext and sdktool Remove workaround for building statically, which was required for CMake < 3.15. Since we increase the CMake requirement to 3.16, the /MD option is no longer part of the CXX_FLAGS variables, so the old workaround breaks the static build of these tools. Change-Id: Ifc4b1c81210777e1274b4907feb3b023f7454191 Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/CMakeLists.txt | 15 +++------------ src/tools/sdktool/CMakeLists.txt | 17 ++++++++--------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/libs/qtcreatorcdbext/CMakeLists.txt b/src/libs/qtcreatorcdbext/CMakeLists.txt index 3797afd1cf2..03ca0eda6d8 100644 --- a/src/libs/qtcreatorcdbext/CMakeLists.txt +++ b/src/libs/qtcreatorcdbext/CMakeLists.txt @@ -25,18 +25,6 @@ if (CMAKE_SIZEOF_VOID_P EQUAL 8) set(ArchSuffix 64) endif() -# statically link MSVC runtime -# see https://gitlab.kitware.com/cmake/community/-/wikis/FAQ#how-can-i-build-my-msvc-application-with-a-static-runtime -# TODO change to MSVC_RUNTIME_LIBRARY when CMake 3.15 is required -# set_property(TARGET qtcreatorcdbext PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") -foreach(flag_var - CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) - if(${flag_var} MATCHES "/MD") - string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") - endif() -endforeach() - add_qtc_library(qtcreatorcdbext COMPONENT qtcreatorcdbext DEPENDS ${DbgEngLib} @@ -60,6 +48,9 @@ add_qtc_library(qtcreatorcdbext qtc_library_enabled(_library_enabled qtcreatorcdbext) if (_library_enabled) + # statically link MSVC runtime + set_property(TARGET qtcreatorcdbext PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + find_package(Python3 3.8 COMPONENTS Development) if (NOT ${Python3_Development_FOUND}) diff --git a/src/tools/sdktool/CMakeLists.txt b/src/tools/sdktool/CMakeLists.txt index 7726969b307..0161cc2c2ed 100644 --- a/src/tools/sdktool/CMakeLists.txt +++ b/src/tools/sdktool/CMakeLists.txt @@ -25,15 +25,6 @@ find_package(Qt5 REQUIRED ) -if (MSVC) - # find out if Qt is static and set /MT if so - get_target_property(_input_type Qt5::Core TYPE) - if (${_input_type} STREQUAL "STATIC_LIBRARY") - string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") - string(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") - endif() -endif() - if (APPLE) find_library(FWFoundation Foundation) endif() @@ -74,6 +65,14 @@ add_qtc_executable(sdktool settings.cpp settings.h ) +if (MSVC AND TARGET sdktool) + # find out if Qt is static and set /MT if so + get_target_property(_input_type Qt5::Core TYPE) + if (${_input_type} STREQUAL "STATIC_LIBRARY") + set_property(TARGET sdktool PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif() +endif() + extend_qtc_executable(sdktool SOURCES_PREFIX "${UtilsSourcesDir}" DEFINES QTCREATOR_UTILS_STATIC_LIB From e24b91555bb06a78bfa6fc9c0dedab40e99821ba Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 4 Feb 2022 11:07:41 +0100 Subject: [PATCH 35/67] Android: Remove unused include Change-Id: I98d59fd17dbaca1fcfdf82506ec1fe669fe86f69 Reviewed-by: Alessandro Portale Reviewed-by: --- src/plugins/android/avdmanageroutputparser.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/android/avdmanageroutputparser.cpp b/src/plugins/android/avdmanageroutputparser.cpp index 8140719aee2..803d4416e20 100644 --- a/src/plugins/android/avdmanageroutputparser.cpp +++ b/src/plugins/android/avdmanageroutputparser.cpp @@ -24,7 +24,6 @@ ****************************************************************************/ #include "avdmanageroutputparser.h" -#include "androidconfigurations.h" #include #include From 41fee90d8eded9f6ac7c172e9bdc05cf8e9af9d0 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 31 Jan 2022 16:00:39 +0100 Subject: [PATCH 36/67] CppEditor: Fix testing Now that clangd is enabled by default, we must explicitly turn it off to test the built-in follow symbol functionality. Change-Id: Ib275893a920145868b314ce02e9dd80f656bade4 Reviewed-by: Reviewed-by: Christian Stenger --- .../cppeditor/followsymbol_switchmethoddecldef_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp index 81b410a3cda..63f16e98096 100644 --- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp +++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp @@ -251,7 +251,7 @@ F2TestCase::F2TestCase(CppEditorAction action, const QString curTestName = QLatin1String(QTest::currentTestFunction()); const QString tag = QLatin1String(QTest::currentDataTag()); - const bool useClangd = ClangdSettings::instance().useClangd(); + const bool useClangd = m_testKit; if (useClangd) { if (curTestName == "testFollowSymbolQObjectConnect" || curTestName == "testFollowSymbolQObjectOldStyleConnect") { @@ -442,7 +442,7 @@ F2TestCase::F2TestCase(CppEditorAction action, // qDebug() << "Expected line:" << expectedLine; // qDebug() << "Expected column:" << expectedColumn; - if (!ClangdSettings::instance().useClangd()) { + if (!useClangd) { QEXPECT_FAIL("globalVarFromEnum", "Contributor works on a fix.", Abort); QEXPECT_FAIL("matchFunctionSignature_Follow_5", "foo(int) resolved as CallAST", Abort); } From 75ef67615d3c157421f1245d7bf1cafd91b2f634 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 26 Jan 2022 10:00:24 +0100 Subject: [PATCH 37/67] ProjectExplorer: Remove IDeviceFactory::setCanCreate That's implicit now by using setCreator() The Android case looks odd as this is (and was) effectively static information at startup. This will be addressed in a follow-up patch, for now keep it functionally equivalent. Change-Id: I4e6082f88dcd21379186340189acb581caef172a Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Christian Kandeler --- src/plugins/android/androiddevice.cpp | 31 ++++++++++--------- src/plugins/baremetal/baremetaldevice.cpp | 1 - src/plugins/boot2qt/qdbdevice.cpp | 1 - src/plugins/docker/dockerdevice.cpp | 1 - src/plugins/mcusupport/mcusupportdevice.cpp | 1 - .../devicesupport/idevicefactory.cpp | 9 ++---- .../devicesupport/idevicefactory.h | 2 -- src/plugins/qnx/qnxdevice.cpp | 1 - .../remotelinux/filesystemaccess_test.cpp | 1 - src/plugins/remotelinux/linuxdevice.cpp | 1 - src/plugins/webassembly/webassemblydevice.cpp | 1 - 11 files changed, 19 insertions(+), 31 deletions(-) diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 7a59abea961..a14b985ad74 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -673,23 +673,24 @@ AndroidDeviceFactory::AndroidDeviceFactory() ":/android/images/androiddevice.png"); setConstructionFunction(&AndroidDevice::create); - setCanCreate(m_androidConfig.sdkToolsOk()); - setCreator([this] { - AvdDialog dialog = AvdDialog(m_androidConfig, Core::ICore::dialogParent()); - if (dialog.exec() != QDialog::Accepted) - return IDevice::Ptr(); + if (m_androidConfig.sdkToolsOk()) { + setCreator([this] { + AvdDialog dialog = AvdDialog(m_androidConfig, Core::ICore::dialogParent()); + if (dialog.exec() != QDialog::Accepted) + return IDevice::Ptr(); - const IDevice::Ptr dev = dialog.device(); - if (const auto androidDev = static_cast(dev.data())) { - qCDebug(androidDeviceLog, "Created new Android AVD id \"%s\".", - qPrintable(androidDev->avdName())); - } else { - AndroidDeviceWidget::criticalDialog( - AndroidDevice::tr("The device info returned from AvdDialog is invalid.")); - } + const IDevice::Ptr dev = dialog.device(); + if (const auto androidDev = static_cast(dev.data())) { + qCDebug(androidDeviceLog, "Created new Android AVD id \"%s\".", + qPrintable(androidDev->avdName())); + } else { + AndroidDeviceWidget::criticalDialog( + AndroidDevice::tr("The device info returned from AvdDialog is invalid.")); + } - return IDevice::Ptr(dev); - }); + return IDevice::Ptr(dev); + }); + } } } // namespace Internal diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index c5679898c84..61a31e8bc59 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -126,7 +126,6 @@ BareMetalDeviceFactory::BareMetalDeviceFactory() setCombinedIcon(":/baremetal/images/baremetaldevicesmall.png", ":/baremetal/images/baremetaldevice.png"); setConstructionFunction(&BareMetalDevice::create); - setCanCreate(true); setCreator([] { BareMetalDeviceConfigurationWizard wizard; if (wizard.exec() != QDialog::Accepted) diff --git a/src/plugins/boot2qt/qdbdevice.cpp b/src/plugins/boot2qt/qdbdevice.cpp index e372c92b622..7b858747e50 100644 --- a/src/plugins/boot2qt/qdbdevice.cpp +++ b/src/plugins/boot2qt/qdbdevice.cpp @@ -287,7 +287,6 @@ QdbLinuxDeviceFactory::QdbLinuxDeviceFactory() setDisplayName(QdbDevice::tr("Boot2Qt Device")); setCombinedIcon(":/qdb/images/qdbdevicesmall.png", ":/qdb/images/qdbdevice.png"); setConstructionFunction(&QdbDevice::create); - setCanCreate(true); setCreator([] { QdbDeviceWizard wizard(Core::ICore::dialogParent()); if (wizard.exec() != QDialog::Accepted) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 2f81b4d4f67..99c795ae22a 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1892,7 +1892,6 @@ DockerDeviceFactory::DockerDeviceFactory() { setDisplayName(DockerDevice::tr("Docker Device")); setIcon(QIcon()); - setCanCreate(true); setCreator([] { DockerDeviceSetupWizard wizard; if (wizard.exec() != QDialog::Accepted) diff --git a/src/plugins/mcusupport/mcusupportdevice.cpp b/src/plugins/mcusupport/mcusupportdevice.cpp index 7ff559ea70a..b1198303771 100644 --- a/src/plugins/mcusupport/mcusupportdevice.cpp +++ b/src/plugins/mcusupport/mcusupportdevice.cpp @@ -60,7 +60,6 @@ McuSupportDeviceFactory::McuSupportDeviceFactory() setCombinedIcon(":/mcusupport/images/mcusupportdevicesmall.png", ":/mcusupport/images/mcusupportdevice.png"); setConstructionFunction(&McuSupportDevice::create); - setCanCreate(true); setCreator(&McuSupportDevice::create); } diff --git a/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp b/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp index c286a97f9e3..1ff8498d3eb 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp @@ -27,6 +27,7 @@ #include #include +#include using namespace Utils; @@ -78,7 +79,7 @@ namespace ProjectExplorer { bool IDeviceFactory::canCreate() const { - return m_canCreate; + return bool(m_creator); } IDevice::Ptr IDeviceFactory::create() const @@ -119,13 +120,9 @@ void IDeviceFactory::setCombinedIcon(const FilePath &small, const FilePath &larg Icon({{large, Theme::IconsBaseColor}})}); } -void IDeviceFactory::setCanCreate(bool canCreate) -{ - m_canCreate = canCreate; -} - void IDeviceFactory::setCreator(const std::function &creator) { + QTC_ASSERT(creator, return); m_creator = creator; } diff --git a/src/plugins/projectexplorer/devicesupport/idevicefactory.h b/src/plugins/projectexplorer/devicesupport/idevicefactory.h index 2d44ebf162f..59034aaef5f 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.h +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.h @@ -58,7 +58,6 @@ protected: void setDisplayName(const QString &displayName); void setIcon(const QIcon &icon); void setCombinedIcon(const Utils::FilePath &small, const Utils::FilePath &large); - void setCanCreate(bool canCreate); void setConstructionFunction(const std::function &constructor); void setCreator(const std::function &creator); @@ -67,7 +66,6 @@ private: const Utils::Id m_deviceType; QString m_displayName; QIcon m_icon; - bool m_canCreate = false; std::function m_constructor; }; diff --git a/src/plugins/qnx/qnxdevice.cpp b/src/plugins/qnx/qnxdevice.cpp index 318761c1255..764355b1e1e 100644 --- a/src/plugins/qnx/qnxdevice.cpp +++ b/src/plugins/qnx/qnxdevice.cpp @@ -176,7 +176,6 @@ QnxDeviceFactory::QnxDeviceFactory() : IDeviceFactory(Constants::QNX_QNX_OS_TYPE setCombinedIcon(":/qnx/images/qnxdevicesmall.png", ":/qnx/images/qnxdevice.png"); setConstructionFunction(&QnxDevice::create); - setCanCreate(true); setCreator([] { QnxDeviceWizard wizard; if (wizard.exec() != QDialog::Accepted) diff --git a/src/plugins/remotelinux/filesystemaccess_test.cpp b/src/plugins/remotelinux/filesystemaccess_test.cpp index 9623b6f12d2..2c95a5ca81b 100644 --- a/src/plugins/remotelinux/filesystemaccess_test.cpp +++ b/src/plugins/remotelinux/filesystemaccess_test.cpp @@ -52,7 +52,6 @@ TestLinuxDeviceFactory::TestLinuxDeviceFactory() setDisplayName("Generic Linux Device"); setIcon(QIcon()); setConstructionFunction(&LinuxDevice::create); - setCanCreate(true); setCreator([] { LinuxDevice::Ptr newDev = LinuxDevice::create(); qDebug() << "device : " << newDev->type(); diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 79028450c7e..7b19d51b2e9 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -800,7 +800,6 @@ LinuxDeviceFactory::LinuxDeviceFactory() setDisplayName(LinuxDevice::tr("Generic Linux Device")); setIcon(QIcon()); setConstructionFunction(&LinuxDevice::create); - setCanCreate(true); setCreator([] { GenericLinuxDeviceConfigurationWizard wizard(Core::ICore::dialogParent()); if (wizard.exec() != QDialog::Accepted) diff --git a/src/plugins/webassembly/webassemblydevice.cpp b/src/plugins/webassembly/webassemblydevice.cpp index 2e1eb31180d..ae9fb02ae3e 100644 --- a/src/plugins/webassembly/webassemblydevice.cpp +++ b/src/plugins/webassembly/webassemblydevice.cpp @@ -59,7 +59,6 @@ WebAssemblyDeviceFactory::WebAssemblyDeviceFactory() setCombinedIcon(":/webassembly/images/webassemblydevicesmall.png", ":/webassembly/images/webassemblydevice.png"); setConstructionFunction(&WebAssemblyDevice::create); - setCanCreate(true); setCreator(&WebAssemblyDevice::create); } From da95472eb7aadf9c6681c2fe6a9ce608eb6709ff Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 3 Feb 2022 16:10:56 +0100 Subject: [PATCH 38/67] Doc: Describe using precompiled headers in generic projects Users can add the pch tag after a file path in .files. Task-number: QTCREATORBUG-26610 Change-Id: I55cc6ef86c6371658845d233614bebad2a20e35d Reviewed-by: Reviewed-by: Christian Kandeler --- .../creator-only/creator-projects-generic.qdoc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-generic.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-generic.qdoc index 2f72728562d..984161fd510 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-generic.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-generic.qdoc @@ -113,6 +113,16 @@ git ls-files "*.cpp" "*.h" > MyProject.files \endcode + \section2 Precompiled Headers + + To use precompiled headers in a generic project, add the \c pch tag after + a file path in the \c .files file, separated by the pipe character (|). + For example: + + \badcode + src/pch.h|pch + \endcode + \section1 Specifying Include Paths and Framework Paths The include paths are specified in the \tt{.includes} file, one include From 68cb80f27673c522d357a50575114dee1ea46377 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 3 Feb 2022 16:12:41 +0100 Subject: [PATCH 39/67] CMakePM: Add options link to the CMake offline/online documentation This way a user can quickly find out which options can be used. Change-Id: I6347759689a4a1431a82ff9414da0c79e357eb45 Reviewed-by: Eike Ziller --- src/libs/utils/aspects.cpp | 6 ++++- src/libs/utils/aspects.h | 1 + .../cmakebuildconfiguration.cpp | 16 +++++++++++-- .../cmakekitinformation.cpp | 7 +++++- src/plugins/cmakeprojectmanager/cmaketool.cpp | 24 +++++++++++++++++++ src/plugins/cmakeprojectmanager/cmaketool.h | 3 +++ 6 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 8470d0de10f..a4d632b7e4d 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -215,7 +215,11 @@ void BaseAspect::setupLabel() if (d->m_labelText.isEmpty() && d->m_labelPixmap.isNull()) return; d->m_label = new QLabel(d->m_labelText); - d->m_label->setTextInteractionFlags(Qt::TextSelectableByMouse); + d->m_label->setTextInteractionFlags(d->m_label->textInteractionFlags() + | Qt::TextSelectableByMouse); + connect(d->m_label, &QLabel::linkActivated, this, [this](const QString &link) { + emit labelLinkActivated(link); + }); if (!d->m_labelPixmap.isNull()) d->m_label->setPixmap(d->m_labelPixmap); registerSubWidget(d->m_label); diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index 0771dc65bf1..d1a0bdfe553 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -142,6 +142,7 @@ public: signals: void changed(); + void labelLinkActivated(const QString &link); protected: QLabel *label() const; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index dac88ee842b..4e4ba0ccd66 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -492,6 +492,18 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) updateInitialCMakeArguments(); }); + auto handleOptionsLink = [this](const QString &link) { + const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildConfiguration->target()->kit()); + if (tool) + tool->openCMakeHelpUrl("%1/manual/cmake.1.html#options"); + }; + connect(bc->aspect(), + &Utils::BaseAspect::labelLinkActivated, + [=](const QString &link) { handleOptionsLink(link); }); + connect(bc->aspect(), + &Utils::BaseAspect::labelLinkActivated, + [=](const QString &link) { handleOptionsLink(link); }); + updateSelection(); updateConfigurationStateSelection(); } @@ -1717,7 +1729,7 @@ void InitialCMakeArgumentsAspect::toMap(QVariantMap &map) const InitialCMakeArgumentsAspect::InitialCMakeArgumentsAspect() { setSettingsKey("CMake.Initial.Parameters"); - setLabelText(tr("Additional CMake options:")); + setLabelText(tr("Additional CMake options:")); setDisplayStyle(LineEditDisplay); } @@ -1728,7 +1740,7 @@ InitialCMakeArgumentsAspect::InitialCMakeArgumentsAspect() AdditionalCMakeOptionsAspect::AdditionalCMakeOptionsAspect() { setSettingsKey("CMake.Additional.Options"); - setLabelText(tr("Additional CMake options:")); + setLabelText(tr("Additional CMake options:")); setDisplayStyle(LineEditDisplay); } diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index dcf50d5df10..0a5ea45db30 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -942,7 +942,12 @@ private: m_additionalEditor = new QLineEdit; auto additionalLabel = new QLabel(m_dialog); - additionalLabel->setText(tr("Additional CMake options: ")); + additionalLabel->setText(tr("Additional CMake options:")); + connect(additionalLabel, &QLabel::linkActivated, this, [this](const QString &link) { + const CMakeTool *tool = CMakeKitAspect::cmakeTool(kit()); + if (tool) + tool->openCMakeHelpUrl("%1/manual/cmake.1.html#options"); + }); auto additionalChooser = new VariableChooser(m_dialog); additionalChooser->addSupportedWidget(m_additionalEditor); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index d407adeb66a..4e27988cbd9 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -27,6 +27,8 @@ #include "cmaketoolmanager.h" +#include + #include #include #include @@ -380,6 +382,28 @@ FilePath CMakeTool::searchQchFile(const FilePath &executable) return {}; } +QString CMakeTool::documentationUrl(bool online) const +{ + if (online) + return QString("https://cmake.org/cmake/help/v%1.%2") + .arg(version().major) + .arg(version().minor); + + return QString("qthelp://org.cmake.%1.%2.%3/doc") + .arg(version().major) + .arg(version().minor) + .arg(version().patch); +} + +void CMakeTool::openCMakeHelpUrl(const QString &linkUrl) const +{ + if (!isValid()) + return; + + const bool online = qchFilePath().isEmpty(); + Core::HelpManager::showHelpUrl(linkUrl.arg(documentationUrl(online))); +} + void CMakeTool::readInformation() const { QTC_ASSERT(m_introspection, return ); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index c45fb7514db..58f727af8b7 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -112,6 +112,9 @@ public: QString detectionSource() const { return m_detectionSource; } void setDetectionSource(const QString &source) { m_detectionSource = source; } + QString documentationUrl(bool online) const; + void openCMakeHelpUrl(const QString &linkUrl) const; + private: void readInformation() const; From 0a9acad18c53f2c09b2da325fd85bcf38fac40f6 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 4 Feb 2022 11:14:14 +0100 Subject: [PATCH 40/67] ClangCodeModel: Fix tooltip for clangd text mark copy action Change-Id: Ie551971a114f1f45004a0eac0283507627c26be2 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangtextmark.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index f7160df1237..77eabc2f04d 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -415,7 +415,7 @@ ClangdTextMark::ClangdTextMark(const FilePath &filePath, QVector actions; QAction *action = new QAction(); action->setIcon(QIcon::fromTheme("edit-copy", Icons::COPY.icon())); - action->setToolTip(tr("Clang Code Model Marks", "Copy to Clipboard")); + action->setToolTip(tr("Copy to Clipboard", "Clang Code Model Marks")); QObject::connect(action, &QAction::triggered, [diag = m_diagnostic]() { const QString text = ClangDiagnosticWidget::createText({diag}, ClangDiagnosticWidget::InfoBar); From 4fa399fbcb2222d8fed9e3353631cbdb9a761874 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 4 Feb 2022 16:10:32 +0100 Subject: [PATCH 41/67] QmlProject: Do not allow "." in importPaths Adding the root folder to importPaths can create all kind of issues and is not supported. Change-Id: I03fe8924f08b11704fc472ed9cfa0b765ab7cf06 Reviewed-by: Miikka Heikkinen --- .../qmlprojectmanager/fileformat/qmlprojectfileformat.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp index 0b637e24a74..710f34b445b 100644 --- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp +++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp @@ -92,8 +92,11 @@ QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fi projectItem->setMainFile(mainFileProperty.value.toString()); const auto importPathsProperty = rootNode->property(QLatin1String("importPaths")); - if (importPathsProperty.isValid()) - projectItem->setImportPaths(importPathsProperty.value.toStringList()); + if (importPathsProperty.isValid()) { + QStringList list = importPathsProperty.value.toStringList(); + list.removeAll("."); + projectItem->setImportPaths(list); + } const auto fileSelectorsProperty = rootNode->property(QLatin1String("fileSelectors")); if (fileSelectorsProperty.isValid()) From d408e4c22c4fb457e5cb4c8340d8ee4963f15c48 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 3 Feb 2022 16:52:50 +0100 Subject: [PATCH 42/67] CMakePM: Add "variable" link to CMake offline/online documentation This way an user can find quickly a CMake variable if needed. Change-Id: Ie885a34321cf2ce31ee662659e669de88b28801c Reviewed-by: Reviewed-by: Eike Ziller --- .../cmakebuildconfiguration.cpp | 15 +++++---- .../cmakekitinformation.cpp | 17 ++++++---- src/plugins/cmakeprojectmanager/cmaketool.cpp | 32 +++++++++++-------- src/plugins/cmakeprojectmanager/cmaketool.h | 4 +-- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 4e4ba0ccd66..ce3d54f6468 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -494,8 +494,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) auto handleOptionsLink = [this](const QString &link) { const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildConfiguration->target()->kit()); - if (tool) - tool->openCMakeHelpUrl("%1/manual/cmake.1.html#options"); + CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options"); }; connect(bc->aspect(), &Utils::BaseAspect::labelLinkActivated, @@ -518,10 +517,14 @@ void CMakeBuildSettingsWidget::batchEditConfiguration() auto editor = new QPlainTextEdit(dialog); auto label = new QLabel(dialog); - label->setText(tr("Enter one CMake variable per line.\n" - "To set or change a variable, use -D:=.\n" - " can have one of the following values: FILEPATH, PATH, BOOL, INTERNAL, or STRING.\n" - "To unset a variable, use -U.\n")); + label->setText(tr("Enter one CMake variable per line.
" + "To set or change a variable, use -D<variable>:<type>=<value>.
" + "<type> can have one of the following values: FILEPATH, PATH, BOOL, INTERNAL, or STRING.
" + "To unset a variable, use -U<variable>.
")); + connect(label, &QLabel::linkActivated, this, [this](const QString &link) { + const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildConfiguration->target()->kit()); + CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake-variables.7.html"); + }); editor->setMinimumSize(800, 200); auto chooser = new Utils::VariableChooser(dialog); diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index 0a5ea45db30..a0ec30783ae 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -925,15 +925,20 @@ private: QTC_ASSERT(!m_editor, return); + const CMakeTool *tool = CMakeKitAspect::cmakeTool(kit()); + m_dialog = new QDialog(m_summaryLabel->window()); m_dialog->setWindowTitle(tr("Edit CMake Configuration")); auto layout = new QVBoxLayout(m_dialog); m_editor = new QPlainTextEdit; auto editorLabel = new QLabel(m_dialog); - editorLabel->setText(tr("Enter one CMake variable per line.\n" - "To set a variable, use -D:=.\n" - " can have one of the following values: FILEPATH, PATH, " + editorLabel->setText(tr("Enter one CMake variable per line.
" + "To set a variable, use -D<variable>:<type>=<value>.
" + "<type> can have one of the following values: FILEPATH, PATH, " "BOOL, INTERNAL, or STRING.")); + connect(editorLabel, &QLabel::linkActivated, this, [=](const QString &link) { + CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake-variables.7.html"); + }); m_editor->setMinimumSize(800, 200); auto chooser = new VariableChooser(m_dialog); @@ -943,10 +948,8 @@ private: m_additionalEditor = new QLineEdit; auto additionalLabel = new QLabel(m_dialog); additionalLabel->setText(tr("Additional CMake options:")); - connect(additionalLabel, &QLabel::linkActivated, this, [this](const QString &link) { - const CMakeTool *tool = CMakeKitAspect::cmakeTool(kit()); - if (tool) - tool->openCMakeHelpUrl("%1/manual/cmake.1.html#options"); + connect(additionalLabel, &QLabel::linkActivated, this, [=](const QString &link) { + CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options"); }); auto additionalChooser = new VariableChooser(m_dialog); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index 4e27988cbd9..f4cc060e659 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -382,26 +382,32 @@ FilePath CMakeTool::searchQchFile(const FilePath &executable) return {}; } -QString CMakeTool::documentationUrl(bool online) const +QString CMakeTool::documentationUrl(const Version &version, bool online) { - if (online) - return QString("https://cmake.org/cmake/help/v%1.%2") - .arg(version().major) - .arg(version().minor); + if (online) { + QString helpVersion = "latest"; + if (!(version.major == 0 && version.minor == 0)) + helpVersion = QString("v%1.%2").arg(version.major).arg(version.minor); + + return QString("https://cmake.org/cmake/help/%1").arg(helpVersion); + } return QString("qthelp://org.cmake.%1.%2.%3/doc") - .arg(version().major) - .arg(version().minor) - .arg(version().patch); + .arg(version.major) + .arg(version.minor) + .arg(version.patch); } -void CMakeTool::openCMakeHelpUrl(const QString &linkUrl) const +void CMakeTool::openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl) { - if (!isValid()) - return; + bool online = true; + Version version; + if (tool && tool->isValid()) { + online = tool->qchFilePath().isEmpty(); + version = tool->version(); + } - const bool online = qchFilePath().isEmpty(); - Core::HelpManager::showHelpUrl(linkUrl.arg(documentationUrl(online))); + Core::HelpManager::showHelpUrl(linkUrl.arg(documentationUrl(version, online))); } void CMakeTool::readInformation() const diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index 58f727af8b7..dbe65b15cc8 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -112,8 +112,8 @@ public: QString detectionSource() const { return m_detectionSource; } void setDetectionSource(const QString &source) { m_detectionSource = source; } - QString documentationUrl(bool online) const; - void openCMakeHelpUrl(const QString &linkUrl) const; + static QString documentationUrl(const Version &version, bool online); + static void openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl); private: void readInformation() const; From 96ec295fc6393770e91802ab5824333792369527 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 3 Feb 2022 19:44:07 +0100 Subject: [PATCH 43/67] QmlProject: Search in content for .ui.qml files first Change-Id: I1cf8a0bc83c24a0207e68a12a9a441cc7432a013 Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Thomas Hartmann --- src/plugins/qmlprojectmanager/qmlproject.cpp | 55 +++++++++++++------- src/plugins/qmlprojectmanager/qmlproject.h | 2 + 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index e0db9f53c62..a51b207203c 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -95,6 +95,15 @@ static int preferedQtTarget(Target *target) const char openInQDSAppSetting[] = "OpenInQDSApp"; +Utils::FilePaths QmlProject::getUiQmlFilesForFolder(const Utils::FilePath &folder) +{ + const Utils::FilePaths uiFiles = files([&](const ProjectExplorer::Node *node) { + return node->filePath().completeSuffix() == "ui.qml" + && node->filePath().parentDir() == folder; + }); + return uiFiles; +} + QmlProject::QmlProject(const Utils::FilePath &fileName) : Project(QString::fromLatin1(Constants::QMLPROJECT_MIMETYPE), fileName) { @@ -124,27 +133,35 @@ QmlProject::QmlProject(const Utils::FilePath &fileName) QTimer::singleShot(0, this, lambda); } } else { - m_openFileConnection = connect( - this, &QmlProject::anyParsingFinished, this, [this](Target *target, bool success) { - if (m_openFileConnection) - disconnect(m_openFileConnection); + m_openFileConnection + = connect(this, + &QmlProject::anyParsingFinished, + this, + [this](Target *target, bool success) { + if (m_openFileConnection) + disconnect(m_openFileConnection); - if (target && success) { - const Utils::FilePath &folder = projectDirectory(); - const Utils::FilePaths &uiFiles = files([&](const ProjectExplorer::Node *node) { - return node->filePath().completeSuffix() == "ui.qml" - && node->filePath().parentDir() == folder; - }); - if (!uiFiles.isEmpty()) { - Utils::FilePath currentFile; - if (auto cd = Core::EditorManager::currentDocument()) - currentFile = cd->filePath(); + if (target && success) { + const Utils::FilePath &folder = projectDirectory() + "/content"; - if (currentFile.isEmpty() || !isKnownFile(currentFile)) - Core::EditorManager::openEditor(uiFiles.first(), Utils::Id()); - } - } - }); + Utils::FilePaths uiFiles = getUiQmlFilesForFolder(projectDirectory() + + "/content"); + if (uiFiles.isEmpty()) + uiFiles = getUiQmlFilesForFolder(projectDirectory()); + + if (!uiFiles.isEmpty()) { + Utils::FilePath currentFile; + if (auto cd = Core::EditorManager::currentDocument()) + currentFile = cd->filePath(); + + if (currentFile.isEmpty() || !isKnownFile(currentFile)) + QTimer::singleShot(1000, [uiFiles]() { + Core::EditorManager::openEditor(uiFiles.first(), + Utils::Id()); + }); + } + } + }); } } diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index 89f5dd34454..3fa11a9128b 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -151,6 +151,8 @@ protected: private: ProjectExplorer::DeploymentKnowledge deploymentKnowledge() const override; + Utils::FilePaths getUiQmlFilesForFolder(const Utils::FilePath &folder); + QMetaObject::Connection m_openFileConnection; }; From 08535a7e6308c688924ea503a00cb807812197a8 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Fri, 4 Feb 2022 12:15:45 +0100 Subject: [PATCH 44/67] Make share/qtcreator/cplusplus/examples compilable Builds now, but does not link (which is fine). And unrelated, unintentional warnings were removed. Change-Id: I6ece33933bc20e6e36fb3859de7c2b774b0e67d5 Reviewed-by: Reviewed-by: Cristian Adam --- .../cplusplus/examples/CMakeLists.txt | 7 ++++-- .../cplusplus/examples/clazy_example.cpp | 8 +------ .../qtcreator/cplusplus/examples/icontest.cpp | 22 ++++++++++--------- .../cplusplus/examples/tidy_example.cpp | 9 ++++---- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/share/qtcreator/cplusplus/examples/CMakeLists.txt b/share/qtcreator/cplusplus/examples/CMakeLists.txt index cafabb6f7cb..004deeded3e 100644 --- a/share/qtcreator/cplusplus/examples/CMakeLists.txt +++ b/share/qtcreator/cplusplus/examples/CMakeLists.txt @@ -11,7 +11,10 @@ set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -find_package(Qt5 COMPONENTS Widgets REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Widgets REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Widgets REQUIRED) + +set_property(SOURCE clazy_example.cpp icontest.cpp PROPERTY SKIP_AUTOMOC ON) add_executable(examples clazy_example.cpp @@ -20,4 +23,4 @@ add_executable(examples tidy_example.h ) -target_link_libraries(examples PRIVATE Qt5::Widgets) +target_link_libraries(examples PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/share/qtcreator/cplusplus/examples/clazy_example.cpp b/share/qtcreator/cplusplus/examples/clazy_example.cpp index 3fef3cb8a5a..bf1cbe2e61c 100644 --- a/share/qtcreator/cplusplus/examples/clazy_example.cpp +++ b/share/qtcreator/cplusplus/examples/clazy_example.cpp @@ -113,9 +113,6 @@ TestObject::TestObject() for (auto obj : list) { } - // -Wclazy-qdatetime-utc - QDateTime::currentDateTime().toTime_t(); - // -Wclazy-qfileinfo-exists // -Wclazy-qstring-allocations QFileInfo("filename").exists(); @@ -134,8 +131,5 @@ TestObject::TestObject() str.mid(5).toInt(&ok); // -Wclazy-qstring-arg - QString("%1 %2").arg("1").arg("2"); + (void) QString("%1 %2").arg("1").arg("2"); } - -// Note: A fatal error like an unresolved include will make clazy stop emitting any diagnostics. -// #include "clazy_example.moc" diff --git a/share/qtcreator/cplusplus/examples/icontest.cpp b/share/qtcreator/cplusplus/examples/icontest.cpp index 2aea615fd24..764c920b938 100644 --- a/share/qtcreator/cplusplus/examples/icontest.cpp +++ b/share/qtcreator/cplusplus/examples/icontest.cpp @@ -27,12 +27,13 @@ #define Macro -class Class { +class Class : public QObject { Q_OBJECT + public: - Q_PROPERTY(bool property READ readProperty CONSTANT); - void publicFunction(); - void static publicStaticFunction(); + Q_PROPERTY(int property READ publicStaticFunction CONSTANT) + int publicFunction() { return 0; } + int static publicStaticFunction() { return 0; } template void publicTemplateFunction(); template void static publicStaticTemplateFunction(); @@ -43,8 +44,8 @@ signals: void signal(); public slots: - void publicSlot(); - template void publicTemplateSlot(); + void publicSlot() {} + // template void publicTemplateSlot() {} protected: void protectedFunction(); @@ -56,8 +57,8 @@ protected: int static protectedStaticVariable; protected slots: - void protectedSlot(); - template void protectedTemplateSlot(); + void protectedSlot() {} + // template void protectedTemplateSlot() {} private: void privateFunction(); @@ -67,9 +68,10 @@ private: template void static privateStaticTemplateFunction(); private slots: - void privateSlot(); - template void privateTemplateSlot(); + void privateSlot() {} + // template void privateTemplateSlot() {} +private: int privateVariable; int static privateStaticVariable; }; diff --git a/share/qtcreator/cplusplus/examples/tidy_example.cpp b/share/qtcreator/cplusplus/examples/tidy_example.cpp index dc921114ea1..0a814411ce6 100644 --- a/share/qtcreator/cplusplus/examples/tidy_example.cpp +++ b/share/qtcreator/cplusplus/examples/tidy_example.cpp @@ -71,7 +71,7 @@ public: // misc-noexcept-move-constructor // misc-unconventional-assign-operator // misc-unused-parameters - Base operator=(Base &¶m) {} + Base operator=(Base &¶m) { return {}; } virtual int function() { // modernize-use-nullptr @@ -116,7 +116,7 @@ void afterMove(Base &&base) Base moved(std::move(base)); // misc-use-after-move - base.value; + (void) base.value; } // google-runtime-references @@ -144,7 +144,7 @@ public: auto b = {0.5f, 0.5f, 0.5f, 0.5f}; // misc-fold-init-type - std::accumulate(std::begin(b), std::end(b), 0); + (void) std::accumulate(std::begin(b), std::end(b), 0); // google-readability-casting, misc-incorrect-roundings auto c = (int)(getDouble() + 0.5); @@ -197,6 +197,7 @@ public: std::system("echo "); // cert-err52-cpp setjmp(nullptr); + return 0; } // google-default-arguments @@ -251,7 +252,7 @@ int main() // modernize-loop-convert for (int i = 0; i < 3; ++i) { // cppcoreguidelines-pro-bounds-constant-array-index - arr[i]; + (void) arr[i]; } std::vector> w; From 270d448eb1fcf5fd4ad0703302e164ccd38e5ddf Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 3 Feb 2022 17:57:31 +0100 Subject: [PATCH 45/67] CMakePM: Add "generator" link to the kit's CMake settings This way the user can access all the details from the CMake's generator documentation. Change-Id: I90990bf7ec0062122bc3f32d611e19da8f5f9afc Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/cmakekitinformation.cpp | 7 ++++++- src/plugins/projectexplorer/kitmanager.cpp | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index a0ec30783ae..2fdb16e31f3 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -352,6 +352,11 @@ public: m_label(createSubWidget()), m_changeButton(createSubWidget()) { + const CMakeTool *tool = CMakeKitAspect::cmakeTool(kit); + connect(this, &KitAspectWidget::labelLinkActivated, this, [=](const QString &link) { + CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake-generators.7.html"); + }); + m_label->setToolTip(ki->description()); m_changeButton->setText(tr("Change...")); refresh(); @@ -561,7 +566,7 @@ CMakeGeneratorKitAspect::CMakeGeneratorKitAspect() { setObjectName(QLatin1String("CMakeGeneratorKitAspect")); setId(GENERATOR_ID); - setDisplayName(tr("CMake generator")); + setDisplayName(tr("CMake generator")); setDescription(tr("CMake generator defines how a project is built when using CMake.
" "This setting is ignored when using other build systems.")); setPriority(19000); diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index a64783d5c3d..52cf506a885 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -755,6 +755,9 @@ void KitAspectWidget::addToLayoutWithLabel(QWidget *parent) QTC_ASSERT(parent, return); auto label = createSubWidget(m_kitInformation->displayName() + ':'); label->setToolTip(m_kitInformation->description()); + connect(label, &QLabel::linkActivated, this, [this](const QString &link) { + emit labelLinkActivated(link); + }); LayoutExtender builder(parent->layout()); builder.finishRow(); From a8a1f036cdda16f150aed584fbbfced973a8c2a4 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 2 Feb 2022 17:35:58 +0100 Subject: [PATCH 46/67] Core: Explicitly detach QPalette in WelcomePageHelpers Workaround for QPalette behavior change Qt 6.2.2 -> 6.2.3 Task-number: QTBUG-100439 Fixes: QTCREATORBUG-26981 Change-Id: If28195023929baf7dfeb2b0196c8339b84658488 Reviewed-by: Reviewed-by: Cristian Adam --- src/plugins/coreplugin/iwelcomepage.cpp | 3 +++ src/plugins/coreplugin/welcomepagehelper.cpp | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/iwelcomepage.cpp b/src/plugins/coreplugin/iwelcomepage.cpp index 89c13f993c7..5ccf830ae56 100644 --- a/src/plugins/coreplugin/iwelcomepage.cpp +++ b/src/plugins/coreplugin/iwelcomepage.cpp @@ -66,6 +66,9 @@ IWelcomePage::~IWelcomePage() QPalette WelcomePageFrame::buttonPalette(bool isActive, bool isCursorInside, bool forText) { QPalette pal; + pal.setBrush(QPalette::Window, {}); + pal.setBrush(QPalette::WindowText, {}); + Theme *theme = Utils::creatorTheme(); if (isActive) { if (forText) { diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp index e5c69d32797..d363fdf6656 100644 --- a/src/plugins/coreplugin/welcomepagehelper.cpp +++ b/src/plugins/coreplugin/welcomepagehelper.cpp @@ -81,7 +81,8 @@ QWidget *panelBar(QWidget *parent) auto frame = new QWidget(parent); frame->setAutoFillBackground(true); frame->setMinimumWidth(WelcomePageHelpers::HSpacing); - QPalette pal = frame->palette(); + QPalette pal; + pal.setBrush(QPalette::Window, {}); pal.setColor(QPalette::Window, themeColor(Theme::Welcome_BackgroundPrimaryColor)); frame->setPalette(pal); return frame; From b8c8a6a2bb809f9e05a3f539cd698b648d7fbf5d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 4 Feb 2022 16:59:04 +0100 Subject: [PATCH 47/67] QmlProject: Add single isQtDesignStudio method Change-Id: Idf9d07e6318af8d6934adcbc0afa3695e262836f Reviewed-by: Alessandro Portale --- src/plugins/qmlprojectmanager/qmlproject.cpp | 19 ++++++++++--------- src/plugins/qmlprojectmanager/qmlproject.h | 2 ++ .../qmlprojectrunconfiguration.cpp | 10 +--------- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index a51b207203c..7e88a6168a9 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -76,13 +76,6 @@ Q_LOGGING_CATEGORY(infoLogger, "QmlProjectManager.QmlBuildSystem", QtInfoMsg) namespace QmlProjectManager { -static bool isQtDesignStudio() -{ - QSettings *settings = Core::ICore::settings(); - const QString qdsStandaloneEntry = "QML/Designer/StandAloneMode"; //entry from qml settings - - return settings->value(qdsStandaloneEntry, false).toBool(); -} static int preferedQtTarget(Target *target) { if (target) { @@ -114,7 +107,7 @@ QmlProject::QmlProject(const Utils::FilePath &fileName) setNeedsBuildConfigurations(false); setBuildSystemCreator([](Target *t) { return new QmlBuildSystem(t); }); - if (!isQtDesignStudio()) { + if (!QmlProject::isQtDesignStudio()) { if (QmlProjectPlugin::qdsInstallationExists()) { auto lambda = [fileName]() { if (Core::ICore::infoBar()->canInfoBeAdded(openInQDSAppSetting)) { @@ -484,7 +477,7 @@ Project::RestoreResult QmlProject::fromMap(const QVariantMap &map, QString *erro addTargetForKit(kits.first()); } - if (isQtDesignStudio()) { + if (QmlProject::isQtDesignStudio()) { auto setKitWithVersion = [&](int qtMajorVersion) { const QList qtVersionkits = Utils::filtered(kits, [qtMajorVersion](const Kit *k) { @@ -511,6 +504,14 @@ Project::RestoreResult QmlProject::fromMap(const QVariantMap &map, QString *erro return RestoreResult::Ok; } +bool QmlProject::isQtDesignStudio() +{ + QSettings *settings = Core::ICore::settings(); + const QString qdsStandaloneEntry = "QML/Designer/StandAloneMode"; + + return settings->value(qdsStandaloneEntry, false).toBool(); +} + ProjectExplorer::DeploymentKnowledge QmlProject::deploymentKnowledge() const { return DeploymentKnowledge::Perfect; diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index 3fa11a9128b..f21f8a5610e 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -146,6 +146,8 @@ public: ProjectExplorer::Tasks projectIssues(const ProjectExplorer::Kit *k) const final; + static bool isQtDesignStudio(); + protected: RestoreResult fromMap(const QVariantMap &map, QString *errorMessage) override; diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 5636cbbf23a..f4363afe93b 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -66,14 +66,6 @@ namespace Internal { // QmlProjectRunConfiguration -static bool isQtDesignStudio() -{ - QSettings *settings = Core::ICore::settings(); - const QString qdsStandaloneEntry = "QML/Designer/StandAloneMode"; //entry from qml settings - - return settings->value(qdsStandaloneEntry, false).toBool(); -} - class QmlProjectRunConfiguration final : public RunConfiguration { Q_DECLARE_TR_FUNCTIONS(QmlProjectManager::QmlProjectRunConfiguration) @@ -252,7 +244,7 @@ QString QmlProjectRunConfiguration::commandLineArguments() const void QmlProjectRunConfiguration::createQtVersionAspect() { - if (!isQtDesignStudio()) + if (!QmlProject::isQtDesignStudio()) return; m_qtversionAspect = addAspect(); From 85e3061b7acaef3f12bb0192c91eb2ce83ba368e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 4 Feb 2022 16:38:09 +0100 Subject: [PATCH 48/67] QmlDesigner: Move wizard registration to StudioWelcome Change-Id: Iacaac80420da96f6757236db6c15ac23a6f723cf Reviewed-by: Alessandro Portale --- .../qmldesigner/studioplugin/studioplugin.cpp | 21 ------------------- .../studiowelcome/studiowelcomeplugin.cpp | 12 +++++++++-- 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/plugins/qmldesigner/studioplugin/studioplugin.cpp b/src/plugins/qmldesigner/studioplugin/studioplugin.cpp index d31c1d88f59..6d3f7b8e8b4 100644 --- a/src/plugins/qmldesigner/studioplugin/studioplugin.cpp +++ b/src/plugins/qmldesigner/studioplugin/studioplugin.cpp @@ -18,31 +18,10 @@ #include "studioplugin.h" -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include - -#include - namespace QmlDesigner { -using namespace ProjectExplorer; - StudioPlugin::StudioPlugin() { - JsonWizardFactory::clearWizardPaths(); - JsonWizardFactory::addWizardPath(Core::ICore::resourcePath("qmldesigner/studio_templates")); } QString StudioPlugin::pluginName() const diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index 9ba6ed9b808..6e84db4f9b3 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -41,9 +41,12 @@ #include #include +#include #include #include +#include + #include #include @@ -580,9 +583,14 @@ void StudioWelcomePlugin::extensionsInitialized() { Core::ModeManager::activateMode(m_welcomeMode->id()); - // Enable QDS new project dialog - if (Core::ICore::settings()->value("QML/Designer/StandAloneMode", false).toBool()) + // Enable QDS new project dialog and QDS wizards + if (QmlProjectManager::QmlProject::isQtDesignStudio()) { + ProjectExplorer::JsonWizardFactory::clearWizardPaths(); + ProjectExplorer::JsonWizardFactory::addWizardPath( + Core::ICore::resourcePath("qmldesigner/studio_templates")); + Core::ICore::setNewDialogFactory([](QWidget *parent) { return new QdsNewDialog(parent); }); + } if (showSplashScreen()) { connect(Core::ICore::instance(), &Core::ICore::coreOpened, this, [this] { From 869b7810db45c58e59d3cc6bb0de2fb89dbe05e8 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 4 Feb 2022 16:25:58 +0100 Subject: [PATCH 49/67] CMakePM: Add "Help" context menu entry for CMake variables This way one could easily jump to the documentation of a CMake variable e.g. CMAKE_BUILD_TYPE. Change-Id: I1b348f0a1b6c18f0f7cee29ff6409b43c6263f44 Reviewed-by: Reviewed-by: Alessandro Portale --- .../cmakeprojectmanager/cmakebuildconfiguration.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index ce3d54f6468..88c7072d756 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -940,6 +940,18 @@ bool CMakeBuildSettingsWidget::eventFilter(QObject *target, QEvent *event) auto menu = new QMenu(this); connect(menu, &QMenu::triggered, menu, &QMenu::deleteLater); + auto help = new QAction(tr("Help"), this); + menu->addAction(help); + connect(help, &QAction::triggered, this, [=] { + const CMakeConfigItem item = ConfigModel::dataItemFromIndex(idx).toCMakeConfigItem(); + + const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildConfiguration->target()->kit()); + const QString linkUrl = "%1/variable/" + QString::fromUtf8(item.key) + ".html"; + CMakeTool::openCMakeHelpUrl(tool, linkUrl); + }); + + menu->addSeparator(); + QAction *action = nullptr; if ((action = createForceAction(ConfigModel::DataItem::BOOLEAN, idx))) menu->addAction(action); From 577ad6fa3eebce12e270dda92d68bc76dda77297 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 4 Feb 2022 16:57:34 +0100 Subject: [PATCH 50/67] CMakePM: Fix crash when switching CMake tools and clicking help links The crash scenario: 1. Switch CMake tool in Kit CMake Configuration in Settings 2. Click on the "options" help link Change-Id: Ifdb2809789748926a5ee0e127db0c87a22efa9dc Reviewed-by: Reviewed-by: Alessandro Portale --- .../cmakebuildconfiguration.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 88c7072d756..81ae3d0f2c8 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -492,16 +492,22 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) updateInitialCMakeArguments(); }); - auto handleOptionsLink = [this](const QString &link) { - const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildConfiguration->target()->kit()); - CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options"); - }; connect(bc->aspect(), &Utils::BaseAspect::labelLinkActivated, - [=](const QString &link) { handleOptionsLink(link); }); + this, + [this](const QString &link) { + const CMakeTool *tool = CMakeKitAspect::cmakeTool( + m_buildConfiguration->target()->kit()); + CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options"); + }); connect(bc->aspect(), &Utils::BaseAspect::labelLinkActivated, - [=](const QString &link) { handleOptionsLink(link); }); + this, + [this](const QString &link) { + const CMakeTool *tool = CMakeKitAspect::cmakeTool( + m_buildConfiguration->target()->kit()); + CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options"); + }); updateSelection(); updateConfigurationStateSelection(); From 201f91b8672b2c26d458d4e719a8b3d796d8f00e Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 1 Feb 2022 10:25:42 +0100 Subject: [PATCH 51/67] CMakePM: Mark as changed only the changed values in "Batch Edit..." Previously all values coming from "Batch Edit..." would be considered as user changed values and be displayed with bold font. This means that if I had -DMY_VAR:BOOL=ON and do a Copy and paste in "Batch Edit..." I would have it displayed as user changed and it would be passed to CMake as changed value. Also it should be possible to start with -DMY_VAR:BOOL=ON, click the check box to make it OFF and then do a "Batch Edit..." with -DMY_VAR:BOOL=ON to set the value back to original value. Change-Id: I5f6cb915b32a3288c1339135dabfd182ca16feda Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/configmodel.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index 9a3f6c4e286..4933c158f85 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -288,11 +288,15 @@ void ConfigModel::setBatchEditConfiguration(const CMakeConfig &config) auto existing = std::find(m_configuration.begin(), m_configuration.end(), di); if (existing != m_configuration.end()) { existing->isUnset = c.isUnset; - if (!c.isUnset) { - existing->isUserChanged = true; + const QString newValue = QString::fromUtf8(c.value); + // Allow a different value when the user didn't change anything (don't mark the same value as new) + // But allow the same value (going back) when the user did a change + const bool canSetValue = (existing->value != newValue && !existing->isUserChanged) + || existing->isUserChanged; + if (!c.isUnset && canSetValue) { + existing->isUserChanged = existing->value != newValue; existing->setType(c.type); - existing->value = QString::fromUtf8(c.value); - existing->newValue = existing->value; + existing->newValue = newValue; } } else if (!c.isUnset) { InternalDataItem i(di); From 924862093e6f23282d239a76e123d0a367b4ff49 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 1 Feb 2022 16:37:52 +0100 Subject: [PATCH 52/67] CMakePM: Apply Kit CMake configuration to Initial Configuration When the user changes or adds new CMake Kit parameters, the changes are reflected in the Initial Configuration. Change-Id: Icca1c76749c772e946ff250f94b7965cf7cf9ee8 Reviewed-by: Alessandro Portale --- .../cmakebuildconfiguration.cpp | 19 ++++++++-- .../cmakeprojectmanager/configmodel.cpp | 36 ++++++++++++++++--- src/plugins/cmakeprojectmanager/configmodel.h | 2 +- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 81ae3d0f2c8..0acbd3ddc27 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -765,12 +765,27 @@ void CMakeBuildSettingsWidget::updateFromKit() const Kit *k = m_buildConfiguration->kit(); const CMakeConfig config = CMakeConfigurationKitAspect::configuration(k); + // First the key value parameters ConfigModel::KitConfiguration configHash; for (const CMakeConfigItem &i : config) - configHash.insert(QString::fromUtf8(i.key), - qMakePair(QString::fromUtf8(i.value), i.expandedValue(k))); + configHash.insert(QString::fromUtf8(i.key), i); m_configModel->setConfigurationFromKit(configHash); + + // Then the additional parameters + const QStringList additionalKitCMake = ProcessArgs::splitArgs( + CMakeConfigurationKitAspect::additionalConfiguration(k)); + const QStringList additionalInitialCMake = ProcessArgs::splitArgs( + m_buildConfiguration->aspect()->value()); + + QStringList mergedArgumentList; + std::set_union(additionalInitialCMake.begin(), + additionalInitialCMake.end(), + additionalKitCMake.begin(), + additionalKitCMake.end(), + std::back_inserter(mergedArgumentList)); + m_buildConfiguration->aspect()->setValue( + ProcessArgs::joinArgs(mergedArgumentList)); } void CMakeBuildSettingsWidget::updateConfigurationStateIndex(int index) diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index 4933c158f85..190ffbc9120 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -96,9 +96,9 @@ void ConfigModel::appendConfiguration(const QString &key, internalItem.isUserNew = true; if (m_kitConfiguration.contains(key)) - internalItem.kitValue = isInitial ? m_kitConfiguration.value(key).first - : m_kitConfiguration.value(key).second; - + internalItem.kitValue = QString::fromUtf8( + isInitial ? m_kitConfiguration.value(key).value + : m_macroExpander->expand(m_kitConfiguration.value(key).value)); m_configuration.append(internalItem); setConfiguration(m_configuration); } @@ -111,12 +111,38 @@ void ConfigModel::setConfiguration(const QList &config) void ConfigModel::setConfigurationFromKit(const KitConfiguration &kitConfig) { m_kitConfiguration = kitConfig; + QHash initialConfig; + // Update the kit values for initial configuration keys for (InternalDataItem &i : m_configuration) { + if (!i.isInitial) + continue; if (m_kitConfiguration.contains(i.key)) - i.kitValue = i.isInitial ? m_kitConfiguration.value(i.key).first - : m_kitConfiguration.value(i.key).second; + i.kitValue = QString::fromUtf8(m_kitConfiguration.value(i.key).value); + initialConfig.insert(i.key, i); } + + // Add new initial configuration kit keys + for (const auto &ki : kitConfig) { + if (!initialConfig.contains(QString::fromUtf8(ki.key))) { + InternalDataItem i((DataItem(ki))); + i.isUserNew = true; + i.isInitial = true; + i.newValue = i.value; + i.kitValue = i.value; + m_configuration.append(i); + } + } + + // Remove kit values when the kit's keys are removed + for (const auto &i : initialConfig) { + if (!kitConfig.contains(i.key)) { + auto existing = std::find(m_configuration.begin(), m_configuration.end(), i); + if (existing != m_configuration.end()) + existing->kitValue.clear(); + } + } + setConfiguration(m_configuration); } diff --git a/src/plugins/cmakeprojectmanager/configmodel.h b/src/plugins/cmakeprojectmanager/configmodel.h index da702df40db..83e34d191b5 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.h +++ b/src/plugins/cmakeprojectmanager/configmodel.h @@ -146,7 +146,7 @@ public: void setInitialParametersConfiguration(const CMakeConfig &config); void setConfiguration(const QList &config); - using KitConfiguration = QHash>; + using KitConfiguration = QHash; void setConfigurationFromKit(const KitConfiguration &kitConfig); void flush(); From 612529f2a7be5c5b6f6e0c32b999ec9ec7cf33a0 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 2 Feb 2022 19:32:02 +0100 Subject: [PATCH 53/67] CMakePM: Update generator label in Kit's CMake settings Now only the parts of the generator that have a value are displayed. Previously the label had "" for the missing values. Change-Id: I666bd04c94c47410ee71912dc0cebbcc6c6c79d2 Reviewed-by: Reviewed-by: Alessandro Portale --- .../cmakekitinformation.cpp | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index 2fdb16e31f3..33224d439d1 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -396,12 +396,18 @@ private: const QString platform = CMakeGeneratorKitAspect::platform(kit()); const QString toolset = CMakeGeneratorKitAspect::toolset(kit()); - const QString message = tr("%1 - %2, Platform: %3, Toolset: %4") - .arg(extraGenerator.isEmpty() ? tr("") : extraGenerator) - .arg(generator.isEmpty() ? tr("") : generator) - .arg(platform.isEmpty() ? tr("") : platform) - .arg(toolset.isEmpty() ? tr("") : toolset); - m_label->setText(message); + QStringList messageLabel; + if (!extraGenerator.isEmpty()) + messageLabel << extraGenerator << " - "; + + messageLabel << generator; + + if (!platform.isEmpty()) + messageLabel << ", " << tr("Platform") << ": " << platform; + if (!toolset.isEmpty()) + messageLabel << ", " << tr("Toolset") << ": " << toolset; + + m_label->setText(messageLabel.join("")); } void changeGenerator() @@ -495,6 +501,8 @@ private: extraGeneratorCombo->currentData().toString(), platformEdit->isEnabled() ? platformEdit->text() : QString(), toolsetEdit->isEnabled() ? toolsetEdit->text() : QString()); + + refresh(); } } From dd70101d7bf6b1a7708e6247171de24c4312f647 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Mon, 31 Jan 2022 12:02:37 +0200 Subject: [PATCH 54/67] Git: Block branch refresh for actions that open a new editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refresh is called twice - first time when the editor is just opened, on this call the repository can be either empty, or the active project (even if the current file is from another repository). After the editor is initialized, setSource is called, and the state is recovered. But between these 2 calls, m_repository is empty, and synchronous actions are still executed (and fail). Fixes: QTCREATORBUG-26952 Change-Id: I1767b35f0e9f24da2c447d0b565b410742c560d9 Reviewed-by: André Hartmann Reviewed-by: Robert Löhning Reviewed-by: hjk --- src/plugins/git/branchview.cpp | 30 ++++++++++++++++++++++++------ src/plugins/git/branchview.h | 1 + 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/plugins/git/branchview.cpp b/src/plugins/git/branchview.cpp index ffc346d71ca..eed65d20aa5 100644 --- a/src/plugins/git/branchview.cpp +++ b/src/plugins/git/branchview.cpp @@ -76,6 +76,18 @@ protected: } }; +struct SetInContext +{ + SetInContext(bool &block) : m_block(block) + { + m_origValue = m_block; + m_block = true; + } + ~SetInContext() { m_block = m_origValue; } + bool &m_block; + bool m_origValue; +}; + BranchView::BranchView() : m_includeOldEntriesAction(new QAction(tr("Include Old Entries"), this)) , m_includeTagsAction(new QAction(tr("Include Tags"), this)) @@ -148,7 +160,7 @@ void BranchView::refreshIfSame(const FilePath &repository) void BranchView::refresh(const FilePath &repository, bool force) { - if (m_repository == repository && !force) + if (m_blockRefresh || (m_repository == repository && !force)) return; m_repository = repository; @@ -261,8 +273,10 @@ void BranchView::slotCustomContextMenu(const QPoint &point) contextMenu.addSeparator(); contextMenu.addAction(tr("&Diff"), this, [this] { const QString fullName = m_model->fullName(selectedIndex(), true); - if (!fullName.isEmpty()) + if (!fullName.isEmpty()) { + SetInContext block(m_blockRefresh); GitClient::instance()->diffBranch(m_repository, fullName); + } }); contextMenu.addAction(tr("&Log"), this, [this] { log(selectedIndex()); }); contextMenu.addAction(tr("Reflo&g"), this, [this] { reflog(selectedIndex()); }); @@ -582,15 +596,19 @@ bool BranchView::cherryPick() void BranchView::log(const QModelIndex &idx) { const QString branchName = m_model->fullName(idx, true); - if (!branchName.isEmpty()) - GitClient::instance()->log(m_repository, QString(), false, {branchName}); + if (branchName.isEmpty()) + return; + SetInContext block(m_blockRefresh); + GitClient::instance()->log(m_repository, QString(), false, {branchName}); } void BranchView::reflog(const QModelIndex &idx) { const QString branchName = m_model->fullName(idx, true); - if (!branchName.isEmpty()) - GitClient::instance()->reflog(m_repository, branchName); + if (branchName.isEmpty()) + return; + SetInContext block(m_blockRefresh); + GitClient::instance()->reflog(m_repository, branchName); } void BranchView::push() diff --git a/src/plugins/git/branchview.h b/src/plugins/git/branchview.h index 9d46f52e6e1..a11379f8e6e 100644 --- a/src/plugins/git/branchview.h +++ b/src/plugins/git/branchview.h @@ -97,6 +97,7 @@ private: BranchModel *m_model = nullptr; BranchFilterModel *m_filterModel = nullptr; Utils::FilePath m_repository; + bool m_blockRefresh = false; }; class BranchViewFactory : public Core::INavigationWidgetFactory From 53ed379314d556b3c6aa840b9c360851d548b2ba Mon Sep 17 00:00:00 2001 From: Janne Koskinen Date: Fri, 4 Feb 2022 13:51:27 +0200 Subject: [PATCH 55/67] Fix compilation after API change in QtDeclarative Change-Id: Ibaeaa4b089a508b1cb44b5f90921675b49b3beb3 Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp index 96997e03d99..3213d507862 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp @@ -556,7 +556,12 @@ bool isSubclassOf(QObject *object, const QByteArray &superTypeName) void getPropertyCache(QObject *object, QQmlEngine *engine) { +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) QQuickDesignerSupportProperties::getPropertyCache(object, engine); +#else + Q_UNUSED(engine); + QQuickDesignerSupportProperties::getPropertyCache(object); +#endif } void registerNotifyPropertyChangeCallBack(void (*callback)(QObject *, const PropertyName &)) From 85e9a7a9c25f5c36634fef26fa2880fbdad34f5d Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 4 Feb 2022 17:37:35 +0100 Subject: [PATCH 56/67] Doc: Describe filtering Git log by author and toggling colors Task-number: QTCREATORBUG-26610 Change-Id: I72abb044d6ab54f83b76b72b34b500ed5ea8c47d Reviewed-by: Reviewed-by: Orgad Shaneh --- doc/qtcreator/images/qtcreator-git-log.png | Bin 9485 -> 17020 bytes doc/qtcreator/src/vcs/creator-vcs-git.qdoc | 12 +++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/qtcreator/images/qtcreator-git-log.png b/doc/qtcreator/images/qtcreator-git-log.png index d58051cc34dd40e1b0c356e06d59405e3f402e79..d628639b7c12b5e1cc99e51b29ee3d2402293885 100644 GIT binary patch literal 17020 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 Date: Fri, 4 Feb 2022 16:01:57 +0100 Subject: [PATCH 57/67] QmlDesigner: Add switch to StudioControls * Add switch control * Add additional color to all themes Task-number: QDS-6146 Change-Id: I75c8aa2dc0dd75cf5b3ac1e025b05ad5110d5b9e Reviewed-by: Brook Cronin Reviewed-by: Thomas Hartmann --- .../imports/StudioControls/Switch.qml | 225 ++++++++++++++++++ .../imports/StudioTheme/Values.qml | 4 + share/qtcreator/themes/dark.creatortheme | 2 + share/qtcreator/themes/default.creatortheme | 2 + .../themes/design-light.creatortheme | 2 + share/qtcreator/themes/design.creatortheme | 2 + share/qtcreator/themes/flat-dark.creatortheme | 2 + .../qtcreator/themes/flat-light.creatortheme | 2 + share/qtcreator/themes/flat.creatortheme | 2 + 9 files changed, 243 insertions(+) create mode 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Switch.qml diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Switch.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Switch.qml new file mode 100644 index 00000000000..5ff41c404d5 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Switch.qml @@ -0,0 +1,225 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.15 +import QtQuick.Templates 2.15 as T +import StudioTheme 1.0 as StudioTheme + +T.Switch { + id: root + + property alias actionIndicator: actionIndicator + + // This property is used to indicate the global hover state + property bool hover: root.hovered && root.enabled + property bool edit: false + + property alias actionIndicatorVisible: actionIndicator.visible + property real __actionIndicatorWidth: StudioTheme.Values.actionIndicatorWidth + property real __actionIndicatorHeight: StudioTheme.Values.actionIndicatorHeight + + property alias labelVisible: switchLabel.visible + property alias labelColor: switchLabel.color + + property alias fontFamily: switchLabel.font.family + property alias fontPixelSize: switchLabel.font.pixelSize + + font.pixelSize: StudioTheme.Values.myFontSize + + implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding, + implicitIndicatorHeight + topPadding + bottomPadding) + + spacing: StudioTheme.Values.switchSpacing + hoverEnabled: true + activeFocusOnTab: false + + ActionIndicator { + id: actionIndicator + myControl: root + width: actionIndicator.visible ? root.__actionIndicatorWidth : 0 + height: actionIndicator.visible ? root.__actionIndicatorHeight : 0 + } + + indicator: Rectangle { + id: switchBackground + x: actionIndicator.width + y: 0 + z: 5 + implicitWidth: StudioTheme.Values.height * 2 + implicitHeight: StudioTheme.Values.height + radius: StudioTheme.Values.height * 0.5 + color: StudioTheme.Values.themeControlBackground + border.width: StudioTheme.Values.border + border.color: StudioTheme.Values.themeControlOutline + + Rectangle { + id: switchIndicator + + readonly property real gap: 5 + property real size: switchBackground.implicitHeight - switchIndicator.gap * 2 + + x: root.checked ? parent.width - width - switchIndicator.gap + : switchIndicator.gap + y: switchIndicator.gap + width: switchIndicator.size + height: switchIndicator.size + radius: switchIndicator.size * 0.5 + color: StudioTheme.Values.themeTextColor + border.width: 0 + } + } + + contentItem: T.Label { + id: switchLabel + leftPadding: switchBackground.x + switchBackground.width + root.spacing + rightPadding: 0 + verticalAlignment: Text.AlignVCenter + text: root.text + font: root.font + color: StudioTheme.Values.themeTextColor + visible: text !== "" + } + + property bool __default: root.enabled && !root.hover && !actionIndicator.hover && !root.pressed + property bool __globalHover: root.enabled && actionIndicator.hover && !root.pressed + property bool __hover: root.hover && !actionIndicator.hover && !root.pressed + property bool __press: root.hover && root.pressed + + states: [ + State { + name: "default" + when: root.__default && !root.checked + PropertyChanges { + target: switchBackground + color: StudioTheme.Values.themeControlBackground + border.color: StudioTheme.Values.themeControlOutline + } + PropertyChanges { + target: switchIndicator + color: StudioTheme.Values.themeTextColor + } + }, + State { + name: "globalHover" + when: root.__globalHover && !root.checked + PropertyChanges { + target: switchBackground + color: StudioTheme.Values.themeControlBackgroundGlobalHover + border.color: StudioTheme.Values.themeControlOutline + } + PropertyChanges { + target: switchIndicator + color: StudioTheme.Values.themeTextColor + } + }, + State { + name: "hover" + when: root.__hover && !root.checked + PropertyChanges { + target: switchBackground + color: StudioTheme.Values.themeControlBackgroundHover + border.color: StudioTheme.Values.themeControlOutline + } + PropertyChanges { + target: switchIndicator + color: StudioTheme.Values.themeTextColor + } + }, + State { + name: "press" + when: root.__press && !root.checked + PropertyChanges { + target: switchBackground + color: StudioTheme.Values.themeControlBackgroundInteraction + border.color: StudioTheme.Values.themeControlOutlineInteraction + } + PropertyChanges { + target: switchIndicator + color: StudioTheme.Values.themeInteraction + } + }, + State { + name: "disable" + when: !root.enabled && !root.checked + PropertyChanges { + target: switchBackground + color: StudioTheme.Values.themeControlBackgroundDisabled + border.color: StudioTheme.Values.themeControlOutlineDisabled + } + PropertyChanges { + target: switchIndicator + color: StudioTheme.Values.themeTextColorDisabled + } + PropertyChanges { + target: switchLabel + color: StudioTheme.Values.themeTextColorDisabled + } + }, + + State { + name: "defaultChecked" + when: root.__default && root.checked + extend: "default" + PropertyChanges { + target: switchBackground + color: StudioTheme.Values.themeInteraction + border.color: StudioTheme.Values.themeInteraction + } + }, + State { + name: "globalHoverChecked" + when: root.__globalHover && root.checked + extend: "globalHover" + PropertyChanges { + target: switchBackground + color: StudioTheme.Values.themeInteractionHover + border.color: StudioTheme.Values.themeInteractionHover + } + }, + State { + name: "hoverChecked" + when: root.__hover && root.checked + extend: "hover" + PropertyChanges { + target: switchBackground + color: StudioTheme.Values.themeInteractionHover + border.color: StudioTheme.Values.themeInteractionHover + } + }, + State { + name: "pressChecked" + when: root.__press && root.checked + extend: "press" + }, + State { + name: "disableChecked" + when: !root.enabled && root.checked + extend: "disable" + } + ] +} diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml index bba4b2001f8..02842e810a0 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml @@ -72,6 +72,8 @@ QtObject { property real radioButtonIndicatorWidth: 14 property real radioButtonIndicatorHeight: 14 + property real switchSpacing: values.checkBoxSpacing + property real columnWidth: 225 + (175 * (values.scaleFactor * 2)) property real marginTopBottom: 4 @@ -214,6 +216,8 @@ QtObject { property string themeWarning: Theme.color(Theme.DSwarningColor) property string themeDisabled: Theme.color(Theme.DSdisabledColor) + property string themeInteractionHover: Theme.color(Theme.DSinteractionHover) + property string themeAliasIconChecked: Theme.color(Theme.DSnavigatorAliasIconChecked) // Control colors diff --git a/share/qtcreator/themes/dark.creatortheme b/share/qtcreator/themes/dark.creatortheme index 6976c246842..476de0f3e4b 100644 --- a/share/qtcreator/themes/dark.creatortheme +++ b/share/qtcreator/themes/dark.creatortheme @@ -35,6 +35,8 @@ DSerrorColor=ffdf3a3a DSwarningColor=warning DSdisabledColor=ff707070 +DSinteractionHover=ff74cbfc + DScontrolBackground=ff2e2f30 DScontrolBackgroundInteraction=ff3d3d3d DScontrolBackgroundDisabled=ff2e2f30 diff --git a/share/qtcreator/themes/default.creatortheme b/share/qtcreator/themes/default.creatortheme index d8e9190f38d..f9962a8bebd 100644 --- a/share/qtcreator/themes/default.creatortheme +++ b/share/qtcreator/themes/default.creatortheme @@ -26,6 +26,8 @@ DSerrorColor=ffdf3a3a DSwarningColor=warning DSdisabledColor=ff8e8e8e +DSinteractionHover=ff74cbfc + DScontrolBackground=ffeaeaea DScontrolBackgroundInteraction=ffc9c9c9 DScontrolBackgroundDisabled=ffeaeaea diff --git a/share/qtcreator/themes/design-light.creatortheme b/share/qtcreator/themes/design-light.creatortheme index bb060639e8f..d9220d1394d 100644 --- a/share/qtcreator/themes/design-light.creatortheme +++ b/share/qtcreator/themes/design-light.creatortheme @@ -40,6 +40,8 @@ DSerrorColor=ffdf3a3a DSwarningColor=warning DSdisabledColor=ff8e8e8e +DSinteractionHover=ff74cbfc + DScontrolBackground=ffeaeaea DScontrolBackgroundInteraction=ffc9c9c9 DScontrolBackgroundDisabled=ffeaeaea diff --git a/share/qtcreator/themes/design.creatortheme b/share/qtcreator/themes/design.creatortheme index 4b3af2e59ef..d0d3b94c2d3 100644 --- a/share/qtcreator/themes/design.creatortheme +++ b/share/qtcreator/themes/design.creatortheme @@ -37,6 +37,8 @@ DSerrorColor=ffdf3a3a DSwarningColor=warning DSdisabledColor=ff707070 +DSinteractionHover=ff74cbfc + DScontrolBackground=ff2e2f30 DScontrolBackgroundInteraction=ff3d3d3d DScontrolBackgroundDisabled=ff2e2f30 diff --git a/share/qtcreator/themes/flat-dark.creatortheme b/share/qtcreator/themes/flat-dark.creatortheme index 7bd64b856f0..de82d3cb39f 100644 --- a/share/qtcreator/themes/flat-dark.creatortheme +++ b/share/qtcreator/themes/flat-dark.creatortheme @@ -39,6 +39,8 @@ DSerrorColor=ffdf3a3a DSwarningColor=warning DSdisabledColor=ff707070 +DSinteractionHover=ff74cbfc + DScontrolBackground=ff2e2f30 DScontrolBackgroundInteraction=ff3d3d3d DScontrolBackgroundDisabled=ff2e2f30 diff --git a/share/qtcreator/themes/flat-light.creatortheme b/share/qtcreator/themes/flat-light.creatortheme index 4c90c7720f8..1332f36b0d8 100644 --- a/share/qtcreator/themes/flat-light.creatortheme +++ b/share/qtcreator/themes/flat-light.creatortheme @@ -35,6 +35,8 @@ DSerrorColor=ffdf3a3a DSwarningColor=warning DSdisabledColor=ff8e8e8e +DSinteractionHover=ff74cbfc + DScontrolBackground=ffeaeaea DScontrolBackgroundInteraction=ffc9c9c9 DScontrolBackgroundDisabled=ffeaeaea diff --git a/share/qtcreator/themes/flat.creatortheme b/share/qtcreator/themes/flat.creatortheme index 9b45d8708bb..c6b5ae81abb 100644 --- a/share/qtcreator/themes/flat.creatortheme +++ b/share/qtcreator/themes/flat.creatortheme @@ -33,6 +33,8 @@ DSerrorColor=ffdf3a3a DSwarningColor=warning DSdisabledColor=ff707070 +DSinteractionHover=ff74cbfc + DScontrolBackground=ff2e2f30 DScontrolBackgroundInteraction=ff3d3d3d DScontrolBackgroundDisabled=ff2e2f30 From 6612fd16a7bdbf64a0fd47cf19ddd4dd3153d4ef Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 6 Feb 2022 08:31:00 +0200 Subject: [PATCH 58/67] Git: Fix parsing in mergetool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Amends commit 50586c7bb8806eccbe3b8b2684e7083e5633d58f. Fixes: QTCREATORBUG-26994 Change-Id: I799d05590b3433ec165d9d7f9143bea7d66b9711 Reviewed-by: André Hartmann Reviewed-by: Jarek Kobus --- src/plugins/git/mergetool.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/git/mergetool.cpp b/src/plugins/git/mergetool.cpp index c84273f438a..b1da451b6b0 100644 --- a/src/plugins/git/mergetool.cpp +++ b/src/plugins/git/mergetool.cpp @@ -211,7 +211,10 @@ void MergeTool::readData() VcsOutputWindow::append(newData); QString data = m_unfinishedLine + newData; m_unfinishedLine.clear(); - while (const int index = data.indexOf('\n') != -1) { + for (;;) { + const int index = data.indexOf('\n'); + if (index == -1) + break; const QString line = data.left(index + 1); readLine(line); data = data.mid(index + 1); From a9fbd675e2fbdec343637a98ab7bc3fcc8c3b89d Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 28 Jan 2022 11:36:57 +0100 Subject: [PATCH 59/67] Doc: Document logging viewer Task-number: QTCREATORBUG-26929 Change-Id: I67e7ab32ab92e28c1d9b018801872d0e111e1971 Reviewed-by: Leena Miettinen Reviewed-by: Christian Stenger --- doc/qtcreator/images/icons/message.png | Bin 0 -> 204 bytes doc/qtcreator/images/icons/qtlogo-16.png | Bin 0 -> 404 bytes doc/qtcreator/images/icons/savefile.png | Bin 0 -> 142 bytes doc/qtcreator/images/icons/stopwatch.png | Bin 0 -> 283 bytes .../qtcreator-logging-category-viewer.png | Bin 0 -> 27054 bytes .../creator-only/creator-logging-viewer.qdoc | 97 ++++++++++++++++++ .../creator-only/creator-task-lists.qdoc | 2 +- .../src/howto/creator-telemetry.qdoc | 2 +- .../creator-only/creator-advanced.qdoc | 7 +- doc/qtcreator/src/qtcreator-toc.qdoc | 1 + 10 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 doc/qtcreator/images/icons/message.png create mode 100644 doc/qtcreator/images/icons/qtlogo-16.png create mode 100644 doc/qtcreator/images/icons/savefile.png create mode 100644 doc/qtcreator/images/icons/stopwatch.png create mode 100644 doc/qtcreator/images/qtcreator-logging-category-viewer.png create mode 100644 doc/qtcreator/src/howto/creator-only/creator-logging-viewer.qdoc diff --git a/doc/qtcreator/images/icons/message.png b/doc/qtcreator/images/icons/message.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf36b6092cdceac598c62f29aa6d5b08379e752 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+O!jnf4AD5h^`b2wW1>jw z!{h!cLVG)%R6>MKt~sET#u+vHM_CeU)G^}ebl=$~la(@Z4^KMDyb9-hiU|?Wi@O1Ta JS?83{1ORW?QnvsA literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/qtlogo-16.png b/doc/qtcreator/images/icons/qtlogo-16.png new file mode 100644 index 0000000000000000000000000000000000000000..e4623bb7fb39d89126c8f44a80299edc253c39f4 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU(BJt_%ze|NsAYJR5|J zoX!Tjo(uChAL)5M()&Vm=%tj{D>?C3a}%!SrCl${zEN3lv$p6~eaY>{^4ra|cRQNz z^|jpZZ@oXE>%o+shtnrLnlt6`yy;IC%zCsPl&6fU$t*ybE-OU|D-(}h(I$f=;;a7Ei#nc;Y z#tsrc-#wYB9Ifr-^hd=!bYD!g%g(-(qbIt4GDLB3|JbDRB87p0fx*+&&t;ucLK6T+ CO3{A+ literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/savefile.png b/doc/qtcreator/images/icons/savefile.png new file mode 100644 index 0000000000000000000000000000000000000000..d23d62adc424e3e74a437740e9c0885964a33bf8 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7LOop^Lo9le6C^SYa3t$Q zY*RgnJB tAi-{kXC;$Ke literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/stopwatch.png b/doc/qtcreator/images/icons/stopwatch.png new file mode 100644 index 0000000000000000000000000000000000000000..5363b789e801dea2fcee9759c7340fd6ede3569f GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+Jo0pL4AD5>dr{HbIZ&qU z983qzOc^8k~WJz6tnC(2#RQ>F$ z2a59rlFIE$KJQ%3r*nh9R%?N_=0j2UJk_ci?$X6Vc4d!mPIgmtk*iN=TO_h{WyVN8Q%;1E0@B+z`)??>gTe~DWM4fpeVD#Z&Vqjnh@A+cFz>rz$>EaktaqI2g>@BJ8 zrT44%-I+Ki|9NozN5`P;?Jx6KCLQQn+OS~agy=bW%~wv`RfxS^D6svg-9&+%+eB|N zOYSbctUm3%FH7^q&c!`PPFV)cDfVrVaXTH>_WOkvfBf-=gFkjoji_^wY2xggd&EMy zGw5}w>FQ@|j#s_idhOnSOSMN|s;;aGUA^jB{&~yrvs?L{6$Cg~m>L~^O*H+wKU@*Q zQHbUC;AU!c0Ld+3h0siwn!tRf#)d5*ai&HGhbX9W1zoTi3IZOvmwuhB{~o-(?whS< z7h5Yt$4bYjmor#l`d2ze)xY=lU!E)mwd2I6lecc&O1Jwgxi2<1WOvlWYtePzV%7g$ zjeY;~Q2f7{>;JvcuK%@r|My<~zmMvF-C^GU)tPJ6zR%(Bc7OU>|8aNyuisu*~zcia3zRM=!rGfj|}6=b`V zR{ei_{%+pY!WJeXjqr`u+c}{PTbP*=zs#>ipklLO85@v~E1PyL|(`xUMY$NpVE zpu0pX`0weD`}jgniM9KDf|CPbli{TX7Bx9zxV$=qnrOX{QbWVf0XzC zjF0>GApg$+`@gTa?SF4=p1i+C?}e?*RcVvvCXs}9Xk%Gs0iccGcJo%Y5#5~4A7{@N-3Lgn(bV&=-N(Y4fD{p9E8 ztk1LW|4F+YloHx|F>{Y4%xLT~ho zxHg|VqN}~-)|2i7ST@Bh4F|8KAV-nakvZqls35c;33pTgEO!0RnKrea=!l4=J@}IWbMn}mCmm@ zZU1X-di}%f`IVQK=l$NOU-zfG{?F@Z`|tOp=hYuyd0y512){>^ou0w$r889Of}AgD zo&P+e@zdGqk5wm6;z~Nbw{2Iz!v|J9mm=qcfr3*8oDU}iCQkctK5WU-FUS1v{_BtX zslNYjeEsw9`#+{Gz5m}^K2&=B-zU1e_wQYAwklMv?y3FXS3l!_{WG5b`<_MS&V36T zuIsY?6cbICGWdjPf(I_ z5L2^V7jvrc)wbv7_x$}7dur*6od41Bf2{A`>DAZT{Vs_qcCGz|m!WO3+N)pkCOHOy zHA#8pUJ}}BeCAV4^0fztHy^E89rj-9W4}B&TQ;r{%GCARQGI6nMn}u;mAR)hALxK} z!Am)T31Z-4Lx2NXaB;AJBL!3lGG;o0LIPXi2-kMvh{x-#AjORi3KQ0`!u7%mMz|SR z3Rbw)2rKbuTdcBH*}X5O_^j#uD;`%m+xg|=-W6Su505Pk-CT5~bJdEx(=T7`gE;t$ zU(~CuYyVaMe!G4D@4N5!ZCmsFHRv!%}etTL{ z8ZQ9}FrB6?Qzkm^t-b&AT=_kaJ+HoG7e$^bnque~crN<>uWQ-TomPQ!>q7PBPPu%w zHW8dbSvGN83X)q|zV~(P{cBEFUbd!ZMV<~+Tbdo+VYT;mk=0K99!L<0xkQ~>dF9#J zwSM{>2g1+!>AgMua+O`_=|HyyW-Uwn`ll8D`}4DYLiaD_C_nY@t%Bg{>cpd*sQShe z_8tONHd__{vU>i|T=e7A&s#ZSS2HZ@Kdzrs@mqiH&aa!_dj>9_6X*GQ*Xwn^-@X5r z=enrgT>NYMujRKSG>%_C*U2;+64lI;!+wO?T3-6qy;*9;R*y?TjluT+9^3yrZ2#wQ z`Q6g%vx@`kYrZU&50$>U&gD{2+N$sS|NoW$dBVMJ%E`t3cB{%7A$6tXq%Hd%Tkm`9 zrqtDy$J15ZV6|6)VYy6I&6YC`mYPdM^`2j=k4?H}UH^05>G~g^S^t~vj4dDWADzu$+mfB1Hg16-e{d|L8#+V(w9+3P>B zb6=`@GSPj?*))kus|2#X^Vj`4eg8-E{!g>*e>}Wj^~L_*_Vx9DzWMou~YI-~Z=Cf6evs z+HkJSl}`JNHC8!56SB8Q6qk5L$@E{(H!S&@{r{)=|98{NyZ6`s(w_fMy#7nK{qJ`6 z_0Jal^HbDi4dQCH`?}J9@Atj$mu^`4FD&{>+1Bfgy7HMTC+IxY7BTexTl?(H%x-c0 zGN-6l3{VT2CtiDbdHMdS9Zrk#d0_!QXV)Wb_0}zio@TWCD!>2Z`~U0O^{apU&aZ!| zUjNtr{8jn?|IYtAy!ijO{DAihgZrGL?tjv~zsT->^|zbp_rLG^F1lgqzts(Hxs~Uu z?=AkOHfdT{eYl&Q;N~eB#S5$)bdG1rvj&y3yUHH8&8`eCDkfx3o))EY`DfBc;rTyY z3azHPPP+E~-^=N8|L6LP)Z71jx>x_-$^0v-Ynis~`#F1mUSWB=d3-oK#fk^Rr9{>vv%V~%D#!{vTtHLGmRlBL%&KDZvSe!KX|?frjm z*FRvdd+=EP{|+lx+mh5HzxKt1G_T$~r`ZwG?9`dEW!tuG_dHrAO*- z*FBMCdyA%02r!|UT2DKDE<5OI=jK@gIfGvX`3Sxrm`=uoifL|+)whr zl%HOPV)tKr6vB!@9_J|e-#3omnmmn()h|j*C$r#^)|YMP@BRJ!|Kt4s^FQ}n-M-4S z{C?TLX)c#8#mjDs-1+6>aryB1DXX@HUi`SK_KN(eSxckzHxy~6Yd)QJ_ujp*Y@a=b zj?ijHXUdk47r%I2?)|#9U2MZrpMazFTQkxY9bbK!o2lTGr(o2S^>ainaa~t0%>2Q# z*{*_HfBE$sn^Of#W9m*Rg{C|XtY1-Ybxmja9JaS-;HfgvWA)A1)=Om!ckB~RdfoNs zNRilt#9d*QkcOngGMA|GJB7!;>blI06F9JGnz7lXS5NjCfa`iD#?0PDb3k=ME{Esb zd$}+@YR*yN@wHo{RDxN9&8u@)3txR1{(RGvr!l2hL(T8kZ0?H9ZgYR-Qu-@&XGxG> zIK04C@_0Qfd!1#`la61n-aa`wx%>*KrU{%|_v6DuRXz8=;emZdns?)ZuV}tHa(HJ+ z1X5YA7u$^{X)xAGp?+WDNT}pT2d4btwx}!#X$jH4-;8^M?C|X zAh|u^Rhz>xgLktgUlUVt-1oeC-}Bu3YUx{yxvY&PN?D?hf~Q`1`+kkfddoM;x?2>N zDQ~&jbUe2BQkAlbHnGkKQ6q~ zw<7BQx>HLs`mW7BwcPo?@0x8t{XW0{}S9A{pmf^Y^BXlj~zO*ln)9_W1i#H(og}``M-Yr|xK4QTgU`!nwzuykugUDFbq+ zUsT!csk3e0&k~*CFBD(APjBLd#J2oh2R&X}dCS#AZM{DC&-_>Ymj8|a|9;6nS6IHr z>bG~U#J`=mTenpvm)t8K){no}I9C7pSO}Cq3D!6m6b@z^?)@!TP z%4g-8E&g?RV!``0 z{~qm5Q++mh%k??yy_b~E==0eLoc6 zmO0-4%KTl`Y+|YZE>+)$DIYGIt$a~DMLAAIw|4V8S=Z{m+Y=*{t7l)-6Jv@DyL71J z%8V^7zr5eix;n#uQe5#vJ;C<|3TwA5QMH-6sD4*&F5k80-C~)n%cdRWxqjg8ulL>a zuM}iypYQ%ZMOHLZbZcEexYge0H~v5AopYf_;Dm+eYTtX#KJKv-#MbZsvM#ds=aOgH zd54ymI@~*)=W#k;PGuX|8)6LVoS46UZl~3~ZmbIPoHcVpOm%5WX zw!H5KrIe(5;fgDQyt{If{JVse*1kDbvUD;ifLh%8OqKVvPcXc-B~Dy;>bvh>*Vot1 z*N;(k>S5|LaVp=gr%p-e-Uc`Ab+gmd_7Pf20v@CdA7?FBS7-2*)LTwt2p}2vspQd z`)$LvCI_pD-=L+-D(&Wp*UUj3la!5@=54vqCg2e(*|R0C`iq1JSF4lw%D0}}xg2jp zpPQx%nX_JMa#|QLAuRV&)rW)Z|Ero-9KP@-0OSI$Rwu`(uO8lkSF(jwta)_#Su-2A zEC|pLS;Bg$scFl!>08pOT_?-Fne#1gWl8q)1z8XG&J1PxxjcHu%}`ODDLQXf1#f(M z<@NlU>o>#imHj=m?#GFft#NsprPbwi1s_8`et+4Wwc}0h@;NJZZM(Yq>i$;Y%!i#* zKk}UUHLLgUmgE+;+E3jO6Bm+hr%kaJ8gbm9DcFtC*$XzkJN=H zTq{^?^s)20Y?6ZRgfOAZmpdcA8~kfG<$QPU#k5DUo78<@6nYQF=)rl1s!;5@$ujM#J6$Q_D=)bHxM>%sv zQFR!jYME?Tx$gX%DLT=fmtK{{^-c?WU8MVZ+P@=?Q3`AAJi2|dqHo4j&GK7Wvupm_ z&bf7jj=DKU&9r`hb#r=r?e$LeVvWFzNq>zmPwszm{LbHP<*0o>lk(K5tK|bpp7TV^ktX?QIW=**`-z`n( z#@vtHo3c#<7iw|^x0t@#`~LJI#}_KWSMH~;{VpiIJGk7tv*dG1fV5y{sQ=r9^yOK4 z&kugQU9M~!v3*JJ``1OgULLBQ6t}l_`6v624eOzwfiO@gh0rC^V%mo#{o$l-rPZbM`ojxOH>(hwum1*95)!&x( z9t};IJ*^@_^vRU{uBQ*Cy3MgYuy*_0h^X7!`<82-+P=Qh{S@EXO-#@3d^#~}$;}Wjd&^SiRTSvBtkT-1=)t{Ysz;RL z`-Sb(F70h^WXyRhB)H+%%Cj-d+{PKA8AVqPJ4kNIXbwJM_&ryhd&Q@DujL%h#4f$+ zwPRWagL0T&>RF++sY$g9a-V&fIdAdY`)7ZZTP7;>azDMG%%+lT>!GmrLnzB`aa*6N z=bVm{pT11{;_8(xDW=vc`QpZ!4&T!YB24>PJ-k z?xWRf%ePY8viH7iCTm-dWzY((*RkHuidiysHT=A{6?rakRnVEZMd;9GCdQP72mWME z3`^@<BmXaLgX_}Th6U3)!w_k1D0?9D5j?R}zTSY0l02{`v` zIbnW6?#|06Ym?1e|A?k&_-U_i2tHBPY_T@)eTk%p_7&aR6Q&hdUjAWwG}Cq7%9LMB znT=a!O%VIPpnu1Iuftb;c&t{ww-wpZ8*}BR=#NVQAJY1+ReLn9xs_^g;^X(g_X~>| zz8br&SC!MR;NSc8V)PIB3r{R`8 z*l<2;9iON}`AfP44=>#s9dan@VXAvU&eLO}A8$KniKJXKlRF-EWU6Krzod4{y+@P3 z$!!vEc{y$0y%(S5mVNQOclMQO>5too??xu*ghcBso6;`5r(I#~t=E|^Umnw$wRHN% zh1^$9Bx)31y0uAnYsnvv-4#c_TowPaaKeI}ksU5arhiix63kb+oU1*Nude>;^Fzvd z_L_IPtXQ6A-!$FWSMQV@d8{MUWzTjyg|&TlJ5Mc7{To%ZxT<)w`2WU(N#}Vd?Btm^ zeVcl9qR#t7(W7S$O}@OR{m8mA;#-rpr^T-BWxn{=QoYsn^6K5&Rxjdxnch=ltNWij zC}Q8~nGDOlqe^lQ$?nqYlzpyuPv`x#qWmuF6c;#O`eaj>sq-Y>^2U10 z!X2LAteDvQgK>ID#A2AC`}J#C znjo86ofe+w<&T=JK_!c8WUQFMt33{rZnb#q;-my*6vf)!g4D z)^*lrjtR?}f~w2^mHdY#mxb;tUMapTea1BbG4BQmpA#pH6`Qs=M6Gs@dZ;Qay~W@9 z(k89szd=R8htd~U`)iz?{IsCFeZ4K)rAeOIX0tV$uO;`}hTX5;p|s@c&lQZBja!nI zs6L&%tkU`Oy9}W>Geli%US4ggh)#O%!wsZw^N#uPii0O{q)2l z{pQRi;{W+d4R3pPoIaQN(Pdtx^Ybqg^fo^JvF3B{=1&QwOUhQxw#)2Nsz{ld{CwKV ziKi~_%r0ua=IZ;?b?uGE94V~dp6u`_bn^WCD=oi8wO3`DGh{YyS>u7Ssj4MU zKMF?dZt0piL4V%gl0>(~yCj#bEk4b9-}j5?S?0GXGs?Ks!$Fmom&xHR#d{_sMy>LH zZlV;;<+VxC!;R%zv>*OmB!s_2HW@yW?tk8 z=X^SWB`ep{dr!uJb;1g3mzn7r<#bx!X}Lf1+185bZc}GYsT9=+pU8Yj#N>PWgKt;o z&p-6;=-D!T`?F~)TdmdC{(iT6{f2~<8Wms9yUW*x{QbPJUGA0Q;gUtHCew~ZS40FU zv(IyyzT~Oos(W>!b1yhVDXew5#8t&_yJgBdTOOW-?CBj1Q$IFXDvPCEFxpwD!p5~U zahrnM(xz>n{dYg##eSjWVk@YEQ_y`sdTr@zYek_2t`W{VUtD zZ*@Vsr{uYa1M_D$?zpCU=)I`=f(gq?Z~AF0KWnZ0bkUo_FV0a{nU_9fe7E_Vo!zgZ z(la-fE8TPMT&Voje6sZW6`Lw2rC59`yX89hTIu!J?_VzaiOVop@8JAi|=G*W0I85&kgt4zGSLNmeXg4?mUJ|PIInh-aMr`QLJ%;%Ox+4 z^IR+wTA4mCca559xyml{rs{Fe?yE<x5~>GF8gDwQE1P z{(StRb4%B!^he31Wv-sDlXt(7zM}i{(j6DUwe_W47mS`MXa8<6SjO|rcF)UYv*%U6 z+c{lp=l6Tnk6&kQRa|?kR&(N(meVtrUkIKPma@WYnf?SZkJX%+ANhZEC@(gNDZJj6 zUG4u_j_b~|%{SQho2+@5C3y#b?f8;S_aM{#soyVr=Uin!=TSob_Xf6XcUhT7?RA+; zQY}?4d#qmgeL`KV#GVx&EZ)pmb41Iugr}qPX73*&Oz4NHAC|F zJ$*Bs*IWKP)xGHKFZgl$-LmM$NPpX}ArIZ&9IQSOC$O?sv#{XgKE6*P64O{`?>f5T z;ono`%^&2Nw!B)ueCcwt%^B1BbPVmCk4l_WL8&X-y`RsV-Rj{|lUc7M_)*R1?lz&9 z559-j>e)Q{H2Kil70vWj%{6QqS9P~&Ox)r# z@q=+sSo7y~CES0?r$4bhvp;Qu{iF|9=FdMA)pn%%{FAn+R&N(9S^DJ6Oyg6f6`!7* zykh!jX<@qgEaThJGIK6We{-qj;8W`bQi9)t4cN_9)=DjID;4_5_P1EvgL_G<>7(|@ zpoKG&{bnziR#C{MQ4+f4dZ=99{=eVcZdQcV#y0ykt2#s}=uWuy#A9{LM8+kotxa31 zP8slCdX?llJCP|0EEzWYvG@J>dIOeAO-|}QQMPLiGp${kc69yEO%hu`3cyw0Ldk`; zul6j1Rh{n@qvSw+5yyoA8Xl{=_q2aieuPwQg6qdaOH6MUe}4Q)cj~0p^%ZgfFS~hm z%am0uNGb2${Op<$tKzoH)_QCHUS;Q#uYUWmczTz;TlnFrTsw1%H}5qIS@2<^?SiC7 zE4~|sPt59EcRlsE&TlX6>pt7W*k0@ZKQd|3wIA#|wtSFQ)1GjR$+J79)jL9c*3yGF z=k3(~A6Aw1e9@LU2?`UH&P%+vp7H#-q+E$xNaMlPPiF5~X5GE?y3CTRo4iUm--|7o zy51x6l;P!xpMTzPs(!Y^b9JGzPt%q+qW!j!&p^cx>r-2v^ci74&;6ae_56txp{}3) z;$^10Kz(c0OS7ypO}*GNCyJeZuDoj2>oZj^6xNC=uKnP&7*sFvgDbH8pWj?bI3o3a z))bSCoRzL75+DOw*O|_6)c$;-wxs^;;^};IPiMLr`hGj_WB%?$|IVL{UyDw+`aUm7 z4?pKTd)I;4yed1T&z63_Zdc&9u9HnCOtpC3x}dTrt-brRygpC6>9pEJJaiRT(t-4! z<{4&FZA9IqJa@Xc+a7KDK5sbI-W@{@_6hYot{27Z0lYdmF@n2{T@|My|sCAmh-%0?)Daw zg>~$Yz7x8vzV^ij9@n;t-<;V?PrS%BinB_nVtRD2QSIpqkx6;F!Dez3t{w6?U7|2K zIM~Z7tYl5mvFn@pt#|kY-~IF4R9?mT>r0*_t_aIQk3_Dg(uafC`X$nC?k-Y^vM+z6 z!MpKO?i#&~KO6TFe&Y zXYL2u2J2c*zv^=4qW1lwSFs|>-On<&y<6e?FlkYF{=Xc<+6sl`JDv-==SKNjcTP~B zc;4@diQnUjlIm6VJAUq&dN$c)$yJ5JTUr)=^t^5UOR9f*o~O3Og*AHW{4GyU8}MF= z63JxU+a6bEBzf*|vQb0)z1VAF$sgnoEeJKZ5XgTmMI$-7Q>S?1=F^`(&b_VBrkAd4 z=rwiPDi7a1p+f70_Usm8(|tYln3~S*R{>v5&S$SVrDwfZ)?v>P&ELB@1%csB%?WIREPll~iV|=6dIQa2}ilh(m zYL`yw#Pu|;>iu))s?u7mAIA*0s-3&e8S|+Apts=VN7@UkFL~|gezrt((`AvcR~_F! zOu28iz?{z`>Z65jdRf=RX%|!-qSkyp#GG!kWT|&w59`M2<}D6UydI}ZOdmNan62&E zwc~rh?9lYv#>-c~Z2mjt*~U{a(z~L9;jZyy@Xw2 z`l9G%cCG&}Zu~yM^6RX4r3be*=={HTxJ3TjF8)1veOC7-G^ne7)JutX+kI%|%Gn>f z45KDre#_k{-Q2%p-S-WC>V-N%N4K|sIa&30$(8LVl0r+TKgfU0;(Tk$-u5tq`FphO z3YhA)Z~1s>#m&8QPZ>{(^#8`kQo-*Swe|YtMPARY8@%~nsU#kzF<$tqzMq#Q3sMb)J8`<9yTN$xSVs+l}E5YnZg^CN+%1?wEJuli- z)O_HM(d@}$u~T!8^Uf%JeCqJ}dsWjn*f25fkAAU1%jkPT{&$6#VyWgs$;r%*T|b1F z?d1O1H%rX#(aiL|(>eM5QFfmiN({YX`;LFNO9;EH z=U=1kXCFVcUh1u$VeTa_iFtYN?|v)K`R3XxX>pI?c-!NpmYHW$pRYF&Yni9R!*V|s zR9r_W*SU0Ccc}IxH@20`k?K@CyY0e8-LnRFbgx8uwG)y z)b%i)JfrjGtcGV|e-rP`RnT4IWWteIIz6%KMEZ6ap92<%t)R zc7`QfV9H!8k@@wHgJDs4$v;r*9Wun%3hDxY`dV|_z6)@{hyJcs-*bkH0D?vh#XPvV zF3pn5JR9-Lf8WxeO%rkkX`~5uRv6!1j z{o%%yrabBYMT{h`M=BWVZqdp-X-ZTclba zZtuTYe$Ct3b{VM0r0p10r5iABvg3jI}(-ANgHhp64HBbNX7slB)}nEtX9E zCgLL`H{sf;NnsTW11E@itY*J7>67Q>`L$)|^pob4^KO`Rqvd6^^NjCb6fyG7ifg>vU#=E-Kl5#1k#?q}-Al}2PQA(2o04nj_Vkn1 zzM4zET+82Ub=tovUpT=s;+{m!n$lpe-_~r;**|0$v^=VDbuX0_`_HxP7nQpV5pJdBy+#=+u{lfOkr^zP^CCE^hk`^`c5e526xvjN zU9Iiz|6`lJhu!t5TDtS;1qo%PeKKbz9?tNvm>u+UXV~%EeK)ooss1wU!OE1J?{KZGJmb|I9W2Ou5x-a^LdLx08Io@Sb)x|7qQ} z_9W@aSwbJ=UNOC7Jht@3w3Yr3>q}nRrp&Xueq*P(@I9_hL$`m2OVU5@;$+e9e4t;D zqxdvDe_yr8UbBNW%9{=4|rWvF{UCBzJhb?(lE4OWHs4 z$<{m7Cw{Zl+g`7}>3_F6{CO%IBywoP$wp9 z{qm*inwwuum41@P;d`YOv`{ufUh1@on& z8l{#h_rFK1efIU1^dxJylDnoxvX-YW-{97ndwu=etetk(%%^p2d9p6aUN-&DrdFXn zyMNrTS#WbVPy0`+Rab7dhCB+|Bl}2yS|R(!mO`Bi0nE!6 zc(0e$1Jy}A$+0s6*L~XX>a|qKg0C~BL9;~btTI#8423tdvS#|u-EwTv;xh)l?l;4V z`yWkOq6?~P9HREFihP$X&!(&4k$q>$)z6<>)mj(zDa{mxj_X|zoGd1S=&$I%S484{ z-_stT0ad7=J3&ljiK*?SSsRz^sqtQ#GE>_;(U>?6%v!e(x%h|&Uk$MBNZ`Hi3{kW!bZAiK<2ELZ#(-E6AXF@_1x{$o}Y+k5V% z;-y8L0^LtinbRIy*1WiM>(;+px0X7$7sUl$0Zj(=p8YdJnSagnXdk_~G3RqF+=Cw7 zoZ`J&FMO()MZ)7b)unOUcd2g4(teb_*fVAC&ZHA=w^!}j{QUG`Wz~ZPbI$R02^rtp zkWya~H}9oWi;rWdX+*YzV-)kGX}3RDiu1a(c`RNd#hTUKCv;J{=`35BmxlSz(C4Rv zE&sTDlHf|7)BnO_nSRP+#!OSt9L}7Owxr{_?4oC9r^)*ib^NL~Phq}zR{GVnHG%~O zmrfZhJ#}!;zW5>`)@3}wda_oN($XI-IcgrZWAev<2Rc(X6)5k1_l&J^mB{R{EiHV{ zE%N^**Ds4U;+`!hGOTsK7W|;ITdQqg@_v~zE->>Jg!1)RBdzb?C-Vx1(muNk*7f|!jR8jZeMft-2Q>UrFv%Qjb z_2#!TFSC9n*e`93(Rx-Aw#mk~=T3FR+fcT(O_zG)4Xk%8nR(`p=vO&0k0){px8{d@ z{q)w8?^FQiuU&uoS2%iaIAH!k&dlUixV?mwNb1|IXIERF*)F6R_G^V0*QHsDz6ZSL zee>y$?s>MG@<(<)t9J zgx!WZ8w;GwS7e{wc3MjO#~sdM#Y7Vmu}RZyY%(SJ6GR35o$mV1*)4oHZ->_HeftU% z@3y#w=I!R)Y4Z54@iNWxj6cO5FVIQskl7=-yCuXa`O+oB&Fs~?+1IfjMx6qbX2^J{J{F{m){l}!Hy30%wAQcI4PGh@zQ14+X9-(#sAMf&-P94aN;E8 z_0pGSoxeHZOV3B0rlYlAUv#GC>t`x~=B_rl{rMqQ-mvXUVBbm&jS{cbHV1BX-DCzg z)*YF-JxfyVzS*FmQNp<7YHVBP1hF)JQ2Dxq_3N6am#gm1qfCH+M{=r`m?meI|D5J^QY$j=QpUb#yW^T#()z!(2~_FLn!CvU z^@s4BFTYN-ZVh*ncZ?7H^kMRJwSe1hiTl&u9tk`uqOYS>S#2)un|0$?Qib*U&X5Gd z3F@DBibYP19`8)+pLXs$?vyDx`F3qt))7#<(C1X=%hun0F`Abab(i!%(B-=%#bA^b zySlbL@$|YXaRE@XN^H`1gE@&&Pp!Xyaq`WH@nv!Wx4%Dsf9Dq|f8P*P?t5fsExG#o zY}1x${adWIO16thf%+>|3c8x}O?;VVmAg;wJ^q6$_QJ&@$0n;taeSVq7d%CZf7O}b zWTmxd)_!~S@7C(+e6};4JDn!KnLjhnW|DmIcjnhm#jKq-H_j-QKBxI}opboN)05tR zi#e^h(4q0s&a}t>ZcWvi+ZTM>eF?Ye{9B)vh*?#)&B^ujYgSI*_K+`oo?QEy@K}jv#;>MV3@6>} zSR!{TQSQ%!*bOeK%LF~jEEPSczqI)x`eMJ;%KdjvTnjFf7u$dHfUb_~oN3kNdsee6 zIXnH0&%GF^^zYf$&l^tqpSqlA#b7<@xWUS5mt|_`Meo#k^KKkeX&$K4u8@9%`_$DK~jKblHQ_-V8=_(rgAkey51!sVO9RwE6y|ScAlsA ztmRWeH!ICZXo}|S=_0Brw{^~jE7onvpqvkr?!4^1ZA&8~KJaZ={bADMoRpi)Hl-ZTw``l;YTgw4xriam zJ?-50$dBfxHr*#{FPmHmFo`Yyz}Q)?XcHfQKjFLf{f_n3EdKpAsYXXF&82s?c1{i} zVPN}{{m@R>`>EgWO9vZsW~ZnUlbt z{qOeoWm%Q{r>{GdDLyj4bN4p4>x7a=wpUtBJ}xx*CdX!{*B5iQc-Nip9vw5@=5Mu~ zv2vf{zh~bH4ub}Oj{8Yic-D4Wm@_>NbUF|b+`e4-(I%f4a{pFx-gBN1_V(+REmKdd zsd~z`Q#x3fTfL-t*S4J9YlP#^)O@ZImo~n3{`AQlLTkWb|+g{t7j7!d`Zro}tmGe4j z@8z3^1V1vqUl_74x_!p+mOFi+vuX#C$0($8@^XCh1jORdzRS+jbnWXO&wj zqVwjpbmHTfFU_2%Un;vEnZ0~Y`|Zn}9rts7h%NJr`gHeZ?A_~zi*`SWmz}q7%6lUj zwZ7wi9@%!!4{L3$u2{D0iyYG>rcB4<`xKnC?v&KNv$$^1(ib-QUZwWk`))f=F|$4B z`cea~DxO|Hla}^qomjb^2X~Zr@%~dkrq{*`U3#T=*aS(@s>qjF`?m$II=fRrH$&Id zTl?(tkDKc}J-C?#Y~?}ibf<*@FMfD(BMtLRCuY#+QW$v9N6i1bcJ0K(>4*LJL!B*d z#BZG1zu^6rNoj&tT-{WcyF9xTy8JiCW7XFi^fhX3Ob#!!TeyDaiCyjsuPF;2ImGn+ zZmat8ZP5>2sT^Nq{d?;w1CP}YEwZeY)+|vzc>VaQdU=LRuR6Dc94`us=ULl#_R@o# z^EaxlEuD93=ZT>9s?9GvUR!_8e%m%}f}AC&UTK?|{(3@Kyzy@dkM4Deww?X&g*>$5 z+LEbjPoAHDI%x7WrRP_pu4maR-Pp8x-yc=bY)jH7xi({;bj!TG z#gpGZO%YP~<+uE#*w_2-4(?e6k}sMRw!Zl9BhPLXd>C$-bNLq!Mq}s`D#!tv(#SU;oA?rzreOPY2(Dz6+H>|NB##oXq4VgfU+-l0D&>s!?{Q zDB$JK>9X+V{Dm1a(o0yDTva$+av&x}b+VqK=IQW=gn%zm6PcW!=f$1Wo;e|LS9G)c z+mIujor`>>j1GsYZB+PdQ9h~RW^wbSQfr?BGADM)?yS-Y+;X=n&+fsIkGKxIlwfQPK?qvbEQGJ%5p%O%zu zoLk>c*>dK5#6LHc#PkWHr^6E#zY5xgZo*aMvw!)On)#SF-&T9u7b81pK zAOBWZJLRTx&AZOU5=&SwaUIK4W$G0<^fU)t6CC%Jv+-Lke97pz#^fOJB}cixOqv$E zJ(h^O|2s;mD0k1UV0p0cX@*cZ{b{w+1V6RxK(JI|D9 zs-*k#=d%^5mWzLP&;4{HQ}r8o@u+U*$NqmE`AfIh6y|rEtvJLQ`8ezac%os%PhQQteDvC4#iX(&X-_iUc;?*8=Z`i`TTt-v-qYg` z-#T59J$6y?%egqC_X}IMaVqP*{3-O@?SZBTN5uN4w#ix>{|C=9zb6eE?eD#I`BL!I z$P=e{i_8yp!pBzp5{y2deH~kEEXI-fEFkQv>+5BG(e;;jJfBPkBS&tTsp-lZS8v!}{h&%<4MR}jViEq?0)p}%fvoO*Q9m%*G~o2Ru?ACPs`C|J6{#`Rw`I8W?%WvmH_cZ z^MmwwGf%!vDCNmN-~aAWJ^Q@;eWwd%{1CBHT>EoQdE1qL{(I(s`F(kpGs6;7jZD!^ zu21Gpy%WfJtt0*>tKg-F%U%~Ryqk6FbVZW4*CIpp{otik8#e7NEcM7PF8=&#_4<8k zjt)_)y`yHHJ#!>h_gzfJ_F21SkL`c++vMJE;mk8~o~w6*)>4VS?Op90rF&e~BfHb{ z^qP{b@wYXuK8wlN?zQQN&*Sj-Gw$!6oP9>lGyCb9883PjKw~CctxoD5QHXJrwfm4q zRo347Ea$Wkst`0%7%<`57mw^?mv(?=heJ2rS#q(aS9>oDr>^^S-6IK6m7A7K`YRg! zljE14cBYu)Tg4AyCzhGtz477g-8Zw9cRdNZ|L|B)6&Rq9TnY$$5^~8?HebX}d z#rAcaD4cN3VdKvd+qEBFCtuyq&ye}mCCVzk)}UPfp~~zP+tS}@otZjK+f=?dte+=E z_pErUaW~7kmalW$W0m*ug3A75roGDq{j(n4m9u2Kv?x2y|Iy#+4pBd=CfzfA8Xe}K zC$q%#$DUi-nKw_btGfIQUG?zWy6@iMlU{3m`W&dU!mwI4WfP8daG_$*OcpCKeaE?pS4ChcRPpYHMJ*uPUX+%TL&uk59>~wZhZNw z^;;Ld8=5VbgQi!+x5S#HsgxUaM{wBn?c&z#?bveX_akOq0m(yUuGO&%jwD+tm zp}Ny;&%c(FUUA*5fJ_l8s83yZqww?zUEBGantP95c=GJaPC?yEMP71@;4;`iJo4lc zZ;w--M8zaT_J%DvaAD`{@K0W9DKqlgBRNkl^kp+V94d8_`CQU==9XZ_OE#PCwN&k5 z%DZ;M&nT!mOZ9F}yX4AR$tjP+`&FyA$4- z4^N)9iF4)|GodLhlX$pRE_VJSvNvpj!^fCeal06-7jC;daaw|9LPO~(Kc{!Te7b=l zb$TxwzZo8TB$&b)$N1Vb=6=7xuGd?lIz>CKc%9mx-FyE@&y|apmHT_nNSr%+E$ar$ z?6B3xM7YJ@-;Hj%%n_`t`?IjZI_Swulb2=(XPsaz^N!LCo?y`=XLhUW#?~d(gZj_6 zCQbXAI{&q{CU5wi>P6sj^~+bk9AxtTcrtG`>)epP^QNC!ZN>OrF<$0W2ubLeD|KeD+#D}d%J-ZFI=f3qY`uAJwLjQMztzmbo z_?aK87L}fVS=2pIz|eY=@uRlS*?F5j)m7hEWysvx{aw$VZ?)i$*|!gi1%H!^+FX92 zdd7|1Nmey0at9CfzM}X#e7f54>zc|v2>^Cg6wUk-5uZWmhK2^ zia*1(S=79$e!aE#wWX7%RaEUbTJpeHcE+Ey!`lTq{nKA(Zq4@DS@84TQ=vI-GvqQ) zeoy5$iTCH*&tbDy&)|}>?irqBUe9d1`QF}^YG2ch9;V2bn!dfHuy(4N?u!%QN^2R- z=g#An4U4W=IqlKuKdL!r0wLq&Yt96)W;Skdh^jlAlcx4AtMIu~`_((XhW}FUFaJ1C z&NI2s=&*@LwriUfXt4WI(N%cC{$c~9VE;7Z{^iBlXZSz``=l4K(DE8wu&=oIcWeK( zAW(OKtJP`xTvkK7kM&EuCiv%wXOcP zbb4IXkB9Bc-J(h+zRGL<^0F%GVcz~%_t_h^R4M81jmR)yG^o_Q>9WzMci0Jq4l#gU&Zq-wlyOZ0x`^TfsGP!iq4{4hhPH>&^ zz4+F5w)xS&b9f*ANG#TE*ixmk_VMxl_wV2D|M94M`@O1c-%C<^>~q}1p1xg{GO0&q z3F{>(t@nu*hqs(6fA_NWb{&J#&XY>reI2b9(%T)QPP;`NQhKxYhLcCPq~9z{k3*ka zx3(o*kTR>+@L27CY1Y}aQwzS{NbbM-U2YvmW~(^zaMP`ik2Vrif`; zGrLXMa%cO41xreQTv)nw>))+gz1#Vo?pd@#^>_L*>DfOG-Q^t;u9(oM2MxW&@2*zfeKqaEvb8flUr*T^(BCid`81Ej7I(|)e!=uxX7{tF>)c+U zRC$?II^sdxo|BTFRpgG|eYwB#>!;wd75~?rzn1XW(6H5}L~BXudE4(Y)@5sc{BD!Z ztN8cxd3?pgR_XjbhE7qT_A8A}Zs-%~;+g1n#7Dg177uT^vOM1&wW^4ZTBSz|RQeZM z*c`3?xO`pIvK$+QwXGB36Sotit5h~1s)Mc~Z@GC}jC@uanXi98eU3|`=HV&c?R`sb z&a}w<*em)j#YV)!Th;2$iFLboIxf&Ux=d7ep{vS-)5njcJ$}}rR{Z^)&WF=MU$VPZ zciXD8i6?gFBuV91>3bJ%St)mRqlVR|UD>=7t_4lLR{Q;Kc*KSfkv+ejFYdQn_3!5e zXa27f60K~Mo+bHx3{WaClKEr$^7yh;kJH9Bx1Z>P23sb1faYh92?}?8>hrW(dpdZ} z@nug>JMFD#zV>UOFk`~0ij2d%)pj?{xKuU8EvhW@luFpltuGj-Hm=$b_%xd1)lm=a zIH%yViLt*FwbdqXJ9q2pM9*VA!e;_=z1De0{R_}Nc=5s3OjcpD_RSgJuS+>z*Ye1I zw50TI>2=$`UoNx8-Yq(<%g)Yz-tPCCt=HqE6?IQ{y!QV4Zf2UYveSOkCB1v<-Lfvp zXTH4f`@$ZTyWE_&#k2S>F=Z}2nyKn{B#2}B=GMJ?XHA?I{mI1h^qZiv^?aV*J7V(k zli901wPT!K^D{iJYU4e7?#*n+!b{8R-X73aeAGOxY4V@BtC%mXs;=6;w$Wm(>UX(& zC6|5A+kU^}J@roY`@J8(ZmCkyJsGpa+)Lh%*CA?`lIE1^(oM zuM@(496M_6wSBE3e_T!Vju4DBq#0-L-Kmbq+gKG|kR0Tz@`JlD=+*Z2Bl`1;^!F+9 zgQ|{yRZ+L{QpC;{HQ({=P=bvJ>Ac*1W&OkD8gZW_lpbl5GfD7B+bPi5w)c(L;azL@ zhW>ba@ZP(|&d-yR4xHBAw6g8%=PmCom*lN~ulM_qvQN~Ws!tPZx3*QdH!f@N`+WPb zar!xp>km&(Ru8`3VV=F}t;gI6<<;8)n)Yh{XF0;Fmm=MIQR}LUlz6UZcHZwh&WD3n zY%_TB)C|nL%h79Y}Lek&f3)zT9||vUYNN4Q^D`I+s#iMyL@kpKF~>#g^5Q&8+TIV}vR;J^3@v7I9JiR~JBL4HI{!IbIf7$vN> z_U63VCbRMv&M(<{v!*uE!&fUNs!wnBbB40T+;_8D)|pn-J~?ztdvX7Q^;(rbPI|{) zGZT=$?S4Zi^2pBVGw!^-`^H-Ns&sAQhPn5rgd`YRseL{w9NBGjrAp=0jWrLihbDhI zBrX7&7dU)k>Fdn1&6R>-wU+VVnTGv2{-;_Fh{@cVH&fN;t_inzWL=DZQs&N-IQjQm z)fxgOE3G|Rd*=#!%h%dRpuwQxyV?@E6SnxwbGK>)jRX};xVA#U`OWjW>5mmP?}5f` z7J^5AR@XfL_kGd(qs~HGe%5>KQf*&lxT>@tGz;hGvHJS=gP_qL8}R6lW0bZ>)WiGW zAqL2j(V5wxJr7k9pLb`^;(BVV_%vlDkIQRY{h6W8iw?VHKMSiat$%yfyM5l7g)R#{ zLCZ$vPWJEo-T1Yrd+x%U4rg}qKA%!^eWCX6)RX1a>z+;s05woI7uLV^n(B9aAB?Pyf^z|%G-A>f2(~ev+_}%rg}c7r zcN0F{D)WfiD6;KTTjo<6P4}D|=lj&?z0dkKW63s+{jsZbECYCdMsXWv zthKLHVo;rV@x`f~E0Xgzo5Z*N(5zYun)^AnAT)A+%dIl^sB61>*>(vnd^wGIcVAaE z^ELr9-*)bN%eC!V4#v5^m*>Psf9$;{udWrj^kM=GvyQ?{Q+MkR)b62^wfB)ied7GaxxGGqBhUd{4wq*8) zZv{P-qAmOCo*t^2w4dzUhRKOw$Fpulag{lt3dg3-OF5AV_JR+>vJdg$1DB# z(($9=`-GT{aV~q-Glf3*aPZzcN0on`8QO)5znkyc>=SF1*}1%3I==n(<%1{k&1$$O z{wUctFKqX*DcsZF+pc`=H+##I>Me4+wuhhI9Z@e}?!_FrqSHj>_M~eycGIU7`MkP) zqP z;pDJ1W8=c`Zfo&f6=!3GAIE>ImD0Z`X!cCQ*r$0*SPEE~f^PU(ukhbndxLV%wd%!r zPMeYW$4Kt8cgdCBn~IseFEiJvW%}lUl?G^t?0RG6b*TxlYwqh)=ONDtfcJne zbB{8fwrFbp$|-9mrA{mPytZ)ZbcKaaUu?RY;Q4*gy-Ay`bWXR+tzP>m>0Pt?#Y;=e zpJ__I^O-cmDqS_}+U?ouzj7p|-ucvb%e=#0Ukfy3wR(T0LT$kMOOHep*0N5T_A27s zstXH!ICOYHi*OQmUMdoOmVC~rq)1;}Z27mTK1L0FPUiY+)|P)4Oxm&~YPvB0yKRT& zPP(?me$DFAM`f?P=B?dT^*~EgG^5fzS5Eu%Q`Sqb=5Aq=Z@XKj7;mX!Xz9Vd#54r5 zBnRP*{tWC_4LB2iW6R8)#c?;`|3btf93=+Y3|j|Q46oE0F5%Np5)Bk z3yKKa3Dc&Wn5kB<)p(X*|GeK!7cMWFaI9s@g2xiAv?^w>eX<&a&|IC05R!jxBfm4$V(cFgkKm z_1j^O=TG|Qr9Kw44prxI|0J>N>&N@u_PywfG$$h3`YCxwa;DGR*BzU8^4C%08zOTO zy{7K0tlj@ah08~BS&UVQ%Gq;AJiGJP6sSL5cpy^i;zPHxyJvZsLN(3SW^k@GIGxP%VHF~$a zxirOdjZyYRW-aE>#Kot!3tZ`*7`CTnnbxi6y|JpTTW(xQvn@AceQwYHX8yUCq8xtj z$^x%0;AlFkX}!N{rhK`cbIo~(I`o;CTV-uz>ctf;$l zvc>rm%{ve2t(5;|rC$GK;jAz2QC45>y{x!c?K!&-l-eNceLT8b3s`I93oms|&54x4 zx!ULM#A!F3?q0q-QS9N@EI_pI>wdgEnExbdY`b<4WfitH=t7nNwP{0^0B!rNc7dH+XX)<6H=1*w zE9>vv%)d$OrR|z;TFqgOnaB8N$i`gqNqg5-#m}u$#4qsHe^u4bZz}AmD_Ck{|GCG$ zUs$)P$=9xT%cV14ullz}iE{YA>-&D;r-#`q9pTmLK4*3Q&HWdqI8pUjozJ?Y(4MV9 zf9}<~Z8a-@qNscG<0&rpIoEdVX}|X7ZEa1NJx{LBs!o=AML(~<-zK<3FT2xS{^ejb z$E8(!=S}-(n+tCC_a=6>3h#1^joubJ?MrOD&lY{BX_W@-bDGF#_ZMG!w0CLOBHJ6c zbJH$w5{tbpC~>#CZ1@&k!$6@UEP_P+rvgkE_+S%TYJ9_}^Afj5wsFJAH%8WkFDj z{!-Jdgq5Nvg#}`i>oViheokL-`*eBy;xh)kmkyP%Tmr2_T96|;|EHG37O8y?7ic?1 zCBJfA?HP62QWiAi1X|*cDDzwW4p$=$2feaIthanIPDDC23zr{^z> zcdFcc#w$K$Ls7}iybVjL1M^Qt%7#7Oy*V^w^Ok2Kk1yY3Dq8pzPdzOFYZELzZ7=Y?oJb^Il!LGo$V0#2WMKm*0r#nSEUJvUGLy0)q=xKSeM8 z_1fP%KYXn)GrNE3*0oJr?oBx@-FYYAUy)I|3(8+xzC#tF?2OE=h&MDuK(~ z%$}z_R+*mf@xOj3&C+wtq^tMt&JA4p60~>MN_nl_tR~(SstRjYu2bN@By})HI4(nE z3G1a-ja!z~Try$Ly(jByCinPa@$)>}j~`V!x6IL*+BiYp$|b7AD^&T2@Be)fYm2Uj z+^q0#FWT-)O_<>rYlK zv|=`V_P#b}dg@_=KN}Cr+zho0V&kd0n7cdT(E+XXk5024=2pc{6_KPu=o{ zOJ2FsDTMd%+1JMZ3;Or$cHN^<&GoRw)kgmGy)(ZLeQs5<(AB^Dp2eBN%_ZucMN;ft z>HUH)7iA`!Z9Lz8ygK=adL_?YzZvqDm&I*me?{K#z3ULA?G?3**>WY%(Y|Q6yqAp! z`OM^;C(oX|Q}DCt!ml~eZ;HIHz3|)4ykB@#Ax*<|R=5%8 z?(~l#2S2$UU4G!*lupFLRd4;WzGE>myYM$=!@20S;Kuv z==svhBCV>F8El!RYHJsKzaTxuOXHOF)XOg?`OXbpQ~OOhLg!{ksm7(C9h>W3xG>B( zbaT4zr)MUYHhBlD8Cs`qoh!2oX~1XpfwG70Yg2YxO`Gs?=dasUUviqt^j^s%)ah^j z)cVS^c+1<82Zr6cIZ>CAE^p*wpB=6w^iYRQyRn;1$>QlWPBV`6#ScF2+`UX{m8saJ zNyjH{UtPUYb?J7O^`aUEHus_@hK1H;#0gaw-HKtk#FW|kcuR`*beAZdmeV&6Ejy%; zdDLrLo!fbK&aQmtsI=*us!Khh4m~ZZmbSj(9raKss{T{hpEts4@8mpA?_BZc*@AN) zXT6^)=jmN??5DO&e%$)E>Lp=M7R{YJEg=2p$DO+qE=w_Hs(zbRa_JH4HZ&x+w5d zwB;i~kB?I=>^2>cIeW;l=c0M<7A4U>v-}g^g6AH!arqeb>8eZ4OpU5jrDAgO+Yc)H zWnaAK{OwEj7qL3s%#0JPn~E*fTXz^(bUm%i%=;zLnK_Zo2-Nuh^*ZyV{EM`UI_4+t zN=%EeSSWpEYwGP(&-HN={Zw*d;c;faO;g!7bakjNe5ZEqZfBx-%+%cY`#Uz| zIW5-Oezz@V*2i~}m!~{$sOc^Ym}cO@cdsYbNo%2D=EMtO{~Xo|lzx97^1n%-^^~4h z*V;qX{NKv>-+YJ`d-d**(+8Pp(}KdoHGhjO;mhO{6`QMb@0sX}mibTnUOaGp>}Ih% z_0W=|uVgA}_B{LXZ9}Td9+SQ`>)w6i{r5$2it=l*+tbMhO&V|oc)6Vo&?$N&pPBV>L7HnI| zxsvG;^E0&!MlRc5nfLtKK`TmM9-SCA+tB*i$9+DbRqve-7bIVPd-sjx%61Pihgn(X$=?roWs3{Fj(?*b z*s9WV;i~G|&FSa&eYxb#Z~v#jeu?SPuNT&eD9859%NH$4T`TxLUKPAX-vg;G$UNZ@ zrgJ{JMJ;-Zkp3n}U9k2D$0aX?wVCC{{FxthLf3k73)_0ER?R${W}JGV>dnUEud4aO zTeeL4JO|W4h@A*p477}UZQSIi(nohh#msK3n|f-!{NG)7Z%_T?+#c6x^0rM%@zs0A z>wDIbQZ;NYi@uciOvP7Oj%!xZiF3A7)qm}%nW@U~aLH5q*t^Rff7!y@Vtqz8dZ|q0 zvMq`VYm*+^e!o-v=ElZH`JsnCpSS;ih+F?o#p7PVOGUd|Zdd>9`|2U?`?{{PcHioC zuRjQ%OwQQ!Q6T%fPyCmX7uzow@vUB}vi9uRv&vIt_)aN#o-TpT2v3l*HMnu`*wo~r zVx#|l`(ADCJE2*&Q}s0GJ@K49F8Hnn6c<1hXzwb8}_q492 z@c%VmF1lZ}m#=!UP|nDQeT^OOu6R(vzqp3`(xyqquTtLX8l^XHam%`F6?#%^VtH7R zyDGQJ+6B?>6&q)k&zPecUU8IbJ(n!Y+`n1k-e%yvS?|`!TM05OEBKZ=d5fdZ6T|3aR0PRhZkSx61fq1{ppgWlS73IdCyd3MJ-I+dSuDfiaTG0maEQ| zUlOj+y|!@M2AvHD!xPq|yna0Kr-I|hTn{Xx{_eZp++E|Pqp@%Giuop%X4*x&7P^7j z#8Im6ANrc#{c@-H{N9k0d%xe4j`v?Je97z0!ed>o+u+5ZI(wd!l#5hvcq{ry_4MThba}_P=&xs}{{4AR7Vu16u>SP_6?=IOUMk&uldpK|js52)*9gqZv?|(_tiv;# z>w#^|r;Z=D^LDR2ux9zZs#OKb-yYbe)aq<)@4l`yG3Zu+uK0;_Pv?j{a=O{#bLa0L zv**WF`8M(1xpk&9cZ#<&i8;HKR8D%(U-j-ufn741{}lMZ>V^E`K)FRaZPaBl*1z?l;^2>(%P@o)cKpX2i*4Zhcvo z{BGB2lQm%nt5+nhKA;2YJ#gi&PfJ{4$rI&#{zvYo^(*jdeIT90(Y&L%6Tr{@WrGRky{FiqL%KM zcDOhAao_5v&$45$#|7%#X}h;mP=BlEVcg0#!JoR zoP}Cd)z&J0mYa0F+2ZNW+P6NkKlM1f_CG+-I*+dVKSBhGnD{vtr?TpD3=iAv4)F zL>v`cANp>VmUREgy}_xES8jT@f#+;0pNw{X|KuqXrn&_^4cS>+!~WvS)n66h9b8+K zei*%4k?#KaMh&=^kbg(^nf|&{6O9rsbnjYOgqknx@vc6Hl{ru6e@3f^SiOCGCo9gbf0{dar@8Cgikhhx zuIH}XdGhwzy+5BFT&i-7_lnk3Q2(JcJ1wcRWSe9Cys!RIS-frQrWo|a@?tiIMn zeQt|a(X^PxCo0KxqS^ER`h_l!n6`Fe1-~d!b%EN3*e%^1nNttHPx!Pwb!LLX)0iuk z2O?aV+|;yVw?ucy_MAu-D=*y_y>QYKF{kT`%9QKYW;idsuq0I2zxZdibREmx8(Wqv z-Jaa9f8*vcp;cGsZJDzAWA8SRm98(uN_)D#JaTtZP!_yud3*A-%O|gD1SC7|x%Oen zQIx*HHigWaPb2I*xZRJkU(zxQx@5F_%H7q@mxT1D-@bk0VB96H=@-1XtIk!mPH5c9 zeyK=L%US5F<7tkks%_^yvV_sq+rA%kRmn;`Z5|bd=O`jGz90B2VvdPm zm5PbaZW(D!fB!m=@x5aDahLZC-$#8p-dVBsou_x+x`5ovd)u8v=5l(haE+RHT>NcL za?jk)-A7J)}UhN63TW{$xf7?CT zXJXz_vGwG20vMi2et&rZ)C;JPxq3&u?<}Yr(6kKP4N%Ayd-d*%-uc8NmWa~LPO7%& zyq-Bv-;?mtBdUGNooAm+EY|Dp-<_bb{6oVg{p42@rhWL)q9^zwXYsFZ0oDAbTB0*p zLE$`Y`j!QU_1`h%igB6kv0w3fwp8QGr3Wu9SR7fJdgXQIM~k(;i#_`<2WdOrad1(L z`dGG5`l{h8)h9BXjXmxm&)>9c$xtt^+j1cr)RDXJEdTpYmW4~&O&=ZKY4PvGu2UAX zw$!@VJYUYV%^^x)g4l6z4RI@L=DMGsB)2R$y{>jb7-O`8?uo9+(>fxd=jB~h*4_I0 z*Nhd(SG+ZzdT^u&1kT+oe923O4=UfdMM2v=YJI*snBOY*+UEU3+039lEeaDZdWA2U zs?~4c!d$Cd*dfYg+lew8NZnuCQci-rsK#aCXi%ihDw;-#3 cP596Hh5J=utm+|U1_lNOPgg&ebxsLQ0Egn7aR2}S literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/howto/creator-only/creator-logging-viewer.qdoc b/doc/qtcreator/src/howto/creator-only/creator-logging-viewer.qdoc new file mode 100644 index 00000000000..963449be581 --- /dev/null +++ b/doc/qtcreator/src/howto/creator-only/creator-logging-viewer.qdoc @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Creator documentation. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** +****************************************************************************/ + +/*! + \page creator-logging-viewer.html + \if defined(qtdesignstudio) + \previouspage creator-quick-ui-forms.html + \else + \previouspage creator-task-lists.html + \endif + \nextpage creator-telemetry.html + + \title Inspecting Internal Logs + + You can inspect internal log messages of \QC at runtime without having to + restart it or configure the logging rules. Log messages are helpful when + you develop \QC, need to investigate some problem you are facing, or want + to take a look behind the scenes. + + To open the log viewer and start collecting log information, select + \uicontrol Tools > \uicontrol {Debug \QC} > \uicontrol {Show Logs}. + + \image qtcreator-logging-category-viewer.png + + The viewer displays log messages from the selected logging categories. + If you have logging rules defined, they might be listed on startup. + Otherwise, the list of categories is extended while you are using \QC. + + \note Messages are not cached, so the viewer displays only messages that + are recorded after you enabled a category. + + \section1 Viewing Logs + + To enable logging categories, select them in \uicontrol Category. + \uicontrol Type specifies the minimum level of messages to display from + the respective category. To change the minimum level, double-click the + type and select another value. + + If you enable more than one category, you can specify different colors for + the messages in each category. Double-click the value of \uicontrol Color to + pick colors for the categories. + + To store information about the currently enabled categories, select + \uicontrol {Save Enabled as Preset} in the context-menu. To load the + saved information, select \uicontrol {Update from Preset}. + + To save the content of the displayed messages, select + \inlineimage icons/savefile.png + (\uicontrol {Save Log}). To copy all or selected messages, select + \uicontrol {Copy All} or \uicontrol {Copy Selected Logs} in the + context menu. + + To clean the content of displayed messages select + \inlineimage icons/clean_pane_small.png + (\uicontrol Clear). + + To temporarily stop logging, select \inlineimage icons/stop_small.png + (\uicontrol {Stop Logging}). To continue logging, select + \inlineimage icons/run_small.png + (\uicontrol {Start Logging}). + + By default, logging categories and messages coming directly from Qt are + disabled. To display them, select \inlineimage icons/qtlogo-16.png + (\uicontrol {Toggle logging of Qt internal loggings.}) + + New messages automatically scroll the message display to the bottom. + To stop automatic scrolling, toggle \inlineimage icons/arrowdown.png + (\uicontrol {Auto Scroll}). + + By default, messages are listed with a timestamp, without message + type. To hide and show this information, toggle + \inlineimage icons/stopwatch.png + (\uicontrol Timestamps) and \inlineimage icons/message.png + (\uicontrol {Message Types}). +*/ diff --git a/doc/qtcreator/src/howto/creator-only/creator-task-lists.qdoc b/doc/qtcreator/src/howto/creator-only/creator-task-lists.qdoc index cc61374e7c3..e337a155739 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-task-lists.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-task-lists.qdoc @@ -32,7 +32,7 @@ /*! \previouspage creator-editor-external.html \page creator-task-lists.html - \nextpage creator-telemetry.html + \nextpage creator-logging-viewer.html \title Showing Task List Files in Issues Pane diff --git a/doc/qtcreator/src/howto/creator-telemetry.qdoc b/doc/qtcreator/src/howto/creator-telemetry.qdoc index 8ae161c74e3..23e01ca7b8e 100644 --- a/doc/qtcreator/src/howto/creator-telemetry.qdoc +++ b/doc/qtcreator/src/howto/creator-telemetry.qdoc @@ -28,7 +28,7 @@ \if defined(qtdesignstudio) \previouspage creator-quick-ui-forms.html \else - \previouspage creator-task-lists.html + \previouspage creator-logging-viewer.html \endif \nextpage collecting-usage-statistics.html diff --git a/doc/qtcreator/src/overview/creator-only/creator-advanced.qdoc b/doc/qtcreator/src/overview/creator-only/creator-advanced.qdoc index c5eb81598c3..b64bc842677 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-advanced.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-advanced.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -95,6 +95,11 @@ corresponding source code by clicking the error message or by using keyboard shortcuts. + \li \l{Inspecting Internal Logs} + + You can inspect internal log messages of \QC. They may be + helpful when developing \QC or investigating problems. + \li \l{Managing Data Collection} If you agreed to pseudonymous data collection during \QC diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index bab4568bbae..ed38c906cf1 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -228,6 +228,7 @@ \li \l{Keyboard Shortcuts} \li \l{Using External Tools} \li \l{Showing Task List Files in Issues Pane} + \li \l{Inspecting Internal Logs} \li \l{Managing Data Collection} \list \li \l {Collecting Usage Statistics} From e310ce43dc99677a00860b54de46307dba8d4b12 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 7 Feb 2022 07:05:25 +0100 Subject: [PATCH 60/67] StudioWelcome: Fix linking on Win Change-Id: I573ca5b3bd730f4519bae27e29e33f627e51aa81 Reviewed-by: Christian Kandeler Reviewed-by: David Schulz --- src/plugins/studiowelcome/studiowelcome.qbs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/studiowelcome/studiowelcome.qbs b/src/plugins/studiowelcome/studiowelcome.qbs index efb5c64e4f8..afc9e627a52 100644 --- a/src/plugins/studiowelcome/studiowelcome.qbs +++ b/src/plugins/studiowelcome/studiowelcome.qbs @@ -10,6 +10,7 @@ QtcPlugin { Depends { name: "ProjectExplorer" } Depends { name: "QtSupport" } Depends { name: "QmlDesigner" } + Depends { name: "QmlProjectManager" } Depends { name: "app_version_header" } cpp.defines: 'STUDIO_QML_PATH="' + FileInfo.joinPaths(sourceDirectory, "qml") + '"' From ea7b370fe9ee687000501c6c39632450b54fa4ba Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 3 Feb 2022 15:11:15 +0100 Subject: [PATCH 61/67] Doc: Update CMake configuration info - Initial variables are now listed in the Initial Configuration tab and current ones in the Current Configuration tab. - CMake builds can be stopped. - Variables are no longer grouped according to their prefix. - Kit Configuration button enables setting CMake options for the current kit. Fixes: QTCREATORBUG-26983 Change-Id: I0b8696adc9d442b4c33c6e3c34739e5583254cd9 Reviewed-by: Cristian Adam --- .../images/qtcreator-build-cmake-output.png | Bin 27900 -> 22973 bytes .../images/qtcreator-build-configurations.png | Bin 14633 -> 7766 bytes .../qtcreator-build-steps-cmake-ninja.png | Bin 34365 -> 0 bytes ...qtcreator-cmake-build-settings-initial.png | Bin 28157 -> 22943 bytes .../images/qtcreator-cmake-build-settings.png | Bin 20446 -> 22868 bytes .../images/qtcreator-cmake-generator.png | Bin 0 -> 4822 bytes .../qtcreator-cmake-kit-configuration.png | Bin 0 -> 7645 bytes .../images/qtcreator-project-kits.png | Bin 27878 -> 29606 bytes .../creator-projects-cmake-building.qdoc | 93 +++++++++++------- .../external-resources.qdoc | 8 ++ .../creator-deployment-embedded-linux.qdoc | 4 +- .../creator-projects-settings-build.qdoc | 6 +- 12 files changed, 71 insertions(+), 40 deletions(-) delete mode 100644 doc/qtcreator/images/qtcreator-build-steps-cmake-ninja.png create mode 100644 doc/qtcreator/images/qtcreator-cmake-generator.png create mode 100644 doc/qtcreator/images/qtcreator-cmake-kit-configuration.png diff --git a/doc/qtcreator/images/qtcreator-build-cmake-output.png b/doc/qtcreator/images/qtcreator-build-cmake-output.png index 4311c61249a06b837f7581ba0151536bfd3cb333..80040e8bfe6438872ce566f6c3783f0bd3baec30 100644 GIT binary patch literal 22973 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 mY1f2LFD@?T1_^&Y`JdTt?WAK9kF=E55V8t@~a0 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 z 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 gkzopr0Jp)NLjV8( literal 28157 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 SOkrSPVDNPHb6Mw<&;$T!X^;8< literal 20446 zcmeAS@N?(olHy`uVBq!ia0y~yV5(zaV9e!UVqjnpllU;7fx&;Nr;B4q#jUq<@Au0d zFMa;G{)FQmwK9vty*`0UmUyHj^%}}_sa1L&+&G0jn$u!q#-wSfFJ1M!Q&?uGC?r0P zJ#yp3xkr4aO$;wpmu;?;;gxTSeIGm}<@-w}>3{5An@*~Iv*U>VyLi<(%hFZ5e%;$w z{_ERcxf<86CFNJ&u8Izw|Lf}aKc{Br@2g~IYd)B;!SC#Wr#m-4R|wsoWR&sthZT#X z086O`v$%rTi&h1WriQo$;!O%1OjV6>97yyF)+$91|HWMHs`>xkn&12Jc6mUL0!Nd= zg6+v)q>jAXxA*nd&7qFh7mD+=fsDD=cX9P3QHYWESQk$3t(yPym-N?$AHD1Co!d_2 z*ZqC@>)iTy{o|)J3Itdj1uoqF+Vc5ZX?sNZ`FFRkpI^MfQGmtKAwPX_oZaU&PExMC zV8=Xfjr-~+VhVQ2TZz42Z8py=cy{@;gFeU?U&{LLJ$@a1{cvtr{`*hWAjfgMIJ!O( zY?A&3ZbtzY#=Q`wF!~GAUXbN1U(Pk%GrwQ+nU4n)MssI1atlbi>ThCb0(k`*5Mci^ zL4yGlR0i%Wd~>dnk>cUk)53#9UZ;+;)_=fXI0LsTu>=~e56yP%Ku=3 zLDDkWn>TJa*d0h%82X}ilS$P-&TMt>?uFNR*mHs-3t4LcWn zcgtMsw%31c!_)q%{C)O6pPZZe>c^?M{%VuI=P#ObFid9emar@J+FzaSu{N*esNya8 zzhz5!eC<~E7quVnJ$$%V{Bn9#N1TbuhR_Y`Yo2Pq-}AZer@85?r)#dB?3QAV_WWY? zF6fupqVJ!co=)GjG5b58`sBma*RN75f&}k#cTcg@N>*jg-2TM$ z|M$|St1MBfCk$7+7~BxJVExr>wfA(rx$h3GyJu^&r~2!+e@Fhj_P@C*az5|*lC1Og z|NrpU|2X_VXqKfx{Vs2{nY=Il7Ui0+`u60nbi7*G;tV^ztL;Z8S|+|%Xg9cV=|=v) zXZicS->a4{G)_PB^A+3WEE)T{J9q0}vd<4GRnYjbuB?T9;^a`(ri0V2RW;x1+Oyoh z`rE9Ti=v&l-&(U zmV6PaCCIaF*Nf7F>6-!@F9jBstWJ2}F>mAXhcnfmC&g>}&M`Te(|pf6baT?|_C;4G z__|(YnpnocCT&u+TB-i>WTZ^}6X}>z$ zbXaJkYxC!SzZLXzLN7$~$JEaKz$11 z{cZj1v^&-5DgVRcubtQV@;xJZ@${`?CA)god|D*WA1(Xk(!CYyh4wL@3M5bF*e5fH#BB%AD_35a5^%rw9%o4tAGS!#hdC_{X;a=Da)9GOk zSu-Y|Vf$jo*L<)eH$Pw6{Q3!Y37svH7qgq@TbJh*7Z=~SW6EiA(xlUO;des`P#Iv9 zmGA{BQcJWcTb1opV!i_T!IzJBnBDc%Sfnk9~2iPM$I2 zUEb6!N3R;0Wj~g^!otzCAl2#pv16Ud$NPAHKUJFSF!_w@!tZ}>vx~Gpzkl!UO3tjF zpld=?=9nb%e>?WZtpDEYqZi8#By%(=WX!yf-H=kJm6x5JZ6XybyJF@NPyv-U$KoR2 z-u=I;_kUM^zgIoQ&#bR}YhniD=|aYEfHeYzs!oi?^ux5aWCo84msiLm9CtqabV7fe)p?&~(@#s6`E2>c zWWeGmu%&15z2#vCmdSth+qm6w+qLLJn`AD&+rhZb`n;L$Cf2;zTl4eN%*q>EtJ`xp$}8SW z?a%TH`M=Bl{F#eBM&hk;zv}`&#OdGlQ$4=^$haa9?CsFe~tG3@>y6wd&A0u%6oAKgB>gTg; ztG0hvpZxbW%Nf4&TFW646JC@awB8ozcscNmPwAU;E#~F9YBM2~+ZS-9cHz~+?~jgl zFMpP}*t)&F-0jVkvwuBnPsQl)-L*Y>|F^mS*^3BEp6ZK>_LzQH`|rkm`z0^7hO4Y; zjN`D1TD$+#WcB#pFV4J{cNR$b^5nan(bS}}FH+Z;{MR(hOkvt9a3yMa{O=bpZ@+gI zc#`tscKR1TCgv)|jGGsJ|2m$LrPy&Qr0eFzY`wWLjK(KfsuWk)R_*`(F?jpEc7+os zL%Oi!K-Mb76{c0^?^MY*DJ;KvareG`iAfgK-`;%t_N}#Xmgg+b1)k4-9b>z|?YQ=0 z^{p+Y0xXtidmy<`UV6*Yo!noX0)+OO-)~nqv6}mfQ>}CULp_5JRVJEyB{o`fUw6Ax zn(**?$6d8Ms=jNqRq_R|A9~1p$XBt{_{?7}_eY&O!*|K;&@?OeviCc-cu`H!_sHIp zjcJ!A-~avNwtu?+fB*Sk^;h@&JKLu-{e3cV=fnEHKbv3h3T)ZKRMp;g@6zoB zuU=oD!Dd!;sm1n&wET*OC4QXJwSOl`cRde0Ijb{{@5F-d0y}5c|Y-j*Z+I^{Qu{4e!ru64GWe|T`A)5e!_*_vAbSe z-Dsk>K#Q%ZdWuyv>w;~o>simQd42!uwHK)!b6NK`E%SY`w6?YC#O$950mrSr-a77I z^So|ld;P!D=l{Q)-hWTyf6e3i8IRBZyL|im+t79L_P>_L*ZtdWU%eo{bwTPi%?0HF zFM1EHT-4n>N1CJS=aWx6Bz}h-c9bqC&wq4&i_7}Hy(=$Bzm0I2x5|%$m-UOBU{(Gd z{jVR+*MIzJ|M$^F>1P$+FYh-!ZeJe}zv|zbFE1{OpPl(#Zsz0twI3YzOU+xUtRL#S z`VO<>UV#hN7GI3qymV$ZCh#u&w{(Ye?M{OvpK)qi}3s#8@_FO z|NqXBpEv98_#S)dQzove| zDc|r}+TXT0c8pgx&Z~I)SpWWx_*V~`<7@u)@2~jstC!urCWX)L_rtu(e|z2kN6b!0FZK!ZXwMxGJYu(Cr z`@h%E|9==SUwdBW|H;Mm2FL5azkG4^_u~0=X?^y8Uouxmul&ST9JKe>-v9q9YcJh< z))aE_UdZE?1$7x^U!)WyjdF8yd)*eVW;UH{GWkH)fxY)1>Kv;~Y2O@QGnb`$YWb0@ zb&sExL^oXx%>OAi;jhRivEXjmb0^K~8}2Q2dcT_g-;4KLKL5V>zq9|>KELkOdFiIQ zU+(oUF0PJUd#ElgkNZGOU5nx_DRrsZ42u`F*AhE|1v1=sh*i|o1X z-M+BskJkOBuf^whyr<3WU4MJk`tz&wWw^g|Wh8$r>AUxAd;7x33%_6A-xvSt;rzd+ zpV$A_?~hyk@6Y-EfA{|WWS{>pv@qu7=Kmkqzh2${Ycu|A6c-|90nt3WJrxUuONh5$dqsQ|*GZbY5Hc zk>;Nk8DVp4-aZz-zmMN>!sU~F;8t+r6>i7ih2M9}&;RlFw*ZUfOfN=Ifoc-}CGXEa zITlC1xeLHe*=OnL`uqNzdcQB|)zj|u#ot}lm!^SB;H}plZ?})Sf3sQP#LLs$?OvHz z?XP+}_5Q|yzpu7t$Fo)`W}Gbf6K!w!%$EAuM<{5b86Rc}{w^~~31+kO6G zbEOoxUir$pSMP_++n=lN|GK7qf7h;`Pd4lCN#WbG&Mtr5tjYR&KfIYEe^5mj+*S!= z+uNEOXSyI%llzO40E?q`>%DGq{duz{|2@_^-R=DE$J6!x99#L^{eIQaxu2)=O!Yr| z9Z_Z2etpwA{mz{t#yIY%>Pz#g>q7qgywsWwshxhjFkQzwF9K5Nb2Ke@xcK|*`+ueh zT)4gBf@8qX-N(01wp)M5R`B~1=bE3PljfDLwN}nAbgx@Af6<%UUeDVa%@-bPS#hrK zQXQvjlu4LiTjp7m@%)LY+&&|?YW|kELtA_}_GHG&|GvW^+jnw}_Z5*x zXN%)j&9na`db)kRT=li(m-aE;pXBqg`n}nqGwiF4>m6U1PWM~aFf&Duxyrl0an=5N z&CFA+?uh?Ac<+b9_f77ryxfEr+q-?sbO5n;-oowi{7rC2iZlRo(+3= zq4K9seEFg~dK`P7pPPI8&K()Ea$hE2qu>2;&mYBUIy`1twP^NEckXLpfd$)E*Sns4 zEc^M`BZ=ysGq;;Q@B3$>)?z1}yJwlx`z?&z?d4Xq25T>6x!buZaPWzV$L%-^0Ie0Mu*#p`7GWA6Kc+l@Zv+_e1I(A~-8toL*I zs!Ok*->5u)STx6IYw&Y6-Os5irWQY4Y~@YZBd13OA9-y0tYCsnW&iwX_BU#?Z3K79 zemPvje#my}ClAFFU*8)_yf`hYEw6IPzGKS#2d7i-tDXGgy5RZ=hD=eNgLmx~np;*r zO)q_AU0J#6@TJVjyOw-Xa-F_g>CG9%us3E;_pDyp%Q-XYP~?(S^-Dnx#oF_E_D&Jo zm_J$1;lj21>%WJqA609xa6hfTw`+fl)EAK{sxfzE6i&&#-YXjDI-S8a>8zn;@x5}^ zBU(K1e*=&A{WNXWd(pDvQc;AO`ZryZGZ8xk?Pun0E7y{r*x~!u|HNL_lmF)E@I?Kb z82*!~;C18gH!oVJrCxb`+s?k#b(UH9-xFUpN%OwoKHzTh%2&nZt(cGLtFu0=R~&z) zNL)LvA=U5NQkuxIJok{>&HTNd#fz?*aOzt2oWClWn>2I#^{2swL6b@XrG6$~3Y->s zJt8>isf}`bX3>@EA~Eh)>B6&e@PDwRxENU{J@iAK~{a13zeKpVZx$DA&FKJe7Je%eC^s=b^ z&cLOddyBrE*Oxq^&hzv5+2kv${qt7OwKRO7EPQT>*R7YSX0AHy$2-?#uh4weQf$@k zT9kC(sn~Ya11ZV7m--)YA6|6TYtQ|ypUXZhYKeKm_v~}Duf^@B1siXk)t~&Cc|rMx z7f*LHm_*FFv`mMibDGm@#c8vpUOipZ`R!8f$$&V?mxM!wV?+OYg{y&I$vR< z(dWi{qOSTZx=XiAPZ!&;>(1r16W7M6%yquzSgg0*LI1+-r|*9ssc%;LY{v1*r)=J` z>->^`O;^vkk|_Ld)xQZ#E<*Z$wr1dt7fY35hNW5Y!gh9E>Alzok~l#fE)J`tFS8yl zI5??L_rsY5pdqHqDv;s6K8d|)M&C|N)%IWCFf(P=5lGkJ;^OOPj;~{?@`dz5R_KE} zQwFa~M;rs#23o#cO6dEWKZ z`MpBZBepihxAOkkd*xk^+N@|rsjdnxuU|&R`@fajevo)mqog`tt4ytC$w`;ObwX+? zHY=;lC(XNitxub8!Gb-XBv+K3SX`IwzIuUyip{mBn!lva-K#%mwtAtN`Ik>_cYn#{ zhq|Zjk(aWm(%#Gvrn!693tic$mH(>v`9jL0?pV(#->wSfbTs(x4PWDhHR&P$4R<9!o0>27zxes8#~0`R{pIp?J7?&f z6KnYHES;J1O@8l@&&2`V$CBSI+x}kqG~h!(P>R z&qsSg=31q^j(bfP-iWDQS@}!N|I<{5{43U(q1_w?ukLM};lJ&1pyR37#*@=t*skxJ z(QUZ>+KY}8kNvOeR@H_tP_0^h?ehbMcej`6&)*~OCe!b}-}G|-oC@_P2XD38YR1gn z9dP~lq1s(gBPS37X}LblK$dt5&_-9?7a} zeR}(~#rKqqk5>!peDRC7lWhBW%IQxux6&H#t#*!w_Pgvqs=x8egm{Sxl@y=I@2^f7 zPqdVqr1&(rHJbfZN#LiS$(K}@MlMg;8g|{706F(yMp@pfvr8vyC#cOlz4u!7 z?`%@Ei z)|3}t7f$&bBfBvCWn#$W8wX|j`{K5-#ei#r#`IY87js**HKVi^C_Aj@tb2E7=h?Go z6N|5_Tu`~JvhBO|oXq1h-xn-f|Hb3X319zpojJE8?lA4mGYP1DbX(-)FR@iU%U^Nr zy_~mM>22(}34B4Pm;YY$RBz#&{N8hOf3Y&<9)TKcAPMA1?tN<64)WqjR`= zZ^=II#-%Hhi~g*-wyvOV$Bj8b>jkv)@0%?)kErIp7I}Gn(1qn(@mq3hmXs*J`z4n3 z#H#8j_wj?jj|as4+%n_g?v_paOoe6}&DYr$+3CwB{Qpwa_7_hx*RZXbxK~gtd0x%B z{@t!-rYDcE9lo#dIzqHNf3r|A&#S+wWi#EomNP}!RB`{x6Zuk`b79&uy}GkpO}i@c zmw*2H>7T#rnJ-orGYyW1HD7hs-}2~%sP?AXjF(kEJT3^HICuHWFU7_C)22?gI*s^Wg zwyj%DrFz%#UGcdDk~8<4!vLDrSfK2-UXo8rNAfz;d7fJ!8Q&yubN)pK%6Q%XyXp?0 z-a=!XvHWhX7p95=A>O3G5ykdpU&Z?mAMSM*yFOyFOS*Z%yUyc$ zwO&x&yQx0}SBd`7%6af!wLnIskl$ve$90XY6(5$ovhdgy7=8JV)KU8=wYOCd*e%{I z)Og!1@M=j7o6^3_?I+GVnf*yIUl+439Xiic z)xWByEk`Y0>HBNHm?PcmkF|G|oW3UfPUrFT9o)ax6(^UwPucRpaFyQsd8=9P7;pTS zv$9VUG|n+?ipic*k$(@qt$AUpQvR^}$1cbBA=^Y=sM>8|R_Hy>zDYjzO8T=6*X|tn zn{d5!wsm;s)9G=gj`nlotNdfmKUmWrHks|qx8*f#73;WWKl;?azE>Y|Jk0 zw-21F`F_vt{C{`$zdd~aUV8mJJ6Si;{~bmZxxcrcd@BD}gCnS}tG=zXf-hNZ=3aMD zfq&Icu>2gx$8#Ja?`_z9y!w>!;_Lph+gj{c~Nlm=5a_*Vglk?Q>u-#GH_qI~~u=<31 zi$y;D5Z>mvein16{39Ds*ojG8Hi&fS6EI;ZDc!gvLEzq@%kdnGy6Rj$IEY*-o$#ye zSJ*F}XG-w1jZ;6zNaOU!yjhxR5j_UPz#r|D7f6}pq-!4{N z3i;B;_T}9E8lx{p$5u#-Y-z0w^5}ZXQ~PYEZB^z?<;`2424&aokG2(*W!?87X4;dc z-LHIhRG*XiGU@9qj}|Y!BUSS+2rb^uXQx$RRy8TQwCIWZ4pEQ%(CKP*cdUb&t#@yY zZ|7dzRqGU6AIUYQCj6ZqY@zYep3Z=Vb&RDf<=fZ+AFd ztm^Nz%?YBKlbG$IK&@}x4-yBATjsdWwH4j%elTBV1?Poz0#%c<_tw2CJsxUrC9Tu* z{&9k|PPDJZ>&F*=^sQB?di^jk>0|)!I#7H)jMAS!?L_SBrwbpw$lZBu_6+4t+3Nvo zE@_lYESYrqM@!PX^jhB>8=r;WVh!?_bO zm$+USt)pgmZ@uZ8xN8@73(x+?S-haomn$miOVqDjp7Bh^ zRSRv3FTYE(x^v&YXQ4Td*u3s~7TaLOZNDxYw*MC>(4thi@?!S=`yBUPFLh?Ie8U~@ zx6fnZzUJ@=U;F#i!RdPohhp`tBe$QQy7aqrH?Je- zQ#++Ui{46a^!nZ%&$TGmX+5u9;%v#o;!pqDvCT8tRUvb?{it&1`Fp2j7^>Ji;vPpm z=oB@W?DJ=qD9c&@kJFn}0xQ}x^>k(iZxLYm!n8NmH0YPts}1&2O#zGx7rU(ASyIG$ z20D1tC%0Ga$IjyCX6EMYXJaQjO!k=^0c-2SX0DL?`#bk-WCV}$xT6i13$QqHyXv!m z<&f$T(2P3TH2DQ?&`21IV?h0d-5U!Z-Po9XxNheOl?w5-czMn^7i`N7{+h%tL)f{ zXUz3!?TNH9nNk_I+^_gjsKx3NAMRW&{I{lS_Xf#}*=@~i-p95cFm5&j2igtS1>1A7 zYfK+=WNJ+RxWV;6Gqb4i9m~pxi6P}n-DN)bKHhYF_t$UpPA7@ly)63iqiXa1{V7h5 z;sUQf)F{|@Y5$!GXODQ7?6LX0{$x9st?MLx^N)L1PiM;iHuu@Fb#Iv3`UAg~f8TTY zK*&qc*yy#+I(Ng5+oV4)U$X10`~vgqwTEB>mN6Z_S&nkr=-xS5G?OcuMW&yh$^UNk zq26^n5B~n8Hs9mU9ly>v_n7kudl`Fq7e_BJpEzN`Qsydgt9!ZgJPPby%|5mHO^&73 zbKYgiaj$Qx%D>%He9Y?a)%h2Gzh3%0RqM{#C_WLnj`E%R<7Q=E7XAJ1Gy99PuIp#^ z$FhEzm7>S8_tqQVcLm0x+qgVr^TM}+OZPML%PJ4QlY6h@-+FJ=QVS2In9SVe4*52U z&t2UZ_j1d9%8J*E@A+W&YVp&bYYPon&pN;D-O8EErX^STW>Wt)EeY$b+*Pk$+++J9 z{PMBvy^|j}mweYqeg`ewMU^9aJC^BXZ$`0#C=1g*;_W=&i(DW&(! zu{AqfQl@vkS({u|IgexaA8;>J%;eS6=F=NuJsK4yuj%)Fij248eJ#ylT z4PHf~pSgQ7X9(>*+48~NYyHrVjO`msr@$|CLlR3FN zue_T5)p;)^LOS5wuU{Ol`Ljx$%8#^lYr5|} z+TQ1Cef#eU^QjX)C;jJe+iNTF^^=jz;$*J98v`nxZ@*Bz7O|RJ?Dd+oje?4qe{C-v zdSYCYw(xqsE%&quN|p~6FMZLwOfN@9DRa5u3u7POnQq&91f#@*lXae*bh)3kJWfmb z3v*Azji>JKpPrt6z9i}TJK0}0R(r~Gx2;I)Rxp`-W@-HEt-H;TG8UcFKWZDb?lNl79@U+&vfs>>87kzwev3ImmQk6RLIus>m-+a z|L5y|wZRhu@|0?%lLPy-0y!$)sJL7hFArLb@Gi7x<+~MNdq1{J}QeGi6@nUKO=D z>U(FUzY{rGgm z_0;Fek~l@b{fRpH0voo}yFFTX*=5nwtM}PM?>BG>FG}mKXgIdSQFc%Kk$vvB|826h z_APz5>u&RcmLhq&0sz`PQ}k`%R>?k)F1e)5Hz^si9+{?t<;HVh@=XRK>=e@hU->=m?BI)=32GAm_ z3m(B_CC9G5>#12D!HmJvmQK09!*E|Rq)Ii3$Vx_dcKeDnPolKePe!G=v{45sck{U?PHDp&+<Z=k5}Oj2xnj1qjc)- zwP(Am)E919mH56>^yQ7E7q-Ti7nPo^U-3)gOmvx%=*nY_zy6A>TzpPA`Jc)2DeAd( zrJHIGzDQN({PIm`Z|cNPS9^Bcp8W6klj*U)N;z%s>Mio}X^wlh^Zatd58+z3WHTzK zhPv#{etu?`f|F*b^UE8pb+fK|H=6(UD^3nCJg+Xd_>;|!=X2SX-Hny^f8r2%af$hB zO_}iW+3G*v`n+zsc->9t#aqRy+Pz-k{TDLBABa^?+fu&b{%k5{d4o9Vepx3+ubU%htBJ#uelummvis_xT?5ikA74sv2*e7-o15yoa*II z7jGBNOS%5;8tdZiy($-OJAcVCwoJYMcCF#uSk1iK(w8lTms)J8fZm-kPcF;h6Fc9(@rbjWsBx4q6~^L7O}$F1%7^#1zqg!5~-y)@!XJ0nD>N(AErtDgIbJJf;U1=>ZbK}b;f5nA| zL`uz%L?<|Q#to;w)jT>;_b#RtAIeg><$1II{0rSxFV03kY@WukH%l<}MQYEvv8&cWs*Y+OL1}OkG4OK>dTaizci#e)!H3RCmNH32Ip;u(!U^7FfxB(Yw=i zHj}tkO~bO7ps0pd4P{|h#8%cGj3`mw8Sq6)VeQ(r$TPGKlh5=DtM{c{Sv_5=Ji1io z^@We0w}~nQPJAc#e9jK_4i(vA$=sUPjybNn5?|Gt_@fS0k@^wP)T`;TC zyeiDwm)fYVYH9i;>B}jn_4gA)dQK`Wj+@487j;U`w)7$6+PgMWCM{YPqf~uF?MXAA z#-XcXnO#jAAGj55d|`Unv03$T)PtFhvppAhF7wREzg9K%o9d>XiJ_~muoaqpnPj%8 z@{r}uYtoSyn%cHsJN^Cr6TO!o0}8)vi+L?NyVGdFA?_Mc{=;!5mc9NbF6=I|QApz2 z`~KA39jvv4z^yZ;{J<(fh9Pf)u;qb9rCc*#*<) zvPpW)E%19L^mpA)^+{J77r4$^m!Pw2;uA?#zGn@v!Ht+X&y~KNlA8Z*W{b68#=<4S z$|dcsJzBe3wXCKua+%a~(_i~&Rks&Y^7{&n_sUME|I`U;FWP4L?00$5>n0(uFy7Q{ z!LeaWrZ;66FHqvPac$E1R>CcGyF+DuL2P_!-?cSgGafr!koK3g)-ab;{p7MtV{voR z_EgciLLWPys`97Fzb|2Z+#z-HC}`2={3yogJ1fkCx((hmx2^r*?YMH+1i>sne&aW5 z-UZI{2{&N-mmOB@^1k~!AOHKkJ5Ds%y1qA9Wfh%$XqzU7)6=NTvwinYPuHIx`1aOb z=O6{U9kpszw;%4!{`tIlhPrTFyyyj1|09==`9R10zrQFw<6T_B^+hd1YaL{2;J}6I zmzS1aUIiJ^&nm5{uHRI@+v<7Ss;8#)i~iic6Mp-jyvV`#xAvdD5OwCula?c~_mv;b zzlSh#u8*4Ghe!$GJ~2j{q|*<+&VQCB#n`>GYj;9fZL#RW?y#pO;L=!EzbdvMb8%Cp za-mI9^5uy;p1kX44gVjK-{)$*7CIGv;nRZeC!^CQRIh%p&Q^4hAb484;hxNwxIGmg zr({7^K3)CjYn)t@?s9I%Vb9VSnYZ_Cj`pP#RLT5%Y2R?<&AWvgpUJqxdR0~Zar@<> zo8KyXfO;7;>W03~(3b1GYh!T6@>}lhUo7P z-gW&v>Fu`#wFe_Yly_#pS1+RV0XK4dndaK{Gxu6dV9@tzVM~Aa9S}|3Ub=Y6n)-PM z4$jX|R#;Ig__gk$@#`jzr6IgaH)}K<*JHi+#`XRcvgl&;h4RG<-X}M2Gby)rUH|BQ;99wb%4-kke*5_I z3UAowhu7q?%8&?qf>Q zCzT!auV_|nojGUI`)}7~oLeWd{cZ2dIi7dajY~iI*tSfs+c4Mu`IhKv%h=?*N!g3z zer#zk+C9~4=0~vSgu23cg^XukR|SnkslQECyuUJ=tF$Da`B&zdk9?r2=B4ea8P@+= zaxbiY=5TcFXP&)ArO%t0XUF~0yi>T>BQRO-r{%YVIbLa3wur4PJs6Rp%=tynvTFM& zE$MkW-0Nmse|kB4Pf%y%vRwunTV=u}BeqPeT;=xV+1g`{+I?|bJ3s?ZDOXwLyjDtG zUOe5!J3agK(rdr!wjWZeI3Pan^sk^0nNqbow&{FTCujMoIH|I~SumlNRjE|5N^|3j zEz`I~?Hq#jG}n5SI#_FGbzj++ptEJ-9HG5aV^zL2nQni=`9<#Lig5kVciUcBTwD0~ zd9Jp@BBi@~Ijoac#~)l_esN{Xf;o>IZ*M)bYXS#&bSbGfCnvO3?B5BsBUdJLU)1K_ zTh|_FsMg(670LG_L$mtJl~(pGcONXAB4YYf=%%unqI`*i;JR%d!6H4aW|P)_ZPl-N zc)jlJ^?frE9rEWRYK=?0N!?rTop>b7@^sCXkAJOqdRN(m$n4dQlyf4*(;_7|Y;#Kl_CsK*M={w!XZEPQU$Wd-Mz!skxL zEV^&{-({1Pz!s0oq9AWOy#KT~eBY*H%WKsh`msc5ygb5jH&Jmh7yG7{oas*!linw5 zyytTYSk!Ur*^Kx1Pp;+m(ug#ja?`Iga$+3UqO%QMciNmMDy$Z|+jPWC>7;th_3*iu zf7f0)*0{iYo>f^uo{`s+PM<(G_M>^HwX9Sh37__sJ7ah6CD*YeY0m}a0xzy+3ARnT zutBt5QzKN|$m#6M#J0ItZBI>p$>nyR^~*Q8z1{jRa$-4dFH_(U6@%^Rc)<$Y+yULx zu>dkz3o5-JVNhkMy68%6ap; zAH^AE$;%!&dA+4laAu%kyKCc~|LY^|lpdw+dF%OwMAc|HdCeX-oM4$ zb%M_1Z+_M_Y1j6g(5BDayY?5G**A3hPmwe9^kOb=S@gAWTHw<5nFpe?PNW5WFnZO* zAsW(Ky4G7Ad(rmw<>`vWPaPtUMz~(HIb$AvJMXi~e%Gv6gI{+%zKQJB-~0Q+!`=5I z7)-5yEqHg~_3O}GRV{s6o<*#>_0?y&%leGqko>D3=Ir?L`0lfXZJ)d6MT=LgXz91K zOY5p!n?9XM{cZ7S$=6@P>z&@OpFVH;N{fB-PBb2R{WkCI`tXxmYQB`sQNQ_hSLwkQ zrOK5{Uex}a+djF|Yu{DZ^=6ZUzumnjb@}GhN89!q&feM`GB4K3eCuJQkM}m%%Uw3x zSQaa%8G0o3OT^2~%k2$gkHlVi_P>}}>d2|O>ewzO&>)Ra z;iWjSqjPtC2zLK&wqU-8{QD1nZT<>--6e~U&)>jXbya4?j?#Gx!-{xt`#Yd#2~7)HG(s8uV?L_{Oq|`%UeShlktW?_v3J>E^QqAvd|y(&CSP zk%}!<;9eSnrO9F zFWh|dSs9a%9}K=bmt6S^YGOw?r$5e*H|Se4@r`xW{*QeN-<@7xZ(;bqN?=!yp^MJH zKOesS`e$yZ)4%^?-|nR;Whc*-+pY1h{ZU(PZ25Tc)*0gRS3U=>k6U#oH)*lU;S`TG zv)wY>HMIZce{S>+_$Ot*QE=}>(e*bPIHeA(m_Gf#glzDO-qusnx7_qEW(12K7rl5Q z%#nYC!Oxz!$QNI&d%7-0q+B^&bim#F;_Bso>$h!N_Bp_-YgSR`8$sph`FwmDhfeOf z)l#sr^q|Emw@vRsk)E~Z_g{Y9KU{Iw-fU?OWPbLmXXjhze{Dgf%UV|KU(OMFCOMj| zI&E^sRQ{-KTkpN|4vj7Ie0qI?W%w7h>s899qb^LiR`v7W+&ikaa$0@&re*I5-?#TES6L;s;!K59 z&Gv}&Zd(}fNpacAfR8V47JL!AyLZh(^Ig9c&om~Sv!7*U_E5)~*Jz5>!#QVEf5m?G zS6R*cWU;dJ?y9>Um);1m+dAmaG+(FI6o2hvG*9B$8DD$(SKD*<39+Rw3O}&*`HQLR z*L=*J@3}+x;B?E6eQV+xJXAK_nPB^?@XF7Z3+^bLma~4n*5a>k|IK@aO;um&1gqCy zH#=VQ-!CsV0My?;SGMYO*OwrHT(*!WN0eQgbUq+8-~G-PoRXRFqIY?p?3CNxLX}Fv zQ!YAgyuHchzz%h*SuM#^|d+dZ@WsebinSK#(t@7zK#N`u6CJC`eCa5r)~3W)J($R za=X`g`_G$fW>;vu_ebkJr#qF;=XI!wUoE)TT6FqfUTZ_NRZYaG5Sto?kW_pIb^ z>z-&Sd}fxnb1R(m$D&wCwDXwb*T1SVH`(_6k=k69wzZJ$*1iOpQc!b?zv{Ho(K{Ej z*J-S*_KpmD!~4^IiQQc7J2hX7mhVxqY)p5!c*KD@_~t9m`n_DUUw@hqDej`NG)rUe z-V6Dwt295P-OtQ><8{CFVRFbkcF-XG3jg?H(z@)YZXE}=YuDYq`^>ZM@#S3!UlvSc zshZBZw=3O!E2y+*+J2+>RmHiMxQhiXx*o@$O24{Yv3+NU)&3VdOB>t0e$05Byllqx zsxr-jOLp7mZ1k)Ds{Z9))yvA6U5{UP%4qDl_pa!;wFz_>CH&_#*2Vn2Di?O^yttZH zbZX!2=wz$iL3g&9FDq7?W&Uid#tj!ku9p%%|FzVazhD1VQfSdr5Vv(};QI-Gmn5B7 zEgJZ5X*Hy1Kf0Q&bLQFClTIX0@0k2;)0B5twl-Mp+Rm7%`@naPf5Mt&S4tIOZCc%T zpZ(BFcB6XjmHx|))MP*A_Icg3@rRqxi`cj?c~e8pY$C;C3=K~&zwWVg)6v-1Y-ZC} z&E2T&lk?EsR&)0&$-SyuFKk*I{x;n3i_tM`ZCe+mEXMc>J?@&oPq3oA+h`)k zRGAIUPTxd3uC%^bdSubtW@y{?tP`khyJq3$kK6Sny7N>T?;Y%|`Wo~!Z*^a4yPvLu z7Nh39 zm5Snv!^NsN&5k|3v10nuhW=@b!u{vobGe~)-dR&K>y+vy_nxHp4N7zJnv3p!)Z{wW z1Zrlff*Z480nhs5F3FhqTc}^JQqB&)(6#34CyeIohp2#~hc}4(LJHWW(zP?0-=EUm z1s?pE&GG%HX`Q2`tcZEa_rtH7_P(1bZMzp-<$G?;YIAJ?^QpyoL9NisqpLTo-S(+v*x&@?pez9 z&Bf*3>(J=Q33nRihB?>o@7NofIXih@z4~@NjfE*!1JbOorn**Xc9=11Z4wJmIkC%O zyTV2;ZO8ye*!Him0S*JvETxq{@@cH;-G#f=0tQzwo`izUI|? ziDbu&8(sTFrmW(YT=?vZ!QpeSF8RxSLZ;QHal(gU+=m+#!DT`S(!A6O}O=d&O4W4_Ir`AYLP zv*wuae?IH-#?1fI#oN0Q&McqEQpMgGcl7AuC|f7@sK)3wH&-*Reo~OlUur;p|Jz)7 zE%&iGQl1OSCt#LVf!oh$=_DVuee=nh|HiEq;&yKr&fGQC%kdM|PWQ?CE1zqvTwE=E z!GB4Ad4=$MVUPEL$L?Sq-+kEk+OI}KPDp6L^(Ry32 zeczobevoZf88YW;bPF2S1T{i=D1xA z?_9fWEO!v}+wQni@1F>3a$K*&n>SIoG%P(4MzUdr`WAJ(`T<`nAoV$uce?D){@0mO+E7!Hl6-xl*(8VeU3;#d zhIF7WuAlF6Uqr`T)?`um&pS6(i=WDF5}5L_POy6QC3u_crr`XDxK9b+KKg|lJiF$> zv{(C6c3A1lgFl3%wms5kUHZz&ZH1-nnGKtFxmOy+9z3ucUk4tvmC#yKOEnfH}6s|d?qSgTJ!l>@oJTHFZOY!RuJ=^7xa*b6`YlYP7sCIvr{#dR(H_K;9@4i%?_(Njq^MkhU zO$=ULp8nD8bmJx_qc2%<&t|VK+g>^8zSvehiN6^tjrW#1tY07g@|B>~C9U=EBEoOf zx~$JIJ@oAHiK+z`4jtQlR#=*Z!M`oF4`xp5zt{I!W%sr1dJ?vvZvRpTjQ;RyZmyRv zCN6p$>pxp*xAS77@7j5XBQ@u@+&k(me=9U(<4l>YKXx56H+m(zX>tfpt;jL5ommax9~0zfD=EMdtRkWe;$zSqSa5JAXktxZKWS!^@@f56NEd7BPJ`X?`;Q zv6V}B6W?Cl!kV1et8&4b0oG&^F*Mg+c3o-e^F2pq3x$5|e0Iq(cJfK}TSmvl8eI=~z2m!@*up0Hu>tW^m*D<-m3wOfNrDBqkZ7qeX4JT?*ZJ~G z*6rw%V5Bas^ThSP;gd=yuBqQ^(|CI|gf-a^RCGmU?|m5*%C9FJB5XeU@v26HWLRVt^fMznNGQ9e|y*B?N6iDXG9w>NLm=NbYoY0qW-Ko$JA3^ z#9GS<7`EOkf9cIq_RVyfmFQkXZ`CjDVutjk8G(DVK#fF5Z*+PTq%CFDs_mtIJ4pWB zm&I>c=ekPvzf|F$ThN!+g4#@Z^ zP@G>QFn=Ded;Z0{r=_YES1TWq;lSFW+V}6&;<@V*be2tAGEM|7xlZ540x%R{#x%YbOS;PDLCr67< z3Fusvn2u;x6{QQfHm%`9>Ulnkp0H@9%%a%yS+!T9-!1b&9VhgZK6HEaORi&0plW)< z{dC&U2W|ND6X23m|oidDP>nvWBg{Os_<1`Q?k8on6WypD8aR&7(O@d z1lf|oS|y)vgfwypKAr{Ai_E$rzVAb;e&la+PiDwSU-Liy2^QP;^ zSJ_`I>DAJF9V~c6AxbP`h1P8Km+Qk5i(?IpUN><}{URr;y>}yQ`u&$4k34kx-L3YQ z(Y*}IfH3E_xU+|Aj0Ja}om}%}o1R2%o{DT${+%5kmpAVH^=h@l`=pDje^iC6c7NgF zUEF<_@qAN8v9`~PskcOrZ;09U@~6{jn|rzQ?iJKsEPl%YDUda$H6 z&oX)LzgPY*{(imm*+}&Gbz#eZioJK&{{5;2Ds&G5@J5j#G&%C5y!`^?3N%G-MLPj`u(o%Z7EQe#lbSRJBq^UTNm z`@db$XXEE=+3e*ad-rxjol@J5==>J?pbil>V~HGNACajq`e+yFVW&lAxL{;FypL((E`hy?ixr((`7ccI_WB(ld*Phd4HMr`gI{+&+OqeWdmWC- z?|0il~#U%Sq_NCs>SSaT@?(W|`l zaMPsuM(p>Nt{1v-^LoUqD_rlewCQ*kO=PL6-hOyz1oy|yN>~3KoBLzCAD8g#tD4+f z=C9_QuKI#^W!7PHVZZi!b3eA6Q%jtEb=4}Fk0)f$7C#>PE}v9Fr7{(nFRry}#^!Hs2$R zy=htIuBMCcK}%2mR`0EmN)dYJBJj8Bsqf82EHid$R?hQVe&kuuqWnWg<8FuEe;q14 zF=0o;+%WCWb%ND@FXCqt{4#6dN6_lfHjr67*CtACklM5C zLbluS6KWtc4(>8yzQ*=N%EF!%Y}*>;Y`L#YdkrKui@%qZyH{OU_p$za^C{We?Du1@ z$}}8o0MGn49%ReD{!Z3Ut^NDDty~j}|G(wm6MUIJFa3C4)6|XWbzZC4=UMqpoW?hw zmo3`UIDxe)akcNg!~Av`u9J8^OtJaCXYXG}v+C{%x(;_!;}z|79rSt3^1(-$nDCed z?5_I$;lsPDw|@(NUjMhc{{IHK2XF89%{45a{eNn`*fV8?jal+;i&nndwcFqS?!EHn z)B9^aOb?Z@yRzhmfK++uo5w5X_uV;rNdDgo_x4XQZ#*YuUVJxw{_10zmk!N8SIhi| zg~!YR>?m!&xTbT99&Y!oJ9zN#?N>8jwfx-d)MfplWK6$kE?=J>6=}nRwnD%bCs;Zy+gIjNlb3SXVXB_{hn-{&4Pql31p3wQ(q^kH* zkn@!Kyb6CST_a}3gd16qMRW-p7;nAkJ9y6b_jO<9Hf!bLbAM*nFY8Et^e-uJ^NzD0 z&(>D2`j;T+U#i2us$b>%gynjCho38M_m2q)6_8IqHd*D8&^`IObwcSA#6GFKJN)gZ zticV1vkjszTGwh-M&6EVdU(}3MIon9blykC#Vs6%Ck8v(1b&%z{we#jqmtsj8~=Jc z^xcVzS5@c#|HIwx(=m0=C9b>U>()u7PY@H^+G@C$uX(LT)meU9d&cIq9kDwzY;XS6ic4A9X6sk! z$LuH&0%wp2_p}4EoZe60_ho7E^K-d*c}mN{Szz{Eo*>=`-nhjtV&m@{Og|6VxXuXH zbAu->A!|a`fnEDH3c9ZUc|OL>9G=^}i?_S!vw)6!;}*UEI_}L8+*V;>1Re7OI{XbO k<3iTELo=@Ss{j1mt1BLUaQ`aLz`(%Z>FVdQ&MBb@0Cs8wI{*Lx diff --git a/doc/qtcreator/images/qtcreator-cmake-generator.png b/doc/qtcreator/images/qtcreator-cmake-generator.png new file mode 100644 index 0000000000000000000000000000000000000000..19c883bcb5b31236e7a93df68d9a47377bd31232 GIT binary patch literal 4822 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 CM{bV* literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-project-kits.png b/doc/qtcreator/images/qtcreator-project-kits.png index 569425e742bf9a74823a4cc5d8486513154ee1af..e6c1434c9cc7d2ba3ae25d7208250e7f07e33687 100644 GIT binary patch literal 29606 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 RjDdlH!PC{xWt~$(69Aozo4f!3 literal 27878 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 iSDpZ#VvXj||Ns3g`oA#qcj$u-KJ|3= + The variable values that you change are passed via \c -D