From a23298b5a31e3f2dc1d74fc6f0bea1baf3367852 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 27 Jun 2024 10:59:14 +0200 Subject: [PATCH 01/29] ExtensionManager: Hide spinner initially Should only be shown during the network request. Change-Id: I1cf94281bd251f1fdef21c5e7ebd500e8951db1b Reviewed-by: hjk --- src/plugins/extensionmanager/extensionsbrowser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index d88e7f41d3e..d1968343f72 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -341,6 +341,7 @@ ExtensionsBrowser::ExtensionsBrowser(QWidget *parent) Theme::Token_Background_Default); d->m_spinner = new SpinnerSolution::Spinner(SpinnerSolution::SpinnerSize::Large, this); + d->m_spinner->hide(); auto updateModel = [this] { d->filterProxyModel->sort(0); From b9f786fdc5e51a22ab9832feb390cf5154ac418e Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 27 Jun 2024 11:00:08 +0200 Subject: [PATCH 02/29] ExtensionManager: More detailed JSON network request logging Change-Id: Ic83900fc1344ecb21821813188f340fda9ba0708 Reviewed-by: Cristian Adam --- src/plugins/extensionmanager/extensionsbrowser.cpp | 6 ++++-- src/plugins/extensionmanager/extensionsmodel.cpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index d1968343f72..ad96ac5901c 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -423,13 +423,15 @@ void ExtensionsBrowser::fetchExtensions() .arg(QSysInfo::currentCpuArchitecture()); query.setRequest(QNetworkRequest(QUrl::fromUserInput(request))); query.setNetworkAccessManager(NetworkAccessManager::instance()); - qCDebug(browserLog).noquote() << "Sending request:" << request; + qCDebug(browserLog).noquote() << "Sending JSON request:" << request; d->m_spinner->show(); }; const auto onQueryDone = [this](const NetworkQuery &query, DoneWith result) { const QByteArray response = query.reply()->readAll(); - qCDebug(browserLog).noquote() << "Got result" << result; + qCDebug(browserLog).noquote() << "Got JSON QNetworkReply:" << query.reply()->error(); if (result == DoneWith::Success) { + qCDebug(browserLog).noquote() << "JSON response size:" + << QLocale::system().formattedDataSize(response.size()); d->model->setExtensionsJson(response); } else { qCDebug(browserLog).noquote() << response; diff --git a/src/plugins/extensionmanager/extensionsmodel.cpp b/src/plugins/extensionmanager/extensionsmodel.cpp index 2500f8f73f6..2f989df034f 100644 --- a/src/plugins/extensionmanager/extensionsmodel.cpp +++ b/src/plugins/extensionmanager/extensionsmodel.cpp @@ -261,7 +261,7 @@ public: void ExtensionsModelPrivate::setExtensions(const Extensions &extensions) { this->extensions = extensions; - qCDebug(modelLog) << "Number of extensions from json:" << this->extensions.count(); + qCDebug(modelLog) << "Number of extensions from JSON:" << this->extensions.count(); addUnlistedLocalExtensions(); qCDebug(modelLog) << "Number of extensions with added local ones:" << this->extensions.count(); } From 07b13ed73b622caf2f8b8335cebe5c6c8d1b04eb Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 27 Jun 2024 12:10:08 +0200 Subject: [PATCH 03/29] ExtensionManager: Add logging for the fetching of images Change-Id: I87e96ba5ea65d2bf5639b5edc2c82c128d358a26 Reviewed-by: Cristian Adam --- src/plugins/extensionmanager/extensionmanagerwidget.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/plugins/extensionmanager/extensionmanagerwidget.cpp b/src/plugins/extensionmanager/extensionmanagerwidget.cpp index c2dc396cece..5ab0126a94b 100644 --- a/src/plugins/extensionmanager/extensionmanagerwidget.cpp +++ b/src/plugins/extensionmanager/extensionmanagerwidget.cpp @@ -53,6 +53,8 @@ using namespace WelcomePageHelpers; namespace ExtensionManager::Internal { +Q_LOGGING_CATEGORY(widgetLog, "qtc.extensionmanager.widget", QtWarningMsg) + constexpr TextFormat h5TF {Theme::Token_Text_Default, UiElement::UiElementH5}; constexpr TextFormat h6TF @@ -735,8 +737,10 @@ void ExtensionManagerWidget::fetchAndDisplayImage(const QUrl &url) storage->url = url; query.setRequest(QNetworkRequest(url)); query.setNetworkAccessManager(NetworkAccessManager::instance()); + qCDebug(widgetLog).noquote() << "Sending image request:" << url.toDisplayString(); }; const auto onFetchDone = [storage](const NetworkQuery &query, DoneWith result) { + qCDebug(widgetLog) << "Got image QNetworkReply:" << query.reply()->error(); if (result == DoneWith::Success) storage->imageData = query.reply()->readAll(); }; @@ -745,6 +749,9 @@ void ExtensionManagerWidget::fetchAndDisplayImage(const QUrl &url) if (storage->imageData.isEmpty()) return; m_imageDataBuffer.setData(storage->imageData); + qCDebug(widgetLog).noquote() << "Image reponse size:" + << QLocale::system().formattedDataSize( + m_imageDataBuffer.size()); if (!m_imageDataBuffer.open(QIODevice::ReadOnly)) return; QImageReader reader(&m_imageDataBuffer); @@ -756,6 +763,8 @@ void ExtensionManagerWidget::fetchAndDisplayImage(const QUrl &url) const QPixmap pixmap = QPixmap::fromImage(reader.read()); m_image->setPixmap(pixmap); } + qCDebug(widgetLog) << "Image dimensions:" << reader.size(); + qCDebug(widgetLog) << "Image is animated:" << animated; }; Group group{ From 7c4fec664ce5c192e20138ca136afdcf26165f53 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Thu, 13 Jun 2024 06:25:09 +0200 Subject: [PATCH 04/29] Drop extra executable permissions Change-Id: I3f6fc3d6df6f705ceedc2daa47f3cad4c19b4706 Reviewed-by: Thomas Hartmann --- .../propertyEditorQmlSources/imports/StudioTheme/qmldir | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/qmldir diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/qmldir b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/qmldir old mode 100755 new mode 100644 From 5960bb33ef79c29d6c23e9dd7ba34b01ebec7e7a Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 27 Jun 2024 16:50:49 +0200 Subject: [PATCH 05/29] ExtensionManager: Draw icon of disabled items with less intensity Since recently, the green background is used for enabled plugins and grey is for disabled ones. With that change comes the requirement to draw the icon for disabled icons with less intensity, to make it really appear disabled. I took this opportunity to unify the drawing of small/big enabled/ disabled pack/extension icon variants in a central helper function. Change-Id: Ia68218c774ccb8e9e7ed48620ac36f4bca0724fd Reviewed-by: Cristian Adam --- .../extensionmanagerwidget.cpp | 31 +------- .../extensionmanager/extensionsbrowser.cpp | 77 +++++++++++-------- .../extensionmanager/extensionsbrowser.h | 9 ++- 3 files changed, 57 insertions(+), 60 deletions(-) diff --git a/src/plugins/extensionmanager/extensionmanagerwidget.cpp b/src/plugins/extensionmanager/extensionmanagerwidget.cpp index 5ab0126a94b..429d9a241f3 100644 --- a/src/plugins/extensionmanager/extensionmanagerwidget.cpp +++ b/src/plugins/extensionmanager/extensionmanagerwidget.cpp @@ -113,7 +113,6 @@ private: class HeadingWidget : public QWidget { - static constexpr QSize iconBgS{68, 68}; static constexpr int dividerH = 16; Q_OBJECT @@ -123,7 +122,7 @@ public: : QWidget(parent) { m_icon = new QLabel; - m_icon->setFixedSize(iconBgS); + m_icon->setFixedSize(iconBgSizeBig); static const TextFormat titleTF {Theme::Token_Text_Default, UiElementH4}; @@ -200,7 +199,7 @@ public: if (!current.isValid()) return; - m_icon->setPixmap(icon(current)); + m_icon->setPixmap(itemIcon(current, SizeBig)); const QString name = current.data(RoleName).toString(); m_title->setText(name); @@ -236,32 +235,6 @@ signals: void vendorClicked(const QString &vendor); private: - static QPixmap icon(const QModelIndex &index) - { - const qreal dpr = qApp->devicePixelRatio(); - QPixmap pixmap(iconBgS * dpr); - pixmap.fill(Qt::transparent); - pixmap.setDevicePixelRatio(dpr); - const QRect bgR(QPoint(), pixmap.deviceIndependentSize().toSize()); - - QPainter p(&pixmap); - QLinearGradient gradient(bgR.topRight(), bgR.bottomLeft()); - gradient.setStops(iconGradientStops(index)); - constexpr int iconRectRounding = 4; - WelcomePageHelpers::drawCardBackground(&p, bgR, gradient, Qt::NoPen, iconRectRounding); - - // Icon - constexpr Theme::Color color = Theme::Token_Basic_White; - static const QIcon pack = Icon({{":/extensionmanager/images/packbig.png", color}}, - Icon::Tint).icon(); - static const QIcon extension = Icon({{":/extensionmanager/images/extensionbig.png", - color}}, Icon::Tint).icon(); - const ItemType itemType = index.data(RoleItemType).value(); - (itemType == ItemTypePack ? pack : extension).paint(&p, bgR); - - return pixmap; - } - QLabel *m_icon; QLabel *m_title; Button *m_vendor; diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index ad96ac5901c..21d4a79a7ce 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -61,7 +61,6 @@ class ExtensionItemDelegate : public QItemDelegate { public: constexpr static QSize dividerS{1, 16}; - constexpr static QSize iconBgS{50, 50}; constexpr static TextFormat itemNameTF {Theme::Token_Text_Default, UiElement::UiElementH6}; constexpr static TextFormat countTF @@ -102,15 +101,15 @@ public: const QRect bgRGlobal = option.rect.adjusted(0, 0, -gapSize, -gapSize); const QRect bgR = bgRGlobal.translated(-option.rect.topLeft()); - const int middleColumnW = bgR.width() - ExPaddingGapL - iconBgS.width() - ExPaddingGapL - - ExPaddingGapL; + const int middleColumnW = bgR.width() - ExPaddingGapL - iconBgSizeSmall.width() + - ExPaddingGapL - ExPaddingGapL; int x = bgR.x(); int y = bgR.y(); x += ExPaddingGapL; - const QRect iconBgR(x, y + (bgR.height() - iconBgS.height()) / 2, - iconBgS.width(), iconBgS.height()); - x += iconBgS.width() + ExPaddingGapL; + const QRect iconBgR(x, y + (bgR.height() - iconBgSizeSmall.height()) / 2, + iconBgSizeSmall.width(), iconBgSizeSmall.height()); + x += iconBgSizeSmall.width() + ExPaddingGapL; y += ExPaddingGapL; const QRect itemNameR(x, y, middleColumnW, itemNameTF.lineHeight()); const QString itemName = index.data().toString(); @@ -142,18 +141,8 @@ public: WelcomePageHelpers::drawCardBackground(painter, bgR, fillColor, strokeColor); } { - QLinearGradient gradient(iconBgR.topRight(), iconBgR.bottomLeft()); - gradient.setStops(iconGradientStops(index)); - constexpr int iconRectRounding = 4; - drawCardBackground(painter, iconBgR, gradient, Qt::NoPen, iconRectRounding); - - // Icon - constexpr Theme::Color color = Theme::Token_Basic_White; - static const QIcon pack = Icon({{":/extensionmanager/images/packsmall.png", color}}, - Icon::Tint).icon(); - static const QIcon extension = Icon({{":/extensionmanager/images/extensionsmall.png", - color}}, Icon::Tint).icon(); - (isPack ? pack : extension).paint(painter, iconBgR); + const QPixmap icon = itemIcon(index, SizeSmall); + painter->drawPixmap(iconBgR.topLeft(), icon); } if (isPack) { constexpr int circleSize = 18; @@ -241,7 +230,7 @@ public: + tagsTF.lineHeight(); const int height = ExPaddingGapL - + qMax(iconBgS.height(), middleColumnH) + + qMax(iconBgSizeSmall.height(), middleColumnH) + ExPaddingGapL; return {cellWidth, height + gapSize}; } @@ -462,20 +451,48 @@ QLabel *tfLabel(const TextFormat &tf, bool singleLine) return label; } -QGradientStops iconGradientStops(const QModelIndex &index) +QPixmap itemIcon(const QModelIndex &index, Size size) { - const PluginSpec *ps = pluginSpecForName(index.data(RoleName).toString()); - const bool greenGradient = ps != nullptr && ps->isEffectivelyEnabled(); + const QSize iconBgS = size == SizeSmall ? iconBgSizeSmall : iconBgSizeBig; + const qreal dpr = qApp->devicePixelRatio(); + QPixmap pixmap(iconBgS * dpr); + pixmap.fill(Qt::transparent); + pixmap.setDevicePixelRatio(dpr); + const QRect iconBgR(QPoint(), pixmap.deviceIndependentSize().toSize()); - const QColor startColor = creatorColor(greenGradient ? Theme::Token_Gradient01_Start - : Theme::Token_Gradient02_Start); - const QColor endColor = creatorColor(greenGradient ? Theme::Token_Gradient01_End - : Theme::Token_Gradient02_End); - const QGradientStops gradient = { - {0, startColor}, - {1, endColor}, + const PluginSpec *ps = pluginSpecForName(index.data(RoleName).toString()); + const bool isEnabled = ps == nullptr || ps->isEffectivelyEnabled(); + const QGradientStops gradientStops = { + {0, creatorColor(isEnabled ? Theme::Token_Gradient01_Start + : Theme::Token_Gradient02_Start)}, + {1, creatorColor(isEnabled ? Theme::Token_Gradient01_End + : Theme::Token_Gradient02_End)}, }; - return gradient; + + const Theme::Color color = Theme::Token_Basic_White; + static const QIcon packS = Icon({{":/extensionmanager/images/packsmall.png", color}}, + Icon::Tint).icon(); + static const QIcon packB = Icon({{":/extensionmanager/images/packbig.png", color}}, + Icon::Tint).icon(); + static const QIcon extensionS = Icon({{":/extensionmanager/images/extensionsmall.png", + color}}, Icon::Tint).icon(); + static const QIcon extensionB = Icon({{":/extensionmanager/images/extensionbig.png", + color}}, Icon::Tint).icon(); + const ItemType itemType = index.data(RoleItemType).value(); + const QIcon &icon = (itemType == ItemTypePack) ? (size == SizeSmall ? packS : packB) + : (size == SizeSmall ? extensionS : extensionB); + const int iconRectRounding = 4; + const qreal iconOpacityDisabled = 0.6; + + QPainter p(&pixmap); + QLinearGradient gradient(iconBgR.topRight(), iconBgR.bottomLeft()); + gradient.setStops(gradientStops); + WelcomePageHelpers::drawCardBackground(&p, iconBgR, gradient, Qt::NoPen, iconRectRounding); + if (!isEnabled) + p.setOpacity(iconOpacityDisabled); + icon.paint(&p, iconBgR); + + return pixmap; } } // ExtensionManager::Internal diff --git a/src/plugins/extensionmanager/extensionsbrowser.h b/src/plugins/extensionmanager/extensionsbrowser.h index 4e0b87c5936..f132f598810 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.h +++ b/src/plugins/extensionmanager/extensionsbrowser.h @@ -40,6 +40,13 @@ private: }; QLabel *tfLabel(const Core::WelcomePageHelpers::TextFormat &tf, bool singleLine = true); -QGradientStops iconGradientStops(const QModelIndex &index); + +constexpr static QSize iconBgSizeSmall{50, 50}; +constexpr static QSize iconBgSizeBig{68, 68}; +enum Size { + SizeSmall, + SizeBig, +}; +QPixmap itemIcon(const QModelIndex &index, Size size); } // ExtensionManager::Internal From 3572fdce03ca3be5c4308899c6e6cecb34687560 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 26 Jun 2024 15:53:10 +0200 Subject: [PATCH 06/29] CMakePM: Fix Qt SDK Kits when ninja is missing Qt SDK is setting "Ninja" as default generator, make sure to get a working generator when CMake is newly registered as a default tool. Fixes: QTCREATORBUG-31129 Change-Id: I6b93a8904696eedadec04c882495c644db7ddce7 Reviewed-by: Alessandro Portale --- .../cmakeprojectmanager/cmakekitaspect.cpp | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakekitaspect.cpp b/src/plugins/cmakeprojectmanager/cmakekitaspect.cpp index bfafe8b2ea1..bfc66d763bb 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitaspect.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitaspect.cpp @@ -97,6 +97,7 @@ public: private: QVariant defaultValue(const Kit *k) const; + bool isNinjaPresent(const Kit *k, const CMakeTool *tool) const; }; class CMakeConfigurationKitAspectFactory : public KitAspectFactory @@ -556,6 +557,17 @@ CMakeGeneratorKitAspectFactory::CMakeGeneratorKitAspectFactory() setDescription(Tr::tr("CMake generator defines how a project is built when using CMake.
" "This setting is ignored when using other build systems.")); setPriority(19000); + + auto updateKits = [this] { + if (KitManager::isLoaded()) { + for (Kit *k : KitManager::kits()) + fix(k); + } + }; + + //make sure the default value is set if a new default CMake is set + connect(CMakeToolManager::instance(), &CMakeToolManager::defaultCMakeChanged, + this, updateKits); } QString CMakeGeneratorKitAspect::generator(const Kit *k) @@ -664,18 +676,7 @@ QVariant CMakeGeneratorKitAspectFactory::defaultValue(const Kit *k) const return g.matches("Ninja"); }); if (it != known.constEnd()) { - const bool hasNinja = [k, tool] { - if (Internal::settings(nullptr).ninjaPath().isEmpty()) { - auto findNinja = [](const Environment &env) -> bool { - return !env.searchInPath("ninja").isEmpty(); - }; - if (!findNinja(tool->filePath().deviceEnvironment())) - return findNinja(k->buildEnvironment()); - } - return true; - }(); - - if (hasNinja) + if (isNinjaPresent(k, tool)) return GeneratorInfo("Ninja").toVariant(); } @@ -725,6 +726,18 @@ QVariant CMakeGeneratorKitAspectFactory::defaultValue(const Kit *k) const return GeneratorInfo(it->name).toVariant(); } +bool CMakeGeneratorKitAspectFactory::isNinjaPresent(const Kit *k, const CMakeTool *tool) const +{ + if (Internal::settings(nullptr).ninjaPath().isEmpty()) { + auto findNinja = [](const Environment &env) -> bool { + return !env.searchInPath("ninja").isEmpty(); + }; + if (!findNinja(tool->filePath().deviceEnvironment())) + return findNinja(k->buildEnvironment()); + } + return true; +} + Tasks CMakeGeneratorKitAspectFactory::validate(const Kit *k) const { CMakeTool *tool = CMakeKitAspect::cmakeTool(k); @@ -783,7 +796,7 @@ void CMakeGeneratorKitAspectFactory::fix(Kit *k) [info](const CMakeTool::Generator &g) { return g.matches(info.generator); }); - if (it == known.constEnd()) { + if (it == known.constEnd() || (info.generator == "Ninja" && !isNinjaPresent(k, tool))) { GeneratorInfo dv; dv.fromVariant(defaultValue(k)); setGeneratorInfo(k, dv); From e2be8f9d16ce1e3bac7a3fbef81d15e12daee243 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 27 Jun 2024 13:47:30 +0200 Subject: [PATCH 07/29] CMakePM: Fix having duplicate CMAKE_CXX_COMPILERS entries Do not apply the changes directly to the model, cache and then apply at the right time. Fixes: QTCREATORBUG-27005 Change-Id: Id099f21196900cd0e9787ac27887f2eec36f8045 Reviewed-by: Alessandro Portale --- .../cmakeprojectmanager/cmakebuildconfiguration.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 178c2a68bfa..c3cae5ff62e 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -158,6 +158,7 @@ private: QPushButton *m_batchEditButton = nullptr; QPushButton *m_kitConfiguration = nullptr; + CMakeConfig m_configurationChanges; }; static QModelIndex mapToSource(const QAbstractItemView *view, const QModelIndex &idx) @@ -416,6 +417,11 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) updateButtonState(); m_showProgressTimer.stop(); m_progressIndicator->hide(); + + if (!m_configurationChanges.isEmpty()) { + m_configModel->setBatchEditConfiguration(m_configurationChanges); + m_configurationChanges.clear(); + } updateConfigurationStateSelection(); }); @@ -502,8 +508,9 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) connect(bs, &CMakeBuildSystem::warningOccurred, this, &CMakeBuildSettingsWidget::setWarning); - connect(bs, &CMakeBuildSystem::configurationChanged, - m_configModel, &ConfigModel::setBatchEditConfiguration); + connect(bs, &CMakeBuildSystem::configurationChanged, this, [this](const CMakeConfig &config) { + m_configurationChanges = config; + }); updateFromKit(); connect(m_buildConfig->target(), &Target::kitChanged, From af7382fee86ec673e3789283ae440e0226f20bd5 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 27 Jun 2024 16:46:35 +0200 Subject: [PATCH 08/29] CMakePM: Fix compiling projects upon MSVC Compiler/Linker update Visual Studio is getting a fair number of updates. This involves also an update of the Visual C++ toolchain. This implies changing directory paths from "MSVC/14.39.33519" to "MSVC/ 14.40.33807". The linker "link.exe" is also stored in the same directory as the compiler "cl.exe". This commit makes sure that the linker also gets updated, not just the compiler. Change-Id: If8cd6e716604bc948ec8990921a14425ebcc7c30 Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index c396bde59a1..8c4617144d4 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -2323,6 +2323,18 @@ void CMakeBuildSystem::updateInitialCMakeExpandableVars() } } + // Handle MSVC C/C++ compiler update, by udating also the linker, otherwise projects + // will fail to compile by using a linker that doesn't exist + const FilePath cxxCompiler = config.filePathValueOf("CMAKE_CXX_COMPILER"); + if (!cxxCompiler.isEmpty() && cxxCompiler.fileName() == "cl.exe") { + const FilePath linker = cm.filePathValueOf("CMAKE_LINKER"); + if (!linker.exists()) + config << CMakeConfigItem( + "CMAKE_LINKER", + CMakeConfigItem::FILEPATH, + cxxCompiler.parentDir().pathAppended(linker.fileName()).path().toUtf8()); + } + if (!config.isEmpty()) emit configurationChanged(config); } From b5d6348b67fdf0e8c75af85df821b74cb18b339b Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 27 Jun 2024 17:03:36 +0200 Subject: [PATCH 09/29] CMakePM: Update initial CMake variables also on failed CMake runs A failed CMake run configuration could be the result of an compiler update which then would cause CMake to fail. Make sure to offer an upgrade path to the new Kit compiler values. Change-Id: Ibabeb853259e23fe012d8b00e3d48979deee61a5 Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 8c4617144d4..540192d2d21 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -1488,6 +1488,11 @@ void CMakeBuildSystem::updateFallbackProjectData() Tr::tr("Scan \"%1\" project tree") .arg(project()->displayName()), "CMake.Scan.Tree"); + + // A failed configuration could be the result of an compiler update + // which then would cause CMake to fail. Make sure to offer an upgrade path + // to the new Kit compiler values. + updateInitialCMakeExpandableVars(); } void CMakeBuildSystem::updateCMakeConfiguration(QString &errorMessage) From 4f4c90f8b06ce68f726fd08c21236d06778d47de Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 27 Jun 2024 19:27:36 +0200 Subject: [PATCH 10/29] ExtensionManager: Fix compilation error Amends 5960bb33ef79c29d6c23e9dd7ba34b01ebec7e7a Change-Id: Ib20b537791001317a65ee5c63d39cc2775b6ecb0 Reviewed-by: Cristian Adam --- src/plugins/extensionmanager/extensionsbrowser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index 21d4a79a7ce..937344d2dbf 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include #include From 0dfe7213ebcb4d69657c84c61a5c7441d91e2d18 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 27 Jun 2024 08:29:01 +0200 Subject: [PATCH 11/29] ExtensionManager: Fix qbs build Amends 6ffe1a8061af8f4dd3cd50aba1b9bca51ee4f0c5. Change-Id: Ibb35fe606f25bd1e1b7a5d457062299f50f80af1 Reviewed-by: David Schulz --- src/plugins/extensionmanager/extensionmanager.qbs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/extensionmanager/extensionmanager.qbs b/src/plugins/extensionmanager/extensionmanager.qbs index 1a456824a7c..0d5fa5cb259 100644 --- a/src/plugins/extensionmanager/extensionmanager.qbs +++ b/src/plugins/extensionmanager/extensionmanager.qbs @@ -4,6 +4,7 @@ QtcPlugin { name: "ExtensionManager" Depends { name: "Core" } + Depends { name: "Spinner" } Depends { name: "Tasking" } Depends { name: "Qt.network" } From 2364448f910a9af1ac9965a1e9701e7e2d03424d Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 27 Jun 2024 09:44:26 +0200 Subject: [PATCH 12/29] Revert "Debugger: simplify interrupting windows processes" Ctrl+C events are only handled properly for console applications. When gdb debugs a GUI application the CTRL+C events are not handled. This can be even reproduced with a plain gdb started from CMD. This partially reverts commit 9d88da6c2bc40b17215137d9b2face5aafdfae3d and 670b4ec72987e6fb37ecc7e9e7dd0780ff8e9168. Fixes: QTCREATORBUG-31131 Change-Id: I11c9d9dc08b4dbe450f38e27559b130dd317b675 Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerengine.h | 3 ++ src/plugins/debugger/debuggerruncontrol.cpp | 5 +++ src/plugins/debugger/debuggerruncontrol.h | 1 + src/plugins/debugger/gdb/gdbengine.cpp | 39 ++++++++++++++++----- src/plugins/qnx/qnxdebugsupport.cpp | 2 ++ 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 6b264911cc4..b5e8a3cba8d 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -125,6 +125,9 @@ public: // Used by Valgrind QStringList expectedSignals; + // For QNX debugging + bool useCtrlCStub = false; + // Used by Android to avoid false positives on warnOnRelease bool skipExecutableValidation = false; bool useTargetAsync = false; diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 2ff53099e4b..007d3464bb8 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -276,6 +276,11 @@ void DebuggerRunTool::setSkipExecutableValidation(bool on) m_runParameters.skipExecutableValidation = on; } +void DebuggerRunTool::setUseCtrlCStub(bool on) +{ + m_runParameters.useCtrlCStub = on; +} + void DebuggerRunTool::setBreakOnMain(bool on) { m_runParameters.breakOnMain = on; diff --git a/src/plugins/debugger/debuggerruncontrol.h b/src/plugins/debugger/debuggerruncontrol.h index bfd53299a1b..39fb7e9507f 100644 --- a/src/plugins/debugger/debuggerruncontrol.h +++ b/src/plugins/debugger/debuggerruncontrol.h @@ -100,6 +100,7 @@ protected: void setRemoteChannel(const QUrl &url); void setUseTargetAsync(bool on); void setSkipExecutableValidation(bool on); + void setUseCtrlCStub(bool on); void setIosPlatform(const QString &platform); void setDeviceSymbolsRoot(const QString &deviceSymbolsRoot); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index b31ee7130e4..ca10d27d843 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -126,7 +126,6 @@ const char notCompatibleMessage[] = "is not compatible with target architecture" GdbEngine::GdbEngine() { m_gdbProc.setProcessMode(ProcessMode::Writer); - m_gdbProc.setUseCtrlCStub(true); setObjectName("GdbEngine"); setDebuggerName("GDB"); @@ -676,7 +675,26 @@ void GdbEngine::interruptInferior() } else { showStatusMessage(Tr::tr("Stop requested..."), 5000); showMessage("TRYING TO INTERRUPT INFERIOR"); - interruptInferior2(); + if (HostOsInfo::isWindowsHost() && !m_isQnxGdb) { + IDevice::ConstPtr dev = device(); + QTC_ASSERT(dev, notifyInferiorStopFailed(); return); + DeviceProcessSignalOperation::Ptr signalOperation = dev->signalOperation(); + QTC_ASSERT(signalOperation, notifyInferiorStopFailed(); return); + connect(signalOperation.get(), &DeviceProcessSignalOperation::finished, + this, [this, signalOperation](const QString &error) { + if (error.isEmpty()) { + showMessage("Interrupted " + QString::number(inferiorPid())); + notifyInferiorStopOk(); + } else { + showMessage(error, LogError); + notifyInferiorStopFailed(); + } + }); + signalOperation->setDebuggerCommand(runParameters().debugger.command.executable()); + signalOperation->interruptProcess(inferiorPid()); + } else { + interruptInferior2(); + } } } @@ -1249,11 +1267,9 @@ void GdbEngine::handleStopResponse(const GdbMi &data) handleStop1(data); } -static QStringList stopSignals(const Abi &abi) +static QString stopSignal(const Abi &abi) { - static QStringList winSignals = { "SIGTRAP", "SIGINT" }; - static QStringList unixSignals = { "SIGINT" }; - return abi.os() == Abi::WindowsOS ? winSignals : unixSignals; + return QLatin1String(abi.os() == Abi::WindowsOS ? "SIGTRAP" : "SIGINT"); } void GdbEngine::handleStop1(const GdbMi &data) @@ -1402,7 +1418,7 @@ void GdbEngine::handleStop2(const GdbMi &data) QString meaning = data["signal-meaning"].data(); // Ignore these as they are showing up regularly when // stopping debugging. - if (stopSignals(rp.toolChainAbi).contains(name) || rp.expectedSignals.contains(name)) { + if (name == stopSignal(rp.toolChainAbi) || rp.expectedSignals.contains(name)) { showMessage(name + " CONSIDERED HARMLESS. CONTINUING."); } else if (m_isQnxGdb && name == "0" && meaning == "Signal 0") { showMessage("SIGNAL 0 CONSIDERED BOGUS."); @@ -3807,6 +3823,9 @@ void GdbEngine::setupEngine() CHECK_STATE(EngineSetupRequested); showMessage("TRYING TO START ADAPTER"); + if (isRemoteEngine()) + m_gdbProc.setUseCtrlCStub(runParameters().useCtrlCStub); // This is only set for QNX + const DebuggerRunParameters &rp = runParameters(); CommandLine gdbCommand = rp.debugger.command; @@ -4301,6 +4320,7 @@ void GdbEngine::interruptLocalInferior(qint64 pid) showMessage("TRYING TO INTERRUPT INFERIOR BEFORE PID WAS OBTAINED", LogError); return; } + QString errorMessage; if (runParameters().runAsRoot) { Environment env = Environment::systemEnvironment(); RunControl::provideAskPassEntry(env); @@ -4309,8 +4329,11 @@ void GdbEngine::interruptLocalInferior(qint64 pid) proc.setEnvironment(env); proc.start(); proc.waitForFinished(); + } else if (interruptProcess(pid, &errorMessage)) { + showMessage("Interrupted " + QString::number(pid)); } else { - m_gdbProc.interrupt(); + showMessage(errorMessage, LogError); + notifyInferiorStopFailed(); } } diff --git a/src/plugins/qnx/qnxdebugsupport.cpp b/src/plugins/qnx/qnxdebugsupport.cpp index 322c3553071..27c26e269c0 100644 --- a/src/plugins/qnx/qnxdebugsupport.cpp +++ b/src/plugins/qnx/qnxdebugsupport.cpp @@ -126,6 +126,7 @@ public: setStartMode(AttachToRemoteServer); setCloseMode(KillAtClose); + setUseCtrlCStub(true); setSolibSearchPath(FileUtils::toFilePathList(searchPaths(k))); if (auto qtVersion = dynamic_cast(QtSupport::QtKitAspect::qtVersion(k))) { setSysRoot(qtVersion->qnxTarget()); @@ -195,6 +196,7 @@ public: { setId("QnxAttachDebugSupport"); setUsePortsGatherer(isCppDebugging(), isQmlDebugging()); + setUseCtrlCStub(true); if (isCppDebugging()) { auto pdebugRunner = new PDebugRunner(runControl, portsGatherer()); From 5333082054e754b5eed3adfe150b107fc10781d5 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 27 Jun 2024 12:51:50 +0200 Subject: [PATCH 13/29] Debugger: Silence soft assert Amends c83a0be72d700bc56d32afc8eaaf84ac134f419e. Change-Id: Idb62b20af8052ee7d20f7df2c82125cd12e26738 Reviewed-by: hjk --- src/plugins/debugger/gdb/gdbengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index ca10d27d843..8247664c844 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -470,7 +470,7 @@ void GdbEngine::handleAsyncOutput(const QStringView asyncClass, const GdbMi &res Module module; module.startAddress = 0; module.endAddress = 0; - module.hostPath = Utils::FilePath::fromString(result["host-name"].data()); + module.hostPath = Utils::FilePath::fromUserInput(result["host-name"].data()); const QString target = result["target-name"].data(); module.modulePath = runParameters().inferior.command.executable().withNewPath(target); module.moduleName = module.hostPath.baseName(); From 38e005692ea823f3ad81451f51b8269a98bf206f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 27 Jun 2024 15:34:56 +0200 Subject: [PATCH 14/29] Plugin meta data: Add full stop to descriptions Where they were missing. The text is shown as a paragraph in the extension manager. Change-Id: I6e15c89fe4023b222e9c476f4312e13fcb0905c0 Reviewed-by: Leena Miettinen Reviewed-by: Alessandro Portale --- doc/qtcreatordev/examples/exampleplugin/Example.json.in | 2 +- src/plugins/android/Android.json.in | 2 +- src/plugins/appstatisticsmonitor/AppStatisticsMonitor.json.in | 2 +- src/plugins/autotest/AutoTest.json.in | 2 +- .../autotoolsprojectmanager/AutotoolsProjectManager.json.in | 2 +- src/plugins/axivion/Axivion.json.in | 2 +- src/plugins/baremetal/BareMetal.json.in | 2 +- src/plugins/bazaar/Bazaar.json.in | 2 +- src/plugins/beautifier/Beautifier.json.in | 2 +- src/plugins/bineditor/BinEditor.json.in | 2 +- src/plugins/boot2qt/Boot2Qt.json.in | 2 +- src/plugins/clangcodemodel/ClangCodeModel.json.in | 2 +- src/plugins/clangformat/ClangFormat.json.in | 2 +- src/plugins/clangtools/ClangTools.json.in | 2 +- src/plugins/classview/ClassView.json.in | 2 +- src/plugins/clearcase/ClearCase.json.in | 2 +- src/plugins/cmakeprojectmanager/CMakeProjectManager.json.in | 2 +- src/plugins/coco/Coco.json.in | 2 +- .../CompilationDatabaseProjectManager.json.in | 2 +- src/plugins/conan/Conan.json.in | 2 +- src/plugins/copilot/Copilot.json.in | 2 +- src/plugins/cpaster/CodePaster.json.in | 2 +- src/plugins/cppcheck/Cppcheck.json.in | 2 +- src/plugins/cppeditor/CppEditor.json.in | 2 +- src/plugins/ctfvisualizer/CtfVisualizer.json.in | 2 +- src/plugins/cvs/CVS.json.in | 2 +- src/plugins/debugger/Debugger.json.in | 2 +- src/plugins/designer/Designer.json.in | 2 +- src/plugins/diffeditor/DiffEditor.json.in | 2 +- src/plugins/docker/Docker.json.in | 2 +- src/plugins/extensionmanager/ExtensionManager.json.in | 2 +- src/plugins/fakevim/FakeVim.json.in | 2 +- src/plugins/fossil/Fossil.json.in | 2 +- src/plugins/git/Git.json.in | 2 +- src/plugins/gitlab/GitLab.json.in | 2 +- src/plugins/glsleditor/GLSLEditor.json.in | 2 +- src/plugins/haskell/Haskell.json.in | 2 +- src/plugins/help/Help.json.in | 2 +- src/plugins/imageviewer/ImageViewer.json.in | 2 +- src/plugins/incredibuild/IncrediBuild.json.in | 2 +- src/plugins/insight/Insight.json.in | 2 +- src/plugins/ios/Ios.json.in | 2 +- src/plugins/languageclient/LanguageClient.json.in | 2 +- .../languageclient/lualanguageclient/LuaLanguageClient.json.in | 2 +- src/plugins/macros/Macros.json.in | 2 +- src/plugins/marketplace/Marketplace.json.in | 2 +- src/plugins/mcusupport/McuSupport.json.in | 2 +- src/plugins/mercurial/Mercurial.json.in | 2 +- src/plugins/mesonprojectmanager/MesonProjectManager.json.in | 2 +- src/plugins/modeleditor/ModelEditor.json.in | 2 +- src/plugins/nim/Nim.json.in | 2 +- src/plugins/perforce/Perforce.json.in | 2 +- src/plugins/perfprofiler/PerfProfiler.json.in | 2 +- src/plugins/python/Python.json.in | 2 +- src/plugins/qbsprojectmanager/QbsProjectManager.json.in | 2 +- src/plugins/qmakeprojectmanager/QmakeProjectManager.json.in | 2 +- src/plugins/qmldesignerlite/QmlDesignerLite.json.in | 2 +- src/plugins/qmljseditor/QmlJSEditor.json.in | 2 +- src/plugins/qmlpreview/QmlPreview.json.in | 2 +- src/plugins/qmlprofiler/QmlProfiler.json.in | 2 +- src/plugins/qmlprojectmanager/QmlProjectManager.json.in | 2 +- src/plugins/qnx/Qnx.json.in | 2 +- .../QtApplicationManagerIntegration.json.in | 2 +- src/plugins/remotelinux/RemoteLinux.json.in | 2 +- src/plugins/resourceeditor/ResourceEditor.json.in | 2 +- src/plugins/saferenderer/SafeRenderer.json.in | 2 +- src/plugins/screenrecorder/ScreenRecorder.json.in | 2 +- src/plugins/scxmleditor/ScxmlEditor.json.in | 2 +- src/plugins/serialterminal/SerialTerminal.json.in | 2 +- src/plugins/silversearcher/SilverSearcher.json.in | 2 +- src/plugins/squish/Squish.json.in | 2 +- src/plugins/subversion/Subversion.json.in | 2 +- src/plugins/terminal/Terminal.json.in | 2 +- src/plugins/todo/Todo.json.in | 2 +- src/plugins/updateinfo/UpdateInfo.json.in | 2 +- src/plugins/valgrind/Valgrind.json.in | 2 +- src/plugins/vcpkg/Vcpkg.json.in | 2 +- src/plugins/vcsbase/VcsBase.json.in | 2 +- src/plugins/webassembly/WebAssembly.json.in | 2 +- 79 files changed, 79 insertions(+), 79 deletions(-) diff --git a/doc/qtcreatordev/examples/exampleplugin/Example.json.in b/doc/qtcreatordev/examples/exampleplugin/Example.json.in index c5faf0a2559..b6867bb5167 100644 --- a/doc/qtcreatordev/examples/exampleplugin/Example.json.in +++ b/doc/qtcreatordev/examples/exampleplugin/Example.json.in @@ -8,7 +8,7 @@ "Vendor" : "MyCompany", "Copyright" : "(C) MyCompany", "License" : "Put short license information here", - "Description" : "Put a short description of your plugin here", + "Description" : "Put a short description of your plugin here.", "Url" : "https://www.mycompany.com", //! [2] //! [3] diff --git a/src/plugins/android/Android.json.in b/src/plugins/android/Android.json.in index f314302842f..92d62903a58 100644 --- a/src/plugins/android/Android.json.in +++ b/src/plugins/android/Android.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Develop applications for Android devices", + "Description" : "Develop applications for Android devices.", "LongDescription" : [ "Connect devices with USB to run, debug, and analyze applications built for them.", "You also need:", diff --git a/src/plugins/appstatisticsmonitor/AppStatisticsMonitor.json.in b/src/plugins/appstatisticsmonitor/AppStatisticsMonitor.json.in index 757acf5052f..26202be6843 100644 --- a/src/plugins/appstatisticsmonitor/AppStatisticsMonitor.json.in +++ b/src/plugins/appstatisticsmonitor/AppStatisticsMonitor.json.in @@ -14,7 +14,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Visualize CPU and Memory consumption for running applications", + "Description" : "Visualize CPU and Memory consumption for running applications.", "LongDescription" : [ "Select an application to monitor its performance in real-time." ], diff --git a/src/plugins/autotest/AutoTest.json.in b/src/plugins/autotest/AutoTest.json.in index 041d62a0f43..50a0aa7ef5d 100644 --- a/src/plugins/autotest/AutoTest.json.in +++ b/src/plugins/autotest/AutoTest.json.in @@ -12,7 +12,7 @@ "", "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." ], -"Description" : "Create code based tests and build system based tests", +"Description" : "Create code based tests and build system based tests.", "LongDescription" : [ "Code based testing offers special handling for particular testing frameworks that strongly ties to the underlying code models or specialized parsers.", "Build system based testing is independent from any testing frameworks. It retrieves information directly from the underlying build system and uses it or even the build system as such to execute the respective tests." diff --git a/src/plugins/autotoolsprojectmanager/AutotoolsProjectManager.json.in b/src/plugins/autotoolsprojectmanager/AutotoolsProjectManager.json.in index 008d370d73c..dfb233c23ae 100644 --- a/src/plugins/autotoolsprojectmanager/AutotoolsProjectManager.json.in +++ b/src/plugins/autotoolsprojectmanager/AutotoolsProjectManager.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Build Systems", - "Description" : "Open Autotools-based projects in Qt Creator", + "Description" : "Open Autotools-based projects in Qt Creator.", "LongDescription" : [ "You also need:", "- Autotools", diff --git a/src/plugins/axivion/Axivion.json.in b/src/plugins/axivion/Axivion.json.in index c83b471b8a2..215b48595bd 100644 --- a/src/plugins/axivion/Axivion.json.in +++ b/src/plugins/axivion/Axivion.json.in @@ -15,7 +15,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Code Analyzer", - "Description" : "Access an Axivion dashboard server", + "Description" : "Access an Axivion dashboard server.", "LongDescription" : [ "Protect software from erosion with static code analysis, architecture analysis, and code-smells-detection." ], diff --git a/src/plugins/baremetal/BareMetal.json.in b/src/plugins/baremetal/BareMetal.json.in index 7499c5a773e..f4a7ded8112 100644 --- a/src/plugins/baremetal/BareMetal.json.in +++ b/src/plugins/baremetal/BareMetal.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Develop applications for bare metal devices", + "Description" : "Develop applications for bare metal devices.", "LongDescription" : [ "Adds a target for bare metal development.", "Connect devices with debug server providers to run, debug, and analyze applications built for them.", diff --git a/src/plugins/bazaar/Bazaar.json.in b/src/plugins/bazaar/Bazaar.json.in index 41d2ff99093..4adb5553c94 100644 --- a/src/plugins/bazaar/Bazaar.json.in +++ b/src/plugins/bazaar/Bazaar.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Access the Bazaar version control system", + "Description" : "Access the Bazaar version control system.", "LongDescription" : [ "You also need:", "- Bazaar" diff --git a/src/plugins/beautifier/Beautifier.json.in b/src/plugins/beautifier/Beautifier.json.in index e00653b6f58..c73bc074150 100644 --- a/src/plugins/beautifier/Beautifier.json.in +++ b/src/plugins/beautifier/Beautifier.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "C++", - "Description" : "Apply indentation and style to source code files", + "Description" : "Apply indentation and style to source code files.", "LongDescription" : [ "You also need one of the following tools:", "- Artistic Style", diff --git a/src/plugins/bineditor/BinEditor.json.in b/src/plugins/bineditor/BinEditor.json.in index 8a3bad5e88b..db1f9981df1 100644 --- a/src/plugins/bineditor/BinEditor.json.in +++ b/src/plugins/bineditor/BinEditor.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Creator", - "Description" : "Edit binary files", + "Description" : "Edit binary files.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/boot2qt/Boot2Qt.json.in b/src/plugins/boot2qt/Boot2Qt.json.in index c2ece20d50e..ba7146da3d6 100644 --- a/src/plugins/boot2qt/Boot2Qt.json.in +++ b/src/plugins/boot2qt/Boot2Qt.json.in @@ -15,7 +15,7 @@ ], "Category" : "Device Support", - "Description" : "Develop applications for Boot to Qt devices", + "Description" : "Develop applications for Boot to Qt devices.", "LongDescription" : [ "Connect devices with a USB cable, or a wired or wireless connection, depending on the device to run, debug, and analyze applications built for them.", "You also need:", diff --git a/src/plugins/clangcodemodel/ClangCodeModel.json.in b/src/plugins/clangcodemodel/ClangCodeModel.json.in index 6a1dcf77291..56da5a325b8 100644 --- a/src/plugins/clangcodemodel/ClangCodeModel.json.in +++ b/src/plugins/clangcodemodel/ClangCodeModel.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "C++", - "Description" : "Use Clang code model instead of the built-in code model", + "Description" : "Use Clang code model instead of the built-in code model.", "LongDescription" : [ "The code model is the part of an IDE that understands the programming language you are using to write your application. With it, Qt Creator can help you code faster and avoid errors." ], diff --git a/src/plugins/clangformat/ClangFormat.json.in b/src/plugins/clangformat/ClangFormat.json.in index ba95c1c81d7..d845aff6d18 100644 --- a/src/plugins/clangformat/ClangFormat.json.in +++ b/src/plugins/clangformat/ClangFormat.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "C++", - "Description" : "Indent and format C++ code", + "Description" : "Indent and format C++ code.", "LongDescription" : [ "ClangFormat is an alternative for the built-in indenter." ], diff --git a/src/plugins/clangtools/ClangTools.json.in b/src/plugins/clangtools/ClangTools.json.in index 04972829c0f..a8c9c6d9ae7 100644 --- a/src/plugins/clangtools/ClangTools.json.in +++ b/src/plugins/clangtools/ClangTools.json.in @@ -13,7 +13,7 @@ "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." ], "Category" : "Code Analyzer", - "Description" : "Find problems in C, C++, and Objective-C source code", + "Description" : "Find problems in C, C++, and Objective-C source code.", "LongDescription" : [ "Use Clang Tools for static code analysis:", "- Clang-Tidy has diagnostics and fixes for typical programming errors, such as style violations or interface misuse.", diff --git a/src/plugins/classview/ClassView.json.in b/src/plugins/classview/ClassView.json.in index 0c0572a0484..3368fc7375b 100644 --- a/src/plugins/classview/ClassView.json.in +++ b/src/plugins/classview/ClassView.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "C++", - "Description" : "View the class hierarchy of currently open projects", + "Description" : "View the class hierarchy of currently open projects.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/clearcase/ClearCase.json.in b/src/plugins/clearcase/ClearCase.json.in index a4f997601d9..c5a9722a2c0 100644 --- a/src/plugins/clearcase/ClearCase.json.in +++ b/src/plugins/clearcase/ClearCase.json.in @@ -15,7 +15,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Access an IBM Rational ClearCase server", + "Description" : "Access an IBM Rational ClearCase server.", "LongDescription" : [ "You also need:", "- ClearCase" diff --git a/src/plugins/cmakeprojectmanager/CMakeProjectManager.json.in b/src/plugins/cmakeprojectmanager/CMakeProjectManager.json.in index 72621cda105..3a8cceda3e8 100644 --- a/src/plugins/cmakeprojectmanager/CMakeProjectManager.json.in +++ b/src/plugins/cmakeprojectmanager/CMakeProjectManager.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Build Systems", - "Description" : "Automate the configuration of build systems with CMake", + "Description" : "Automate the configuration of build systems with CMake.", "LongDescription" : [ "CMake controls the software compilation process by using simple configuration files, called CMakeLists.txt files.", "You also need:", diff --git a/src/plugins/coco/Coco.json.in b/src/plugins/coco/Coco.json.in index 4da4961402b..74ad4d34688 100644 --- a/src/plugins/coco/Coco.json.in +++ b/src/plugins/coco/Coco.json.in @@ -13,7 +13,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Access the Coco CoverageBrowser", + "Description" : "Access the Coco CoverageBrowser.", "LongDescription" : [ "View the results from the Coco CoverageBrowser to make tests more efficient and complete." ], diff --git a/src/plugins/compilationdatabaseprojectmanager/CompilationDatabaseProjectManager.json.in b/src/plugins/compilationdatabaseprojectmanager/CompilationDatabaseProjectManager.json.in index 9dd0696934c..a72026b8a46 100644 --- a/src/plugins/compilationdatabaseprojectmanager/CompilationDatabaseProjectManager.json.in +++ b/src/plugins/compilationdatabaseprojectmanager/CompilationDatabaseProjectManager.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Build Systems", - "Description" : "Open compilation databases as projects", + "Description" : "Open compilation databases as projects.", "LongDescription" : [ "The JSON compilation database format replays single builds independently of the build system.", "A compilation database is a list of files and the compiler flags that are used to compile the files. It feeds the code model with the necessary information for correctly parsing the code when you open a file for editing.", diff --git a/src/plugins/conan/Conan.json.in b/src/plugins/conan/Conan.json.in index 4d5fd7412ea..78d1e8d8f7a 100644 --- a/src/plugins/conan/Conan.json.in +++ b/src/plugins/conan/Conan.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Experimental" : true, - "Description" : "Integrate C or C++ libraries into projects", + "Description" : "Integrate C or C++ libraries into projects.", "LongDescription" : [ "You also need:", "- Conan" diff --git a/src/plugins/copilot/Copilot.json.in b/src/plugins/copilot/Copilot.json.in index 7e04ed8b0d2..788f26f2e18 100644 --- a/src/plugins/copilot/Copilot.json.in +++ b/src/plugins/copilot/Copilot.json.in @@ -13,7 +13,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "View suggestions from GitHub Copilot in code editor", + "Description" : "View suggestions from GitHub Copilot in code editor.", "LongDescription" : [ "You also need:", "- An active GitHub Copilot subscription", diff --git a/src/plugins/cpaster/CodePaster.json.in b/src/plugins/cpaster/CodePaster.json.in index ee852df2162..f5239abe2b5 100644 --- a/src/plugins/cpaster/CodePaster.json.in +++ b/src/plugins/cpaster/CodePaster.json.in @@ -12,7 +12,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Access code-pasting services", + "Description" : "Access code-pasting services.", "LongDescription" : [ "Paste snippets of text, such as code or diffs, to a server or fetch them from the server." ], diff --git a/src/plugins/cppcheck/Cppcheck.json.in b/src/plugins/cppcheck/Cppcheck.json.in index dd9ba185d1e..47c0804bc64 100644 --- a/src/plugins/cppcheck/Cppcheck.json.in +++ b/src/plugins/cppcheck/Cppcheck.json.in @@ -14,7 +14,7 @@ "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." ], "Category" : "Code Analyzer", - "Description" : "Find errors in C++ code with static analysis", + "Description" : "Find errors in C++ code with static analysis.", "LongDescription" : [ "You also need:", "- cppcheck" diff --git a/src/plugins/cppeditor/CppEditor.json.in b/src/plugins/cppeditor/CppEditor.json.in index 169df1ed651..9244161993a 100644 --- a/src/plugins/cppeditor/CppEditor.json.in +++ b/src/plugins/cppeditor/CppEditor.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "C++", - "Description" : "Edit C++ source and header files", + "Description" : "Edit C++ source and header files.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES}, diff --git a/src/plugins/ctfvisualizer/CtfVisualizer.json.in b/src/plugins/ctfvisualizer/CtfVisualizer.json.in index a887857bc01..1b6f891cb7e 100644 --- a/src/plugins/ctfvisualizer/CtfVisualizer.json.in +++ b/src/plugins/ctfvisualizer/CtfVisualizer.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Code Analyzer", - "Description" : "View Chrome Trace Format (CTF) files", + "Description" : "View Chrome Trace Format (CTF) files.", "LongDescription" : [ "You also need:", "- CTF files (in Trace Event Format)" diff --git a/src/plugins/cvs/CVS.json.in b/src/plugins/cvs/CVS.json.in index 9ea0a986ca5..0ac2a7283b4 100644 --- a/src/plugins/cvs/CVS.json.in +++ b/src/plugins/cvs/CVS.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Access the CVS open source version control system", + "Description" : "Access the CVS open source version control system.", "LongDescription" : [], "DisabledByDefault" : true, "Url" : "https://www.qt.io", diff --git a/src/plugins/debugger/Debugger.json.in b/src/plugins/debugger/Debugger.json.in index ce4282d0ed7..c86d3988bf3 100644 --- a/src/plugins/debugger/Debugger.json.in +++ b/src/plugins/debugger/Debugger.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Creator", - "Description" : "Debug applications with native debuggers", + "Description" : "Debug applications with native debuggers.", "LongDescription" : [ "Debug an application to see what happens inside it while it runs or when it crashes.", "The debugger extension acts as an interface between the Qt Creator core and native debuggers.", diff --git a/src/plugins/designer/Designer.json.in b/src/plugins/designer/Designer.json.in index 966becb0d41..5f735730f70 100644 --- a/src/plugins/designer/Designer.json.in +++ b/src/plugins/designer/Designer.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Creator", - "Description" : "Design Qt-widgets based UIs", + "Description" : "Design Qt-widgets based UIs.", "LongDescription" : [ "Create widgets and forms that are integrated with Qt C++ code." ], diff --git a/src/plugins/diffeditor/DiffEditor.json.in b/src/plugins/diffeditor/DiffEditor.json.in index 754475b537c..4162632dfc4 100644 --- a/src/plugins/diffeditor/DiffEditor.json.in +++ b/src/plugins/diffeditor/DiffEditor.json.in @@ -12,7 +12,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Compare two files or two versions of a file", + "Description" : "Compare two files or two versions of a file.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/docker/Docker.json.in b/src/plugins/docker/Docker.json.in index d587e7d0a9e..4cbb6cbb9d9 100644 --- a/src/plugins/docker/Docker.json.in +++ b/src/plugins/docker/Docker.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Experimental" : true, - "Description" : "Create Docker devices from Docker images", + "Description" : "Create Docker devices from Docker images.", "LongDescription" : [ "You also need:", "- Docker CLI" diff --git a/src/plugins/extensionmanager/ExtensionManager.json.in b/src/plugins/extensionmanager/ExtensionManager.json.in index e3710427c4f..7e2056ebf5c 100644 --- a/src/plugins/extensionmanager/ExtensionManager.json.in +++ b/src/plugins/extensionmanager/ExtensionManager.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Core", - "Description" : "Extension Manager", + "Description" : "Manage ${IDE_DISPLAY_NAME} extensions.", "Experimental": true, "DisabledByDefault": false, "Url" : "https://www.qt.io", diff --git a/src/plugins/fakevim/FakeVim.json.in b/src/plugins/fakevim/FakeVim.json.in index b2ae7f2a87b..1bb613fffc3 100644 --- a/src/plugins/fakevim/FakeVim.json.in +++ b/src/plugins/fakevim/FakeVim.json.in @@ -12,7 +12,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Run the main editor in a manner similar to the Vim editor", + "Description" : "Run the main editor in a manner similar to the Vim editor.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/fossil/Fossil.json.in b/src/plugins/fossil/Fossil.json.in index 02bc83e599d..644998a6d15 100644 --- a/src/plugins/fossil/Fossil.json.in +++ b/src/plugins/fossil/Fossil.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Access the Fossil version control system", + "Description" : "Access the Fossil version control system.", "LongDescription" : [ "You also need:", "- Fossil" diff --git a/src/plugins/git/Git.json.in b/src/plugins/git/Git.json.in index af1f550a7ad..d02e2d75150 100644 --- a/src/plugins/git/Git.json.in +++ b/src/plugins/git/Git.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Access the Git version control system", + "Description" : "Access the Git version control system.", "LongDescription" : [ "You also need:", "- Git" diff --git a/src/plugins/gitlab/GitLab.json.in b/src/plugins/gitlab/GitLab.json.in index e446654bc4f..5d58885d608 100644 --- a/src/plugins/gitlab/GitLab.json.in +++ b/src/plugins/gitlab/GitLab.json.in @@ -13,7 +13,7 @@ "", "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." ], -"Description" : "Create connections to GitLab servers", +"Description" : "Create connections to GitLab servers.", "LongDescription" : [ "You also need:", "- GitLab account" diff --git a/src/plugins/glsleditor/GLSLEditor.json.in b/src/plugins/glsleditor/GLSLEditor.json.in index dd3b7529698..254c53a2cf2 100644 --- a/src/plugins/glsleditor/GLSLEditor.json.in +++ b/src/plugins/glsleditor/GLSLEditor.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Other Languages", - "Description" : "Create OpenGL fragment and vertex shaders", + "Description" : "Create OpenGL fragment and vertex shaders.", "LongDescription" : [ "Use the shaders to display hardware-accelerated 3D graphics alongside a more conventional UI." ], diff --git a/src/plugins/haskell/Haskell.json.in b/src/plugins/haskell/Haskell.json.in index 1473874ad95..96147540a37 100644 --- a/src/plugins/haskell/Haskell.json.in +++ b/src/plugins/haskell/Haskell.json.in @@ -6,7 +6,7 @@ "Vendor" : "Eike Ziller", "Copyright" : "(C) Eike Ziller", "License" : "MIT", - "Description" : "Write source code in the Haskell language", + "Description" : "Write source code in the Haskell language.", "LongDescription" : [], "Url" : "https://haskell.org", ${IDE_PLUGIN_DEPENDENCIES}, diff --git a/src/plugins/help/Help.json.in b/src/plugins/help/Help.json.in index cbb172e3b97..a6afd3a12a2 100644 --- a/src/plugins/help/Help.json.in +++ b/src/plugins/help/Help.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Core", - "Description" : "Get help for Qt API and read Qt and other documentation", + "Description" : "Get help for Qt API and read Qt and other documentation.", "LongDescription" : [ "You also need:", "- Qt documentation as help files (.qch)" diff --git a/src/plugins/imageviewer/ImageViewer.json.in b/src/plugins/imageviewer/ImageViewer.json.in index 4062ba072b6..4b3e37cb9c8 100644 --- a/src/plugins/imageviewer/ImageViewer.json.in +++ b/src/plugins/imageviewer/ImageViewer.json.in @@ -12,7 +12,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "View images, and create pixmaps from SVG images", + "Description" : "View images, and create pixmaps from SVG images.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES}, diff --git a/src/plugins/incredibuild/IncrediBuild.json.in b/src/plugins/incredibuild/IncrediBuild.json.in index a9bdab7ae30..8874505ff5a 100644 --- a/src/plugins/incredibuild/IncrediBuild.json.in +++ b/src/plugins/incredibuild/IncrediBuild.json.in @@ -15,7 +15,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Spend less time on building C++ code", + "Description" : "Spend less time on building C++ code.", "LongDescription" : [ "You also need:", "- IncrediBuild Agent" diff --git a/src/plugins/insight/Insight.json.in b/src/plugins/insight/Insight.json.in index 1f60965d80a..509cc361200 100644 --- a/src/plugins/insight/Insight.json.in +++ b/src/plugins/insight/Insight.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Quick", - "Description" : "Collect information about how an application is used", + "Description" : "Collect information about how an application is used.", "LongDescription" : [ "Use Qt Insight with Qt Design Studio.", "You also need:", diff --git a/src/plugins/ios/Ios.json.in b/src/plugins/ios/Ios.json.in index 2d3eedfef92..d58f96bc076 100644 --- a/src/plugins/ios/Ios.json.in +++ b/src/plugins/ios/Ios.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Develop applications for iOS devices", + "Description" : "Develop applications for iOS devices.", "LongDescription" : [ "Connect devices with USB or use the iOS simulator to run, debug, and analyze applications built for iOS.", "You also need:", diff --git a/src/plugins/languageclient/LanguageClient.json.in b/src/plugins/languageclient/LanguageClient.json.in index 7b3ae960522..3c27e907cc8 100644 --- a/src/plugins/languageclient/LanguageClient.json.in +++ b/src/plugins/languageclient/LanguageClient.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Other Languages", - "Description" : "Get code editing services", + "Description" : "Get code editing services.", "LongDescription" : [ "Offers code completion, highlighting of the symbol under cursor, and jumping to the symbol definition, as well as diagnostics from the language server." ], diff --git a/src/plugins/languageclient/lualanguageclient/LuaLanguageClient.json.in b/src/plugins/languageclient/lualanguageclient/LuaLanguageClient.json.in index 9497e53668b..0ac46c37638 100644 --- a/src/plugins/languageclient/lualanguageclient/LuaLanguageClient.json.in +++ b/src/plugins/languageclient/lualanguageclient/LuaLanguageClient.json.in @@ -15,7 +15,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Scripting", - "Description" : "Lua Language Client scripting support", + "Description" : "Lua Language Client scripting support.", "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} } diff --git a/src/plugins/macros/Macros.json.in b/src/plugins/macros/Macros.json.in index c43396152b6..32740b0f7ac 100644 --- a/src/plugins/macros/Macros.json.in +++ b/src/plugins/macros/Macros.json.in @@ -12,7 +12,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Record and play macros in text editors", + "Description" : "Record and play macros in text editors.", "LongDescription" : [ "When you have a file open in the code editor, you can record a keyboard sequence as a macro. You can then play the macro to repeat the sequence. You can save the latest macro and assign a keyboard shortcut for running it or run it from the locator." ], diff --git a/src/plugins/marketplace/Marketplace.json.in b/src/plugins/marketplace/Marketplace.json.in index d6422b2cd90..5d529715878 100644 --- a/src/plugins/marketplace/Marketplace.json.in +++ b/src/plugins/marketplace/Marketplace.json.in @@ -12,7 +12,7 @@ "", "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." ], -"Description" : "Install applications from Qt Marketplace", +"Description" : "Install applications from Qt Marketplace.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/mcusupport/McuSupport.json.in b/src/plugins/mcusupport/McuSupport.json.in index 10649759893..80eb3b4eada 100644 --- a/src/plugins/mcusupport/McuSupport.json.in +++ b/src/plugins/mcusupport/McuSupport.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Develop for microcontrollers", + "Description" : "Develop for microcontrollers.", "LongDescription" : [ "Use subsets of QML and Qt Quick Controls to create user interfaces for devices that are powered by microcontrollers (MCU).", "You also need:", diff --git a/src/plugins/mercurial/Mercurial.json.in b/src/plugins/mercurial/Mercurial.json.in index e6be967df69..bcd6da7610a 100644 --- a/src/plugins/mercurial/Mercurial.json.in +++ b/src/plugins/mercurial/Mercurial.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Access the Mercurial source control management tool", + "Description" : "Access the Mercurial source control management tool.", "LongDescription" : [ "You also need:", "- Mercurial" diff --git a/src/plugins/mesonprojectmanager/MesonProjectManager.json.in b/src/plugins/mesonprojectmanager/MesonProjectManager.json.in index 0dbf60653fa..cd293ce4d75 100644 --- a/src/plugins/mesonprojectmanager/MesonProjectManager.json.in +++ b/src/plugins/mesonprojectmanager/MesonProjectManager.json.in @@ -15,7 +15,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Build Systems", - "Description" : "Generate build systems with Meson", + "Description" : "Generate build systems with Meson.", "LongDescription" : [ "Generate build systems with Meson using Ninja as the main backend.", "You also need:", diff --git a/src/plugins/modeleditor/ModelEditor.json.in b/src/plugins/modeleditor/ModelEditor.json.in index bbf2d204d47..80680306753 100644 --- a/src/plugins/modeleditor/ModelEditor.json.in +++ b/src/plugins/modeleditor/ModelEditor.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Modeling", - "Description" : "Create Universal Modeling Language (UML) style models", + "Description" : "Create Universal Modeling Language (UML) style models.", "LongDescription" : [ "Create structured and behavioral diagrams that offer different views to your system. However, the editor uses a variant of UML and has only a subset of properties for specifying the appearance of model elements." ], diff --git a/src/plugins/nim/Nim.json.in b/src/plugins/nim/Nim.json.in index 82369b316b9..ea53307e0de 100644 --- a/src/plugins/nim/Nim.json.in +++ b/src/plugins/nim/Nim.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Other Languages", - "Description" : "Develop applications using the Nim programming language", + "Description" : "Develop applications using the Nim programming language.", "LongDescription" : [ "You also need:", "- Nimble packaging manager" diff --git a/src/plugins/perforce/Perforce.json.in b/src/plugins/perforce/Perforce.json.in index 1bfaa701edd..69e8f8e5e3e 100644 --- a/src/plugins/perforce/Perforce.json.in +++ b/src/plugins/perforce/Perforce.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Access the Perforce software configuration management system", + "Description" : "Access the Perforce software configuration management system.", "LongDescription" : [ "You also need:", "- Perforce" diff --git a/src/plugins/perfprofiler/PerfProfiler.json.in b/src/plugins/perfprofiler/PerfProfiler.json.in index eeca090e048..6af65d17bdb 100644 --- a/src/plugins/perfprofiler/PerfProfiler.json.in +++ b/src/plugins/perfprofiler/PerfProfiler.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Code Analyzer", - "Description" : "Analyze the CPU and memory usage of an application", + "Description" : "Analyze the CPU and memory usage of an application.", "LongDescription" : [ "Works on embedded devices and, to a limited extent, on Linux desktop platforms.", "You also need:", diff --git a/src/plugins/python/Python.json.in b/src/plugins/python/Python.json.in index 19c46948642..11432e74cca 100644 --- a/src/plugins/python/Python.json.in +++ b/src/plugins/python/Python.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Other Languages", - "Description" : "Develop applications using the Qt bindings for the Python programming language", + "Description" : "Develop applications using the Qt bindings for the Python programming language.", "LongDescription" : [ "You also need:", "- Qt for Python", diff --git a/src/plugins/qbsprojectmanager/QbsProjectManager.json.in b/src/plugins/qbsprojectmanager/QbsProjectManager.json.in index 522593366da..3d5f3a07ba5 100644 --- a/src/plugins/qbsprojectmanager/QbsProjectManager.json.in +++ b/src/plugins/qbsprojectmanager/QbsProjectManager.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Build Systems", - "Description" : "Build applications with Qbs", + "Description" : "Build applications with Qbs.", "LongDescription" : [ "Generate a build graph from a high-level project description (like with qmake or CMake) and execute the commands in the low-level build graph (like with make)." ], diff --git a/src/plugins/qmakeprojectmanager/QmakeProjectManager.json.in b/src/plugins/qmakeprojectmanager/QmakeProjectManager.json.in index 8b2cc0cb385..c3815d405a5 100644 --- a/src/plugins/qmakeprojectmanager/QmakeProjectManager.json.in +++ b/src/plugins/qmakeprojectmanager/QmakeProjectManager.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Build Systems", - "Description" : "Build applications with qmake", + "Description" : "Build applications with qmake.", "LongDescription" : [ "Use .pro project configuration files and tools that automate the generation of Makefiles." ], diff --git a/src/plugins/qmldesignerlite/QmlDesignerLite.json.in b/src/plugins/qmldesignerlite/QmlDesignerLite.json.in index 80944b30874..0a40a22f77f 100644 --- a/src/plugins/qmldesignerlite/QmlDesignerLite.json.in +++ b/src/plugins/qmldesignerlite/QmlDesignerLite.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Quick", - "Description" : "Qml Designer Lite", + "Description" : "Qml Designer Lite.", "LongDescription": "Qml Designer Lite is a lightweight version of Qt Design Studio, providing a subset of the features of the full Qt Design Studio.", "Url" : "https://www.qt.io", "Experimental": true, diff --git a/src/plugins/qmljseditor/QmlJSEditor.json.in b/src/plugins/qmljseditor/QmlJSEditor.json.in index f12625d6bf3..d57c9cda3da 100644 --- a/src/plugins/qmljseditor/QmlJSEditor.json.in +++ b/src/plugins/qmljseditor/QmlJSEditor.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Quick", - "Description" : "Edit QML and JavaScript files", + "Description" : "Edit QML and JavaScript files.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/qmlpreview/QmlPreview.json.in b/src/plugins/qmlpreview/QmlPreview.json.in index 76aec1c762e..1c95dd8b8f8 100644 --- a/src/plugins/qmlpreview/QmlPreview.json.in +++ b/src/plugins/qmlpreview/QmlPreview.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Quick", - "Description" : "Preview QML files and Qt Quick applications", + "Description" : "Preview QML files and Qt Quick applications.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/qmlprofiler/QmlProfiler.json.in b/src/plugins/qmlprofiler/QmlProfiler.json.in index 3d34fb9d555..a7bb7c1357a 100644 --- a/src/plugins/qmlprofiler/QmlProfiler.json.in +++ b/src/plugins/qmlprofiler/QmlProfiler.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Quick", - "Description" : "Profile Qt Quick applications", + "Description" : "Profile Qt Quick applications.", "LongDescription" : [ "Find causes for typical performance problems, such as slowness and unresponsive, stuttering user interfaces." ], diff --git a/src/plugins/qmlprojectmanager/QmlProjectManager.json.in b/src/plugins/qmlprojectmanager/QmlProjectManager.json.in index 18388275f3a..9146e1dcfae 100644 --- a/src/plugins/qmlprojectmanager/QmlProjectManager.json.in +++ b/src/plugins/qmlprojectmanager/QmlProjectManager.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Quick", - "Description" : "Qt Quick support", + "Description" : "Qt Quick support.", "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES}, diff --git a/src/plugins/qnx/Qnx.json.in b/src/plugins/qnx/Qnx.json.in index 0cd5d9f251e..526505401e0 100644 --- a/src/plugins/qnx/Qnx.json.in +++ b/src/plugins/qnx/Qnx.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Develop for QNX Neutrino devices", + "Description" : "Develop for QNX Neutrino devices.", "LongDescription" : [ "Connect devices with USB or over a network to run, debug, and analyze applications built for them.", "You also need:", diff --git a/src/plugins/qtapplicationmanager/QtApplicationManagerIntegration.json.in b/src/plugins/qtapplicationmanager/QtApplicationManagerIntegration.json.in index e0979736924..e07a2e40744 100644 --- a/src/plugins/qtapplicationmanager/QtApplicationManagerIntegration.json.in +++ b/src/plugins/qtapplicationmanager/QtApplicationManagerIntegration.json.in @@ -15,7 +15,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Run applications in Qt Application Manager", + "Description" : "Run applications in Qt Application Manager.", "LongDescription" : [ "You also need:", "- Qt Application Manager" diff --git a/src/plugins/remotelinux/RemoteLinux.json.in b/src/plugins/remotelinux/RemoteLinux.json.in index 084f01a20af..944cf8057d3 100644 --- a/src/plugins/remotelinux/RemoteLinux.json.in +++ b/src/plugins/remotelinux/RemoteLinux.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Develop applications for embedded Linux devices", + "Description" : "Develop applications for embedded Linux devices.", "LongDescription" : [ "Connect devices with USB or over a network to run, debug, and analyze applications built for them.", "You also need:", diff --git a/src/plugins/resourceeditor/ResourceEditor.json.in b/src/plugins/resourceeditor/ResourceEditor.json.in index 349c8b0c969..d5cf9f55958 100644 --- a/src/plugins/resourceeditor/ResourceEditor.json.in +++ b/src/plugins/resourceeditor/ResourceEditor.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Qt Creator", - "Description" : "Edit Qt Resource System (.qrc) files", + "Description" : "Edit Qt Resource System (.qrc) files.", "LongDescription" : [ "Store files in the application's executable with the platform-independent Qt Resource System." ], diff --git a/src/plugins/saferenderer/SafeRenderer.json.in b/src/plugins/saferenderer/SafeRenderer.json.in index 3b313c7cff5..0823bad8d8d 100644 --- a/src/plugins/saferenderer/SafeRenderer.json.in +++ b/src/plugins/saferenderer/SafeRenderer.json.in @@ -14,7 +14,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Render safety-critical items in functional safety systems", + "Description" : "Render safety-critical items in functional safety systems.", "LongDescription" : [ "Qt Safe Renderer separates the safety-critical rendering from the other parts of the system, so it can render safety-critical UI elements even if there are failures in the main UI. Therefore, you can use Qt in a system requiring certification without changing the Qt libraries.", "You also need:", diff --git a/src/plugins/screenrecorder/ScreenRecorder.json.in b/src/plugins/screenrecorder/ScreenRecorder.json.in index f982ee3d83b..e4e2deb214b 100644 --- a/src/plugins/screenrecorder/ScreenRecorder.json.in +++ b/src/plugins/screenrecorder/ScreenRecorder.json.in @@ -14,7 +14,7 @@ ], "DisabledByDefault" : true, "SoftLoadable" : true, - "Description" : "Record screens", + "Description" : "Record screens.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/scxmleditor/ScxmlEditor.json.in b/src/plugins/scxmleditor/ScxmlEditor.json.in index 2c1c7ad9eaf..56093750dd8 100644 --- a/src/plugins/scxmleditor/ScxmlEditor.json.in +++ b/src/plugins/scxmleditor/ScxmlEditor.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Modeling", - "Description" : "Create SCXML (State Chart XML) files", + "Description" : "Create SCXML (State Chart XML) files.", "LongDescription" : [ "Visualize how a system reacts to events. State charts define the states that the system can be in, and how the system can move from one state to another." ], diff --git a/src/plugins/serialterminal/SerialTerminal.json.in b/src/plugins/serialterminal/SerialTerminal.json.in index 4cbefbaa20d..ae295ebbcf1 100644 --- a/src/plugins/serialterminal/SerialTerminal.json.in +++ b/src/plugins/serialterminal/SerialTerminal.json.in @@ -14,7 +14,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Serial Port Terminal", + "Description" : "Serial Port Terminal.", "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} } diff --git a/src/plugins/silversearcher/SilverSearcher.json.in b/src/plugins/silversearcher/SilverSearcher.json.in index 8d6aacee699..b4283f1996b 100644 --- a/src/plugins/silversearcher/SilverSearcher.json.in +++ b/src/plugins/silversearcher/SilverSearcher.json.in @@ -13,7 +13,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Search with Silver Searcher", + "Description" : "Search with Silver Searcher.", "LongDescription" : [ "Use the Silver Searcher tool to find in files.", "You also need:", diff --git a/src/plugins/squish/Squish.json.in b/src/plugins/squish/Squish.json.in index 3b52e09fbad..3428ea2191e 100644 --- a/src/plugins/squish/Squish.json.in +++ b/src/plugins/squish/Squish.json.in @@ -13,7 +13,7 @@ "", "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." ], -"Description" : "Test applications with the Squish automated GUI testing framework", +"Description" : "Test applications with the Squish automated GUI testing framework.", "LongDescription" : [ "Map AUTs (application under test) and run Squish test suites and cases.", "You also need:", diff --git a/src/plugins/subversion/Subversion.json.in b/src/plugins/subversion/Subversion.json.in index 0c2f55bd309..2ee61c0a1dc 100644 --- a/src/plugins/subversion/Subversion.json.in +++ b/src/plugins/subversion/Subversion.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Access the Subversion version control system", + "Description" : "Access the Subversion version control system.", "LongDescription" : [ "You also need:", "- Subversion" diff --git a/src/plugins/terminal/Terminal.json.in b/src/plugins/terminal/Terminal.json.in index e976947407b..f196317fc9c 100644 --- a/src/plugins/terminal/Terminal.json.in +++ b/src/plugins/terminal/Terminal.json.in @@ -12,7 +12,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "Open a terminal as an output view", + "Description" : "Open a terminal as an output view.", "LongDescription" : [ "Instead of using an external terminal." ], diff --git a/src/plugins/todo/Todo.json.in b/src/plugins/todo/Todo.json.in index 8574d8a7801..7974af12893 100644 --- a/src/plugins/todo/Todo.json.in +++ b/src/plugins/todo/Todo.json.in @@ -13,7 +13,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "List keywords from files", + "Description" : "List keywords from files.", "LongDescription" : [ "List the BUG, FIXME, NOTE, TODO, and WARNING keywords from the current file, from all project files, or from a subproject." ], diff --git a/src/plugins/updateinfo/UpdateInfo.json.in b/src/plugins/updateinfo/UpdateInfo.json.in index 6e4b699bfb8..33c8ad4d94e 100644 --- a/src/plugins/updateinfo/UpdateInfo.json.in +++ b/src/plugins/updateinfo/UpdateInfo.json.in @@ -13,7 +13,7 @@ "", "Alternatively, this plugin 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 plugin. 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." ], - "Description" : "View information from Qt Installer Framework-based updaters", + "Description" : "View information from Qt Installer Framework-based updaters.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES} diff --git a/src/plugins/valgrind/Valgrind.json.in b/src/plugins/valgrind/Valgrind.json.in index ff35fa05772..6d1dd059bf9 100644 --- a/src/plugins/valgrind/Valgrind.json.in +++ b/src/plugins/valgrind/Valgrind.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Code Analyzer", - "Description" : "Analyze code with Valgrind's Tool Suite", + "Description" : "Analyze code with Valgrind's Tool Suite.", "LongDescription" : [ "Detect problems in memory management with Memcheck and find cache misses in the code with Callgrind.", "You also need:", diff --git a/src/plugins/vcpkg/Vcpkg.json.in b/src/plugins/vcpkg/Vcpkg.json.in index 64dc6a9acc7..9efd5bf023e 100644 --- a/src/plugins/vcpkg/Vcpkg.json.in +++ b/src/plugins/vcpkg/Vcpkg.json.in @@ -14,7 +14,7 @@ ], "Experimental" : true, "SoftLoadable" : true, - "Description" : "Get and manage libraries from the vcpkg package manager", + "Description" : "Get and manage libraries from the vcpkg package manager.", "LongDescription" : [], "Url" : "https://www.qt.io", ${IDE_PLUGIN_DEPENDENCIES}, diff --git a/src/plugins/vcsbase/VcsBase.json.in b/src/plugins/vcsbase/VcsBase.json.in index a1717a9138a..d764c2f3ab7 100644 --- a/src/plugins/vcsbase/VcsBase.json.in +++ b/src/plugins/vcsbase/VcsBase.json.in @@ -13,7 +13,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Version Control", - "Description" : "Provides the technical basis for version control system (VCS) extensions", + "Description" : "Provides the technical basis for version control system (VCS) extensions.", "LongDescription" : [ "You also need:", "- An extension for a VCS tool, such as Git, and the tool" diff --git a/src/plugins/webassembly/WebAssembly.json.in b/src/plugins/webassembly/WebAssembly.json.in index 4947a709839..d72f8512e7a 100644 --- a/src/plugins/webassembly/WebAssembly.json.in +++ b/src/plugins/webassembly/WebAssembly.json.in @@ -15,7 +15,7 @@ "Alternatively, this plugin 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 plugin. 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." ], "Category" : "Device Support", - "Description" : "Integrate Qt applications into web browsers", + "Description" : "Integrate Qt applications into web browsers.", "LongDescription" : [ "WebAssembly is a binary format that allows sand-boxed executable code in web pages.", "You also need:", From 68adb2c086d2a7b43ac1972abee0a5acf0b56d12 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 26 Jun 2024 09:00:44 +0200 Subject: [PATCH 15/29] Debugger: Enable another dumper test for LLDB Passes nowadays. Change-Id: I616f989c23b16a1a89d24461480dd676ce62bccd Reviewed-by: Christian Stenger --- tests/auto/debugger/tst_dumpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 408d6d7c133..473c08f3b2c 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -7613,7 +7613,7 @@ void tst_Dumpers::dumper_data() + Check("dr.@2.c", "3", "int") + Check("dr.d", "4", "int") - + Check("array.0.val", "44", "int") % NoLldbEngine; + + Check("array.0.val", "44", "int"); QTest::newRow("Gdb13393") From 66853bacf793c025bad7a8867df90fcac066e9c9 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 26 Jun 2024 09:15:48 +0200 Subject: [PATCH 16/29] Git: Fix two QMultiMap deprecation warnings #if QT_DEPRECATED_SINCE(6, 0) QT_DEPRECATED_VERSION_X_6_0("Use insert() instead") iterator insertMulti(const Key &key, const T &value) { .... Change-Id: I94c79e16776775b6b2032113e690e73b63a03dc9 Reviewed-by: Christian Stenger --- src/plugins/git/gerrit/gerritpushdialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/git/gerrit/gerritpushdialog.cpp b/src/plugins/git/gerrit/gerritpushdialog.cpp index 1a29273d095..02f7ecdb6b7 100644 --- a/src/plugins/git/gerrit/gerritpushdialog.cpp +++ b/src/plugins/git/gerrit/gerritpushdialog.cpp @@ -101,7 +101,7 @@ void GerritPushDialog::initRemoteBranches() int refBranchIndex = ref.indexOf('/'); qint64 timeT = entries.at(1).left(entries.at(1).indexOf(' ')).toLongLong(); BranchDate bd(ref.mid(refBranchIndex + 1), QDateTime::fromSecsSinceEpoch(timeT).date()); - m_remoteBranches.insertMulti(ref.left(refBranchIndex), bd); + m_remoteBranches.insert(ref.left(refBranchIndex), bd); } m_remoteComboBox->updateRemotes(false); } @@ -339,7 +339,7 @@ void GerritPushDialog::setRemoteBranches(bool includeOld) const QStringList remoteBranches = gitClient().synchronousRepositoryBranches(remoteName, m_workingDir); for (const QString &branch : remoteBranches) - m_remoteBranches.insertMulti(remoteName, {branch, {}}); + m_remoteBranches.insert(remoteName, {branch, {}}); if (remoteBranches.isEmpty()) { m_targetBranchComboBox->setEditable(true); m_targetBranchComboBox->setToolTip( From 37a061aabcc871824ffdb3226c972d336a8ab03f Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 28 Jun 2024 09:12:09 +0200 Subject: [PATCH 17/29] Debugger: Add comment for revert Amends 2364448f910a9af1ac9965a1e9701e7e2d03424d. Change-Id: I1b34c7b69c0817460d20c8ea892bdc54d7658e4a Reviewed-by: hjk --- src/plugins/debugger/gdb/gdbengine.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 8247664c844..41d26962c96 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -675,6 +675,8 @@ void GdbEngine::interruptInferior() } else { showStatusMessage(Tr::tr("Stop requested..."), 5000); showMessage("TRYING TO INTERRUPT INFERIOR"); + // Ctrl+C events are only handled properly for console applications on Windows + // when gdb debugs a GUI application the CTRL+C events are not handled if (HostOsInfo::isWindowsHost() && !m_isQnxGdb) { IDevice::ConstPtr dev = device(); QTC_ASSERT(dev, notifyInferiorStopFailed(); return); From 5308b11fd2d707a15da58b3cef36cd9159ff6a01 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 26 Jun 2024 14:56:21 +0200 Subject: [PATCH 18/29] Doc: Describe new testing preferences - Timeout can now be turned off and on - Limit Files to Path Patterns adds filters for scanning for tests Task-number: QTCREATORBUG-30604 Change-Id: Ia0ab109c2dd2958804fea6f6faa1eb9a80377fe3 Reviewed-by: Christian Stenger --- dist/changelog/changes-14.0.0.md | 8 +++-- ...qtcreator-preferences-testing-general.webp | Bin 8460 -> 8536 bytes .../qtcreator-projects-settings-testing.webp | Bin 3032 -> 4456 bytes .../howto/creator-only/creator-autotest.qdoc | 4 +-- .../creator-projects-settings-overview.qdoc | 2 +- ...g-how-to-limit-files-to-path-patterns.qdoc | 32 ++++++++++++++++++ 6 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 doc/qtcreator/src/projects/creator-only/creator-testing-how-to-limit-files-to-path-patterns.qdoc diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md index e375cb0fa9f..7fe40fd9554 100644 --- a/dist/changelog/changes-14.0.0.md +++ b/dist/changelog/changes-14.0.0.md @@ -246,10 +246,12 @@ Version Control Systems Test Integration ---------------- -* Made the test timeout optional +* Made the test timeout optional in `Preferences` > `Testing` > `General` ([QTCREATORBUG-30668](https://bugreports.qt.io/browse/QTCREATORBUG-30668)) -* Added a project specific option `Limit Files to Path Patterns` for restricting - the search for tests + ([Documentation](https://doc-snapshots.qt.io/qtcreator-14.0/creator-preferences-testing.html)) +* Added the project specific `Limit Files to Path Patterns` option in `Projects` > + `Project Settings` > `Testing` for restricting the search for tests + ([Documentation](https://doc-snapshots.qt.io/qtcreator-14.0/creator-how-to-limit-files-to-path-patterns.html)) ### Qt Test diff --git a/doc/qtcreator/images/qtcreator-preferences-testing-general.webp b/doc/qtcreator/images/qtcreator-preferences-testing-general.webp index 8fb41b64f7dcaa5a28ff61139755649341088d0a..f82694ccc91c0de4ce1a8445ccfe5261f8a8af2e 100644 GIT binary patch literal 8536 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

`z)eCw&4)?9gf?e9%WsomY5yO)dGoHY5O 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 literal 3032 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 \uicontrol {Project Settings} > \uicontrol {Testing}. \section1 Qt Tests @@ -715,7 +715,7 @@ \li Disable statistical analysis and bootstrapping. \endtable - \section2 Specifying Settings for Running CTest-Based Tests + \section1 CTest-Based Tests To specify settings for running CTest-based tests, go to \preferences > \uicontrol {Testing} > \uicontrol {CTest}. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-overview.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-overview.qdoc index 73723857773..2a032dabf75 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-overview.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-overview.qdoc @@ -96,7 +96,7 @@ \li \l{Link projects with GitLab}{GitLab} \li \l{Configure language server workspace}{Language Server} \li \l{Specify settings for quick fixes}{Quick Fixes} - \li \l{Testing} + \li \l{Apply filters before scanning for tests}{Testing} \li \l{Exclude files from to-do lists}{To-Do} (experimental) \endlist diff --git a/doc/qtcreator/src/projects/creator-only/creator-testing-how-to-limit-files-to-path-patterns.qdoc b/doc/qtcreator/src/projects/creator-only/creator-testing-how-to-limit-files-to-path-patterns.qdoc new file mode 100644 index 00000000000..32d58d028dd --- /dev/null +++ b/doc/qtcreator/src/projects/creator-only/creator-testing-how-to-limit-files-to-path-patterns.qdoc @@ -0,0 +1,32 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-how-to-limit-files-to-path-patterns.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-test + \ingroup creator-how-to-projects-configure + + \title Apply filters before scanning for tests + + To override testing preferences for the current project: + + \list 1 + \li Go to \uicontrol Projects > \uicontrol {Project Settings} > + \uicontrol {Testing}. + \image qtcreator-projects-settings-testing.webp {Testing settings in Projects mode} + \li Clear \uicontrol {Use global settings} to select the tests to handle + for the project. + \li To automatically run all or selected tests after successfully + building the current project, select \uicontrol All or + \uicontrol Selected in \uicontrol {Automatically run tests after build}. + \li To apply path filters before scanning for tests, select + \uicontrol {Limit Files to Path Patterns}. + \li Select \uicontrol Add to add the filters as wildcard expressions. + \endlist + + To remove the selected filter, select \uicontrol Remove. + + \sa {Test}{How To: Test}, {Test Results}, {Testing} +*/ From e311a3bf616d7be6e214b169fb858d4c7e1cf0e2 Mon Sep 17 00:00:00 2001 From: Burak Hancerli Date: Wed, 26 Jun 2024 16:09:34 +0200 Subject: [PATCH 19/29] QmlProjectManager: Fix main qml file path and duplicate signal connection Task-number: QTCREATORBUG-30685 Change-Id: I3d3a0d1bee85b56e43b8bb2e591aa56528554e06 Reviewed-by: Christian Stenger --- src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp index 983b7126336..19f2f194717 100644 --- a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp +++ b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp @@ -49,6 +49,10 @@ QmlMainFileAspect::QmlMainFileAspect(AspectContainer *container) this, &QmlMainFileAspect::changeCurrentFile); connect(EditorManager::instance(), &EditorManager::currentDocumentStateChanged, this, [this] { changeCurrentFile(); }); + connect(ProjectExplorerPlugin::instance(), + &ProjectExplorerPlugin::fileListChanged, + this, + &QmlMainFileAspect::updateFileComboBox); } QmlMainFileAspect::~QmlMainFileAspect() @@ -63,9 +67,6 @@ void QmlMainFileAspect::addToLayout(Layouting::Layout &parent) m_fileListCombo->setModel(&m_fileListModel); updateFileComboBox(); - - connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::fileListChanged, - this, &QmlMainFileAspect::updateFileComboBox); connect(m_fileListCombo, &QComboBox::activated, this, &QmlMainFileAspect::setMainScript); parent.addItems({Tr::tr("Main QML file:"), m_fileListCombo.data()}); @@ -93,7 +94,7 @@ void QmlMainFileAspect::updateFileComboBox() const FilePath projectDir = m_target->project()->projectDirectory(); if (mainScriptSource() == FileInProjectFile) { - const FilePath mainScriptInFilePath = projectDir.relativeChildPath(mainScript()); + const FilePath mainScriptInFilePath = mainScript().relativePathFrom(projectDir); m_fileListModel.clear(); m_fileListModel.appendRow(new QStandardItem(mainScriptInFilePath.toString())); if (m_fileListCombo) From 06a01d56a5781027a12cc7c41cb194aefc7359d1 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 28 Jun 2024 12:18:54 +0200 Subject: [PATCH 20/29] Bump version to 14.0.0-rc1 Change-Id: I09803077f7387a2ace85a074498c9f503a7d190a Reviewed-by: David Schulz --- cmake/QtCreatorIDEBranding.cmake | 6 +++--- qbs/modules/qtc/qtc.qbs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index 9ad3bf4f135..d60cfdaf2ac 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -1,6 +1,6 @@ -set(IDE_VERSION "13.0.83") # The IDE version. -set(IDE_VERSION_COMPAT "13.0.83") # The IDE Compatibility version. -set(IDE_VERSION_DISPLAY "14.0.0-beta2") # The IDE display version. +set(IDE_VERSION "13.0.84") # The IDE version. +set(IDE_VERSION_COMPAT "13.0.84") # The IDE Compatibility version. +set(IDE_VERSION_DISPLAY "14.0.0-rc1") # The IDE display version. set(IDE_COPYRIGHT_YEAR "2024") # The IDE current copyright year. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index 55b365edca9..04016cbb25e 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -4,16 +4,16 @@ import qbs.FileInfo import qbs.Utilities Module { - property string qtcreator_display_version: '14.0.0-beta2' + property string qtcreator_display_version: '14.0.0-rc1' property string ide_version_major: '13' property string ide_version_minor: '0' - property string ide_version_release: '83' + property string ide_version_release: '84' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release property string ide_compat_version_major: '13' property string ide_compat_version_minor: '0' - property string ide_compat_version_release: '83' + property string ide_compat_version_release: '84' property string qtcreator_compat_version: ide_compat_version_major + '.' + ide_compat_version_minor + '.' + ide_compat_version_release From 97339578623f8e82b1bc85d2de8aeb2816b3fb24 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 24 Jun 2024 09:48:21 +0200 Subject: [PATCH 21/29] Dumper: merge put pointer functions from cdbbridge into dumper base And remove the now unused DumperBase.Type.targetName helper function. We can use the typeId nowadays for this. This reduces duplicated code and simplifies adjustments in the base implementation without breaking the cdbbridge. Change-Id: If76297b83f088d98493c6f5aceea8fa93093e42e Reviewed-by: Christian Stenger --- share/qtcreator/debugger/cdbbridge.py | 81 +-------------------------- share/qtcreator/debugger/dumper.py | 12 +--- 2 files changed, 4 insertions(+), 89 deletions(-) diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index 1ce2a5f96fd..accf3780c2f 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -479,7 +479,7 @@ class Dumper(DumperBase): else: val = self.Value(self) val.laddress = value.pointer() - val.typeid = self.typeid_for_string(value.type.targetName) + val.typeid = self.type_target(value.typeid) val.nativeValue = value.nativeValue return val @@ -710,85 +710,6 @@ class Dumper(DumperBase): for i in self.childRange(): self.putSubItem(i, self.createValue(addrBase + i * innerSize, innerType)) - def tryPutSimpleFormattedPointer(self, ptr, typeName, innerType, displayFormat, limit): - if isinstance(innerType, self.Type): - innerType = innerType.name - if displayFormat == DisplayFormat.Automatic: - if innerType in ('char', 'signed char', 'unsigned char', 'uint8_t', 'CHAR'): - # Use UTF-8 as default for char *. - self.putType(typeName) - (length, shown, data) = self.readToFirstZero(ptr, 1, limit) - self.putValue(data, 'utf8', length=length) - if self.isExpanded(): - self.putArrayData(ptr, shown, innerType) - return True - - if innerType in ('wchar_t', 'WCHAR'): - self.putType(typeName) - (length, data) = self.encodeCArray(ptr, 2, limit) - self.putValue(data, 'utf16', length=length) - return True - - if displayFormat == DisplayFormat.Latin1String: - self.putType(typeName) - (length, data) = self.encodeCArray(ptr, 1, limit) - self.putValue(data, 'latin1', length=length) - return True - - if displayFormat == DisplayFormat.SeparateLatin1String: - self.putType(typeName) - (length, data) = self.encodeCArray(ptr, 1, limit) - self.putValue(data, 'latin1', length=length) - self.putDisplay('latin1:separate', data) - return True - - if displayFormat == DisplayFormat.Utf8String: - self.putType(typeName) - (length, data) = self.encodeCArray(ptr, 1, limit) - self.putValue(data, 'utf8', length=length) - return True - - if displayFormat == DisplayFormat.SeparateUtf8String: - self.putType(typeName) - (length, data) = self.encodeCArray(ptr, 1, limit) - self.putValue(data, 'utf8', length=length) - self.putDisplay('utf8:separate', data) - return True - - if displayFormat == DisplayFormat.Local8BitString: - self.putType(typeName) - (length, data) = self.encodeCArray(ptr, 1, limit) - self.putValue(data, 'local8bit', length=length) - return True - - if displayFormat == DisplayFormat.Utf16String: - self.putType(typeName) - (length, data) = self.encodeCArray(ptr, 2, limit) - self.putValue(data, 'utf16', length=length) - return True - - if displayFormat == DisplayFormat.Ucs4String: - self.putType(typeName) - (length, data) = self.encodeCArray(ptr, 4, limit) - self.putValue(data, 'ucs4', length=length) - return True - - return False - - def putDerefedPointer(self, value): - derefValue = value.dereference() - savedCurrentChildType = self.currentChildType - self.currentChildType = value.type.targetName - self.putType(value.type.targetName) - derefValue.name = '*' - derefValue.autoDerefCount = value.autoDerefCount + 1 - - if derefValue.type.code == TypeCode.Pointer: - self.putField('autoderefcount', '{}'.format(derefValue.autoDerefCount)) - - self.putItem(derefValue) - self.currentChildType = savedCurrentChildType - def fetchInternalFunctions(self): coreModuleName = self.qtCoreModuleName() ns = self.qtNamespace() diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 7f704590664..b66443b300a 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1428,8 +1428,9 @@ class DumperBase(): # This is shared by pointer and array formatting. def tryPutSimpleFormattedPointer(self, ptr, typename, innerType, displayFormat, limit): if displayFormat == DisplayFormat.Automatic: - targetType = innerType - if innerType.code == TypeCode.Typedef: + if self.isCdb or innerType.code is not TypeCode.Typedef: + targetType = innerType + else: targetType = innerType.target() if targetType.name in ('char', 'signed char', 'unsigned char', 'uint8_t', 'CHAR'): @@ -3407,13 +3408,6 @@ typename)) def target(self): return self.dumper.Type(self.dumper, self.dumper.type_target(self.typeid)) - @property - def targetName(self): - target = self.target() - if target is None: - return '' - return target if isinstance(target, str) else target.name - @property def moduleName(self): return self.dumper.type_modulename_cache.get(self.typeid, None) From b245912b561c1ee96c8b4569a83c60f37f1d5a5d Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 24 Jun 2024 10:41:33 +0200 Subject: [PATCH 22/29] Debugger: merge put array code from cdbbridge into dumper base Basically the same. Only the type lookup of the inner type needs to be avoided for performance reasons. Change-Id: I2747ab44c23b764482b4a063d3618fae2e3c4d46 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/cdbbridge.py | 81 --------------------------- share/qtcreator/debugger/dumper.py | 9 ++- 2 files changed, 6 insertions(+), 84 deletions(-) diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index accf3780c2f..50d2d3d39ef 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -629,87 +629,6 @@ class Dumper(DumperBase): if self.showQObjectNames: self.tryPutQObjectGuts(value) - def putCStyleArray(self, value: DumperBase.Value): - arrayType = value.type - innerType = arrayType.target() - address = value.address() - if address: - self.putValue('@0x%x' % address, priority=-1) - else: - self.putEmptyValue() - self.putType(arrayType) - - displayFormat = self.currentItemFormat() - arrayByteSize = arrayType.size() - n = self.arrayItemCountFromTypeName(value.type.name, 100) - - p = value.address() - if displayFormat != DisplayFormat.Raw and p: - if innerType.name.strip() in ( - 'char', - 'int8_t', - 'qint8', - 'wchar_t', - 'unsigned char', - 'uint8_t', - 'quint8', - 'signed char', - 'CHAR', - 'WCHAR', - 'char8_t', - 'char16_t', - 'char32_t' - ): - self.putCharArrayHelper(p, n, innerType, self.currentItemFormat(), - makeExpandable=False) - else: - self.tryPutSimpleFormattedPointer(p, arrayType, innerType, - displayFormat, arrayByteSize) - self.putNumChild(n) - - if self.isExpanded(): - if n > 100: - addrStep = innerType.size() - with Children(self, n, innerType, addrBase=address, addrStep=addrStep): - for i in self.childRange(): - self.putSubItem(i, self.createValue(address + i * addrStep, innerType)) - else: - with Children(self): - n = 0 - for item in self.listValueChildren(value): - with SubItem(self, n): - n += 1 - self.putItem(item) - - - def putArrayData(self, base, n, innerType, childNumChild=None): - self.checkIntType(base) - self.checkIntType(n) - addrBase = base - innerType = self.createType(innerType) - innerSize = innerType.size() - self.putNumChild(n) - #DumperBase.warn('ADDRESS: 0x%x INNERSIZE: %s INNERTYPE: %s' % (addrBase, innerSize, innerType)) - enc = self.type_encoding_cache.get(innerType.typeid, None) - maxNumChild = self.maxArrayCount() - if enc: - self.put('childtype="%s",' % innerType.name) - self.put('addrbase="0x%x",' % addrBase) - self.put('addrstep="0x%x",' % innerSize) - self.put('arrayencoding="%s",' % enc) - self.put('endian="%s",' % self.packCode) - if n > maxNumChild: - self.put('childrenelided="%s",' % n) - n = maxNumChild - self.put('arraydata="') - self.put(self.readMemory(addrBase, n * innerSize)) - self.put('",') - else: - with Children(self, n, innerType, childNumChild, maxNumChild, - addrBase=addrBase, addrStep=innerSize): - for i in self.childRange(): - self.putSubItem(i, self.createValue(addrBase + i * innerSize, innerType)) - def fetchInternalFunctions(self): coreModuleName = self.qtCoreModuleName() ns = self.qtNamespace() diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index b66443b300a..29fa29e0eb0 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1305,14 +1305,17 @@ class DumperBase(): displayFormat = self.currentItemFormat() arrayByteSize = arrayType.size() + n = self.arrayItemCountFromTypeName(value.type.name, 100) if arrayByteSize == 0: # This should not happen. But it does, see QTCREATORBUG-14755. # GDB/GCC produce sizeof == 0 for QProcess arr[3] # And in the Nim string dumper. - itemCount = self.arrayItemCountFromTypeName(value.type.name, 100) - arrayByteSize = int(itemCount) * innerType.size() + arrayByteSize = n * innerType.size() + elif not self.isCdb: + # Do not check the inner type size for cdb since this requires a potentially expensive + # type lookup + n = arrayByteSize // innerType.size() - n = arrayByteSize // innerType.size() p = value.address() if displayFormat != DisplayFormat.Raw and p: if innerType.name in ( From 9d8dc1d0565ab4bca4fcdfc5dbb5219274c06622 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 24 Jun 2024 11:13:05 +0200 Subject: [PATCH 23/29] Debugger: remove put item code from cdbbridge unneeded nowadays Change-Id: I8e7d46f7344157459e86cbea95563194a579cd6e Reviewed-by: Christian Stenger --- share/qtcreator/debugger/cdbbridge.py | 129 +------------------------- 1 file changed, 2 insertions(+), 127 deletions(-) diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index 50d2d3d39ef..afb757ff421 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -501,133 +501,8 @@ class Dumper(DumperBase): res = self.nativeParseAndEvaluate(symbolName) return None if res is None else res.address() - def putItem(self, value: DumperBase.Value): - - typeobj = value.type # unqualified() - typeName = typeobj.name - - if not value.lIsInScope: - self.putSpecialValue('optimizedout') - #self.putType(typeobj) - #self.putSpecialValue('outofscope') - self.putNumChild(0) - return - - if not isinstance(value, self.Value): - raise RuntimeError('WRONG TYPE IN putItem: %s' % type(self.Value)) - - # Try on possibly typedefed type first. - if self.tryPutPrettyItem(typeName, value): - if typeobj.code == TypeCode.Pointer: - self.putOriginalAddress(value.address()) - else: - self.putAddress(value.address()) - return - - if typeobj.code == TypeCode.Pointer: - self.putFormattedPointer(value) - return - - self.putAddress(value.address()) - - if typeobj.code == TypeCode.Function: - #DumperBase.warn('FUNCTION VALUE: %s' % value) - self.putType(typeobj) - self.putSymbolValue(value.pointer()) - self.putNumChild(0) - return - - if typeobj.code == TypeCode.Enum: - #DumperBase.warn('ENUM VALUE: %s' % value.stringify()) - self.putType(typeobj.name) - self.putValue(value.display()) - self.putNumChild(0) - return - - if typeobj.code == TypeCode.Array: - #DumperBase.warn('ARRAY VALUE: %s' % value) - self.putCStyleArray(value) - return - - if typeobj.code == TypeCode.Integral: - #DumperBase.warn('INTEGER: %s %s' % (value.name, value)) - val = value.value() - self.putNumChild(0) - self.putValue(val) - self.putType(typeName) - return - - if typeobj.code == TypeCode.Float: - #DumperBase.warn('FLOAT VALUE: %s' % value) - self.putValue(value.value()) - self.putNumChild(0) - self.putType(typeobj.name) - return - - if typeobj.code in (TypeCode.Reference, TypeCode.RValueReference): - #DumperBase.warn('REFERENCE VALUE: %s' % value) - val = value.dereference() - if val.laddress != 0: - self.putItem(val) - else: - self.putSpecialValue('nullreference') - self.putBetterType(typeName) - return - - if typeobj.code == TypeCode.Complex: - self.putType(typeobj) - self.putValue(value.display()) - self.putNumChild(0) - return - - self.putType(typeName) - - if value.summary is not None and self.useFancy: - self.putValue(self.hexencode(value.summary), 'utf8:1:0') - self.putNumChild(0) - return - - self.putExpandable() - self.putEmptyValue() - #DumperBase.warn('STRUCT GUTS: %s ADDRESS: 0x%x ' % (value.name, value.address())) - if self.showQObjectNames: - #with self.timer(self.currentIName): - self.putQObjectNameValue(value) - if self.isExpanded(): - self.putField('sortable', 1) - with Children(self): - baseIndex = 0 - for item in self.listValueChildren(value): - if item.name.startswith('__vfptr'): - with SubItem(self, '[vptr]'): - # int (**)(void) - self.putType(' ') - self.putSortGroup(20) - self.putValue(item.name) - n = 100 - if self.isExpanded(): - with Children(self): - n = self.putVTableChildren(item, n) - self.putNumChild(n) - continue - - if item.isBaseClass: - baseIndex += 1 - # We cannot use nativeField.name as part of the iname as - # it might contain spaces and other strange characters. - with UnnamedSubItem(self, "@%d" % baseIndex): - self.putField('iname', self.currentIName) - self.putField('name', '[%s]' % item.name) - self.putSortGroup(1000 - baseIndex) - self.putAddress(item.address()) - self.putItem(item) - continue - - - with SubItem(self, item.name): - self.putItem(item) - if self.showQObjectNames: - self.tryPutQObjectGuts(value) + def wantQObjectNames(self): + return self.showQObjectNames and self.qtCoreModuleName() is not None def fetchInternalFunctions(self): coreModuleName = self.qtCoreModuleName() From ee54b2cfca9444e5cee3ac18ad4876b848fe6d11 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 28 Jun 2024 14:49:16 +0200 Subject: [PATCH 24/29] Terminal: Remove TOO_OLD_WINSDK check from libptyqt Qt Creator will always use newer Windows SDKs, as we require at least Windows 10 1809. The define for TOO_OLD_WINSDK was done arbitrarily and broke (LLVM-)MinGW builds. Change-Id: If8e1fd4e0e3615bda23483877e67988ca04ea9f7 Reviewed-by: Marcus Tillmanns --- src/libs/3rdparty/libptyqt/conptyprocess.cpp | 4 ---- src/libs/3rdparty/libptyqt/conptyprocess.h | 1 - 2 files changed, 5 deletions(-) diff --git a/src/libs/3rdparty/libptyqt/conptyprocess.cpp b/src/libs/3rdparty/libptyqt/conptyprocess.cpp index 94bb53b5832..c957e0bdd9e 100644 --- a/src/libs/3rdparty/libptyqt/conptyprocess.cpp +++ b/src/libs/3rdparty/libptyqt/conptyprocess.cpp @@ -1132,10 +1132,6 @@ qint64 ConPtyProcess::write(const QByteArray &byteArray) bool ConPtyProcess::isAvailable() { -#ifdef TOO_OLD_WINSDK - return false; //very importnant! ConPty can be built, but it doesn't work if built with old sdk and Win10 < 1903 -#endif - qint32 buildNumber = QSysInfo::kernelVersion().split(".").last().toInt(); if (buildNumber < CONPTY_MINIMAL_WINDOWS_VERSION) return false; diff --git a/src/libs/3rdparty/libptyqt/conptyprocess.h b/src/libs/3rdparty/libptyqt/conptyprocess.h index aaf56fe76f1..0f30288dab9 100644 --- a/src/libs/3rdparty/libptyqt/conptyprocess.h +++ b/src/libs/3rdparty/libptyqt/conptyprocess.h @@ -20,7 +20,6 @@ typedef VOID* HPCON; -#define TOO_OLD_WINSDK #endif class QWinEventNotifier; From 105be75c077da4fb4054ed26fbd0171dca4a42fd Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sun, 30 Jun 2024 23:13:05 +0200 Subject: [PATCH 25/29] ExtensionManager: Fix host_os field for extension service request The used QSysInfo::productType() provides various code/distribution names which in some cases have little to do with the "host_os" that is expected by the extension service API. This change involves osTypeToString to instead return plain OS names. Change-Id: I24b8070342c1de9de9040adcf5e06be967b6a180 Reviewed-by: Marcus Tillmanns --- src/plugins/extensionmanager/extensionsbrowser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index 937344d2dbf..da757c0bbfb 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -408,7 +408,7 @@ void ExtensionsBrowser::fetchExtensions() = R"({"version":"%1","host_os":"%2","host_os_version":"%3","host_architecture":"%4","page_size":200})"; const QString request = url.arg(host) + requestTemplate .arg(QCoreApplication::applicationVersion()) - .arg(QSysInfo::productType()) + .arg(osTypeToString(HostOsInfo::hostOs())) .arg(QSysInfo::productVersion()) .arg(QSysInfo::currentCpuArchitecture()); query.setRequest(QNetworkRequest(QUrl::fromUserInput(request))); From e867f9ef11d30d4a5ecd5d14c954df485d26db8b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 24 Jun 2024 11:40:42 +0200 Subject: [PATCH 26/29] Welcome: Fix the order of Qt versions for examples There are two sources for examples: Qt versions directly, and "example sets", which are just a tuple of display name, documentation path, examples path. The Qt installer registers an "example set" for Qt versions, so to avoid duplicate entries we match Qt versions to example sets, if found. This destroys any order the Qt versions might have been in before. Order the results by Qt version (and other sets last) by first creating all the items regardless of origin (noting their Qt version in the user data), and sorting them before adding to the model. Also use constants for the different user data fields. Fixes: QTCREATORBUG-31108 Change-Id: I827be892a3abe17fa6afcd3c6f39bf225f7af494 Reviewed-by: Christian Stenger --- src/plugins/qtsupport/exampleslistmodel.cpp | 93 +++++++++++++-------- 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/src/plugins/qtsupport/exampleslistmodel.cpp b/src/plugins/qtsupport/exampleslistmodel.cpp index bb424077855..01c808275d3 100644 --- a/src/plugins/qtsupport/exampleslistmodel.cpp +++ b/src/plugins/qtsupport/exampleslistmodel.cpp @@ -28,12 +28,14 @@ #include #include -#include -#include using namespace Core; using namespace Utils; +const int kQtVersionIdRole = Qt::UserRole; +const int kExtraSetIndexRole = Qt::UserRole + 1; +const int kVersionRole = Qt::UserRole + 2; + namespace QtSupport { namespace Internal { @@ -112,43 +114,66 @@ ExampleSetModel::ExampleSetModel() &ExampleSetModel::helpManagerInitialized); } -void ExampleSetModel::recreateModel(const QtVersions &qtVersions) +void ExampleSetModel::recreateModel(const QtVersions &qtVersionsIn) { beginResetModel(); clear(); QHash extraManifestDirs; - for (int i = 0; i < m_extraExampleSets.size(); ++i) { + for (int i = 0; i < m_extraExampleSets.size(); ++i) + extraManifestDirs.insert(FilePath::fromUserInput(m_extraExampleSets.at(i).manifestPath), i); + + // Sanitize away qt versions that have already been added through extra sets. + // This way we do not have entries for Qt/Android, Qt/Desktop, Qt/MinGW etc pp, + // but only the one "QtX X.Y.Z" entry that is registered as an example set by the installer. + const QtVersions qtVersions + = Utils::filtered(qtVersionsIn, [this, &extraManifestDirs](QtVersion *v) { + if (extraManifestDirs.contains(v->docsPath())) { + m_extraExampleSets[extraManifestDirs.value(v->docsPath())].qtVersion + = v->qtVersion(); + qCDebug(log) << "Not showing Qt version because manifest path is already added " + "through InstalledExamples settings:" + << v->displayName(); + return false; + } + return true; + }); + + QList items; + for (int i = 0; i < m_extraExampleSets.size(); ++i) { const ExtraExampleSet &set = m_extraExampleSets.at(i); auto newItem = new QStandardItem(); newItem->setData(set.displayName, Qt::DisplayRole); - newItem->setData(set.displayName, Qt::UserRole + 1); - newItem->setData(QVariant(), Qt::UserRole + 2); - newItem->setData(i, Qt::UserRole + 3); - appendRow(newItem); - - extraManifestDirs.insert(FilePath::fromUserInput(set.manifestPath), i); + newItem->setData(QVariant(), kQtVersionIdRole); + newItem->setData(i, kExtraSetIndexRole); + newItem->setData(QVariant::fromValue(set.qtVersion), kVersionRole); + items.append(newItem); } - - for (QtVersion *version : qtVersions) { - // Sanitize away qt versions that have already been added through extra sets. - // This way we do not have entries for Qt/Android, Qt/Desktop, Qt/MinGW etc pp, - // but only the one "QtX X.Y.Z" entry that is registered as an example set by the installer. - if (extraManifestDirs.contains(version->docsPath())) { - m_extraExampleSets[extraManifestDirs.value(version->docsPath())].qtVersion - = version->qtVersion(); - qCDebug(log) << "Not showing Qt version because manifest path is already added " - "through InstalledExamples settings:" - << version->displayName(); - continue; - } + items += Utils::transform(qtVersions, [](QtVersion *v) { auto newItem = new QStandardItem(); - newItem->setData(version->displayName(), Qt::DisplayRole); - newItem->setData(version->displayName(), Qt::UserRole + 1); - newItem->setData(version->uniqueId(), Qt::UserRole + 2); - newItem->setData(QVariant(), Qt::UserRole + 3); - appendRow(newItem); - } + newItem->setData(v->displayName(), Qt::DisplayRole); + newItem->setData(v->uniqueId(), kQtVersionIdRole); + newItem->setData(QVariant(), kExtraSetIndexRole); + newItem->setData(QVariant::fromValue(v->qtVersion()), kVersionRole); + return newItem; + }); + + // Sort by Qt version, example sets not associated to Qt last + Utils::sort(items, [](QStandardItem *a, QStandardItem *b) { + const QVersionNumber versionB = b->data(kVersionRole).value(); + if (versionB.isNull()) + return true; + const QVersionNumber versionA = a->data(kVersionRole).value(); + if (versionA.isNull()) + return false; + if (versionA == versionB) + return a->data(Qt::DisplayRole).toString() < b->data(Qt::DisplayRole).toString(); + return versionA < versionB; + }); + + for (QStandardItem *item : std::as_const(items)) + appendRow(item); + endResetModel(); } @@ -179,7 +204,7 @@ QVariant ExampleSetModel::getDisplayName(int i) const { if (i < 0 || i >= rowCount()) return QVariant(); - return data(index(i, 0), Qt::UserRole + 1); + return data(index(i, 0), Qt::DisplayRole); } // id is either the Qt version uniqueId, or the display name of the extra example set @@ -188,7 +213,7 @@ QVariant ExampleSetModel::getId(int i) const if (i < 0 || i >= rowCount()) return QVariant(); QModelIndex modelIndex = index(i, 0); - QVariant variant = data(modelIndex, Qt::UserRole + 2); + QVariant variant = data(modelIndex, kQtVersionIdRole); if (variant.isValid()) // set from qt version return variant; return getDisplayName(i); @@ -199,7 +224,7 @@ ExampleSetModel::ExampleSetType ExampleSetModel::getType(int i) const if (i < 0 || i >= rowCount()) return InvalidExampleSet; QModelIndex modelIndex = index(i, 0); - QVariant variant = data(modelIndex, Qt::UserRole + 2); /*Qt version uniqueId*/ + QVariant variant = data(modelIndex, kQtVersionIdRole); /*Qt version uniqueId*/ if (variant.isValid()) return QtExampleSet; return ExtraExampleSetType; @@ -209,7 +234,7 @@ int ExampleSetModel::getQtId(int i) const { QTC_ASSERT(i >= 0, return -1); QModelIndex modelIndex = index(i, 0); - QVariant variant = data(modelIndex, Qt::UserRole + 2); + QVariant variant = data(modelIndex, kQtVersionIdRole); QTC_ASSERT(variant.isValid(), return -1); QTC_ASSERT(variant.canConvert(), return -1); return variant.toInt(); @@ -224,7 +249,7 @@ int ExampleSetModel::getExtraExampleSetIndex(int i) const { QTC_ASSERT(i >= 0, return -1); QModelIndex modelIndex = index(i, 0); - QVariant variant = data(modelIndex, Qt::UserRole + 3); + QVariant variant = data(modelIndex, kExtraSetIndexRole); QTC_ASSERT(variant.isValid(), return -1); QTC_ASSERT(variant.canConvert(), return -1); return variant.toInt(); From 0afe7caaeb5bb351760dfd9798d9f7f5211ea0f4 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 27 Jun 2024 14:14:50 +0200 Subject: [PATCH 27/29] Doc: Mention that perf profiling is supported for app manager apps Task-number: QTCREATORBUG-30604 Change-Id: I32353849a64459244ccda60ac986b52bbe9813f1 Reviewed-by: Dominik Holland --- doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc b/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc index 0df58d12e8c..e43e3320656 100644 --- a/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc +++ b/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc @@ -141,13 +141,16 @@ \li Always communicates with the default instance. \endtable - \section1 Profile Qt Quick applications + \section1 Analyze the applications - You can use the \l{Profiling QML Applications}{QML Profiler} to find causes - for typical performance problems in your Qt Quick applications, such as + Use the \l{Profiling QML Applications}{QML Profiler} to find causes + for typical performance problems in Qt Quick applications, such as slowness and unresponsive, stuttering user interfaces. You cannot profile an in-process runtime as an individual process. + Use the \l{Performance Analyzer} to analyze the CPU and memory usage of an + application. + \sa {Activate kits for a project}, {Enable and disable plugins}, {\B2Q}{How To: Develop for \B2Q}, {Remote Linux}{How To: Develop for remote Linux}, From c954b756726c0a7e37be6f591a46f68d5cb7c77c Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 1 Jul 2024 08:14:15 +0200 Subject: [PATCH 28/29] Mode Icons: Make "Play" triangle less squeezed Play icons usually are equiangular, i.e. not squeezed. This unsqeezes the new play triangle. Task-number: QTCREATORBUG-31080 Change-Id: I7243253255a015e78bf87bce273c2381dd96ee1b Reviewed-by: hjk --- src/plugins/projectexplorer/images/run_mask.png | Bin 182 -> 198 bytes .../projectexplorer/images/run_mask@2x.png | Bin 315 -> 347 bytes src/tools/icons/qtcreatoricons.svg | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/images/run_mask.png b/src/plugins/projectexplorer/images/run_mask.png index a6f8867950d82ee4441b4acb3bdcf71d2911b7db..37d3802f3889f0b9d956edf75f0f10a7377058c5 100644 GIT binary patch delta 170 zcmdnSc#Ls^N`0@Vi(`nz>Es{&0tP(ks<*@bD=%qjKKO};QI&^>$47HLhlXZyvcQZF z((5Pv-(D*rab^4C&`d|Nq-}r>0DZ`@uhd(*OVd zkp>1g;*YF;^8fx!B_5sInjuA}<}@CBsHA#M_07w>vsjw?3Rnb`1$$Y9nFT$&I$A7? cjC2?@Wn@LRcF)|zz`(%Z>FVdQ&MBb@09NQpUH||9 delta 154 zcmX@cxQ%gwN`0-Ti(`mIZ}Ja+0fU|b)!Siz6qmF#I~HHH|Klama3H~$QPntAQbOn3 zgV0a^pZj>SvAzELW6GcZ|4W-Bn43>$)_DE<|No96Lr96-{7L`+-@o?R$e{J!k>yYR z|9`&o4UdksMzGTbrKWSLFES4~y1TFl^tdSrF$;QfiAzlMVlWlHrz}1p`br@K0|SGn LtDnm{r-UW|?z2Ru diff --git a/src/plugins/projectexplorer/images/run_mask@2x.png b/src/plugins/projectexplorer/images/run_mask@2x.png index 0fb3ec7b51c5c034d9126b7a3537d2d29511110a..0be2cd1b3ad2033077b58381ea1217f732ca6bb1 100644 GIT binary patch delta 320 zcmdnZbem~{O1+Y&i(^Q{;kVc9vknFFuz!e{vPfZt^GE)s2TLY9AM9&tZjQA%@Sf|Q zgH6-AzIA+4m^%uzc!@78(ctJ(colx)GV>SJfGN|NYZUY=Jvq1>`3gInF zgx5BUcnSvAskn4J{u|7=Fd8 zM3}E%>qZ7fx1HHL_p@;Dy*1EY`0Sn>tv>S5|#xWqutQk3m$Zt9UY;ccfr1w}5_;*Nc}ML^C{>-n@(55He8=x~-P cdVhko_)hVm?T$Ux3=9kmp00i_>zopr01{Y?B>(^b delta 288 zcmcc3w3}&yN3#@ou&jq9=7HL0TxGrBS{7tpFZeYR5jidJbjL_Zo}@)pXHmJCc5e*33mSxk`({6 zceQ4a%A%P6X>AvFdo}O2bPDt4h|70E-mIBX2@Mb4ES*uG$x_5(v7<0;ma!$% zo4XRmbC=36n)y9ByygkVhO&rGt7uCmom=r~>h2Ad-7{ONrzjuTa?aGwsws}Yv2NdDI&)fA6pRC$usps vP*>n#hww< Date: Fri, 28 Jun 2024 13:47:18 +0200 Subject: [PATCH 29/29] GitHub Actions: Only upload one release.md actions/upload-artifact@v4 complains if you try to override an existing artifact. Restrict only for one runner. Change-Id: I0a8a8cd0fcdf34dc956de175eeb4c33b40ce1a8d Reviewed-by: Eike Ziller --- .github/workflows/build_cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index 7cbe1ce5b7f..9541c4c7017 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -744,7 +744,7 @@ jobs: name: ${{ steps.ccache.outputs.archive_name }} - name: Upload Release Changelog - if: contains(github.ref, 'tags/v') + if: runner.os == 'macOS' && contains(github.ref, 'tags/v') uses: actions/upload-artifact@v4 with: path: ./release/changelog.md