From 2e2248e80e30243d638fe3b8a4a01ca71039301a Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 13 Oct 2023 20:48:08 +0200 Subject: [PATCH 01/86] CMakePM: Allow invalid file characters as part of preset names The fact that Qt Creator uses the preset name to create a directory and then import the directory is an implementation detail. This changeset will allow characters like ":" to be part of the preset name. Task-number: QTCREATORBUG-29643 Change-Id: I84a224b78eb3d2233f80d9bdb8bf4478471349b0 Reviewed-by: Alessandro Portale --- .../cmakeprojectimporter.cpp | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 6455ad3ea26..583729ee933 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -104,6 +104,40 @@ CMakeProjectImporter::CMakeProjectImporter(const FilePath &path, const CMakeProj } +using CharToHexList = QList>; +static const CharToHexList &charToHexList() +{ + static const CharToHexList list = { + {"<", "{3C}"}, + {">", "{3E}"}, + {":", "{3A}"}, + {"\"", "{22}"}, + {"\\", "{5C}"}, + {"/", "{2F}"}, + {"|", "{7C}"}, + {"?", "{3F}"}, + {"*", "{2A}"}, + }; + + return list; +} + +static QString presetNameToFileName(const QString &name) +{ + QString fileName = name; + for (const auto &p : charToHexList()) + fileName.replace(p.first, p.second); + return fileName; +} + +static QString fileNameToPresetName(const QString &fileName) +{ + QString name = fileName; + for (const auto &p : charToHexList()) + name.replace(p.second, p.first); + return name; +} + FilePaths CMakeProjectImporter::importCandidates() { FilePaths candidates; @@ -129,7 +163,8 @@ FilePaths CMakeProjectImporter::importCandidates() continue; } - const FilePath configPresetDir = m_presetsTempDir.filePath(configPreset.name); + const FilePath configPresetDir = m_presetsTempDir.filePath( + presetNameToFileName(configPreset.name)); configPresetDir.createDir(); candidates << configPresetDir; @@ -638,7 +673,7 @@ QList CMakeProjectImporter::examineDirectory(const FilePath &importPath, if (importPath.isChildOf(m_presetsTempDir.path())) { auto data = std::make_unique(); - const QString presetName = importPath.fileName(); + const QString presetName = fileNameToPresetName(importPath.fileName()); PresetsDetails::ConfigurePreset configurePreset = Utils::findOrDefault(m_project->presetsData().configurePresets, [presetName](const PresetsDetails::ConfigurePreset &preset) { From ab23ee98f9ded7ea0318e0ab35d036edf6faf647 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 17 Oct 2023 13:19:25 +0200 Subject: [PATCH 02/86] PackageManager: Search for vcpkg in project root Change-Id: I467476e6897f36558afc76a262f631cdaa47320e Reviewed-by: Cristian Adam --- src/share/3rdparty/package-manager/auto-setup.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/share/3rdparty/package-manager/auto-setup.cmake b/src/share/3rdparty/package-manager/auto-setup.cmake index eafdb91aa68..caa8eeddb81 100644 --- a/src/share/3rdparty/package-manager/auto-setup.cmake +++ b/src/share/3rdparty/package-manager/auto-setup.cmake @@ -165,7 +165,7 @@ macro(qtc_auto_setup_vcpkg) if (EXISTS "${CMAKE_SOURCE_DIR}/vcpkg.json" AND NOT QT_CREATOR_SKIP_VCPKG_SETUP) option(QT_CREATOR_SKIP_VCPKG_SETUP "Skip Qt Creator's vcpkg package manager auto-setup" OFF) - find_program(vcpkg_program vcpkg) + find_program(vcpkg_program vcpkg ${CMAKE_SOURCE_DIR}/vcpkg) if (NOT vcpkg_program) message(WARNING "Qt Creator: vcpkg executable not found. " "Package manager auto-setup will be skipped. " From fdeff13ca336b5288a441ad3d7cab358eee4112b Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 17 Oct 2023 15:13:45 +0200 Subject: [PATCH 03/86] TextEditor: Don't export KSyntaxHighlighting Change-Id: I84fa8c758af412d8847391a628deac60279b9448 Reviewed-by: David Schulz --- src/plugins/compilerexplorer/compilerexplorereditor.cpp | 5 +++-- src/plugins/texteditor/highlighter.h | 3 +-- src/plugins/texteditor/texteditor.cpp | 7 ++++++- src/plugins/texteditor/texteditor.h | 3 +-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/plugins/compilerexplorer/compilerexplorereditor.cpp b/src/plugins/compilerexplorer/compilerexplorereditor.cpp index 2fcb4f8f073..c6040d65a42 100644 --- a/src/plugins/compilerexplorer/compilerexplorereditor.cpp +++ b/src/plugins/compilerexplorer/compilerexplorereditor.cpp @@ -285,8 +285,9 @@ CompilerWidget::CompilerWidget(const std::shared_ptr &sourceSett m_asmEditor = new AsmEditorWidget(undoStack); m_asmDocument = QSharedPointer(new TextDocument); m_asmEditor->setTextDocument(m_asmDocument); - m_asmEditor->configureGenericHighlighter( - TextEditor::Highlighter::definitionForName("Intel x86 (NASM)")); + QTC_ASSERT_EXPECTED(m_asmEditor->configureGenericHighlighter("Intel x86 (NASM)"), + m_asmEditor->configureGenericHighlighter( + Utils::mimeTypeForName("text/x-asm"))); m_asmEditor->setReadOnly(true); connect(m_asmEditor, &AsmEditorWidget::gotFocus, this, &CompilerWidget::gotFocus); diff --git a/src/plugins/texteditor/highlighter.h b/src/plugins/texteditor/highlighter.h index b3f10d0671d..0183c9c171e 100644 --- a/src/plugins/texteditor/highlighter.h +++ b/src/plugins/texteditor/highlighter.h @@ -13,8 +13,7 @@ namespace TextEditor { class TextDocument; -class TEXTEDITOR_EXPORT Highlighter : public SyntaxHighlighter, - public KSyntaxHighlighting::AbstractHighlighter +class Highlighter : public SyntaxHighlighter, public KSyntaxHighlighting::AbstractHighlighter { Q_OBJECT Q_INTERFACES(KSyntaxHighlighting::AbstractHighlighter) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 70265e14a47..ab1ab4cbc42 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -9068,10 +9068,15 @@ void TextEditorWidget::configureGenericHighlighter(const Utils::MimeType &mimeTy d->removeSyntaxInfoBar(); } -void TextEditorWidget::configureGenericHighlighter(const Highlighter::Definition &definition) +expected_str TextEditorWidget::configureGenericHighlighter(const QString &definitionName) { + Highlighter::Definition definition = TextEditor::Highlighter::definitionForName(definitionName); + if (!definition.isValid()) + return make_unexpected(Tr::tr("Could not find definition")); + d->configureGenericHighlighter(definition); d->removeSyntaxInfoBar(); + return {}; } int TextEditorWidget::blockNumberForVisibleRow(int row) const diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index 2af45826368..0abe3305639 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -6,7 +6,6 @@ #include "texteditor_global.h" #include "codeassist/assistenums.h" -#include "highlighter.h" #include "indenter.h" #include "refactoroverlay.h" #include "snippets/snippetparser.h" @@ -455,7 +454,7 @@ public: void configureGenericHighlighter(const Utils::MimeType &mimeType); /// Overwrite the current highlighter with a new generic highlighter based on the given definition - void configureGenericHighlighter(const Highlighter::Definition &definition); + Utils::expected_str configureGenericHighlighter(const QString &definitionName); Q_INVOKABLE void inSnippetMode(bool *active); // Used by FakeVim. From 879692381fdfaa3343cb0078b1ee1504dbe56184 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 17 Oct 2023 15:40:40 +0200 Subject: [PATCH 04/86] CMakePM: Fix conan default profile auto-detection CONAN_COMMAND was not available for `conan_profile_detect_default` function. Change-Id: I03df06aa88e6588101bb5ec54b3ce2cb64dee2c8 Reviewed-by: Alessandro Portale --- src/share/3rdparty/package-manager/auto-setup.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/share/3rdparty/package-manager/auto-setup.cmake b/src/share/3rdparty/package-manager/auto-setup.cmake index caa8eeddb81..526dd333fa7 100644 --- a/src/share/3rdparty/package-manager/auto-setup.cmake +++ b/src/share/3rdparty/package-manager/auto-setup.cmake @@ -102,11 +102,11 @@ macro(qtc_auto_setup_conan) project(conan-setup) if (${conan_version} VERSION_GREATER_EQUAL 2.0) + set(CONAN_COMMAND \"${conan_program}\") include(\"${CMAKE_CURRENT_LIST_DIR}/conan_provider.cmake\") conan_profile_detect_default() detect_host_profile(\"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\") - set(CONAN_COMMAND \"${conan_program}\") conan_install( -pr \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\" --build=${QT_CREATOR_CONAN_BUILD_POLICY} From 058a931d271ee544ffce48654ff1c21f67da47e1 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 17 Oct 2023 15:06:41 +0200 Subject: [PATCH 05/86] ProjectExplorer: Manually check whether a runconfig has a creator This is used in ProjectConfigurationModel::data() Constructing the full list is comparatively expensive, and the extra decoration is not needed. Change-Id: I5b6c76376f806ea92444916a87d1f2e671e16d5f Reviewed-by: Christian Kandeler --- .../projectconfigurationmodel.cpp | 2 +- .../projectexplorer/runconfiguration.cpp | 30 +++++++++++++++---- .../projectexplorer/runconfiguration.h | 7 +++-- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/plugins/projectexplorer/projectconfigurationmodel.cpp b/src/plugins/projectexplorer/projectconfigurationmodel.cpp index 23b790a4943..f2b731a6e1a 100644 --- a/src/plugins/projectexplorer/projectconfigurationmodel.cpp +++ b/src/plugins/projectexplorer/projectconfigurationmodel.cpp @@ -93,9 +93,9 @@ QVariant ProjectConfigurationModel::data(const QModelIndex &index, int role) con { if (index.row() >= m_projectConfigurations.size()) return {}; - ProjectConfiguration * const config = m_projectConfigurations.at(index.row()); if (role == Qt::DisplayRole) { + ProjectConfiguration * const config = m_projectConfigurations.at(index.row()); QString displayName = config->expandedDisplayName(); if (const auto rc = qobject_cast(config); rc && !rc->hasCreator()) displayName += QString(" [%1]").arg(Tr::tr("unavailable")); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index f6cb72bde84..4a1e03d031d 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -140,6 +140,8 @@ void GlobalOrProjectAspect::resetProjectToGlobalSettings() static std::vector theAspectFactories; +static QList g_runConfigurationFactories; + RunConfiguration::RunConfiguration(Target *target, Utils::Id id) : ProjectConfiguration(target, id) { @@ -236,10 +238,13 @@ bool RunConfiguration::isCustomized() const bool RunConfiguration::hasCreator() const { - return Utils::contains(RunConfigurationFactory::creatorsForTarget(target()), - [this](const RunConfigurationCreationInfo &info) { - return info.factory->runConfigurationId() == id() && info.buildKey == buildKey(); - }); + for (RunConfigurationFactory *factory : std::as_const(g_runConfigurationFactories)) { + if (factory->runConfigurationId() == id()) { + if (factory->supportsBuildKey(target(), buildKey())) + return true; + } + } + return false; } void RunConfiguration::setPristineState() @@ -453,8 +458,6 @@ QVariantHash RunConfiguration::extraData() const ExtensionSystem::IPlugin::initialize() method. */ -static QList g_runConfigurationFactories; - /*! Constructs a RunConfigurationFactory instance and registers it into a global list. @@ -522,6 +525,14 @@ RunConfigurationFactory::availableCreators(Target *target) const }); } +bool RunConfigurationFactory::supportsBuildKey(Target *target, const QString &key) const +{ + if (!canHandle(target)) + return false; + const QList buildTargets = target->buildSystem()->applicationTargets(); + return anyOf(buildTargets, [&key](const BuildTargetInfo &info) { return info.buildKey == key; }); +} + /*! Adds a device type for which this RunConfigurationFactory can create RunConfigurations. @@ -674,4 +685,11 @@ FixedRunConfigurationFactory::availableCreators(Target *parent) const return {rci}; } +bool FixedRunConfigurationFactory::supportsBuildKey(Target *target, const QString &key) const +{ + Q_UNUSED(target) + Q_UNUSED(key) + return false; +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 85c770a5d36..629fcd2c614 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -197,6 +197,7 @@ public: protected: virtual QList availableCreators(Target *target) const; + virtual bool supportsBuildKey(Target *target, const QString &key) const; using RunConfigurationCreator = std::function; @@ -218,6 +219,7 @@ private: RunConfiguration *create(Target *target) const; friend class RunConfigurationCreationInfo; + friend class RunConfiguration; RunConfigurationCreator m_creator; Utils::Id m_runConfigurationId; QList m_supportedProjectTypes; @@ -231,9 +233,10 @@ public: explicit FixedRunConfigurationFactory(const QString &displayName, bool addDeviceName = false); - QList availableCreators(Target *parent) const override; - private: + QList availableCreators(Target *parent) const override; + bool supportsBuildKey(Target *target, const QString &key) const override; + const QString m_fixedBuildTarget; const bool m_decorateTargetName; }; From b38c7a452e79f424e8ea9133b329d3cd4661af26 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 17 Oct 2023 16:42:14 +0200 Subject: [PATCH 06/86] CMakeProjectManager: Fix path construction of pch files This triggered soft asserts in FileUtils::copyIfDifferent() when opening top-level qt. Amends 246f33c20d which introduced a unwanted extra .parentDir() call which removed part of the path. Change-Id: Id0475a74a589372d37b7ec65d33d3faf6194013c Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/fileapidataextractor.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index fd492289555..79b17536bb3 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -497,10 +497,7 @@ static RawProjectParts generateRawProjectParts(const QFuture &cancelFuture return si.path.endsWith(ending); }).path); if (!precompiled_header.isEmpty()) { - if (precompiled_header.toFileInfo().isRelative()) { - const FilePath parentDir = sourceDirectory.parentDir(); - precompiled_header = parentDir.pathAppended(precompiled_header.toString()); - } + precompiled_header = sourceDirectory.resolvePath(precompiled_header); // Remove the CMake PCH usage command line options in order to avoid the case // when the build system would produce a .pch/.gch file that would be treated From 8845a7f896e2b7a6b206f96844e176eb5f7e2755 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 17 Oct 2023 16:51:48 +0200 Subject: [PATCH 07/86] CMakeProjectManager: Use a few FilePath::path() instead of toString() ... when appropriate. Change-Id: I2c23e4688ec69f78b0ce873e578139d5c4e89c35 Reviewed-by: Cristian Adam --- .../cmakeprojectmanager/fileapidataextractor.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 79b17536bb3..7e469238058 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -509,17 +509,17 @@ static RawProjectParts generateRawProjectParts(const QFuture &cancelFuture fragments.erase(foundPos, std::next(foundPos, args.size())); }; - remove({"-Xclang", "-include-pch", "-Xclang", precompiled_header.toString() + ".gch"}); - remove({"-Xclang", "-include-pch", "-Xclang", precompiled_header.toString() + ".pch"}); - remove({"-Xclang", "-include", "-Xclang", precompiled_header.toString()}); - remove({"-include", precompiled_header.toString()}); - remove({"/FI", precompiled_header.toString()}); + remove({"-Xclang", "-include-pch", "-Xclang", precompiled_header.path() + ".gch"}); + remove({"-Xclang", "-include-pch", "-Xclang", precompiled_header.path() + ".pch"}); + remove({"-Xclang", "-include", "-Xclang", precompiled_header.path()}); + remove({"-include", precompiled_header.path()}); + remove({"/FI", precompiled_header.path()}); // Make a copy of the CMake PCH header and use it instead FilePath qtc_precompiled_header = precompiled_header.parentDir().pathAppended(qtcPchFile); FileUtils::copyIfDifferent(precompiled_header, qtc_precompiled_header); - rpp.setPreCompiledHeaders({qtc_precompiled_header.toString()}); + rpp.setPreCompiledHeaders({qtc_precompiled_header.path()}); } RawProjectPartFlags cProjectFlags; From b5dec80d6b64253ff66f755e1ca0d87e58cd2f12 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 13 Oct 2023 12:47:08 +0200 Subject: [PATCH 08/86] ProjectExplorer: Don't create Replacement kits for Design Studio It's not wanted in this use case Fixes: QTCREATORBUG-29717 Change-Id: I04ccd4c9e8bfe15e76294a42f3f0bd9d879599e5 Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/projectexplorer/project.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 320df648064..20c65655627 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -821,7 +821,7 @@ void Project::createTargetFromMap(const Store &map, int index) } Kit *k = KitManager::kit(id); - if (!k) { + if (!k && !ICore::isQtDesignStudio()) { Id deviceTypeId = Id::fromSetting(targetMap.value(Target::deviceTypeKey())); if (!deviceTypeId.isValid()) deviceTypeId = Constants::DESKTOP_DEVICE_TYPE; From 53b325525639764bfc2972ae48877f055bd3e904 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 17 Oct 2023 17:11:53 +0200 Subject: [PATCH 09/86] CMake: De-noise fileapidataextractor.cpp a bit Change-Id: I1ed8b18e394246cbfd14394c7f9b79fd90f680d2 Reviewed-by: Cristian Adam --- .../fileapidataextractor.cpp | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 7e469238058..ed5e64b3874 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -11,14 +11,14 @@ #include +#include + #include #include #include #include #include -#include - #include #include @@ -39,10 +39,10 @@ class CMakeFileResult public: QSet cmakeFiles; - std::vector> cmakeNodesSource; - std::vector> cmakeNodesBuild; - std::vector> cmakeNodesOther; - std::vector> cmakeListNodes; + std::vector> cmakeNodesSource; + std::vector> cmakeNodesBuild; + std::vector> cmakeNodesOther; + std::vector> cmakeListNodes; }; static CMakeFileResult extractCMakeFilesData(const QFuture &cancelFuture, @@ -132,10 +132,10 @@ public: QSet cmakeFiles; - std::vector> cmakeNodesSource; - std::vector> cmakeNodesBuild; - std::vector> cmakeNodesOther; - std::vector> cmakeListNodes; + std::vector> cmakeNodesSource; + std::vector> cmakeNodesBuild; + std::vector> cmakeNodesOther; + std::vector> cmakeListNodes; Configuration codemodel; std::vector targetDetails; @@ -259,7 +259,7 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t, } if (ct.targetType == ExecutableType) { - Utils::FilePaths librarySeachPaths; + FilePaths librarySeachPaths; // Is this a GUI application? ct.linksToQtGui = Utils::contains(t.link.value().fragments, [](const FragmentInfo &f) { @@ -531,8 +531,8 @@ static RawProjectParts generateRawProjectParts(const QFuture &cancelFuture rpp.setFlagsForCxx(cxxProjectFlags); const bool isExecutable = t.type == "EXECUTABLE"; - rpp.setBuildTargetType(isExecutable ? ProjectExplorer::BuildTargetType::Executable - : ProjectExplorer::BuildTargetType::Library); + rpp.setBuildTargetType(isExecutable ? BuildTargetType::Executable + : BuildTargetType::Library); rpps.append(rpp); ++count; } @@ -562,7 +562,7 @@ static FilePath directoryBuildDir(const Configuration &c, } static void addProjects(const QFuture &cancelFuture, - const QHash &cmakeListsNodes, + const QHash &cmakeListsNodes, const Configuration &config, const FilePath &sourceDir) { @@ -606,15 +606,15 @@ static FolderNode *createSourceGroupNode(const QString &sourceGroupName, } static void addCompileGroups(ProjectNode *targetRoot, - const Utils::FilePath &topSourceDirectory, - const Utils::FilePath &sourceDirectory, - const Utils::FilePath &buildDirectory, + const FilePath &topSourceDirectory, + const FilePath &sourceDirectory, + const FilePath &buildDirectory, const TargetDetails &td) { const bool showSourceFolders = settings().showSourceSubFolders(); const bool inSourceBuild = (sourceDirectory == buildDirectory); - QSet alreadyListed; + QSet alreadyListed; // Files already added by other configurations: targetRoot->forEachGenericNode( @@ -661,7 +661,7 @@ static void addCompileGroups(ProjectNode *targetRoot, if (baseDirectory.isEmpty()) { baseDirectory = fn->filePath().parentDir(); } else { - baseDirectory = Utils::FileUtils::commonPath(baseDirectory, fn->filePath()); + baseDirectory = FileUtils::commonPath(baseDirectory, fn->filePath()); } } @@ -684,7 +684,7 @@ static void addCompileGroups(ProjectNode *targetRoot, Tr::tr(""), std::move(buildFileNodes)); addCMakeVFolder(targetRoot, - Utils::FilePath(), + FilePath(), 10, Tr::tr(""), std::move(otherFileNodes)); @@ -713,7 +713,7 @@ static void addGeneratedFilesNode(ProjectNode *targetRoot, const FilePath &topLe } static void addTargets(const QFuture &cancelFuture, - const QHash &cmakeListsNodes, + const QHash &cmakeListsNodes, const Configuration &config, const std::vector &targetDetails, const FilePath &sourceDir, @@ -854,14 +854,12 @@ static void setupLocationInfoForTargets(const QFuture &cancelFuture, } } -using namespace FileApiDetails; - // -------------------------------------------------------------------- // extractData: // -------------------------------------------------------------------- FileApiQtcData extractData(const QFuture &cancelFuture, FileApiData &input, - const Utils::FilePath &sourceDir, const Utils::FilePath &buildDir) + const FilePath &sourceDir, const FilePath &buildDir) { FileApiQtcData result; From df9808562f3cdb7a2cdd95c7733659db4ed234f0 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 17 Oct 2023 17:49:54 +0200 Subject: [PATCH 10/86] Vcpkg: Fix a vcpkg detection regression Amends: ec7abcf98c5915364cd354d8ee62c645bcdd3a8d Change-Id: If1e8c124208b2d8eeea22b1b88f80b325c4d2efb Reviewed-by: Cristian Adam --- src/plugins/vcpkg/vcpkgsettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/vcpkg/vcpkgsettings.cpp b/src/plugins/vcpkg/vcpkgsettings.cpp index da91ef486b6..c0c5156d94f 100644 --- a/src/plugins/vcpkg/vcpkgsettings.cpp +++ b/src/plugins/vcpkg/vcpkgsettings.cpp @@ -37,7 +37,7 @@ VcpkgSettings::VcpkgSettings() vcpkgRoot.setExpectedKind(PathChooser::ExistingDirectory); FilePath defaultPath = Environment::systemEnvironment().searchInPath(Constants::VCPKG_COMMAND) .parentDir(); - if (defaultPath.isDir()) + if (!defaultPath.isDir()) defaultPath = FilePath::fromUserInput(qtcEnvironmentVariable(Constants::ENVVAR_VCPKG_ROOT)); if (defaultPath.isDir()) vcpkgRoot.setDefaultValue(defaultPath.toUserOutput()); From 70e9c2685fb75edab6af8ee2b889f868c945aeea Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 17 Oct 2023 18:43:57 +0200 Subject: [PATCH 11/86] vcpkg: Set VCPKG_ROOT environment variable for Qt Creator process This way CMakeProjectManager's auto-setup.cmake would pick it up and find vcpkg.exe Change-Id: Iafa84f13e0f50321ce771fc687ecc9e2df148de7 Reviewed-by: Alessandro Portale --- src/plugins/vcpkg/vcpkgplugin.cpp | 3 +++ src/plugins/vcpkg/vcpkgsettings.cpp | 8 ++++++++ src/plugins/vcpkg/vcpkgsettings.h | 2 ++ src/share/3rdparty/package-manager/auto-setup.cmake | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/plugins/vcpkg/vcpkgplugin.cpp b/src/plugins/vcpkg/vcpkgplugin.cpp index 2a0153d49ad..9dc717e08e1 100644 --- a/src/plugins/vcpkg/vcpkgplugin.cpp +++ b/src/plugins/vcpkg/vcpkgplugin.cpp @@ -5,6 +5,7 @@ #include "vcpkg_test.h" #endif // WITH_TESTS #include "vcpkgmanifesteditor.h" +#include "vcpkgsettings.h" #include @@ -35,6 +36,8 @@ public: #endif } + virtual void extensionsInitialized() final { settings().setVcpkgRootEnvironmentVariable(); } + std::unique_ptr d; }; diff --git a/src/plugins/vcpkg/vcpkgsettings.cpp b/src/plugins/vcpkg/vcpkgsettings.cpp index c0c5156d94f..4ea4496519d 100644 --- a/src/plugins/vcpkg/vcpkgsettings.cpp +++ b/src/plugins/vcpkg/vcpkgsettings.cpp @@ -42,6 +42,8 @@ VcpkgSettings::VcpkgSettings() if (defaultPath.isDir()) vcpkgRoot.setDefaultValue(defaultPath.toUserOutput()); + connect(this, &AspectContainer::applied, this, &VcpkgSettings::setVcpkgRootEnvironmentVariable); + setLayouter([this] { using namespace Layouting; auto websiteButton = new QToolButton; @@ -70,6 +72,12 @@ VcpkgSettings::VcpkgSettings() readSettings(); } +void VcpkgSettings::setVcpkgRootEnvironmentVariable() +{ + // Set VCPKG_ROOT environment variable so that auto-setup.cmake would pick it up + Environment::modifySystemEnvironment({{Constants::ENVVAR_VCPKG_ROOT, vcpkgRoot.value()}}); +} + class VcpkgSettingsPage : public Core::IOptionsPage { public: diff --git a/src/plugins/vcpkg/vcpkgsettings.h b/src/plugins/vcpkg/vcpkgsettings.h index dd266ad3716..acb41110b40 100644 --- a/src/plugins/vcpkg/vcpkgsettings.h +++ b/src/plugins/vcpkg/vcpkgsettings.h @@ -12,6 +12,8 @@ class VcpkgSettings : public Utils::AspectContainer public: VcpkgSettings(); + void setVcpkgRootEnvironmentVariable(); + Utils::FilePathAspect vcpkgRoot{this}; }; diff --git a/src/share/3rdparty/package-manager/auto-setup.cmake b/src/share/3rdparty/package-manager/auto-setup.cmake index 526dd333fa7..f6e6ce129aa 100644 --- a/src/share/3rdparty/package-manager/auto-setup.cmake +++ b/src/share/3rdparty/package-manager/auto-setup.cmake @@ -165,7 +165,7 @@ macro(qtc_auto_setup_vcpkg) if (EXISTS "${CMAKE_SOURCE_DIR}/vcpkg.json" AND NOT QT_CREATOR_SKIP_VCPKG_SETUP) option(QT_CREATOR_SKIP_VCPKG_SETUP "Skip Qt Creator's vcpkg package manager auto-setup" OFF) - find_program(vcpkg_program vcpkg ${CMAKE_SOURCE_DIR}/vcpkg) + find_program(vcpkg_program vcpkg $ENV{VCPKG_ROOT} ${CMAKE_SOURCE_DIR}/vcpkg) if (NOT vcpkg_program) message(WARNING "Qt Creator: vcpkg executable not found. " "Package manager auto-setup will be skipped. " From 865b6d57773c39da9ea54539af908fdd425af97a Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 17 Oct 2023 16:47:38 +0200 Subject: [PATCH 12/86] Doc: Add paths to options and links to docs to the change log Change-Id: I1c9ae020a7af9a0a88c7204cb90569b2f37f2c67 Reviewed-by: Eike Ziller --- dist/changelog/changes-12.0.0.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/dist/changelog/changes-12.0.0.md b/dist/changelog/changes-12.0.0.md index 0c5f7d211e6..53ad7d575f1 100644 --- a/dist/changelog/changes-12.0.0.md +++ b/dist/changelog/changes-12.0.0.md @@ -66,9 +66,11 @@ General `Edit > Preferences > Environment > Locator` to keep the sorting from the tool used for the file system index locator filter ([QTCREATORBUG-27789](https://bugreports.qt.io/browse/QTCREATORBUG-27789)) + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-editor-locator.html#locating-files-from-global-file-system-index)) * Added the `View > Show Menubar` option to hide the menu bar on platforms without a unified menu bar ([QTCREATORBUG-29498](https://bugreports.qt.io/browse/QTCREATORBUG-29498)) + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-how-to-show-and-hide-main-menu.html)) * Fixed an issue with growing session files Help @@ -77,13 +79,17 @@ Help * Added the `Edit > Preferences > Help > General > Antialias` check box for setting the anti-aliasing of text ([QTCREATORBUG-12177](https://bugreports.qt.io/browse/QTCREATORBUG-12177)) + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-how-to-get-help.html#change-the-font)) Editing ------- * Added the count of selected characters to line and column information + on the `Edit` mode toolbar ([QTCREATORBUG-29381](https://bugreports.qt.io/browse/QTCREATORBUG-29381)) + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-coding-navigating.html#navigating-between-open-files-and-symbols)) * Added an indenter, auto-brace and auto-quote for JSON + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-enclose-code-in-characters.html)) * Fixed that the historical order of open documents was not restored * Fixed that suggestions were rendered with the wrong tab size ([QTCREATORBUG-29483](https://bugreports.qt.io/browse/QTCREATORBUG-29483)) @@ -93,11 +99,15 @@ Editing * Updated to LLVM 17.0.1 * Added `Tools > C++ > Fold All Comment Blocks` and `Unfold All Comment Blocks` ([QTCREATORBUG-2449](https://bugreports.qt.io/browse/QTCREATORBUG-2449)) -* Added a refactoring action for converting comments between C++-style and + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-highlighting.html#folding-blocks)) +* Added the `Convert Comment to C Style` and `Convert Comment to C++ Style` + refactoring actions for converting comments between C++-style and C-style ([QTCREATORBUG-27501](https://bugreports.qt.io/browse/QTCREATORBUG-27501)) -* Added a refactoring action for moving documentation between function - declaration and definition + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-editor-quick-fixes.html#refactoring-c-code)) +* Added the `Move Function Documentation to Declaration` and + `Move Function Documentation to Definition` refactoring actions for moving + documentation between function declaration and definition ([QTCREATORBUG-13877](https://bugreports.qt.io/browse/QTCREATORBUG-13877)) * Extended the application of renaming operations to documentation comments ([QTCREATORBUG-12051](https://bugreports.qt.io/browse/QTCREATORBUG-12051), @@ -130,13 +140,15 @@ Editing ### Language Server Protocol -* Added support for Language servers that request creating, renaming or deleting of files +* Added support for Language servers that request creating, renaming, or deleting + of files ([QTCREATORBUG-29542](https://bugreports.qt.io/browse/QTCREATORBUG-29542)) ### Copilot * Added support for proxies ([QTCREATORBUG-29485](https://bugreports.qt.io/browse/QTCREATORBUG-29485)) + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-copilot.html)) ### TODO @@ -145,6 +157,7 @@ Editing ### Markdown * Added buttons and configurable shortcuts for text styles + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-markdown-editor.html)) ### Images From 5d79b010bf739dd0d200649ef13618be36256626 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 17 Oct 2023 16:45:08 +0200 Subject: [PATCH 13/86] Doc: Describe the Markdown editor toolbar buttons Task-number: QTCREATORBUG-29392 Change-Id: I390e2c525f9c1c6cadf874cfc313b17429f1f52a Reviewed-by: Eike Ziller --- .../images/qtcreator-markdown-editor.webp | Bin 22486 -> 23288 bytes .../creator-only/creator-markdown-editor.qdoc | 6 ++++++ 2 files changed, 6 insertions(+) diff --git a/doc/qtcreator/images/qtcreator-markdown-editor.webp b/doc/qtcreator/images/qtcreator-markdown-editor.webp index 0943d90fb3b0f5a3e507738aec95eac774e38dc8..37debd47c7cbad41db51a6d780052493c3fa4708 100644 GIT binary patch literal 23288 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

9fANeZTrieeZh1Nz>W zWu^$PZPz(6bI#Vei5lM}o0ER!l)k?4x_I8i6>I%h%Bshg&smXf?f$|;=gp_rEAQAm zuzAF7b-sIF<&DpuZ2m8bYYct+p!3+Nw=t3@4w?P^b6wec#iNgYJAT{z7YV;>Y}sJ! z*FBN(yV<7BYfGnT8>T3{lWcw^+u?a%N&MX%L4M;9Y44q~206{e|1Pk<*`IrP!*j`9 zrdO4`vN-j4Kb8$YbzyA7H#J-#_t-GaH$X`!t%bFP%$!B+3 z_fS^bGMjTPZ;#X&Wg9eao0qXKs&4tlzn|4(`Cngjw3|F#^|ix14;vP-ea!VIUK{y; zF@E;5HukZby{K=`+z+nD{dRB)T9xH4F8Kea+wM)}&$(Vk29LL>e7h;`t93Z!r7H7hRQ^g;7nvPpCcFo&Bh!c3qS%L;jbOJ&u~nT^lYw&u?2)Vh~^UE6t(2 z&w90dW~uTLnVMp%qLf6B4fGy&6fItV+#sg1pg^czLLZH?6lwg z&8?fuzn5NT4C1?YN|$X)(E_XLOQIH!x2PCBkaIIzsCMU|Wb+}(rM-<8%BM)r(6_EF z=i6SFZ{@sID*_a1EeWR1!TZt=eS6Y6*P?mbOO82(Q9V36rcd-ez;o`A&$(Ua4MfgK zi1cV2N^EV}aXw&5?LU`&E9}l)i+{gy*21VO-A^B^zrzz|Z1S{JEhj(EPS)XWKP}g)iP4|b zekOfN___V-Ha6{*{iSIWr&53Dby3j#mx}A&H@$y&R_K||NiGUgzvGeU)BEl#n#o2mztz5j#pV9 zTd!~2f3wwSLib^Ivzu~HR>d9K+Q};t_bX3p-G%Qh;io^(PKa%U>S$+)y=!ZAJ?{J| z2fYuo&j=U2v@Uot|L?Bjb#9!muCDJBzZBE>`h9Jn&|9yRlmp4>M;nTd=yN5oWpm%Z zcVz$Fj`H7AehAwi_;uX=eRtM_rSGrbuq==FiAnz7-EaG^(p)k8>irj`!kH|Zy!zeZ zFT_u}U%!9*&?$#QSLRQ+AFjDsd*a6PdM&;B)_oFb8@8>yJ-bDK>x$h`_D4eBta~4t zzPEpTb>5eY|2J66R&BL8pWk%C`+n!ksxM#4=g<1H@4>379er^-t>l&-O#QgPZMR3< z?tgMd{5MCg--UAGl$-8q=kw`|M2 zG5f-&Yj53j+%Cy>*LpeDa^F-rv&d^#Y$y8(i>#{?lUFbPw{^qgf*FNTrEHlWosxh5 zzhu@im;GEu?&OW;iciW%1GVlDQ2%ArSlZ1%5b$qs+SXvdcRw1HLmZLV|wgbe$~ zTNJu(#rw=TSNdYt741v2JN9zw=U>fp(Vt)OCOBwHtmm8u9UImLrq8*?lvJNM!78WJ z@JRIT4{v?%Ts*BV_j}5Ow7gldo#$Cx`?r+8Z|Ie6w|cxqOyV~;(~AqGg(rHhnekQ& z$K4AnQ=S7dk9SsVXZwkU)yCf5S>k;hvwI?RTSwyTVw2bshDrwk3;TH zMBXr%dK=A(^<3z}X2W>ia)*D3rL%5+ANAWbueiYI z-@43>qc)O%RCV~o)qK`?IL3D$Jzm%_OV!jT3#!xeyrqQ?U&Zwjg@=sOoA)o_?r!4{ zF1>O->ElNOhqG07v0CN`l@$_m(u|q=oa1eFh!w1vYi7LuZTiL^JNN>E-@Kout9P)o z_x;`gCFXfcp3Cg1z0|gD@A0`GwnWs#u&wCizPHrn_EZtClmo&a=QL{<`b>5{owE3i z?3zTTXJT{woOUcf`slHR!`T-Nn^GX^CV!aIeA!~z#+i)MlMl8WjNi1eY@f4Qj)DAl zh>*V_p=c2^9baq`|VCdAhVgz%<`jQ!bOGT|xZIv9@LR~-V9~v4`VZcji@ki$9No

nHe#doS~r(#$Jsf6sin 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 literal 22486 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 BaRUGV diff --git a/doc/qtcreator/src/editors/creator-only/creator-markdown-editor.qdoc b/doc/qtcreator/src/editors/creator-only/creator-markdown-editor.qdoc index 9a3d2444e61..95b31c2fd15 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-markdown-editor.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-markdown-editor.qdoc @@ -19,4 +19,10 @@ To hide and show the views, select \uicontrol {Show Preview} and \uicontrol {Show Editor}. To swap the places of the views, select \uicontrol {Swap Views}. + + \section1 Formatting Text + + Use the buttons on the editor toolbar to format text as italic (i), bold (b), + or inline code (`), and to create links to web sites + (\inlineimage icons/linkicon.png). */ From 755eefcbb2ae46bf516fa40d5c98d83a4ffbd23c Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Fri, 13 Oct 2023 12:28:52 +0200 Subject: [PATCH 14/86] Core: Refactor logging viewer * All log categories that were ever used are captured. * Fixed various small issues. * Allow disabling individual logging types. * Add Splitter between messages and categories. * No longer needs to interpret or change QT_LOGGING_RULES. Change-Id: I33be4754d550064bc66274f655a59e7af67ae487 Reviewed-by: Reviewed-by: Christian Stenger --- src/plugins/coreplugin/CMakeLists.txt | 2 - src/plugins/coreplugin/coreplugin.cpp | 7 +- src/plugins/coreplugin/coreplugin.qbs | 2 - src/plugins/coreplugin/loggingmanager.cpp | 304 ------ src/plugins/coreplugin/loggingmanager.h | 121 --- src/plugins/coreplugin/loggingviewer.cpp | 1114 +++++++++++++-------- src/plugins/coreplugin/loggingviewer.h | 7 +- 7 files changed, 720 insertions(+), 837 deletions(-) delete mode 100644 src/plugins/coreplugin/loggingmanager.cpp delete mode 100644 src/plugins/coreplugin/loggingmanager.h diff --git a/src/plugins/coreplugin/CMakeLists.txt b/src/plugins/coreplugin/CMakeLists.txt index d7f04d88ed5..6079989c718 100644 --- a/src/plugins/coreplugin/CMakeLists.txt +++ b/src/plugins/coreplugin/CMakeLists.txt @@ -209,8 +209,6 @@ add_qtc_plugin(Core locator/spotlightlocatorfilter.h locator/urllocatorfilter.cpp locator/urllocatorfilter.h - loggingmanager.cpp - loggingmanager.h loggingviewer.cpp loggingviewer.h manhattanstyle.cpp diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index dca909d0752..bfd0669c338 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -9,18 +9,18 @@ #include "icore.h" #include "idocument.h" #include "iwizardfactory.h" +#include "loggingviewer.h" #include "modemanager.h" #include "session.h" #include "settingsdatabase.h" #include "themechooser.h" #include "actionmanager/actionmanager.h" +#include "coreconstants.h" #include "documentmanager.h" -#include "editormanager/editormanager.h" +#include "fileutils.h" #include "find/findplugin.h" #include "locator/locator.h" -#include "coreconstants.h" -#include "fileutils.h" #include #include @@ -490,6 +490,7 @@ QString CorePlugin::msgCrashpadInformation() ExtensionSystem::IPlugin::ShutdownFlag CorePlugin::aboutToShutdown() { + LoggingViewer::hideLoggingView(); Find::aboutToShutdown(); m_locator->aboutToShutdown(); ICore::aboutToShutdown(); diff --git a/src/plugins/coreplugin/coreplugin.qbs b/src/plugins/coreplugin/coreplugin.qbs index 37c8a9b73f8..9bd3923a6fb 100644 --- a/src/plugins/coreplugin/coreplugin.qbs +++ b/src/plugins/coreplugin/coreplugin.qbs @@ -102,8 +102,6 @@ QtcPlugin { "iwizardfactory.h", "jsexpander.cpp", "jsexpander.h", - "loggingmanager.cpp", - "loggingmanager.h", "loggingviewer.cpp", "loggingviewer.h", "manhattanstyle.cpp", diff --git a/src/plugins/coreplugin/loggingmanager.cpp b/src/plugins/coreplugin/loggingmanager.cpp deleted file mode 100644 index 608e7ce4706..00000000000 --- a/src/plugins/coreplugin/loggingmanager.cpp +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "loggingmanager.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -// -// WARNING! Do not use qDebug(), qWarning() or similar inside this file - -// same applies for indirect usages (e.g. QTC_ASSERT() and the like). -// Using static functions of QLoggingCategory may cause dead locks as well. -// - -using namespace Utils; - -namespace Core { -namespace Internal { - -static QtMessageHandler s_originalMessageHandler = nullptr; - -static LoggingViewManager *s_instance = nullptr; - -static QString levelToString(QtMsgType t) -{ - switch (t) { - case QtMsgType::QtCriticalMsg: return {"critical"}; - case QtMsgType::QtDebugMsg: return {"debug"}; - case QtMsgType::QtInfoMsg: return {"info"}; - case QtMsgType::QtWarningMsg: return {"warning"}; - default: - return {"fatal"}; // wrong but we don't care - } -} - -static QtMsgType parseLevel(const QString &level) -{ - switch (level.at(0).toLatin1()) { - case 'c': return QtMsgType::QtCriticalMsg; - case 'd': return QtMsgType::QtDebugMsg; - case 'i': return QtMsgType::QtInfoMsg; - case 'w': return QtMsgType::QtWarningMsg; - default: - return QtMsgType::QtFatalMsg; // wrong but we don't care - } -} - -static bool parseLine(const QString &line, FilterRuleSpec *filterRule) -{ - const QStringList parts = line.split('='); - if (parts.size() != 2) - return false; - - const QString category = parts.at(0); - static const QRegularExpression regex("^(.+?)(\\.(debug|info|warning|critical))?$"); - const QRegularExpressionMatch match = regex.match(category); - if (!match.hasMatch()) - return false; - - const QString categoryName = match.captured(1); - if (categoryName.size() > 2) { - if (categoryName.mid(1, categoryName.size() - 2).contains('*')) - return false; - } else if (categoryName.size() == 2) { - if (categoryName.count('*') == 2) - return false; - } - filterRule->category = categoryName; - - if (match.capturedLength(2) == 0) - filterRule->level = std::nullopt; - else - filterRule->level = std::make_optional(parseLevel(match.captured(2).mid(1))); - - const QString enabled = parts.at(1); - if (enabled == "true" || enabled == "false") { - filterRule->enabled = (enabled == "true"); - return true; - } - return false; -} - -static QList fetchOriginalRules() -{ - QList rules; - - auto appendRulesFromFile = [&rules](const QString &fileName) { - QSettings iniSettings(fileName, QSettings::IniFormat); - iniSettings.beginGroup("Rules"); - const QStringList keys = iniSettings.allKeys(); - for (const QString &key : keys) { - const QString value = iniSettings.value(key).toString(); - FilterRuleSpec filterRule; - if (parseLine(key + "=" + value, &filterRule)) - rules.append(filterRule); - } - iniSettings.endGroup(); - }; - - Utils::FilePath iniFile = Utils::FilePath::fromString( - QLibraryInfo::path(QLibraryInfo::DataPath)).pathAppended("qtlogging.ini"); - if (iniFile.exists()) - appendRulesFromFile(iniFile.toString()); - - const QString qtProjectString = QStandardPaths::locate(QStandardPaths::GenericConfigLocation, - "QtProject/qtlogging.ini"); - if (!qtProjectString.isEmpty()) - appendRulesFromFile(qtProjectString); - - iniFile = Utils::FilePath::fromString(qtcEnvironmentVariable("QT_LOGGING_CONF")); - if (iniFile.exists()) - appendRulesFromFile(iniFile.toString()); - - if (qtcEnvironmentVariableIsSet("QT_LOGGING_RULES")) { - const QStringList rulesStrings = qtcEnvironmentVariable("QT_LOGGING_RULES").split(';'); - for (const QString &rule : rulesStrings) { - FilterRuleSpec filterRule; - if (parseLine(rule, &filterRule)) - rules.append(filterRule); - } - } - return rules; -} - -LoggingViewManager::LoggingViewManager(QObject *parent) - : QObject(parent) - , m_originalLoggingRules(qtcEnvironmentVariable("QT_LOGGING_RULES")) -{ - qRegisterMetaType(); - s_instance = this; - s_originalMessageHandler = qInstallMessageHandler(logMessageHandler); - m_enabled = true; - m_originalRules = fetchOriginalRules(); - prefillCategories(); - QLoggingCategory::setFilterRules("*=true"); -} - -LoggingViewManager::~LoggingViewManager() -{ - m_enabled = false; - qInstallMessageHandler(s_originalMessageHandler); - s_originalMessageHandler = nullptr; - qputenv("QT_LOGGING_RULES", m_originalLoggingRules.toLocal8Bit()); - QLoggingCategory::setFilterRules("*=false"); - resetFilterRules(); - s_instance = nullptr; -} - -LoggingViewManager *LoggingViewManager::instance() -{ - return s_instance; -} - -void LoggingViewManager::logMessageHandler(QtMsgType type, const QMessageLogContext &context, - const QString &mssg) -{ - if (!s_instance->m_enabled) { - if (s_instance->enabledInOriginalRules(context, type)) - s_originalMessageHandler(type, context, mssg); - return; - } - - if (!context.category) { - s_originalMessageHandler(type, context, mssg); - return; - } - - const QString category = QString::fromLocal8Bit(context.category); - auto it = s_instance->m_categories.find(category); - if (it == s_instance->m_categories.end()) { - if (!s_instance->m_listQtInternal && category.startsWith("qt.")) - return; - LoggingCategoryEntry entry; - entry.level = QtMsgType::QtDebugMsg; - entry.enabled = (category == "default") || s_instance->enabledInOriginalRules(context, type); - it = s_instance->m_categories.insert(category, entry); - emit s_instance->foundNewCategory(category, entry); - } - - const LoggingCategoryEntry entry = it.value(); - if (entry.enabled && enabled(type, entry.level)) { - const QString timestamp = QDateTime::currentDateTime().toString("HH:mm:ss.zzz"); - emit s_instance->receivedLog(timestamp, category, - LoggingViewManager::messageTypeToString(type), mssg); - } -} - -bool LoggingViewManager::isCategoryEnabled(const QString &category) -{ - auto entry = m_categories.find(category); - if (entry == m_categories.end()) // shall not happen - paranoia - return false; - - return entry.value().enabled; -} - -void LoggingViewManager::setCategoryEnabled(const QString &category, bool enabled) -{ - auto entry = m_categories.find(category); - if (entry == m_categories.end()) // shall not happen - paranoia - return; - - entry->enabled = enabled; -} - -void LoggingViewManager::setLogLevel(const QString &category, QtMsgType type) -{ - auto entry = m_categories.find(category); - if (entry == m_categories.end()) // shall not happen - paranoia - return; - - entry->level = type; -} - -void LoggingViewManager::setListQtInternal(bool listQtInternal) -{ - m_listQtInternal = listQtInternal; -} - -void LoggingViewManager::appendOrUpdate(const QString &category, const LoggingCategoryEntry &entry) -{ - auto it = m_categories.find(category); - bool append = it == m_categories.end(); - m_categories.insert(category, entry); - if (append) - emit foundNewCategory(category, entry); - else - emit updatedCategory(category, entry); -} - -/* - * Does not check categories for being present, will perform early exit if m_categories is not empty - */ -void LoggingViewManager::prefillCategories() -{ - if (!m_categories.isEmpty()) - return; - - for (int i = 0, end = m_originalRules.size(); i < end; ++i) { - const FilterRuleSpec &rule = m_originalRules.at(i); - if (rule.category.startsWith('*') || rule.category.endsWith('*')) - continue; - - bool enabled = rule.enabled; - // check following rules whether they might overwrite - for (int j = i + 1; j < end; ++j) { - const FilterRuleSpec &secondRule = m_originalRules.at(j); - const QRegularExpression regex( - QRegularExpression::wildcardToRegularExpression(secondRule.category)); - if (!regex.match(rule.category).hasMatch()) - continue; - - if (secondRule.level.has_value() && rule.level != secondRule.level) - continue; - - enabled = secondRule.enabled; - } - LoggingCategoryEntry entry; - entry.level = rule.level.value_or(QtMsgType::QtInfoMsg); - entry.enabled = enabled; - m_categories.insert(rule.category, entry); - } -} - -void LoggingViewManager::resetFilterRules() -{ - for (const FilterRuleSpec &rule : std::as_const(m_originalRules)) { - const QString level = rule.level.has_value() ? '.' + levelToString(rule.level.value()) - : QString(); - const QString ruleString = rule.category + level + '=' + (rule.enabled ? "true" : "false"); - QLoggingCategory::setFilterRules(ruleString); - } -} - -bool LoggingViewManager::enabledInOriginalRules(const QMessageLogContext &context, QtMsgType type) -{ - if (!context.category) - return false; - const QString category = QString::fromUtf8(context.category); - bool result = false; - for (const FilterRuleSpec &rule : std::as_const(m_originalRules)) { - const QRegularExpression regex( - QRegularExpression::wildcardToRegularExpression(rule.category)); - if (regex.match(category).hasMatch()) { - if (rule.level.has_value()) { - if (rule.level.value() == type) - result = rule.enabled; - } else { - result = rule.enabled; - } - } - } - return result; -} - -} // namespace Internal -} // namespace Core diff --git a/src/plugins/coreplugin/loggingmanager.h b/src/plugins/coreplugin/loggingmanager.h deleted file mode 100644 index 1b8830c0aa1..00000000000 --- a/src/plugins/coreplugin/loggingmanager.h +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include -#include -#include -#include - -#include - -namespace Core { -namespace Internal { - -struct FilterRuleSpec -{ - QString category; - std::optional level; - bool enabled; -}; - -class LoggingCategoryEntry -{ -public: - QtMsgType level = QtDebugMsg; - bool enabled = false; - QColor color; -}; - -class LoggingViewManager : public QObject -{ - Q_OBJECT -public: - static inline QString messageTypeToString(QtMsgType type) - { - switch (type) { - case QtDebugMsg: return {"Debug"}; - case QtInfoMsg: return {"Info"}; - case QtCriticalMsg: return {"Critical"}; - case QtWarningMsg: return {"Warning"}; - case QtFatalMsg: return {"Fatal"}; - default: return {"Unknown"}; - } - } - - static inline QtMsgType messageTypeFromString(const QString &type) - { - if (type.isEmpty()) - return QtDebugMsg; - - // shortcut - only handle expected - switch (type.at(0).toLatin1()) { - case 'I': - return QtInfoMsg; - case 'C': - return QtCriticalMsg; - case 'W': - return QtWarningMsg; - case 'D': - default: - return QtDebugMsg; - } - } - - explicit LoggingViewManager(QObject *parent = nullptr); - ~LoggingViewManager(); - - static LoggingViewManager *instance(); - - static inline bool enabled(QtMsgType current, QtMsgType stored) - { - if (stored == QtMsgType::QtInfoMsg) - return true; - if (current == stored) - return true; - if (stored == QtMsgType::QtDebugMsg) - return current != QtMsgType::QtInfoMsg; - if (stored == QtMsgType::QtWarningMsg) - return current == QtMsgType::QtCriticalMsg || current == QtMsgType::QtFatalMsg; - if (stored == QtMsgType::QtCriticalMsg) - return current == QtMsgType::QtFatalMsg; - return false; - } - - static void logMessageHandler(QtMsgType type, const QMessageLogContext &context, - const QString &mssg); - - void setEnabled(bool enabled) { m_enabled = enabled; } - bool isEnabled() const { return m_enabled; } - bool isCategoryEnabled(const QString &category); - void setCategoryEnabled(const QString &category, bool enabled); - void setLogLevel(const QString &category, QtMsgType type); - void setListQtInternal(bool listQtInternal); - QList originalRules() const { return m_originalRules; } - - QMap categories() const { return m_categories; } - void appendOrUpdate(const QString &category, const LoggingCategoryEntry &entry); - -signals: - void receivedLog(const QString ×tamp, const QString &type, const QString &category, - const QString &msg); - void foundNewCategory(const QString &category, const LoggingCategoryEntry &entry); - void updatedCategory(const QString &category, const LoggingCategoryEntry &entry); - -private: - void prefillCategories(); - void resetFilterRules(); - bool enabledInOriginalRules(const QMessageLogContext &context, QtMsgType type); - - QMap m_categories; - const QString m_originalLoggingRules; - QList m_originalRules; - bool m_enabled = false; - bool m_listQtInternal = false; -}; - -} // namespace Internal -} // namespace Core - -Q_DECLARE_METATYPE(Core::Internal::LoggingCategoryEntry) diff --git a/src/plugins/coreplugin/loggingviewer.cpp b/src/plugins/coreplugin/loggingviewer.cpp index 742e65a34c5..bf1f8b736f0 100644 --- a/src/plugins/coreplugin/loggingviewer.cpp +++ b/src/plugins/coreplugin/loggingviewer.cpp @@ -3,26 +3,22 @@ #include "loggingviewer.h" -#include "actionmanager/actionmanager.h" #include "coreicons.h" #include "coreplugintr.h" #include "icore.h" -#include "loggingmanager.h" -#include #include #include +#include #include #include +#include #include #include #include -#include #include -#include #include -#include #include #include #include @@ -31,138 +27,348 @@ #include #include #include -#include -#include #include -#include +#include #include -#include #include -namespace Core { -namespace Internal { +namespace Core::Internal { -class LoggingCategoryItem +static QColor colorForCategory(const QString &category); +void setCategoryColor(const QString &category, const QColor &color); + +QHash s_categoryColor; + +static inline QString messageTypeToString(QtMsgType type) { -public: - QString name; - LoggingCategoryEntry entry; + switch (type) { + case QtDebugMsg: + return {"Debug"}; + case QtInfoMsg: + return {"Info"}; + case QtCriticalMsg: + return {"Critical"}; + case QtWarningMsg: + return {"Warning"}; + case QtFatalMsg: + return {"Fatal"}; + default: + return {"Unknown"}; + } +} - static LoggingCategoryItem fromJson(const QJsonObject &object, bool *ok); +class LogCategoryRegistry : public QObject +{ + Q_OBJECT +public: + static LogCategoryRegistry &instance() + { + static LogCategoryRegistry s_instance; + return s_instance; + } + + static void filter(QLoggingCategory *category) + { + if (s_oldFilter) + s_oldFilter(category); + + LogCategoryRegistry::instance().onFilter(category); + } + + void start() + { + if (m_started) + return; + + m_started = true; + s_oldFilter = QLoggingCategory::installFilter(&LogCategoryRegistry::filter); + } + + QList categories() { return m_categories; } + +signals: + void newLogCategory(QLoggingCategory *category); + +private: + LogCategoryRegistry() = default; + + void onFilter(QLoggingCategory *category) + { + if (!m_categories.contains(category)) { + m_categories.append(category); + emit newLogCategory(category); + } + } + +private: + static QLoggingCategory::CategoryFilter s_oldFilter; + + QList m_categories; + bool m_started{false}; }; -LoggingCategoryItem LoggingCategoryItem::fromJson(const QJsonObject &object, bool *ok) +QLoggingCategory::CategoryFilter LogCategoryRegistry::s_oldFilter; + +struct SavedEntry { - if (!object.contains("name")) { - *ok = false; - return {}; + QColor color; + QString name; + QtMsgType level; + std::optional> levels; + + static Utils::expected_str fromJson(const QJsonObject &obj) + { + if (!obj.contains("name")) + return Utils::make_unexpected(Tr::tr("Entry is missing a logging category name.")); + + SavedEntry result; + result.name = obj.value("name").toString(); + + if (!obj.contains("entry")) + return Utils::make_unexpected(Tr::tr("Entry is missing data.")); + + auto entry = obj.value("entry").toObject(); + if (entry.contains("color")) + result.color = QColor(entry.value("color").toString()); + + if (entry.contains("level")) { + int lvl = entry.value("level").toInt(0); + if (lvl < QtDebugMsg || lvl > QtInfoMsg) + return Utils::make_unexpected(Tr::tr("Invalid level: %1").arg(lvl)); + result.level = static_cast(lvl); + } + + if (entry.contains("levels")) { + QVariantMap map = entry.value("levels").toVariant().toMap(); + std::array levels{ + map.contains("Debug") && map["Debug"].toBool(), + map.contains("Warning") && map["Warning"].toBool(), + map.contains("Critical") && map["Critical"].toBool(), + true, + map.contains("Info") && map["Info"].toBool(), + }; + result.levels = levels; + } + + return result; } - const QJsonValue entryVal = object.value("entry"); - if (entryVal.isUndefined()) { - *ok = false; - return {}; - } - const QJsonObject entryObj = entryVal.toObject(); - if (!entryObj.contains("level")) { - *ok = false; - return {}; +}; + +class LoggingCategoryEntry +{ +public: + LoggingCategoryEntry(const QString &name) + : m_name(name) + {} + LoggingCategoryEntry(QLoggingCategory *category) + : m_name(QString::fromUtf8(category->categoryName())) + { + setLogCategory(category); } - LoggingCategoryEntry entry; - entry.level = QtMsgType(entryObj.value("level").toInt()); - entry.enabled = true; - if (entryObj.contains("color")) - entry.color = QColor(entryObj.value("color").toString()); - LoggingCategoryItem item {object.value("name").toString(), entry}; - *ok = true; - return item; -} + LoggingCategoryEntry(const SavedEntry &savedEntry) + : m_name(savedEntry.name) + { + m_saved = savedEntry.levels; + m_color = savedEntry.color; + if (!m_saved) { + m_saved = std::array(); + for (int i = QtDebugMsg; i <= QtInfoMsg; ++i) { + (*m_saved)[i] = savedEntry.level <= i; + } + } + } + + QString name() const { return m_name; } + QColor color() const { return m_color; } + void setColor(const QColor &c) { m_color = c; } + + void setUseOriginal(bool useOriginal) + { + if (!m_useOriginal && m_category && m_originalSettings) { + m_saved = std::array{}; + + for (int i = QtDebugMsg; i < QtInfoMsg; i++) { + (*m_saved)[i] = m_category->isEnabled(static_cast(i)); + m_category->setEnabled(static_cast(i), (*m_originalSettings)[i]); + } + + } else if (!useOriginal && m_useOriginal && m_saved && m_category) { + for (int i = QtDebugMsg; i < QtInfoMsg; i++) + m_category->setEnabled(static_cast(i), (*m_saved)[i]); + } + m_useOriginal = useOriginal; + } + + bool isEnabled(QtMsgType msgType) const + { + if (m_category) + return m_category->isEnabled(msgType); + if (m_saved) + return (*m_saved)[msgType]; + return false; + } + + void setEnabled(QtMsgType msgType, bool isEnabled) + { + QTC_ASSERT(!m_useOriginal, return); + + if (m_category) + m_category->setEnabled(msgType, isEnabled); + + if (m_saved) + (*m_saved)[msgType] = isEnabled; + } + + void setSaved(const SavedEntry &entry) + { + QTC_ASSERT(entry.name == name(), return); + + m_saved = entry.levels; + m_color = entry.color; + if (!m_saved) { + m_saved = std::array(); + for (int i = QtDebugMsg; i <= QtInfoMsg; ++i) { + (*m_saved)[i] = entry.level <= i; + } + } + if (m_category) + setLogCategory(m_category); + } + + void setLogCategory(QLoggingCategory *category) + { + QTC_ASSERT(QString::fromUtf8(category->categoryName()) == m_name, return); + + m_category = category; + if (!m_originalSettings) { + m_originalSettings = { + category->isDebugEnabled(), + category->isWarningEnabled(), + category->isCriticalEnabled(), + true, // always enable fatal + category->isInfoEnabled(), + }; + } + + if (m_saved && !m_useOriginal) { + m_category->setEnabled(QtDebugMsg, m_saved->at(0)); + m_category->setEnabled(QtWarningMsg, m_saved->at(1)); + m_category->setEnabled(QtCriticalMsg, m_saved->at(2)); + m_category->setEnabled(QtInfoMsg, m_saved->at(4)); + } + } + + bool isDebugEnabled() const { return isEnabled(QtDebugMsg); } + bool isWarningEnabled() const { return isEnabled(QtWarningMsg); } + bool isCriticalEnabled() const { return isEnabled(QtCriticalMsg); } + bool isInfoEnabled() const { return isEnabled(QtInfoMsg); } + +private: + QString m_name; + QLoggingCategory *m_category{nullptr}; + std::optional> m_originalSettings; + std::optional> m_saved; + QColor m_color; + bool m_useOriginal{false}; +}; class LoggingCategoryModel : public QAbstractListModel { Q_OBJECT public: - LoggingCategoryModel() = default; - ~LoggingCategoryModel() override; + LoggingCategoryModel(QObject *parent) + : QAbstractListModel(parent) + { + auto newCategory = [this](QLoggingCategory *category) { + QString name = QString::fromUtf8(category->categoryName()); + auto itExists = std::find_if(m_categories.begin(), + m_categories.end(), + [name](const auto &cat) { return name == cat.name(); }); - bool append(const QString &category, const LoggingCategoryEntry &entry = {}); - bool update(const QString &category, const LoggingCategoryEntry &entry); - int columnCount(const QModelIndex &) const final { return 3; } - int rowCount(const QModelIndex & = QModelIndex()) const final { return m_categories.count(); } + if (itExists != m_categories.end()) { + itExists->setLogCategory(category); + } else { + LoggingCategoryEntry entry(category); + append(entry); + } + }; + + for (QLoggingCategory *cat : LogCategoryRegistry::instance().categories()) + newCategory(cat); + + connect(&LogCategoryRegistry::instance(), + &LogCategoryRegistry::newLogCategory, + this, + newCategory); + + LogCategoryRegistry::instance().start(); + }; + + ~LoggingCategoryModel() override; + enum Column { Color, Name, Debug, Warning, Critical, Fatal, Info }; + + void append(const LoggingCategoryEntry &entry); + int columnCount(const QModelIndex &) const final { return 7; } + int rowCount(const QModelIndex & = QModelIndex()) const final { return m_categories.size(); } QVariant data(const QModelIndex &index, int role) const final; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) final; Qt::ItemFlags flags(const QModelIndex &index) const final; - QVariant headerData(int section, Qt::Orientation orientation, + QVariant headerData(int section, + Qt::Orientation orientation, int role = Qt::DisplayRole) const final; - void reset(); - void setFromManager(LoggingViewManager *manager); - QList enabledCategories() const; - void disableAll(); -signals: - void categoryChanged(const QString &category, bool enabled); - void colorChanged(const QString &category, const QColor &color); - void logLevelChanged(const QString &category, QtMsgType logLevel); + void saveEnabledCategoryPreset() const; + void loadAndUpdateFromPreset(); + + void setUseOriginal(bool useOriginal) + { + if (useOriginal != m_useOriginal) { + beginResetModel(); + for (auto &entry : m_categories) + entry.setUseOriginal(useOriginal); + + m_useOriginal = useOriginal; + endResetModel(); + } + } + + const QList &categories() const { return m_categories; } private: - QList m_categories; + QList m_categories; + bool m_useOriginal{false}; }; -LoggingCategoryModel::~LoggingCategoryModel() -{ - reset(); -} +LoggingCategoryModel::~LoggingCategoryModel() {} -bool LoggingCategoryModel::append(const QString &category, const LoggingCategoryEntry &entry) +void LoggingCategoryModel::append(const LoggingCategoryEntry &entry) { - // no check? - beginInsertRows(QModelIndex(), m_categories.size(), m_categories.size()); - m_categories.append(new LoggingCategoryItem{category, entry}); + beginInsertRows(QModelIndex(), m_categories.size(), m_categories.size() + 1); + m_categories.push_back(entry); endInsertRows(); - return true; -} - -bool LoggingCategoryModel::update(const QString &category, const LoggingCategoryEntry &entry) -{ - if (m_categories.size() == 0) // should not happen - return false; - - int row = 0; - for (int end = m_categories.size(); row < end; ++row) { - if (m_categories.at(row)->name == category) - break; - } - if (row == m_categories.size()) // should not happen - return false; - - setData(index(row, 0), Qt::Checked, Qt::CheckStateRole); - setData(index(row, 1), LoggingViewManager::messageTypeToString(entry.level), Qt::EditRole); - setData(index(row, 2), entry.color, Qt::DecorationRole); - return true; } QVariant LoggingCategoryModel::data(const QModelIndex &index, int role) const { - static const QColor defaultColor = Utils::creatorTheme()->palette().text().color(); if (!index.isValid()) return {}; - if (role == Qt::DisplayRole) { - if (index.column() == 0) - return m_categories.at(index.row())->name; - if (index.column() == 1) { - return LoggingViewManager::messageTypeToString( - m_categories.at(index.row())->entry.level); - } - } - if (role == Qt::DecorationRole && index.column() == 2) { - const QColor color = m_categories.at(index.row())->entry.color; + + if (index.column() == Column::Name && role == Qt::DisplayRole) { + return m_categories.at(index.row()).name(); + } else if (role == Qt::DecorationRole && index.column() == Column::Color) { + const QColor color = m_categories.at(index.row()).color(); if (color.isValid()) return color; + + static const QColor defaultColor = Utils::creatorTheme()->palette().text().color(); return defaultColor; - } - if (role == Qt::CheckStateRole && index.column() == 0) { - const LoggingCategoryEntry entry = m_categories.at(index.row())->entry; - return entry.enabled ? Qt::Checked : Qt::Unchecked; + } else if (role == Qt::CheckStateRole && index.column() >= Column::Debug + && index.column() <= Column::Info) { + const LoggingCategoryEntry &entry = m_categories.at(index.row()); + return entry.isEnabled(static_cast(index.column() - Column::Debug)) + ? Qt::Checked + : Qt::Unchecked; } return {}; } @@ -172,27 +378,28 @@ bool LoggingCategoryModel::setData(const QModelIndex &index, const QVariant &val if (!index.isValid()) return false; - if (role == Qt::CheckStateRole && index.column() == 0) { - LoggingCategoryItem *item = m_categories.at(index.row()); - const Qt::CheckState current = item->entry.enabled ? Qt::Checked : Qt::Unchecked; + if (role == Qt::CheckStateRole && index.column() >= Column::Debug + && index.column() <= Column::Info) { + QtMsgType msgType = static_cast(index.column() - Column::Debug); + auto &entry = m_categories[index.row()]; + bool isEnabled = entry.isEnabled(msgType); + + const Qt::CheckState current = isEnabled ? Qt::Checked : Qt::Unchecked; + if (current != value.toInt()) { - item->entry.enabled = !item->entry.enabled; - emit categoryChanged(item->name, item->entry.enabled); + entry.setEnabled(msgType, value.toInt() == Qt::Checked); return true; } - } else if (role == Qt::DecorationRole && index.column() == 2) { - LoggingCategoryItem *item = m_categories.at(index.row()); + } else if (role == Qt::DecorationRole && index.column() == Column::Color) { + auto &category = m_categories[index.row()]; + QColor currentColor = category.color(); QColor color = value.value(); - if (color.isValid() && color != item->entry.color) { - item->entry.color = color; - emit colorChanged(item->name, color); + if (color.isValid() && color != currentColor) { + category.setColor(color); + setCategoryColor(category.name(), color); + emit dataChanged(index, index, {Qt::DisplayRole}); return true; } - } else if (role == Qt::EditRole && index.column() == 1) { - LoggingCategoryItem *item = m_categories.at(index.row()); - item->entry.level = LoggingViewManager::messageTypeFromString(value.toString()); - emit logLevelChanged(item->name, item->entry.level); - return true; } return false; @@ -203,111 +410,47 @@ Qt::ItemFlags LoggingCategoryModel::flags(const QModelIndex &index) const if (!index.isValid()) return Qt::NoItemFlags; - // ItemIsEnabled should depend on availability (Qt logging enabled?) - if (index.column() == 0) - return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; - if (index.column() == 1) - return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; + if (index.column() == LoggingCategoryModel::Column::Fatal) + return Qt::NoItemFlags; + + if (index.column() == Column::Name || index.column() == Column::Color) + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; + + if (m_useOriginal) + return Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; + + return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; } QVariant LoggingCategoryModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (role == Qt::DisplayRole && orientation == Qt::Horizontal && section >= 0 && section < 3) { + if (role == Qt::DisplayRole && orientation == Qt::Horizontal && section >= 0 && section < 8) { switch (section) { - case 0: return Tr::tr("Category"); - case 1: return Tr::tr("Type"); - case 2: return Tr::tr("Color"); + case Column::Name: + return Tr::tr("Category"); + case Column::Color: + return Tr::tr("Color"); + case Column::Debug: + return Tr::tr("Debug"); + case Column::Warning: + return Tr::tr("Warning"); + case Column::Critical: + return Tr::tr("Critical"); + case Column::Fatal: + return Tr::tr("Fatal"); + case Column::Info: + return Tr::tr("Info"); } } return {}; } -void LoggingCategoryModel::reset() -{ - beginResetModel(); - qDeleteAll(m_categories); - m_categories.clear(); - endResetModel(); -} - -void LoggingCategoryModel::setFromManager(LoggingViewManager *manager) -{ - beginResetModel(); - qDeleteAll(m_categories); - m_categories.clear(); - const QMap categories = manager->categories(); - auto it = categories.begin(); - for (auto end = categories.end() ; it != end; ++it) - m_categories.append(new LoggingCategoryItem{it.key(), it.value()}); - endResetModel(); -} - -QList LoggingCategoryModel::enabledCategories() const -{ - QList result; - for (auto item : m_categories) { - if (item->entry.enabled) - result.append({item->name, item->entry}); - } - return result; -} - -void LoggingCategoryModel::disableAll() -{ - for (int row = 0, end = m_categories.count(); row < end; ++row) - setData(index(row, 0), Qt::Unchecked, Qt::CheckStateRole); -} - -class LoggingLevelDelegate : public QStyledItemDelegate -{ -public: - explicit LoggingLevelDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {} - ~LoggingLevelDelegate() = default; - -protected: - QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, - const QModelIndex &index) const override; - void setEditorData(QWidget *editor, const QModelIndex &index) const override; - void setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const override; -}; - -QWidget *LoggingLevelDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, - const QModelIndex &index) const -{ - if (!index.isValid() || index.column() != 1) - return nullptr; - QComboBox *combo = new QComboBox(parent); - combo->addItems({ {"Critical"}, {"Warning"}, {"Debug"}, {"Info"} }); - return combo; -} - -void LoggingLevelDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const -{ - QComboBox *combo = qobject_cast(editor); - if (!combo) - return; - - const int i = combo->findText(index.data().toString()); - if (i >= 0) - combo->setCurrentIndex(i); -} - -void LoggingLevelDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const -{ - QComboBox *combo = qobject_cast(editor); - if (combo) - model->setData(index, combo->currentText()); -} - class LogEntry { public: QString timestamp; - QString category; QString type; + QString category; QString message; QString outputLine(bool printTimestamp, bool printType) const @@ -325,95 +468,157 @@ public: } }; +class LoggingEntryModel : public Utils::ListModel +{ +public: + ~LoggingEntryModel() { qInstallMessageHandler(m_originalMessageHandler); } + + static void logMessageHandler(QtMsgType type, + const QMessageLogContext &context, + const QString &mssg) + { + instance().msgHandler(type, context, mssg); + } + + static QVariant logEntryDataAccessor(const LogEntry &entry, int column, int role) + { + if (column >= 0 && column <= 3 && (role == Qt::DisplayRole || role == Qt::ToolTipRole)) { + switch (column) { + case 0: + return entry.timestamp; + case 1: + return entry.category; + case 2: + return entry.type; + case 3: { + if (role == Qt::ToolTipRole) + return entry.message; + return entry.message.left(1000); + } + } + } + if (role == Qt::TextAlignmentRole) + return Qt::AlignTop; + if (column == 1 && role == Qt::ForegroundRole) + return colorForCategory(entry.category); + return {}; + } + + static LoggingEntryModel &instance() + { + static LoggingEntryModel model; + return model; + } + + void setEnabled(bool enabled) { m_enabled = enabled; } + +private: + LoggingEntryModel() + { + setHeader({Tr::tr("Timestamp"), Tr::tr("Category"), Tr::tr("Type"), Tr::tr("Message")}); + setDataAccessor(&logEntryDataAccessor); + + m_originalMessageHandler = qInstallMessageHandler(logMessageHandler); + } + + void msgHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) + { + if (!m_enabled) { + m_originalMessageHandler(type, context, msg); + return; + } + + if (!context.category) { + m_originalMessageHandler(type, context, msg); + return; + } + + const QString category = QString::fromLocal8Bit(context.category); + + const QString timestamp = QDateTime::currentDateTime().toString("HH:mm:ss.zzz"); + + if (rowCount() >= 1000000) // limit log to 1000000 items + destroyItem(itemForIndex(index(0, 0))); + + appendItem(LogEntry{timestamp, messageTypeToString(type), category, msg}); + } + +private: + QtMessageHandler m_originalMessageHandler{nullptr}; + bool m_enabled{true}; +}; + class LoggingViewManagerWidget : public QDialog { public: - explicit LoggingViewManagerWidget(QWidget *parent); - ~LoggingViewManagerWidget() + ~LoggingViewManagerWidget() { LoggingEntryModel::instance().setEnabled(false); } + + static LoggingViewManagerWidget *instance() { - setEnabled(false); - delete m_manager; + static QPointer instance = new LoggingViewManagerWidget( + Core::ICore::dialogParent()); + return instance; } - static QColor colorForCategory(const QString &category); +protected: + void showEvent(QShowEvent *) override + { + if (!m_stopLog->isChecked()) + m_categoryModel->setUseOriginal(false); + + LoggingEntryModel::instance().setEnabled(!m_stopLog->isChecked()); + } + void hideEvent(QHideEvent *) override + { + m_categoryModel->setUseOriginal(true); + LoggingEntryModel::instance().setEnabled(false); + } + +private: + explicit LoggingViewManagerWidget(QWidget *parent); + private: void showLogViewContextMenu(const QPoint &pos) const; void showLogCategoryContextMenu(const QPoint &pos) const; void saveLoggingsToFile() const; - void saveEnabledCategoryPreset() const; - void loadAndUpdateFromPreset(); - LoggingViewManager *m_manager = nullptr; - void setCategoryColor(const QString &category, const QColor &color); - // should category model be owned directly by the manager? or is this duplication of - // categories in manager and widget beneficial? + QSortFilterProxyModel *m_sortFilterModel = nullptr; LoggingCategoryModel *m_categoryModel = nullptr; Utils::BaseTreeView *m_logView = nullptr; Utils::BaseTreeView *m_categoryView = nullptr; - Utils::ListModel *m_logModel = nullptr; QToolButton *m_timestamps = nullptr; QToolButton *m_messageTypes = nullptr; - static QHash m_categoryColor; + QToolButton *m_stopLog = nullptr; }; -QHash LoggingViewManagerWidget::m_categoryColor; - -static QVariant logEntryDataAccessor(const LogEntry &entry, int column, int role) -{ - if (column >= 0 && column <= 3 && (role == Qt::DisplayRole || role == Qt::ToolTipRole)) { - switch (column) { - case 0: return entry.timestamp; - case 1: return entry.category; - case 2: return entry.type; - case 3: { - if (role == Qt::ToolTipRole) - return entry.message; - return entry.message.left(1000); - } - } - } - if (role == Qt::TextAlignmentRole) - return Qt::AlignTop; - if (column == 1 && role == Qt::ForegroundRole) - return LoggingViewManagerWidget::colorForCategory(entry.category); - return {}; -} - LoggingViewManagerWidget::LoggingViewManagerWidget(QWidget *parent) : QDialog(parent) - , m_manager(new LoggingViewManager) { setWindowTitle(Tr::tr("Logging Category Viewer")); - setModal(false); - - auto mainLayout = new QVBoxLayout; - - auto buttonsLayout = new QHBoxLayout; - buttonsLayout->setSpacing(0); - // add further buttons.. auto save = new QToolButton; save->setIcon(Utils::Icons::SAVEFILE.icon()); save->setToolTip(Tr::tr("Save Log")); - buttonsLayout->addWidget(save); + auto clean = new QToolButton; clean->setIcon(Utils::Icons::CLEAN.icon()); clean->setToolTip(Tr::tr("Clear")); - buttonsLayout->addWidget(clean); - auto stop = new QToolButton; - stop->setIcon(Utils::Icons::STOP_SMALL.icon()); - stop->setToolTip(Tr::tr("Stop Logging")); - buttonsLayout->addWidget(stop); + + m_stopLog = new QToolButton; + m_stopLog->setIcon(Utils::Icons::STOP_SMALL.icon()); + m_stopLog->setToolTip(Tr::tr("Stop Logging")); + m_stopLog->setCheckable(true); + auto qtInternal = new QToolButton; qtInternal->setIcon(Core::Icons::QTLOGO.icon()); qtInternal->setToolTip(Tr::tr("Toggle Qt Internal Logging")); qtInternal->setCheckable(true); qtInternal->setChecked(false); - buttonsLayout->addWidget(qtInternal); + auto autoScroll = new QToolButton; autoScroll->setIcon(Utils::Icons::ARROW_DOWN.icon()); autoScroll->setToolTip(Tr::tr("Auto Scroll")); autoScroll->setCheckable(true); autoScroll->setChecked(true); - buttonsLayout->addWidget(autoScroll); + m_timestamps = new QToolButton; auto icon = Utils::Icon({{":/utils/images/stopwatch.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint); @@ -421,7 +626,7 @@ LoggingViewManagerWidget::LoggingViewManagerWidget(QWidget *parent) m_timestamps->setToolTip(Tr::tr("Timestamps")); m_timestamps->setCheckable(true); m_timestamps->setChecked(true); - buttonsLayout->addWidget(m_timestamps); + m_messageTypes = new QToolButton; icon = Utils::Icon({{":/utils/images/message.png", Utils::Theme::PanelTextColorMid}}, Utils::Icon::Tint); @@ -429,18 +634,9 @@ LoggingViewManagerWidget::LoggingViewManagerWidget(QWidget *parent) m_messageTypes->setToolTip(Tr::tr("Message Types")); m_messageTypes->setCheckable(true); m_messageTypes->setChecked(false); - buttonsLayout->addWidget(m_messageTypes); - buttonsLayout->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Expanding)); - mainLayout->addLayout(buttonsLayout); - - auto horizontal = new QHBoxLayout; m_logView = new Utils::BaseTreeView; - m_logModel = new Utils::ListModel; - m_logModel->setHeader({Tr::tr("Timestamp"), Tr::tr("Category"), Tr::tr("Type"), Tr::tr("Message")}); - m_logModel->setDataAccessor(&logEntryDataAccessor); - m_logView->setModel(m_logModel); - horizontal->addWidget(m_logView); + m_logView->setModel(&LoggingEntryModel::instance()); m_logView->setUniformRowHeights(true); m_logView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); m_logView->setFrameStyle(QFrame::Box); @@ -449,91 +645,123 @@ LoggingViewManagerWidget::LoggingViewManagerWidget(QWidget *parent) m_logView->setColumnHidden(2, true); m_logView->setContextMenuPolicy(Qt::CustomContextMenu); + m_categoryModel = new LoggingCategoryModel(this); + m_sortFilterModel = new QSortFilterProxyModel(m_categoryModel); + m_sortFilterModel->setSourceModel(m_categoryModel); + m_sortFilterModel->sort(LoggingCategoryModel::Column::Name); + m_sortFilterModel->setSortRole(Qt::DisplayRole); + m_sortFilterModel->setFilterKeyColumn(LoggingCategoryModel::Column::Name); + m_categoryView = new Utils::BaseTreeView; m_categoryView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - m_categoryView->setUniformRowHeights(true); m_categoryView->setFrameStyle(QFrame::Box); m_categoryView->setAttribute(Qt::WA_MacShowFocusRect, false); m_categoryView->setSelectionMode(QAbstractItemView::SingleSelection); m_categoryView->setContextMenuPolicy(Qt::CustomContextMenu); - m_categoryModel = new LoggingCategoryModel; - m_categoryModel->setFromManager(m_manager); - auto sortFilterModel = new QSortFilterProxyModel(this); - sortFilterModel->setSourceModel(m_categoryModel); - sortFilterModel->sort(0); - m_categoryView->setModel(sortFilterModel); - m_categoryView->setItemDelegateForColumn(1, new LoggingLevelDelegate(this)); - horizontal->addWidget(m_categoryView); - horizontal->setStretch(0, 5); - horizontal->setStretch(1, 3); + m_categoryView->setModel(m_sortFilterModel); + + for (int i = LoggingCategoryModel::Column::Color; i < LoggingCategoryModel::Column::Info; i++) + m_categoryView->resizeColumnToContents(i); + + QSplitter *splitter{nullptr}; + + using namespace Layouting; + // clang-format off + Column { + Row { + spacing(0), + save, + clean, + m_stopLog, + qtInternal, + autoScroll, + m_timestamps, + m_messageTypes, + st, + }, + Splitter { + bindTo(&splitter), + m_logView, + m_categoryView, + } + }.attachTo(this); + // clang-format on + + splitter->setOrientation(Qt::Horizontal); - mainLayout->addLayout(horizontal); - setLayout(mainLayout); resize(800, 300); - connect(m_manager, &LoggingViewManager::receivedLog, - this, [this](const QString ×tamp, - const QString &type, - const QString &category, - const QString &msg) { - if (m_logModel->rowCount() >= 1000000) // limit log to 1000000 items - m_logModel->destroyItem(m_logModel->itemForIndex(m_logModel->index(0, 0))); - m_logModel->appendItem(LogEntry{timestamp, type, category, msg}); - }, Qt::QueuedConnection); - connect(m_logModel, &QAbstractItemModel::rowsInserted, this, [this, autoScroll] { + connect( + &LoggingEntryModel::instance(), + &LoggingEntryModel::rowsInserted, + this, + [this, autoScroll] { if (autoScroll->isChecked()) m_logView->scrollToBottom(); - }, Qt::QueuedConnection); - connect(m_manager, &LoggingViewManager::foundNewCategory, - m_categoryModel, &LoggingCategoryModel::append, Qt::QueuedConnection); - connect(m_manager, &LoggingViewManager::updatedCategory, - m_categoryModel, &LoggingCategoryModel::update, Qt::QueuedConnection); - connect(m_categoryModel, &LoggingCategoryModel::categoryChanged, - m_manager, &LoggingViewManager::setCategoryEnabled); - connect(m_categoryModel, &LoggingCategoryModel::colorChanged, - this, &LoggingViewManagerWidget::setCategoryColor); - connect(m_categoryModel, &LoggingCategoryModel::logLevelChanged, - m_manager, &LoggingViewManager::setLogLevel); - connect(m_categoryView, &Utils::BaseTreeView::activated, - this, [this, sortFilterModel](const QModelIndex &index) { - const QModelIndex modelIndex = sortFilterModel->mapToSource(index); - const QVariant value = m_categoryModel->data(modelIndex, Qt::DecorationRole); - if (!value.isValid()) - return; - const QColor original = value.value(); - if (!original.isValid()) - return; - QColor changed = QColorDialog::getColor(original, this); - if (!changed.isValid()) - return; - if (original != changed) - m_categoryModel->setData(modelIndex, changed, Qt::DecorationRole); - }); - connect(save, &QToolButton::clicked, - this, &LoggingViewManagerWidget::saveLoggingsToFile); - connect(m_logView, &Utils::BaseTreeView::customContextMenuRequested, - this, &LoggingViewManagerWidget::showLogViewContextMenu); - connect(m_categoryView, &Utils::BaseTreeView::customContextMenuRequested, - this, &LoggingViewManagerWidget::showLogCategoryContextMenu); - connect(clean, &QToolButton::clicked, m_logModel, &Utils::ListModel::clear); - connect(stop, &QToolButton::clicked, this, [this, stop] { - if (m_manager->isEnabled()) { - m_manager->setEnabled(false); - stop->setIcon(Utils::Icons::RUN_SMALL.icon()); - stop->setToolTip(Tr::tr("Start Logging")); + }, + Qt::QueuedConnection); + + connect(m_categoryView, + &QAbstractItemView::activated, + m_sortFilterModel, + [this](const QModelIndex &index) { + const QVariant value = m_sortFilterModel->data(index, Qt::DecorationRole); + if (!value.isValid()) + return; + const QColor original = value.value(); + if (!original.isValid()) + return; + QColor changed = QColorDialog::getColor(original, this); + if (!changed.isValid()) + return; + if (original != changed) + m_sortFilterModel->setData(index, changed, Qt::DecorationRole); + }); + connect(save, &QToolButton::clicked, this, &LoggingViewManagerWidget::saveLoggingsToFile); + connect(m_logView, + &QAbstractItemView::customContextMenuRequested, + this, + &LoggingViewManagerWidget::showLogViewContextMenu); + connect(m_categoryView, + &QAbstractItemView::customContextMenuRequested, + this, + &LoggingViewManagerWidget::showLogCategoryContextMenu); + connect(clean, + &QToolButton::clicked, + &LoggingEntryModel::instance(), + &Utils::ListModel::clear); + connect(m_stopLog, &QToolButton::toggled, this, [this](bool checked) { + LoggingEntryModel::instance().setEnabled(!checked); + + if (checked) { + m_stopLog->setIcon(Utils::Icons::RUN_SMALL.icon()); + m_stopLog->setToolTip(Tr::tr("Start Logging")); + m_categoryModel->setUseOriginal(true); } else { - m_manager->setEnabled(true); - stop->setIcon(Utils::Icons::STOP_SMALL.icon()); - stop->setToolTip(Tr::tr("Stop Logging")); + m_stopLog->setIcon(Utils::Icons::STOP_SMALL.icon()); + m_stopLog->setToolTip(Tr::tr("Stop Logging")); + m_categoryModel->setUseOriginal(false); } }); - connect(qtInternal, &QToolButton::toggled, m_manager, &LoggingViewManager::setListQtInternal); - connect(m_timestamps, &QToolButton::toggled, this, [this](bool checked){ + + m_sortFilterModel->setFilterRegularExpression("^(?!qt\\.).+"); + + connect(qtInternal, &QToolButton::toggled, m_sortFilterModel, [this](bool checked) { + if (checked) { + m_sortFilterModel->setFilterRegularExpression(""); + } else { + m_sortFilterModel->setFilterRegularExpression("^(?!qt\\.).+"); + } + }); + + connect(m_timestamps, &QToolButton::toggled, this, [this](bool checked) { m_logView->setColumnHidden(0, !checked); }); - connect(m_messageTypes, &QToolButton::toggled, this, [this](bool checked){ + connect(m_messageTypes, &QToolButton::toggled, this, [this](bool checked) { m_logView->setColumnHidden(2, !checked); }); + + ICore::registerWindow(this, Context("Qtc.LogViewer")); } void LoggingViewManagerWidget::showLogViewContextMenu(const QPoint &pos) const @@ -548,104 +776,162 @@ void LoggingViewManagerWidget::showLogViewContextMenu(const QPoint &pos) const QString copied; const bool useTS = m_timestamps->isChecked(); const bool useLL = m_messageTypes->isChecked(); - for (int row = 0, end = m_logModel->rowCount(); row < end; ++row) { + for (int row = 0, end = LoggingEntryModel::instance().rowCount(); row < end; ++row) { if (selectionModel->isRowSelected(row, QModelIndex())) - copied.append(m_logModel->dataAt(row).outputLine(useTS, useLL)); + copied.append(LoggingEntryModel::instance().dataAt(row).outputLine(useTS, useLL)); } - QGuiApplication::clipboard()->setText(copied); + Utils::setClipboardAndSelection(copied); }); connect(copyAll, &QAction::triggered, &m, [this] { QString copied; const bool useTS = m_timestamps->isChecked(); const bool useLL = m_messageTypes->isChecked(); - for (int row = 0, end = m_logModel->rowCount(); row < end; ++row) - copied.append(m_logModel->dataAt(row).outputLine(useTS, useLL)); + for (int row = 0, end = LoggingEntryModel::instance().rowCount(); row < end; ++row) + copied.append(LoggingEntryModel::instance().dataAt(row).outputLine(useTS, useLL)); - QGuiApplication::clipboard()->setText(copied); + Utils::setClipboardAndSelection(copied); }); m.exec(m_logView->mapToGlobal(pos)); } void LoggingViewManagerWidget::showLogCategoryContextMenu(const QPoint &pos) const { + QModelIndex idx = m_categoryView->indexAt(pos); + QMenu m; + auto uncheckAll = new QAction(Tr::tr("Uncheck All"), &m); + + int column = 0; + + if (idx.isValid()) { + column = idx.column(); + if (column >= LoggingCategoryModel::Column::Debug + && column <= LoggingCategoryModel::Column::Info) { + bool isChecked = idx.data(Qt::CheckStateRole).toBool(); + + QString text = isChecked ? Tr::tr("Uncheck All %1") : Tr::tr("Check All %1"); + + uncheckAll->setText(text.arg(messageTypeToString( + static_cast(column - LoggingCategoryModel::Column::Debug)))); + + connect(uncheckAll, &QAction::triggered, m_sortFilterModel, [this, idx, isChecked] { + for (int i = 0; i < m_sortFilterModel->rowCount(); ++i) { + m_sortFilterModel->setData(m_sortFilterModel->index(i, idx.column()), + !isChecked, + Qt::CheckStateRole); + } + }); + } else { + connect(uncheckAll, &QAction::triggered, m_sortFilterModel, [this] { + for (int i = 0; i < m_sortFilterModel->rowCount(); ++i) { + for (int c = LoggingCategoryModel::Column::Debug; + c <= LoggingCategoryModel::Column::Info; + ++c) { + m_sortFilterModel->setData(m_sortFilterModel->index(i, c), + false, + Qt::CheckStateRole); + } + } + }); + } + } + // minimal load/save - plugins could later provide presets on their own? auto savePreset = new QAction(Tr::tr("Save Enabled as Preset..."), &m); m.addAction(savePreset); auto loadPreset = new QAction(Tr::tr("Update from Preset..."), &m); m.addAction(loadPreset); - auto uncheckAll = new QAction(Tr::tr("Uncheck All"), &m); m.addAction(uncheckAll); - connect(savePreset, &QAction::triggered, - this, &LoggingViewManagerWidget::saveEnabledCategoryPreset); - connect(loadPreset, &QAction::triggered, - this, &LoggingViewManagerWidget::loadAndUpdateFromPreset); - connect(uncheckAll, &QAction::triggered, - m_categoryModel, &LoggingCategoryModel::disableAll); + connect(savePreset, + &QAction::triggered, + m_categoryModel, + &LoggingCategoryModel::saveEnabledCategoryPreset); + connect(loadPreset, + &QAction::triggered, + m_categoryModel, + &LoggingCategoryModel::loadAndUpdateFromPreset); m.exec(m_categoryView->mapToGlobal(pos)); } void LoggingViewManagerWidget::saveLoggingsToFile() const { - // should we just let it continue without temporarily disabling? - const bool enabled = m_manager->isEnabled(); - const QScopeGuard cleanup([this, enabled] { m_manager->setEnabled(enabled); }); - if (enabled) - m_manager->setEnabled(false); const Utils::FilePath fp = Utils::FileUtils::getSaveFilePath(ICore::dialogParent(), - Tr::tr("Save Logs As")); + Tr::tr("Save Logs As"), + {}, + "*.log"); if (fp.isEmpty()) return; + const bool useTS = m_timestamps->isChecked(); const bool useLL = m_messageTypes->isChecked(); QFile file(fp.path()); if (file.open(QIODevice::WriteOnly)) { - for (int row = 0, end = m_logModel->rowCount(); row < end; ++row) { - qint64 res = file.write( m_logModel->dataAt(row).outputLine(useTS, useLL).toUtf8()); + for (int row = 0, end = LoggingEntryModel::instance().rowCount(); row < end; ++row) { + qint64 res = file.write( + LoggingEntryModel::instance().dataAt(row).outputLine(useTS, useLL).toUtf8()); if (res == -1) { - QMessageBox::critical( - ICore::dialogParent(), Tr::tr("Error"), - Tr::tr("Failed to write logs to \"%1\".").arg(fp.toUserOutput())); + QMessageBox::critical(ICore::dialogParent(), + Tr::tr("Error"), + Tr::tr("Failed to write logs to \"%1\".") + .arg(fp.toUserOutput())); break; } } file.close(); } else { - QMessageBox::critical( - ICore::dialogParent(), Tr::tr("Error"), - Tr::tr("Failed to open file \"%1\" for writing logs.").arg(fp.toUserOutput())); + QMessageBox::critical(ICore::dialogParent(), + Tr::tr("Error"), + Tr::tr("Failed to open file \"%1\" for writing logs.") + .arg(fp.toUserOutput())); } } -void LoggingViewManagerWidget::saveEnabledCategoryPreset() const +void LoggingCategoryModel::saveEnabledCategoryPreset() const { Utils::FilePath fp = Utils::FileUtils::getSaveFilePath(ICore::dialogParent(), - Tr::tr("Save Enabled Categories As...")); + Tr::tr("Save Enabled Categories As..."), + {}, + "*.json"); if (fp.isEmpty()) return; - const QList enabled = m_categoryModel->enabledCategories(); - // write them to file + + auto minLevel = [](const LoggingCategoryEntry &logCategory) { + for (int i = QtDebugMsg; i <= QtInfoMsg; i++) { + if (logCategory.isEnabled(static_cast(i))) + return i; + } + return QtInfoMsg + 1; + }; + QJsonArray array; - for (const LoggingCategoryItem &item : enabled) { + + for (auto item : m_categories) { QJsonObject itemObj; - itemObj.insert("name", item.name); + itemObj.insert("name", item.name()); QJsonObject entryObj; - entryObj.insert("level", item.entry.level); - if (item.entry.color.isValid()) - entryObj.insert("color", item.entry.color.name(QColor::HexArgb)); + entryObj.insert("level", minLevel(item)); + if (item.color().isValid()) + entryObj.insert("color", item.color().name(QColor::HexArgb)); + + QVariantMap levels = {{"Debug", item.isDebugEnabled()}, + {"Warning", item.isWarningEnabled()}, + {"Critical", item.isCriticalEnabled()}, + {"Info", item.isInfoEnabled()}}; + entryObj.insert("levels", QJsonValue::fromVariant(levels)); + itemObj.insert("entry", entryObj); array.append(itemObj); } QJsonDocument doc(array); if (!fp.writeFileContents(doc.toJson(QJsonDocument::Compact))) - QMessageBox::critical( - ICore::dialogParent(), Tr::tr("Error"), - Tr::tr("Failed to write preset file \"%1\".").arg(fp.toUserOutput())); + QMessageBox::critical(ICore::dialogParent(), + Tr::tr("Error"), + Tr::tr("Failed to write preset file \"%1\".").arg(fp.toUserOutput())); } -void LoggingViewManagerWidget::loadAndUpdateFromPreset() +void LoggingCategoryModel::loadAndUpdateFromPreset() { Utils::FilePath fp = Utils::FileUtils::getOpenFilePath(ICore::dialogParent(), Tr::tr("Load Enabled Categories From")); @@ -663,13 +949,15 @@ void LoggingViewManagerWidget::loadAndUpdateFromPreset() QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(*contents, &error); if (error.error != QJsonParseError::NoError) { - QMessageBox::critical(ICore::dialogParent(), Tr::tr("Error"), - Tr::tr("Failed to read preset file \"%1\": %2").arg(fp.toUserOutput()) - .arg(error.errorString())); + QMessageBox::critical(ICore::dialogParent(), + Tr::tr("Error"), + Tr::tr("Failed to read preset file \"%1\": %2") + .arg(fp.toUserOutput()) + .arg(error.errorString())); return; } bool formatError = false; - QList presetItems; + QList presetItems; if (doc.isArray()) { const QJsonArray array = doc.array(); for (const QJsonValue &value : array) { @@ -678,57 +966,81 @@ void LoggingViewManagerWidget::loadAndUpdateFromPreset() break; } const QJsonObject itemObj = value.toObject(); - bool ok = true; - LoggingCategoryItem item = LoggingCategoryItem::fromJson(itemObj, &ok); - if (!ok) { + Utils::expected_str item = SavedEntry::fromJson(itemObj); + if (!item) { formatError = true; break; } - presetItems.append(item); + presetItems.append(*item); } } else { formatError = true; } if (formatError) { - QMessageBox::critical(ICore::dialogParent(), Tr::tr("Error"), + QMessageBox::critical(ICore::dialogParent(), + Tr::tr("Error"), Tr::tr("Unexpected preset file format.")); } - for (const LoggingCategoryItem &item : presetItems) - m_manager->appendOrUpdate(item.name, item.entry); + + int idx = 0; + + for (auto it = presetItems.begin(); it != presetItems.end(); ++it, ++idx) { + QList::iterator itExisting + = std::find_if(m_categories.begin(), + m_categories.end(), + [e = *it](const LoggingCategoryEntry &cat) { + return cat.name() == e.name; + }); + + if (it->color.isValid()) + setCategoryColor(it->name, it->color); + + if (itExisting != m_categories.end()) { + itExisting->setSaved(*it); + emit dataChanged(createIndex(idx, Column::Color), createIndex(idx, Column::Info)); + } else { + LoggingCategoryEntry newEntry(*it); + append(newEntry); + } + } } -QColor LoggingViewManagerWidget::colorForCategory(const QString &category) +QColor colorForCategory(const QString &category) { - auto entry = m_categoryColor.find(category); - if (entry == m_categoryColor.end()) + auto entry = s_categoryColor.find(category); + if (entry == s_categoryColor.end()) return Utils::creatorTheme()->palette().text().color(); return entry.value(); } -void LoggingViewManagerWidget::setCategoryColor(const QString &category, const QColor &color) +void setCategoryColor(const QString &category, const QColor &color) { const QColor baseColor = Utils::creatorTheme()->palette().text().color(); if (color != baseColor) - m_categoryColor.insert(category, color); + s_categoryColor.insert(category, color); else - m_categoryColor.remove(category); + s_categoryColor.remove(category); } void LoggingViewer::showLoggingView() { - ActionManager::command(Constants::LOGGER)->action()->setEnabled(false); - auto widget = new LoggingViewManagerWidget(ICore::dialogParent()); - QObject::connect(widget, &QDialog::finished, widget, [widget] { - ActionManager::command(Constants::LOGGER)->action()->setEnabled(true); - // explicitly disable manager again - widget->deleteLater(); - }); - ICore::registerWindow(widget, Context("Qtc.LogViewer")); - widget->show(); + LoggingViewManagerWidget *staticLogWidget = LoggingViewManagerWidget::instance(); + QTC_ASSERT(staticLogWidget, return); + + staticLogWidget->show(); + staticLogWidget->raise(); + staticLogWidget->activateWindow(); } -} // namespace Internal -} // namespace Core +void LoggingViewer::hideLoggingView() +{ + LoggingViewManagerWidget *staticLogWidget = LoggingViewManagerWidget::instance(); + QTC_ASSERT(staticLogWidget, return); + staticLogWidget->close(); + delete staticLogWidget; +} + +} // namespace Core::Internal #include "loggingviewer.moc" diff --git a/src/plugins/coreplugin/loggingviewer.h b/src/plugins/coreplugin/loggingviewer.h index cb8bf031ca4..4cde2a6501f 100644 --- a/src/plugins/coreplugin/loggingviewer.h +++ b/src/plugins/coreplugin/loggingviewer.h @@ -3,14 +3,13 @@ #pragma once -namespace Core { -namespace Internal { +namespace Core::Internal { class LoggingViewer { public: static void showLoggingView(); + static void hideLoggingView(); }; -} // Internal -} // Core +} // namespace Core::Internal From 0e77cdcc2e45f484cd85fb06acc3e8439d66ac4d Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 17 Oct 2023 17:00:22 +0200 Subject: [PATCH 15/86] CMake: save a few cycles Cheaper checks first. Change-Id: I7487862abf409ef0a885d6ac9511066a6f814039 Reviewed-by: Reviewed-by: Cristian Adam --- .../cmakeprojectmanager/fileapidataextractor.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index ed5e64b3874..13a240d4e85 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -358,13 +358,13 @@ static QStringList splitFragments(const QStringList &fragments) static bool isPchFile(const FilePath &buildDirectory, const FilePath &path) { - return path.isChildOf(buildDirectory) && path.fileName().startsWith("cmake_pch"); + return path.fileName().startsWith("cmake_pch") && path.isChildOf(buildDirectory); } static bool isUnityFile(const FilePath &buildDirectory, const FilePath &path) { - return path.isChildOf(buildDirectory) && path.parentDir().fileName() == "Unity" - && path.fileName().startsWith("unity_"); + return path.fileName().startsWith("unity_") && path.isChildOf(buildDirectory) + && path.parentDir().fileName() == "Unity"; } static RawProjectParts generateRawProjectParts(const QFuture &cancelFuture, @@ -478,10 +478,9 @@ static RawProjectParts generateRawProjectParts(const QFuture &cancelFuture // Set project files except pch / unity files rpp.setFiles(Utils::filtered(sources, [buildDirectory](const QString &path) { - return !isPchFile(buildDirectory, - FilePath::fromString(path)) - && !isUnityFile(buildDirectory, - FilePath::fromString(path)); + const FilePath filePath = FilePath::fromString(path); + return !isPchFile(buildDirectory, filePath) + && !isUnityFile(buildDirectory, filePath); }), {}, [headerMimeType](const QString &path) { From 5336fd83a004c1fe5265b9f9ba87320c031d2040 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 16 Oct 2023 20:53:46 +0200 Subject: [PATCH 16/86] QmlPreview: Tell users how to preview single files In order to preview a specific (QML) file, a QML Preview process has to have been started, before. The "Preview File" context menu action was therefore disabled until at least one QML Preview was running. This precondition is neither documented nor evident to users. This change removes the disabling/enabling of the context menu action and shows an explanatory message box for the case that no running QML Preview is available. Fixes: QTCREATORBUG-29300 Change-Id: I643c57cab15ef4893a8efa6ac8839a3c00e956fb Reviewed-by: hjk --- src/plugins/qmlpreview/qmlpreviewplugin.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.cpp b/src/plugins/qmlpreview/qmlpreviewplugin.cpp index 9d05d0ee398..2722ecb016e 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.cpp +++ b/src/plugins/qmlpreview/qmlpreviewplugin.cpp @@ -44,6 +44,7 @@ #include #include +#include #include #include @@ -174,11 +175,6 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent) menu = Core::ActionManager::actionContainer(Constants::M_FILECONTEXT); action = new QAction(Tr::tr("Preview File"), this); - action->setEnabled(false); - connect(q, &QmlPreviewPlugin::runningPreviewsChanged, - action, [action](const QmlPreviewRunControlList &previews) { - action->setEnabled(!previews.isEmpty()); - }); connect(action, &QAction::triggered, q, &QmlPreviewPlugin::previewCurrentFile); menu->addAction( Core::ActionManager::registerAction(action, "QmlPreview.PreviewFile", Core::Context(Constants::C_PROJECT_TREE)), @@ -336,6 +332,11 @@ void QmlPreviewPlugin::previewCurrentFile() || currentNode->asFileNode()->fileType() != FileType::QML) return; + if (runningPreviews().isEmpty()) + QMessageBox::warning(Core::ICore::dialogParent(), Tr::tr("QML Preview not running"), + Tr::tr("Please start the QML Preview for the project before selecting " + "a specific file for preview.")); + const QString file = currentNode->filePath().toString(); if (file != d->m_previewedFile) setPreviewedFile(file); From e6ecfa051751dc6b9975c487afe49d062930c3e5 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 16 Oct 2023 10:43:39 +0200 Subject: [PATCH 17/86] Tr: Move some line endings at beginning and end out of tr Change-Id: Ibb0aba4d6e58bfe4684a818a894876c1f8f7df15 Reviewed-by: Reviewed-by: Jarek Kobus --- share/qtcreator/translations/qtcreator_da.ts | 28 ++----- share/qtcreator/translations/qtcreator_de.ts | 74 ++++++------------- share/qtcreator/translations/qtcreator_fr.ts | 70 +++++------------- share/qtcreator/translations/qtcreator_hr.ts | 20 ++--- share/qtcreator/translations/qtcreator_ru.ts | 34 +++------ .../qtcreator/translations/qtcreator_zh_CN.ts | 48 ++++-------- src/plugins/android/androidsdkmanager.cpp | 8 +- .../android/androidsdkmanagerwidget.cpp | 9 ++- src/plugins/docker/dockerdevice.cpp | 2 +- src/plugins/remotelinux/linuxdevicetester.cpp | 37 ++++++---- 10 files changed, 110 insertions(+), 220 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_da.ts b/share/qtcreator/translations/qtcreator_da.ts index d30843de390..2d6ee616342 100644 --- a/share/qtcreator/translations/qtcreator_da.ts +++ b/share/qtcreator/translations/qtcreator_da.ts @@ -751,12 +751,8 @@ Vil du afinstallere den eksisterende pakke? Handlingen kræver indgriben fra brugeren. Brug kommandolinjeværktøjet "sdkmanager". - License command failed. - - - Licens-kommando mislykkedes. - - + License command failed. + Licens-kommando mislykkedes. Android SDK Manager @@ -807,16 +803,12 @@ Vil du afinstallere den eksisterende pakke? Vil du acceptere Android SDK-licensen? - Checking pending licenses... - - Tjekker afventende licenser... - + Checking pending licenses... + Tjekker afventende licenser... - -SDK Manager is busy. - -SDK manager er optaget. + SDK Manager is busy. + SDK manager er optaget. Android SDK Changes @@ -1295,12 +1287,8 @@ Installer en SDK af mindst API version %1. Mislykkedes. - Done - - - Færdig - - + Done + Færdig Installing diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 6ad0490d986..77be1e4ada2 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -10396,22 +10396,16 @@ Installieren Sie diese manuell, nachdem der aktuelle Vorgang abgeschlossen ist. - Checking pending licenses... - - Prüfe auf ausstehende Lizenzen... - + Checking pending licenses... + Prüfe auf ausstehende Lizenzen... - The installation of Android SDK packages may fail if the respective licenses are not accepted. - - Die Installation von Android-SDK-Paketen kann fehlschlagen, wenn die entsprechenden Lizenzen nicht akzeptiert werden. - + The installation of Android SDK packages may fail if the respective licenses are not accepted. + Die Installation von Android-SDK-Paketen kann fehlschlagen, wenn die entsprechenden Lizenzen nicht akzeptiert werden. - -SDK Manager is busy. - -SDK-Manager arbeitet. + SDK Manager is busy. + SDK-Manager arbeitet. Android SDK Changes @@ -10503,12 +10497,8 @@ Breche ausstehende Operationen ab... - License command failed. - - - Lizenzkommando fehlgeschlagen. - - + License command failed. + Lizenzkommando fehlgeschlagen. Updating installed packages. @@ -10519,12 +10509,8 @@ Breche ausstehende Operationen ab... Fehlgeschlagen. - Done - - - Fertig - - + Done + Fertig Installing @@ -27607,10 +27593,8 @@ Versuchen Sie, das Projekt neu zu erstellen. Lade... - Running "%1" - - Führe "%1" aus - + Running "%1" + Führe "%1" aus Unexpected result: %1 @@ -47127,22 +47111,16 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Überprüfe, ob "%1" funktioniert... - Failed to start "%1": %2 - - "%1" konnte nicht gestartet werden: %2 - + Failed to start "%1": %2 + "%1" konnte nicht gestartet werden: %2 - "%1" crashed. - - "%1" ist abgestürzt. - + "%1" crashed. + "%1" ist abgestürzt. - "%1" failed with exit code %2: %3 - - "%1" ist mit Rückgabewert %2 fehlgeschlagen: %3 - + "%1" failed with exit code %2: %3 + "%1" ist mit Rückgabewert %2 fehlgeschlagen: %3 "%1" is functional. @@ -47151,10 +47129,8 @@ Zusätzlich wird die Verbindung zum Gerät getestet. - "%1" will be used for deployment, because "%2" and "%3" are not available. - - "%1" wird für das Deployment benutzt, da "%2" und "%3" nicht verfügbar sind. - + "%1" will be used for deployment, because "%2" and "%3" are not available. + "%1" wird für das Deployment benutzt, da "%2" und "%3" nicht verfügbar sind. Checking if required commands are available... @@ -47177,10 +47153,8 @@ Zusätzlich wird die Verbindung zum Gerät getestet. %1 nicht gefunden. - Deployment to this device will not work out of the box. - - Deployment auf dieses Gerät wird nicht von Anfang an funktionieren. - + Deployment to this device will not work out of the box. + Deployment auf dieses Gerät wird nicht von Anfang an funktionieren. Checking if specified ports are available... @@ -47446,10 +47420,6 @@ Der Kontrollprozess konnte nicht gestartet werden. "%1" failed to start: %2 "%1" konnte nicht gestartet werden: %2 - - "%1" crashed. - "%1" ist abgestürzt. - "sftp" binary "%1" does not exist. Ausführbare "sftp"-Datei "%1" existiert nicht. diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index de55e61972a..f587f274099 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -9058,22 +9058,16 @@ Installez-les manuellement après que l'opération en cours soit finie. L'installation du SDK Android ne contient pas certains paquets nécessaires. Souhaitez-vous installer les paquets manquants ? - Checking pending licenses... - - Vérification des licences en cours… - + Checking pending licenses... + Vérification des licences en cours… - The installation of Android SDK packages may fail if the respective licenses are not accepted. - - L'installation des paquets du SDK Android peut échouer si les licences respectives ne sont pas acceptées. - + The installation of Android SDK packages may fail if the respective licenses are not accepted. + L'installation des paquets du SDK Android peut échouer si les licences respectives ne sont pas acceptées. - -SDK Manager is busy. - -Le gestionnaire de SDK est occupé. + SDK Manager is busy. + Le gestionnaire de SDK est occupé. %n Android SDK packages shall be updated. @@ -10672,12 +10666,8 @@ Les fichiers du répertoire source du paquet Android sont copiés dans le réper Échec. - Done - - - Fini - - + Done + Fini Installing @@ -10700,12 +10690,8 @@ Les fichiers du répertoire source du paquet Android sont copiés dans le réper - License command failed. - - - Échec de la commande de licence. - - + License command failed. + Échec de la commande de licence. Revision @@ -27352,10 +27338,8 @@ La recompilation du projet peut aider. Chargement … - Running "%1" - - Exécution de « %1 » - + Running "%1" + Exécution de « %1 » Unexpected result: %1 @@ -46947,34 +46931,20 @@ Le processus de contrôle n'a pas pu démarrer. - Failed to start "%1": %2 - - Échec du démarrage de « %1 » : %2 - + Failed to start "%1": %2 + Échec du démarrage de « %1 » : %2 - "%1" crashed. - - « %1 » a planté. - + "%1" failed with exit code %2: %3 + « %1 » a échoué avec le code de sortie %2 : %3 - "%1" failed with exit code %2: %3 - - « %1 » a échoué avec le code de sortie %2 : %3 - + "%1" will be used for deployment, because "%2" and "%3" are not available. + « %1 » sera utilisé pour le déploiement, car « %2 » et « %3 » ne sont pas disponibles. - "%1" will be used for deployment, because "%2" and "%3" are not available. - - « %1 » sera utilisé pour le déploiement, car « %2 » et « %3 » ne sont pas disponibles. - - - - Deployment to this device will not work out of the box. - - Le déploiement vers ce périphérique ne fonctionnera pas directement. - + Deployment to this device will not work out of the box. + Le déploiement vers ce périphérique ne fonctionnera pas directement. %1... diff --git a/share/qtcreator/translations/qtcreator_hr.ts b/share/qtcreator/translations/qtcreator_hr.ts index 35294aedfff..c408f28563a 100644 --- a/share/qtcreator/translations/qtcreator_hr.ts +++ b/share/qtcreator/translations/qtcreator_hr.ts @@ -874,16 +874,12 @@ Želiš li prihvatiti licencu za Android SDK? - Checking pending licenses... - - Provjera neriješenih licenca … - + Checking pending licenses... + Provjera neriješenih licenca … - -SDK Manager is busy. - -Upravljač za SDK je zauzet. + SDK Manager is busy. + Upravljač za SDK je zauzet. Android SDK Changes @@ -13630,9 +13626,7 @@ Do you want to uninstall the existing package? - License command failed. - - + License command failed. @@ -13644,9 +13638,7 @@ Do you want to uninstall the existing package? Neuspjelo. - Done - - + Done diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index 9dc5e7249e0..23561e76c50 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -1398,12 +1398,8 @@ Do you want to uninstall the existing package? Операция требует вмешательства пользователя. Используйте «sdkmanager» в командной строке. - License command failed. - - - Команда License завершилась с ошибкой. - - + License command failed. + Команда License завершилась с ошибкой. Android SDK Manager @@ -1446,16 +1442,12 @@ Do you want to uninstall the existing package? Принимаете условия лицензии Android SDK? - Checking pending licenses... - - Проверка ожидающих лицензий... - + Checking pending licenses... + Проверка ожидающих лицензий... - -SDK Manager is busy. - -SDK Manager занят. + SDK Manager is busy. + SDK Manager занят. Android SDK Changes @@ -2081,12 +2073,8 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Ошибка. - Done - - - Готово - - + Done + Готово Installing @@ -40173,10 +40161,8 @@ If you do not have a private key yet, you can also create one here. - Deployment to this device will not work out of the box. - - Развёртывание на это устройство не работает «из коробки». - + Deployment to this device will not work out of the box. + Развёртывание на это устройство не работает «из коробки». rsync is functional. diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index cb89a89d43d..335d2bbc377 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -1460,12 +1460,8 @@ This cannot be undone. 失败. - Done - - - 完成 - - + Done + 完成 Installing @@ -1488,12 +1484,8 @@ This cannot be undone. 安卓 SDK 管理器 - License command failed. - - - 许可命令失败。 - - + License command failed. + 许可命令失败。 Android SDK Manager @@ -1580,21 +1572,16 @@ Install them manually after the current operation is done. 缺失安卓 SDK 安装所必要的包。你想安装这些缺失包吗? - Checking pending licenses... - - 正在检查待处理的许可证... - + Checking pending licenses... + 正在检查待处理的许可证... - The installation of Android SDK packages may fail if the respective licenses are not accepted. - + The installation of Android SDK packages may fail if the respective licenses are not accepted. 如果不接受相应的许可证,安卓 SDK 包安装可能会失败。 - -SDK Manager is busy. - -SDK 管理器繁忙。 + SDK Manager is busy. + SDK 管理器繁忙。 %n Android SDK packages shall be updated. @@ -18093,8 +18080,7 @@ Rebuilding the project might help. - Running "%1" - + Running "%1" @@ -39240,18 +39226,11 @@ Control process failed to start. - Failed to start "%1": %2 - + Failed to start "%1": %2 - "%1" crashed. - - - - - "%1" failed with exit code %2: %3 - + "%1" failed with exit code %2: %3 @@ -39265,8 +39244,7 @@ Control process failed to start. - Deployment to this device will not work out of the box. - + Deployment to this device will not work out of the box. diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index ca0be7770c4..b0da90123e8 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -438,7 +438,7 @@ void AndroidSdkManagerPrivate::updateInstalled(SdkCmdPromise &promise) if (result.stdError.isEmpty() && !result.success) result.stdError = Tr::tr("Failed."); - result.stdOutput = Tr::tr("Done\n\n"); + result.stdOutput = Tr::tr("Done") + "\n\n"; promise.addResult(result); promise.setProgressValue(100); } @@ -468,8 +468,8 @@ void AndroidSdkManagerPrivate::update(SdkCmdPromise &fi, const QStringList &inst currentProgress += progressQuota; fi.setProgressValue(currentProgress); if (result.stdError.isEmpty() && !result.success) - result.stdError = Tr::tr("AndroidSdkManager", "Failed"); - result.stdOutput = Tr::tr("AndroidSdkManager", "Done\n\n"); + result.stdError = Tr::tr("Failed"); + result.stdOutput = Tr::tr("Done") + "\n\n"; fi.addResult(result); return fi.isCanceled(); }; @@ -569,7 +569,7 @@ void AndroidSdkManagerPrivate::getPendingLicense(SdkCmdPromise &fi) m_licenseTextCache.clear(); result.success = licenseCommand.exitStatus() == QProcess::NormalExit; if (!result.success) - result.stdError = Tr::tr("License command failed.\n\n"); + result.stdError = Tr::tr("License command failed.") + "\n\n"; fi.addResult(result); fi.setProgressValue(100); } diff --git a/src/plugins/android/androidsdkmanagerwidget.cpp b/src/plugins/android/androidsdkmanagerwidget.cpp index d228cd46024..cd3bbb8532b 100644 --- a/src/plugins/android/androidsdkmanagerwidget.cpp +++ b/src/plugins/android/androidsdkmanagerwidget.cpp @@ -290,9 +290,10 @@ void AndroidSdkManagerWidget::installEssentials() void AndroidSdkManagerWidget::beginLicenseCheck() { - m_formatter->appendMessage(Tr::tr("Checking pending licenses...\n"), NormalMessageFormat); + m_formatter->appendMessage(Tr::tr("Checking pending licenses...") + "\n", NormalMessageFormat); m_formatter->appendMessage(Tr::tr("The installation of Android SDK packages may fail if the " - "respective licenses are not accepted.\n"), + "respective licenses are not accepted.") + + "\n", LogMessageFormat); addPackageFuture(m_sdkManager->checkPendingLicenses()); } @@ -302,7 +303,7 @@ void AndroidSdkManagerWidget::onApplyButton(const QString &extraMessage) QTC_ASSERT(m_currentView == PackageListing, return); if (m_sdkManager->isBusy()) { - m_formatter->appendMessage(Tr::tr("\nSDK Manager is busy."), StdErrFormat); + m_formatter->appendMessage("\n" + Tr::tr("SDK Manager is busy."), StdErrFormat); return; } @@ -356,7 +357,7 @@ void AndroidSdkManagerWidget::onApplyButton(const QString &extraMessage) void AndroidSdkManagerWidget::onUpdatePackages() { if (m_sdkManager->isBusy()) { - m_formatter->appendMessage(Tr::tr("\nSDK Manager is busy."), StdErrFormat); + m_formatter->appendMessage("\n" + Tr::tr("SDK Manager is busy."), StdErrFormat); return; } switchView(Operations); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 17a2e64165c..a13e2f19513 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1201,7 +1201,7 @@ public: CommandLine cmd{settings().dockerBinaryPath(), {"images", "--format", "{{.ID}}\\t{{.Repository}}\\t{{.Tag}}\\t{{.Size}}"}}; - m_log->append(Tr::tr("Running \"%1\"\n").arg(cmd.toUserOutput())); + m_log->append(Tr::tr("Running \"%1\"").arg(cmd.toUserOutput()) + "\n"); m_process = new Process(this); m_process->setCommand(cmd); diff --git a/src/plugins/remotelinux/linuxdevicetester.cpp b/src/plugins/remotelinux/linuxdevicetester.cpp index 9eb44b8f00c..e908541aa57 100644 --- a/src/plugins/remotelinux/linuxdevicetester.cpp +++ b/src/plugins/remotelinux/linuxdevicetester.cpp @@ -188,12 +188,16 @@ GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod metho const ProcessResultData resultData = transfer.resultData(); QString error; if (resultData.m_error == QProcess::FailedToStart) { - error = Tr::tr("Failed to start \"%1\": %2\n").arg(methodName, resultData.m_errorString); + error = Tr::tr("Failed to start \"%1\": %2").arg(methodName, resultData.m_errorString) + + "\n"; } else if (resultData.m_exitStatus == QProcess::CrashExit) { - error = Tr::tr("\"%1\" crashed.\n").arg(methodName); + error = Tr::tr("\"%1\" crashed.").arg(methodName) + "\n"; } else if (resultData.m_exitCode != 0) { - error = Tr::tr("\"%1\" failed with exit code %2: %3\n") - .arg(methodName).arg(resultData.m_exitCode).arg(resultData.m_errorString); + error = Tr::tr("\"%1\" failed with exit code %2: %3") + .arg(methodName) + .arg(resultData.m_exitCode) + .arg(resultData.m_errorString) + + "\n"; } emit q->errorMessage(error); if (method == FileTransferMethod::Rsync) @@ -209,8 +213,9 @@ GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod metho const QString sftp = FileTransfer::transferMethodName(FileTransferMethod::Sftp); const QString rsync = FileTransfer::transferMethodName(FileTransferMethod::Rsync); emit q->progressMessage(Tr::tr("\"%1\" will be used for deployment, because \"%2\" " - "and \"%3\" are not available.\n") - .arg(generic, sftp, rsync)); + "and \"%3\" are not available.") + .arg(generic, sftp, rsync) + + "\n"); } }; return FileTransferTestTask(setup, done, error); @@ -219,16 +224,16 @@ GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod metho GroupItem GenericLinuxDeviceTesterPrivate::transferTasks() const { TreeStorage storage; - return Group { - continueOnDone, - Tasking::Storage(storage), - transferTask(FileTransferMethod::GenericCopy, storage), - transferTask(FileTransferMethod::Sftp, storage), - transferTask(FileTransferMethod::Rsync, storage), - onGroupError([this] { emit q->errorMessage(Tr::tr("Deployment to this device will not " - "work out of the box.\n")); - }) - }; + return Group{continueOnDone, + Tasking::Storage(storage), + transferTask(FileTransferMethod::GenericCopy, storage), + transferTask(FileTransferMethod::Sftp, storage), + transferTask(FileTransferMethod::Rsync, storage), + onGroupError([this] { + emit q->errorMessage(Tr::tr("Deployment to this device will not " + "work out of the box.") + + "\n"); + })}; } GroupItem GenericLinuxDeviceTesterPrivate::commandTask(const QString &commandName) const From 22c1d34e645c53840413b289478f5ef55baae17c Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 18 Oct 2023 10:54:18 +0200 Subject: [PATCH 18/86] Copilot: Use normal checkboxes in settings We usually do not use the "Label [ ]" style, at the very least it looks different to other places in the settings. And without a ":" ("Label: [ ]") it also looks different to other lines in the same page. Just use normal checkboxes like we do elsewhere. Change-Id: I7f7d7aab399bef50dacb1efd83a5da460237e044 Reviewed-by: Marcus Tillmanns --- src/plugins/copilot/copilotsettings.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/plugins/copilot/copilotsettings.cpp b/src/plugins/copilot/copilotsettings.cpp index 4ef4e2b2a9b..586fd8528b9 100644 --- a/src/plugins/copilot/copilotsettings.cpp +++ b/src/plugins/copilot/copilotsettings.cpp @@ -93,14 +93,12 @@ CopilotSettings::CopilotSettings() autoComplete.setDefaultValue(true); autoComplete.setToolTip(Tr::tr("Automatically request suggestions for the current text cursor " "position after changes to the document.")); - autoComplete.setLabelPlacement(BoolAspect::LabelPlacement::InExtraLabel); useProxy.setDisplayName(Tr::tr("Use Proxy")); useProxy.setSettingsKey("Copilot.UseProxy"); useProxy.setLabelText(Tr::tr("Use proxy")); useProxy.setDefaultValue(false); useProxy.setToolTip(Tr::tr("Use a proxy to connect to the Copilot servers.")); - useProxy.setLabelPlacement(BoolAspect::LabelPlacement::InExtraLabel); proxyHost.setDisplayName(Tr::tr("Proxy Host")); proxyHost.setDisplayStyle(StringAspect::LineEditDisplay); @@ -131,7 +129,6 @@ CopilotSettings::CopilotSettings() saveProxyPassword.setDefaultValue(false); saveProxyPassword.setToolTip( Tr::tr("Save the password to access the proxy server. The password is stored insecurely.")); - saveProxyPassword.setLabelPlacement(BoolAspect::LabelPlacement::InExtraLabel); proxyPassword.setDisplayName(Tr::tr("Proxy Password")); proxyPassword.setDisplayStyle(StringAspect::PasswordLineEditDisplay); @@ -146,10 +143,8 @@ CopilotSettings::CopilotSettings() proxyRejectUnauthorized.setDefaultValue(true); proxyRejectUnauthorized.setToolTip(Tr::tr("Reject unauthorized certificates from the proxy " "server. This is a security risk.")); - proxyRejectUnauthorized.setLabelPlacement(BoolAspect::LabelPlacement::InExtraLabel); initEnableAspect(enableCopilot); - enableCopilot.setLabelPlacement(BoolAspect::LabelPlacement::InExtraLabel); readSettings(); From 2886b2b3835f9ec3adc243272633d2186cc2d428 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 17 Oct 2023 13:45:40 +0200 Subject: [PATCH 19/86] Debugger: Robustify gdb stack frame extraction frame.older() might run into invalid debuginfo and throw. Change-Id: Iba1d395f21719bf28184302427c7ab2435c6a663 Reviewed-by: Reviewed-by: Christian Stenger --- share/qtcreator/debugger/gdbbridge.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index b25c139f10f..d61160eed3b 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -1409,7 +1409,13 @@ class Dumper(DumperBase): 'file="%s",line="%s",module="%s",language="c"}') % (i, pc, functionName, fileName, line, objfile)) - frame = frame.older() + try: + # This may fail with something like + # gdb.error: DW_FORM_addr_index used without .debug_addr section + #[in module /data/dev/qt-6/qtbase/lib/libQt6Widgets.so.6] + frame = frame.older() + except: + break i += 1 self.put(']}') self.reportResult(self.takeOutput(), args) From 499a7860539169c68c772d031df54f9880c6d128 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 17 Oct 2023 15:06:01 +0200 Subject: [PATCH 20/86] Utils: Be a bit more verbose in debug output Change-Id: I0fd7bc92784efa184bac1cdbd5ae4c2d0158fb28 Reviewed-by: Reviewed-by: Christian Stenger --- src/libs/utils/fileutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 4f67ee8105a..fdae7c6b8d8 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -721,7 +721,7 @@ bool FileUtils::copyRecursively( bool FileUtils::copyIfDifferent(const FilePath &srcFilePath, const FilePath &tgtFilePath) { - QTC_ASSERT(srcFilePath.exists(), return false); + QTC_ASSERT(srcFilePath.exists(), qDebug() << srcFilePath.toUserOutput(); return false); QTC_ASSERT(srcFilePath.isSameDevice(tgtFilePath), return false); if (tgtFilePath.exists()) { From 18c00cd381780bfaadcc74bd40ab8cee5521c481 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 18 Oct 2023 07:25:23 +0200 Subject: [PATCH 21/86] Python: reduce freezes in settings page with remote interpreter Do not check the existence of remote interpreters when opening the settingspage since we could run into device timeouts for unreachable devices. Change-Id: I5d0d1316961fc4ecbd2be55f6df70091ff65ecd5 Reviewed-by: Christian Stenger --- src/plugins/python/pythonsettings.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index 57d951ec1d2..410714af090 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -170,6 +170,8 @@ InterpreterOptionsWidget::InterpreterOptionsWidget() return f; } case Qt::ToolTipRole: + if (interpreter.command.needsDevice()) + break; if (interpreter.command.isEmpty()) return Tr::tr("Executable is empty."); if (!interpreter.command.exists()) @@ -179,6 +181,8 @@ InterpreterOptionsWidget::InterpreterOptionsWidget() .arg(interpreter.command.toUserOutput()); break; case Qt::DecorationRole: + if (interpreter.command.needsDevice()) + break; if (column == 0 && !interpreter.command.isExecutableFile()) return Utils::Icons::CRITICAL.icon(); break; From 74cf082ee916db0bb6b3f465f2cdab4a36b6b9c5 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 18 Oct 2023 11:42:26 +0200 Subject: [PATCH 22/86] LanguageClient: properly deactivate documents for closing Clients Deactivating the documents resets all client specific data and objects in the document like the formatter or highlighting information. Fixes an assert in the LanguageClientFormatter. Change-Id: I7069abb273749ae335fed11010a5055eacaf58b2 Reviewed-by: Christian Stenger --- src/plugins/languageclient/languageclientmanager.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index c05b84db4aa..839ececce7c 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -168,10 +168,10 @@ void LanguageClientManager::clientFinished(Client *client) const bool unexpectedFinish = client->state() != Client::Shutdown && client->state() != Client::ShutdownRequested; + const QList &clientDocs + = managerInstance->m_clientForDocument.keys(client); if (unexpectedFinish) { if (!PluginManager::isShuttingDown()) { - const QList &clientDocs - = managerInstance->m_clientForDocument.keys(client); if (client->state() == Client::Initialized && client->reset()) { qCDebug(Log) << "restart unexpectedly finished client: " << client->name() << client; client->log( @@ -186,10 +186,14 @@ void LanguageClientManager::clientFinished(Client *client) } qCDebug(Log) << "client finished unexpectedly: " << client->name() << client; client->log(Tr::tr("Unexpectedly finished.")); - for (TextEditor::TextDocument *document : clientDocs) - managerInstance->m_clientForDocument.remove(document); } } + + if (unexpectedFinish || !QTC_GUARD(clientDocs.isEmpty())) { + for (TextEditor::TextDocument *document : clientDocs) + openDocumentWithClient(document, nullptr); + } + deleteClient(client); if (isShutdownFinished()) emit managerInstance->shutdownFinished(); From cee8309998cd63dcb8c6512e9777cdf22b012387 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 16 Oct 2023 10:58:23 +0200 Subject: [PATCH 23/86] Tr: Parametrize some application names Change-Id: I5222455d895aecb94c9a96d0a0f4fd7c279a7388 Reviewed-by: Jarek Kobus Reviewed-by: Leena Miettinen Reviewed-by: Christian Stenger --- share/qtcreator/translations/qtcreator_de.ts | 12 ++++++------ share/qtcreator/translations/qtcreator_fr.ts | 12 ++++++------ share/qtcreator/translations/qtcreator_zh_CN.ts | 2 +- src/plugins/cppeditor/cppcodemodelsettingspage.cpp | 13 ++++++++----- src/plugins/docker/dockerdevice.cpp | 4 +++- src/plugins/terminal/terminalpane.cpp | 13 ++++++++++--- 6 files changed, 34 insertions(+), 22 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 77be1e4ada2..695b64e9774 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -21872,9 +21872,9 @@ z.B. name = "m_test_foo_": Bestimmt, ob Clangd beim Vervollständigen von Symbolen Header-Dateien einfügen darf. - Defines the amount of time Qt Creator waits before sending document changes to the server. + Defines the amount of time %1 waits before sending document changes to the server. If the document changes again while waiting, this timeout resets. - Bestimmt die Zeit, die Qt Creator vor dem Senden von Dokumentänderungen an den Server wartet. + Bestimmt die Zeit, die %1 vor dem Senden von Dokumentänderungen an den Server wartet. Falls sich das Dokument innerhalb dieser Zeit wieder ändert, wird erneut die volle Zeit gewartet. @@ -27577,8 +27577,8 @@ Versuchen Sie, das Projekt neu zu erstellen. Shell in Container öffnen - Docker daemon appears to be not running. Verify daemon is up and running and reset the Docker daemon in Docker device preferences or restart Qt Creator. - Der Docker-Daemon scheint nicht zu laufen. Stellen Sie sicher, dass der Daemon ausgeführt wird, und setzen Sie den Docker-Daemon in den Einstellungen des Docker-Geräts zurück oder starten Sie Qt Creator neu. + Docker daemon appears to be not running. Verify daemon is up and running and reset the Docker daemon in Docker device preferences or restart %1. + Der Docker-Daemon scheint nicht zu laufen. Stellen Sie sicher, dass der Daemon ausgeführt wird, und setzen Sie den Docker-Daemon in den Einstellungen des Docker-Geräts zurück oder starten Sie %1 neu. Docker Image Selection @@ -49685,8 +49685,8 @@ Die Datei "%1" konnte nicht geöffnet werden Einstellungen... - Sends Esc to terminal instead of Qt Creator. - Sendet Escape zum Terminal statt zu Qt Creator. + Sends Esc to terminal instead of %1. + Sendet Escape zum Terminal statt zu %1. Press %1 to send Esc to terminal. diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index f587f274099..6865214290b 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -20297,9 +20297,9 @@ Double-cliquez pour modifier l’élément. Contrôle si clangd peut insérer des fichiers d’en-tête dans le cadre de la complétion de symboles. - Defines the amount of time Qt Creator waits before sending document changes to the server. + Defines the amount of time %1 waits before sending document changes to the server. If the document changes again while waiting, this timeout resets. - Définit le temps d’attente de Qt Creator avant d’envoyer les modifications du document au serveur. + Définit le temps d’attente de %1 avant d’envoyer les modifications du document au serveur. Si le document est à nouveau modifié pendant l’attente, ce délai est réinitialisé. @@ -27322,8 +27322,8 @@ La recompilation du projet peut aider. Ouvrir un shell dans le conteneur - Docker daemon appears to be not running. Verify daemon is up and running and reset the Docker daemon in Docker device preferences or restart Qt Creator. - Le démon Docker ne semble pas fonctionner. Vérifiez que le démon est présent et en cours d'exécution et réinitialisez le démon docker dans les paramètres du périphérique docker ou redémarrez Qt Creator. + Docker daemon appears to be not running. Verify daemon is up and running and reset the Docker daemon in Docker device preferences or restart %1. + Le démon Docker ne semble pas fonctionner. Vérifiez que le démon est présent et en cours d'exécution et réinitialisez le démon docker dans les paramètres du périphérique docker ou redémarrez %1. Docker Image Selection @@ -49353,8 +49353,8 @@ Impossible d'ouvrir le fichier « %1 » Configurer… - Sends Esc to terminal instead of Qt Creator. - Envoie Échap au terminal au lieu d'à Qt Creator. + Sends Esc to terminal instead of %1. + Envoie Échap au terminal au lieu d'à %1. Press %1 to send Esc to terminal. diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index 335d2bbc377..0cae4a5a7a2 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -11554,7 +11554,7 @@ to version control (%2) - Defines the amount of time Qt Creator waits before sending document changes to the server. + Defines the amount of time %1 waits before sending document changes to the server. If the document changes again while waiting, this timeout resets. diff --git a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp index a2639f380b3..1c8ff05fee8 100644 --- a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp @@ -24,14 +24,15 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include -#include #include @@ -244,10 +245,12 @@ ClangdSettingsWidget::ClangdSettingsWidget(const ClangdSettings::Data &settingsD "worker threads."); const QString autoIncludeToolTip = Tr::tr( "Controls whether clangd may insert header files as part of symbol completion."); - const QString documentUpdateToolTip = Tr::tr( - "Defines the amount of time Qt Creator waits before sending document changes to the " - "server.\n" - "If the document changes again while waiting, this timeout resets."); + const QString documentUpdateToolTip + //: %1 is the application name (Qt Creator) + = Tr::tr("Defines the amount of time %1 waits before sending document changes to the " + "server.\n" + "If the document changes again while waiting, this timeout resets.") + .arg(QGuiApplication::applicationDisplayName()); const QString sizeThresholdToolTip = Tr::tr( "Files greater than this will not be opened as documents in clangd.\n" "The built-in code model will handle highlighting, completion and so on."); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index a13e2f19513..ec6403dd79f 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -913,10 +913,12 @@ expected_str DockerDevicePrivate::startContainer() qCWarning(dockerDeviceLog) << "Container shell encountered error:" << resultData.m_error; DockerApi::recheckDockerDaemon(); + //: %1 is the application name (Qt Creator) MessageManager::writeFlashing(Tr::tr("Docker daemon appears to be not running. " "Verify daemon is up and running and reset the " "Docker daemon in Docker device preferences " - "or restart Qt Creator.")); + "or restart %1.") + .arg(QGuiApplication::applicationDisplayName())); }); QTC_ASSERT(m_shell, diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index df059d03b3b..a11284ef1bd 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -81,7 +82,9 @@ TerminalPane::TerminalPane(QObject *parent) .toString(QKeySequence::NativeText); if (settings().sendEscapeToTerminal()) { m_escSettingButton->setText(escKey); - m_escSettingButton->setToolTip(Tr::tr("Sends Esc to terminal instead of Qt Creator.")); + //: %1 is the application name (Qt Creator) + m_escSettingButton->setToolTip(Tr::tr("Sends Esc to terminal instead of %1.") + .arg(QGuiApplication::applicationDisplayName())); } else { m_escSettingButton->setText(shiftEsc); m_escSettingButton->setToolTip( @@ -106,10 +109,14 @@ TerminalPane::TerminalPane(QObject *parent) if (settings().lockKeyboard()) { m_lockKeyboardButton->setIcon(LOCK_KEYBOARD_ICON.icon()); m_lockKeyboardButton->setToolTip( - Tr::tr("Qt Creator shortcuts are blocked when focus is inside the terminal.")); + //: %1 is the application name (Qt Creator) + Tr::tr("%1 shortcuts are blocked when focus is inside the terminal.") + .arg(QGuiApplication::applicationDisplayName())); } else { m_lockKeyboardButton->setIcon(UNLOCK_KEYBOARD_ICON.icon()); - m_lockKeyboardButton->setToolTip(Tr::tr("Qt Creator shortcuts take precedence.")); + //: %1 is the application name (Qt Creator) + m_lockKeyboardButton->setToolTip(Tr::tr("%1 shortcuts take precedence.") + .arg(QGuiApplication::applicationDisplayName())); } }; From 64550e13399224872427103ee7b69bd6c77ad06c Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 16 Oct 2023 11:42:53 +0200 Subject: [PATCH 24/86] Tr: Small fixes like full stops, whitespace and typos Change-Id: I4d1edba6d28661af3c2255add35141f1e73fc304 Reviewed-by: Christian Stenger Reviewed-by: Leena Miettinen Reviewed-by: Jarek Kobus --- share/qtcreator/translations/qtcreator_cs.ts | 4 +-- share/qtcreator/translations/qtcreator_da.ts | 4 +-- share/qtcreator/translations/qtcreator_de.ts | 34 +++++++++---------- share/qtcreator/translations/qtcreator_fr.ts | 34 +++++++++---------- share/qtcreator/translations/qtcreator_hr.ts | 4 +-- share/qtcreator/translations/qtcreator_ja.ts | 8 ++--- share/qtcreator/translations/qtcreator_pl.ts | 4 +-- share/qtcreator/translations/qtcreator_ru.ts | 8 ++--- share/qtcreator/translations/qtcreator_sl.ts | 4 +-- share/qtcreator/translations/qtcreator_uk.ts | 4 +-- .../qtcreator/translations/qtcreator_zh_CN.ts | 14 ++++---- .../qtcreator/translations/qtcreator_zh_TW.ts | 4 +-- src/libs/utils/filesearch.cpp | 2 +- src/plugins/android/androidsettingswidget.cpp | 2 +- .../debugservers/uvsc/uvscserverprovider.cpp | 3 +- src/plugins/copilot/copilotplugin.cpp | 4 +-- src/plugins/coreplugin/patchtool.cpp | 4 +-- src/plugins/docker/dockerdevice.cpp | 2 +- src/plugins/qmldesigner/generateresource.cpp | 7 ++-- src/plugins/squish/squishxmloutputhandler.cpp | 2 +- src/plugins/terminal/terminalsettings.cpp | 5 ++- src/plugins/vcpkg/vcpkgsearch.cpp | 4 ++- 22 files changed, 81 insertions(+), 80 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_cs.ts b/share/qtcreator/translations/qtcreator_cs.ts index 888786eba13..94bbf49d0b3 100644 --- a/share/qtcreator/translations/qtcreator_cs.ts +++ b/share/qtcreator/translations/qtcreator_cs.ts @@ -24897,8 +24897,8 @@ Vybere pro napodobovatele a přenosné cíle vhodné verze Qt, jsou-li dostupné '%1' se nepodařilo spustit: %2 - A timeout occurred running '%1' - Překročení času při spuštění '%1' + A timeout occurred running "%1". + Překročení času při spuštění "%1". '%1' crashed. diff --git a/share/qtcreator/translations/qtcreator_da.ts b/share/qtcreator/translations/qtcreator_da.ts index 2d6ee616342..8421c0a6242 100644 --- a/share/qtcreator/translations/qtcreator_da.ts +++ b/share/qtcreator/translations/qtcreator_da.ts @@ -7806,8 +7806,8 @@ Vil du dræbe den? Kunne ikke starte "%1": %2 - A timeout occurred running "%1" - Timeout under kørsel af "%1" + A timeout occurred running "%1". + Timeout under kørsel af "%1". "%1" crashed. diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 695b64e9774..3fc1a98bfe2 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -6385,8 +6385,8 @@ Exporting assets: %2 - A timeout occurred running "%1" - Zeitüberschreitung bei Ausführung von "%1" + A timeout occurred running "%1". + Zeitüberschreitung bei Ausführung von "%1". "%1" crashed. @@ -9410,7 +9410,7 @@ Locked components cannot be modified or selected. Kommandozeilen-Werkzeug für Android-SDK ist installiert. - Android SDK Command-line Tools run. + Android SDK Command-line Tools runs. Kommandozeilen-Werkzeug für Android-SDK startet erfolgreich. @@ -12470,8 +12470,8 @@ Siehe auch die Einstellungen für Google Test. Zieltreiber: - Starting %1 ... - Starte %1 ... + Starting %1... + Starte %1... Choose the desired startup mode of the GDB server provider. @@ -17014,7 +17014,7 @@ Ansonsten müssen Sie den Pfad zur Datei %2 aus dem Copilot-Plugin für Neovim a Fordert Vorschläge für die Cursorposition des aktuellen Editors von Copilot an. - Show next Copilot Suggestion + Show Next Copilot Suggestion Nächsten Copilot-Vorschlag zeigen @@ -17022,7 +17022,7 @@ Ansonsten müssen Sie den Pfad zur Datei %2 aus dem Copilot-Plugin für Neovim a Iteriert über die Vorschläge von Copilot und zeigt den nächsten verfügbaren Vorschlag. - Show previos Copilot Suggestion + Show Previous Copilot Suggestion Vorangehenden Copilot-Vorschlag zeigen @@ -17991,8 +17991,8 @@ Trotzdem fortfahren? "%1" konnte nicht gestartet werden: %2 - A timeout occurred running "%1" - Zeitüberschreitung bei Ausführung von "%1" + A timeout occurred running "%1". + Zeitüberschreitung bei Ausführung von "%1". "%1" crashed. @@ -27673,8 +27673,8 @@ Versuchen Sie, das Projekt neu zu erstellen. Die Liste der Quellverzeichnisse sollte nicht leer sein. - Host directories to mount into the container - Host-Verzeichnisse die in den Container eingehängt werden sollen + Host directories to mount into the container. + Host-Verzeichnisse die in den Container eingehängt werden sollen. Maps paths in this list one-to-one to the docker container. @@ -49406,9 +49406,9 @@ Zieldatei "%1" existiert bereits. Could not merge results into single results.xml. -Failed to open file "%1" +Failed to open file "%1". Die Ergebnisse konnten nicht in einer einzelnen 'results.xml'-Datei zusammengeführt werden. -Die Datei "%1" konnte nicht geöffnet werden +Die Datei "%1" konnte nicht geöffnet werden. Error while parsing first test result. @@ -49805,7 +49805,7 @@ Die Datei "%1" konnte nicht geöffnet werden Escape-Taste zum Terminal senden - Sends the escape key to the terminal when pressedinstead of closing the terminal. + Sends the escape key to the terminal when pressed instead of closing the terminal. Sendet die Escape-Taste zum Terminal, anstatt das Terminal zu schliessen. @@ -52963,8 +52963,8 @@ Die Trace-Daten sind verloren. Ausschl&ussmuster: - List of comma separated wildcard filters. - Kommaseparierte Liste von Platzhalter-Filtern. + List of comma separated wildcard filters. + Kommaseparierte Liste von Platzhalter-Filtern. Files with file name or full file path matching any filter are included. @@ -58306,7 +58306,7 @@ Are you sure you want to remove the material? Vcpkg Manifest-Editor - Name: + Name: Name: diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index 6865214290b..ab8e488103b 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -6336,8 +6336,8 @@ Export des ressources : %2 Impossible de générer le fichier de ressource : %1 - A timeout occurred running "%1" - Un dépassement de délai s’est produit lors de l’exécution de « %1 » + A timeout occurred running "%1". + Un dépassement de délai s’est produit lors de l’exécution de « %1 ». "%1" crashed. @@ -12731,8 +12731,8 @@ Avertissement : fonctionnalité expérimentale pouvant entraîner un échec Pilote cible : - Starting %1 ... - Démarrage de %1 … + Starting %1... + Démarrage de %1… Version @@ -16725,7 +16725,7 @@ Le code a été copié dans votre presse-papiers. Requête de suggestion Copilot à la position actuelle du curseur de l'éditeur. - Show next Copilot Suggestion + Show Next Copilot Suggestion Afficher la suggestion Copilot suivante @@ -16733,7 +16733,7 @@ Le code a été copié dans votre presse-papiers. Alterner parmi les suggestions Copilot reçues pour afficher la suggestion suivante disponible. - Show previos Copilot Suggestion + Show Previous Copilot Suggestion Afficher la suggestion Copilot précédente @@ -20030,8 +20030,8 @@ Double-cliquez pour modifier l’élément. Impossible de lancer « %1 » : %2 - A timeout occurred running "%1" - Un dépassement de délai s’est produit lors de l’exécution de « %1 » + A timeout occurred running "%1". + Un dépassement de délai s’est produit lors de l’exécution de « %1 ». "%1" crashed. @@ -27418,8 +27418,8 @@ La recompilation du projet peut aider. La liste des répertoires sources ne doit pas être vide. - Host directories to mount into the container - Répertoires hôtes à monter dans le conteneur + Host directories to mount into the container. + Répertoires hôtes à monter dans le conteneur. Maps paths in this list one-to-one to the docker container. @@ -49074,9 +49074,9 @@ Le fichier de destination « %1 » existe déjà. Could not merge results into single results.xml. -Failed to open file "%1" +Failed to open file "%1". Impossible de fusionner les résultats dans un unique fichier results.xml. -Impossible d'ouvrir le fichier « %1 » +Impossible d'ouvrir le fichier « %1 ». Error while parsing first test result. @@ -49473,7 +49473,7 @@ Impossible d'ouvrir le fichier « %1 » Envoyer la touche d'échappement au terminal - Sends the escape key to the terminal when pressedinstead of closing the terminal. + Sends the escape key to the terminal when pressed instead of closing the terminal. Envoi la touche d'échappement au terminal lorsque appuyé au lieu de fermer le terminal. @@ -52695,8 +52695,8 @@ Les données de la trace sont perdues. Motif d’excl&usion : - List of comma separated wildcard filters. - Liste de filtres joker séparés par des virgules. + List of comma separated wildcard filters. + Liste de filtres joker séparés par des virgules. Files with file name or full file path matching any filter are included. @@ -54704,8 +54704,8 @@ Vérifiez les paramètres pour vous assurer que Valgrind est installé et dispon Éditeur de Manifest Vcpkg - Name: - Nom: + Name: + Nom : Version: diff --git a/share/qtcreator/translations/qtcreator_hr.ts b/share/qtcreator/translations/qtcreator_hr.ts index c408f28563a..5cb6489b7ed 100644 --- a/share/qtcreator/translations/qtcreator_hr.ts +++ b/share/qtcreator/translations/qtcreator_hr.ts @@ -18568,8 +18568,8 @@ Do you want to kill it? Nije moguće pokrenuti „%1”: %2 - A timeout occurred running "%1" - Došlo je do prekoračenja vremena prilikom pokretanja „%1” + A timeout occurred running "%1". + Došlo je do prekoračenja vremena prilikom pokretanja „%1”. "%1" crashed. diff --git a/share/qtcreator/translations/qtcreator_ja.ts b/share/qtcreator/translations/qtcreator_ja.ts index 6bfd303b72d..71665c23d51 100644 --- a/share/qtcreator/translations/qtcreator_ja.ts +++ b/share/qtcreator/translations/qtcreator_ja.ts @@ -32559,8 +32559,8 @@ API バージョンが %1 以上の SDK をインストールしてください "%1" を起動できません: %2 - A timeout occurred running "%1" - "%1" を実行中にタイムアウトが発生しました + A timeout occurred running "%1". + "%1" を実行中にタイムアウトが発生しました。 "%1" crashed. @@ -46500,8 +46500,8 @@ Stepping into the module or setting breakpoints by file and line is expected to QmlDesigner::GenerateResource - A timeout occurred running "%1" - "%1" を実行中にタイムアウトが発生しました + A timeout occurred running "%1". + "%1" を実行中にタイムアウトが発生しました。 "%1" crashed. diff --git a/share/qtcreator/translations/qtcreator_pl.ts b/share/qtcreator/translations/qtcreator_pl.ts index f207ab64d56..fb3b9a36e3f 100644 --- a/share/qtcreator/translations/qtcreator_pl.ts +++ b/share/qtcreator/translations/qtcreator_pl.ts @@ -28623,8 +28623,8 @@ Do you want to check them out now? Nie można uruchomić "%1": %2 - A timeout occurred running "%1" - Przekroczono limit czasu oczekiwania na odpowiedź od uruchomionego "%1" + A timeout occurred running "%1". + Przekroczono limit czasu oczekiwania na odpowiedź od uruchomionego "%1". "%1" crashed. diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index 23561e76c50..ed5d78ba7a2 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -10560,8 +10560,8 @@ Double-click to edit item. Не удалось запустить «%1»: %2 - A timeout occurred running "%1" - Истекло время работы «%1» + A timeout occurred running "%1". + Истекло время работы «%1». "%1" crashed. @@ -34843,8 +34843,8 @@ Neither the path to the library nor the path to its includes is added to the .pr Не удалось создать файл ресурсов: %1 - A timeout occurred running "%1" - Истекло время работы «%1» + A timeout occurred running "%1". + Истекло время работы «%1». "%1" crashed. diff --git a/share/qtcreator/translations/qtcreator_sl.ts b/share/qtcreator/translations/qtcreator_sl.ts index 97b4fe1b6cc..e5b3b87b02b 100644 --- a/share/qtcreator/translations/qtcreator_sl.ts +++ b/share/qtcreator/translations/qtcreator_sl.ts @@ -15893,8 +15893,8 @@ Projekte programov QML izvede pregledovalnik QML in jih ni potrebno zgraditi.Ni moč zagnati »%1«: %2 - A timeout occurred running '%1' - Med poganjanjem »%1« je potekel čas + A timeout occurred running "%1". + Med poganjanjem »%1« je potekel čas. '%1' crashed. diff --git a/share/qtcreator/translations/qtcreator_uk.ts b/share/qtcreator/translations/qtcreator_uk.ts index 5e90d729015..432f5ab3a24 100644 --- a/share/qtcreator/translations/qtcreator_uk.ts +++ b/share/qtcreator/translations/qtcreator_uk.ts @@ -35645,8 +35645,8 @@ Install an SDK of at least API version %1. Неможливо запустити "%1": %2 - A timeout occurred running "%1" - Час очікування вичерпано для "%1" + A timeout occurred running "%1". + Час очікування вичерпано для "%1". "%1" crashed. diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index 0cae4a5a7a2..3ae81e4f3ea 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -1308,8 +1308,8 @@ This cannot be undone. 无法为 %1 创建文件 “%2” - A timeout occurred running "%1" - 运行 “%1” 时超时 + A timeout occurred running "%1". + 运行 “%1” 时超时。 Crash while creating file for %1 "%2" @@ -4114,7 +4114,7 @@ Warning: this is an experimental feature and might lead to failing to execute th 目标驱动器: - Starting %1 ... + Starting %1... 启动 %1... @@ -8538,7 +8538,7 @@ Set a valid executable first. - A timeout occurred running "%1" + A timeout occurred running "%1". @@ -18145,7 +18145,7 @@ Rebuilding the project might help. - Host directories to mount into the container + Host directories to mount into the container. @@ -33329,7 +33329,7 @@ The following files or directories are missing: - A timeout occurred running "%1" + A timeout occurred running "%1". @@ -41375,7 +41375,7 @@ Destination file "%1" already exists. Could not merge results into single results.xml. -Failed to open file "%1" +Failed to open file "%1". diff --git a/share/qtcreator/translations/qtcreator_zh_TW.ts b/share/qtcreator/translations/qtcreator_zh_TW.ts index 500e7548e81..d21d4d9bca2 100644 --- a/share/qtcreator/translations/qtcreator_zh_TW.ts +++ b/share/qtcreator/translations/qtcreator_zh_TW.ts @@ -13569,8 +13569,8 @@ Requires <b>Qt 4.7.4</b> or newer. 無法啟動 '%1':%2 - A timeout occurred running '%1' - 執行 '%1' 發生逾時 + A timeout occurred running "%1". + 執行 '%1' 發生逾時。 '%1' crashed. diff --git a/src/libs/utils/filesearch.cpp b/src/libs/utils/filesearch.cpp index 6340d5e1191..f97934cde40 100644 --- a/src/libs/utils/filesearch.cpp +++ b/src/libs/utils/filesearch.cpp @@ -495,7 +495,7 @@ QString msgExclusionPatternLabel() QString msgFilePatternToolTip(InclusionType inclusionType) { - return Tr::tr("List of comma separated wildcard filters. ") + return Tr::tr("List of comma separated wildcard filters.") + " " + (inclusionType == InclusionType::Included ? Tr::tr("Files with file name or full file path matching any filter are included.") : Tr::tr("Files with file name or full file path matching any filter are excluded.")); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index c48ad217ec0..ce8fbcf8614 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -281,7 +281,7 @@ AndroidSettingsWidget::AndroidSettingsWidget() { JavaPathExistsAndWritableRow, Tr::tr("JDK path exists and is writable.") }, { SdkPathExistsAndWritableRow, Tr::tr("Android SDK path exists and is writable.") }, { SdkToolsInstalledRow, Tr::tr("Android SDK Command-line Tools installed.") }, - { SdkManagerSuccessfulRow, Tr::tr("Android SDK Command-line Tools run.") }, + { SdkManagerSuccessfulRow, Tr::tr("Android SDK Command-line Tools runs.") }, { PlatformToolsInstalledRow, Tr::tr("Android SDK Platform-Tools installed.") }, { AllEssentialsInstalledRow, Tr::tr( "All essential packages installed for all installed Qt versions.") }, diff --git a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp index 49eccb1187c..f77a0ce0cfd 100644 --- a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp +++ b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp @@ -368,8 +368,7 @@ UvscServerProviderRunner::UvscServerProviderRunner(ProjectExplorer::RunControl * void UvscServerProviderRunner::start() { - const QString msg = Tr::tr("Starting %1 ...") - .arg(m_process.commandLine().displayName()); + const QString msg = Tr::tr("Starting %1...").arg(m_process.commandLine().displayName()); appendMessage(msg, NormalMessageFormat); m_process.start(); diff --git a/src/plugins/copilot/copilotplugin.cpp b/src/plugins/copilot/copilotplugin.cpp index 8af42ae0c07..47364c60d7d 100644 --- a/src/plugins/copilot/copilotplugin.cpp +++ b/src/plugins/copilot/copilotplugin.cpp @@ -72,7 +72,7 @@ void CopilotPlugin::initialize() ActionManager::registerAction(requestAction, Constants::COPILOT_REQUEST_SUGGESTION); QAction *nextSuggestionAction = new QAction(this); - nextSuggestionAction->setText(Tr::tr("Show next Copilot Suggestion")); + nextSuggestionAction->setText(Tr::tr("Show Next Copilot Suggestion")); nextSuggestionAction->setToolTip(Tr::tr( "Cycles through the received Copilot Suggestions showing the next available Suggestion.")); @@ -84,7 +84,7 @@ void CopilotPlugin::initialize() ActionManager::registerAction(nextSuggestionAction, Constants::COPILOT_NEXT_SUGGESTION); QAction *previousSuggestionAction = new QAction(this); - previousSuggestionAction->setText(Tr::tr("Show previos Copilot Suggestion")); + previousSuggestionAction->setText(Tr::tr("Show Previous Copilot Suggestion")); previousSuggestionAction->setToolTip(Tr::tr("Cycles through the received Copilot Suggestions " "showing the previous available Suggestion.")); diff --git a/src/plugins/coreplugin/patchtool.cpp b/src/plugins/coreplugin/patchtool.cpp index 89144f7a27d..c17db9ba927 100644 --- a/src/plugins/coreplugin/patchtool.cpp +++ b/src/plugins/coreplugin/patchtool.cpp @@ -97,8 +97,8 @@ static bool runPatchHelper(const QByteArray &input, const FilePath &workingDirec if (!patchProcess.readDataFromProcess(&stdOut, &stdErr)) { patchProcess.stop(); patchProcess.waitForFinished(); - MessageManager::writeFlashing(Tr::tr("A timeout occurred running \"%1\"") - .arg(patch.toUserOutput())); + MessageManager::writeFlashing( + Tr::tr("A timeout occurred running \"%1\".").arg(patch.toUserOutput())); return false; } diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index ec6403dd79f..c47de707914 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -187,7 +187,7 @@ DockerDeviceSettings::DockerDeviceSettings() mounts.setLabelText(Tr::tr("Paths to mount:")); mounts.setDefaultValue({Core::DocumentManager::projectsDirectory().toString()}); mounts.setToolTip(Tr::tr("Maps paths in this list one-to-one to the docker container.")); - mounts.setPlaceHolderText(Tr::tr("Host directories to mount into the container")); + mounts.setPlaceHolderText(Tr::tr("Host directories to mount into the container.")); extraArgs.setSettingsKey(DockerDeviceExtraArgs); extraArgs.setLabelText(Tr::tr("Extra arguments:")); diff --git a/src/plugins/qmldesigner/generateresource.cpp b/src/plugins/qmldesigner/generateresource.cpp index e2d6dad9a95..de8cd5a80b4 100644 --- a/src/plugins/qmldesigner/generateresource.cpp +++ b/src/plugins/qmldesigner/generateresource.cpp @@ -190,9 +190,10 @@ static bool runRcc(const CommandLine &command, const FilePath &workingDir, QByteArray stdOut; QByteArray stdErr; if (!rccProcess.readDataFromProcess(&stdOut, &stdErr)) { - Core::MessageManager::writeDisrupting(QCoreApplication::translate( - "QmlDesigner::GenerateResource", "A timeout occurred running \"%1\"") - .arg(rccProcess.commandLine().toUserOutput())); + Core::MessageManager::writeDisrupting( + QCoreApplication::translate("QmlDesigner::GenerateResource", + "A timeout occurred running \"%1\".") + .arg(rccProcess.commandLine().toUserOutput())); return false; } if (!stdOut.trimmed().isEmpty()) diff --git a/src/plugins/squish/squishxmloutputhandler.cpp b/src/plugins/squish/squishxmloutputhandler.cpp index a9f59af44a3..d41e4bccc8d 100644 --- a/src/plugins/squish/squishxmloutputhandler.cpp +++ b/src/plugins/squish/squishxmloutputhandler.cpp @@ -50,7 +50,7 @@ void SquishXmlOutputHandler::mergeResultFiles(const Utils::FilePaths &reportFile if (!resultsXML.open(QFile::WriteOnly)) { if (error) *error = Tr::tr("Could not merge results into single results.xml.\n" - "Failed to open file \"%1\"") + "Failed to open file \"%1\".") .arg(resultsXML.fileName()); return; } diff --git a/src/plugins/terminal/terminalsettings.cpp b/src/plugins/terminal/terminalsettings.cpp index 63fcdac3bb1..57093d20a6e 100644 --- a/src/plugins/terminal/terminalsettings.cpp +++ b/src/plugins/terminal/terminalsettings.cpp @@ -482,9 +482,8 @@ TerminalSettings::TerminalSettings() sendEscapeToTerminal.setSettingsKey("SendEscapeToTerminal"); sendEscapeToTerminal.setLabelText(Tr::tr("Send escape key to terminal")); - sendEscapeToTerminal.setToolTip( - Tr::tr("Sends the escape key to the terminal when pressed" - "instead of closing the terminal.")); + sendEscapeToTerminal.setToolTip(Tr::tr("Sends the escape key to the terminal when pressed " + "instead of closing the terminal.")); sendEscapeToTerminal.setDefaultValue(false); lockKeyboard.setSettingsKey("LockKeyboard"); diff --git a/src/plugins/vcpkg/vcpkgsearch.cpp b/src/plugins/vcpkg/vcpkgsearch.cpp index ddf42bd8a61..dd0f4e93d7d 100644 --- a/src/plugins/vcpkg/vcpkgsearch.cpp +++ b/src/plugins/vcpkg/vcpkgsearch.cpp @@ -88,6 +88,7 @@ VcpkgPackageSearchDialog::VcpkgPackageSearchDialog(const VcpkgManifest &preexist m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + // clang-format off using namespace Layouting; Column { Row { @@ -99,7 +100,7 @@ VcpkgPackageSearchDialog::VcpkgPackageSearchDialog(const VcpkgManifest &preexist Group { title(Tr::tr("Package details")), Form { - Tr::tr("Name:"), m_vcpkgName, br, + Tr::tr("Name:"), m_vcpkgName, br, Tr::tr("Version:"), m_vcpkgVersion, br, Tr::tr("License:"), m_vcpkgLicense, br, Tr::tr("Description:"), m_vcpkgDescription, br, @@ -109,6 +110,7 @@ VcpkgPackageSearchDialog::VcpkgPackageSearchDialog(const VcpkgManifest &preexist }, Row { m_infoLabel, m_buttonBox }, }.attachTo(this); + // clang-format on m_allPackages = vcpkgManifests(settings().vcpkgRoot()); From 15d31610ee0ceafa8d84f39ed8191794cb36f791 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 16 Oct 2023 12:10:15 +0200 Subject: [PATCH 25/86] Tr: Use more arg() and move tags out Change-Id: I80e28de3add81d0569b87dbb1712229cda5fb42a Reviewed-by: Christian Stenger Reviewed-by: Jarek Kobus Reviewed-by: Leena Miettinen --- share/qtcreator/translations/qtcreator_de.ts | 20 +++++++++---------- share/qtcreator/translations/qtcreator_fr.ts | 20 +++++++++---------- .../qtcreator/translations/qtcreator_zh_CN.ts | 8 ++++---- .../androidmanifesteditoriconwidget.cpp | 10 +++++++--- src/plugins/autotest/qtest/qttesttreeitem.cpp | 9 ++++++--- src/plugins/copilot/authwidget.cpp | 5 +++-- src/plugins/copilot/copilotsettings.cpp | 14 +++++++------ 7 files changed, 48 insertions(+), 38 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 3fc1a98bfe2..57623ee8908 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -10836,8 +10836,8 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni Klicken zum Auswählen... - Images (*.png *.jpg *.jpeg *.webp *.svg) - Bilder (*.png *.jpg *.jpeg *.webp *.svg) + Images %1 + Bilder %1 %1 has been stopped. @@ -12301,8 +12301,8 @@ Siehe auch die Einstellungen für Google Test. Qt Test - <p>Multiple testcases inside a single executable are not officially supported. Depending on the implementation they might get executed or not, but never will be explicitly selectable.</p> - <p>Mehrere Testfälle in der gleichen ausführbaren Datei werden nicht offiziell unterstützt. Abhängig von der Implementation werden sie möglicherweise ausgeführt oder auch nicht, aber sie werden niemals explizit auswählbar sein.</p> + Multiple testcases inside a single executable are not officially supported. Depending on the implementation they might get executed or not, but never will be explicitly selectable. + Mehrere Testfälle in der gleichen ausführbaren Datei werden nicht offiziell unterstützt. Abhängig von der Implementation werden sie möglicherweise ausgeführt oder auch nicht, aber sie werden niemals explizit auswählbar sein. inherited @@ -16965,8 +16965,8 @@ Der Code wurde in die Zwischenablage kopiert. Anmeldung fehlgeschlagen - The login request failed: - Die Anmeldung ist fehlgeschlagen: + The login request failed: %1 + Die Anmeldung ist fehlgeschlagen: %1 Select Previous Copilot Suggestion @@ -17066,8 +17066,8 @@ Ansonsten müssen Sie den Pfad zur Datei %2 aus dem Copilot-Plugin für Neovim a Pfad zu Node.js - Select path to node.js executable. See https://nodejs.org/en/download/for installation instructions. - Wählen Sie den Pfad zur ausführbaren node.js-Datei. Siehe auch https://nodejs.org/en/download/ für eine Installationsanleitung. + Select path to node.js executable. See %1 for installation instructions. + Wählen Sie den Pfad zur ausführbaren node.js-Datei. Siehe auch %1 für eine Installationsanleitung. Path to agent.js: @@ -17078,8 +17078,8 @@ Ansonsten müssen Sie den Pfad zur Datei %2 aus dem Copilot-Plugin für Neovim a Pfad zu agent.js - Select path to agent.js in Copilot Neovim plugin. See https://github.com/github/copilot.vim#getting-started for installation instructions. - Wählen Sie den Pfad zur agent.js-Datei vom Copilot-Plugin für Neovim. Siehe auch https://github.com/github/copilot.vim#getting-started für eine Installationsanleitung. + Select path to agent.js in Copilot Neovim plugin. See %1 for installation instructions. + Wählen Sie den Pfad zur agent.js-Datei vom Copilot-Plugin für Neovim. Siehe auch %1 für eine Installationsanleitung. Auto Complete diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index ab8e488103b..c050a6f3a0a 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -10478,8 +10478,8 @@ Les fichiers du répertoire source du paquet Android sont copiés dans le réper Cliquer pour sélectionner… - Images (*.png *.jpg *.jpeg *.webp *.svg) - Images (*.png *.jpg *.jpeg *.webp *.svg) + Images %1 + Images %1 Deploy to Android Device @@ -11597,8 +11597,8 @@ Avertissement : l'activation de cette fonctionnalité augmente signifi Métriques du benchmark - <p>Multiple testcases inside a single executable are not officially supported. Depending on the implementation they might get executed or not, but never will be explicitly selectable.</p> - <p>La présence de plusieurs cas de tests dans un unique exécutable n'est officiellement pas supportée. Suivant l'implémentation, ils peuvent être exécutés ou non mais il ne seront jamais sélectionnables explicitement.</p> + Multiple testcases inside a single executable are not officially supported. Depending on the implementation they might get executed or not, but never will be explicitly selectable. + La présence de plusieurs cas de tests dans un unique exécutable n'est officiellement pas supportée. Suivant l'implémentation, ils peuvent être exécutés ou non mais il ne seront jamais sélectionnables explicitement. inherited @@ -16689,8 +16689,8 @@ Le code a été copié dans votre presse-papiers. Identification échouée - The login request failed: - La requête d'identification a échouée : + The login request failed: %1 + La requête d'identification a échouée : %1 Copilot @@ -16773,8 +16773,8 @@ Le code a été copié dans votre presse-papiers. Chemin Node.js - Select path to node.js executable. See https://nodejs.org/en/download/for installation instructions. - Sélectionner le chemin menant à l'exécutable node.js. Voir https://nodejs.org/fr/download/ pour les instructions d'installation. + Select path to node.js executable. See %1 for installation instructions. + Sélectionner le chemin menant à l'exécutable node.js. Voir %1 pour les instructions d'installation. Path to agent.js: @@ -16785,8 +16785,8 @@ Le code a été copié dans votre presse-papiers. Chemin Agent.js - Select path to agent.js in Copilot Neovim plugin. See https://github.com/github/copilot.vim#getting-started for installation instructions. - Sélectionner le chemin vers agent.js dans le plug-in Copilot Neovim Voir https://github.com/github/copilot.vim#getting-started pour les instructions d'installation. + Select path to agent.js in Copilot Neovim plugin. See %1 for installation instructions. + Sélectionner le chemin vers agent.js dans le plug-in Copilot Neovim Voir %1 pour les instructions d'installation. Auto Complete diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index 3ae81e4f3ea..92175bdf0c5 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -1083,8 +1083,8 @@ This cannot be undone. 单击以选择... - Images (*.png *.jpg *.jpeg *.webp *.svg) - 图片(*.png *.jpg *.jpeg *.webp *.svg) + Images %1 + 图片 %1 Include default permissions for Qt modules. @@ -2986,8 +2986,8 @@ Warning: Plain text misses some information, such as duration. 基准测试指标 - <p>Multiple testcases inside a single executable are not officially supported. Depending on the implementation they might get executed or not, but never will be explicitly selectable.</p> - <p>官方不支持单一可执行程序中的多个测试用例,根据具体实现,它可能会被执行,但绝不会被明确选择</p> + Multiple testcases inside a single executable are not officially supported. Depending on the implementation they might get executed or not, but never will be explicitly selectable. + 官方不支持单一可执行程序中的多个测试用例,根据具体实现,它可能会被执行,但绝不会被明确选择 inherited diff --git a/src/plugins/android/androidmanifesteditoriconwidget.cpp b/src/plugins/android/androidmanifesteditoriconwidget.cpp index e0b23ff6ae8..2c2dfca47e1 100644 --- a/src/plugins/android/androidmanifesteditoriconwidget.cpp +++ b/src/plugins/android/androidmanifesteditoriconwidget.cpp @@ -143,9 +143,13 @@ void AndroidManifestEditorIconWidget::setIconFromPath(const FilePath &iconPath) void AndroidManifestEditorIconWidget::selectIcon() { - FilePath file = FileUtils::getOpenFilePath(this, m_iconSelectionText, - FileUtils::homePath(), - Tr::tr("Images (*.png *.jpg *.jpeg *.webp *.svg)")); // TODO: See SplashContainterWidget + FilePath file = FileUtils::getOpenFilePath( + this, + m_iconSelectionText, + FileUtils::homePath(), + //: %1 expands to wildcard list for file dialog, do not change order + Tr::tr("Images %1") + .arg("(*.png *.jpg *.jpeg *.webp *.svg)")); // TODO: See SplashContainterWidget if (file.isEmpty()) return; setIconFromPath(file); diff --git a/src/plugins/autotest/qtest/qttesttreeitem.cpp b/src/plugins/autotest/qtest/qttesttreeitem.cpp index 0c535fa9f81..de27cb089ff 100644 --- a/src/plugins/autotest/qtest/qttesttreeitem.cpp +++ b/src/plugins/autotest/qtest/qttesttreeitem.cpp @@ -47,9 +47,12 @@ QVariant QtTestTreeItem::data(int column, int role) const case Qt::ToolTipRole: { QString toolTip = TestTreeItem::data(column, role).toString(); if (m_multiTest && type() == TestCase) { - toolTip.append(Tr::tr("

Multiple testcases inside a single executable are not officially " - "supported. Depending on the implementation they might get executed " - "or not, but never will be explicitly selectable.

")); + toolTip.append( + "

" + + Tr::tr("Multiple testcases inside a single executable are not officially " + "supported. Depending on the implementation they might get executed " + "or not, but never will be explicitly selectable.") + + "

"); } else if (type() == TestFunction) { // avoid confusion (displaying header file, but ending up inside source) toolTip = parentItem()->name() + "::" + name(); diff --git a/src/plugins/copilot/authwidget.cpp b/src/plugins/copilot/authwidget.cpp index ffafc8381b4..0b5cfd2d93d 100644 --- a/src/plugins/copilot/authwidget.cpp +++ b/src/plugins/copilot/authwidget.cpp @@ -155,8 +155,9 @@ void AuthWidget::signIn() QMessageBox::critical(this, Tr::tr("Login Failed"), Tr::tr( - "The login request failed: ") - + response.error()->message()); + "The login request failed: %1") + .arg(response.error() + ->message())); setState("Sign in", response.error()->message(), false); return; } diff --git a/src/plugins/copilot/copilotsettings.cpp b/src/plugins/copilot/copilotsettings.cpp index 586fd8528b9..1f2b59523d3 100644 --- a/src/plugins/copilot/copilotsettings.cpp +++ b/src/plugins/copilot/copilotsettings.cpp @@ -73,9 +73,10 @@ CopilotSettings::CopilotSettings() nodeJsPath.setLabelText(Tr::tr("Node.js path:")); nodeJsPath.setHistoryCompleter("Copilot.NodePath.History"); nodeJsPath.setDisplayName(Tr::tr("Node.js Path")); - nodeJsPath.setToolTip( - Tr::tr("Select path to node.js executable. See https://nodejs.org/en/download/" - "for installation instructions.")); + //: %1 is the URL to nodejs + nodeJsPath.setToolTip(Tr::tr("Select path to node.js executable. See %1 " + "for installation instructions.") + .arg("https://nodejs.org/en/download/")); distPath.setExpectedKind(PathChooser::File); distPath.setDefaultValue(distFromVim.toUserOutput()); @@ -83,9 +84,10 @@ CopilotSettings::CopilotSettings() distPath.setLabelText(Tr::tr("Path to agent.js:")); distPath.setHistoryCompleter("Copilot.DistPath.History"); distPath.setDisplayName(Tr::tr("Agent.js path")); - distPath.setToolTip(Tr::tr( - "Select path to agent.js in Copilot Neovim plugin. See " - "https://github.com/github/copilot.vim#getting-started for installation instructions.")); + //: %1 is the URL to copilot.vim getting started + distPath.setToolTip(Tr::tr("Select path to agent.js in Copilot Neovim plugin. See " + "%1 for installation instructions.") + .arg("https://github.com/github/copilot.vim#getting-started")); autoComplete.setDisplayName(Tr::tr("Auto Request")); autoComplete.setSettingsKey("Copilot.Autocomplete"); From a253a2aa9553b219cb3444706461f6ddb630c5b2 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 16 Oct 2023 15:14:01 +0200 Subject: [PATCH 26/86] Tr: Fix lupdate issues Add missing `Tr::` and use some fully qualified namespaces where lupdate fails to resolve it correctly. Change-Id: Ied4ac7bf0438a9080d0b76a9a1f5033dbc94a163 Reviewed-by: Christian Stenger Reviewed-by: Leena Miettinen Reviewed-by: --- .../advanceddockingsystem/autohidetab.cpp | 17 +++++----- .../dockareatitlebar.cpp | 32 ++++++++++--------- .../advanceddockingsystem/dockwidgettab.cpp | 18 +++++------ .../autoreconfstep.cpp | 3 +- .../cmakeprojectmanager/cmakeparser.cpp | 4 ++- .../cmakeprojectmanager/presetsparser.cpp | 18 +++++++---- src/plugins/compilerexplorer/api/request.h | 3 +- src/plugins/coreplugin/systemsettings.cpp | 2 +- .../qmakeprojectmanager/addlibrarywizard.cpp | 4 +-- .../connectioneditor/connectionview.cpp | 5 +-- .../qmljseditor/qmljseditingsettingspage.cpp | 2 +- src/plugins/qtsupport/qtoptionspage.cpp | 4 +-- src/plugins/texteditor/texteditor.cpp | 10 +++--- 13 files changed, 66 insertions(+), 56 deletions(-) diff --git a/src/libs/advanceddockingsystem/autohidetab.cpp b/src/libs/advanceddockingsystem/autohidetab.cpp index 1d8f7a50a65..dd3f3f6c820 100644 --- a/src/libs/advanceddockingsystem/autohidetab.cpp +++ b/src/libs/advanceddockingsystem/autohidetab.cpp @@ -4,6 +4,7 @@ #include "autohidetab.h" #include "ads_globals_p.h" +#include "advanceddockingsystemtr.h" #include "autohidedockcontainer.h" #include "autohidesidebar.h" #include "dockareawidget.h" @@ -335,7 +336,7 @@ void AutoHideTab::contextMenuEvent(QContextMenuEvent *event) const bool isFloatable = d->m_dockWidget->features().testFlag(DockWidget::DockWidgetFloatable); QMenu menu(this); - QAction *detachAction = menu.addAction(tr("Detach")); + QAction *detachAction = menu.addAction(Tr::tr("Detach")); detachAction->connect(detachAction, &QAction::triggered, this, @@ -345,17 +346,17 @@ void AutoHideTab::contextMenuEvent(QContextMenuEvent *event) auto isPinnable = d->m_dockWidget->features().testFlag(DockWidget::DockWidgetPinnable); detachAction->setEnabled(isPinnable); - auto pinToMenu = menu.addMenu(tr("Pin To...")); + auto pinToMenu = menu.addMenu(Tr::tr("Pin To...")); pinToMenu->setEnabled(isPinnable); - d->createAutoHideToAction(tr("Top"), SideBarTop, pinToMenu); - d->createAutoHideToAction(tr("Left"), SideBarLeft, pinToMenu); - d->createAutoHideToAction(tr("Right"), SideBarRight, pinToMenu); - d->createAutoHideToAction(tr("Bottom"), SideBarBottom, pinToMenu); + d->createAutoHideToAction(Tr::tr("Top"), SideBarTop, pinToMenu); + d->createAutoHideToAction(Tr::tr("Left"), SideBarLeft, pinToMenu); + d->createAutoHideToAction(Tr::tr("Right"), SideBarRight, pinToMenu); + d->createAutoHideToAction(Tr::tr("Bottom"), SideBarBottom, pinToMenu); - QAction *unpinAction = menu.addAction(tr("Unpin (Dock)")); + QAction *unpinAction = menu.addAction(Tr::tr("Unpin (Dock)")); unpinAction->connect(unpinAction, &QAction::triggered, this, &AutoHideTab::unpinDockWidget); menu.addSeparator(); - QAction *closeAction = menu.addAction(tr("Close")); + QAction *closeAction = menu.addAction(Tr::tr("Close")); closeAction->connect(closeAction, &QAction::triggered, this, diff --git a/src/libs/advanceddockingsystem/dockareatitlebar.cpp b/src/libs/advanceddockingsystem/dockareatitlebar.cpp index 234916d530d..7a2e6770621 100644 --- a/src/libs/advanceddockingsystem/dockareatitlebar.cpp +++ b/src/libs/advanceddockingsystem/dockareatitlebar.cpp @@ -656,7 +656,8 @@ void DockAreaTitleBar::contextMenuEvent(QContextMenuEvent *event) QMenu menu(this); if (!isTopLevelArea) { - QAction *detachAction = menu.addAction(isAutoHide ? tr("Detach") : tr("Detach Group")); + QAction *detachAction = menu.addAction(isAutoHide ? Tr::tr("Detach") + : Tr::tr("Detach Group")); detachAction->connect(detachAction, &QAction::triggered, this, @@ -665,7 +666,8 @@ void DockAreaTitleBar::contextMenuEvent(QContextMenuEvent *event) d->m_dockArea->features().testFlag(DockWidget::DockWidgetFloatable)); if (DockManager::testAutoHideConfigFlag(DockManager::AutoHideFeatureEnabled)) { - QAction *pinAction = menu.addAction(isAutoHide ? tr("Unpin (Dock)") : tr("Pin Group")); + QAction *pinAction = menu.addAction(isAutoHide ? Tr::tr("Unpin (Dock)") + : Tr::tr("Pin Group")); pinAction->connect(pinAction, &QAction::triggered, this, @@ -674,17 +676,17 @@ void DockAreaTitleBar::contextMenuEvent(QContextMenuEvent *event) auto areaIsPinnable = d->m_dockArea->features().testFlag(DockWidget::DockWidgetPinnable); pinAction->setEnabled(areaIsPinnable); if (!isAutoHide) { - auto tmp = menu.addMenu(tr("Pin Group To...")); + auto tmp = menu.addMenu(Tr::tr("Pin Group To...")); tmp->setEnabled(areaIsPinnable); - d->createAutoHideToAction(tr("Top"), SideBarTop, tmp); - d->createAutoHideToAction(tr("Left"), SideBarLeft, tmp); - d->createAutoHideToAction(tr("Right"), SideBarRight, tmp); - d->createAutoHideToAction(tr("Bottom"), SideBarBottom, tmp); + d->createAutoHideToAction(Tr::tr("Top"), SideBarTop, tmp); + d->createAutoHideToAction(Tr::tr("Left"), SideBarLeft, tmp); + d->createAutoHideToAction(Tr::tr("Right"), SideBarRight, tmp); + d->createAutoHideToAction(Tr::tr("Bottom"), SideBarBottom, tmp); } } menu.addSeparator(); } - QAction *closeAction = menu.addAction(isAutoHide ? tr("Close") : tr("Close Group")); + QAction *closeAction = menu.addAction(isAutoHide ? Tr::tr("Close") : Tr::tr("Close Group")); closeAction->connect(closeAction, &QAction::triggered, this, @@ -692,7 +694,7 @@ void DockAreaTitleBar::contextMenuEvent(QContextMenuEvent *event) closeAction->setEnabled(d->m_dockArea->features().testFlag(DockWidget::DockWidgetClosable)); if (!isAutoHide && !isTopLevelArea) { - QAction *closeOthersAction = menu.addAction(tr("Close Other Groups")); + QAction *closeOthersAction = menu.addAction(Tr::tr("Close Other Groups")); closeOthersAction->connect(closeOthersAction, &QAction::triggered, d->m_dockArea, @@ -717,22 +719,22 @@ QString DockAreaTitleBar::titleBarButtonToolTip(eTitleBarButton button) const switch (button) { case TitleBarButtonAutoHide: if (d->m_dockArea->isAutoHide()) - return tr("Unpin (Dock)"); + return Tr::tr("Unpin (Dock)"); if (DockManager::testAutoHideConfigFlag(DockManager::AutoHideButtonTogglesArea)) - return tr("Pin Group"); + return Tr::tr("Pin Group"); else - return tr("Pin Active Tab (Press Ctrl to Pin Group)"); + return Tr::tr("Pin Active Tab (Press Ctrl to Pin Group)"); break; case TitleBarButtonClose: if (d->m_dockArea->isAutoHide()) - return tr("Close"); + return Tr::tr("Close"); if (DockManager::testConfigFlag(DockManager::DockAreaCloseButtonClosesTab)) - return tr("Close Active Tab"); + return Tr::tr("Close Active Tab"); else - return tr("Close Group"); + return Tr::tr("Close Group"); break; default: diff --git a/src/libs/advanceddockingsystem/dockwidgettab.cpp b/src/libs/advanceddockingsystem/dockwidgettab.cpp index 4efa339e34e..d450c6ddd19 100644 --- a/src/libs/advanceddockingsystem/dockwidgettab.cpp +++ b/src/libs/advanceddockingsystem/dockwidgettab.cpp @@ -474,7 +474,7 @@ void DockWidgetTab::contextMenuEvent(QContextMenuEvent *event) QMenu menu(this); if (!isTopLevelArea) { - QAction *detachAction = menu.addAction(tr("Detach")); + QAction *detachAction = menu.addAction(Tr::tr("Detach")); detachAction->connect(detachAction, &QAction::triggered, this, @@ -482,7 +482,7 @@ void DockWidgetTab::contextMenuEvent(QContextMenuEvent *event) detachAction->setEnabled(isDetachable); if (DockManager::testAutoHideConfigFlag(DockManager::AutoHideFeatureEnabled)) { - QAction *pinAction = menu.addAction(tr("Pin")); + QAction *pinAction = menu.addAction(Tr::tr("Pin")); pinAction->connect(pinAction, &QAction::triggered, this, @@ -491,23 +491,23 @@ void DockWidgetTab::contextMenuEvent(QContextMenuEvent *event) auto isPinnable = d->m_dockWidget->features().testFlag(DockWidget::DockWidgetPinnable); pinAction->setEnabled(isPinnable); - auto subMenu = menu.addMenu(tr("Pin To...")); + auto subMenu = menu.addMenu(Tr::tr("Pin To...")); subMenu->setEnabled(isPinnable); - d->createAutoHideToAction(tr("Top"), SideBarTop, subMenu); - d->createAutoHideToAction(tr("Left"), SideBarLeft, subMenu); - d->createAutoHideToAction(tr("Right"), SideBarRight, subMenu); - d->createAutoHideToAction(tr("Bottom"), SideBarBottom, subMenu); + d->createAutoHideToAction(Tr::tr("Top"), SideBarTop, subMenu); + d->createAutoHideToAction(Tr::tr("Left"), SideBarLeft, subMenu); + d->createAutoHideToAction(Tr::tr("Right"), SideBarRight, subMenu); + d->createAutoHideToAction(Tr::tr("Bottom"), SideBarBottom, subMenu); } } menu.addSeparator(); - QAction *closeAction = menu.addAction(tr("Close")); + QAction *closeAction = menu.addAction(Tr::tr("Close")); closeAction->connect(closeAction, &QAction::triggered, this, &DockWidgetTab::closeRequested); closeAction->setEnabled(isClosable()); if (d->m_dockArea->openDockWidgetsCount() > 1) { - QAction *closeOthersAction = menu.addAction(tr("Close Others")); + QAction *closeOthersAction = menu.addAction(Tr::tr("Close Others")); closeOthersAction->connect(closeOthersAction, &QAction::triggered, this, diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp index 2afc690387e..9dea7d6f7fb 100644 --- a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp @@ -72,7 +72,8 @@ private: m_runAutoreconf = true; if (!m_runAutoreconf) { - emit addOutput(Tr::tr("Configuration unchanged, skipping autoreconf step."), + emit addOutput(::AutotoolsProjectManager::Tr::tr( + "Configuration unchanged, skipping autoreconf step."), OutputFormat::NormalMessage); return SetupResult::StopWithDone; } diff --git a/src/plugins/cmakeprojectmanager/cmakeparser.cpp b/src/plugins/cmakeprojectmanager/cmakeparser.cpp index 2e3c954f029..de4633ea617 100644 --- a/src/plugins/cmakeprojectmanager/cmakeparser.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeparser.cpp @@ -3,6 +3,8 @@ #include "cmakeparser.h" +#include "cmakeprojectmanagertr.h" + #include #include @@ -210,7 +212,7 @@ void CMakeParser::flush() LinkSpecs specs; m_lastTask.details << QString(); - m_lastTask.details << tr("Call stack:"); + m_lastTask.details << Tr::tr("Call stack:"); m_lines += 2; m_callStack->push_front(m_errorOrWarningLine); diff --git a/src/plugins/cmakeprojectmanager/presetsparser.cpp b/src/plugins/cmakeprojectmanager/presetsparser.cpp index f3f92f76fd5..91943b02f7d 100644 --- a/src/plugins/cmakeprojectmanager/presetsparser.cpp +++ b/src/plugins/cmakeprojectmanager/presetsparser.cpp @@ -444,7 +444,8 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage { const Utils::expected_str jsonContents = jsonFile.fileContents(); if (!jsonContents) { - errorMessage = Tr::tr("Failed to read file \"%1\".").arg(jsonFile.fileName()); + errorMessage + = ::CMakeProjectManager::Tr::tr("Failed to read file \"%1\".").arg(jsonFile.fileName()); return false; } @@ -460,7 +461,8 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage } if (!jsonDoc.isObject()) { - errorMessage = Tr::tr("Invalid file \"%1\".").arg(jsonFile.fileName()); + errorMessage + = ::CMakeProjectManager::Tr::tr("Invalid file \"%1\".").arg(jsonFile.fileName()); return false; } @@ -469,7 +471,8 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage m_presetsData.fileDir = jsonFile.parentDir(); if (!parseVersion(root.value("version"), m_presetsData.version)) { - errorMessage = Tr::tr("Invalid \"version\" in file \"%1\".").arg(jsonFile.fileName()); + errorMessage = ::CMakeProjectManager::Tr::tr("Invalid \"version\" in file \"%1\".") + .arg(jsonFile.fileName()); return false; } @@ -484,8 +487,9 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage if (!parseConfigurePresets(root.value("configurePresets"), m_presetsData.configurePresets, jsonFile.parentDir())) { - errorMessage - = Tr::tr("Invalid \"configurePresets\" section in %1 file").arg(jsonFile.fileName()); + errorMessage = ::CMakeProjectManager::Tr::tr( + "Invalid \"configurePresets\" section in %1 file") + .arg(jsonFile.fileName()); return false; } @@ -493,8 +497,8 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage if (!parseBuildPresets(root.value("buildPresets"), m_presetsData.buildPresets, jsonFile.parentDir())) { - errorMessage - = Tr::tr("Invalid \"buildPresets\" section in %1 file").arg(jsonFile.fileName()); + errorMessage = ::CMakeProjectManager::Tr::tr("Invalid \"buildPresets\" section in %1 file") + .arg(jsonFile.fileName()); return false; } diff --git a/src/plugins/compilerexplorer/api/request.h b/src/plugins/compilerexplorer/api/request.h index 0cc57d4c879..dc55ab80b6e 100644 --- a/src/plugins/compilerexplorer/api/request.h +++ b/src/plugins/compilerexplorer/api/request.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include #include @@ -91,7 +92,7 @@ QFuture request( QString errorMessage; if (reply->error() == QNetworkReply::ContentNotFoundError) { - errorMessage = QObject::tr("Not found"); + errorMessage = QCoreApplication::translate("QtC::CompilerExplorer", "Not found"); } else errorMessage = reply->errorString(); diff --git a/src/plugins/coreplugin/systemsettings.cpp b/src/plugins/coreplugin/systemsettings.cpp index aef7055c975..1477fcf747d 100644 --- a/src/plugins/coreplugin/systemsettings.cpp +++ b/src/plugins/coreplugin/systemsettings.cpp @@ -143,7 +143,7 @@ SystemSettings::SystemSettings() #ifdef ENABLE_CRASHPAD enableCrashReporting.setSettingsKey("CrashReportingEnabled"); enableCrashReporting.setLabelPlacement(BoolAspect::LabelPlacement::Compact); - enableCrashReporting.setLabelText(tr("Enable crash reporting")); + enableCrashReporting.setLabelText(Tr::tr("Enable crash reporting")); enableCrashReporting.setToolTip( Tr::tr("Allow crashes to be automatically reported. Collected reports are " "used for the sole purpose of fixing bugs.")); diff --git a/src/plugins/qmakeprojectmanager/addlibrarywizard.cpp b/src/plugins/qmakeprojectmanager/addlibrarywizard.cpp index 856c5fdd1d4..c6500df0cfd 100644 --- a/src/plugins/qmakeprojectmanager/addlibrarywizard.cpp +++ b/src/plugins/qmakeprojectmanager/addlibrarywizard.cpp @@ -45,7 +45,7 @@ static FancyLineEdit::AsyncValidationResult validateLibraryPath(const QString &i { const FilePath filePath = FilePath::fromUserInput(input); if (!filePath.exists()) - return make_unexpected(Tr::tr("File does not exist.")); + return make_unexpected(::QmakeProjectManager::Tr::tr("File does not exist.")); const QString fileName = filePath.fileName(); @@ -61,7 +61,7 @@ static FancyLineEdit::AsyncValidationResult validateLibraryPath(const QString &i if (regExp.match(fileName).hasMatch()) return input; } - return make_unexpected(Tr::tr("File does not match filter.")); + return make_unexpected(::QmakeProjectManager::Tr::tr("File does not match filter.")); } AddLibraryWizard::AddLibraryWizard(const FilePath &proFile, QWidget *parent) diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp index b96afd69665..cd63231d5bd 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -128,8 +129,8 @@ private: errorString += "\n" + error.toString(); Core::AsynchronousMessageBox::warning( - tr("Cannot Create QtQuick View"), - tr("ConnectionsEditorWidget: %1 cannot be created.%2") + Tr::tr("Cannot Create QtQuick View"), + Tr::tr("ConnectionsEditorWidget: %1 cannot be created.%2") .arg(qmlSourcesPath(), errorString)); return; } diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp index 642a5facc59..11c7985fd1c 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp @@ -578,7 +578,7 @@ QmlJsEditingSettings QmlJsEditingSettings::get() QmlJsEditingSettingsPage::QmlJsEditingSettingsPage() { setId("C.QmlJsEditing"); - setDisplayName(Tr::tr("QML/JS Editing")); + setDisplayName(::QmlJSEditor::Tr::tr("QML/JS Editing")); setCategory(Constants::SETTINGS_CATEGORY_QML); setWidgetCreator([] { return new QmlJsEditingSettingsPageWidget; }); } diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index 741aeeb567c..99a237d7960 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -951,8 +951,8 @@ static FancyLineEdit::AsyncValidationResult validateQtInstallDir(const QString & const QStringList filesToCheck = settingsFilesToCheck() + qtversionFilesToCheck(); return make_unexpected( "" - + Tr::tr("Qt installation information was not found in \"%1\". " - "Choose a directory that contains one of the files %2") + + ::QtSupport::Tr::tr("Qt installation information was not found in \"%1\". " + "Choose a directory that contains one of the files %2") .arg(qtDir.toUserOutput(), "
" + filesToCheck.join('\n') + "
")); } return input; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index ab1ab4cbc42..66e3616af91 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -1094,12 +1094,10 @@ TextEditorWidgetPrivate::TextEditorWidgetPrivate(TextEditorWidget *parent) connect(m_fileLineEnding, &QToolButton::clicked, ActionManager::instance(), [this] { QMenu *menu = new QMenu; - menu->addAction(tr("Unix Line Endings (LF)"), [this] { - q->selectLineEnding(TextFileFormat::LFLineTerminator); - }); - menu->addAction(tr("Windows Line Endings (CRLF)"), [this] { - q->selectLineEnding(TextFileFormat::CRLFLineTerminator); - }); + menu->addAction(Tr::tr("Unix Line Endings (LF)"), + [this] { q->selectLineEnding(TextFileFormat::LFLineTerminator); }); + menu->addAction(Tr::tr("Windows Line Endings (CRLF)"), + [this] { q->selectLineEnding(TextFileFormat::CRLFLineTerminator); }); menu->popup(QCursor::pos()); }); From 8f3e77a3ae7bdf1d46a63feced8d7fa4e899b5c3 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 18 Oct 2023 09:42:15 +0200 Subject: [PATCH 27/86] Tr: Re-fix plurals The number for the plural must be given as the 3rd argument to the tr() call, not as an arg(). Amends 1359e9c84fbbb7d8e41c5573c63759bf191dc8fa Change-Id: I45241a6acd82041c320bbe476cd2b4cc92247ef3 Reviewed-by: Jarek Kobus --- src/libs/utils/devicefileaccess.cpp | 7 ++++--- src/plugins/autotest/boost/boosttestoutputreader.cpp | 3 ++- src/plugins/cppeditor/cppmodelmanager.cpp | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/libs/utils/devicefileaccess.cpp b/src/libs/utils/devicefileaccess.cpp index 71f694c6649..a38a3617a7e 100644 --- a/src/libs/utils/devicefileaccess.cpp +++ b/src/libs/utils/devicefileaccess.cpp @@ -721,10 +721,11 @@ expected_str DesktopDeviceFileAccess::writeFileContents(const FilePath & qint64 res = file.write(data); if (res != data.size()) return make_unexpected( - Tr::tr("Could not write to file \"%1\" (only %2 of %n byte(s) written).") + Tr::tr("Could not write to file \"%1\" (only %2 of %n byte(s) written).", + nullptr, + data.size()) .arg(filePath.toUserOutput()) - .arg(res) - .arg(data.size())); + .arg(res)); return res; } diff --git a/src/plugins/autotest/boost/boosttestoutputreader.cpp b/src/plugins/autotest/boost/boosttestoutputreader.cpp index 439fe480814..7b58d74f528 100644 --- a/src/plugins/autotest/boost/boosttestoutputreader.cpp +++ b/src/plugins/autotest/boost/boosttestoutputreader.cpp @@ -327,7 +327,8 @@ void BoostTestOutputReader::processOutputLine(const QByteArray &outputLine) BoostTestResult result(id(), {}, m_projectFile); const int failed = match.captured(1).toInt(); const int fatals = m_summary.value(ResultType::MessageFatal); - QString txt = Tr::tr("%n failure(s) detected in %2.").arg(failed).arg(match.captured(3)); + QString txt + = Tr::tr("%n failure(s) detected in %1.", nullptr, failed).arg(match.captured(3)); const int passed = qMax(0, m_testCaseCount - failed); if (m_testCaseCount != -1) txt.append(' ').append(Tr::tr("%1 tests passed.").arg(passed)); diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index 2deaea4290c..e72c630cbf7 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -568,9 +568,10 @@ static void checkNextFunctionForUnused( return; const int newProgress = findRefsFuture->progressValue() + 1; findRefsFuture->setProgressValueAndText(newProgress, - Tr::tr("Checked %1 of %n function(s)") - .arg(newProgress) - .arg(findRefsFuture->progressMaximum())); + Tr::tr("Checked %1 of %n function(s)", + nullptr, + findRefsFuture->progressMaximum()) + .arg(newProgress)); QVariantMap data = search->userData().toMap(); QVariant &activeLinks = data["active"]; QVariantList activeLinksList = activeLinks.toList(); From 9f7203b0d2b4eb87449e47eb89b7f1686e4ecb93 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 18 Oct 2023 11:12:42 +0200 Subject: [PATCH 28/86] PE: Allow skipping of compress on specialized folder nodes Fixes wrong handling of multiple qrc files when having just a single prefix. Change-Id: Id5ac357d4ab6a7f7556b36a9fc44da398ede093c Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/projectnodes.h | 2 +- src/plugins/resourceeditor/resourcenode.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 25868d0ed75..5e424b62bbc 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -248,7 +248,7 @@ public: const Utils::FilePath &overrideBaseDir = Utils::FilePath(), const FolderNodeFactory &factory = [](const Utils::FilePath &fn) { return std::make_unique(fn); }); - void compress(); + virtual void compress(); // takes ownership of newNode. // Will delete newNode if oldNode is not a child of this node. diff --git a/src/plugins/resourceeditor/resourcenode.h b/src/plugins/resourceeditor/resourcenode.h index 8e04267768e..d857a643761 100644 --- a/src/plugins/resourceeditor/resourcenode.h +++ b/src/plugins/resourceeditor/resourcenode.h @@ -25,6 +25,8 @@ public: ProjectExplorer::RemovedFilesFromProject removeFiles(const Utils::FilePaths &filePaths, Utils::FilePaths *notRemoved) override; + void compress() override { } // do not compress + bool addPrefix(const QString &prefix, const QString &lang); bool removePrefix(const QString &prefix, const QString &lang); From b519ebf1c947b7893af7c1f06521ac8f2468086e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 18 Oct 2023 11:18:12 +0200 Subject: [PATCH 29/86] ProjectExplorer: Do not use Yes/No as buttons in dialogs It is clearer to name the "accept" button after the action that is performed when clicking it. Change-Id: I1153169d48082e95722150a4cfcd92939ba92889 Reviewed-by: Christian Kandeler Reviewed-by: --- .../projectexplorer/runsettingspropertiespage.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index 20758cbc4e3..2c675b0a043 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -237,12 +237,15 @@ void RunSettingsWidget::removeRunConfiguration() void RunSettingsWidget::removeAllRunConfigurations() { - QMessageBox msgBox(QMessageBox::Question, Tr::tr("Remove Run Configurations?"), + QMessageBox msgBox(QMessageBox::Question, + Tr::tr("Remove Run Configurations?"), Tr::tr("Do you really want to delete all run configurations?"), - QMessageBox::Yes|QMessageBox::No, this); - msgBox.setDefaultButton(QMessageBox::No); - msgBox.setEscapeButton(QMessageBox::No); - if (msgBox.exec() == QMessageBox::No) + QMessageBox::Cancel, + this); + msgBox.addButton(Tr::tr("Delete"), QMessageBox::YesRole); + msgBox.setDefaultButton(QMessageBox::Cancel); + msgBox.setEscapeButton(QMessageBox::Cancel); + if (msgBox.exec() == QMessageBox::Cancel) return; m_target->removeAllRunConfigurations(); From ad7d5590281019233d11d640e7e1b4e1a5b8026b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 18 Oct 2023 09:59:28 +0200 Subject: [PATCH 30/86] Tr: More small fixes Change-Id: I5d9324d3f64eaa522fa1d435efa39fa43d84798a Reviewed-by: Jarek Kobus Reviewed-by: Leena Miettinen --- src/libs/utils/passworddialog.cpp | 2 +- src/libs/utils/terminalhooks.cpp | 2 +- src/plugins/clangcodemodel/clangtextmark.cpp | 4 ++-- .../clangformat/clangformatconfigwidget.cpp | 2 +- .../compilerexplorer/compilerexplorereditor.cpp | 2 +- .../compilerexplorersettings.cpp | 8 ++++---- .../coreplugin/dialogs/settingsdialog.cpp | 16 ++++++++-------- src/plugins/coreplugin/generalsettings.cpp | 14 +++++++------- src/plugins/cppeditor/cppquickfixes.cpp | 8 ++++---- src/plugins/docker/dockerdevicewidget.cpp | 4 ++-- src/plugins/git/gitplugin.cpp | 11 +++++++++-- src/plugins/git/gitsettings.cpp | 16 ++++++++++++---- src/plugins/git/gitsettings.h | 3 +++ src/plugins/python/pyside.cpp | 4 ++-- src/plugins/terminal/terminalwidget.cpp | 4 ++-- src/plugins/vcpkg/vcpkgmanifesteditor.cpp | 4 ++-- src/plugins/vcpkg/vcpkgsearch.cpp | 4 ++-- 17 files changed, 63 insertions(+), 45 deletions(-) diff --git a/src/libs/utils/passworddialog.cpp b/src/libs/utils/passworddialog.cpp index 05bdf268da9..7958f7d6bd9 100644 --- a/src/libs/utils/passworddialog.cpp +++ b/src/libs/utils/passworddialog.cpp @@ -22,7 +22,7 @@ ShowPasswordButton::ShowPasswordButton(QWidget *parent) { setAttribute(Qt::WA_Hover); setCheckable(true); - setToolTip(Tr::tr("Show/hide password")); + setToolTip(Tr::tr("Show/Hide Password")); } void ShowPasswordButton::paintEvent(QPaintEvent *e) diff --git a/src/libs/utils/terminalhooks.cpp b/src/libs/utils/terminalhooks.cpp index 6072e168e8a..bb517cb9554 100644 --- a/src/libs/utils/terminalhooks.cpp +++ b/src/libs/utils/terminalhooks.cpp @@ -27,7 +27,7 @@ expected_str defaultShellForDevice(const FilePath &deviceRoot) shell = env->searchInPath(shell.nativePath()); if (shell.isEmpty()) - return make_unexpected(Tr::tr("Could not find any shell")); + return make_unexpected(Tr::tr("Could not find any shell.")); return deviceRoot.withNewMappedPath(shell); } diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index 4f5be51a7c1..80e2956021f 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -105,8 +105,8 @@ void disableDiagnosticInCurrentProjectConfig(const ClangDiagnostic &diagnostic) projectSettings.setDiagnosticConfigId(config.id()); // Notify the user about changed project specific settings - const QString text = Tr::tr("Changes applied to diagnostic configuration \"%1\"") - .arg(config.displayName()); + const QString text + = Tr::tr("Changes applied to diagnostic configuration \"%1\".").arg(config.displayName()); FadingIndicator::showText(Core::ICore::mainWindow(), text, FadingIndicator::SmallText); diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index d1735b15fb7..e3328bb2695 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -98,7 +98,7 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc static const int expectedMajorVersion = 17; - d->clangVersion = new QLabel(Tr::tr("Current clang-format version: ") + LLVM_VERSION_STRING, + d->clangVersion = new QLabel(Tr::tr("Current ClangFormat version: %1.").arg(LLVM_VERSION_STRING), this); d->clangWarningText = new QLabel(Tr::tr("The widget was generated for ClangFormat %1. " diff --git a/src/plugins/compilerexplorer/compilerexplorereditor.cpp b/src/plugins/compilerexplorer/compilerexplorereditor.cpp index c6040d65a42..180878ef937 100644 --- a/src/plugins/compilerexplorer/compilerexplorereditor.cpp +++ b/src/plugins/compilerexplorer/compilerexplorereditor.cpp @@ -484,7 +484,7 @@ void CompilerWidget::doCompile() } } catch (const std::exception &e) { Core::MessageManager::writeDisrupting( - Tr::tr("Failed to compile: \"%1\"").arg(QString::fromUtf8(e.what()))); + Tr::tr("Failed to compile: \"%1\".").arg(QString::fromUtf8(e.what()))); } }); diff --git a/src/plugins/compilerexplorer/compilerexplorersettings.cpp b/src/plugins/compilerexplorer/compilerexplorersettings.cpp index ae47f67f9e2..a93508b5e4e 100644 --- a/src/plugins/compilerexplorer/compilerexplorersettings.cpp +++ b/src/plugins/compilerexplorer/compilerexplorersettings.cpp @@ -210,7 +210,7 @@ void CompilerSettings::fillLibraries(const LibrarySelectionAspect::ResultCallbac fillFromCache(); } catch (const std::exception &e) { Core::MessageManager::writeDisrupting( - Tr::tr("Failed to fetch libraries: \"%1\"") + Tr::tr("Failed to fetch libraries: \"%1\".") .arg(QString::fromUtf8(e.what()))); } }); @@ -253,7 +253,7 @@ void SourceSettings::fillLanguageIdModel(const Utils::StringSelectionAspect::Res fillFromCache(); } catch (const std::exception &e) { Core::MessageManager::writeDisrupting( - Tr::tr("Failed to fetch languages: \"%1\"") + Tr::tr("Failed to fetch languages: \"%1\".") .arg(QString::fromUtf8(e.what()))); } }); @@ -295,7 +295,7 @@ void CompilerSettings::fillCompilerModel(const Utils::StringSelectionAspect::Res fillFromCache(itCache); } catch (const std::exception &e) { Core::MessageManager::writeDisrupting( - Tr::tr("Failed to fetch compilers: \"%1\"") + Tr::tr("Failed to fetch compilers: \"%1\".") .arg(QString::fromUtf8(e.what()))); } }); @@ -311,7 +311,7 @@ CompilerExplorerSettings::CompilerExplorerSettings() compilerExplorerUrl.setSettingsKey("CompilerExplorerUrl"); compilerExplorerUrl.setLabelText(Tr::tr("Compiler Explorer URL:")); - compilerExplorerUrl.setToolTip(Tr::tr("URL of the Compiler Explorer instance to use")); + compilerExplorerUrl.setToolTip(Tr::tr("URL of the Compiler Explorer instance to use.")); compilerExplorerUrl.setDefaultValue("https://godbolt.org/"); compilerExplorerUrl.setDisplayStyle(Utils::StringAspect::DisplayStyle::LineEditDisplay); compilerExplorerUrl.setHistoryCompleter("CompilerExplorer.Url.History"); diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index f420c0ff492..1f7aa77d2e4 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -463,14 +463,14 @@ private: static QPointer m_instance = nullptr; -SettingsDialog::SettingsDialog(QWidget *parent) : - QDialog(parent), - m_pages(sortedOptionsPages()), - m_stackedLayout(new QStackedLayout), - m_filterLineEdit(new Utils::FancyLineEdit), - m_sortCheckBox(new QCheckBox(Tr::tr("Sort Categories"))), - m_categoryList(new CategoryListView), - m_headerLabel(new QLabel) +SettingsDialog::SettingsDialog(QWidget *parent) + : QDialog(parent) + , m_pages(sortedOptionsPages()) + , m_stackedLayout(new QStackedLayout) + , m_filterLineEdit(new Utils::FancyLineEdit) + , m_sortCheckBox(new QCheckBox(Tr::tr("Sort categories"))) + , m_categoryList(new CategoryListView) + , m_headerLabel(new QLabel) { m_filterLineEdit->setFiltering(true); diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp index 1e2c5515342..3087b0d8c4b 100644 --- a/src/plugins/coreplugin/generalsettings.cpp +++ b/src/plugins/coreplugin/generalsettings.cpp @@ -139,12 +139,12 @@ GeneralSettingsWidget::GeneralSettingsWidget() != Qt::HighDpiScaleFactorRoundingPolicy::Unset) { using Policy = Qt::HighDpiScaleFactorRoundingPolicy; m_policyComboBox = new QComboBox; - m_policyComboBox->addItem(Tr::tr("Round up for .5 and above"), int(Policy::Round)); - m_policyComboBox->addItem(Tr::tr("Always round up"), int(Policy::Ceil)); - m_policyComboBox->addItem(Tr::tr("Always round down"), int(Policy::Floor)); - m_policyComboBox->addItem(Tr::tr("Round up for .75 and above"), - int(Policy::RoundPreferFloor)); - m_policyComboBox->addItem(Tr::tr("Don't round"), int(Policy::PassThrough)); + m_policyComboBox->addItem(Tr::tr("Round Up for .5 and Above"), int(Policy::Round)); + m_policyComboBox->addItem(Tr::tr("Always Round Up"), int(Policy::Ceil)); + m_policyComboBox->addItem(Tr::tr("Always Round Down"), int(Policy::Floor)); + m_policyComboBox->addItem(Tr::tr("Round Up for .75 and Above"), + int(Policy::RoundPreferFloor)); + m_policyComboBox->addItem(Tr::tr("Don't Round"), int(Policy::PassThrough)); m_policyComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); const Policy userPolicy = @@ -153,7 +153,7 @@ GeneralSettingsWidget::GeneralSettingsWidget() .value(); m_policyComboBox->setCurrentIndex(m_policyComboBox->findData(int(userPolicy))); - form.addRow({Tr::tr("DPI Rounding Policy:"), m_policyComboBox, st}); + form.addRow({Tr::tr("DPI rounding policy:"), m_policyComboBox, st}); } form.addRow({empty, generalSettings().showShortcutsInContextMenus}); diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index a65c9b61a47..7f08b962009 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -9329,8 +9329,8 @@ public: m_wasCxxStyle(m_kind == T_CPP_COMMENT || m_kind == T_CPP_DOXY_COMMENT), m_isDoxygen(m_kind == T_DOXY_COMMENT || m_kind == T_CPP_DOXY_COMMENT) { - setDescription(m_wasCxxStyle ? Tr::tr("Convert comment to C style") - : Tr::tr("Convert comment to C++ style")); + setDescription(m_wasCxxStyle ? Tr::tr("Convert Comment to C-Style") + : Tr::tr("Convert Comment to C++-Style")); } private: @@ -9552,8 +9552,8 @@ public: : CppQuickFixOperation(interface), m_symbol(symbol), m_commentTokens(commentTokens) { setDescription(direction == Direction::ToDecl - ? Tr::tr("Move function documentation to declaration") - : Tr::tr("Move function documentation to definition")); + ? Tr::tr("Move Function Documentation to Declaration") + : Tr::tr("Move Function Documentation to Definition")); } private: diff --git a/src/plugins/docker/dockerdevicewidget.cpp b/src/plugins/docker/dockerdevicewidget.cpp index 01d80106b68..0e269ee3972 100644 --- a/src/plugins/docker/dockerdevicewidget.cpp +++ b/src/plugins/docker/dockerdevicewidget.cpp @@ -173,7 +173,7 @@ DockerDeviceWidget::DockerDeviceWidget(const IDevice::Ptr &device) deviceSettings->tag, br, deviceSettings->imageId, br, daemonStateLabel, m_daemonReset, m_daemonState, br, - Tr::tr("Container State:"), deviceSettings->containerStatus, br, + Tr::tr("Container state:"), deviceSettings->containerStatus, br, deviceSettings->useLocalUidGid, br, deviceSettings->keepEntryPoint, br, deviceSettings->enableLldbFlags, br, @@ -187,7 +187,7 @@ DockerDeviceWidget::DockerDeviceWidget(const IDevice::Ptr &device) If { dockerDevice->isAutoDetected(), {}, {detectionControls} }, noMargin, },br, - Tr::tr("Command Line:"), createLineLabel, br, + Tr::tr("Command line:"), createLineLabel, br, }.attachTo(this); // clang-format on diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 693b12cc028..3f8c55b18d4 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -10,6 +10,7 @@ #include "gitconstants.h" #include "giteditor.h" #include "gitgrep.h" +#include "gitsettings.h" #include "gitsubmiteditor.h" #include "gittr.h" #include "gitutils.h" @@ -247,8 +248,14 @@ public: if (settings().instantBlameIgnoreSpaceChanges() || settings().instantBlameIgnoreLineMoves()) { - result.append(Tr::tr("

Note: Ignore whitespace changes or line moves" - " is enabled in the instant blame settings.

")); + result.append( + "

" + //: %1 and %2 are the "ignore whitespace changes" and "ignore line moves" options + + Tr::tr("Note: \"%1\" or \"%2\"" + " is enabled in the instant blame settings.") + .arg(GitSettings::trIgnoreWhitespaceChanges(), + GitSettings::trIgnoreLineMoves()) + + "

"); } return result; } diff --git a/src/plugins/git/gitsettings.cpp b/src/plugins/git/gitsettings.cpp index 79d85566986..cb23f55c9a8 100644 --- a/src/plugins/git/gitsettings.cpp +++ b/src/plugins/git/gitsettings.cpp @@ -91,14 +91,12 @@ GitSettings::GitSettings() Tr::tr("Annotate the current line in the editor with Git \"blame\" output.")); instantBlameIgnoreSpaceChanges.setSettingsKey("GitInstantIgnoreSpaceChanges"); instantBlameIgnoreSpaceChanges.setDefaultValue(false); - instantBlameIgnoreSpaceChanges.setLabelText( - Tr::tr("Ignore whitespace changes")); + instantBlameIgnoreSpaceChanges.setLabelText(trIgnoreWhitespaceChanges()); instantBlameIgnoreSpaceChanges.setToolTip( Tr::tr("Finds the commit that introduced the last real code changes to the line.")); instantBlameIgnoreLineMoves.setSettingsKey("GitInstantIgnoreLineMoves"); instantBlameIgnoreLineMoves.setDefaultValue(false); - instantBlameIgnoreLineMoves.setLabelText( - Tr::tr("Ignore line moves")); + instantBlameIgnoreLineMoves.setLabelText(trIgnoreLineMoves()); instantBlameIgnoreLineMoves.setToolTip( Tr::tr("Finds the commit that introduced the line before it was moved.")); @@ -187,6 +185,16 @@ FilePath GitSettings::gitExecutable(bool *ok, QString *errorMessage) const return resolvedBinPath; } +QString GitSettings::trIgnoreWhitespaceChanges() +{ + return Tr::tr("Ignore whitespace changes"); +} + +QString GitSettings::trIgnoreLineMoves() +{ + return Tr::tr("Ignore line moves"); +} + // GitSettingsPage class GitSettingsPage final : public Core::IOptionsPage diff --git a/src/plugins/git/gitsettings.h b/src/plugins/git/gitsettings.h index f5a83c5e8a9..f6ec650c2e8 100644 --- a/src/plugins/git/gitsettings.h +++ b/src/plugins/git/gitsettings.h @@ -45,6 +45,9 @@ public: mutable bool tryResolve = true; Utils::FilePath gitExecutable(bool *ok = nullptr, QString *errorMessage = nullptr) const; + + static QString trIgnoreWhitespaceChanges(); + static QString trIgnoreLineMoves(); }; GitSettings &settings(); diff --git a/src/plugins/python/pyside.cpp b/src/plugins/python/pyside.cpp index bae0c0753af..a17ae89dca8 100644 --- a/src/plugins/python/pyside.cpp +++ b/src/plugins/python/pyside.cpp @@ -127,7 +127,7 @@ void PySideInstaller::installPyside(const FilePath &python, install->setPackages({PipPackage(pySide)}); } else { QDialog dialog; - dialog.setWindowTitle(Tr::tr("Select PySide version")); + dialog.setWindowTitle(Tr::tr("Select PySide Version")); dialog.setLayout(new QVBoxLayout()); dialog.layout()->addWidget(new QLabel(Tr::tr("Select which PySide version to install:"))); QComboBox *pySideSelector = new QComboBox(); @@ -135,7 +135,7 @@ void PySideInstaller::installPyside(const FilePath &python, for (const Utils::FilePath &version : std::as_const(availablePySides)) { const FilePath dir = version.parentDir(); const QString text - = Tr::tr("PySide %1 wheel (%2)").arg(dir.fileName(), dir.toUserOutput()); + = Tr::tr("PySide %1 Wheel (%2)").arg(dir.fileName(), dir.toUserOutput()); pySideSelector->addItem(text, version.toVariant()); } dialog.layout()->addWidget(pySideSelector); diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 604a0d82bc8..69f0256ef5c 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -85,7 +85,7 @@ void TerminalWidget::setupPty() CommandLine{settings().shell(), settings().shellArguments(), CommandLine::Raw}); if (shellCommand.executable().isRootPath()) { - writeToTerminal(Tr::tr("Connecting ...\r\n").toUtf8(), true); + writeToTerminal((Tr::tr("Connecting...") + "\r\n").toUtf8(), true); // We still have to find the shell to start ... m_findShellWatcher.reset(new QFutureWatcher>()); connect(m_findShellWatcher.get(), &QFutureWatcher::finished, this, [this] { @@ -107,7 +107,7 @@ void TerminalWidget::setupPty() shellCommand.executable()); if (result && !result->isExecutableFile()) return make_unexpected( - Tr::tr("'%1' is not executable.").arg(result->toUserOutput())); + Tr::tr("\"%1\" is not executable.").arg(result->toUserOutput())); return result; })); diff --git a/src/plugins/vcpkg/vcpkgmanifesteditor.cpp b/src/plugins/vcpkg/vcpkgmanifesteditor.cpp index 94774ab7183..3e90b0f7076 100644 --- a/src/plugins/vcpkg/vcpkgmanifesteditor.cpp +++ b/src/plugins/vcpkg/vcpkgmanifesteditor.cpp @@ -99,7 +99,7 @@ public: { const QIcon vcpkgIcon = Utils::Icon({{":/vcpkg/images/vcpkgicon.png", Utils::Theme::IconsBaseColor}}).icon(); - m_searchPkgAction = toolBar()->addAction(vcpkgIcon, Tr::tr("Add vcpkg package...")); + m_searchPkgAction = toolBar()->addAction(vcpkgIcon, Tr::tr("Add vcpkg Package...")); connect(m_searchPkgAction, &QAction::triggered, this, [this] { const Search::VcpkgManifest package = Search::showVcpkgPackageSearchDialog(documentToManifest()); @@ -111,7 +111,7 @@ public: }); const QIcon cmakeIcon = ProjectExplorer::Icons::CMAKE_LOGO_TOOLBAR.icon(); - m_cmakeCodeAction = toolBar()->addAction(cmakeIcon, Tr::tr("CMake code...")); + m_cmakeCodeAction = toolBar()->addAction(cmakeIcon, Tr::tr("CMake Code...")); connect(m_cmakeCodeAction, &QAction::triggered, this, [this] { CMakeCodeDialog dlg(documentToManifest().dependencies); dlg.exec(); diff --git a/src/plugins/vcpkg/vcpkgsearch.cpp b/src/plugins/vcpkg/vcpkgsearch.cpp index dd0f4e93d7d..d5e300893f4 100644 --- a/src/plugins/vcpkg/vcpkgsearch.cpp +++ b/src/plugins/vcpkg/vcpkgsearch.cpp @@ -60,7 +60,7 @@ VcpkgPackageSearchDialog::VcpkgPackageSearchDialog(const VcpkgManifest &preexist , m_projectManifest(preexistingPackages) { resize(920, 400); - setWindowTitle(Tr::tr("Add vcpkg package")); + setWindowTitle(Tr::tr("Add vcpkg Package")); m_packagesFilter = new FancyLineEdit; m_packagesFilter->setFiltering(true); @@ -98,7 +98,7 @@ VcpkgPackageSearchDialog::VcpkgPackageSearchDialog(const VcpkgManifest &preexist m_packagesList, }, Group { - title(Tr::tr("Package details")), + title(Tr::tr("Package Details")), Form { Tr::tr("Name:"), m_vcpkgName, br, Tr::tr("Version:"), m_vcpkgVersion, br, From f8beeb9edc5c7501724a4d10c50e3ba81fdd899d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 17 Oct 2023 15:16:14 +0200 Subject: [PATCH 31/86] CppEditor: Filter out another GCC-only flag Qt applications are built with "-mno-direct-extern-access" these days, which throws off clang-tidy. Change-Id: Ifaaef84f6da37a0abb7b7a68296723fa41b572a7 Reviewed-by: Christian Stenger Reviewed-by: --- src/plugins/cppeditor/compileroptionsbuilder.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/cppeditor/compileroptionsbuilder.cpp b/src/plugins/cppeditor/compileroptionsbuilder.cpp index 8376f7d1acc..12403bd1533 100644 --- a/src/plugins/cppeditor/compileroptionsbuilder.cpp +++ b/src/plugins/cppeditor/compileroptionsbuilder.cpp @@ -900,6 +900,10 @@ void CompilerOptionsBuilder::evaluateCompilerFlags() continue; } + // GCC option that clang doesn't know. + if (option.contains("direct-extern-access")) + continue; + // These were already parsed into ProjectPart::includedFiles. if (option == includeFileOptionCl || option == includeFileOptionGcc) { skipNext = true; From 4aefd9a74d1fd262e7b2fd8566c9353652903c5d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 18 Oct 2023 14:54:46 +0200 Subject: [PATCH 32/86] Copilot: Fix some strings - add missing colons - rejecting unauthorized certificates is the secure option, turning it off is insecure Change-Id: Ia09994ea75460fd5ebdd8354412d3122bd32eeed Reviewed-by: Jarek Kobus Reviewed-by: Leena Miettinen --- src/plugins/copilot/copilotsettings.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/copilot/copilotsettings.cpp b/src/plugins/copilot/copilotsettings.cpp index 1f2b59523d3..c75f7124235 100644 --- a/src/plugins/copilot/copilotsettings.cpp +++ b/src/plugins/copilot/copilotsettings.cpp @@ -105,14 +105,14 @@ CopilotSettings::CopilotSettings() proxyHost.setDisplayName(Tr::tr("Proxy Host")); proxyHost.setDisplayStyle(StringAspect::LineEditDisplay); proxyHost.setSettingsKey("Copilot.ProxyHost"); - proxyHost.setLabelText(Tr::tr("Proxy host")); + proxyHost.setLabelText(Tr::tr("Proxy host:")); proxyHost.setDefaultValue(""); proxyHost.setToolTip(Tr::tr("The host name of the proxy server.")); proxyHost.setHistoryCompleter("Copilot.ProxyHost.History"); proxyPort.setDisplayName(Tr::tr("Proxy Port")); proxyPort.setSettingsKey("Copilot.ProxyPort"); - proxyPort.setLabelText(Tr::tr("Proxy port")); + proxyPort.setLabelText(Tr::tr("Proxy port:")); proxyPort.setDefaultValue(3128); proxyPort.setToolTip(Tr::tr("The port of the proxy server.")); proxyPort.setRange(1, 65535); @@ -120,7 +120,7 @@ CopilotSettings::CopilotSettings() proxyUser.setDisplayName(Tr::tr("Proxy User")); proxyUser.setDisplayStyle(StringAspect::LineEditDisplay); proxyUser.setSettingsKey("Copilot.ProxyUser"); - proxyUser.setLabelText(Tr::tr("Proxy user")); + proxyUser.setLabelText(Tr::tr("Proxy user:")); proxyUser.setDefaultValue(""); proxyUser.setToolTip(Tr::tr("The user name to access the proxy server.")); proxyUser.setHistoryCompleter("Copilot.ProxyUser.History"); @@ -135,7 +135,7 @@ CopilotSettings::CopilotSettings() proxyPassword.setDisplayName(Tr::tr("Proxy Password")); proxyPassword.setDisplayStyle(StringAspect::PasswordLineEditDisplay); proxyPassword.setSettingsKey("Copilot.ProxyPassword"); - proxyPassword.setLabelText(Tr::tr("Proxy password")); + proxyPassword.setLabelText(Tr::tr("Proxy password:")); proxyPassword.setDefaultValue(""); proxyPassword.setToolTip(Tr::tr("The password for the proxy server.")); @@ -144,7 +144,7 @@ CopilotSettings::CopilotSettings() proxyRejectUnauthorized.setLabelText(Tr::tr("Reject unauthorized")); proxyRejectUnauthorized.setDefaultValue(true); proxyRejectUnauthorized.setToolTip(Tr::tr("Reject unauthorized certificates from the proxy " - "server. This is a security risk.")); + "server. Turning this off is a security risk.")); initEnableAspect(enableCopilot); From e51b378ac989bede498a5b445d7ca84cb9b02ea2 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 18 Oct 2023 15:18:10 +0200 Subject: [PATCH 33/86] Core/Tr: Fix menu bar action It is "menu bar", and use placeholder for shortcut instead of concatenation. Change-Id: I60094a5fac3893663180f7ef573b6dece7670111 Reviewed-by: Jarek Kobus Reviewed-by: Leena Miettinen --- dist/changelog/changes-12.0.0.md | 2 +- .../creator-how-to-show-and-hide-main-menu.qdoc | 2 +- src/plugins/coreplugin/icore.cpp | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dist/changelog/changes-12.0.0.md b/dist/changelog/changes-12.0.0.md index 53ad7d575f1..b26621ddf2e 100644 --- a/dist/changelog/changes-12.0.0.md +++ b/dist/changelog/changes-12.0.0.md @@ -67,7 +67,7 @@ General used for the file system index locator filter ([QTCREATORBUG-27789](https://bugreports.qt.io/browse/QTCREATORBUG-27789)) ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-editor-locator.html#locating-files-from-global-file-system-index)) -* Added the `View > Show Menubar` option to hide the menu bar on platforms +* Added the `View > Show Menu Bar` option to hide the menu bar on platforms without a unified menu bar ([QTCREATORBUG-29498](https://bugreports.qt.io/browse/QTCREATORBUG-29498)) ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-how-to-show-and-hide-main-menu.html)) diff --git a/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-main-menu.qdoc b/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-main-menu.qdoc index 4055f0b7d45..22d57b98c27 100644 --- a/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-main-menu.qdoc +++ b/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-main-menu.qdoc @@ -10,7 +10,7 @@ \title Show and hide the main menu On Linux and Windows, you can hide the main menu bar to save space on the - screen. Select \uicontrol View, and deselect the \uicontrol {Show Menubar} + screen. Select \uicontrol View, and deselect the \uicontrol {Show Menu Bar} check box. \image qtcreator-without-menubar.webp {Qt Creator without the main menu} diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index 4a73eb6e9eb..eaf94e45cf5 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -1858,19 +1858,19 @@ void ICorePrivate::registerDefaultActions() // Show Menubar Action if (globalMenuBar() && !globalMenuBar()->isNativeMenuBar()) { - m_toggleMenubarAction = new QAction(Tr::tr("Show Menubar"), this); + m_toggleMenubarAction = new QAction(Tr::tr("Show Menu Bar"), this); m_toggleMenubarAction->setCheckable(true); cmd = ActionManager::registerAction(m_toggleMenubarAction, Constants::TOGGLE_MENUBAR); cmd->setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Alt+M"))); connect(m_toggleMenubarAction, &QAction::toggled, this, [cmd](bool visible) { if (!visible) { - CheckableMessageBox::information( - Core::ICore::dialogParent(), - Tr::tr("Hide Menubar"), - Tr::tr( - "This will hide the menu bar completely. You can show it again by typing ") - + cmd->keySequence().toString(QKeySequence::NativeText), - Key("ToogleMenuBarHint")); + CheckableMessageBox::information(Core::ICore::dialogParent(), + Tr::tr("Hide Menu Bar"), + Tr::tr("This will hide the menu bar completely. " + "You can show it again by typing %1.") + .arg(cmd->keySequence().toString( + QKeySequence::NativeText)), + Key("ToogleMenuBarHint")); } globalMenuBar()->setVisible(visible); }); From 81898c675cb554490e38478b4e33e32c0a63038e Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 17 Oct 2023 16:19:40 +0200 Subject: [PATCH 34/86] Doc: Add a \preferences macro and use it everywhere The macro can be used to show the path to Preferences on Windows, Linux, and macOS. The current value expands to: "Edit (or Qt Creator on macOS) > Preferences". We can now change this in one place if we so wish. Task-number: QTCREATORBUG-29734 Change-Id: I9afe4f7093dbcc8e62a2b18e1ae3f6f243bbb72b Reviewed-by: hjk Reviewed-by: Eike Ziller --- doc/config/macros.qdocconf | 1 + .../src/analyze/cpu-usage-analyzer.qdoc | 2 +- .../src/analyze/creator-axivion.qdoc | 2 +- .../creator-clang-static-analyzer.qdoc | 2 +- doc/qtcreator/src/analyze/creator-coco.qdoc | 4 +- .../src/analyze/creator-cppcheck.qdoc | 2 +- doc/qtcreator/src/analyze/creator-heob.qdoc | 2 +- .../analyze/creator-valgrind-overview.qdoc | 4 +- .../src/analyze/creator-valgrind.qdoc | 17 ++-- doc/qtcreator/src/android/androiddev.qdoc | 30 ++---- .../src/baremetal/creator-baremetal-dev.qdoc | 6 +- .../creator-projects-cmake-building.qdoc | 11 +-- .../cmake/creator-projects-cmake-presets.qdoc | 2 +- .../src/cmake/creator-projects-cmake.qdoc | 19 ++-- .../src/debugger/creator-debug-views.qdoc | 5 +- .../creator-debugger-settings.qdoc | 17 ++-- .../creator-only/creator-debugger-setup.qdoc | 6 +- .../creator-only/creator-debugger.qdoc | 94 +++++++++---------- .../src/debugger/qtquick-debugging.qdoc | 7 +- doc/qtcreator/src/docker/creator-docker.qdoc | 4 +- .../src/editors/creator-code-completion.qdoc | 8 +- .../src/editors/creator-code-indentation.qdoc | 10 +- .../src/editors/creator-code-refactoring.qdoc | 2 +- .../src/editors/creator-code-syntax.qdoc | 19 ++-- .../src/editors/creator-diff-editor.qdoc | 2 +- .../editors/creator-editors-options-text.qdoc | 21 ++--- .../src/editors/creator-editors-options.qdoc | 2 +- .../src/editors/creator-locator.qdoc | 6 +- .../creator-only/creator-beautifier.qdoc | 6 +- .../creator-only/creator-clang-codemodel.qdoc | 6 +- .../creator-only/creator-code-pasting.qdoc | 3 +- .../creator-coding-edit-mode.qdoc | 19 ++-- .../editors/creator-only/creator-copilot.qdoc | 6 +- .../editors/creator-only/creator-fakevim.qdoc | 24 ++--- .../creator-only/creator-language-server.qdoc | 26 +++-- .../creator-only/creator-mime-types.qdoc | 2 +- .../creator-preferences-cpp-code-style.qdoc | 2 +- .../creator-only/creator-preferences-nim.qdoc | 2 +- .../creator-text-editing-macros.qdoc | 6 +- ...ator-preferences-text-editor-behavior.qdoc | 6 +- .../src/editors/creator-quick-fixes.qdoc | 5 +- doc/qtcreator/src/editors/creator-search.qdoc | 10 +- .../creator-semantic-highlighting.qdoc | 23 ++--- .../src/howto/creator-external-tools.qdoc | 4 +- doc/qtcreator/src/howto/creator-help.qdoc | 34 ++++--- .../creator-how-to-set-high-dpi-scaling.qdoc | 2 +- .../creator-how-to-switch-ui-themes.qdoc | 2 +- .../src/howto/creator-keyboard-shortcuts.qdoc | 23 ++--- .../howto/creator-only/creator-autotest.qdoc | 32 +++---- .../creator-how-to-document-code.qdoc | 2 +- .../creator-how-to-record-screens.qdoc | 3 +- .../howto/creator-only/creator-how-tos.qdoc | 19 ++-- .../howto/creator-only/creator-squish.qdoc | 2 +- .../src/howto/creator-only/creator-vcpkg.qdoc | 8 +- .../src/howto/creator-only/qtcreator-faq.qdoc | 10 +- .../src/howto/creator-telemetry.qdoc | 2 +- doc/qtcreator/src/linux-mobile/b2qtdev.qdoc | 22 ++--- .../src/linux-mobile/linuxdev-keys.qdocinc | 6 +- .../linux-mobile/linuxdev-processes.qdocinc | 2 +- doc/qtcreator/src/linux-mobile/linuxdev.qdoc | 10 +- doc/qtcreator/src/mcu/creator-mcu-dev.qdoc | 11 +-- .../src/meson/creator-projects-meson.qdoc | 4 +- .../creator-only/creator-configuring.qdoc | 35 ++++--- .../creator-only/creator-glossary.qdoc | 2 +- .../overview/creator-only/creator-issues.qdoc | 2 +- .../creator-supported-platforms.qdoc | 3 +- .../creator-build-settings-qmake.qdoc | 17 ++-- .../creator-custom-output-parser.qdoc | 8 +- .../creator-only/creator-files-creating.qdoc | 4 +- .../creator-how-to-edit-qbs-profiles.qdoc | 6 +- .../creator-how-to-select-build-systems.qdoc | 4 +- .../creator-projects-building.qdoc | 11 +-- .../creator-projects-builds-customizing.qdoc | 3 +- .../creator-projects-compilers.qdoc | 27 +++--- .../creator-projects-creating.qdoc | 6 +- .../creator-projects-custom-wizards.qdoc | 5 +- .../creator-projects-debuggers.qdoc | 5 +- .../creator-only/creator-projects-kits.qdoc | 4 +- .../creator-only/creator-projects-nimble.qdoc | 2 +- .../creator-projects-opening.qdoc | 7 +- .../creator-only/creator-projects-qbs.qdoc | 8 +- .../creator-projects-qt-versions.qdoc | 14 ++- ...creator-projects-settings-environment.qdoc | 2 +- .../creator-projects-settings-overview.qdoc | 2 +- ...ator-projects-settings-run-analyze.qdocinc | 4 +- ...ator-projects-settings-run-desktop.qdocinc | 11 +-- .../creator-projects-settings-run.qdoc | 2 +- .../projects/creator-projects-running.qdoc | 2 +- .../python/creator-python-development.qdoc | 3 +- .../src/qnx/creator-developing-qnx.qdoc | 2 +- .../creator-only/qtquick-creating.qdoc | 12 +-- ...uick-tutorial-create-empty-project.qdocinc | 6 +- ...reator-preferences-qtquick-code-style.qdoc | 3 +- .../src/qtquick/qtquick-profiler.qdoc | 2 +- .../src/qtquick/qtquick-toolbars.qdoc | 2 +- .../creator-file-system-view.qdoc | 13 ++- .../creator-how-to-view-output.qdoc | 4 +- .../creator-reference-terminal-view.qdoc | 15 ++- .../creator-reference-to-do-entries-view.qdoc | 2 +- .../creator-open-documents-view.qdoc | 3 +- .../user-interface/creator-projects-view.qdoc | 15 ++- .../creator-reference-output-views.qdoc | 12 +-- .../src/user-interface/creator-ui.qdoc | 2 +- .../vcs/creator-only/creator-vcs-bazaar.qdoc | 2 +- .../creator-only/creator-vcs-clearcase.qdoc | 23 +++-- .../src/vcs/creator-only/creator-vcs-cvs.qdoc | 2 +- .../vcs/creator-only/creator-vcs-fossil.qdoc | 4 +- .../vcs/creator-only/creator-vcs-gitlab.qdoc | 4 +- .../creator-only/creator-vcs-mercurial.qdoc | 4 +- .../creator-only/creator-vcs-perforce.qdoc | 8 +- .../creator-only/creator-vcs-preferences.qdoc | 6 +- .../creator-only/creator-vcs-subversion.qdoc | 5 +- doc/qtcreator/src/vcs/creator-vcs-git.qdoc | 29 +++--- .../src/webassembly/creator-webassembly.qdoc | 8 +- .../src/widgets/qtdesigner-overview.qdoc | 4 +- 115 files changed, 467 insertions(+), 575 deletions(-) diff --git a/doc/config/macros.qdocconf b/doc/config/macros.qdocconf index f806b1dff18..f70ce0c3926 100644 --- a/doc/config/macros.qdocconf +++ b/doc/config/macros.qdocconf @@ -39,6 +39,7 @@ macro.QOI = "Qt Online Installer" macro.QMT = "Qt Maintenance Tool" macro.qtcversion = $QTC_VERSION macro.param = "\\e" +macro.preferences = "\\uicontrol Edit (or \\uicontrol {\\QC} on \\macos) > \\uicontrol Preferences" macro.raisedaster.HTML = "*" macro.rarrow.HTML = "→" macro.reg.HTML = "®" diff --git a/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc b/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc index ddcdd551ca4..07dd1128a17 100644 --- a/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc +++ b/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc @@ -104,7 +104,7 @@ \section1 Specifying Performance Analyzer Settings To specify global settings for the Performance Analyzer, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Analyzer > + \preferences > \uicontrol Analyzer > \uicontrol {CPU Usage}. For each run configuration, you can also use specialized settings. Select \uicontrol Projects > \uicontrol Run, and then select \uicontrol Details next to diff --git a/doc/qtcreator/src/analyze/creator-axivion.qdoc b/doc/qtcreator/src/analyze/creator-axivion.qdoc index 244991c7834..610fee09b3f 100644 --- a/doc/qtcreator/src/analyze/creator-axivion.qdoc +++ b/doc/qtcreator/src/analyze/creator-axivion.qdoc @@ -59,7 +59,7 @@ To connect to Axivion: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Axivion. + \li Select \preferences > \uicontrol Axivion. \image qtcreator-preferences-axivion.webp {General tab in Axivion Preferences} \li Select \uicontrol Edit to create a connection to the Axivion dashboard server. diff --git a/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc b/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc index 06f5e6275b7..ea2f73b844d 100644 --- a/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc +++ b/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc @@ -111,7 +111,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Analyzer > + \li Select \preferences > \uicontrol Analyzer > \uicontrol {Clang Tools}. \image qtcreator-clang-tools-options.png {Clang Tools preferences} diff --git a/doc/qtcreator/src/analyze/creator-coco.qdoc b/doc/qtcreator/src/analyze/creator-coco.qdoc index 0818e9a5b92..b95c1901fb8 100644 --- a/doc/qtcreator/src/analyze/creator-coco.qdoc +++ b/doc/qtcreator/src/analyze/creator-coco.qdoc @@ -75,8 +75,8 @@ \section1 Changing Fonts and Colors - To change the default fonts and colors, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol {Font & Colors}. + To change the default fonts and colors, select \preferences > + \uicontrol {Text Editor} > \uicontrol {Font & Colors}. Create your own color scheme and select new fonts and colors for the following results: diff --git a/doc/qtcreator/src/analyze/creator-cppcheck.qdoc b/doc/qtcreator/src/analyze/creator-cppcheck.qdoc index a77c8dfe7f9..324f747da47 100644 --- a/doc/qtcreator/src/analyze/creator-cppcheck.qdoc +++ b/doc/qtcreator/src/analyze/creator-cppcheck.qdoc @@ -72,6 +72,6 @@ marks or annotations. To specify the settings above for the automatically run checks, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol Analyzer + select \preferences > \uicontrol Analyzer > \uicontrol Cppcheck. */ diff --git a/doc/qtcreator/src/analyze/creator-heob.qdoc b/doc/qtcreator/src/analyze/creator-heob.qdoc index 3fbd2d62285..449d3cc86ab 100644 --- a/doc/qtcreator/src/analyze/creator-heob.qdoc +++ b/doc/qtcreator/src/analyze/creator-heob.qdoc @@ -92,7 +92,7 @@ In the \uicontrol {Handle exceptions} list, select \uicontrol Off to use the standard exception handler and have the debugger automatically attached if the application crashes. This works only if you register \QC is as a - post-mortem debugger by selecting \uicontrol Edit > \uicontrol Preferences > + post-mortem debugger by selecting \preferences > \uicontrol Debugger > \uicontrol General > \uicontrol {Use Qt Creator for post-mortem debugging}. diff --git a/doc/qtcreator/src/analyze/creator-valgrind-overview.qdoc b/doc/qtcreator/src/analyze/creator-valgrind-overview.qdoc index 9a2f914648f..bd3d21f7516 100644 --- a/doc/qtcreator/src/analyze/creator-valgrind-overview.qdoc +++ b/doc/qtcreator/src/analyze/creator-valgrind-overview.qdoc @@ -36,8 +36,8 @@ For more information about analyzing applications for which you do not have a project, see \l{Running Valgrind Tools on External Applications}. - To set preferences for the Valgrind tools, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Analyzer. You can override the general + To set preferences for the Valgrind tools, select \preferences > + \uicontrol Analyzer. You can override the general settings for each project in the \uicontrol {Run Settings} for the project. The following sections describe how to use the Valgrind tools: diff --git a/doc/qtcreator/src/analyze/creator-valgrind.qdoc b/doc/qtcreator/src/analyze/creator-valgrind.qdoc index 9ccfa45c409..537f1acfea6 100644 --- a/doc/qtcreator/src/analyze/creator-valgrind.qdoc +++ b/doc/qtcreator/src/analyze/creator-valgrind.qdoc @@ -81,18 +81,17 @@ separately for each project in the \l{Specifying Run Settings}{run settings} of the project. - To specify global settings for Valgrind, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Analyzer. The \uicontrol - {Memcheck Memory Analysis Options} group has Memcheck options. + To specify global settings for Valgrind, select \preferences > + \uicontrol Analyzer. The \uicontrol {Memcheck Memory Analysis Options} + group has Memcheck options. In \uicontrol {Extra Memcheck arguments}, specify additional arguments for launching the executable. Stack traces can get quite large and confusing, and therefore, reading them from the bottom up can help. If the stack trace is not big enough or it is - too big, select \uicontrol Edit > \uicontrol Preferences > \uicontrol Analyzer - and define the length of the stack trace in the - \uicontrol {Backtrace frame count} field. + too big, select \preferences > \uicontrol Analyzer and define the length of + the stack trace in the \uicontrol {Backtrace frame count} field. \image qtcreator-valgrind-memcheck-options.png "Memory Analysis options" @@ -268,9 +267,9 @@ separately for each project in the \l{Specifying Run Settings}{run settings} of the project. - To specify global settings for Valgrind, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Analyzer. The \uicontrol - {Callgrind Profiling Options} group has Callgrind options. + To specify global settings for Valgrind, select \preferences > + \uicontrol Analyzer. The \uicontrol {Callgrind Profiling Options} + group has Callgrind options. \image qtcreator-valgrind-callgrind-options.png "Valgrind options" diff --git a/doc/qtcreator/src/android/androiddev.qdoc b/doc/qtcreator/src/android/androiddev.qdoc index d16d9a31fd3..c16c80d4e70 100644 --- a/doc/qtcreator/src/android/androiddev.qdoc +++ b/doc/qtcreator/src/android/androiddev.qdoc @@ -55,10 +55,7 @@ To set up the development environment for Android: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices > - \uicontrol Android on Windows and Linux or \uicontrol {\QC} > - \uicontrol Preferences > \uicontrol Devices > \uicontrol Android on - \macos. + \li Select \preferences > \uicontrol Devices > \uicontrol Android. \image qtcreator-options-android-main.png {Android preferences} \li In the \uicontrol {JDK location} field, set the path to the JDK. \QC checks the JDK installation and reports errors. @@ -142,10 +139,8 @@ \section2 Managing Android NDK Packages - To view the installed \l{Android NDK} versions, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Devices > \uicontrol Android on Windows and - Linux or \uicontrol {\QC} > \uicontrol Preferences > \uicontrol Devices > - \uicontrol Android on \macos. + To view the installed \l{Android NDK} versions, select \preferences > + \uicontrol Devices > \uicontrol Android. \image qtcreator-options-android-sdk-tools.png {Android NDK and SDK checks} @@ -172,11 +167,8 @@ installing, updating, and removing SDK packages. You can still use \c sdkmanager for advanced SDK management. - To view the installed Android SDK packages, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Devices > \uicontrol Android > - \uicontrol {SDK Manager} on Windows and Linux or \uicontrol {\QC} > - \uicontrol Preferences > \uicontrol Devices > \uicontrol Android > - \uicontrol {SDK Manager} on \macos. + To view the installed Android SDK packages, select \preferences > + \uicontrol Devices > \uicontrol Android > \uicontrol {SDK Manager}. \image qtcreator-android-sdk-manager.webp {Android SDK Manager} @@ -200,10 +192,8 @@ \section1 Managing Android Virtual Devices (AVD) - To view the available AVDs, select \uicontrol Edit > \uicontrol Preferences - > \uicontrol Devices on Windows and Linux or \uicontrol {\QC} > - \uicontrol Preferences > \uicontrol Devices > on \macos. You can add more - AVDs. + To view the available AVDs, select \preferences > \uicontrol Devices. + You can add more AVDs. \image qtcreator-android-avd-manager.png {Android device in Devices} @@ -239,10 +229,8 @@ To create new virtual devices: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices > - \uicontrol Add > \uicontrol {Android Device} on Windows and Linux - or \uicontrol {\QC} > \uicontrol Preferences > \uicontrol Devices > - \uicontrol Add > \uicontrol {Android Device} on \macos to open the + \li Select \preferences > \uicontrol Devices > + \uicontrol Add > \uicontrol {Android Device} to open the \uicontrol {Create New AVD} dialog. \image qtcreator-android-create-avd.png {Create New AVD dialog} \li Set the name, definition, architecture, target API level, and diff --git a/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc b/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc index 45740b650dc..d49d947ff34 100644 --- a/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc +++ b/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc @@ -70,7 +70,7 @@ \section1 Specifying Settings for Debug Server Providers To create connections to bare metal devices using a debug server provider, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices + select \preferences > \uicontrol Devices > \uicontrol {Bare Metal} > \uicontrol Add > \uicontrol Default. The available settings depend on the debug server provider. @@ -251,7 +251,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices + \li Select \preferences > \uicontrol Devices > \uicontrol Add > \uicontrol {Bare Metal Device} > \uicontrol {Start Wizard}. @@ -265,7 +265,7 @@ \section1 Building for and Running on Bare Metal Devices To add a kit for building applications and running them on bare metal - devices, select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits + devices, select \preferences > \uicontrol Kits > \uicontrol Add. For more information, see \l{Add kits}. \image qtcreator-baremetal-kit.png "Kit preferences for Bare Metal" diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc index 2c302e5fcc5..2ef8d2e107c 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc @@ -137,9 +137,8 @@ To view all variables, select the \uicontrol Advanced check box. - To view all variables by default, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol CMake > \uicontrol General > - \uicontrol {Show advanced options by default}. + To view all variables by default, select \preferences > \uicontrol CMake > + \uicontrol General > \uicontrol {Show advanced options by default}. \image qtcreator-preferences-cmake-general.webp "General tab in CMake Preferences" @@ -152,8 +151,8 @@ stored in the CMakeLists.txt.user file, so deleting a build directory does not delete the initial configuration. - To be asked before \QC resets the changes, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol CMake > \uicontrol General > + To be asked before \QC resets the changes, select \preferences > + \uicontrol CMake > \uicontrol General > \uicontrol {Ask before re-configuring with initial parameters}. \section1 Viewing CMake Output @@ -230,7 +229,7 @@ \QC can automatically set up the \l {Setting Up Conan} {Conan package manager} for use with CMake. - Select \uicontrol Edit > \uicontrol Preferences > \uicontrol CMake + Select \preferences > \uicontrol CMake \uicontrol General > \uicontrol {Package manager auto setup} to set the value of the \c CMAKE_PROJECT_INCLUDE_BEFORE variable to the path to a CMake script that installs dependencies from a \c conanfile.txt, diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake-presets.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake-presets.qdoc index 12b5d61ba7b..3a51034199e 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake-presets.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake-presets.qdoc @@ -141,7 +141,7 @@ \endcode This example assumes that the CMake executable path is set in - \uicontrol Edit > \uicontrol Preferences > \uicontrol CMake > + \preferences > \uicontrol CMake > \uicontrol Tools. \section1 MSVC Example diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc index 4491afb9d72..999d58c67bc 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc @@ -39,9 +39,8 @@ \QC automatically runs CMake to refresh project information when you edit a \c CMakeLists.txt configuration file in a project. Project information is also automatically refreshed when you build the project. To disable this - behavior, select \uicontrol Edit > \uicontrol Preferences > \uicontrol CMake - > \uicontrol General, and then deselect the \uicontrol {Autorun CMake} - check box. + behavior, select \preferences > \uicontrol CMake > \uicontrol General, and + then deselect the \uicontrol {Autorun CMake} check box. \image qtcreator-projects-view-edit.png {CMake project in Projects view} @@ -54,8 +53,8 @@ The \uicontrol Projects view shows the names of the subfolders where the source files are located. To hide the subfolder names and arrange the files - only according to their source group, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol CMake > \uicontrol General, and then + only according to their source group, select \preferences > + \uicontrol CMake > \uicontrol General, and then deselect the \uicontrol {Show subfolders inside source group folders} check box. The change takes effect after you select \uicontrol Build > \uicontrol {Run CMake}. @@ -89,8 +88,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol CMake > - \uicontrol Tools. + \li Select \preferences > \uicontrol CMake > \uicontrol Tools. \image qtcreator-preferences-cmake-tools.webp {Tools tab in CMake Preferences} @@ -118,8 +116,8 @@ To remove the selected CMake executable from the list, select \uicontrol Remove. - To add the CMake tool to a build and run kit, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Kits. + To add the CMake tool to a build and run kit, select \preferences > + \uicontrol Kits. The kit also specifies the CMake generator that is used for producing project files for \QC and the initial configuration parameters: @@ -169,8 +167,7 @@ To automatically format CMake files upon file save: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol CMake > - \uicontrol Formatter. + \li Select \preferences > \uicontrol CMake > \uicontrol Formatter. \image qtcreator-preferences-cmake-formatter.webp {Formatter tab in CMake Preferences} \li In \uicontrol {CMakeFormat command}, enter the path to \c {cmake-format.exe}. diff --git a/doc/qtcreator/src/debugger/creator-debug-views.qdoc b/doc/qtcreator/src/debugger/creator-debug-views.qdoc index 8dfed8b2212..149ac127a8c 100644 --- a/doc/qtcreator/src/debugger/creator-debug-views.qdoc +++ b/doc/qtcreator/src/debugger/creator-debug-views.qdoc @@ -218,9 +218,8 @@ \if defined(qtcreator) \section1 Specifying Breakpoint Settings - You can specify settings for breakpoints in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Debugger. For more information, - see \l{Debugger Preferences}. + You can specify settings for breakpoints in \preferences > + \uicontrol Debugger. For more information, see \l{Debugger Preferences}. \image qtcreator-debugger-general-options.png {General tab in Debugger preferences} diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger-settings.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger-settings.qdoc index ab0aff0f548..06b8d05bc52 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger-settings.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger-settings.qdoc @@ -8,9 +8,9 @@ \title Debugger Preferences - To specify settings for managing debugger processes, select \uicontrol Edit - > \uicontrol Preferences > \uicontrol Debugger. In the \uicontrol General tab, - you can specify settings that are common to all debuggers. + To specify settings for managing debugger processes, select \preferences > + \uicontrol Debugger. In the \uicontrol General tab,you can specify settings + that are common to all debuggers. \image qtcreator-debugger-general-options.png "Debugger General preferences" @@ -50,8 +50,8 @@ \section1 Specifying GDB Settings - To specify settings for managing the GDB process, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Debugger > \uicontrol GDB. + To specify settings for managing the GDB process, select \preferences > + \uicontrol Debugger > \uicontrol GDB. \image qtcreator-gdb-options.png "GDB preferences" @@ -136,8 +136,8 @@ \section1 Specifying CDB Settings - To specify settings for managing the CDB process, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Debugger > \uicontrol CDB. + To specify settings for managing the CDB process, select \preferences > + \uicontrol Debugger > \uicontrol CDB. \image qtcreator-cdb-options.png "CDB preferences" @@ -187,8 +187,7 @@ to the symbol search path of the debugger: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > - \uicontrol {CDB Paths}. + \li Select \preferences > \uicontrol Debugger > \uicontrol {CDB Paths}. \image qtcreator-debugger-cdb-paths.png \li In the \uicontrol {Symbol Paths} group, select \uicontrol Insert. \li Select the directory where you want to store the cached information. diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger-setup.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger-setup.qdoc index 3de58c59ebc..39fd8013715 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger-setup.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger-setup.qdoc @@ -18,7 +18,7 @@ The main debugger preferences are associated with the \l{Kits}{kit} you build and run your project with. To specify the debugger and compiler to use for each kit, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits. + \preferences > \uicontrol Kits. \image qtcreator-kits.png {Kits preferences} @@ -30,13 +30,13 @@ installed replacement instead. To change the debugger in an automatically detected kit, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \preferences > \uicontrol Kits > \uicontrol Clone to create a copy of the kit, and change the parameters in the cloned kit. Make sure to enable the cloned kit for your project. If the debugger you want to use is not automatically detected, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \preferences > \uicontrol Kits > \uicontrol Debuggers > \uicontrol Add to add it. \image qtcreator-preferences-kits-debuggers.webp {Debuggers tab in Kits preferences} diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc index 1c1f64d419c..fe61cd19eae 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc @@ -133,19 +133,18 @@ \QC checks whether the compiled application is up-to-date, and rebuilds and deploys it if you set the \uicontrol {Build before deploying} field to - build the whole project or the application to run and select he - \uicontrol {Always deploy before running} check box in - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Build & Run} > - \uicontrol General. To debug the application without deploying - it, select \uicontrol Debug > \uicontrol {Start Debugging} > - \uicontrol {Start Debugging Without Deployment}. + build the whole project or the application to run and select the + \uicontrol {Always deploy before running} check box in \preferences > + \uicontrol {Build & Run} > \uicontrol General. To debug the application + without deploying it, select \uicontrol Debug > \uicontrol {Start Debugging} + > \uicontrol {Start Debugging Without Deployment}. The debugger then takes over and starts the application with suitable parameters. When using GDB or CDB as debug backend, you can specify additional commands to execute before and after the backend and debugged application are started or - attached in \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > + attached in \preferences > \uicontrol Debugger > \uicontrol GDB and \uicontrol CDB. For more information, see \l{Debugger Preferences}. @@ -210,7 +209,7 @@ If a console application does not start up properly in the configured console and the subsequent attach fails, you can diagnose the issue by - using CDB's native console. Select \uicontrol Edit > \uicontrol Preferences > + using CDB's native console. Select \preferences > \uicontrol Debugger > \uicontrol CDB > \uicontrol {Use CDB console} to override the console set in the Windows system environment variables. Note that the native console does not prompt on application exit. @@ -364,7 +363,7 @@ The \QC installation program asks you whether you want to register \QC as a post-mortem debugger. To change the setting, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > + \preferences > \uicontrol Debugger > \uicontrol General > \uicontrol {Use \QC for post-mortem debugging}. You can launch the debugger in the post-mortem mode if an application @@ -487,7 +486,7 @@ By default, a non-responsive GDB process is terminated after 20 seconds. To increase the timeout in the \uicontrol {GDB timeout} field, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > + \preferences > \uicontrol Debugger > \uicontrol GDB. For more information about settings that you can specify to manage the GDB process, see \l{Specifying GDB Settings}. @@ -560,9 +559,9 @@ \endlist - To specify settings for managing the CDB process, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Debugger > \uicontrol CDB. For more - information, see \l{Specifying CDB Settings}. + To specify settings for managing the CDB process, select \preferences > + \uicontrol Debugger > \uicontrol CDB. For more information, see + \l{Specifying CDB Settings}. */ @@ -706,8 +705,7 @@ \section1 Customizing Debug Views To change the appearance and behavior of the debug views, set preferences - in \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > - \uicontrol General. + in \preferences > \uicontrol Debugger > \uicontrol General. \image qtcreator-debugger-general-options.png {General tab in Debugger preferences} @@ -800,8 +798,8 @@ select \uicontrol {Close Editor Tooltips} in the context menu in the \uicontrol Locals or \uicontrol Expressions view. - To disable tooltips for performance reasons, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Debugger > \uicontrol General > + To disable tooltips for performance reasons, select \preferences > + \uicontrol Debugger > \uicontrol General > \uicontrol {Use tooltips in main editor when debugging}. \section1 Examining Complex Values in Debug Views @@ -848,9 +846,8 @@ classes in a useful way. To change the number of array elements that are - requested when expanding entries, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Debugger} > - \uicontrol {Locals & Expressions} > \uicontrol {Default array size}. + requested when expanding entries, select \preferences > \uicontrol {Debugger} + > \uicontrol {Locals & Expressions} > \uicontrol {Default array size}. \section1 Stepping Through Code @@ -948,9 +945,8 @@ value display format. The available options depend on the type of the current items, and are provided by the debugging helpers. - To force a plain C-like display of structures, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > - \uicontrol {Locals & Expressions}, and then deselect the + To force a plain C-like display of structures, select \preferences > + \uicontrol Debugger > \uicontrol {Locals & Expressions}, and then deselect the \uicontrol {Use Debugging Helpers} check box. This still uses the Python scripts, but generates more basic output. To force the plain display for a single object or for all objects of a given type, select @@ -990,9 +986,8 @@ If an instance of a class is derived from QObject, you can find all other objects connected to this object's slots with Qt's signals and slots - mechanism. Select \uicontrol Edit > \uicontrol Preferences - > \uicontrol {Debugger} > \uicontrol {Locals & Expressions} > - \uicontrol {Use Debugging Helpers}. + mechanism. Select \preferences > \uicontrol {Debugger} > + \uicontrol {Locals & Expressions} > \uicontrol {Use Debugging Helpers}. \image qtcreator-debugging-helper-options.webp {Locals & Expressions preferences} @@ -1006,9 +1001,8 @@ switch off the debugging helpers to make low-level structures visible. To switch off the debugging helpers, deselect - \uicontrol {Use Debugging Helpers} in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Debugger > - \uicontrol {Locals & Expressions}. + \uicontrol {Use Debugging Helpers} in \preferences > + \uicontrol Debugger > \uicontrol {Locals & Expressions}. \omit \section2 Creating Snapshots @@ -1112,8 +1106,8 @@ When using CDB as debug backend, you can specify that the debugger should break when application modules are loaded or unloaded. To enable breaking - for the specified modules, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Debugger > \uicontrol CDB. + for the specified modules, select \preferences > \uicontrol Debugger > + \uicontrol CDB. \image qtcreator-cdb-options.png {CDB tab in Debugger preferences} @@ -1150,8 +1144,7 @@ To enable the debugger to step into the code and display the source code when using a copy of the source tree at a location different from the one at which the libraries were built, you can map source paths to target - paths in \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > - \uicontrol General: + paths in \preferences > \uicontrol Debugger > \uicontrol General: \image qtcreator-debugger-general-options.png {General tab in Debugger preferences} @@ -1264,8 +1257,8 @@ \image qtcreator-debugger-log-view.webp {Debugger Log view} - If debug output is sent to the system log, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Debugger > \uicontrol General > + If debug output is sent to the system log, select \preferences > + \uicontrol Debugger > \uicontrol General > \uicontrol {Force logging to console} check box. Right-click the view to select the following actions: @@ -1315,7 +1308,7 @@ \image qtcreator-debugger-disassembler-view.webp {Disassembler view} By default, GDB shows AT&T style disassembly. To switch to the Intel style, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > + select \preferences > \uicontrol Debugger > \uicontrol GDB > \uicontrol {Use Intel style disassembly}. To open the \uicontrol Disassembler view: @@ -1371,7 +1364,7 @@ least one of the three supported backends is available. To use the default GDB pretty printers installed in your system or linked - to the libraries your application uses, select \uicontrol Preferences > + to the libraries your application uses, select \preferences > \uicontrol Debugger > \uicontrol GDB > \uicontrol {Load system GDB pretty printers}. For more information, see \l{Specifying GDB Settings}. @@ -1381,9 +1374,9 @@ You can have commands executed after built-in debugging helpers have been loaded and fully initialized. To load additional debugging helpers or - modify existing ones, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Debugger > \uicontrol {Locals & Expressions}, and enter the - commands in the \uicontrol {Debugging Helper Customization} field. + modify existing ones, select \preferences > \uicontrol Debugger > + \uicontrol {Locals & Expressions}, and enter the commands in the + \uicontrol {Debugging Helper Customization} field. \image qtcreator-debugging-helper-options.webp {Locals & Expressions preferences} @@ -1403,9 +1396,8 @@ \endcode To display a message box as soon as your application receives a signal - during debugging, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Debugger > \uicontrol GDB > \uicontrol {Show a message box - when receiving a signal}. + during debugging, select \preferences > \uicontrol Debugger > \uicontrol GDB > + \uicontrol {Show a message box when receiving a signal}. \section2 Adding Custom Debugging Helpers @@ -1416,8 +1408,8 @@ To add debugging helpers for custom types, add debugging helper implementations to the startup file of the native debuggers (for example, \c{~/.gdbinit} or \c{~/.lldbinit}) or specify them directly in the - \uicontrol {Additional Startup Commands} in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Debugger > \uicontrol GDB. + \uicontrol {Additional Startup Commands} in \preferences > + \uicontrol Debugger > \uicontrol GDB. To get started with implementing debugging helpers for your own data types, you can put their implementation into the file @@ -1450,9 +1442,8 @@ update your \QC installation (when updating your Qt installation, for example), copy it to a safe location outside the \QC installation in your file system and specify the location in - \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > - \uicontrol {Locals & Expressions} > - \uicontrol {Extra Debugging Helper}. + \preferences > \uicontrol Debugger > \uicontrol {Locals & Expressions} + > \uicontrol {Extra Debugging Helper}. \endlist The custom debugging helpers will be automatically picked up from @@ -1593,7 +1584,7 @@ common situations. When using CDB as debugger backend, you can enable the Python dumper by - selecting \uicontrol Edit > \uicontrol Preferences > \uicontrol Debugger > + selecting \preferences > \uicontrol Debugger > \uicontrol CDB > \uicontrol {Use Python dumper}. \image qtcreator-cdb-options.png {CDB preferences} @@ -2042,9 +2033,8 @@ When using GDB as backend, you can automatically save a copy of its symbol index in a cache on disk and retrieve it from there - when loading the same binary in the future. Select \uicontrol Edit - > \uicontrol Preferences > \uicontrol Debugger > \uicontrol GDB > - \uicontrol {Use automatic symbol cache}. + when loading the same binary in the future. Select \preferences > + \uicontrol Debugger > \uicontrol GDB > \uicontrol {Use automatic symbol cache}. \image qtcreator-gdb-options.png {GDB preferences} diff --git a/doc/qtcreator/src/debugger/qtquick-debugging.qdoc b/doc/qtcreator/src/debugger/qtquick-debugging.qdoc index 739095b5a03..29589073f9a 100644 --- a/doc/qtcreator/src/debugger/qtquick-debugging.qdoc +++ b/doc/qtcreator/src/debugger/qtquick-debugging.qdoc @@ -91,9 +91,8 @@ \section2 Using Default Values - You can enable or disable QML debugging globally in \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Build & Run} > - \uicontrol {Default Build Properties}. + You can enable or disable QML debugging globally in \preferences > + \uicontrol {Build & Run} > \uicontrol {Default Build Properties}. \image qtcreator-build-settings-default.png "Default Build Properties tab in Build & Run Preferences" @@ -120,7 +119,7 @@ \QC, it will be kept as you want it. There are some known issues in the interaction between the global setting - in \uicontrol Edit > \uicontrol Preferences > \uicontrol {Build & Run} > + in \preferences > \uicontrol {Build & Run} > \uicontrol {Default Build Properties} and the build configuration. For example, for qmake the global setting only affects build configurations that are automatically created when enabling a kit. Also, CMake ignores the diff --git a/doc/qtcreator/src/docker/creator-docker.qdoc b/doc/qtcreator/src/docker/creator-docker.qdoc index c109aca5f94..ae1dced8cea 100644 --- a/doc/qtcreator/src/docker/creator-docker.qdoc +++ b/doc/qtcreator/src/docker/creator-docker.qdoc @@ -33,7 +33,7 @@ To add a Docker image as a device: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices + \li Select \preferences > \uicontrol Devices > \uicontrol Docker and enter the path to the Docker CLI in the \uicontrol Command field. \image qtcreator-preferences-devices-docker.webp "Docker tab in Devices preferences" @@ -145,7 +145,7 @@ \section1 Editing Docker Device Kits - Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits to check + Select \preferences > \uicontrol Kits to check that the automatically generated kits point to the appropriate kit items. To specify build settings: diff --git a/doc/qtcreator/src/editors/creator-code-completion.qdoc b/doc/qtcreator/src/editors/creator-code-completion.qdoc index 409855ab73d..b3d1830640b 100644 --- a/doc/qtcreator/src/editors/creator-code-completion.qdoc +++ b/doc/qtcreator/src/editors/creator-code-completion.qdoc @@ -28,8 +28,8 @@ \section1 Specifying Completion Settings - To specify settings for code completion, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol Completion. + To specify settings for code completion, select \preferences > + \uicontrol {Text Editor} > \uicontrol Completion. \image qtcreator-preferences-texteditor-completion.webp "Text Editor Completion preferences" @@ -153,7 +153,7 @@ Code snippets specify code constructs. You can add, modify, and remove snippets in the snippet editor. To open the editor, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + \preferences > \uicontrol {Text Editor} > \uicontrol Snippets. \if defined(qtcreator) @@ -296,7 +296,7 @@ completion. To use Nimsuggest, you must install it on the development PC. Then select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Nim > \uicontrol Tools, + \preferences > \uicontrol Nim > \uicontrol Tools, and enter the path to the tool executable in the \uicontrol Path field. \sa {Document code} diff --git a/doc/qtcreator/src/editors/creator-code-indentation.qdoc b/doc/qtcreator/src/editors/creator-code-indentation.qdoc index aaf37d64b9c..6dcb32a4aa6 100644 --- a/doc/qtcreator/src/editors/creator-code-indentation.qdoc +++ b/doc/qtcreator/src/editors/creator-code-indentation.qdoc @@ -43,9 +43,9 @@ \section1 Automatically fix indentation To automatically fix indentation according to the indentation settings - when you save the file, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Text Editor} > \uicontrol Behavior > - \uicontrol {Clean whitespace} > \uicontrol {Clean indentation}. Select + when you save the file, select \preferences > \uicontrol {Text Editor} > + \uicontrol Behavior > \uicontrol {Clean whitespace} > + \uicontrol {Clean indentation}. Select the \uicontrol {Skip clean whitespace for file types} check box to exclude the specified file types. @@ -53,8 +53,8 @@ \section1 Show whitespace in editor - To visualize whitespace in the editor, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol Display > + To visualize whitespace in the editor, select \preferences > + \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Visualize whitespace}. To visualize indentation, select \uicontrol {Visualize Indent}. To adjust the diff --git a/doc/qtcreator/src/editors/creator-code-refactoring.qdoc b/doc/qtcreator/src/editors/creator-code-refactoring.qdoc index a9ff5a20b5e..37f45c5b259 100644 --- a/doc/qtcreator/src/editors/creator-code-refactoring.qdoc +++ b/doc/qtcreator/src/editors/creator-code-refactoring.qdoc @@ -22,7 +22,7 @@ \l{Applying Refactoring Actions}. By default, the refactored files are saved automatically. To disable - this feature, deselect \uicontrol Edit > \uicontrol Preferences > + this feature, deselect \preferences > \uicontrol Environment > \uicontrol System > \uicontrol {Auto-save files after refactoring}. \if defined(qtcreator) diff --git a/doc/qtcreator/src/editors/creator-code-syntax.qdoc b/doc/qtcreator/src/editors/creator-code-syntax.qdoc index 87203f8bd3a..15c4fa47229 100644 --- a/doc/qtcreator/src/editors/creator-code-syntax.qdoc +++ b/doc/qtcreator/src/editors/creator-code-syntax.qdoc @@ -39,7 +39,7 @@ of the line annotations. To modify the colors used for underlining errors and warnings, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + \preferences > \uicontrol {Text Editor} > \uicontrol {Font & Colors} > \uicontrol Copy, and select new colors for \uicontrol Error and \uicontrol Warning. @@ -55,7 +55,7 @@ \section1 Specifying Line Annotation Positions To specify the position where the annotations are displayed, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + \preferences > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Line annotations}, and then select whether to display the annotations directly next to the code, aligned to the right of the code, or in the right margin. Showing annotations @@ -701,9 +701,9 @@ \section1 Enabling and Disabling Messages - To enable and disable QML and JavaScript messages, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} - > \uicontrol {Use customized static analyzer}. + To enable and disable QML and JavaScript messages, select \preferences > + \uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} > + \uicontrol {Use customized static analyzer}. \image qtcreator-preferences-qtquick-qmljs-editing.webp {QML/JS Editing tab in Qt Quick preferences} @@ -739,8 +739,8 @@ \section1 Automatically Formatting QML/JS Files - To automatically format QML/JS files upon saving, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} > + To automatically format QML/JS files upon saving, select \preferences > + \uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} > \uicontrol {Enable auto format on file save}. To only format files that belong to the current project, select \uicontrol {Restrict to files contained in the current project}. @@ -763,9 +763,8 @@ This action expands all C++ macros to their actual code and removes code that is guarded by a currently inactive \c {#ifdef} statements. If you deselect the \uicontrol {Use built-in preprocessor to show pre-processed files} check - box in \uicontrol Edit > \uicontrol Preferences > \uicontrol C++ > - \uicontrol {Code Model}, this action also expands all - \c {"#include "} statements to their actual contents. + box in \preferences > \uicontrol C++ > \uicontrol {Code Model}, this action + also expands all \c {"#include "} statements to their actual contents. \image qtcreator-preferences-code-model.webp {C++ Code Model preferences} diff --git a/doc/qtcreator/src/editors/creator-diff-editor.qdoc b/doc/qtcreator/src/editors/creator-diff-editor.qdoc index 2cc78bbfbaf..92e25c5dcac 100644 --- a/doc/qtcreator/src/editors/creator-diff-editor.qdoc +++ b/doc/qtcreator/src/editors/creator-diff-editor.qdoc @@ -100,7 +100,7 @@ \section1 Changing the Colors - To change the default colors, select \uicontrol Edit > \uicontrol Preferences > + To change the default colors, select \preferences > \uicontrol {Text Editor} > \uicontrol {Font & Colors}. Create your own color scheme and select new colors for the following items: diff --git a/doc/qtcreator/src/editors/creator-editors-options-text.qdoc b/doc/qtcreator/src/editors/creator-editors-options-text.qdoc index e4779703627..a9352a5bc36 100644 --- a/doc/qtcreator/src/editors/creator-editors-options-text.qdoc +++ b/doc/qtcreator/src/editors/creator-editors-options-text.qdoc @@ -23,9 +23,8 @@ \endif Set the font preferences and apply color schemes for syntax highlighting, - diff editor, and code analysis results in \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > - \uicontrol {Font & Colors}. + diff editor, and code analysis results in \preferences > + \uicontrol {Text Editor} > \uicontrol {Font & Colors}. \image qtcreator-font-colors.png "Text editor preferences" @@ -35,9 +34,8 @@ percentage for viewing the text. You can also zoom in or out by pressing \key {Ctrl++} or \key {Ctrl+-}, or by pressing \key Ctrl and rolling the mouse button up or down. To disable the mouse wheel function, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > - \uicontrol Behavior and deselect the - \uicontrol {Enable scroll wheel zooming} check box. + \preferences > \uicontrol {Text Editor} > \uicontrol Behavior and deselect + the \uicontrol {Enable scroll wheel zooming} check box. To improve the readability of text in the editor, adjust the line spacing in the \uicontrol {Line spacing} field. @@ -55,9 +53,8 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Text Editor} > \uicontrol {Fonts & Color} > - \uicontrol Copy. + \li Select \preferences > \uicontrol {Text Editor} > + \uicontrol {Fonts & Color} > \uicontrol Copy. \li Enter a name for the color scheme and click \uicontrol OK. @@ -86,7 +83,7 @@ \section2 Exporting and Importing Color Schemes To share color schemes with others, export and import them as XML files. - To export a color scheme, select \uicontrol Edit > \uicontrol Preferences > + To export a color scheme, select \preferences > \uicontrol {Text Editor} > \uicontrol {Fonts & Color} > \uicontrol Export, and then select the filename and location for the XML file. @@ -101,8 +98,8 @@ \section2 File Encoding - To define the default file encoding, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol Behavior, and + To define the default file encoding, select \preferences > + \uicontrol {Text Editor} > \uicontrol Behavior, and then select a suitable option in \uicontrol {Default encoding}. \image qtcreator-options-texteditor-behavior-file-encodings.png "File encoding preferences" diff --git a/doc/qtcreator/src/editors/creator-editors-options.qdoc b/doc/qtcreator/src/editors/creator-editors-options.qdoc index d56f130c122..e17a11c8a98 100644 --- a/doc/qtcreator/src/editors/creator-editors-options.qdoc +++ b/doc/qtcreator/src/editors/creator-editors-options.qdoc @@ -19,7 +19,7 @@ \title Configuring the Editor You can configure the text editor to suit your specific needs by selecting - \uicontrol Edit > \uicontrol Preferences > \uicontrol{Text Editor}. + \preferences > \uicontrol{Text Editor}. \image qtcreator-font-colors.png "Text Editor preferences" diff --git a/doc/qtcreator/src/editors/creator-locator.qdoc b/doc/qtcreator/src/editors/creator-locator.qdoc index f26024a6864..44cdc361bc7 100644 --- a/doc/qtcreator/src/editors/creator-locator.qdoc +++ b/doc/qtcreator/src/editors/creator-locator.qdoc @@ -231,8 +231,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment > \uicontrol Locator > + \li Select \preferences > \uicontrol Environment > \uicontrol Locator > \uicontrol {Web Search} > \uicontrol Edit. \li Select \uicontrol Add to add a new entry to the list. @@ -307,8 +306,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment > \uicontrol Locator. + \li Select \preferences > \uicontrol Environment > \uicontrol Locator. \li In \uicontrol {Refresh interval}, define new time in minutes. diff --git a/doc/qtcreator/src/editors/creator-only/creator-beautifier.qdoc b/doc/qtcreator/src/editors/creator-only/creator-beautifier.qdoc index d994a175e35..20a04c003f0 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-beautifier.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-beautifier.qdoc @@ -52,14 +52,14 @@ \uicontrol Beautifier to enable the plugin. \note Since \QC 10.0.0, the ClangFormat plugin is enabled by - default. Select \uicontrol Edit > \uicontrol Preferences > + default. Select \preferences > \uicontrol {C++} > \uicontrol {Formatting mode} > \uicontrol Disable to turn off ClangFormat if you enable Beautifier because combining them can lead to unexpected results. \li Select \uicontrol {Restart Now} to restart \QC and load the plugin. - \li Select \uicontrol Edit > \uicontrol Preferences > + \li Select \preferences > \uicontrol Beautifier to specify settings for beautifying files. \li Select the \uicontrol {Enable auto format on file save} check box to @@ -148,7 +148,7 @@ \endlist - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Beautifier + \li Select \preferences > \uicontrol Beautifier > \uicontrol {Artistic Style}, \uicontrol ClangFormat, or \uicontrol Uncrustify > \uicontrol {Format Current File} to format the currently open file. diff --git a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc index a0b5a416980..cd7a71f3d70 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -82,7 +82,7 @@ \endlist - To use the built-in code model instead, select \uicontrol Edit > \uicontrol Preferences > + To use the built-in code model instead, select \preferences > \uicontrol C++ > \uicontrol clangd, and deselect the \uicontrol {Use clangd} check box. This setting also exists on the project level, so that you can have the clang-based services generally enabled, but switch them off for certain projects, or vice versa. @@ -100,7 +100,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol C++ > + \li Select \preferences > \uicontrol C++ > \uicontrol {Code Model}. \image qtcreator-preferences-code-model.webp {C++ Code Model preferences} @@ -159,7 +159,7 @@ To specify settings for clangd: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol C++ > + \li Select \preferences > \uicontrol C++ > \uicontrol Clangd > \uicontrol {Use clangd}. \image qtcreator-options-clangd.png "clangd preferences" \li In \uicontrol {Path to executable}, enter the path to clangd diff --git a/doc/qtcreator/src/editors/creator-only/creator-code-pasting.qdoc b/doc/qtcreator/src/editors/creator-only/creator-code-pasting.qdoc index e12c5e29fdf..7e77b016b4c 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-code-pasting.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-code-pasting.qdoc @@ -23,8 +23,7 @@ To specify settings for the code pasting service: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Code Pasting}. + \li Select \preferences > \uicontrol {Code Pasting}. \image qtcreator-code-pasting-options.png "Code Pasting preferences" \li In the \uicontrol {Default protocol} field, select a code pasting service to use by default. diff --git a/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc b/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc index 4596447924d..0f4933bee49 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc @@ -17,8 +17,8 @@ \image qtcreator-editortoolbar-symbols.webp {Edit mode toolbar} - To add more space around the toolbar items, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Environment > \uicontrol Interface, and + To add more space around the toolbar items, select \preferences > + \uicontrol Environment > \uicontrol Interface, and then select \uicontrol Relaxed in the \uicontrol {Toolbar style} field. \image qtcreator-preferences-environment-interface.webp {Interface tab in Environment preferences} @@ -81,7 +81,7 @@ \section2 Changing Text Encoding To show the file encoding of the current file on the editor toolbar (5), - select \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + select \preferences > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Display file encoding}. To change the text encoding, click it on the toolbar and select new @@ -97,11 +97,11 @@ To switch between Windows line endings (CRLF) and Unix line endings (LF), select the ending style on the editor toolbar (6). To hide this field, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} + select \preferences > \uicontrol {Text Editor} > \uicontrol Display, and deselect \uicontrol {Display file line ending}. To set the line endings to use for all projects by default, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + \preferences > \uicontrol {Text Editor} > \uicontrol Behavior, and then select the ending style in the \uicontrol {Default line endings} field. @@ -269,9 +269,8 @@ splits opened, you can open the link in the next split by holding \key Ctrl and \key Alt while clicking the symbol. - To enable this moving function, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol Behavior > - \uicontrol {Enable mouse navigation}. + To enable this moving function, select \preferences > \uicontrol {Text Editor} + > \uicontrol Behavior > \uicontrol {Enable mouse navigation}. There are several additional ways of moving between symbol definitions and declarations. All the functions described below are also available from the @@ -307,8 +306,8 @@ split, prepend \key {Ctrl+E} to the shortcut. For example, press \key {Ctrl+E,F2} to follow the symbol in the next split. If necessary, the view is automatically split. To change the default behavior, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > - \uicontrol Display > \uicontrol {Always open links in another split}. + \preferen \uicontrol {Text Editor} > \uicontrol Display > + \uicontrol {Always open links in another split}. Additional symbols are displayed and switching between definition and declaration is done in another split. If you change the default behavior, the shortcuts for opening diff --git a/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc b/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc index 76dc97baabb..62f0f72da63 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc @@ -46,8 +46,7 @@ To set preferences for using Copilot: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Copilot. + \li Select \preferences > \uicontrol Copilot. \image qtcreator-preferences-copilot.webp {Copilot tab in Preferences} \li Select the \uicontrol {Enable Copilot} check box to use Copilot. \li Select \uicontrol {Sign In} to sign into your subscription, activate @@ -95,8 +94,7 @@ To enable or disable Copilot suggestions globally, select the \inlineimage icons/copilot.png (\uicontrol {Toggle Copilot}) button. This also sets the value of the - \uicontrol {Enable Copilot} check box in \uicontrol Edit > - \uicontrol Preferences accordingly. + \uicontrol {Enable Copilot} check box in \preferences accordingly. To enable or disable Copilot suggestions for a particular project, select \uicontrol Projects > \uicontrol {Project Settings} > diff --git a/doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc b/doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc index c366cf82a4b..59c613a8fbe 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc @@ -93,7 +93,7 @@ \section2 Plugin Emulation FakeVim also emulates some popular vim plugins. To enable plugin emulation - for particular plugins, select \uicontrol Edit > \uicontrol Preferences > + for particular plugins, select \preferences > \uicontrol FakeVim > \uicontrol General > \uicontrol {Plugin Emulation}. \image qtcreator-fakevim-options-general-plugin-emulation.png "FakeVim Plugin Emulation preferences" @@ -269,8 +269,8 @@ \section1 Mapping FakeVim Commands To map commands entered on the \uicontrol FakeVim command line to - \QC functions, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol FakeVim > \uicontrol {Ex Command Mapping}. + \QC functions, select \preferences > \uicontrol FakeVim > + \uicontrol {Ex Command Mapping}. Enter a string in the \uicontrol Filter field to search for a specific \QC function. @@ -284,17 +284,17 @@ To reset the trigger expressions for all functions, select \uicontrol {Reset All}. - To map \e {user commands} to keyboard shortcuts, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol FakeVim > - \uicontrol {User Command Mapping}. The user command mapped to the shortcut - is executed by FakeVim as if you were typing it (as when replaying a macro). + To map \e {user commands} to keyboard shortcuts, select \preferences > + \uicontrol FakeVim > \uicontrol {User Command Mapping}. The user command + mapped to the shortcut is executed by FakeVim as if you were typing it + (as when replaying a macro). \image qtcreator-fakevim-options-user-command-mapping.png "FakeVim User Command Mapping preferences" \section1 Setting FakeVim Preferences - To make changes to the Vim-style settings, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol FakeVim > \uicontrol General. + To make changes to the Vim-style settings, select \preferences > + \uicontrol FakeVim > \uicontrol General. \image qtcreator-fakevim-options.png "FakeVim preferences" @@ -304,13 +304,13 @@ select \uicontrol {Set Plain Style}. You can then change any of the preselected settings. - To use a Vim-style color scheme, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol {Fonts & Color}. + To use a Vim-style color scheme, select \preferences > + \uicontrol {Text Editor} > \uicontrol {Fonts & Color}. In the \uicontrol {Color Scheme} list, select \uicontrol {Vim (dark)}. \section1 Quitting FakeVim Mode - To quit the FakeVim mode, deselect \uicontrol Edit > \uicontrol Preferences > + To quit the FakeVim mode, deselect \preferences > \uicontrol FakeVim > \uicontrol {Use FakeVim} or press \key {Alt+V,Alt+V}. You can temporarily escape FakeVim mode to access the normal \QC keyboard diff --git a/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc b/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc index 9ca34ea7b31..aca41d7c835 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc @@ -18,8 +18,7 @@ \li \l{Completing Code}{Code completion} \li Sending document formatting requests to the language server to automatically format documents using the settings specified in - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} - > \uicontrol Behavior + \preferences > \uicontrol {Text Editor} > \uicontrol Behavior \li Highlighting the symbol under cursor \li \l{View function tooltips} \li \l{Semantic Highlighting}{Semantic highlighting}, as defined in @@ -62,10 +61,8 @@ server is added by default and you can edit its preferences. For other languages, you can add generic stdIO language servers. - To add language servers, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Language Client} > \uicontrol Add (or \uicontrol {Qt Creator} > - \uicontrol Preferences > \uicontrol {Language Client} > \uicontrol Add - on \macos). + To add language servers, select \preferences > + \uicontrol {Language Client} > \uicontrol Add. To enable a language server, select the check box next to the language server name and set server preferences. @@ -77,9 +74,8 @@ To add a generic language server: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Language Client} > \uicontrol Add > - \uicontrol {Generic StdIO Language Server} + \li Select \preferences > \uicontrol {Language Client} > + \uicontrol Add > \uicontrol {Generic StdIO Language Server} to add a generic language server. \image qtcreator-language-server-generic-stdio.png \li In the \uicontrol Name field, enter a name for the language server. @@ -110,9 +106,9 @@ To add a Java language server: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Language Client} > \uicontrol Add > - \uicontrol {Java Language Server} to add a Java language server. + \li Select \preferences > \uicontrol {Language Client} > + \uicontrol Add > \uicontrol {Java Language Server} to add + a Java language server. \image qtcreator-language-client-options-java.png "Java language server preferences" \li In the \uicontrol Name field, enter a name for the language server. Select the \inlineimage icons/replace.png @@ -130,8 +126,8 @@ To set preferences for Python language servers: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Python > \uicontrol {Language Server Configuration} to + \li Select \preferences> \uicontrol Python > + \uicontrol {Language Server Configuration} to select the Python language server plugins to use. \image qtcreator-python-plugins.png "Python Language Server Configuration" \li Select \uicontrol Advanced to configure the plugins. @@ -149,7 +145,7 @@ Since Qt 6.4, the \c qmlls language server offers code completion and issues warnings for QML. To enable QML language server support, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Qt Quick} > + \preferences > \uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} > \uicontrol {Use qmlls (EXPERIMENTAL!)}. To use the latest version of the language server installed on your system, select the \uicontrol {Always use latest qmlls} check box. diff --git a/doc/qtcreator/src/editors/creator-only/creator-mime-types.qdoc b/doc/qtcreator/src/editors/creator-only/creator-mime-types.qdoc index 662b3c0fa20..4e66db714c1 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-mime-types.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-mime-types.qdoc @@ -46,7 +46,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > + \li Select \preferences > \uicontrol Environment > \uicontrol {MIME Types}. \image qtcreator-mime-types.png "MIME Types" diff --git a/doc/qtcreator/src/editors/creator-only/creator-preferences-cpp-code-style.qdoc b/doc/qtcreator/src/editors/creator-only/creator-preferences-cpp-code-style.qdoc index b8e9d5e38b6..44622426af8 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-preferences-cpp-code-style.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-preferences-cpp-code-style.qdoc @@ -18,7 +18,7 @@ To specify global indentation settings for the C++ editor: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol {C++}. + \li Select \preferences > \uicontrol {C++}. \image qtcreator-code-style-clang-format-global.webp {Code Style preferences} \li In \uicontrol {Formatting mode}, select: \list diff --git a/doc/qtcreator/src/editors/creator-only/creator-preferences-nim.qdoc b/doc/qtcreator/src/editors/creator-only/creator-preferences-nim.qdoc index e1d5d185087..3d77de55346 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-preferences-nim.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-preferences-nim.qdoc @@ -14,7 +14,7 @@ To specify settings for the Nim editor (experimental): \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Nim. + \li Select \preferences > \uicontrol Nim. \li In the \uicontrol {Current settings} field, select the settings to modify and click \uicontrol Copy. \image qtcreator-options-code-style-nim.png {Nim Code Style preferences} diff --git a/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc b/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc index 6687e0241ae..1ea89d69d8f 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc @@ -24,12 +24,12 @@ \uicontrol {Text Editing Macros} > \uicontrol {Save Last Macro}. To assign a keyboard shortcut to a text editing macro, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Environment > + \preferences > \uicontrol Environment > \uicontrol Keyboard. For more information, see \l{Assign keyboard shortcuts}. You can also use the \c rm locator filter to run a macro. For more information, see \l{Searching with the Locator}. - To view and remove saved macros, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol Macros. + To view and remove saved macros, select \preferences > + \uicontrol {Text Editor} > \uicontrol Macros. */ diff --git a/doc/qtcreator/src/editors/creator-preferences-text-editor-behavior.qdoc b/doc/qtcreator/src/editors/creator-preferences-text-editor-behavior.qdoc index 440d9a9e239..553e0993961 100644 --- a/doc/qtcreator/src/editors/creator-preferences-text-editor-behavior.qdoc +++ b/doc/qtcreator/src/editors/creator-preferences-text-editor-behavior.qdoc @@ -17,8 +17,8 @@ \brief Set preferences for the behavior of the text editor. To specify indentation settings for text files that do not have C++ or - QML code (such as Python code files), select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol Behavior. + QML code (such as Python code files), select \preferences > + \uicontrol {Text Editor} > \uicontrol Behavior. \image qtcreator-indentation.png {Text Editor Behavior preferences} @@ -64,7 +64,7 @@ When you type text or code, it is indented automatically according to the selected text editor or code style preferences. To set typing preferences, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + select \preferences > \uicontrol {Text Editor} > \uicontrol Behavior > \uicontrol Typing. To disable automatic indentation, deselect the diff --git a/doc/qtcreator/src/editors/creator-quick-fixes.qdoc b/doc/qtcreator/src/editors/creator-quick-fixes.qdoc index 88fddf01514..ed482dfcedc 100644 --- a/doc/qtcreator/src/editors/creator-quick-fixes.qdoc +++ b/doc/qtcreator/src/editors/creator-quick-fixes.qdoc @@ -83,8 +83,7 @@ You can specify settings for the refactoring actions either globally for all projects or separately for each project. To specify global options, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol C++ > - \uicontrol {Quick Fixes}. + select \preferences > \uicontrol C++ > \uicontrol {Quick Fixes}. To specify custom settings for a particular project, select \uicontrol Projects > \uicontrol {Project Settings} > @@ -728,7 +727,7 @@ By default, \QC uses the \c auto variable type when creating the variable. To label the variable with its actual type, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol C++ > + \preferences > \uicontrol C++ > \uicontrol {Quick Fixes}, and then deselect the \uicontrol {Use type "auto" when creating new variables} check box. diff --git a/doc/qtcreator/src/editors/creator-search.qdoc b/doc/qtcreator/src/editors/creator-search.qdoc index 904452fbe39..f01e547e8d3 100644 --- a/doc/qtcreator/src/editors/creator-search.qdoc +++ b/doc/qtcreator/src/editors/creator-search.qdoc @@ -95,7 +95,7 @@ The locations of search hits, breakpoints, and bookmarks in your document are highlighted on the editor scroll bar. To turn highlighting off, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + \preferences > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Highlight search results on the scrollbar}. To search using more advanced options, select \uicontrol Advanced. @@ -243,11 +243,9 @@ \li If Silver Searcher is not found, you might have installed it in a location that is not found via the \c{PATH} environment variable. - Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Environment > - \uicontrol System (or \uicontrol {\QC} > \uicontrol Preferences > - \uicontrol Environment > \uicontrol System on macOS), then select - \uicontrol Change in the \uicontrol Environment field and add an entry - \c{PATH=/path/to/bin:${PATH}}. + Select \preferences > \uicontrol Environment > \uicontrol System, + then select \uicontrol Change in the \uicontrol Environment field, + and add the entry \c{PATH=/path/to/bin:${PATH}}. \endlist \endif diff --git a/doc/qtcreator/src/editors/creator-semantic-highlighting.qdoc b/doc/qtcreator/src/editors/creator-semantic-highlighting.qdoc index 41e8c1ea961..e6d119bb818 100644 --- a/doc/qtcreator/src/editors/creator-semantic-highlighting.qdoc +++ b/doc/qtcreator/src/editors/creator-semantic-highlighting.qdoc @@ -24,8 +24,7 @@ \endlist To specify the color scheme to use for semantic highlighting, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > - \uicontrol {Fonts & Color}. + \preferences > \uicontrol {Text Editor} > \uicontrol {Fonts & Color}. \QC supports syntax highlighting also for other types of files than C++, QML, or JavaScript. @@ -48,7 +47,7 @@ If more than one highlight definition is available for the file that you open for editing, the editor asks you to select the one to use. To save the selection, select \uicontrol {Remember My Choice}. To reset the - remembered definitions, select \uicontrol Edit > \uicontrol Preferences > + remembered definitions, select \preferences > \uicontrol {Text Editor} > \uicontrol {Generic Highlighter} > \uicontrol {Reset Remembered Definitions}. @@ -58,10 +57,9 @@ To view information about the downloaded files, open the \l{View output} {General Messages} view. - To suppress the message for a particular file pattern, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} - > \uicontrol {Generic Highlighter} and add the pattern to the - \uicontrol {Ignored file patterns} field. + To suppress the message for a particular file pattern, select \preferences > + \uicontrol {Text Editor} > \uicontrol {Generic Highlighter} and add the + pattern to the \uicontrol {Ignored file patterns} field. \image qtcreator-syntax-highlighter.png "Generic Highlighter preferences" @@ -79,15 +77,14 @@ \image qtcreator-blockhighlighting.png - To enable block highlighting, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol Display > - \uicontrol {Highlight blocks}. + To enable block highlighting, select \preferences > \uicontrol {Text Editor} + > \uicontrol Display > \uicontrol {Highlight blocks}. Use the folding markers to collapse and expand blocks of code within braces. Click the folding marker to collapse or expand a block. In the figure above, the folding markers are located between the line number and the text pane. - To show the folding markers, select \uicontrol Edit > \uicontrol Preferences > + To show the folding markers, select \preferences > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Display folding markers}. This option is enabled by default. @@ -95,7 +92,7 @@ When the cursor is on a brace, the matching brace is animated by default. To turn off the animation and just highlight the block and the braces, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + \preferences > \uicontrol {Text Editor} > \uicontrol Display and deselect \uicontrol {Animate matching parentheses}. You can use keyboard shortcuts to move within and between blocks. To go to @@ -107,7 +104,7 @@ To select the current block, press \key Ctrl+U. A second key press extends the selection to the parent block. To undo the last selection, press \key {Ctrl+Alt+Shift+U}. To enable smart block selection, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Text Editor} > + \preferences > \uicontrol {Text Editor} > \uicontrol Behavior > \uicontrol {Enable smart selection changing}. \image qtcreator-options-text-editor-behavior.png "Text Editor Behavior preferences" diff --git a/doc/qtcreator/src/howto/creator-external-tools.qdoc b/doc/qtcreator/src/howto/creator-external-tools.qdoc index 79e0599c3c3..53ba24a3f4b 100644 --- a/doc/qtcreator/src/howto/creator-external-tools.qdoc +++ b/doc/qtcreator/src/howto/creator-external-tools.qdoc @@ -31,7 +31,7 @@ \section1 Configure external tools You can change the configuration of preconfigured tools and configure - additional tools in \QC \uicontrol Preferences. + additional tools in \QC \preferences. \image qtcreator-external-tools.png @@ -90,7 +90,7 @@ To globally change the system environment from the one in which - \QC is started, select \uicontrol Edit > \uicontrol Preferences > + \QC is started, select \preferences > \uicontrol Environment > \uicontrol System, and then select \uicontrol Change in the \uicontrol Environment field. \if defined(qtcreator) diff --git a/doc/qtcreator/src/howto/creator-help.qdoc b/doc/qtcreator/src/howto/creator-help.qdoc index 005153cb13c..434ee6fe9b2 100644 --- a/doc/qtcreator/src/howto/creator-help.qdoc +++ b/doc/qtcreator/src/howto/creator-help.qdoc @@ -36,7 +36,7 @@ space, in the fullscreen \uicontrol Help mode. \li To select and configure how the documentation is displayed in the - \uicontrol Help mode, select \uicontrol Edit > \uicontrol Preferences > \uicontrol Help. + \uicontrol Help mode, select \preferences > \uicontrol Help. \endlist The following image displays the context sensitive help in the \uicontrol Edit @@ -47,8 +47,8 @@ \section1 Change the font If the help HTML file does not use a style sheet, you can change the font - family, style, and size in \uicontrol Edit > \uicontrol Preferences > - \uicontrol Help > \uicontrol General. + family, style, and size in \preferences > \uicontrol Help > + \uicontrol General. \image qtcreator-preferences-help-general.webp {General tab in Help preferences} @@ -74,8 +74,8 @@ \section1 View function tooltips - To hide function tooltips by default, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol Behavior > + To hide function tooltips by default, select \preferences > + \uicontrol {Text Editor} > \uicontrol Behavior > \uicontrol {Show help tooltips using the mouse} > \uicontrol {On Shift+Mouseover}. You can still view the tooltips by pressing and holding down the \key Shift key. @@ -108,9 +108,8 @@ By default, \QC registers only the latest available version of the documentation for each installed Qt module. To register all installed - documentation, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Kits > \uicontrol {Qt Versions} > - \uicontrol {Register documentation}. + documentation, select \preferences > \uicontrol Kits > + \uicontrol {Qt Versions} > \uicontrol {Register documentation}. \image qtcreator-qt-versions.png {Register documentation field in Qt Versions tab in Kit Preferences} @@ -174,9 +173,9 @@ \section1 Import and export bookmarks - To import and export bookmarks, select \uicontrol Edit > \uicontrol Preferences - > \uicontrol Help > \uicontrol General > \uicontrol {Import Bookmarks} or - \uicontrol {Export Bookmarks}. + To import and export bookmarks, select \preferences > + \uicontrol Help > \uicontrol General > \uicontrol {Import Bookmarks} or + \uicontrol {Export Bookmarks}. \sa {Find information in Qt documentation} */ @@ -260,7 +259,7 @@ For information on how to prepare your documentation and create a .qch file, see \l{The Qt Help Framework}. - \li To add the .qch file to \QC, select \uicontrol Edit > \uicontrol Preferences > + \li To add the .qch file to \QC, select \preferences > \uicontrol Help > \uicontrol Documentation > \uicontrol Add. \image qtcreator-preferences-help-documentation.webp {Documentation tab in Help Preferences} @@ -289,8 +288,8 @@ \image qtcreator-context-sensitive-help.png {Context-sensitive help in Edit mode} To specify that the help always opens in full-screen mode or - is detached to an external window, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Help > \uicontrol General. + is detached to an external window, select \preferences > \uicontrol Help > + \uicontrol General. \image qtcreator-preferences-help-general.webp {General tab in Help preferences} @@ -317,8 +316,8 @@ \title Select the help start page You can select the page to display when you open the \uicontrol Help mode in the - \uicontrol Edit > \uicontrol Preferences > \uicontrol Help > \uicontrol General - > \uicontrol {On help start} field. + \preferences > \uicontrol Help > \uicontrol General > + \uicontrol {On help start} field. \image qtcreator-preferences-help-general.webp {General tab in Help preferences} @@ -367,8 +366,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Help > - \uicontrol Filters. + \li Select \preferences > \uicontrol Help > \uicontrol Filters. \image qtcreator-help-filter-attributes.png {Filters tab in Help preferences} diff --git a/doc/qtcreator/src/howto/creator-how-to-set-high-dpi-scaling.qdoc b/doc/qtcreator/src/howto/creator-how-to-set-high-dpi-scaling.qdoc index 2beda1e8f5d..c0b2d4d6bea 100644 --- a/doc/qtcreator/src/howto/creator-how-to-set-high-dpi-scaling.qdoc +++ b/doc/qtcreator/src/howto/creator-how-to-set-high-dpi-scaling.qdoc @@ -32,7 +32,7 @@ To override the default approach and always enable high DPI scaling: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > + \li Select \preferences > \uicontrol Environment > \uicontrol Interface. \image qtcreator-preferences-environment-interface.webp {Interface tab in Environment preferences} \li Select \uicontrol {Enable high DPI scaling}. diff --git a/doc/qtcreator/src/howto/creator-how-to-switch-ui-themes.qdoc b/doc/qtcreator/src/howto/creator-how-to-switch-ui-themes.qdoc index 69272441a38..41146ea2c62 100644 --- a/doc/qtcreator/src/howto/creator-how-to-switch-ui-themes.qdoc +++ b/doc/qtcreator/src/howto/creator-how-to-switch-ui-themes.qdoc @@ -20,7 +20,7 @@ To switch themes: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > + \li Select \preferences > \uicontrol Environment > \uicontrol Interface. \image qtcreator-preferences-environment-interface.webp {Interface preferences} \li In \uicontrol Theme, select a theme. diff --git a/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc b/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc index 910e89dd97a..7dd3457be45 100644 --- a/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc +++ b/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc @@ -24,8 +24,7 @@ \QC has various keyboard shortcuts that speed up your development process. To view all \QC functions in and their keyboard shortcuts, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Environment > - \uicontrol Keyboard. + \preferences > \uicontrol Environment > \uicontrol Keyboard. \image qtcreator-keyboard-shortcuts.png @@ -47,7 +46,7 @@ To override the platform default value that determines whether keyboard shortcuts are shown in the labels of context menu items, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol Environment > + select \preferences > \uicontrol Environment > \uicontrol Interface. The label of the \uicontrol {Show keyboard shortcuts in context menus} check box indicates whether the platform default value is \c on or \c off. @@ -218,8 +217,8 @@ By default, \QC exits without asking for confirmation, unless there are unsaved changes in open files. To always be asked, select the \uicontrol {Ask for confirmation before exiting} - check box in \uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment > \uicontrol System. + check box in \preferences > \uicontrol Environment > + \uicontrol System. \li Ctrl+Q \endtable @@ -316,9 +315,8 @@ \li Select the current block The second press extends the selection to the parent block. To - enable this behavior, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > - \uicontrol Behavior > + enable this behavior, select \preferences > + \uicontrol {Text Editor} > \uicontrol Behavior > \uicontrol {Enable smart selection changing}. \li Ctrl+U \row @@ -819,8 +817,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Environment - > \uicontrol Keyboard. + \li Select \preferences > \uicontrol Environment > \uicontrol Keyboard. \image qtcreator-keyboard-shortcuts.png {Keyboard preferences} \li Select a command from the list. @@ -877,8 +874,7 @@ To look up keyboard shortcuts: \list 1 - \li Select uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment > \uicontrol Keyboard. + \li Select \preferences > \uicontrol Environment > \uicontrol Keyboard. \image qtcreator-keyboard-shortcuts.png {Keyboard preferences} \li Start typing the name of a function or shortcut in the \uicontrol Filter field. @@ -909,8 +905,7 @@ \list 1 - \li Select uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment > \uicontrol Keyboard. + \li Select \preferences > \uicontrol Environment > \uicontrol Keyboard. \image qtcreator-keyboard-shortcuts.png {Keyboard preferences} \li To import a keyboard shortcut mapping scheme, click \uicontrol Import diff --git a/doc/qtcreator/src/howto/creator-only/creator-autotest.qdoc b/doc/qtcreator/src/howto/creator-only/creator-autotest.qdoc index dab584171bc..47611d26c3f 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-autotest.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-autotest.qdoc @@ -39,7 +39,7 @@ By default, \QC does not handle build system based tests to avoid interference with code based parsers. To enable build system based tests, - select the respective test tool in \uicontrol Preferences > \uicontrol Testing + select the respective test tool in \preferences > \uicontrol Testing > \uicontrol General. The detection of tests is usually much faster for build system based @@ -341,8 +341,8 @@ with the build system. If a test takes more than a minute to execute, the default timeout might - stop the test execution. To increase the timeout, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Testing} > \uicontrol General. + stop the test execution. To increase the timeout, select \preferences > + \uicontrol {Testing} > \uicontrol General. \section2 Selecting Tests to Run @@ -389,8 +389,7 @@ \section1 Specifying Test Settings To customize the handling of tests, test frameworks, and test tools, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Testing} > - \uicontrol General. + \preferences > \uicontrol {Testing} > \uicontrol General. \image qtcreator-preferences-testing-general.webp {General tab in Testing preferences} @@ -444,8 +443,8 @@ The code inside a benchmark test is measured, and possibly also repeated several times in order to get an accurate measurement. This depends on the measurement back-end that you can select in the - \uicontrol {Benchmark Metrics} group in \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Testing} > \uicontrol {Qt Test}: + \uicontrol {Benchmark Metrics} group in \preferences > \uicontrol {Testing} > + \uicontrol {Qt Test}: walltime, CPU tick counter, event counter, Valgrind Callgrind, and Linux Perf. For more information, see \l{Creating a Benchmark}. @@ -472,8 +471,8 @@ \section2 Specifying Settings for Running Google Tests - To specify settings for running Google tests, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Testing} > \uicontrol {Google Test}. + To specify settings for running Google tests, select \preferences > + \uicontrol {Testing} > \uicontrol {Google Test}. \image qtcreator-preferences-testing-googletest.webp {Gooble Test tab in Testing preferences} @@ -500,9 +499,8 @@ \section2 Specifying Settings for Running Boost Tests \list 1 - \li To specify settings for running Boost tests, select \uicontrol Edit - > \uicontrol Preferences > \uicontrol {Testing} > - \uicontrol {Boost Test}. + \li To specify settings for running Boost tests, select \preferences > + \uicontrol {Testing} > \uicontrol {Boost Test}. \image qtcreator-preferences-testing-boosttest.webp {Boost Test tab in Testing preferences} \li In the \uicontrol {Log format} field, select the error report format to specify the type of events to record in the @@ -526,8 +524,7 @@ \section2 Specifying Settings for Running Catch2 Tests \list 1 \li To specify settings for running Catch2 tests, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Testing} > - \uicontrol {Catch Test}. + \preferences > \uicontrol {Testing} > \uicontrol {Catch Test}. \image qtcreator-preferences-testing-catchtest.webp {Catch Test tab in Testing preferences} \li Select the \uicontrol {Show success} check box to show succeeding expressions as well. By default Catch2 will print only fails. @@ -557,8 +554,7 @@ \section2 Specifying Settings for Running CTest-Based Tests \list 1 \li To specify settings for running CTest-based tests, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Testing} > - \uicontrol {CTest}. + \preferences > \uicontrol {Testing} > \uicontrol {CTest}. \image qtcreator-preferences-testing-ctest.webp {CTest tab in Testing preferences} \li Select the \uicontrol {Output on failure} check box to show test specific output if a test fails. Contrary to the CTest default @@ -595,8 +591,8 @@ the lost information when viewing the results as plain text. To view the - results of Qt and Qt Quick tests as plain text, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Testing} > \uicontrol {Qt Test}, and + results of Qt and Qt Quick tests as plain text, select \preferences > + \uicontrol {Testing} > \uicontrol {Qt Test}, and then deselect the \uicontrol {Use XML output} check box. Then select the \inlineimage icons/text.png (\uicontrol {Switch Between Visual and Text Display}) button in diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-document-code.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-document-code.qdoc index 3050f4a9a4e..d56a1f288cb 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-to-document-code.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-document-code.qdoc @@ -20,7 +20,7 @@ \image qtcreator-preferences-documentation-comments.webp {Documentation Comments settings} - To set global preferences, select \uicontrol Edit > \uicontrol Preferences > + To set global preferences, select \preferences > \uicontrol {Text Editor} > \uicontrol {Documentation Comments}. \sa {Configuring Projects} diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-record-screens.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-record-screens.qdoc index e12aebd6188..c8a624622d3 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-to-record-screens.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-record-screens.qdoc @@ -106,8 +106,7 @@ To set up screen recording: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Help > - \uicontrol {Screen Recording}. + \li Select \preferences > \uicontrol Help > \uicontrol {Screen Recording}. \image qtcreator-preferences-screen-recording.webp {Screen Recording preferences} \li In \uicontrol {ffmpeg tool}, set the path to the FFmpeg executable. \li In \uicontrol {ffprobe tool}, set the path to the FFprobe executable. diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index 025c2bd2ef1..99206c237a8 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -103,7 +103,7 @@ \title Find a particular preference - To find a particular preference in \uicontrol Edit > \uicontrol Preferences, + To find a particular preference in \preferences, use the filter located at the top left of the \uicontrol Preferences dialog. \image qtcreator-preferences.webp {Filtering preferences} @@ -208,7 +208,7 @@ create your own locator filters. That way you can locate files in a directory structure you have defined. - To create locator filters, select \uicontrol Edit > \uicontrol Preferences > + To create locator filters, select \preferences > \uicontrol Environment > \uicontrol Locator > \uicontrol Add. \image qtcreator-locator-customize.webp "Locator preferences" @@ -253,9 +253,8 @@ \title Add a license header template for C++ code - Specify a file that has a license header for C++ in \uicontrol Edit > - \uicontrol Preferences > \uicontrol C++ > \uicontrol {File Naming} > - \uicontrol {License template}. + Specify a file that has a license header for C++ in \preferences > + \uicontrol C++ > \uicontrol {File Naming} > \uicontrol {License template}. \image qtcreator-options-cpp-files.png "File Naming preferences" @@ -321,8 +320,7 @@ \endlist To specify whether to automatically insert matching characters, - select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Text Editor} > \uicontrol Completion. + select \preferences > \uicontrol {Text Editor} > \uicontrol Completion. \image qtcreator-preferences-texteditor-completion.webp "Completion preferences" @@ -349,8 +347,8 @@ \title Add code snippets to the auto-complete menu Add, modify, and remove snippets in the snippet editor. - To open the editor, select \uicontrol Edit > \uicontrol Preferences - > \uicontrol {Text Editor} > \uicontrol Snippets. + To open the editor, select \preferences > \uicontrol {Text Editor} > + \uicontrol Snippets. \image qtcreator-snippet-modifiers.png "Snippets preferences" @@ -398,8 +396,7 @@ \uicontrol {Recent Files}: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment > \uicontrol System. + \li Select \preferences > \uicontrol Environment > \uicontrol System. \image qtcreator-options-environment-system.png {System preferences} \li In \uicontrol {Maximum number of entries in "Recent Files"}, set the number of files to show. diff --git a/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc b/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc index 25b2d54dad5..c931fd98ed4 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc @@ -57,7 +57,7 @@ To specify a Squish Server to run: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Squish. + \li Select \preferences > \uicontrol Squish. \image qtcreator-squish-preferences.png "Squish general preferences" \li In the \uicontrol {Squish path} field, specify the path to the Squish installation directory. diff --git a/doc/qtcreator/src/howto/creator-only/creator-vcpkg.qdoc b/doc/qtcreator/src/howto/creator-only/creator-vcpkg.qdoc index 456e793aa01..fb013f4fd36 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-vcpkg.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-vcpkg.qdoc @@ -31,15 +31,13 @@ \section1 Setting vcpkg Preferences By default, vcpkg is automatically set up for use with CMake. To disable - automatic setup, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol CMake > \uicontrol General > - \uicontrol {Package manager auto setup}. + automatic setup, select \preferences > \uicontrol CMake > \uicontrol General + > \uicontrol {Package manager auto setup}. \image qtcreator-preferences-cmake-general.webp {General tab in CMake Preferences} To set the \uicontrol Path to the directory where you installed vcpkg, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol CMake > - \uicontrol Vcpkg. + \preferences > \uicontrol CMake > \uicontrol Vcpkg. \image qtcreator-preferences-cmake-vcpkg.webp {Vcpkg tab in CMake Preferences} diff --git a/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc b/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc index 25172cf94d3..beadc0eb86a 100644 --- a/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc +++ b/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc @@ -34,7 +34,7 @@ compiler. What should I do?} Make sure that the application is in your system PATH when starting \QC. - Also select \uicontrol Edit > \uicontrol Preferences to check the settings + Also select \preferences to check the settings specified for the application. Many plugins specify either the path to the tool they need or the environment they run in. @@ -45,7 +45,7 @@ \QC has been localized into several languages. If the system language is one of the supported languages, it is automatically selected. - To change the language, select \uicontrol Edit > \uicontrol Preferences > + To change the language, select \preferences > \uicontrol Environment and select a language in the \uicontrol Language field. Select \uicontrol {Restart Now} to restart \QC and have the change take effect. @@ -145,7 +145,7 @@ \uicontrol Help mode. To view the documentation that is available and to add documentation, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol Help > + select \preferences > \uicontrol Help > \uicontrol Documentation. For more information, see \l{Add external documentation}. @@ -232,9 +232,9 @@ For console applications that require input, select \uicontrol Projects > \uicontrol {Run Settings} > \uicontrol {Run in terminal}. To specify the - terminal to use, select \uicontrol Edit > \uicontrol Preferences > + terminal to use, select \preferences > \uicontrol Environment > \uicontrol System. To use an \l{Terminal} - {internal terminal}, select \uicontrol Edit > \uicontrol Preferences + {internal terminal}, select \preferences > \uicontrol Terminal > \uicontrol {Use internal terminal}. \b {On Windows:} Output is displayed differently for \e{console diff --git a/doc/qtcreator/src/howto/creator-telemetry.qdoc b/doc/qtcreator/src/howto/creator-telemetry.qdoc index 128d358910b..058e6cfbebe 100644 --- a/doc/qtcreator/src/howto/creator-telemetry.qdoc +++ b/doc/qtcreator/src/howto/creator-telemetry.qdoc @@ -90,7 +90,7 @@ To determine what data is transmitted to the backend storage: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Telemetry + \li Select \preferences > \uicontrol Telemetry > \uicontrol {Usage Statistics}. \image qtcreator-telemetry-settings.png "Telemetry settings" \li In the \uicontrol {Telemetry mode} list, select the mode that diff --git a/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc b/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc index 00bc24e1224..def1727a1fc 100644 --- a/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc +++ b/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc @@ -34,7 +34,7 @@ \section1 Adding Boot2Qt Devices If \QC does not automatically detect a device you connected with USB, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices > + \preferences > \uicontrol Devices > \uicontrol Devices > \uicontrol Add > \uicontrol {Boot2Qt Device} to create either a network connection or a USB connection to it. @@ -49,7 +49,7 @@ \l{https://doc.qt.io/Boot2Qt/b2qt-requirements-x11.html#setting-up-usb-access-to-embedded-devices} {Boot2Qt: Setting Up USB Access to Embedded Devices}. - You can edit the settings later in \uicontrol Edit > \uicontrol Preferences > + You can edit the settings later in \preferences > \uicontrol Devices > \uicontrol Devices. To reboot the selected device, select \uicontrol {Reboot Device}. @@ -74,7 +74,7 @@ need to enter the password upon every connection to the device, or if caching is enabled, at every \QC restart. If you frequently run into the timeout, consider using key-based authentication. On \macos and Linux, you - can also select \uicontrol Preferences > \uicontrol Devices > \uicontrol SSH + can also select \preferences > \uicontrol Devices > \uicontrol SSH and increase the time (in minutes) to use the same SSH connection in the \uicontrol {Connection sharing timeout} field. Windows does not support shared connections. @@ -97,10 +97,9 @@ \list 1 \li Check that you can reach the IP address of the device, or use USB to connect it. - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > - \uicontrol {Qt Versions} > \uicontrol Add to add the Qt version - for Boot2Qt. - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \li Select \preferences > \uicontrol Kits > \uicontrol {Qt Versions} > + \uicontrol Add to add the Qt version for Boot2Qt. + \li Select \preferences > \uicontrol Kits > \uicontrol Compilers > \uicontrol Add to add the compiler for building the applications. \li Select \uicontrol Tools > \uicontrol {Flash Boot to Qt Device} @@ -109,16 +108,15 @@ parameters for connecting to the devices over the network (\QC automatically detects devices connected with USB): \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Devices > \uicontrol Devices > \uicontrol Add > - \uicontrol Boot2Qt. + \li Select \preferences > \uicontrol Devices > + \uicontrol Devices > \uicontrol Add > \uicontrol Boot2Qt. \image qtcreator-devices-boot2qt.png {Boot2Qt Network Device Setup wizard} \li In the \uicontrol {Device name} field, enter a name for the connection. \li In the \uicontrol {Device address} field, enter the host name or IP address of the device. This value will be available in the \c %{Device:HostAddress} variable. - \li Click > \uicontrol {Finish} to test the connection and + \li Click \uicontrol {Finish} to test the connection and add the device. You can edit the connection parameters in the @@ -131,7 +129,7 @@ \uicontrol {Boot2Qt Device} in the pull-down menu of the \uicontrol Add button. \endlist - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \li Select \preferences > \uicontrol Kits > \uicontrol Add to add a kit for building applications for the device. Select the Qt version, compiler, and device that you added above, and choose \uicontrol Boot2Qt as the device type. diff --git a/doc/qtcreator/src/linux-mobile/linuxdev-keys.qdocinc b/doc/qtcreator/src/linux-mobile/linuxdev-keys.qdocinc index 172c4a74feb..f3582f23736 100644 --- a/doc/qtcreator/src/linux-mobile/linuxdev-keys.qdocinc +++ b/doc/qtcreator/src/linux-mobile/linuxdev-keys.qdocinc @@ -19,8 +19,8 @@ development PC. To tell \QC where it can find the tools, specify the paths to the - directories where the tools are installed in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Devices > \uicontrol SSH: + directories where the tools are installed in \preferences > + \uicontrol Devices > \uicontrol SSH: \image qtcreator-ssh-options.png "SSH preferences" @@ -60,7 +60,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices + \li Select \preferences > \uicontrol Devices > \uicontrol Devices > \uicontrol {Create New}. \image qtcreator-ssh-key-configuration.png "SSH Key Configuration dialog" diff --git a/doc/qtcreator/src/linux-mobile/linuxdev-processes.qdocinc b/doc/qtcreator/src/linux-mobile/linuxdev-processes.qdocinc index 2992d6b2ecc..1c9c2d0a4ab 100644 --- a/doc/qtcreator/src/linux-mobile/linuxdev-processes.qdocinc +++ b/doc/qtcreator/src/linux-mobile/linuxdev-processes.qdocinc @@ -7,7 +7,7 @@ \section2 Managing Device Processes You can view processes running on devices and kill them. Select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices > + \preferences > \uicontrol Devices > \uicontrol Devices > \uicontrol {Show Running Processes}. You can filter the processes by name or ID in the diff --git a/doc/qtcreator/src/linux-mobile/linuxdev.qdoc b/doc/qtcreator/src/linux-mobile/linuxdev.qdoc index 41820632d36..401fdbd8c1e 100644 --- a/doc/qtcreator/src/linux-mobile/linuxdev.qdoc +++ b/doc/qtcreator/src/linux-mobile/linuxdev.qdoc @@ -22,7 +22,7 @@ {kit}. You use a wizard to create the connections. You can edit the settings later - in \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices > + in \preferences > \uicontrol Devices > \uicontrol Devices. \image qtcreator-preferences-devices-remote-linux.webp "Remote Linux Device in the Devices tab" @@ -49,11 +49,11 @@ \li Make sure that your device can be reached via an IP address. - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \li Select \preferences > \uicontrol Kits > \uicontrol {Qt Versions} > \uicontrol Add to add the Qt version for embedded Linux. - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \li Select \preferences > \uicontrol Kits > \uicontrol Compilers > \uicontrol Add to add the compiler for building the applications. @@ -62,7 +62,7 @@ \list a - \li Select \uicontrol Edit > \uicontrol Preferences > + \li Select \preferences > \uicontrol Devices > \uicontrol Devices > \uicontrol Add > \uicontrol {Remote Linux Device} > \uicontrol {Start Wizard}. @@ -111,7 +111,7 @@ \uicontrol {Add Remote Linux Device} in the pull-down menu of the \uicontrol Add button. - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \li Select \preferences > \uicontrol Kits > \uicontrol Add to add a kit for building for the device. Select the Qt version, compiler, and device that you added above, and select \uicontrol {Remote Linux Device} in \uicontrol {Run device type}. diff --git a/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc b/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc index f2ad72b6402..65fba314e28 100644 --- a/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc +++ b/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc @@ -60,8 +60,7 @@ \section2 Specifying MCU Settings To configure a connection between \QC and your MCU board, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices > - \uicontrol MCU: + \preferences > \uicontrol Devices > \uicontrol MCU: \image qtcreator-mcu-options.png "MCU preferences" @@ -121,9 +120,8 @@ \image qtcreator-mcu-device.png "MCU devices" - To add MCU devices, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Devices > \uicontrol Add > \uicontrol {MCU Device} > - \uicontrol {Start Wizard}: + To add MCU devices, select \preferences > \uicontrol Devices > \uicontrol Add + > \uicontrol {MCU Device} > \uicontrol {Start Wizard}: \list 1 \li In the \uicontrol Name field, give the device a name. @@ -141,8 +139,7 @@ \image qtcreator-mcu-kit.png "MCU kits" - You can edit and/or remove individual kits in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Kits. + You can edit and/or remove individual kits in \preferences > \uicontrol Kits. However, for adding new kits you should use the \uicontrol {Create Kit} button in the {\QMCU} settings tab. This method adds the paths to diff --git a/doc/qtcreator/src/meson/creator-projects-meson.qdoc b/doc/qtcreator/src/meson/creator-projects-meson.qdoc index e38e820bef6..43a15c65782 100644 --- a/doc/qtcreator/src/meson/creator-projects-meson.qdoc +++ b/doc/qtcreator/src/meson/creator-projects-meson.qdoc @@ -35,7 +35,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Meson > + \li Select \preferences > \uicontrol Meson > \uicontrol Tools > \uicontrol Add. \image qtcreator-mesonexecutable.png @@ -50,7 +50,7 @@ \endlist Select the - \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > \uicontrol Kits + \preferences > \uicontrol Kits > \uicontrol Kits tab to add the Meson and Ninja tools to a build and run kit: \image qtcreator-kits-meson.png "Setting Meson executable in Kit preferences" diff --git a/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc b/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc index 41991eebbde..e891bd8ce89 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc @@ -45,22 +45,21 @@ available in \QC. If it does not, you must add the kits yourself to tell \QC where everything is. - To add kits, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Kits > \uicontrol Add. + To add kits, select \preferences > \uicontrol Kits > \uicontrol Add. For more information, see \l{Add kits}. Each kit consists of a set of values that define one environment, such as a - \l{glossary-device}{device}, compiler, and Qt version. If \uicontrol Edit > - \uicontrol Preferences > \uicontrol Kits > \uicontrol {Qt Versions} does not - show all the installed Qt versions, select \uicontrol {Link with Qt}. + \l{glossary-device}{device}, compiler, and Qt version. If \preferences > + \uicontrol Kits > \uicontrol {Qt Versions} does not show all the installed + Qt versions, select \uicontrol {Link with Qt}. If \uicontrol Auto-detected still does not show the Qt version, select \uicontrol {Add} to add it manually. For more information, see \l{Add Qt versions}. - Also check that \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + Also check that \preferences > \uicontrol Kits > \uicontrol {Compilers} shows your compiler. For more information, see \l{Add compilers}. @@ -71,8 +70,8 @@ over a WLAN. You must also configure a connection between \QC and the development PC and specify the device in a kit. - To add devices, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Devices > \uicontrol Devices > \uicontrol Add. + To add devices, select \preferences > \uicontrol Devices > + \uicontrol Devices > \uicontrol Add. For more information, see \l{Connecting Devices}. @@ -81,7 +80,8 @@ You can use \QC with your favorite keyboard shortcuts. To view and edit all keyboard shortcuts defined in \QC, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Environment > + \preferences > + \uicontrol Environment > \uicontrol Keyboard. For more information, see \l{Keyboard Shortcuts}. \section1 Changing Color Schemes @@ -89,9 +89,8 @@ Themes enable you to customize the appearance of the \QC UI: widgets, colors, and icons. - To switch themes, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment, and then select a theme - in the \uicontrol Theme field. + To switch themes, select \preferences > \uicontrol Environment, and then + select a theme in the \uicontrol Theme field. You can use the \QC text and code editors with your favorite color scheme that defines how to highlight code elements and which background color to @@ -99,7 +98,7 @@ ones. The color schemes apply to highlighting C++ files, QML files, and generic files. - To change the color scheme, select \uicontrol Edit > \uicontrol Preferences > + To change the color scheme, select \preferences > \uicontrol {Text Editor} > \uicontrol {Fonts & Color}. For more information, see \l{Defining Color Schemes}. @@ -109,8 +108,8 @@ highlighting engine for Kate syntax definitions. \QC comes with most of the commonly used syntax files, and you can download additional files. - To download and use highlight definition files, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Text Editor} > \uicontrol {Generic Highlighter}. + To download and use highlight definition files, select \preferences > + \uicontrol {Text Editor} > \uicontrol {Generic Highlighter}. For more information, see \l{Generic Highlighting}. @@ -121,7 +120,7 @@ the statement currently under your cursor. You can add, modify, and remove snippets in the snippet editor. - To open the snippet editor, select \uicontrol Edit > \uicontrol Preferences > + To open the snippet editor, select \preferences > \uicontrol {Text Editor} > \uicontrol Snippets. For more information, see \l{Editing Code Snippets}. @@ -133,8 +132,8 @@ \QC. However, some configuration options are available and you can set them in - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Version Control} > - \uicontrol General. + \preferences > + \uicontrol {Version Control} > \uicontrol General. For more information about the supported functions, see \l{Version Control Systems}. diff --git a/doc/qtcreator/src/overview/creator-only/creator-glossary.qdoc b/doc/qtcreator/src/overview/creator-only/creator-glossary.qdoc index ebc66b84236..ac5e1cae6b4 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-glossary.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-glossary.qdoc @@ -78,7 +78,7 @@ cross-platform development easier. Each kit consists of a set of values that define one environment, such as a \e {device}, tool chain, Qt version, and debugger command to use. Configure kits at - \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits. + \preferences > \uicontrol Kits. \row \li Mode diff --git a/doc/qtcreator/src/overview/creator-only/creator-issues.qdoc b/doc/qtcreator/src/overview/creator-only/creator-issues.qdoc index 593184d22b9..db2af2c5ebf 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-issues.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-issues.qdoc @@ -74,7 +74,7 @@ \QC or the conflicting shortcut in ibus. To set another \l {Keyboard Shortcuts}{keyboard shortcut} - in \QC, select \uicontrol Edit > \uicontrol Preferences > + in \QC, select \preferences > \uicontrol Environment > \uicontrol Keyboard. To change the ibus shortcut, enter the following command on the diff --git a/doc/qtcreator/src/overview/creator-only/creator-supported-platforms.qdoc b/doc/qtcreator/src/overview/creator-only/creator-supported-platforms.qdoc index 7dc67a57bbf..5ea6d94a0cf 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-supported-platforms.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-supported-platforms.qdoc @@ -73,8 +73,7 @@ To develop for UWP using Qt 5, use \QC 7.0, or earlier. \QC automatically runs scheduled checks for updates based on the settings - specified in \uicontrol Edit > \uicontrol Preferences \uicontrol Environment > - \uicontrol Update. + specified in \preferences > \uicontrol Environment > \uicontrol Update. \sa {Desktop Platforms}, {Embedded Platforms}, {Mobile Platforms} */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-build-settings-qmake.qdoc b/doc/qtcreator/src/projects/creator-only/creator-build-settings-qmake.qdoc index e0f2d11ac10..17a1b43c9c3 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-build-settings-qmake.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-build-settings-qmake.qdoc @@ -19,7 +19,7 @@ \uicontrol {Build Directory} field. To make in-source builds the default option for all projects, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Build & Run} > + \preferences > \uicontrol {Build & Run} > \uicontrol {Default Build Properties}, and enter a period (.) in the \uicontrol {Default build directory} field. @@ -46,15 +46,13 @@ \section1 Global qmake Settings - To specify settings for all qmake builds, select \uicontrol Edit - > \uicontrol Preferences > \uicontrol {Build & Run} > - \uicontrol Qmake. + To specify settings for all qmake builds, select \preferences > + \uicontrol {Build & Run} > \uicontrol Qmake. \image qtcreator-preferences-build-run-qmake.png "Qmake tab in Build & Run Preferences" - To set the default build properties, select \uicontrol Edit - > \uicontrol Preferences > \uicontrol {Build & Run} > - \uicontrol {Default Build Properties}. + To set the default build properties, select \preferences > + \uicontrol {Build & Run} > \uicontrol {Default Build Properties}. \image qtcreator-build-settings-default.png "Default Build Properties tab in Build & Run Preferences" @@ -70,9 +68,8 @@ select \uicontrol Enable in the \uicontrol {Qt Quick Compiler} field. To use default settings, select \uicontrol {Leave at Default}. - You can specify default behavior for compiling QML code in \uicontrol Edit - > \uicontrol Preferences > \uicontrol {Build & Run} > \uicontrol Qmake > - \uicontrol {Use qmlcachegen}. + You can specify default behavior for compiling QML code in \preferences > + \uicontrol {Build & Run} > \uicontrol Qmake > \uicontrol {Use qmlcachegen}. \section1 qmake Build Steps diff --git a/doc/qtcreator/src/projects/creator-only/creator-custom-output-parser.qdoc b/doc/qtcreator/src/projects/creator-only/creator-custom-output-parser.qdoc index 37fb44ee119..d07124bf309 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-custom-output-parser.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-custom-output-parser.qdoc @@ -12,8 +12,7 @@ and warning patterns that you specify and create entries for found patterns in \l Issues. - To view or add custom output parsers, select - \uicontrol Edit > \uicontrol Preferences > + To view or add custom output parsers, select \preferences > \uicontrol {Build & Run} > \uicontrol {Custom Output Parsers}. \image qtcreator-custom-parser-list.png @@ -40,9 +39,8 @@ To create a custom output parser: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Build & Run} > \uicontrol {Custom Output Parsers} - > \uicontrol Add. + \li Select \preferences > \uicontrol {Build & Run} > + \uicontrol {Custom Output Parsers} > \uicontrol Add. \li In the \uicontrol {Error message capture pattern} field, specify a regular expression to define what is an error. The custom parser matches the compile output line by line against the diff --git a/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc index 6498f2c70dd..63d14734597 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc @@ -106,8 +106,8 @@ \section1 Set file naming preferences The names of the header and source file are based on the class name. To - change the default suffix of a file, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {C++} > \uicontrol {File Naming}. + change the default suffix of a file, select \preferences > \uicontrol {C++} > + \uicontrol {File Naming}. \image qtcreator-options-cpp-files.png "C++ File Naming preferences" diff --git a/doc/qtcreator/src/projects/creator-only/creator-how-to-edit-qbs-profiles.qdoc b/doc/qtcreator/src/projects/creator-only/creator-how-to-edit-qbs-profiles.qdoc index bbe2c7ea594..a5037be5b91 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-how-to-edit-qbs-profiles.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-how-to-edit-qbs-profiles.qdoc @@ -9,8 +9,8 @@ \title Edit Qbs profiles - To view the Qbs profile associated with a kit, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Qbs > \uicontrol Profiles. + To view the Qbs profile associated with a kit, select \preferences > + \uicontrol Qbs > \uicontrol Profiles. \image creator-qbs-profiles.png "Qbs Profiles tab" @@ -22,7 +22,7 @@ To edit the Qbs profile associated with a kit: \list 1 - \li In \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits, select + \li In \preferences > \uicontrol Kits, select the kit, and then select \uicontrol Change next to the \uicontrol {Additional Qbs Profile Settings} field to open the \uicontrol {Custom Properties} dialog. diff --git a/doc/qtcreator/src/projects/creator-only/creator-how-to-select-build-systems.qdoc b/doc/qtcreator/src/projects/creator-only/creator-how-to-select-build-systems.qdoc index 0dfe9178a86..b2732eae0a5 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-how-to-select-build-systems.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-how-to-select-build-systems.qdoc @@ -50,8 +50,8 @@ \section1 Set preferences for building and running To change the location of the project directory, and to specify settings - for building and running projects, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Build & Run} > \uicontrol General. + for building and running projects, select \preferences > + \uicontrol {Build & Run} > \uicontrol General. Specify build and run settings for different target platforms, in the \uicontrol Projects mode. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc index acf362877d0..b9c95f32239 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc @@ -98,10 +98,9 @@ \section1 Building with CMake \QC automatically runs CMake when you make changes to \c {CMakeLists.txt} - files. To disable this feature, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol CMake > \uicontrol General. Select the - CMake executable to edit, and then deselect the \uicontrol {Autorun CMake} - check box. + files. To disable this feature, select \preferences > \uicontrol CMake > + \uicontrol General. Select the CMake executable to edit, and then deselect + the \uicontrol {Autorun CMake} check box. \image qtcreator-preferences-cmake-tools.webp "Tools tab in CMake Preferences" @@ -111,8 +110,8 @@ To prevent failures on incremental builds, it might make sense to always run qmake before building, even though it means that - building will take more time. To enable this option, select \uicontrol Edit - > \uicontrol Preferences > \uicontrol {Build & Run} > \uicontrol Qmake > + building will take more time. To enable this option, select \preferences > + \uicontrol {Build & Run} > \uicontrol Qmake > \uicontrol {Run qmake on every build}. \image qtcreator-preferences-build-run-qmake.png "qmake tab in Build & Run Preferences" diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-builds-customizing.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-builds-customizing.qdoc index 0a7c1df2ac6..48f1bf87611 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-builds-customizing.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-builds-customizing.qdoc @@ -15,8 +15,7 @@ \title Customizing the Build Process To configure how projects are built, deployed, and run, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Build & Run} - > \uicontrol General. + \preferences > \uicontrol {Build & Run} > \uicontrol General. \image qtcreator-project-options-deploy.png "Project General preferences" diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-compilers.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-compilers.qdoc index 0499de45f7a..b95dfa284dd 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-compilers.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-compilers.qdoc @@ -23,8 +23,8 @@ particular platform. \QC automatically detects the compilers that your system or \QOI - registers and lists them in \uicontrol Edit > \uicontrol Preferences > - \uicontrol Kits > \uicontrol Compilers. + registers and lists them in \preferences > \uicontrol Kits > + \uicontrol Compilers. \image qtcreator-toolchains.png @@ -51,8 +51,7 @@ To add a C or C++ compiler: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Kits > \uicontrol Compilers. + \li Select \preferences > \uicontrol Kits > \uicontrol Compilers. \li Select \uicontrol Add to add a new compiler or \uicontrol Clone to add another version of the selected compiler. \li Select a compiler in the list. @@ -197,12 +196,11 @@ these compilers, you also specify the path to the script that sets up the command prompt in the \uicontrol Initialization field. - You specify the compiler to use for each kit in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Kits. + You specify the compiler to use for each kit in \preferences > + \uicontrol Kits. To set compiler preferences according to the compiler type, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > - \uicontrol Compilers: + \preferences > \uicontrol Kits > \uicontrol Compilers: \list @@ -265,10 +263,9 @@ \title Add Nim compilers - To build an application using the Nim Compiler, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Kits > \uicontrol Compilers > - \uicontrol Add > \uicontrol Nim, and specify the path to the directory where - the compiler is located. + To build an application using the Nim Compiler, select \preferences > + \uicontrol Kits > \uicontrol Compilers > \uicontrol Add > \uicontrol Nim, + and specify the path to the directory where the compiler is located. \sa {Add compilers}, {Compilers} */ @@ -281,8 +278,8 @@ \title Add custom compilers - To add a compiler that is not listed \uicontrol Edit > \uicontrol Preferences - > \uicontrol Kits > \uicontrol Compilers or to add a remote compiler, use the + To add a compiler that is not listed \preferences > + \uicontrol Kits > \uicontrol Compilers or to add a remote compiler, use the \uicontrol Custom option. Specify the paths to the directories where the compiler and make tool are located and set preferences for the compiler. @@ -292,7 +289,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \li Select \preferences > \uicontrol Kits > \uicontrol Compilers > \uicontrol Add > \uicontrol Custom > \uicontrol C or \uicontrol C++. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc index 291450cf57e..e1949ac815e 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc @@ -165,9 +165,9 @@ not need to navigate to \uicontrol File > \uicontrol {New File} or \uicontrol {New Project}. - Set keyboard shortcuts for wizards in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Environment > \uicontrol Keyboard > - \uicontrol Wizard. All wizard actions start with \uicontrol Impl there. + Set keyboard shortcuts for wizards in \preferences > \uicontrol Environment > + \uicontrol Keyboard > \uicontrol Wizard. All wizard actions start with + \uicontrol Impl there. \sa {Assign keyboard shortcuts}, {Activate kits for a project}, {Create files}, {Creating Projects} diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-custom-wizards.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-custom-wizards.qdoc index 8f685b728dd..3abd3a1ab6a 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-custom-wizards.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-custom-wizards.qdoc @@ -85,9 +85,8 @@ \QC has some actions that can improve the wizard development process. They don't have keyboard shortcuts by default, so you cannot trigger them. To - enable them, assign keyboard shortcuts in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Environment > \uicontrol Keyboard > - \uicontrol Wizard. + enable them, assign keyboard shortcuts in \preferences > + \uicontrol Environment > \uicontrol Keyboard > \uicontrol Wizard. The following actions can help with wizard development: diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-debuggers.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-debuggers.qdoc index 4594fa34251..8762a9e97b1 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-debuggers.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-debuggers.qdoc @@ -22,14 +22,13 @@ The debugger plugin automatically selects a suitable native debugger for each \l{glossary-buildandrun-kit}{kit} from the ones found on your system. - To override this choice, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Kits. + To override this choice, select \preferences > \uicontrol Kits. To add debuggers: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \li Select \preferences > \uicontrol Kits > \uicontrol Debuggers > \uicontrol Add. \image qtcreator-preferences-kits-debuggers.webp {Debuggers tab in Kits preferences} diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc index 16f14496f8d..b6967cfcc6b 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc @@ -43,7 +43,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits. + \li Select \preferences > \uicontrol Kits. \li Select \uicontrol Add to start from an empty kit or \uicontrol Clone to clone the selected kit and edit its preferences. \image qtcreator-kits.png @@ -78,7 +78,7 @@ Typically, only a subset of the kit preferences is relevant for a particular setup. Therefore, \QC plugins register sets of relevant preferences that you - can view and modify in \uicontrol Edit > \uicontrol Preferences > + can view and modify in \preferences > \uicontrol Kits. For example, if you use CMake to build all your projects, you can hide Qbs and qmake preferences by default. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-nimble.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-nimble.qdoc index 1b89d7a3e22..d9e1f9bb8a9 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-nimble.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-nimble.qdoc @@ -32,7 +32,7 @@ To configure \QC to build Nim executables: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits + \li Select \preferences > \uicontrol Kits > \uicontrol Compilers > \uicontrol Add > \uicontrol Nim to specify the path to the Nim compiler. \li Select \uicontrol Apply to add the compiler. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-opening.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-opening.qdoc index 789dd63700c..a7290ca18cc 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-opening.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-opening.qdoc @@ -71,13 +71,12 @@ \endlist The \uicontrol {Configure Project} tab displays a list of kits that you - install on the development PC and configure in \uicontrol Edit > - \uicontrol Preferences > \uicontrol Kits. + install on the development PC and configure in \preferences > \uicontrol Kits. Even if you do not intend to build the project, the C++ and QML code models need a Qt version and compiler to offer code completion. To specify them, - select the \uicontrol Preferences link, or select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Kits. + select the \uicontrol Preferences link, or select \preferences > + \uicontrol Kits. Qt for Python projects rely on the \l{Using Language Servers} {language server client} for code completion, highlighting, and diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-qbs.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-qbs.qdoc index deb2041ad6a..bf88413305f 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-qbs.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-qbs.qdoc @@ -22,8 +22,8 @@ with the build and run kit. \QC automatically creates a Qbs profile for each kit. You can edit the build profiles by adding new keys and values. - To check which Qbs version is being used, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Qbs > \uicontrol General. + To check which Qbs version is being used, select \preferences > + \uicontrol Qbs > \uicontrol General. \section1 Building Qbs @@ -49,7 +49,7 @@ To specify settings for Qbs: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Qbs. + \li Select \preferences > \uicontrol Qbs. \image qtcreator-options-qbs.png "Qbs preferences" \li Deselect the \uicontrol {Use \QC settings directory for Qbs} check box to store Qbs profiles in the Qbs settings directory. @@ -64,7 +64,7 @@ \image creator-qbs-profiles.png "Qbs Profiles tab" \li In the \uicontrol Kit field, select a build and run kit to view the properties of the associated profile. To modify the properties, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits. + select \preferences > \uicontrol Kits. For more information, see \l{Edit Qbs profiles}. \endlist diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-qt-versions.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-qt-versions.qdoc index 1e6f3abf67a..63090c65c87 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-qt-versions.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-qt-versions.qdoc @@ -19,8 +19,8 @@ build your projects. For example, \l{glossary-device}{device} manufacturers offer special Qt versions for developing applications for their devices. - To view the installed Qt versions, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Kits \uicontrol {Qt Versions}. + To view the installed Qt versions, select \preferences > \uicontrol Kits > + \uicontrol {Qt Versions}. \image qtcreator-qt-versions.png {Qt Versions tab in Kit preferences} @@ -42,9 +42,7 @@ To link to a Qt installation: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - (or \uicontrol {Qt Creator} > \uicontrol Preferences on - \macos) > \uicontrol Kits > \uicontrol {Qt Versions} > + \li Select \preferences > \uicontrol Kits > \uicontrol {Qt Versions} > \uicontrol {Link with Qt}. \image qtcreator-link-with-qt.png {Choose Qt Installation dialog} \li In the \uicontrol {Qt installation path} field, enter the path to @@ -61,8 +59,8 @@ under \uicontrol Auto-detected, set it up manually. You specify the Qt version to use for each \l{glossary-buildandrun-kit} - {kit} for building and running your projects - in \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits. + {kit} for building and running your projects in \preferences > + \uicontrol Kits. \section1 Set up new Qt versions @@ -70,7 +68,7 @@ \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > + \li Select \preferences > \uicontrol Kits > \uicontrol {Qt Versions} > \uicontrol Add. \li Select the qmake executable for the Qt version to add. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc index 1d99a0bf650..dd3534bb904 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc @@ -19,7 +19,7 @@ based on your project requirements. To globally change the system environment from the one in which - \QC is started, select \uicontrol Edit > \uicontrol Preferences > + \QC is started, select \preferences > \uicontrol Environment > \uicontrol System, and then select \uicontrol Change in the \uicontrol Environment field. 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 3276706a95e..e71e2d26844 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 @@ -70,7 +70,7 @@ \image qtcreator-project-kits.png - The list displays kits from \uicontrol Edit > \uicontrol Preferences > + The list displays kits from \preferences > \uicontrol Kits. Warning and error icons indicate that the kit configuration is not suitable for the project type. To view the warning and error messages, move the mouse pointer over the kit name. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-analyze.qdocinc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-analyze.qdocinc index f7adfa4cd2d..e54035966d5 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-analyze.qdocinc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-analyze.qdocinc @@ -47,8 +47,8 @@ Click \uicontrol {Restore Global} to revert to the global settings. - To specify global Valgrind settings, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Analyzer. + To specify global Valgrind settings, select \preferences > + \uicontrol Analyzer. //! [settings valgrind] */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc index 82217c4d7a1..caadbe3b463 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc @@ -20,10 +20,9 @@ \image qtcreator-settings-run-desktop.webp {Run Settings} For console applications, check the \uicontrol{Run in terminal} check box. - To specify the terminal to use on Linux and \macos, select \uicontrol Edit - > \uicontrol Preferences > \uicontrol Environment > \uicontrol System. To use - an \l{Terminal}{internal terminal}, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Terminal > + To specify the terminal to use on Linux and \macos, select \preferences > + \uicontrol Environment > \uicontrol System. To use an \l{Terminal} + {internal terminal}, select \preferences > \uicontrol Terminal > \uicontrol {Use internal terminal}. To run with special environment variables set up, select them in the @@ -40,8 +39,8 @@ To disable library linking for the current project, deselect the \uicontrol {Add build library search path to PATH} check box. To disable - library linking for all projects, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Build & Run}, and then deselect the + library linking for all projects, select \preferences > + \uicontrol {Build & Run}, and then deselect the \uicontrol {Add linker library search paths to run environment} check box. The \uicontrol {Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)} option diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run.qdoc index 2a157391d08..e574c00a4c3 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run.qdoc @@ -24,7 +24,7 @@ \image qtcreator-settings-run.webp {Run Settings} To prevent \QC from automatically creating run configurations, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Build & Run}, + \preferences > \uicontrol {Build & Run}, and then deselect the \uicontrol {Create suitable run configurations automatically} check box. diff --git a/doc/qtcreator/src/projects/creator-projects-running.qdoc b/doc/qtcreator/src/projects/creator-projects-running.qdoc index a6311d58d0a..81756d4a408 100644 --- a/doc/qtcreator/src/projects/creator-projects-running.qdoc +++ b/doc/qtcreator/src/projects/creator-projects-running.qdoc @@ -25,7 +25,7 @@ To run executable files without deploying them first, select \uicontrol Build > \uicontrol {Run Without Deployment}. To make this the default option, deselect the - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Build & Run} > + \preferences > \uicontrol {Build & Run} > \uicontrol General > \uicontrol {Always deploy project before running it} check box. diff --git a/doc/qtcreator/src/python/creator-python-development.qdoc b/doc/qtcreator/src/python/creator-python-development.qdoc index a41cb1f777d..550172738ec 100644 --- a/doc/qtcreator/src/python/creator-python-development.qdoc +++ b/doc/qtcreator/src/python/creator-python-development.qdoc @@ -90,8 +90,7 @@ To see the available interpreters and choose another interpreter, select the current interpreter, and then select \uicontrol {Manage Python Interpreters}. - Or, select \uicontrol Edit > \uicontrol Preferences > \uicontrol Python > - \uicontrol Interpreters. + Or, select \preferences > \uicontrol Python > \uicontrol Interpreters. \image qtcreator-python-interpreters.webp {Python Interpreters in Preferences} diff --git a/doc/qtcreator/src/qnx/creator-developing-qnx.qdoc b/doc/qtcreator/src/qnx/creator-developing-qnx.qdoc index 8adb5ebe37e..d7ec1e64177 100644 --- a/doc/qtcreator/src/qnx/creator-developing-qnx.qdoc +++ b/doc/qtcreator/src/qnx/creator-developing-qnx.qdoc @@ -24,7 +24,7 @@ \section1 Add kits for QNX Devices - To view QNX device settings, select \uicontrol Edit > \uicontrol Preferences > + To view QNX device settings, select \preferences > \uicontrol Devices > \uicontrol QNX. Select the \uicontrol {Generate kits} check box to allow \QC to generate kits for QNX development. diff --git a/doc/qtcreator/src/qtquick/creator-only/qtquick-creating.qdoc b/doc/qtcreator/src/qtquick/creator-only/qtquick-creating.qdoc index 93a0b3ee5ad..09efdaec1a2 100644 --- a/doc/qtcreator/src/qtquick/creator-only/qtquick-creating.qdoc +++ b/doc/qtcreator/src/qtquick/creator-only/qtquick-creating.qdoc @@ -92,10 +92,8 @@ \li Select \l{glossary-buildandrun-kit}{kits} for the platforms that you want to build the application for. - \note Kits are listed if they have been specified in \uicontrol Edit - > \uicontrol Preferences > \uicontrol Kits (on Windows and Linux) - or in \uicontrol {\QC} > \uicontrol Preferences > - \uicontrol Kits (on \macos). + \note Kits are listed if they have been specified in \preferences > + \uicontrol Kits. For more information, see \l {Add kits} and \l {Kits}. \li Select \uicontrol Next to open the \uicontrol {Project Management} @@ -170,10 +168,8 @@ \li Select \l{glossary-buildandrun-kit}{kits} for the platforms that you want to build the application for. - \note Kits are listed if they have been specified in \uicontrol Edit - > \uicontrol Preferences > \uicontrol Kits (on Windows and Linux) - or in \uicontrol {\QC} > \uicontrol Preferences > - \uicontrol Kits (on \macos). + \note Kits are listed if they have been specified in \preferences > + \uicontrol Kits. For more information, see \l {Add kits} and \l {Kits}. \li Select \uicontrol Next to open the \uicontrol {Project Management} diff --git a/doc/qtcreator/src/qtquick/creator-only/qtquick-tutorial-create-empty-project.qdocinc b/doc/qtcreator/src/qtquick/creator-only/qtquick-tutorial-create-empty-project.qdocinc index c6c11ebb917..1abd280e56b 100644 --- a/doc/qtcreator/src/qtquick/creator-only/qtquick-tutorial-create-empty-project.qdocinc +++ b/doc/qtcreator/src/qtquick/creator-only/qtquick-tutorial-create-empty-project.qdocinc @@ -42,10 +42,8 @@ applications for mobile devices, select kits also for Android and iOS. - \note The list shows kits that you specify in \uicontrol Edit - > \uicontrol Preferences > \uicontrol Kits (on Windows and Linux) - or in \uicontrol {\QC} > \uicontrol Preferences > - \uicontrol Kits (on \macos). + \note The list shows kits that you specify in \preferences > + \uicontrol Kits. For more information, see \l {Add kits} and \l {Kits}. \li Select \uicontrol Next to open the \uicontrol {Project Management} diff --git a/doc/qtcreator/src/qtquick/creator-preferences-qtquick-code-style.qdoc b/doc/qtcreator/src/qtquick/creator-preferences-qtquick-code-style.qdoc index 6b179916457..333ff9694eb 100644 --- a/doc/qtcreator/src/qtquick/creator-preferences-qtquick-code-style.qdoc +++ b/doc/qtcreator/src/qtquick/creator-preferences-qtquick-code-style.qdoc @@ -19,8 +19,7 @@ To specify QML code style globally: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Qt Quick}. + \li Select \preferences > \uicontrol {Qt Quick}. \li In the \uicontrol {Current settings} field, select the settings to modify and click \uicontrol Copy. \image qtcreator-options-code-style-qml.png {QML Code Style preferences} diff --git a/doc/qtcreator/src/qtquick/qtquick-profiler.qdoc b/doc/qtcreator/src/qtquick/qtquick-profiler.qdoc index 61033ee685d..0fd232d8b9c 100644 --- a/doc/qtcreator/src/qtquick/qtquick-profiler.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-profiler.qdoc @@ -124,7 +124,7 @@ You can specify flushing settings for the QML Profiler either globally for all projects or separately for each project. To specify global settings, - select \uicontrol Edit > \uicontrol Preferences > \uicontrol Analyzer. + select \preferences > \uicontrol Analyzer. To specify custom QML Profiler settings for a particular project, select \uicontrol Projects > \uicontrol Run and then select \uicontrol Custom in diff --git a/doc/qtcreator/src/qtquick/qtquick-toolbars.qdoc b/doc/qtcreator/src/qtquick/qtquick-toolbars.qdoc index f5c3bafc894..2363e10a56b 100644 --- a/doc/qtcreator/src/qtquick/qtquick-toolbars.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-toolbars.qdoc @@ -24,7 +24,7 @@ . Select the icon to open the toolbar. To open toolbars immediately when you select a QML type, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Qt Quick} > + \preferences > \uicontrol {Qt Quick} > \uicontrol {QML/JS Editing} > \uicontrol {Always show Qt Quick Toolbar}. \image qtcreator-qml-js-editing.webp {QML/JS Editing preferences} diff --git a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc index e8d4eeb97e5..b76e90ec8ea 100644 --- a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc @@ -32,8 +32,8 @@ in the menu (1). Select \uicontrol Home to move to the user's home directory. Further, you can select a project to move to an open project or \uicontrol Projects to move to the directory specified in the - \uicontrol {Projects directory} field in \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Build & Run} > \uicontrol General. + \uicontrol {Projects directory} field in \preferences > + \uicontrol {Build & Run} > \uicontrol General. The file that is currently active in the editor determines which folder to display in the \uicontrol {File System} view: @@ -62,12 +62,11 @@ \li Show the file or directory in the file explorer. \li Open a terminal window in the selected directory or in the directory that has the file. To specify the terminal to use on Linux and - \macos, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment > \uicontrol System. + \macos, select \preferences > \uicontrol Environment > + \uicontrol System. \if defined(qtcreator) - To use an \l{Terminal} {internal terminal}, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Terminal > - \uicontrol {Use internal terminal}. + To use an \l{Terminal} {internal terminal}, select \preferences > + \uicontrol Terminal > \uicontrol {Use internal terminal}. \endif \li Search from the selected directory. \li View file properties, such as name, path, MIME type, default editor, diff --git a/doc/qtcreator/src/user-interface/creator-how-to-view-output.qdoc b/doc/qtcreator/src/user-interface/creator-how-to-view-output.qdoc index a6e4746e7c8..b83a54dbe39 100644 --- a/doc/qtcreator/src/user-interface/creator-how-to-view-output.qdoc +++ b/doc/qtcreator/src/user-interface/creator-how-to-view-output.qdoc @@ -52,8 +52,8 @@ If the text in the output is not displayed correctly, \QC might be using a different codec from the one used by the tools that generate - the output. To specify the codec to use, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Environment > \uicontrol Interface, and + the output. To specify the codec to use, select \preferences > + \uicontrol Environment > \uicontrol Interface, and then select the codec in the \uicontrol {Text codec for tools} field. \image qtcreator-preferences-environment-interface.webp {Interface tab in Environment preferences} diff --git a/doc/qtcreator/src/user-interface/creator-only/creator-reference-terminal-view.qdoc b/doc/qtcreator/src/user-interface/creator-only/creator-reference-terminal-view.qdoc index abfae8ba8b2..96cecd089dc 100644 --- a/doc/qtcreator/src/user-interface/creator-only/creator-reference-terminal-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-only/creator-reference-terminal-view.qdoc @@ -15,13 +15,12 @@ application or the \uicontrol {Open Terminal} button to open a terminal, it opens as an output view. - To open the terminal in a separate window, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Terminal, and deselet the - \uicontrol {Use internal terminal} check box. + To open the terminal in a separate window, select \preferences > + \uicontrol Terminal, and deselet the \uicontrol {Use internal terminal} + check box. On Linux and \macos, you can set the terminal to open by selecting - \uicontrol Edit > \uicontrol Preferences > - \uicontrol Environment > \uicontrol System. + \preferences > \uicontrol Environment > \uicontrol System. \image qtcreator-output-terminal.webp {Terminal pane} @@ -63,9 +62,9 @@ \section1 Terminal Preferences - To set preferences for the internal terminal, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Terminal, or select the - \uicontrol Configure button in the \uicontrol Terminal pane. + To set preferences for the internal terminal, select \preferences > + \uicontrol Terminal, or select the \uicontrol Configure button in + the \uicontrol Terminal pane. \image qtcreator-preferences-terminal.webp {Terminal tab in Preferences} diff --git a/doc/qtcreator/src/user-interface/creator-only/creator-reference-to-do-entries-view.qdoc b/doc/qtcreator/src/user-interface/creator-only/creator-reference-to-do-entries-view.qdoc index da32faf7bf0..f7d1b97a428 100644 --- a/doc/qtcreator/src/user-interface/creator-only/creator-reference-to-do-entries-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-only/creator-reference-to-do-entries-view.qdoc @@ -34,7 +34,7 @@ \section1 To-Do Preferences - To add keywords, select \uicontrol Edit > \uicontrol Preferences > + To add keywords, select \preferences > \uicontrol {To-Do} > \uicontrol Add. Set an icon and a line background color for the keyword. diff --git a/doc/qtcreator/src/user-interface/creator-open-documents-view.qdoc b/doc/qtcreator/src/user-interface/creator-open-documents-view.qdoc index 0ad0967dc0c..e758c6c2b27 100644 --- a/doc/qtcreator/src/user-interface/creator-open-documents-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-open-documents-view.qdoc @@ -36,8 +36,7 @@ \section1 Setting Preferences for Opening Files To set preferences for opening files and handling open files, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol Environment > - \uicontrol System: + \preferences > \uicontrol Environment > \uicontrol System: \image qtcreator-options-environment-system.png {System tab in Environment preferences} diff --git a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc index 9c811bd2799..27984807fd0 100644 --- a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc @@ -92,12 +92,11 @@ \li Search from the selected directory. \li Open a terminal window in the project directory. To specify the - terminal to use on Linux and \macos, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Environment > \uicontrol System. + terminal to use on Linux and \macos, select \preferences > + \uicontrol Environment > \uicontrol System. \if defined(qtcreator) - To use an \l{Terminal}{internal terminal}, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol Terminal > - \uicontrol {Use internal terminal}. + To use an \l{Terminal}{internal terminal}, select \preferences > + \uicontrol Terminal > \uicontrol {Use internal terminal}. \endif \li Open a terminal window in the project directory that you configured for building or running the project. @@ -106,9 +105,9 @@ \li Close all files in a project. \li Close the selected project or all projects except the selected one. By default, this closes all files in the projects. To keep - them open, deselect the \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Build & Run} > \uicontrol General - > \uicontrol {Close source files along with project} check box. + them open, deselect the \preferences > \uicontrol {Build & Run} > + \uicontrol General > \uicontrol {Close source files along with project} + check box. \endlist For managing files and directories, use the same functions as in diff --git a/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc b/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc index 7fdfc296f02..523906cbc75 100644 --- a/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc +++ b/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc @@ -57,8 +57,8 @@ or press \key F6 and \key Shift+F6. By default, a new build clears the \uicontrol Issues view. To keep - the issues from the previous build rounds, deselect \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Build & Run} > \uicontrol General > + the issues from the previous build rounds, deselect \preferences > + \uicontrol {Build & Run} > \uicontrol General > \uicontrol {Clear issues list on new build}. \sa {View output} @@ -133,8 +133,8 @@ To set preferences for displaying application output: \list - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Build & Run} > \uicontrol {Application Output}. + \li Select \preferences > \uicontrol {Build & Run} > + \uicontrol {Application Output}. \li Select the \inlineimage icons/settings.png (\uicontrol {Open Settings Page}) button. \endlist @@ -190,8 +190,8 @@ \li In the \uicontrol {Compile Output} view, select \inlineimage icons/settings.png (\uicontrol {Open Settings Page}). - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Build & Run} > \uicontrol {Compile Output}. + \li Select \preferences > \uicontrol {Build & Run} > + \uicontrol {Compile Output}. \endlist \image qtcreator-preferences-compile-output.webp {Compile Output tab in Preferences} \li Select the \uicontrol {Open Compile Output when building} check box. diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index d7cd495e515..9d0e642b325 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -103,7 +103,7 @@ To toggle the visibility of these menu items: \list 1 - \li Go to \uicontrol Edit > \uicontrol Preferences. + \li Go to \preferences. \li On the \uicontrol Environment tab, select \uicontrol{Qt Design Studio Configuration}. \li Clear the checkbox for the items that you want to be visible. diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-bazaar.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-bazaar.qdoc index de27eee29ff..d5d2b9a06a8 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-bazaar.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-bazaar.qdoc @@ -46,7 +46,7 @@ \section1 Bazaar Preferences - To set Bazaar preferences, select \uicontrol Edit > \uicontrol Preferences > + To set Bazaar preferences, select \preferences > \uicontrol {Version Control} > \uicontrol Bazaar: \image qtcreator-preferences-vcs-bazaar.webp {Bazaar preferences} diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-clearcase.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-clearcase.qdoc index 8ada90c1193..740eabe5a8b 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-clearcase.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-clearcase.qdoc @@ -31,8 +31,8 @@ \li Download \l{http://gnuwin32.sourceforge.net/packages/diffutils.htm} {Diffutils} and extract it to a directory in your PATH. - \li Select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Version Control} > \uicontrol ClearCase. + \li Select \preferences > \uicontrol {Version Control} > + \uicontrol ClearCase. \image qtcreator-preferences-vcs-clearcase.webp {ClearCase preferences} @@ -53,8 +53,8 @@ \uicontrol ClearCase > \uicontrol {Check Out}. If you check out files in a Unified Change Management (UCM) view, they are added to the change set of a UCM activity. By default, the activities are automatically assigned names. - To disable this functionality, select \uicontrol Edit > \uicontrol Preferences - > \uicontrol {Version Control} > \uicontrol ClearCase, and then deselect the + To disable this functionality, select \preferences > + \uicontrol {Version Control} > \uicontrol ClearCase, and then deselect the \uicontrol {Auto assign activity names} check box. To automatically check out files when you edit them, select the @@ -71,15 +71,14 @@ To create a permanent new version of the current file or all files in the versioned object base (VOB), select \uicontrol Tools > \uicontrol {ClearCase} > \uicontrol {Check In}. To confirm - that you want to check in the files, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Version Control} > \uicontrol ClearCase, + that you want to check in the files, select \preferences > + \uicontrol {Version Control} > \uicontrol ClearCase, and then select the \uicontrol {Prompt on check-in} check box. By default, you have to enter a comment when checking files out or in. - To suppress this prompt, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Version Control} > \uicontrol ClearCase, and then select the - \uicontrol {Do not prompt for comment during checkout or check-in} check - box. + To suppress this prompt, select \preferences > \uicontrol {Version Control} > + \uicontrol ClearCase, and then select the + \uicontrol {Do not prompt for comment during checkout or check-in} check box. If you change the read-only attribute of a file that is loaded into a snapshot view and modify the file without checking it out, you \e hijack the @@ -87,8 +86,8 @@ \uicontrol Tools > \uicontrol ClearCase > \uicontrol {Undo Hijack}. By default, the files in the VOBs are indexed for quick access to their - statuses. To disable indexing, select \uicontrol Edit > \uicontrol Preferences - > \uicontrol {Version Control} > \uicontrol ClearCase, and then select the + statuses. To disable indexing, select \preferences > + \uicontrol {Version Control} > \uicontrol ClearCase, and then select the \uicontrol {Disable indexer} check box. To only have some VOBs indexed, specify them in the \uicontrol {Index only VOBs} field. diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-cvs.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-cvs.qdoc index f0650434bd1..54e9b67eb91 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-cvs.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-cvs.qdoc @@ -34,7 +34,7 @@ \section1 CVS Preferences - To set CVS preferences, select \uicontrol Edit > \uicontrol Preferences > + To set CVS preferences, select \preferences > \uicontrol {Version Control} > \uicontrol CVS: \image qtcreator-preferences-vcs-cvs.webp {CVS preferences} diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-fossil.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-fossil.qdoc index e52c1c37b94..f8707657876 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-fossil.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-fossil.qdoc @@ -29,7 +29,7 @@ \li Create or designate a directory to store local Fossil repositories and remote clones. For example: \c ~/fossils/qt. - \li Select \uicontrol Edit > \uicontrol Preferences > + \li Select \preferences > \uicontrol {Version Control} > \uicontrol Fossil, and set the designated directory in the \uicontrol {Default path} field. @@ -71,7 +71,7 @@ \section1 Fossil Preferences - To set Fossil preferences, select \uicontrol Edit > \uicontrol Preferences > + To set Fossil preferences, select \preferences > \uicontrol {Version Control} > \uicontrol Fossil: \list diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-gitlab.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-gitlab.qdoc index 2efdb151dda..154a18ebbf5 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-gitlab.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-gitlab.qdoc @@ -31,8 +31,8 @@ port number, as well as an access token that you create in GitLab for \QC. The permission scope of the token must be at least \c read_api or \c api. - To specify connections to GitLab servers, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Version Control} > \uicontrol GitLab: + To specify connections to GitLab servers, select \preferences > + \uicontrol {Version Control} > \uicontrol GitLab: \image qtcreator-gitlab-preferences.png diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-mercurial.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-mercurial.qdoc index f729c382eb9..624e00a080a 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-mercurial.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-mercurial.qdoc @@ -48,8 +48,8 @@ \section1 Mercurial Preferences - To set preferences for Mercurial, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Version Control} > \uicontrol Mercurial: + To set preferences for Mercurial, select \preferences > + \uicontrol {Version Control} > \uicontrol Mercurial: \image qtcreator-preferences-vcs-mercurial.webp {Mercurial preferences} diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-perforce.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-perforce.qdoc index 595b81bd06e..3acacf2234f 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-perforce.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-perforce.qdoc @@ -32,8 +32,8 @@ \section1 Configuring Perforce - To set Perforce preferences, select \uicontrol Edit > \uicontrol Preferences - > \uicontrol {Version Control} > \uicontrol Perforce: + To set Perforce preferences, select \preferences > + \uicontrol {Version Control} > \uicontrol Perforce: \image qtcreator-preferences-vcs-perforce.webp {Perforce preferences} @@ -55,8 +55,8 @@ \l {Use common VCS Functions}, you can select \uicontrol Tools > \uicontrol Perforce > \uicontrol {Edit File} to open a file for editing within the client workspace. By default, files are automatically opened for - editing. To disable this feature, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Version Control} > \uicontrol Perforce, + editing. To disable this feature, select \preferences > + \uicontrol {Version Control} > \uicontrol Perforce, and then deselect the \uicontrol {Automatically open files when editing} check box. diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-preferences.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-preferences.qdoc index 2cdfbc73803..2bf02fbe4c8 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-preferences.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-preferences.qdoc @@ -12,8 +12,8 @@ \QC uses the version control system's command-line clients to access your repositories. Make sure that the command-line clients are in the \c{PATH} environment variable, or specify the path to the command-line client - executable in the version control system specific tab in \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Version Control}. + executable in the version control system specific tab in \preferences > + \uicontrol {Version Control}. \image qtcreator-preferences-vcs-bazaar.webp {Bazaar preferences} @@ -27,7 +27,7 @@ \section1 General VCS preferences - Select \uicontrol Edit > \uicontrol Preferences > \uicontrol {Version Control} + Select \preferences > \uicontrol {Version Control} > \uicontrol General to specify settings for submit messages: \image qtcreator-preferences-vcs-general.webp {General tab in Version Control preferences} diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs-subversion.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs-subversion.qdoc index 30aafae0d8b..b4bbe897aaf 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs-subversion.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs-subversion.qdoc @@ -29,9 +29,8 @@ \section1 Subversion Preferences - To set Subversion preferences, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Version Control} > - \uicontrol Subversion: + To set Subversion preferences, select \preferences > + \uicontrol {Version Control} > \uicontrol Subversion: \image qtcreator-preferences-vcs-subversion.webp {Subversion preferences} diff --git a/doc/qtcreator/src/vcs/creator-vcs-git.qdoc b/doc/qtcreator/src/vcs/creator-vcs-git.qdoc index 1b34918ba89..ee1ba25ed15 100644 --- a/doc/qtcreator/src/vcs/creator-vcs-git.qdoc +++ b/doc/qtcreator/src/vcs/creator-vcs-git.qdoc @@ -45,9 +45,8 @@ you run Git from a Windows command prompt, it looks for the SSH keys in its installation directory, and therefore, the authorization fails. - You can set the \c HOME environment variable from \QC. Select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Version Control} > - \uicontrol Git, and then select the + You can set the \c HOME environment variable from \QC. Select \preferences > + \uicontrol {Version Control} > \uicontrol Git, and then select the \uicontrol {Set "HOME" environment variable} check box. \c HOME is set to \c %HOMEDRIVE%%HOMEPATH% when the Git executable is run and authorization works as it would with \c {git bash}. @@ -93,9 +92,8 @@ The log output has the date, the commit message, and a commit identifier. - You can set the maximum number of log entries to show in \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Version Control} > \uicontrol Git > - \uicontrol {Log count}. + You can set the maximum number of log entries to show in \preferences > + \uicontrol {Version Control} > \uicontrol Git > \uicontrol {Log count}. Click on the commit identifier to view commit details. @@ -144,8 +142,8 @@ \image qtcreator-git-blame.webp {Git Blame view} By default, each line is annotated in the editor when you scroll through - the file. To disable this feature, select \uicontrol Edit > - \uicontrol Preferences > \uicontrol {Version Control} > \uicontrol Git, and + the file. To disable this feature, select \preferences > + \uicontrol {Version Control} > \uicontrol Git, and deselect \uicontrol {Add instant blame annotations to editor}. To view annotations for the current line, select \uicontrol Tools > \uicontrol Git > \uicontrol {Current File} > \uicontrol {Instant Blame}. @@ -490,7 +488,7 @@ To pull changes from the remote repository, select \uicontrol Pull. If there are locally modified files, you are prompted to stash the changes. Select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Version Control} > + \preferences > \uicontrol {Version Control} > \uicontrol Git and then select the \uicontrol {Pull with rebase} check box to perform a rebase operation while pulling. @@ -579,8 +577,8 @@ To refresh the list of changes, select \uicontrol Refresh. The \uicontrol Remote field lists the remotes of the current repository that - are detected as Gerrit servers. Select \uicontrol Edit > \uicontrol Preferences - > \uicontrol {Version Control} > \uicontrol Gerrit to specify a fallback + are detected as Gerrit servers. Select \preferences > + \uicontrol {Version Control} > \uicontrol Gerrit to specify a fallback connection to a Gerrit server over SSH. The Gerrit REST interface and the \l{https://curl.haxx.se/}{curl} tool are used for HTTP connections. @@ -596,7 +594,7 @@ \note On \macos, the default Git installation does not have Git Gui. To use Git Gui, install it separately. To start Git Gui from \QC, select - \uicontrol Preferences > \uicontrol {Version Control} > \uicontrol Git, and + \preferences > \uicontrol {Version Control} > \uicontrol Git, and set the path to the environment that has Git Gui in the \uicontrol {Prepend to PATH} field. @@ -604,12 +602,11 @@ \uicontrol Git > \uicontrol {Git Tools} > \uicontrol Gitk. You can also start the tool to view commits in the current document or in the folder that has the current document. To specify arguments for running Gitk, select - \uicontrol Edit > \uicontrol Preferences > \uicontrol {Version Control} > - \uicontrol Git. + \preferences > \uicontrol {Version Control} > \uicontrol Git. To use some other application for viewing Git history, such as GitX or - QGit viewer, select \uicontrol Edit > \uicontrol Preferences > - \uicontrol {Version Control} > \uicontrol Git and specify the path to the + QGit viewer, select \preferences > \uicontrol {Version Control} > + \uicontrol Git and specify the path to the application executable in the \uicontrol {Command} field. To start the application, select \uicontrol Tools > \uicontrol Git > \uicontrol {Git Tools} > \uicontrol {Repository Browser}. diff --git a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc index 64f8cd0e75e..7a84cc8c37d 100644 --- a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc +++ b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc @@ -71,15 +71,14 @@ To configure \QC for building Qt apps for the web: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices > - \uicontrol WebAssembly. + \li Select \preferences > \uicontrol Devices > \uicontrol WebAssembly. \li In the \uicontrol {Emscripten SDK path} field, enter the root directory where \c emsdk is installed. \li \QC configures the \uicontrol {Emscripten SDK environment} for you if the \c emsdk is supported by the Qt for WebAssembly version that you will use for developing the application. \image qtcreator-webassembly-options.png "Qt for WebAssembly device preferences" - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits. + \li Select \preferences > \uicontrol Kits. \image qtcreator-kit-webassembly.png "Qt for WebAssembly kit" \li In the \uicontrol Compiler group, \uicontrol {Emscripten Compiler} should have been automatically detected for both C++ and C. If not, @@ -92,8 +91,7 @@ to \QC. To add kits: \list 1 - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > - \uicontrol Add. + \li Select \preferences > \uicontrol Kits > \uicontrol Add. \li In the \uicontrol Name field, specify a name for the kit. \li In the \uicontrol {Run device type} field, select \uicontrol {WebAssembly Runtime}. diff --git a/doc/qtcreator/src/widgets/qtdesigner-overview.qdoc b/doc/qtcreator/src/widgets/qtdesigner-overview.qdoc index 390db7f2b89..71e53130bc6 100644 --- a/doc/qtcreator/src/widgets/qtdesigner-overview.qdoc +++ b/doc/qtcreator/src/widgets/qtdesigner-overview.qdoc @@ -60,7 +60,7 @@ \list - \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Designer. + \li Select \preferences > \uicontrol Designer. \li Specify embedded device profiles, that determine style, font, and screen resolution, for example, in \uicontrol{Embedded Design}. @@ -91,7 +91,7 @@ \list 1 - \li \uicontrol Edit > \uicontrol Preferences > \uicontrol Designer. + \li \preferences > \uicontrol Designer. \image qtdesigner-embedded-design.png "Qt Designer Embedded Design preferences" \li In \uicontrol {Embedded Design}, select \inlineimage icons/plus.png to open the \uicontrol {Add Profile} dialog. From 3438b03af6408a8ec029625c40cde0215da5c182 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 18 Oct 2023 21:25:41 +0200 Subject: [PATCH 35/86] ScreenRecorder: Remember the crop area across recordings of same size If multiple recordings were made in a row, the crop area was reset each time and had to be reselected by users. This change implements the retaining of the cropping area during the lifetime of the Recording dialog, as long as the clip size does not change. A potential trap is now, though, that the cropping area remains the same even if the screen gets changed or the screen recording area was just moved. But I believe that the new convenience outweighs this corner case. Change-Id: I0326dfcad6827b2d504a4e309891824b16b6a47c Reviewed-by: Marcus Tillmanns Reviewed-by: --- src/plugins/screenrecorder/cropandtrim.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/screenrecorder/cropandtrim.cpp b/src/plugins/screenrecorder/cropandtrim.cpp index e7b113cc194..c52cc011610 100644 --- a/src/plugins/screenrecorder/cropandtrim.cpp +++ b/src/plugins/screenrecorder/cropandtrim.cpp @@ -783,8 +783,9 @@ CropAndTrimWidget::CropAndTrimWidget(QWidget *parent) void CropAndTrimWidget::setClip(const ClipInfo &clip) { + if (clip.dimensions != m_clipInfo.dimensions) + m_cropRect = {QPoint(), clip.dimensions}; // Reset only if clip size changed m_clipInfo = clip; - m_cropRect = {QPoint(), clip.dimensions}; m_currentFrame = 0; m_trimRange = {m_currentFrame, m_clipInfo.framesCount()}; updateWidgets(); From 479f955e941f7b8a1ddede2ad758d0df39747407 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 19 Oct 2023 08:39:25 +0200 Subject: [PATCH 36/86] GenericDeployStep: Add missing reference, avoid auto Change-Id: Ib240bfefaea6c0637cbe66310cb4cc98db78c0d9 Reviewed-by: Reviewed-by: Jarek Kobus --- src/plugins/remotelinux/genericdeploystep.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/remotelinux/genericdeploystep.cpp b/src/plugins/remotelinux/genericdeploystep.cpp index 9ca4063e390..5def5465258 100644 --- a/src/plugins/remotelinux/genericdeploystep.cpp +++ b/src/plugins/remotelinux/genericdeploystep.cpp @@ -99,7 +99,7 @@ GroupItem GenericDeployStep::mkdirTask() FilePath::removeDuplicates(remoteDirs); async.setConcurrentCallData([remoteDirs](QPromise &promise) { - for (auto dir : remoteDirs) { + for (const FilePath &dir : remoteDirs) { const expected_str result = dir.ensureWritableDir(); promise.addResult(result); if (!result) @@ -117,7 +117,7 @@ GroupItem GenericDeployStep::mkdirTask() } for (int i = 0; i < numResults; ++i) { - const auto result = async.future().resultAt(i); + const ResultType result = async.future().resultAt(i); if (!result.has_value()) addErrorMessage(result.error()); } From 901e32a0ea52de68221b2db4037a5881e100d4f8 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 17 Oct 2023 09:44:20 +0200 Subject: [PATCH 37/86] Utils: remove Q_ASSERT in FileSystemWatcher In the worst case scenarios we either track unregistered files or do not track the files that had been registered. Both are less intrusive than a crash. Change-Id: I880d80dddc401fd996ac1f18e82414665510fd30 Reviewed-by: Christian Stenger --- src/libs/utils/filesystemwatcher.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libs/utils/filesystemwatcher.cpp b/src/libs/utils/filesystemwatcher.cpp index ac9043f878c..7933d31543e 100644 --- a/src/libs/utils/filesystemwatcher.cpp +++ b/src/libs/utils/filesystemwatcher.cpp @@ -275,7 +275,7 @@ void FileSystemWatcher::addFiles(const QStringList &files, WatchMode wm) d->m_files.insert(file, WatchEntry(file, wm)); const int count = ++d->m_staticData->m_fileCount[file]; - Q_ASSERT(count > 0); + QTC_CHECK(count > 0); if (count == 1) { toAdd << file; @@ -284,7 +284,7 @@ void FileSystemWatcher::addFiles(const QStringList &files, WatchMode wm) if (!fi.exists()) { const QString directory = fi.path(); const int dirCount = ++d->m_staticData->m_directoryCount[directory]; - Q_ASSERT(dirCount > 0); + QTC_CHECK(dirCount > 0); if (dirCount == 1) toAdd << directory; @@ -315,7 +315,7 @@ void FileSystemWatcher::removeFiles(const QStringList &files) d->m_files.erase(it); const int count = --(d->m_staticData->m_fileCount[file]); - Q_ASSERT(count >= 0); + QTC_CHECK(count >= 0); if (!count) { toRemove << file; @@ -324,7 +324,7 @@ void FileSystemWatcher::removeFiles(const QStringList &files) if (!fi.exists()) { const QString directory = fi.path(); const int dirCount = --d->m_staticData->m_directoryCount[directory]; - Q_ASSERT(dirCount >= 0); + QTC_CHECK(dirCount >= 0); if (!dirCount) toRemove << directory; @@ -381,7 +381,7 @@ void FileSystemWatcher::addDirectories(const QStringList &directories, WatchMode d->m_directories.insert(directory, WatchEntry(directory, wm)); const int count = ++d->m_staticData->m_directoryCount[directory]; - Q_ASSERT(count > 0); + QTC_CHECK(count > 0); if (count == 1) toAdd << directory; @@ -411,7 +411,7 @@ void FileSystemWatcher::removeDirectories(const QStringList &directories) d->m_directories.erase(it); const int count = --d->m_staticData->m_directoryCount[directory]; - Q_ASSERT(count >= 0); + QTC_CHECK(count >= 0); if (!count) toRemove << directory; @@ -438,7 +438,7 @@ void FileSystemWatcher::slotFileChanged(const QString &path) if (!fi.exists()) { const QString directory = fi.path(); const int dirCount = ++d->m_staticData->m_directoryCount[directory]; - Q_ASSERT(dirCount > 0); + QTC_CHECK(dirCount > 0); if (dirCount == 1) d->m_staticData->m_watcher->addPath(directory); @@ -474,7 +474,7 @@ void FileSystemWatcher::slotDirectoryChanged(const QString &path) for (const QString &reAdded : std::as_const(toReadd)) { const QString directory = QFileInfo(reAdded).path(); const int dirCount = --d->m_staticData->m_directoryCount[directory]; - Q_ASSERT(dirCount >= 0); + QTC_CHECK(dirCount >= 0); if (!dirCount) d->m_staticData->m_watcher->removePath(directory); From aee3d9323719c5bbc5bf11a222372bc4eb6b28fb Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Wed, 18 Oct 2023 10:24:48 +0200 Subject: [PATCH 38/86] Core: Use QDialog::open instead of exec Task-number: QTBUG-117814 Change-Id: If92d627c2ae71721e61916cf50c26f5a41e35725 Reviewed-by: Eike Ziller --- .../coreplugin/dialogs/settingsdialog.cpp | 49 ++++++++----------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 1f7aa77d2e4..d503c71671f 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -455,7 +455,6 @@ private: QCheckBox *m_sortCheckBox; QListView *m_categoryList; QLabel *m_headerLabel; - std::vector m_eventLoops; bool m_running = false; bool m_applied = false; bool m_finished = false; @@ -757,11 +756,6 @@ void SettingsDialog::done(int val) ICore::saveSettings(ICore::SettingsDialogDone); // save all settings - // exit event loops in reverse order of addition - for (QEventLoop *eventLoop : m_eventLoops) - eventLoop->exit(); - m_eventLoops.clear(); - QDialog::done(val); } @@ -773,29 +767,28 @@ bool SettingsDialog::execDialog() static const char kPreferenceDialogSize[] = "Core/PreferenceDialogSize"; const QSize initialSize(kInitialWidth, kInitialHeight); resize(ICore::settings()->value(kPreferenceDialogSize, initialSize).toSize()); - exec(); - m_running = false; - m_instance = nullptr; - ICore::settings()->setValueWithDefault(kPreferenceDialogSize, - size(), - initialSize); - // make sure that the current "single" instance is deleted - // we can't delete right away, since we still access the m_applied member - deleteLater(); - } else { - // exec dialog is called while the instance is already running - // this can happen when a event triggers a code path that wants to - // show the settings dialog again - // e.g. when starting the debugger (with non-built debugging helpers), - // and manually opening the settings dialog, after the debugger hit - // a break point it will complain about missing helper, and offer the - // option to open the settings dialog. - // Keep the UI running by creating another event loop. - QEventLoop eventLoop; - m_eventLoops.emplace(m_eventLoops.begin(), &eventLoop); - eventLoop.exec(); - QTC_ASSERT(m_eventLoops.empty(), return m_applied;); + + // We call open here as exec is no longer the preferred method of displaying + // modal dialogs. The issue that triggered the change here was QTBUG-117814 + // (on macOS: Caps Lock indicator does not update) + open(); + connect(this, &QDialog::finished, this, [this, initialSize] { + m_running = false; + m_instance = nullptr; + ICore::settings()->setValueWithDefault(kPreferenceDialogSize, size(), initialSize); + // make sure that the current "single" instance is deleted + // we can't delete right away, since we still access the m_applied member + deleteLater(); + }); } + + // This function needs to be blocking, so we need to wait for the dialog to finish. + // We cannot use QDialog::exec due to the issue described above at "open()". + // Since execDialog can be called multiple times, we need to run potentially multiple + // loops here, to have every invocation of execDialog() wait for the dialog to finish. + while (m_running) + QApplication::processEvents(QEventLoop::WaitForMoreEvents); + return m_applied; } From 5cb40870b105a755e86c50b1784aed29deafce2d Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 16 Oct 2023 19:56:53 +0200 Subject: [PATCH 39/86] Tr: Fix some source texts Change-Id: I06458b177af2691a362368faed2b6bea3883a2f5 Reviewed-by: Eike Ziller Reviewed-by: Leena Miettinen --- src/libs/advanceddockingsystem/dockmanager.cpp | 4 ++-- src/plugins/clangcodemodel/clangdfollowsymbol.cpp | 2 +- src/plugins/coreplugin/vcsmanager.cpp | 5 +++-- src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp | 2 +- .../cppeditor/followsymbol_switchmethoddecldef_test.cpp | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/libs/advanceddockingsystem/dockmanager.cpp b/src/libs/advanceddockingsystem/dockmanager.cpp index ee21f77ac29..49ce3945748 100644 --- a/src/libs/advanceddockingsystem/dockmanager.cpp +++ b/src/libs/advanceddockingsystem/dockmanager.cpp @@ -1345,13 +1345,13 @@ expected_str DockManager::exportWorkspace(const QString &targetFilePath // Check if the target directory exists if (!targetFile.parentDir().exists()) return make_unexpected( - Tr::tr("Directory does not exist\"%1\".").arg(targetFile.parentDir().toUserOutput())); + Tr::tr("The directory \"%1\" does not exist.").arg(targetFile.parentDir().toUserOutput())); // Check if the workspace exists const FilePath workspaceFile = userDirectory().pathAppended(sourceFileName); if (!workspaceFile.exists()) return make_unexpected( - Tr::tr("Workspace does not exist \"%1\"").arg(workspaceFile.toUserOutput())); + Tr::tr("The workspace \"%1\" does not exist ").arg(workspaceFile.toUserOutput())); // Finally copy the workspace to the target const expected_str copyResult = workspaceFile.copyFile(targetFile); diff --git a/src/plugins/clangcodemodel/clangdfollowsymbol.cpp b/src/plugins/clangcodemodel/clangdfollowsymbol.cpp index ee56e3f4c75..8be15c7327d 100644 --- a/src/plugins/clangcodemodel/clangdfollowsymbol.cpp +++ b/src/plugins/clangcodemodel/clangdfollowsymbol.cpp @@ -340,7 +340,7 @@ IAssistProposal *ClangdFollowSymbol::VirtualFunctionAssistProcessor::createPropo items << createEntry({}, m_followSymbol->d->defLink); if (!final) { const auto infoItem = new VirtualFunctionProposalItem({}, false); - infoItem->setText(Tr::tr("collecting overrides ...")); + infoItem->setText(Tr::tr("collecting overrides...")); infoItem->setOrder(-1); items << infoItem; } diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index ce4138721fc..4e04a687d80 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -333,8 +333,9 @@ FilePaths VcsManager::promptToDelete(IVersionControl *vc, const FilePaths &fileP return fp.toUserOutput(); }).join("
  • ") + "
  • "; const QString title = Tr::tr("Version Control"); - const QString msg = Tr::tr("Remove the following files from the version control system (%2)? " - "%1Note: This might remove the local file.").arg(fileListForUi, vc->displayName()); + const QString msg = Tr::tr("Remove the following files from the version control system (%1)?") + .arg(vc->displayName()) + + fileListForUi + Tr::tr("Note: This might remove the local file."); const QMessageBox::StandardButton button = QMessageBox::question(ICore::dialogParent(), title, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (button != QMessageBox::Yes) diff --git a/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp b/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp index 19fc0890257..34aa3d6fd07 100644 --- a/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp +++ b/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp @@ -94,7 +94,7 @@ public: QTC_ASSERT(m_params.function, return nullptr); auto *hintItem = new VirtualFunctionProposalItem(Utils::Link()); - hintItem->setText(Tr::tr("collecting overrides ...")); + hintItem->setText(Tr::tr("collecting overrides...")); hintItem->setOrder(-1000); QList items; diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp index feac4e70fa7..21664ea1402 100644 --- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp +++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp @@ -449,7 +449,7 @@ F2TestCase::F2TestCase(CppEditorAction action, first.text = ""; expectedImmediate << first; } - expectedImmediate << OverrideItem(QLatin1String("collecting overrides ...")); + expectedImmediate << OverrideItem(QLatin1String("collecting overrides...")); } QCOMPARE(immediateVirtualSymbolResults, expectedImmediate); if (useClangd) { From 720a77e0c0f13156ade37b76ca0f2ed1dee664e2 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 19 Oct 2023 11:06:00 +0200 Subject: [PATCH 40/86] Tr: Fix camera mode switcher action name Change-Id: Ifae8d8551aa1c1869dc12993d25adf17b174edb3 Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri --- src/plugins/qmldesigner/components/edit3d/edit3dview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index f8c1cc2a7e8..028732cebca 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -716,7 +716,7 @@ void Edit3DView::createEdit3DActions() QmlDesigner::Constants::EDIT3D_EDIT_CAMERA, View3DActionType::CameraToggle, QCoreApplication::translate("CameraToggleAction", - "Toggle Perspective/Orthographic Edit Camera"), + "Toggle Perspective/Orthographic Camera Mode"), QKeySequence(Qt::Key_T), true, false, From 6ae4d71a1b1e4095d7736cb3186609a16868b883 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 18 Oct 2023 16:53:07 +0200 Subject: [PATCH 41/86] Doc: Update GitHub Copilot docs - Change link to Neovim plugin installation to point to the Readme.md - Add instructions for macOS users for finding the About Plugins and Preferences (using the \preferences macro) - Describe proxy settings - Fix a changed check box name Fixes: QTCREATORBUG-29734 Fixes: QTCREATORBUG-29613 Task-number: QTCREATORBUG-29392 Change-Id: I2b392e805322fd95a7b87295756d5df76015bbbc Reviewed-by: Marcus Tillmanns --- .../images/qtcreator-preferences-copilot.webp | Bin 8724 -> 10032 bytes .../editors/creator-only/creator-copilot.qdoc | 39 +++++++++++++----- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/doc/qtcreator/images/qtcreator-preferences-copilot.webp b/doc/qtcreator/images/qtcreator-preferences-copilot.webp index b98f74e43dfca45013258dc0e9738cf29b74a108..48df99f87b113039d897fcafedd9b01d78ccd46d 100644 GIT binary patch literal 10032 zcmWIYbaT^CXJ80-bqWXzu<(&lXJF93?lgnpDp&KiUKQ0piRU-(-pec?D12Z(_c`%B zJGfk@i2QLql$I9|5a>5eqv3cA(;Lgm*M<+gzp?3^$vKmIZGBXL!GwEW3pUCY)w}1L z@W=lwJf|=4_V%%YPiq|)KNl}C61S}T>dIxfqGM0!&iAgX?EQ9p{r^99>BN82Z^m7& zesBA%$yCvJvQwwx<3+)`!Siz8?+rJ)U7cE8TlHV{{Li_E_ZHl}{_FOh9*vtVim6;n zW(XHNSQOV;y!b^VOSee&ZSCzp8+hE7PX5i5)p>ijNmpRR4D$z~B9#I8lOiw1CRtAM zUp(i}`a2o_KX3cF_kYtB*$3xb_E|V^n5}xkdMC3f0{l+@Qzog)#^IuBNGN?O|PyQA_w0WXlN~HEVYoy;`U|ze%?}M)&DILo?^G% zk{uXo3k{5amxL{OXlFMmezk9ZL--Gcs9F2Ba@|waWju0a?c@ONi^2cbmd`Sn{IkNu z^uNF%pSV6P{qLPU;&TLidEbiE4QOQ=Tv<%NxU75X8nxvNaLvzsuSISv;U0KeSx6r|4s=KdWcSaEZ@}*NXnrBpnbZH%bP$p-rIw4B?|He=9 z;v9<%R(l@YacO;U@W&&(^F3Q6tQHkFm~!{N+~K7d_LOVMGW!{yjxT1mNe$~>vgV%T zq@r0-6&&YJaPg>_hKMp}X8Bc3gU7ugP&gzKf6Gx6U@xMQ`IVAio zeQF=}?{WK&8+P;0Kc9VIu8V!}r9JFZxw$m8pV~g{GH}?g#V+3V;l9|0sDK@73vN!j zZWMU&jkBfprtQBxRo}b5YOYCSUXuT#CxJ(4(}EDzgNny_*TqW?5sN zo(|o=m6MyVWNCNVDhG6YnbaI>sj>W2pz<32LywoTv`%TQp89`D;gmmyt#5x=mQ2f3 z^wC_N`6Fqo$Fi9#W*k_Nef{%Cj;$v+x3DE22%5A?f6dg8lZTFp-eBOdICkY*pXn02 ziPN+*HLLeM{PA_~w5%_x`Z1!n$sORp7Le3r0)*uby4?>E->HB5yzI&t*~RIi8Yh433mrIxH&N z_-IyOi$M>eD|+!>Fm_r zdk!x?o-Np@^yYl&CBEk?jd?ofG_VwWvs@L+?$)Gg{L&yYneY3tD}BN{GFa?e^c7FH z*u|Q!US%3z`N{jXLK3|*E_;ps$`mm5{p-X^?DwESIvzeZ`XYumb0 zDnFmOFI~gcSZ1-=y);3+;=PeD^R&rNK#4?1F7qI-%(>^*NlP~MG)iesJF;fs zUi+3&YRr9OEIZrq!Okh^Y64zd*m>(M56*VpSMH$mt71M1x>vmt4j571O#};(X z_2-=8zeSvT=H9=4Tu?Ipcl0D#?jKY0A{+BpFglL~fh2vF^UgB7RSA4&&_fI!7^PYj5YS8`~96_OZH5OYLrOdh6xFKj~Fz z--p+h9e)Zv&fCa7eDw6g`_0Yzc5|1`4N{o+df%d(zl*vZ2C+H#Z?FGLt18DxLtSiKs@F@*%)26! zEvBhGBbC?S!O6morQ44^Z9IF0?~z(?-;}iq`JNq@XLp~eHSM>wW596>|USUOfPu0oM`8Kc{xTh>gQ}bFd_HhwZU$pCiT>YgGzpnMQ|-IYrF2-SIZreezJG>#SbWsqV`%--XXo zJ#}7d$%BdPO9cYzEZQb1Kk+)Ix>iN?o#v{(8Nxq!wjZyU*jd3gtNB>RdTYMG_`H(O zikdTOZSLRcGkDq}`k`2BBTt6}dqtEb_cYbJ8#X@8FtO$g5&U{#R+jSR!j4aq4V4-{ z6&-8~;?Wn6JZZ3Irqro|Q)^R|<~2T(Rte92Qkfuh@Bpht6W1iUcUMwbH}_AzEx2sX z2Btbc)oF}fjQT6`6FL=-YQ6uVs{iTiG}Xpl-R16^t+h=8CN`N~by+4_zXM|Vv8>qeGSS6m2Jgy89m-*r$*g~5yh6T69!c<#OwduxOkEkMGDR~{x$*I?>bZ?C zFXo5`Ol(@azte~Nz=Ru4kq33Y+(|JBG!ba-**<0Yn}X)47s7=+S|)vTUUKoqj%0SG z@*{gpGk=t(?@Z18^5>m@rww=brQ~C^Cufu_e-@^8y2$3`;uU*ueD*lRr~pcOVErx1z!Yb#?4vJs;M<2a(!`2{MmzLGBuuex6~IKR`n#t ziBx^umHoVk=kl9{S~G7xw{*5I7C+k4P|YK`rdrO@Vw;hyKHCSg+9uUGG45A-zqsA4 z?fsIt6O3$wKxyn2<^&uggOFxPC;g4D2&KjPf_wuK)#urOj# z+VypDg3_Pm7hTNl`4AAM_UR4Z-&?vjEi6sBWVvRS7sbx{`|zROyyWC0m$lkry3&5a z%X6~sIBnegA!SDDt~;N;UMN2PT2gk>yRd_=9n$j*4qBZ)5goT>(Zo+3Z>%*pC(X4h znj@Gm;_AM6#mt9Kw{4uxTV5hvY4K_8S(Ua@i%G2OV|ynXFTSvFL#6ul<(9Y9XMMVV zKSgKON*Bu`nzQ4#J$NJVZ;k1dqX%Y2mVe0g{c!nZp2$k>r7yWITg#VDUHtT6O>U&f zYdg2T!*S94VLI+-dGz=9vL0}gO*ZIEPD-|G zy7;!R;Enw?m!uy*)7o{o zrYW{vN#%=Ao4cSxAe3SDyKfHV&%{b(3yZ=J+>MnB|8}>}=HRaB6P4eF=3alwCL19r zU40||hV0!i!C2Xo*XB+(tjLv6lAi3kpHFvlbcsR^Us3O~JLm39vkbVjF=LU?6NBYC zrrc-wrmj46qNFmtM|-nh!S-KlH%hj%H=es=kg{N&*b(0)QOwxc0S>I<)ZR@{&dNTii*f1 zizaiw`h20==~S?omw_x>X{N_Hd+{FqASJ8q3;g)^YAmryUC3}bG2r@ZnTOY_H^{ad zEKc4&Z$UwYwUnCvx4*qBKPBWY%X#;-^I*V<_~#1toA>dSvL9cmt3KmQlq^GA#YWX_ zoC-D<``=dno5fbSpLgHB%UU_SvlL4Hc-PO^v-R1Tn$7*|&Bfhb3IE?MJ=1$?*^OnD z&%aAXaDM37e0z1rmKUpEyxjFiAwH&ddFc%)lbaU`6@2c^GXH$`(a9zePj_MKH=FB{ z<|kciYG-`Zq2-m;(CBlqR8ruD^;-^(+ZPHoN?xC>G0uW0Jz)Gz{uSf8-4<`obME-% zm))QyZN=A^vhS|I5)Z3c0xVbB*u@@A70m2-`RUKryAAo(zx=EZU0ZOnr7toz%We=~uz4StYzqNB=T;o8R^2^wRq-pZ+~lmd^9t+qhx*Htxv} zx%F^`l1o{A)>L*U6-KAyRzCO2FYS(dzBcUNuYu6Xf&s_dz zk;PS!y4!L!XAD=GpWfcyJ(Eu-V}Jal51Ufj582dyEh@O;ls3;^?`!hf`}_XJ?*5RU zb*TQ=v-|yPB)>m&F#nM9LI3{Gjnn4KY*&5exbp8$Rq2n?Z(9m>&7Zlvt7nOu%h3y) z`&D-?+E}|!l{--&Zd$dU{j`rYZ@eeD19ZOe;qKQ!e&(@?tf&iQAx z>GR_5mw&6=%<#b2UpKL(_RYbb!{SnRzYDT{e;6R(qbiwGU$f17=ls0mb6kI)pYM13 z{i(JYojT>uG+kF-elVj{`~8gzPabyuR1;Wy+)!-Bms1j#7Wccb6~3%dw*JKbh2iWZ zo#)*5W+=7W9qWiY>XOD5r+>QG}wf`_|t) zxNUhdtI@Txn(nDZz4QCuohUj6U8_usxgzVY9m)(f*MYrk~gum3&0^d;-B zDkblEm0bZvXUZCbJ)g=-&-(u1h{i?cH%VgF0b7`ASR~J=Zd3kmae>*yd(#}7mSxPs z?@o4};h7UR?ZpHe50k)r=eD<hCl`9`}_SHmb^=1iF6VxI2mP_&b^zWztGo>PL|OgrS$nc$Y7gtA3@lAS-x&6_b} z{VAog1sSbBPE6-eDtoeg(j*;m4!K_v6RjmT?7Vv?ZrXE!X%j_4uT=jvIk|U-W2c>! ziQ!&ZZd@{T6tg-(L=IgQroefu% zxIX{kzAO7dEd97x`tEFBe#P$v#~6Ah%}DQ3f<&UFnt<}tE?JGJ|8`o(98Svg&TwgZ znjqx-;lgo;-dQKk9D1Ib$@eoYrn%~};=hwZj7M zu0>`ark>C&f2Qf>dB)gvVtGzRyYWx)%;Zl;V&cWx7F1u-o)Nj$U!FC2Ny**0vs{i8 z+3#t$TlQe)iJaG;H(9jT7_X~*#;LrP%_=smQ^LoO<9q-5+}(>mePWrXxxIy{N$q7? z+Kjh-TV>BLC=FpcR&k(s?QiAw>yk76SuQV}pK)lqWTlpn?u&(Y{Txqy*45AB+R|E> zQMooXWoN?wT_+v-Pk)cF5lODBKWoulmJulMl>K~bd$Rj?o-aFU`j0yAdiwP3;rLC? zU#;AKeAUT0zVP}Cga3CHoi?xU_-3W?Y36^AFQ-zfg8t8yEIIS*%4ybn``$mk%k}(6 zOU-7dfY`2tWykq1h&&0YHsD*DB(sWJrt{H~85^RQOm5yN`}xdrcaM(Qv!0I;r({k~ zT_%{nE`7q5?T-(HcNOll6x*0+vRYYV^9Pq1a%ZcSn(uQd4DyN4W1MBLlD08=@uV+B zODnl%zLI43oGsYoWA1NboHb8bgE=s5Yx%4Xs$G+l4%Kj8kXw?n(eqrylkP^d<}*#! z8NnZJXx7YUIqZ2U_{qw|{8l#459H zERM{Vs1`}^G)&yblEELe=|;-V^E%hpW(aE@?>y)@o9%?OjDtjTHtS_2|FbXU*NXqz zvr|2A&a|g(-xuwEzk9-@qt~=&=Dk+m#;9ZKeXQVuTk?y83j;SCRt?VXQL~$QdC~Nf zO~+e|RdmmsSvKd+UJo%FwK-~;iuZm?&)9Y6cFMuzLw263?t2z%=Ir_RJxu)XbM3np zbIzw<`($R69MQ;oT1n{ame{;|wr?Y5_8$CpeEPBT|F`a8v`<|b@0~2PSyyYD?X_b%&c)JDy%cJ1eq>Qo_93h3mmdHcg{ z*Nc+34gM?s6c!i0Dc_%>=J?y_@Wk4E@ACR$uWmmteEVkX+8Aw!q9L-o1KiD^qZmCfukueup2K^tpb&B5u8_`p8bt%llN*ZpbyBu)S&7 z@^Y8(twMP|nW}&K=j*F^#j;}u#BLoeFMFR_lr$;nzx9Bv#)6UEvSGZuYGu!H! z4c*BRZj%?-GTk%Z|1$RK+qN4w{}vppcbO}6?p5Pb^|X~mI+|x*2z-vbIdk2KfE)84 zRlhnddv~dYeP)r)t!>tm*S(MLHH@s_OguViLU`u&%{(r~%vF9HRMZ@QUrNq=3?6A*>B!^;aA$)O~Lb4|CA2*zj%MAF{8}ZxOH2F zFSK0qToZ09xPGbi_21U~zuk5w_8s^CdSg}fzqXg3b^jIguiZ6Gv4``E%kMc?vt<^R z7ThscU%2&s@8viv_fo4T2kx49dhUuj)p+gR9N`|$-pPO0sW}~&nQnDae$PJ3j>fwD z57mb|>P*`Y&+_)4IK_2(^tG4;=I!l<3kxrKhx+fRvQM>q@n^67$AuR^G2M;X7x|d+ zZsD{&X6;;t7dRXaJ)XURId}c{-341Gc+C0m#P?N$p7qk4~4F4`udt`E@p>FOw{0E2KG$yxT-P2Gc8>HrlxQ%e zt*hhgBEgsf4xS~Czt+D}EbCaiLU8T`Kc&Mf47R%N>hAa`Tecv&o9)ut-4(L^&lmk) z^XK@f`acgCo?kE)3J*7&c~SMiRSmDrB79tHmdVwrZB^p1=r)VIS~kt?cA-a9sG-&- zo_$(>Lv|fv&~8b)6doGG_|Wy)W(`qEnblgyeEJrd2d&)tVbPb`Oy-v6c}ETOKF(NI zW>Ft{)Rceuh4V}FUVgoD`NWs*kgnZ7ie_4NC;tAEv|9FDd}!g>!&yI+jQ%EB|8e=X zY>Uv+Lw7bTm++caaYt9(yf*ac)%;}Pn&@9MQ)aoldTHM@=jJq;bgOyS&oy7H9KKJ{ z^^6ZKWc{=8hyRkl6PR4`Z%(QU3+<_8eap(cr*6M&`>L7SSEat_{I#89%eAn7i`Q#L zUC^+~Xi1b^BIm>wl%;!3`SG*`&2BSaTOE#A9<@R2nxaigXX2J%U5Vq)btzM}U1{P` z3c3-*9We3Iw5W#8Dci0v`7GJ8R4hfwM1PiU_mbk+9kT7On%UI8>S#VKel5?Ix~Ke( zQ^()!vzRwsX{u8Dx@Yd+9jWK1ozL2PW&KIF@S{C_l^0{~J4}lTa1T4bv~q9bQ^9cU z60SwF->ej~X(>6^{p`b5#_l-+N8ZJhhl@{ezO-I-_0Bnw`5)KKInUl7?)AJf)`+53$)z(iAxdO)5vzb4Bu;Pn%xG(Z@VdXdFm)UH;JlfXt zM!aZIxF)+Ia+S+#Z`ZTGQg%#uy5!r6t#cytlW+cr@Yp5xKV{y!-qf4F%5>MgbXsS% zart(`$F~|>{W+3K86&eAC&zqh_5I})mOYb2b>-E$jGE1s<*fegPtMIuklXbv@s{QC zfNLpL&xAiJrB=C3UBcs5-Xym3h{gL5Zlhh#T#FBFWt^2*eyWga zz4-E^J*ulqOIdWZXA~WB?5cF;x_Z@cd4SeE%l0i+X*#ckHBX;=aiyp3Y|59j-Oqk( zW#pbKaO9`k-GicA#qw`xC})MGmuz??tl7TA-(~wGM@{!w)net3G9~Q66PL^0e{`Mg zOu3VQHecQO>Z@*>9`EM(_ipFnhbLsY+|O-Xe$Cv_T1)|OHmF- ze(+^q$T{XPYj4%X{}$`C|Nq|c@4?>w)pvwj(F3Vcf47x-*W`s{ z`>K5oI(Y4<-MY0~KZH&`xi@4(=*Ir+?1!t>CReXacrGovu|NCIs*_LRv~E~t#mQd} z(ihF)ee*c#)zYT5jeqsH_l9g({p#0_xEIpLOP|``()wSzS~~68i>oI~SASlXlUViI zQT^hs9eJgUYKPhbS9HG)6E_H(`aCYQ^Ukb@KIzaI3$)fn$4*e4Dxp40GsPVl`RWutj{YdW8YJwuG3@t~o#CMmTzBu#yV*8(Phjgy`ITE=hu!aURy`Y? zC}|t`-*&;)ZJ*?8e}72c%vJyM!}><4KcVaQ|9xM(@ss?cMgJey+VCxF4so5gex=Hl zV?Sqgu{ia8-?;DM>JKe)o2}=)+BN&u!&0`&_s>r5vWTDDHnYa_{+ua)`j%HsNYB}A z-SJao_vJo;qCNc|-PT_+S67|;^w>PdxaW6mA~m09zk0{^;GLy&{uiwSU*jG&e$Jb> zrvJ0)#OCU@nK%0<@4LF{#T(zW!+vFJ>(|(wyRPErvUk_T)h{&dw{12rt$*^vig_=) zdVv4)?5@2JckB9?hMk#IOnJWZ-gC9<|G3MCZdnkha#>!iaIUwwNOxmUSOrdK@d0(bC-ZIAHz5d{fV=z(W`JOl~fnzkT7F#nO#olPlV1 z-?F|k- z+y&z84`g=#?8kR)Z(LK|*XvoEt|k55xAM}CclX+==5GJh#rnZ&A9LLCnY&)t?_~^= zd~YJ>#Ifw+)Cm41pUf)E6Q;^JB_7*Yx%J9t3EzcNjr5wAryWk-bNtHZ6AEI-8&)4z zXg(>!y6zlj$TH3q^P0U2WM*HS>3v^}U(fN&k;1j>Gg`c!Mt;n7F=0KHZndc}X0dE{ z@Wz&p(@(2w-ksh0z;14cuD98ep!gWSAiM2<{d7EL9+Q)L@Ne^rXr>p9`wDaRO_uOF zCghhl?aIIT>R+!L&EL9zhimM#pCRXJ_b>4&{kgOLGxxFy?FEl-63dS13ER16~@N1E3__mQ;|Fze@9P~L#ILS78Q)5gm z#e?KS{>m_4XbvxOUFb4n<%Q{;PBP(DIrAN|`s~a+-ZEbBDLL-Q{qs?oqrBAvsSCVb zS03&7_pxRlqh^Kal;7@m)X!di9>?ILEA{W`VW+$a%UATIM!tPCyCZ|IC%L%f(GItJ zH9pRH)9mv3BqzFLMg>{6+Hfo?`@&neQ|M=5&bIGD?2Fv$&Q-FknAez@CNo=E{`l6k zLmH2bW0eD$W9ByTsO|TEZt$T*X4Zq)3!fu8_ws(|ntb3Q=S7awN3(+YYvliE33u(~ z{};PLe*NQ*F&<}5)pvA%Ki|CJL-E~(+t;=9>}!wijqbPoyPog$+Wxc!(i7NC^K8G} z&4_2YvhC}Q3a6_y|4?XdL8d-Cq7nK|9;LZ?d)I0UBM4x9$!n|U$^ss*PEM~S#>)t9IOQ9 zozEBX@cw@P&iyNz1?!5wJKnfxav{Zk-8Clz@iIN;cHvFzAzObd`0Uv+Gb)+o2-}=T zX@%=sBK2fetn!39mf*-_uzm~kec7lGWReq}9N{^}Mj<1`4ugz=j@3^1)<$h27|9WHm#Qk#B zdqeJiz46%O@0RrkAAa5_|D^Nx5;<#=$+6t;=JoGwv?-i_C3#}Q(dWtkO-!#X+Z6ib z>y698-)}BtTYp?G%J)&{?=AJd+XLMfW^>prysBbbIKKmA^8Zs8s@{bElTUw|we<0t zJr2?q0>!p1Z!NBvH1IcGD|~u_=lkN92`1%jm!|yvS+mQ@`|OtPfRxUO%IjG^nmgKU z=31O`SM;{?dX*#fq1PQ=J5H?>*{*B))m6hQ!qIxK>E0VPN2`;KVmIXV3fb=qH925& zQtQu$DchE&-E!5K^!>k%biFYz(;Ak`A2_T2A2zS*=qd>4+RA%qUYq>9OWUrT*~Q^H zMPh>3wlz&PQ*Sf}ME);W|EJ+wZSeOC6NT0ay7@EY*B`4R7gm^7#&ReA`{%#qMR{o90agvunRiYgx!n|+-#_Lm-! zJQ03^;q>8op~45&CiKq#P~!Y1Nv!?h-w)n5+P5w8yJ>&sU*44UrH90BsMmcxSL0cJ zXr4D$wVv`Tcb=ZRTbS2s*`4Z|;lUkvqM@z6u5m}B*h=Yx&t`vc4w^E#C;D1NrO<8* z2K^I3TQ~5_nf<-|;+g!h!ioU)l`%o_(++agoZ;_@Vl2&2nkaZ^n&|ESQQ`^BZH1F( zn6&@*|0ZEDfBvoqFZZ4<{oD2WPjA(Jq$yN7g%Chg_CZaKl`7n#AN!CJhdB1r#xq@_nBU)aB`RG zv57j0N51ae5cVVGzTv;DKUd#;liV?9zn&7a?WZ{=o?<^*7B4?;l6=P5zt27MXI**q z$vF#pRVVmgxMeyg^{&%nVa_wB4#n@_UfVqN#jyZQvANeRGxN3`did$}_bn6qE}n^h n_vincK@%>y8YvSxnA{0-_vK#EU?((voKG5uS~^nk$Y!&-pziw$}h=J(|G-Lk7-*! zXx-}LuG<|uWm5SZ&ncx(_dL!J&P`6wTRHU}%h6lkPMzG|(04k&jn&}){tLUbR=p~C z98j9Gpzrp4t1AWGB7qulnz#NP&;3$6_iRR4rkQMlj^O4P1)Ur{0Wq^R8f$X=R@6UZ zx|<@lc+tPpi*mIy7Jpv0&WShf0qcr`uU^bI4Zpo?d+xVM|K~mrO_}$+Qf|$!@Z-8E zqW4_PChC6uJ@0qjyXTehbxT-wB#AJy82j@$yet(}DB%q^nBu4wana$9+awiDrKJ@ytYlpqzPrJ<-nul{OdxdfJ=+_#^mDtK^D6yL=ABzx}12YqTmO$xdxsWL_i8+lfm zJ+>7yyO?&Z`dH`Vnzd{7t%dD&h)fjX_uP6yXQ6WPjdr8i=T03daoKHq?^Q{sUDVcV zcBOmH$F8n3XIgSa@_T5@DpM7wRmJVgw)k)CySD7>zC|9LnJsU(`o(#^j*@QLvgLE+ zSGmBA`HQx0OmE*CJVCba{0fr|Gs>p*^_)mD>QH{f6|r!Ut#a3?$3OOOPBAGpIPmT7 z@r%k5*}bM;LRx};uCY?IKi#I8t~J{)qtEY2i_7sXiQA4`=?xIbT)SU*q0`z@JF9|| zsfT;E_@_@he&v;&`lZ;fb8iJCr(B3oQrflUS;~nkpF`%hSPAm6cWhxhspXofRhsL{ zb6M3)>zdMoW(S^ahpv=g4SBXPqEj}YoA;zv40F^{RSS;|%RkNdFC#kfXxlZbjR_N< zYAl?hwWfEHF3+Z!o@XjIFG{{~QFI4GP2_X)Z;oJ7F( z+&9yTZ39;sr3MD@o{F_U5ceg!m7#oJqH|?@c+y>puk=r_N6_uMRC1Y_ty6s z%`xbyKCz7dlH{)c=p7t%sV6m!@4GJvvob3CjEMzDU0Rr zKCX4l%Kb}Ag`Naz_%1l$Jv-O3Uh!Dm6jj+RXD&bQogKRL<@{Wu_B|X@Q6YYdS1V0) zoG_J5-{hJbXOoDonULsq1~u7ltxldx({+ow_e&`XYISm0F7C})dBXfeWB%7R=5HQ( zGZx$txW)bL{jpn#J0b)>)V8ZFzc1b9a;|};;F`?WSavr)@3f#NhnqTmK7{UJ5bu3Z zo_o7Rr})dy$7!Kkm+|^vn=pN!_CcYmyI73{)C87zJgE-cc0ig#n0w-Z)`daeFGe4m zt`Mws&t%tW<0RG%;#v{k?z(RNI$6VfPFeP`Mfdpr=@-4mbZ(Q6Hd3#A0+2K}%yA)5aQSvK57P6s)+>F4Ki*wH{Z8OiQM+#*x6N+ zzC=&$bdG!Xmoq+SOV#^166Tq6HMm2TeB8h*E3F=sHFZj>$Ae2@6;nM9FBG}su%y&( zh3970q6@5%_oLRe8Es-W+U2DvJI(A+M9SL@F%Cx#w%=oJ_t59F)b1;~uBqI<)Rfai zi}je#)Ojkw4HHt=*;(beOkIC})ft&jr|z$uV$!}!V*l<)uC}>bm0uk?vhb0_!P$>p z!yaaTlz4hdP;Y(-?+U}RBloxaTLsH3=4kKA`LjU0f$ykm$g8!JlxOBnmC@=GYzcNX z<0`LaxqAAvPr#J>N_Q=OGQ3ThuK6NGw1P=YHA>q5**+58KG?Lmy7M6^JV|- zc4KBxPychSSIvd{t4>(LC+>ia+eHio7*4W<^`!SZ2+d$BVN6b(pkeZt;l%_6M}v6| zSxz=>3|$ZTf;m)vJ@}E%og!kpwC7BVTqZNfGfm{jG-xhAwMoZX_&v_h|z z^as1vjJ>u?E7F*9`Yn>C8iyV54|pUiUH0JQ1m+&q6bsv4t1O)>;olx*Zk1g-Q!n&p z_})oLAB82iio6mIbh@O{dG+edo+z%bof?XnMNWR_lKU4_Ra$aP`>eUt;n~%xv*zxP zTAyg=8q^r8{QTs@nc4+D;*+1>d@0Cl7rI9O?uI$)5{plInX%scbW%H!-Eqaz^XH!D zaM}F#bNjY{X)jM{YMkj3rDH3_=e(4&uv8LAdp=o6N_2yL=XT?SsV#>$|GD{7#-Yzk z>1frO$H{t!I+pr!R7kR|`gEl67^`W9?**yp>|874kN7Q{6OcBOHCaqvIO%K7;mHyY zI!-nS>~Gj9^NnG9&Eeje3muN?KB_+7#jaY@o@2n&$726pP%9=^np-L%tnt7z_D|{0 zixZq0ycQj;@;=ulzC?}1N%ELg!5TRrWLR^_j(8c<|sbYwKD5C+E*CFHh;Q z@%&L3z4!S;*02L#EB+WHTQaZ8+WK|D3E@+F71}2OkM|-8)>lyl943!Rp+pI_?*RKS^t!o+ngwYG15v(+ZnC8*0pRMR}Z_ zYK4cVPgOGt3r}b67JArvac8eb6~mb|22(e<2khO`!}@Y%%fXYgZ%x0KnY8Ie>M{YV zHml;!Bsc$N38M)2{y7?xs=iOR(rM#Uy8pp`%Pf{(clfraZk5Y3?w8?pdjF6A^_k^M zw|-JyE@KqTx$qxTTT@T~zrNXl8SA&7<<}6HD&U@wS}|K?!-t!Zsdcj&%tQ`+mC2cV zfAR7UxxJs0ExFa19`a5pJ#fLalEtV@<5SGbOo1H3Mx7T1)v|&{;qe>_##04e>0h{h zX=_u}it?tplf15YF|uywWY#=<+l^67&YD}*_ko$nh8oeTPlvdB_)bPv2zDH>;!J2N z6+5}uxx_{J@Z&Ak3Wwip@Ut#zDxbNsC7`}>-?Vk2R~GLT*7$$*8n1@IRE_p24|69S zXxi+ov66lH!iL5h%N!ouo^|;A`N#zx^$Tit^}XEN|4+lcz5Ro#r%-$8t%<@v3yQQ9 zFU23Yc4=voRb-BWV8oO}tw27_!_iq{a@MjfD@{3iEbH}|{bni%6E=|tFBNZr!R-wPMkvhby_km9#~`S@G_#{}-$>SbX_k=-#t|Qv&zT3I8oqv2}*U z1KyHU3j^=FVwPPJT0aY!e!k27$SJkF+brZo)Y5)K4b$32t^4#`1nyu5xMehhqK(C$Ify z_GOL=ek`t|`Cx*QBWqIoU-eB1`3w7WGfZpy*8bcawP6Cc!Jee0zvkI*DCE96XYJ)K z27wpH6t29={cCR$AJZFekj1Ad6rxbpkp4zEnQNjd!cC#ny7e6>{2=V{_jzNEI z!j+18#>R`?_m`C=Z!nn~wRh$JZA>=}zyEXDc4{?Y5J9Eg zR@sl)Rk?m!Xz$N@lGXHU|9z7MB`=ct7ZhxLZ_hXN!u0&#`jfA0J8^E6`qt22#hi8u z{9Fbd{{S zJ<}iRAHxf6i{|X;%dqBF-CV9bvqJ8la@rB`d)5N`G;I6kzV6WbFRnAWbM=RGfqfeJ zhwD4OJ-i(Ju$3N`Xm1%dnF$E$@5}2{clP=_3$q5=06@a ziL*D=A2iw;cdh@w(D#Mx8;WHwKKJP4fCt6&EVk+&DT* z?z6@N$D2oG_T8NNh*icV`dh}vZdZPb<8N2aG;!lUp%)Y{=bk5cGeXiK`kTsMY2&;0 zkBh&S?SFHg=ezZM_dM;C!_V$E?f2g{d2{;0f4|F$s%|`<+TQ*4O3v|3=?C5K*ZsP< zdDZmOv)eBE@qM?P)>8HJLFUP+zeDz(tNO`us+(&l;b3*Iq0IPLkceajQWYxZ|` zxL?g)Ge2(i|4Q*0wrqEQ+-LRPop58$gQD$!TIX>m{bRb~r~l<6`JaDYesDYV z_=5C{#=9=OFK1Rz)KZpS{DDI(@4NW_u#2$|CU3c|byMPC`^JLmzQ5X^|DLmazx1w@ z%TvFr>%V-RJ+1cpvX_1z?!6N~|Iqn`mUdw8>?a0xjr@zcb>8U;^xl4|Yru29>-hoG zYq$1A>ICMl`u%ppgk2}Zrtt~Md?`9p|LyPbRF((V-zJr=D?P3BlE+9aTh%DY*wfST zh@HFlGM(8ahgIx8MPFJx&t_S{MJch~xf4`Hl=7CyFgl7qTQb*XS!?wksU1()$*FVEz&PBeF%JclTuP*m&~4zT2)Fr9bxD`(D}F@XNG9SD-iE=gPK*Uu+k5 zIIr8rdL?{?TPpX8%e}Y60@S6q>Mrmz%Zhf`E1>tRwyb*owUh2s`<8Fh3^|ZpGXNRc{{CBmU{L*u~{*#td(U9ZE7Qa~-CI3s~?v220W^aC;epPnOaqBMIhYdOl>`t6n_xj&$ z(;N5eHrGkU@N{KQj6L#w(yjY4GvyQ(J&QeXcK)V<&&xU4Qy9N8YVGb5pC)?5Ixlk0 zv^&o}a$b46d8YLD4e~qke_!n_E&JS7Iawg5_l2|H_xX9x+AL>wJ=64QPn$StV*jMc zFHf9ho?d$YU2Wcscf7SC_kMab1ev!S`Lz7+`>nSX9y#*1$%-~Sv6^Q2$7P`e(|!wH z`MF>2N$4euro4Sqr?ooy{-&_>EZYZxZ%g?;Ox65#w>J0L`Hkhr^sh3PzGE`$Yd*`akl2Sbix#=D>N!y$qY~#M^X!e5UNFu)-xS;HI!M+r&xdGH(lb zO_(0K>tl^n<>#mVgSV)a&H?n~K6?%#Y4|_5D>%n(cvemCLeT%l|(lvX7x}s_b{e z4@*BSUv#Kd#V}0ZU8l_H+5W)~M0af86w@K5^7sAOtIf+-i#EPl!Qiw`dBTzNpKTOA zeD&YncqroN?-JwP7eB8)=5IF3{_U$8Ut`r$W7XMHi~pS~f6O$mdRxW5n`Lh}cPdt2 zy2$E!+PytPAc1>{OS(BXQ~#5N{gd8x`rLSS>-n@iA^Sengu=I<3x7WpXSu)bp53OI znN~?_g}d6X-^qKv`P#1&X-4mEzS+Az#rSx|%4JpY8}I(h3sYOByhB2LUP2C|{%rq) zrz;$K_?8}UcpY51{z9+0y&lWw)u;aHPfBSzUC1hP;Qcg{I**3hf&!y!gqh_ zJ^G@o_UCTFw^eZ_t*fev*WPM*^}spLk1gxzZo>w1eWMno4Xcyvo~~y2^3udQcJtvT z11Y-)R!22luZ0ydw#})XaFn03;@zM3`<@)Uex?58j#`I4!GGx-AJ%T#xNmdWrRpqY z%RRAok43eA3%Mo##`5Z)HH^YYGBd8?1!i?#g}_#;ny`_1byC)*|G z372=R%Ii&PEKA>AF#o{W`fVloo&Jv$ZnKAj@}6m(T2{2fUz>|Rntz;q@+!*VuTddy zQ0}VV@=yN#pWl`D++SYB;?v6+|KGek(0P(&TD0f>dvPtvcDecX;u$l$Z9iY;Km4@D zYe#GGp0|Py5dofix7^ubGI_)I_)D8jKJMS)zpY`z0wI~{8oef9?}UzN0_f7IE&rW`rC ze_HIPZOyWu|KIWc{c7!AlOr>HuEj|mp5bvlPAbV~Nw$8kxK9C?Ovu*nRR^;Leaf=+ zdj);Gvh{nNK_a{|YR|V$Z{uL+^xIur^08R|?eBhD#XWlEbMM*R+WL4`u=dTp&9T2< z$J+kbx__VF`oE>RFPf%p)ww2~kbilOu>6ay``ykg|C<_j&SK4`37(S;dWvT`IIjO| z>S{i3clL$s`m^uPY?a=oShXov{m{D4Kco*S=Y5!W_sHBE``%6D?y)_p`zo|#!&auf zypK0mC^p1Co_XiMy1%B4mg~0YJ}WPud;BirjPn2bna$rhu0K%wy5-s0hbk`c92eT8;Gn#W4%dS_b z?O=a$E56udQ|NA)+OOZaVts z+`7*i{C#FThpry#%MI$k`(Jif@83y$+rk!XPpn}8E8hNa>;7*S{1VTX|H%8eWB0km zIUM}Eh1ZFdrA)3mVN_pIUj6n-^IFjtxf1e=)}B+_C4Xf7->+Yd);lT3xWCzU%df9> z^+L8cGS{9&9FohMBOgEeo!}D*(D?iAh_%0^pH244)8_x+Ipd*_`tt5aA;CYUelR?~ zBx#!drZ>`?;~zQxF7@o2K9le1T|?g^2fpM!UAZSkR#3G0@4h6vYfrjNPan?RB*1q3 z^ci+n#T@PP3Ca&1b0pizIvt3wk4TEH)KE3>xH;`Z+IPDvb6uE2Bvt1yF_#$Yook)> zmC1y2f7-uUN1N<~B#$ipIxT1Yiz(+0o!l66Xzhi%&h6JEE*7URKh7JXZ!CL?B}Xh{ zV(!z%o4P!QwzWtXan}m*E^fJghiO}aNm-#@leO8cOszMMBb9q}Rc8ckp7S}5H{HUkNfrhh79aTNWpC6jd@%eC1 zr_Rg8$9F7#lCxf8>Xek7EV=uS$O`P_W;R>w{>|v>!jvhu!sNU)nGHJKSmt^!ZnRc9 zGgUC~l6(I~)|~Y#IzB&EvG}bj$8=6T$+#*+e=(n^>&o1xiBsnI3WYB4S)};nMT}I_ zkE1&S%5y{lF1hy`24u0%2aQ9-s6_N}aSGhhFXX@H*B_k`$0n=Q6?FTQv!>;2l~oHk zCueY2T1{`0klk+~-Y6?=+BW6O#l)T|=lajj>h5?drSx0%o#V}yAD2E$y|U0|O2yZy zJ})0+OkSas;`q|ue52CSpVRoy-I;Uo=&M(EqqACH))`c-IQ6MnJ}sH|(6{C=#=qx% zWo(y3%gvp=88p5yhwJpu5RKM!+r^hBF*3QwcO1<7^v`Ce{q)oR_Hlt;bHw%k$JvPK zq?OD)!uG1+;`iGp{}%pu$;!3)aDV;Iwa1&-kFJ^Wp6k_RHvJn#c3)4V+qH+LE|N1= z3jNBvR^;m*pNk7*ZT$bssei9d7XE$V!~KU}FF*YHRfNItLHgWhua^fi)D)^W_@xOi z;tagx#W}(3gFwi1r5P_TGR|t6b4=95W|`?OKiyWFth`To^5wJi?fyK~x{|Ih_uu4x z^O@yalk8*-RIWYB4U~P%e5kA|Uw7%!yXOj)-|3TyR(3jZ_jUVG2_>FWub&4SeE*gC z((zin{r#!dXCE$4{ZuDkY$zRMb#}S_?~}Vf=hRG(t^t(yg|F~Y>aSt-ZCq|VfB0U$jq~+q0=IhC&>m)5}f(`<^jiy@T=xq z*p^&W7`sHq4~GLk4GTIOcF$q>Yo;V66kvovSdAslx&<%}osf_x-m99aYlf-?z!x%SZ`gMAxr2De><6sz(J33>+RYpDOFxyq3+p zWc~W<(dye2oO<`&-&YsWvyr)4<<=<&)utq4>x|v6*U#r)F!>cjqS1upuFzf2lcH+v zPkL3H)qj*baZ=9-+w*M8+ApkInV*rEa^+F`J2hKz?VQxL&u_)ZL{P@VXt}rqmIoYN*Sby*zZf;H8wEnaOtrX3lUo zynWVAS@?u{ac~Mh+v4PCy(jfnPab3#8_e);XWlxA)$#iw+1qVAQki^ljl& z@3TIe52WP&yXp4s|I_kMMa}2DrJm)URa-pwjX}^$+X`zrfk(V-Gao;{w|Y{Z`K}UO zPVfEy*Lq&D{clmaP*QmJR{OlaUq8#*-#B*dPm0siUpdN0Cb2I|o_#n+TCHX>hv&Vg z4-cJWn%owr-tF;UU+Rl(q=(~kHlN1I#}hLq^}Wt)*pM;7vg+O5i8V&P$7gngeBZl1 zR((!O^2f-#i(DP`#avD~b*b|E9^bY|=L18L(QZGn8&78DPO-S~|8%k*>)h(O1p$(> zaVoz$j_!7hFgfw&NrPyi(Mvn=a_-_ycmKctxB0Qpp^YVO*FF30ukqJGW={V \uicontrol {About Plugins} > - \uicontrol Utilities > \uicontrol Copilot to enable the plugin. + \li Select \uicontrol Help (or \uicontrol {\QC} on \macos) > + \uicontrol {About Plugins} > \uicontrol Utilities > + \uicontrol Copilot to enable the plugin. \li Select \uicontrol {Restart Now} to restart \QC and load the plugin. \endlist @@ -56,17 +57,33 @@ \li In the \uicontrol {Node.js path} field, enter the full path to the Node.js executable. \li In the \uicontrol {Path to agent.js} field, enter the path to - agent.js in the Copilot Neovim plugin. - \li Select the \uicontrol {Request completions automatically} checkbox to - receive suggestions for the current text cursor position when you - make changes. + agent.js in the Copilot Neovim plugin installation folder. + \li Select the \uicontrol {Auto request} check box to receive suggestions + for the current text cursor position when you make changes. + \li Select the \uicontrol {Use proxy} check box to use a proxy server to + connect to Copilot servers. + \li In the \uicontrol {Proxy host} field, enter the host name of the + proxy server. + \li In the \uicontrol {Proxy port} field, enter the port number of the + proxy server. + \li Select the \uicontrol {Reject unauthorized} check box to prevent the + security risk presented by accepting unauthorized certificates from + the proxy server. + \li In the \uicontrol {Proxy user} field, enter the user name to + authenticate to the proxy server. + \li Select the \uicontrol {Save proxy password} check box to save the + password to authenticate to the proxy server. + \note The password is saved insecurely. + \li In the \uicontrol {Proxy password} field, enter the password to save. + To see the password as you type, select the \inlineimage icons/original-size.png + button. \endlist \section1 Receiving Suggestions When you write code in the \l {Working in Edit Mode}{Edit} mode and - \uicontrol {Request completions automatically} is enabled, Copilot - automatically makes suggestions when you type. + \uicontrol {Auto request} is enabled, Copilot automatically makes + suggestions when you type. \image qtcreator-copilot.gif {Receiving suggestions from Copilot in the editor} From 24ed69b2ec09b5d1cd82ab51231485f052841bd2 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 19 Oct 2023 10:37:27 +0200 Subject: [PATCH 42/86] LanguageClient: Simplify group box title and fix "JSON" It already under a title "Language Server", no need to repeat Change-Id: Ib0da722dfdaede194e48fa5f0ff3948ec0f16842 Reviewed-by: Leena Miettinen --- src/plugins/languageclient/languageclientsettings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 95d5b1a2e1b..7b6c4a41bfe 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -1117,10 +1117,10 @@ ProjectSettingsWidget::ProjectSettingsWidget(ProjectExplorer::Project *project) auto layout = new QVBoxLayout; setLayout(layout); - auto group = new QGroupBox(Tr::tr("Language Server Workspace Configuration")); + auto group = new QGroupBox(Tr::tr("Workspace Configuration")); group->setLayout(new QVBoxLayout); group->layout()->addWidget(new QLabel(Tr::tr( - "Additional json configuration sent to all running language servers for this project.\n" + "Additional JSON configuration sent to all running language servers for this project.\n" "See the documentation of the specific language server for valid settings."))); group->layout()->addWidget(editor->widget()); layout->addWidget(group); From b706fab6c642072750935a0f13290d098cf49233 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 19 Oct 2023 15:12:34 +0200 Subject: [PATCH 43/86] Ios: Fix synchronization This fixes the synchronization on early shutdown, e.g. when Creator is started with "-test Ios". Change-Id: Ia18215a090809b6095d51ee3647728b4b2ad2d5f Reviewed-by: Christian Stenger --- src/plugins/ios/iosconfigurations.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/ios/iosconfigurations.cpp b/src/plugins/ios/iosconfigurations.cpp index 04ab69b8a25..105ba236eaa 100644 --- a/src/plugins/ios/iosconfigurations.cpp +++ b/src/plugins/ios/iosconfigurations.cpp @@ -12,6 +12,8 @@ #include +#include + #include #include #include @@ -31,6 +33,7 @@ #include #include +#include #include #include @@ -405,7 +408,8 @@ void IosConfigurations::updateSimulators() dev = IDevice::ConstPtr(new IosSimulator(devId)); devManager->addDevice(dev); } - SimulatorControl::updateAvailableSimulators(this); + ExtensionSystem::PluginManager::futureSynchronizer()->addFuture( + SimulatorControl::updateAvailableSimulators(this)); } void IosConfigurations::setDeveloperPath(const FilePath &devPath) From 66d94a82a32cdfdb344d55ef2c610ee9b3f03f7f Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 19 Oct 2023 09:49:34 +0200 Subject: [PATCH 44/86] QmlPreview: Do not act on any editor / document change If no preview is running there is no need to process anything. In theory the basic connections inside the plugin might be better properly done and explicitly connected and disconnected, but I wanted to avoid an intrusive change after the beta. Fixes ongoing message box displaying when editing a qml file. Kind of amends 5336fd83a004c1fe5265b9f9ba87320c031d2040 as it revealed this misbehavior. Change-Id: I5081e1c7d2154e3cc75ad9da32af1b0c7f86dff2 Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/qmlpreview/qmlpreviewplugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.cpp b/src/plugins/qmlpreview/qmlpreviewplugin.cpp index 2722ecb016e..464c9b88f05 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.cpp +++ b/src/plugins/qmlpreview/qmlpreviewplugin.cpp @@ -413,6 +413,8 @@ void QmlPreviewPluginPrivate::attachToEditor() void QmlPreviewPluginPrivate::checkEditor() { + if (m_runningPreviews.isEmpty()) + return; QmlJS::Dialect::Enum dialect = QmlJS::Dialect::AnyLanguage; Core::IDocument *doc = m_lastEditor->document(); const QString mimeType = doc->mimeType(); From eccbff7698557ff4706ab21890b4fb044ff3a9c1 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 18 Oct 2023 17:11:12 +0200 Subject: [PATCH 45/86] Doc: Describe Tools > C++ > Fold/Unfold All Comment Blocks Task-number: QTCREATORBUG-29392 Change-Id: Ie92253165b5004455be6f7dd8e031431c4358dae Reviewed-by: Eike Ziller --- .../src/editors/creator-editors-options.qdoc | 5 ++- .../creator-semantic-highlighting.qdoc | 33 ++++++++++++++----- .../creator-projects-settings-editor.qdoc | 2 +- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/doc/qtcreator/src/editors/creator-editors-options.qdoc b/doc/qtcreator/src/editors/creator-editors-options.qdoc index e17a11c8a98..595c79b81c3 100644 --- a/doc/qtcreator/src/editors/creator-editors-options.qdoc +++ b/doc/qtcreator/src/editors/creator-editors-options.qdoc @@ -57,9 +57,8 @@ \li Set \l{Indent text or code}{tabs, indentation, the handling of whitespace, and mouse operations} in \uicontrol Behavior. - \li Set various display properties, such as - \l{Highlighting and folding blocks} - {highlighting and folding blocks} or text + \li Set various display properties, such as \l{Highlighting Blocks} + {highlighting} or \l{Folding Blocks}{folding} blocks or text wrapping in \uicontrol Display. \li Add, modify, and remove \l{Editing Code Snippets}{code snippets} in diff --git a/doc/qtcreator/src/editors/creator-semantic-highlighting.qdoc b/doc/qtcreator/src/editors/creator-semantic-highlighting.qdoc index e6d119bb818..23dfc01a4f0 100644 --- a/doc/qtcreator/src/editors/creator-semantic-highlighting.qdoc +++ b/doc/qtcreator/src/editors/creator-semantic-highlighting.qdoc @@ -69,7 +69,7 @@ apply the changes you make to the definition files, select \uicontrol {Reload Definitions}. - \section1 Highlighting and Folding Blocks + \section1 Highlighting Blocks Use block highlighting to visually separate parts of the code that belong together. For example, when you place the cursor within the braces, the code @@ -80,6 +80,8 @@ To enable block highlighting, select \preferences > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Highlight blocks}. + \section1 Folding Blocks + Use the folding markers to collapse and expand blocks of code within braces. Click the folding marker to collapse or expand a block. In the figure above, the folding markers are located between the line number and the text pane. @@ -90,10 +92,21 @@ \image qtcreator-options-text-editor-display.png "Text Editor Display preferences" - When the cursor is on a brace, the matching brace is animated by default. To - turn off the animation and just highlight the block and the braces, select - \preferences > \uicontrol {Text Editor} > - \uicontrol Display and deselect \uicontrol {Animate matching parentheses}. + \section2 Folding All Comment Blocks + + To fold all comment blocks, select \uicontrol Tools > \uicontrol C++ > + \uicontrol {Fold All Comment Blocks}. To unfold all comment blocks, select + \uicontrol {Unfold All Comment Blocks}. + + \section1 Animating Matching Braces + + When the cursor is on a brace, the matching brace is animated by default. + + To turn off the animation and just highlight the block and the braces, select + \preferences > \uicontrol {Text Editor} > \uicontrol Display and deselect + \uicontrol {Animate matching parentheses}. + + \section1 Moving Between Blocks You can use keyboard shortcuts to move within and between blocks. To go to block end, press \key {Ctrl+]} and to go to block start, press @@ -101,11 +114,15 @@ or beginning of the block, press \key {Ctrl+Shift+]} and \key {Ctrl+Shift+[}, respectively. + \section1 Selecting the Current Block + To select the current block, press \key Ctrl+U. A second key press extends the selection to the parent block. To undo the last selection, press - \key {Ctrl+Alt+Shift+U}. To enable smart block selection, select - \preferences > \uicontrol {Text Editor} > - \uicontrol Behavior > \uicontrol {Enable smart selection changing}. + \key {Ctrl+Alt+Shift+U}. + + To enable smart block selection, select \preferences + > \uicontrol {Text Editor} > \uicontrol Behavior > + \uicontrol {Enable smart selection changing}. \image qtcreator-options-text-editor-behavior.png "Text Editor Behavior preferences" */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-editor.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-editor.qdoc index 384874405a7..ba622d8b2ae 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-editor.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-editor.qdoc @@ -38,6 +38,6 @@ \sa {Configuring Fonts}, {File Encoding}, {Moving to Symbol Definition or Declaration}, {Indent text or code}, - {Highlighting and Folding Blocks}, {Selecting Line Ending Style}, + {Selecting Line Ending Style}, {Semantic Highlighting}, {View function tooltips} */ From b5d0c5dd36078a9499c494c0429107c5171e5189 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 17 Oct 2023 16:01:45 +0200 Subject: [PATCH 46/86] CMakePM: Save CMAKE_PREFIX|MODULE_PATH as cache variables for conan This way it's visible in the project settings where the Conan paths are added. Change-Id: I95aa59c836bf3b9ed122e9bffdd61b0dd3c7354e Reviewed-by: Reviewed-by: Alessandro Portale --- src/share/3rdparty/package-manager/auto-setup.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/share/3rdparty/package-manager/auto-setup.cmake b/src/share/3rdparty/package-manager/auto-setup.cmake index f6e6ce129aa..00948cb9678 100644 --- a/src/share/3rdparty/package-manager/auto-setup.cmake +++ b/src/share/3rdparty/package-manager/auto-setup.cmake @@ -119,6 +119,10 @@ macro(qtc_auto_setup_conan) file(WRITE \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake\" \" list(PREPEND CMAKE_PREFIX_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") list(PREPEND CMAKE_MODULE_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") + list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH) + list(REMOVE_DUPLICATES CMAKE_MODULE_PATH) + set(CMAKE_PREFIX_PATH \\\"\\\${CMAKE_PREFIX_PATH}\\\" CACHE STRING \\\"\\\" FORCE) + set(CMAKE_MODULE_PATH \\\"\\\${CMAKE_MODULE_PATH}\\\" CACHE STRING \\\"\\\" FORCE) \") endif() else() From cdc785757276457125524ceff6578d47d4186cb3 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 17 Oct 2023 16:10:03 +0200 Subject: [PATCH 47/86] CMakePM: Search for Config modules also in CMAKE_MODULE_PATH This is allowed by `find_package`, and can be tested with the `fmt` package provided by conan. Change-Id: Ib9bf2a6cbd80b8eb322cb6d8a1a9c25af0ca4031 Reviewed-by: Alessandro Portale Reviewed-by: --- src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp index 7a656722bb4..d0b14614344 100644 --- a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp +++ b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp @@ -400,7 +400,8 @@ static QPair getFindAndConfigCMakePackages( std::function function; QStringList &result; } mapping[] = {{"CMAKE_PREFIX_PATH", "lib/cmake", configPackageName, configPackages}, - {"CMAKE_MODULE_PATH", QString(), findPackageName, modulePackages}}; + {"CMAKE_MODULE_PATH", QString(), findPackageName, modulePackages}, + {"CMAKE_MODULE_PATH", QString(), configPackageName, configPackages}}; for (const auto &m : mapping) { FilePaths paths = Utils::transform(cmakeCache.valueOf(m.cmakeVariable).split(';'), From a071d4354a4efc732239a25f584afac8fb3c6eee Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 17 Oct 2023 17:15:26 +0200 Subject: [PATCH 48/86] CMakePM: Save CMAKE_MODULE|PREFIX_PATH in cache for vcpkg This would allow the user to see the paths set by vcpkg. Change-Id: I6d4ed9a9c69c2296851c8f8363b78d5adb7d2723 Reviewed-by: Reviewed-by: Alessandro Portale --- src/share/3rdparty/package-manager/auto-setup.cmake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/share/3rdparty/package-manager/auto-setup.cmake b/src/share/3rdparty/package-manager/auto-setup.cmake index 00948cb9678..bae90ee6429 100644 --- a/src/share/3rdparty/package-manager/auto-setup.cmake +++ b/src/share/3rdparty/package-manager/auto-setup.cmake @@ -226,6 +226,14 @@ macro(qtc_auto_setup_vcpkg) endif() set(CMAKE_TOOLCHAIN_FILE "${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake" CACHE PATH "" FORCE) + + # Save CMAKE_PREFIX_PATH and CMAKE_MODULE_PATH as cache variables + if (CMAKE_VERSION GREATER_EQUAL "3.19") + cmake_language(DEFER CALL list REMOVE_DUPLICATES CMAKE_PREFIX_PATH) + cmake_language(DEFER CALL list REMOVE_DUPLICATES CMAKE_MODULE_PATH) + cmake_language(DEFER CALL set CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}" CACHE STRING "" FORCE) + cmake_language(DEFER CALL set CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" CACHE STRING "" FORCE) + endif() endif() endmacro() qtc_auto_setup_vcpkg() From 105fd8becb3a65b7310eb4dc7c6eb69b3631eea2 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 17 Oct 2023 17:19:10 +0200 Subject: [PATCH 49/86] CMakePM: Add "share" for CMAKE_PREFIX_PATH for completion This would allow packages from vcpkg to be found. Change-Id: Ie0921d9ed6cfe692bc18235bfaf678ede5c98e14 Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp index d0b14614344..6dc754d2bed 100644 --- a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp +++ b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp @@ -400,6 +400,7 @@ static QPair getFindAndConfigCMakePackages( std::function function; QStringList &result; } mapping[] = {{"CMAKE_PREFIX_PATH", "lib/cmake", configPackageName, configPackages}, + {"CMAKE_PREFIX_PATH", "share", configPackageName, configPackages}, {"CMAKE_MODULE_PATH", QString(), findPackageName, modulePackages}, {"CMAKE_MODULE_PATH", QString(), configPackageName, configPackages}}; From ada1a7b1c07d879d16422b666a401ff7439ffb3e Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 19 Oct 2023 15:27:04 +0200 Subject: [PATCH 50/86] LanguageClient: Fix qbs mingw build Change-Id: Idb7102597a9a7cdf8a8cd5cd1ce249770e559c16 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/languageclient/languageclient.qbs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/languageclient/languageclient.qbs b/src/plugins/languageclient/languageclient.qbs index 7f1899927fe..5bb5e1ac11e 100644 --- a/src/plugins/languageclient/languageclient.qbs +++ b/src/plugins/languageclient/languageclient.qbs @@ -67,5 +67,10 @@ QtcPlugin { "snippet.h", ] + Properties { + condition: qbs.toolchain.contains("mingw") + cpp.cxxFlags: "-Wa,-mbig-obj" + } + Export { Depends { name: "LanguageServerProtocol" } } } From 3f647a4bc594bdaeb5c9f33b717c69196a440c5d Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 19 Oct 2023 11:30:17 +0200 Subject: [PATCH 51/86] Debugger: Fix lldb fetchFullBacktrace Change-Id: Ib0a513ecd6c0a0094797fe987aeaddc57d0b5149 Reviewed-by: Christian Stenger Reviewed-by: --- share/qtcreator/debugger/lldbbridge.py | 4 ++-- src/plugins/debugger/lldb/lldbengine.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index da99546cec2..7b5c002b432 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -1836,11 +1836,11 @@ class Dumper(DumperBase): self.process.SetSelectedThreadByID(int(args['id'])) self.reportResult('', args) - def fetchFullBacktrace(self, _=None): + def fetchFullBacktrace(self, args): command = 'thread backtrace all' result = lldb.SBCommandReturnObject() self.debugger.GetCommandInterpreter().HandleCommand(command, result) - self.reportResult(self.hexencode(result.GetOutput()), {}) + self.reportResult('fulltrace="%s"' % self.hexencode(result.GetOutput()), args) def executeDebuggerCommand(self, args): self.reportToken(args) diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 9d1717fff54..12da7a86fc4 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -1030,8 +1030,8 @@ void LldbEngine::fetchDisassembler(DisassemblerAgent *agent) void LldbEngine::fetchFullBacktrace() { DebuggerCommand cmd("fetchFullBacktrace"); - cmd.callback = [](const DebuggerResponse &response) { - Internal::openTextEditor("Backtrace $", fromHex(response.data.data())); + cmd.callback = [](const DebuggerResponse &response) { + Internal::openTextEditor("Backtrace $", fromHex(response.data["fulltrace"].data())); }; runCommand(cmd); } From b3109755e67ee514b09063f1edc5e0f1fb0af51c Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 19 Oct 2023 19:20:03 +0200 Subject: [PATCH 52/86] Tr: Fix some source texts Don't use exclamation marks! Add "the" articles (conforming to the other source texts). Finish error sentences with dot. Change-Id: I1faa547e2c3bae90ea900b781eccf327ea810326 Reviewed-by: Leena Miettinen Reviewed-by: Eike Ziller --- share/qtcreator/translations/qtcreator_de.ts | 8 ++------ share/qtcreator/translations/qtcreator_fr.ts | 8 ++------ .../qtcreator/translations/qtcreator_zh_CN.ts | 4 +--- src/libs/extensionsystem/pluginmanager.cpp | 3 +-- src/plugins/docker/dockerdevice.cpp | 18 +++++++++--------- 5 files changed, 15 insertions(+), 26 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 57623ee8908..b16f1fe0ac9 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -28233,12 +28233,8 @@ zu deaktivieren, deaktiviert auch die folgenden Plugins: Hilfe > Plugins - If you temporarily disable %1, the following plugins that depend on it are also disabled: %2. - - - Wenn Sie %1 vorübergehend deaktivieren, werden die folgenden Plugins, die davon abhängen, auch deaktiviert: %2. - - + If you temporarily disable %1, the following plugins that depend on it are also disabled: %2. + Wenn Sie %1 vorübergehend deaktivieren, werden die folgenden Plugins, die davon abhängen, auch deaktiviert: %2. Disable plugins permanently in %1. diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index c050a6f3a0a..059f2e80e93 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -27836,12 +27836,8 @@ Raison : %3 Aide > À propos des greffons - If you temporarily disable %1, the following plugins that depend on it are also disabled: %2. - - - Si vous désactivez temporairement %1, les greffons suivants qui en dépendent seront également désactivés : %2. - - + If you temporarily disable %1, the following plugins that depend on it are also disabled: %2. + Si vous désactivez temporairement %1, les greffons suivants qui en dépendent seront également désactivés : %2. Disable plugins permanently in %1. diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index 92175bdf0c5..ff7a8e061ce 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -18505,9 +18505,7 @@ Rebuilding the project might help. - If you temporarily disable %1, the following plugins that depend on it are also disabled: %2. - - + If you temporarily disable %1, the following plugins that depend on it are also disabled: %2. diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 84bea5b7bfa..1f86693f907 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -1540,8 +1540,7 @@ void PluginManagerPrivate::checkForProblematicPlugins() : Tr::tr("Help > About Plugins"); const QString otherPluginsText = Tr::tr("If you temporarily disable %1, the following plugins that depend on " - "it are also disabled: %2.\n\n") - .arg(spec->name(), dependentsList); + "it are also disabled: %2.").arg(spec->name(), dependentsList) + "\n\n"; const QString detailsText = (dependents.isEmpty() ? QString() : otherPluginsText) + Tr::tr("Disable plugins permanently in %1.").arg(pluginsMenu); const QString text = Tr::tr("The last time you started %1, it seems to have closed because " diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index c47de707914..386e0342fa6 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -220,7 +220,7 @@ DockerDeviceSettings::DockerDeviceSettings() }); cb(items); } else { - QStandardItem *errorItem = new QStandardItem(Tr::tr("Error!")); + QStandardItem *errorItem = new QStandardItem(Tr::tr("Error")); errorItem->setToolTip(result.error()); cb({errorItem}); } @@ -247,7 +247,7 @@ DockerDeviceSettings::DockerDeviceSettings() path = onDevicePath; } else { return make_unexpected( - Tr::tr("Path \"%1\" does not exist.").arg(onDevicePath.toUserOutput())); + Tr::tr("The path \"%1\" does not exist.").arg(onDevicePath.toUserOutput())); } } QString error; @@ -766,32 +766,32 @@ QStringList toMountArg(const DockerDevicePrivate::TemporaryMountInfo &mi) expected_str isValidMountInfo(const DockerDevicePrivate::TemporaryMountInfo &mi) { if (mi.path.needsDevice()) - return make_unexpected(QString("Path \"%1\" is not local").arg(mi.path.toUserOutput())); + return make_unexpected(QString("The path \"%1\" is not local.").arg(mi.path.toUserOutput())); if (mi.path.isEmpty() && mi.containerPath.isEmpty()) - return make_unexpected(QString("Both paths are empty")); + return make_unexpected(QString("Both paths are empty.")); if (mi.path.isEmpty()) { - return make_unexpected(QString("Local path is empty, container path is \"%1\"") + return make_unexpected(QString("The local path is empty, the container path is \"%1\".") .arg(mi.containerPath.toUserOutput())); } if (mi.containerPath.isEmpty()) { return make_unexpected( - QString("Container path is empty, local path is \"%1\"").arg(mi.path.toUserOutput())); + QString("The container path is empty, the local path is \"%1\".").arg(mi.path.toUserOutput())); } if (!mi.path.isAbsolutePath() || !mi.containerPath.isAbsolutePath()) { - return make_unexpected(QString("Path \"%1\" or \"%2\" is not absolute") + return make_unexpected(QString("The path \"%1\" or \"%2\" is not absolute.") .arg(mi.path.toUserOutput()) .arg(mi.containerPath.toUserOutput())); } if (mi.containerPath.isRootPath()) - return make_unexpected(QString("Path \"%1\" is root").arg(mi.containerPath.toUserOutput())); + return make_unexpected(QString("The path \"%1\" is root.").arg(mi.containerPath.toUserOutput())); if (!mi.path.exists()) - return make_unexpected(QString("Path \"%1\" does not exist").arg(mi.path.toUserOutput())); + return make_unexpected(QString("The path \"%1\" does not exist.").arg(mi.path.toUserOutput())); return {}; } From 9df0571ff92f16a71a3d0682d0acf9a2b2d887ee Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 19 Oct 2023 09:47:00 +0200 Subject: [PATCH 53/86] VCS/macOS: Fix message box when closing submit editor When using the "Close" and "Cancel" standard buttons, it is no longer possible to change the button text on macOS. Additionally, the behavior on pressing is broken when using QtC in german (it should just close the dialog == cancel, but in german it triggers "close"). Task-number: QTBUG-118241 Change-Id: Ia35e6a29cd97fb91552dc5600f91be8b8e443f39 Reviewed-by: Christian Stenger Reviewed-by: --- src/plugins/vcsbase/vcsbasesubmiteditor.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index 3b78546526e..ccf56e55d29 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -39,18 +39,19 @@ #include #include +#include +#include +#include #include #include +#include #include #include +#include #include #include #include #include -#include -#include -#include -#include #include @@ -472,13 +473,12 @@ bool VcsBaseSubmitEditor::promptSubmit(VcsBasePluginPrivate *plugin) mb.setWindowTitle(plugin->commitAbortTitle()); mb.setIcon(QMessageBox::Warning); mb.setText(plugin->commitAbortMessage()); - mb.setStandardButtons(QMessageBox::Close | QMessageBox::Cancel); - // On Windows there is no mnemonic for Close. Set it explicitly. - mb.button(QMessageBox::Close)->setText(Tr::tr("&Close")); - mb.button(QMessageBox::Cancel)->setText(Tr::tr("&Keep Editing")); - mb.setDefaultButton(QMessageBox::Cancel); + QPushButton *closeButton = mb.addButton(Tr::tr("&Close"), QMessageBox::AcceptRole); + QPushButton *keepButton = mb.addButton(Tr::tr("&Keep Editing"), QMessageBox::RejectRole); + mb.setDefaultButton(keepButton); + mb.setEscapeButton(keepButton); mb.exec(); - return mb.result() == QMessageBox::Close; + return mb.clickedButton() == closeButton; } QString VcsBaseSubmitEditor::promptForNickName() From 1824db503e57467c4cc64fc5f21d4b16c9ec6702 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 5 Oct 2023 17:26:05 +0200 Subject: [PATCH 54/86] Utils: Restore original default DPI rounding policy Qt Creator 11.0.2 changed the default DPI rounding policy to "PassThrough" for Windows. In QtC 12, there is now a setting that allows the user to chose the policy. The default was changed to "PassThrough" also for Linux. This change sets the default back to the original policy "Round" which Qt Creator used from the beginnings of HighDPI support. Amends: 3726f0d6c1d05452f070b911683c51fe95df65c4 Change-Id: I74f2310f1b5379c8dea0bf86aee965374ca2732e Reviewed-by: Artem Sokolovskii Reviewed-by: Eike Ziller --- src/libs/utils/stylehelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 506601e8260..b93481ef9d4 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -715,7 +715,7 @@ bool StyleHelper::isQDSTheme() Qt::HighDpiScaleFactorRoundingPolicy StyleHelper::defaultHighDpiScaleFactorRoundingPolicy() { return HostOsInfo::isMacHost() ? Qt::HighDpiScaleFactorRoundingPolicy::Unset - : Qt::HighDpiScaleFactorRoundingPolicy::PassThrough; + : Qt::HighDpiScaleFactorRoundingPolicy::Round; } QIcon StyleHelper::getIconFromIconFont(const QString &fontName, const QList ¶meters) From fbe9f2c614e0a8cd07def34944dfc355abbafe29 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 19 Oct 2023 11:09:33 +0200 Subject: [PATCH 55/86] Docker/Tr: The state is "shut down", two words Change-Id: I62b47e4d3f7e9a0e22a086ee8db743bb004a0ac3 Reviewed-by: Leena Miettinen Reviewed-by: --- src/plugins/docker/dockerdevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 386e0342fa6..7dc014eadaf 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -941,7 +941,7 @@ expected_str DockerDevicePrivate::updateContainerAccess() } if (m_isShutdown) - return make_unexpected(Tr::tr("Device is shutdown")); + return make_unexpected(Tr::tr("Device is shut down")); if (DockerApi::isDockerDaemonAvailable(false).value_or(false) == false) return make_unexpected(Tr::tr("Docker system is not reachable")); From 32b6e6309e02369404b3a164d7c283a61f0312bd Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 20 Oct 2023 11:01:59 +0200 Subject: [PATCH 56/86] CMakePM: Remove remainders of extraGenerator It was not possible to set the toolset for Visual Studio 2022 generator. Amends 4f26d802ca863d90d213813d7117cdc179ab4336 Change-Id: I56caf9c0d66812eb599646a3679602af7372f419 Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakekitaspect.cpp | 7 ++----- src/plugins/cmakeprojectmanager/cmaketool.cpp | 4 ++-- src/plugins/cmakeprojectmanager/cmaketool.h | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakekitaspect.cpp b/src/plugins/cmakeprojectmanager/cmakekitaspect.cpp index c18d047e613..6c112f01d5c 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitaspect.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitaspect.cpp @@ -503,11 +503,9 @@ class GeneratorInfo public: GeneratorInfo() = default; GeneratorInfo(const QString &generator_, - const QString &extraGenerator_ = QString(), const QString &platform_ = QString(), const QString &toolset_ = QString()) : generator(generator_) - , extraGenerator(extraGenerator_) , platform(platform_) , toolset(toolset_) {} @@ -747,7 +745,7 @@ Tasks CMakeGeneratorKitAspectFactory::validate(const Kit *k) const const GeneratorInfo info = generatorInfo(k); QList known = tool->supportedGenerators(); auto it = std::find_if(known.constBegin(), known.constEnd(), [info](const CMakeTool::Generator &g) { - return g.matches(info.generator, info.extraGenerator); + return g.matches(info.generator); }); if (it == known.constEnd()) { addWarning(Tr::tr("CMake Tool does not support the configured generator.")); @@ -786,7 +784,7 @@ void CMakeGeneratorKitAspectFactory::fix(Kit *k) QList known = tool->supportedGenerators(); auto it = std::find_if(known.constBegin(), known.constEnd(), [info](const CMakeTool::Generator &g) { - return g.matches(info.generator, info.extraGenerator); + return g.matches(info.generator); }); if (it == known.constEnd()) { GeneratorInfo dv; @@ -794,7 +792,6 @@ void CMakeGeneratorKitAspectFactory::fix(Kit *k) setGeneratorInfo(k, dv); } else { const GeneratorInfo dv(isIos(k) ? QString("Xcode") : info.generator, - info.extraGenerator, it->supportsPlatform ? info.platform : QString(), it->supportsToolset ? info.toolset : QString()); setGeneratorInfo(k, dv); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index a24114bb352..f49df2083b3 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -45,9 +45,9 @@ const char CMAKE_INFORMATION_AUTODETECTED[] = "AutoDetected"; const char CMAKE_INFORMATION_DETECTIONSOURCE[] = "DetectionSource"; const char CMAKE_INFORMATION_READERTYPE[] = "ReaderType"; -bool CMakeTool::Generator::matches(const QString &n, const QString &ex) const +bool CMakeTool::Generator::matches(const QString &n) const { - return n == name && (ex.isEmpty() || extraGenerators.contains(ex)); + return n == name; } namespace Internal { diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index c9bc6e02e3c..0fa06e5ca14 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -63,7 +63,7 @@ public: bool supportsPlatform = true; bool supportsToolset = true; - bool matches(const QString &n, const QString &ex = QString()) const; + bool matches(const QString &n) const; }; using PathMapper = std::function; From fb788dec30bc6638138c880ad5c41907c7c39264 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 20 Oct 2023 11:56:01 +0200 Subject: [PATCH 57/86] Doc: Describe new and changed preferences in C++ > Clangd Task-number: QTCREATORBUG-29392 Change-Id: I54c56b65a531bccd233f5405c3add4f0dc4c18ab Reviewed-by: Christian Kandeler --- .../images/qtcreator-options-clangd.png | Bin 16621 -> 0 bytes .../images/qtcreator-preferences-clangd.webp | Bin 0 -> 11832 bytes .../creator-only/creator-clang-codemodel.qdoc | 16 +++++++++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) delete mode 100644 doc/qtcreator/images/qtcreator-options-clangd.png create mode 100644 doc/qtcreator/images/qtcreator-preferences-clangd.webp diff --git a/doc/qtcreator/images/qtcreator-options-clangd.png b/doc/qtcreator/images/qtcreator-options-clangd.png deleted file mode 100644 index a4251e7be8f09933d2dbef50a41ac04ad5b080ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16621 zcmeAS@N?(olHy`uVBq!ia0y~yVA5e=U~1-IVqjp{7Jsajfx%&mr;B4q#jUqWQyyv&vNt^t4(UnP__78R*5KUOfnbCDiVgsYJ1iy<@ zaLeAE(ua+?n^Oco9Q$xeE`OJa{h{t(viI))erkMgVqj=w=*-aP4}_=6PL-4toGH3o z$!PVbx#jn3zyH4f|DXKdi}H8lroiBUWR&;sB|A@fH z%Y9$;?ziH6$|S{mW&YuVXNnb_9{Ze-tz2{DfUMUc?Ekpn5y})d%&bd=3 z{GW5_*pXwQ!hbhdJULy-u^7P`}>l7#Vv%_)Lpy&Hp)_4mRMWAUFWkWn(tG&;(j#q*oBW#e>^;-xvpldEDh3? zHtJUUmZS3JgxrdhdYeza&XUtb)DMJJ;De;ZB(5^X1v@JN>3VS5g(ZwcA$o!!zx2?f0UseV!Q`kH`LBvnt+cwy)Da$&2segg?#UTvdEo zU1RR~@N4gcq!n|w9{F7SQ^+g#zYFJ0bH1}G3lCT?zWdUmxa@3kdCc3sGj55TU+b*S z&9w{N{%eQ3s!5`dh4%hmVei-5%Ij{P?7P1q_Y9{`spQ71*-jJpT0dQHA6})#`E2q9 zr{#~us_x9)zWu$_jWgAm|KC{@%m3ON)mY0qTdzdzNBXBbowlFtHlE;=v`K7Qy>#CE zh0dD|IFH_n7jBALS!i`G`p6II`?LB!UpM$z*ZFdv`jT4T6F=t#)Mg*d5Rv4}++23d zmgC-$cXj?JeqUvo`a<#|yPoXs%SQ9O=X{%g?l0#>o9Q*lPKTfRuHC(6`N!!Y0SMrDc~tDbrM?~Q9U$xS<#Jhi?%UDlh^w&q7c`A-q!3gcWY z)_WJ?eP(=`74JPa|Gme&`A^cBqB6K@8@RXp{~{VcwPn-6{+`MS7fRBjz0+@1mG67G zd9p{xvIT$5eVl&v-0L~K;OvxukD1H2@>{>IIOcDu?0Mch_`<*0wnDSo&(7_8+_PLZ zgX@+&=i0R`PaHSz-z<6MywJb7XWPIf_tbD1PDRCgKfmlTVSU@*Vx_Q9n}K0N%(~d! z-yR%nmXmz(?(XjP_V!0T*JeMO+YXXCckZ0szaNk5JTvn1{ZHMg3f^;hx1u5g!y0xE z4hDt^0t^faiVO@4Dl7~PAOQwWMg|5UCI$uvCkBRw76vpWuN4*^O!(l-v`K0$Cj*17 zw+GAQPa#T?z1LV68lHN-*!%t7;3;;SJ>RUf8X7Sfnh@kXKYN&34<5Q?f+(0Sn+W( zGB|h({km-b_wx7q_4_0CRepX3Hu!q|-|KU&%a={R0IDw}M7LkDqtSWPU1M zYTC-IZkoPkbOV{1ncV*t9P6mbxk(`|6@9+KnUjP4l zeCVH>^Z!O({@&7a?w*m?!g+7<`!j`9mc*_4-qgata4p>F&~f?t7>O70|DMKoRqp&T zJ#_QNF1tL#)}WmZ@u!m&|Ch`uY}C|IT=tlO;hLM%q2=@Iw2BMAzrXMQ`zTB9I$!Y? z)33|UpSanql%4zhUE4=+7Lt_su23P&$gtqCkPsgqU)9gewi7Gu85mwHYq|D}-A8$I z9RtIKK+dmoZurPUk^(5=!ASv>Ho!>%ls3Rg0hBgCsl~zRg7G}t>TkRZIuezOEAKaa znmqgZy4c;Du6eMQmz7Nr_;Ips*0;UiIh!IfD(dg-{Ac)L^XAR&*n?(E)>fK{4PU7Z?QI2JhzOb~ro{NvZ6`2649*N>j8`uS+b-07cI#9a?7Fe|+NF()){#nx53Uppkq?b|VB zN&CF!N7iNTH*cL|^tE4e?{ng+7v7fQvlBg>)Ya9?mpypBeU<#YJ%4}s#ZSoErnGR= z=d<&s%D!p;YG-vXzI>ti{Dm#EH5aatt}Wg8HaET?w&sX`RMuh zy6f`1TXhy@xc9VN3wDa!{_j_2yoyS4Yt@$p`qK}0uTl!$lhPicq92_zIcsi0*Eh!d zXVoWc*4bY*@$cUY#R1FmH$FRj>zLtNZ_9ASg^wRUz8(DG&D)eepNz|QzVVUR_2Ja-%-Fq8N><*?SUf|gYGVGRdMAC2-`v{mI?uz`>z}q)t!f>MW>+j<_(kOF^4b0N&ll<2tx|ci@z&GN-M@CoST}Dw z{ak;IrrmnYw~NEpB*-lYXnWUrad8ow(A;7>`=^_jrtCba_qw0;S>#>^&XbRBr)EELX{)a3T`v^crJ;DgBX_nwzRVt}kab7hmu4I9Yb>A1(X)+m8BGYbzGJ?W;20z4yb>?6v0SRRT{a>~=}a zjs7b5?1aMYBQFcr5kVkyj2Jl`h?RRL@OY=+y5ykAJ9rwR$)uQ#GXYh?mp6 z=0#uI!i=A-7gN2W?=ERs(Lc*NQ}X16>ZC7A=QJMLy<3AjSjO@Gk(IS!?5ZUtB_-Kh zU$Q?hZk(o3>%TWcTFm^EWG!;^#1bi z&2hOaRvYd6zQJtGObJ<+pP8ofX2*uySHIAHRXs{l>#UyQdG_eVzqy}0E1Q^i>WWa1 zX4vCuzLxD%byjAd{*~A(v-JeyC4cGq%3lHJ5*|wXMZJAIakJBJp;cD`tdIGHglUQf zbE#iHwIE{Mq)&A|Cy%|nwo6U%dGWqiue-H${ha*d^Sw{RB(iauURhcfIXxi%>|`ay zwc6{~bFO}USl8o3P3Y1q!uppzH2%)|7IVF2j;G>zwchDXX}i_Fl&@D)3;mrfy2X7_ z=G@(t5zg+qbqzwlKFUqm9O-nIt5vR_ zb)21!sm`=iN%23v^IyU9YinLwWV4oA`JE15o9DCg=c`5jj#0t&=lrVeWuNaiJoBRO z>eq)imp$%zX&TLN@TX+Cm0lJ9?5plm?snbwwA>q)eD0mh+})k|QpN_GmwTQ#s~#k= zc>NasE-BsCRWF~dEaH&g`i%LC$>OWcMaRx(mH)avw~zbY9r;NYro>;^VrTwaziCHp zrrO+(JKjBXTRiboMac)1t_ojvNYV&3FQUcG0dMPEq^A1XhUnf+>W^uAXw zn~z+)e?7N8PiN*KI>i8dmmR}e`R(4 z#yuO>b7t4}e!sNQwmdNIgT|)nzppM$pB-g?!TILj-JuodOM0I-@BBNdc7L;_h-I01 z;q{OCPwy>%@Xjhk!rSSY`@cVay!mer&E0Jn#w~05oq^Tp%Up@Qn#g2 zcK=S%`B$zUC;skRcJph+@1VcQJNLaQnd}#TOOf+nmC;vyHH+{V@q%)lkN@tlr@pj2 zvTyCx?L~SY#f6_3vYVSTtW*_ZDhm%EKFn_hR)5s9LxDr3rG405nl1ed= z*-M%VnL$mX2vtx^2vq%nDm&tuMw)ka6h6MSH9I`v>WRRNKXcs~R9If8DLj1e;K7?W zZv@xyW!77A9ewy<3yTWN?53Ju)Asq#W2hGo>y=@(6f1JE&}HO2xJ+TQ!}8_J{#_|)5D62eXCYkR@=+>1)rWA^GWm5n?)^tetz#X_SISceE0Nu`7MV{t3E#c`SbL9 zq3=`orJbLc+}OgvY5Mg<XiqntV?f*Qq|M%Gb-yN4AmAg^FeXK%EDp#&3pH4Cr2%21y zl`(~P%9brvhimR8ZOxkcv0%ksE4kidPo=c@Ys1&Eer`>Svn=2SIsl~23Qoe8d`BPK7Sd(ib*Lv}KYeZN4E}Qc_B`^Ekq3zF%P4|EQwtQ3L zt?1`>Qz}nnE2yw|Xy`3Gp}KIFf2n@Ii2lpqipa28JyRB$oDS7q{l`gYRamHW<>&8S z8imo$2c|lwti5&Y^7EUjoU*dAcY{P!cc(7%`1$$hr-CP$u9HkUCgdyV&x&5P=GEJ- zJFBj~60O|ZcTL45nU@PYZ@&s|-6gsAa$#m=S*F!Fn=f&>yW5q^UsuG)f4!LT zB;-W&$u_l1Wfy;JT&&UZrlR(pJS4%is+bt2-FxL{>V3hQ>2(_G;gDZTg})zTSzNsF z`_fb$*|;^AzdxI=vGBmQUp;qTyqA6IH$Q#3>JypF_YW`F=l|HRIaN>bz22YfX-|vw z4U`lcwobc{G~=DN``_i&U#IH%&r>May!}sv+hY5DJIzjPbZ}~DnbvN7e(SxG4g3C1 zyRh6|y1)M0OJ7hHSSG`F<`c6+t=zwoZTl`gm6emLyI^nkGxFN1$Mb7H9kfye$4wLO zqU}Oa{u2Zg6mRHk+qUi7w{PFRe-}J(YT{yr<4%1X%T*N=Z-{K$zI}cC{<`<~_Wu6< zUjERl3E!qKRydxNp5A_0Xo5hFz@^tGm%rEEko80(L4jaHd4}lEyi-?KhhP7#Z4u=7 zGfMBc6a%LtJMWgS@4orfJIj1t(b?SGEN!0mAvAzNh2^eO8;AM5>iyRhg?8O;u~Blg zIdXmzqk`fKu}jVQO)V{(HyhV2kOJlWtavAR)rJ;^2?7cWQ$1c}@(D4414wZpzp0*{ zUfo1x?y6reUup_5y;$ACru_Hdl~30zD&E!W&T8LwwP(wulTOAiPOGN` zURm+3$@9Y>UB2G=6dt8-S6se6|Asqf>8;{8&e%QkeB$h5H^%nG#rWyXmsj71H3MYzA7@Q_w|s=TC0OY?QT`{KfR0pE{q3Rt_)Y-RE4>+6dz7@swkoDv-x zyL;!RbkAZ?iPjx%0jDh zjU}ee&Axg(D|YX-RPFmOR!PiDUtjsFaO&LK-qCmex}4q}HhrtOt-rba)}@x4cVthE zyL}%Y6r z_872PJ@33+`0U4Hn<>lfq)vt#rwPopoh9nIKI)3k-X^mwWp+Eno~wrR#CCR z&U=MS>I~!LXGf)T&z+jtxoXq zT-Y`@y;ivC&h7=T^^205inW`UXWfcg99W{VWa|FMLPFImUOPOsiC8zeYN5n#6TjoG zSC;Bt-))@sA#G;g>eb52e%ecYT3$CzS+Swco8uaPtkX`BzO^@Z7P+mPXI}kx*Eg4$ zY4>MbFkwx3NAlM?3=3LU+mz- z;K4EB!XecstelJriVjZP6ECoH%E-wnDT4A{lI^@Tw=x#|{rh+CUfY#A?lKIVj_o(@ z-P>1Hy86A4RgM!+$=_e4P>Jm~Zr+@zcxdWYH?59F@c0R49~t-fi3i88(+LJY)EFas zw=prOu;?l`?VQ-K#x0tW0aTxZo%t@oL{hhClHVtJ{`1r4b>=9ZaC?5ZaA&TzYNT#v zXh0~NgVP2_p-*KKwI>EFQ&=AMT6dx83R#f1UMnwToyr38Vnj#Fr?{LM=aYP2{nMF! zQ&Yn?RXruT*KN|b`Ts3v&RCr__wj-|UZs=$jx|r*{IhcJ)dCTnz}SW=>eD7NG zADU^gbY(%1b)4IZL-bwl8Q!}e@yO)iC@f3Mb)Tu04sUCguZDRWL zfECNvJrSM~u!P~I(5IR|;aA_xX?dk1beoZrQK-pu(u6d&@^{&4oI8JBSwCa5+rF1O zJQy!6fBYwQy`tTDpQvJIRiEQWjX#QB+8p|*amGTBcXuf(e$Qj9RXQ<~S38_P){QI1 zU_E=}&yYEHQWnG}cio*~@VaEq?9S)QI%3n=jNb8Nzh5XVEM;uyHT!P7R0wLPs)!U$FmnxGJF)yi zvr(+j>(Etsw<8XE*lhnaWvy!L{l;?B;_HV46HXaamzu0{D>)W-XMgG0h<6*iQu1zS z+p;cuJWq@BppUz45A6cC>M$?jI&ibnd%?2j@Dk3McjotqQV@emOaf zcc#kwTeJJ?e+2p3X3YwEeJsyM!~Dstfaxksi?3Oi}I>{=@s;a#$ zpQKslRCC?gxhX3|Xs_YI!t47)vh`o(F|Tz=J#?b9Uu)9VhqF9iyg0hFRDaIwOP-up zOGTdk+1&PL<@{eB91HA)vU*E@pGvRKoHpUx+6Cd_52x^XdwidervPf5EtoA7)gJG& zBlFXA%dkZ@XBk1olYPzKmwbnVBi+K9!myl?L8xi!#?70R7dL9pZoeYM%n0hP zIXDsOycwv!{*@ZKubZo(Wq~-`t*Y|s6y{BWaDX2!2jpH{qid75kR?DqhXmSoHb% zw0X_tXP=$D?f}arrIP~g&VA}6#e40d%)~W9-;+#3{;PcXa5VL6;^VKb6DvOM`tkeI z(T}|Wr!J|MsJl=3T+HsN6K88_>FC7pT7BW&yPqHKa29iN%JuU2^XZk7f90=LTP8v> z${HU~MmaFc%VT@MwunWQo=cx~-dkrGFEK^?RMuCsEdMaGqiTmIZkuK1pOLY#vj1J& zr!}WjrshvuyIFj9!Yzr5H%{G+on|4`dz$xcP0d>|y$#!{*Y3+JJ!JIB^Td}fkC$IB zS5270TYE=Dg@r+TQoyyhS!P<-0=<2`X6)#WnszI!d18>?-$lEle#wPOhPqY0&rMC` zIwSjN3M=>d=v&q&rC8&uEdH(R=N%WC7+mcIGnn+scGdCorhRTz9G@$%Ep z-9>KxZXsWv#BJ?7bzdgmS9jrUP8oT5WyOZlsR93%Tk40GEu439*M}WXZ1yyLtGq7} zedLqp{l#HX%D%!ah4O9bD<;}7aZfpT_V~4g6_InyuE&23Q?Il-cj4qk9-&h$pEvBv z3t2Z)_qlP!w_hF{49|9|Z7JaNo$dc?R_MEXanWyg)!m%r{$kRNEkd831nvy`JIIZcTE?nab}u7IBO{zp7HFo z{{E8peUn{OST@uNan<;GoYj2!@>yxEZK8>nEN7%}*uj@OwDQZZJh`1*7u>M(*MfbQ z6IYy8_n&mNwt6G?vo~gipDvs_p118-+Q;~1v(6MIJ4xQ0uvBjMjPHkbY6g2{{IixS z+1gR`FVgwnmGe0&EF0v6qWEw9)q7?2z(ZsIisZW%0kzs1(a4!n9h0A@WwZn5Jp*@5gq)z695hIw>*6G@QczLR0qV4rO#f#Wx%HyM z@87?xtE+s3|!ugK|^PVy_$I1#+(eEZ{1iT7-4SA93?>TN0EtX)x9SopD9Ci22% ze}Dgp0t`Z3nkR1FU!`JlxbCa(gbSxsLZnZ81&8S6Z@)bNKNO=V!d0?9Jn=f-qnOBe#dW0|1$2H zViv@<^|y}WU(p*=XU?AKIQ4La#ft92eXnnN@8C_J67aC|`uZs?^TJL~_3MkX*g5^R%!l{+{G3Bp?pO@x(o!zl6`1^)gA#BQ< zZ-4DmsWH3eyLYk2x~0?W z#N7bn9$TKS>DQv!vQ@5asC#@S@j~Lky*~EM*EJNKZDvi#2|wB37H7rf@#1K9am$j< zT=iQqU?q3G$97N)iIo<-cVnJOapPZy~!@m(M4thB%74!8X; z(}jL#jw&iP^v>=3Y~?(^FE~8lOXVtu_}dn;&+lKD;FpzocFimCzuVh(@1E!BbhbLO zuVs_Bd+DwybrYdoC*DOEte1Ovy=9k?Y`J#h;>F4;EEn84S5~V0KE|@0IdpP(>Jy*#ur9LhHm*?ojaC%z6ZuKZ|=!7eabsnI`9CKwYE_;DSMn zO-ltxHMt2>$#bao;>tr@!&{vw>$5Zue6`1Ry;xK$()JC z?&sw1xiqvSl%>Qy{qp6Da>L7s#_jSV>?$muy*!qMz3@+DdveCnsi9>->%>`g{{m$XK*Rq=d*FvjfG$WbM#Pj9fP0u^2rhI4_ub+Bo1W&m2o+~4kKX$@}IlHrO$Z#H9r4mxp62GZ+ zn$E(bZ&w!!S=rg`i~V%-^v5S}H{a$vf6wojzWr`n+n3Vk_H=K{*voK_XL`(8%kt|R zcFwW%;0RMuOjVq^PVG&WZECjY<*371TWkJ4JYl{zJ$LOSH|AU;gX&2Ao_({@x1Fvy zxmkR>O;-HX`B(QjUA5dkOCwsM_gHD<*-7kLlR~zA6HW8bc(P!Tan-j?YwGUm)_&Wh zRlIlV)R6B<=kHDPoR@nl{Og&kQD3tn!}9OUvQ3#ekKo7@2)VZr=%xQDM0|X~O1Zv#y-7j+h#; zY}NIxFW3Jv>Rcij_Oa~y#BQy3-uw2loPHeIz1`}c>D(aRS$n32ZDaL#@#4jcu*Nr0 zM*E*mn!coBrH1Fsh_$v7PrXwwp5;Bwoqg17`=`TIr}uYP1#jioJ-sRPZj)$s82iz) zr#yAMvZt$TnYv$P74Ms061S&yAKTXWNn_918DTwbUYWbUgqW55Xkzy}C!@lmJ!Qh> zrBTiuRa1}Y-I#Mn`|aYdUmQ7I(^&6L-&4)WpK9~lYfazPu&~Wbwl~;+{mb za`3RYRYB1+1;vPEEjIDOo9@;8>@M=WH*Z1qu1V|Tr6uiK-~QpgPok`9`kyFErHUPQ7M3kBwPD}+ za)HHCUz>wL=Ow>8T>rk@!hAMMbpE?w^RKbO8A|EZTX()cpa`=4Su*SPlJ`M#T{utX zf4U#TUZ*qn<$1fkoZil$82vjTAm!D<{x!j+pmFAiaL%L4q^qp{L@s`%!6_>zSGR%h ziO{bn%n?!`zq~kEA_FQO7(6%-1JW;p617kY8&J;&F(S>hL@~X4j&aemH*em2P-9YI zDOUX3Q8RBZlL2qhImnQ71ID5qP=^TAIC9`uHDP36n8EDk#K3T%M1}#f(g(D>!-E4f z>Hr$I0`b5`fCNxVP%{Uo=D@GUC5sR8SX;{XsXu=BvuX9C``sdYdt=WBwcaed8`P*Q zsrS5qfnkgC!Zqht-6^({;oB9jx%YPNUjO&|Tf$=G7#dcpT-hJT0h+ankmh_kxvQVPAJeW=&kQj8DDv(SkE)tfR$e zWblL@jE>q`^>5a;v^8cQWp}1}-!E0T_{}T%bad~`7?tgZHi|JYs9bTl*;>J3Ad%`l zOGYQ$V(+|r+AEJ3ZLPa|?%>JDZ`x08d;9%7bl~!D@tM}v`TzFFuWgEr%GJ!*TrJ^O zJd^kJ8;eIhUt)K6W=gVY&x>1Kf97%eVuQgR*To_u+nQKvrpgXe(Jh-zuD<&d$Q{* z%Yt7&TK~hub(5B8CL@D`)64A{)9-dKe;pF*`?u-a^Djc5QddN-_+c^E|L{t_@+!`i zpCs;XTklrvrE%fCo5~Z-+d(QKYkruxe)8b>%y1w_NQ!55+_HITA7fQ-ef{!uU#C&6 z)w+4dIjas$b)L4!_eigsa_$3zr7f>oKE$5(Ev}vTQvdPQ12Q2M&rStzTUj>OLiYNN zPtQ*1tn|3&Rani;aK=Jt(|W(#!a9>OVmEACA78D1(cMni-yFWq>8t15utYK0ZEP&&OcEeyR7u z?L$36lY~3cm>Mb1`EKW!lW^kXd(#O81qB6V zW#2MjCNH-!j;mrs>W4M>$g?eyunO7fpiOF#9R3xb7tr(C#r@#5N_mhyea4;L4| zytejWhLI%isgQ|&^WOQ!SOh^MMjN3MeQxIXG>e#GB_+ z#I304;N;Pv@JOg@|Jq3!A&dU$9dkO$ee_VC>1Q#olFvor&)zzMyxA1t%(-*g3f(Qy zy%UceUKn+Hb_Zwz{|K9xhg@+%F*DSUkT7X-aGKh}$IowngJH=mkVhRAAR#m%;M}!q z*Y4fB_wV1oDrpZbjjK~mLBds$GdDj!et+HHdwZ+DzrSxE6TBoV$Z_SfbLaSAaib8s znMV*D*CNayXR~a~0Z*fYmyaR$j<&&fo@OgA#~?(-(IZAtxt@en)U?aoIC| z`@a|e{|gkI|L@`4cghf*Nx3Rt)ZM?YIx7Fw!5N}F(CPT`^?^qg*Xn*e+5BF-d%n%NX`imj+5f4Vr=)GK z7k6%&{mu2CG>w1!JAC};vrk!5pZ{C@DAfG<%8AfaZ6+Odg+}Ky&VhZlrnTi!{%VGuu66gL z&ON&(7ryf0)i=I!e+~S9|7A~_m1G!Q_vhr|<5%a;o0I+$nhxzbJB{Z3ab4Kqqmp$= z$Iyv@ze&#$kq-^;5aIt3o16I#0DzwZGh8QA)h z4J$OEsWIT8qNLKFdr``wK8E1sE&`{g34oddumlGl$mA3R#d$*u2Pg?JKo&Z}QYxn+ zC>w%<0h~KHP!xl6C1Q0XqmYvmvdQ3N4w^Iuo9qCR0}W3`B85 z3)n<(F$UJu0&z3gWKjNBaRGS_>JzXix_tgm1;qpbQtbmR3WbN&MR`Gx z`QVZZ#BfA+4QQ4F+4n?v2*m=-$N*V`+dg#P(>t`$>_c{_3X2DcX-P%QEDH!tVSd~6754yhM*KiQN~i@00kIw@&~0Ykp$3J} ztbcDRzrDF>&LG`6=g${q4~{S$MFxglf(}m5=FEj&(BKBh7SM#V5NP7qg9DYRpm z0hFIX!=OT^D*ycWIG>r}Ok;`imu&`%adrs~{PKLE#lUbt=8WpX|LhD52HHNy85tO^ zBWnQVKD2EButpllSqu^TTG$q!OfliuZy`62UFdv!^7qjEM^`GoTMNIPk}kSpl6#bL zRl~H40rh|P?*I8d{(rOB>bqra$M@Gf&;R#)uKfSY`F{`E|BX8BdUb|zvA<$;endl_ zm&dMoA2UqmZSK!LFS$8=MgFC#%COTxDpv&4x6E1ivt7*_qMt?ZIBc?C1YZv z|IgLQBSTho%Z_z>Tse3CR8YLZ!5R8(qt2AGXHt6Fov+TV6zV>wH~YNy$z@;J-l++j zKAgVaN@x3prHSjFmo3&>UnHvRsDJoB@08>Fv*Y*9sm*{NYa9JLVfMY`Z|cND(pkF;zCAN@N_jCe+-s%r zo`s<*{)|CvJ0ib7|FUqJ@t3?ULP2F`7r$`0dgXGy?Zk7jYhS7yD_?b6W1sc~gJb z=U#LTo4=R&?z&}m**#As8(CGKXfN5mY4U-ZuqAWmDIGOmqw_+N|5%JrrpE4x$*x7* z0yj^uGwa|iUvT`X`rnA{dX^`ie!tstZ@5y=G+$(z{xf0SR}QCY+qe0rLiVs1=m z->y$0?!63uCr>bIUHU!f^z;et4gXe4xh{X@m(hCEcyh~{+Df&JHBY~YXl`0qY^pb{ zGRgU>{%`)q@5&w57$)vj@$lHI!aTinNMSPXDSZ-MWss{VUq#+LaS=e|koYPWFt@&+Cl~O`grw{bIH> ztl>tS(6YxVQv$xc`8T^qdikMeGr^-E(-d!e&rCOa^wFo)H~QeRO-ucc|2%FR^uwn1 zY~JC<-iZ_bU)sMb;L)8K4?IisQrYu;I$kf_XTD%xyzlX+bEn!AVl|k- zMF6OW1s*g2Et<_~Xj!vfyyWF=wqMs(y7S+P#J`J=;SB$CW1-&Pl%nhN4s0n@cm7km z>&IT*g{{*+djFBNIptk>tKm7vx@GzAceb1n%l*1;Yo6W5h5Ps4-hamI&V+ZHm;Ty!_j2cPzN7Ldp8R$T(p&iWm!kQ%#pPevg|GB)FO1`r zNxFZzt>(N#*Z)`j-#sGxCp}8}u&w3!-^Z02Q+7|k;n?%eAnfCb$$Jm!%G6AoQF_S4 zHtzKAeH>wz|KC`9toXK0=x+C$^S)&Ls#^HnXWlazkJ>G>V>Lc=nAs()$rkdeD)Rp^ z-RfsgG>5uJyh|N3u_DFKOR2}2B@IQaHU+lVn{EHp;@`?#PAET$eTm5g+ zk-E<&Kh7+d>=RKxtZ;?b)OOpBkBZTnZ^dpV|C+q_QvDP29ce#4Ms1Ym{uaLZ;l}96 z%j8A+{$)Jjaj)EU(D&5r)HWj%v*abLLGvoFv2yx;eIj>yb=m44^U5BlNmT1Oe|A>7 z<1eRO_a>kq_4`4wdoOoN^4ksXPJEQYVOx8|+*Q6tBjhlP z_lCPl)pH)5jCq2XwCGZN0u7| zICbA2KRIciy2y;_8_&)BF}eCt9k=bij=z3^O=3o_jI{B5&@8;@hVI?q*=KG<6&ReS3~-eu$Yv-+o8 zoHvJulUJ}_YwG{axly}Yv*-OvS^wnMD{IMKx5-@; zF^+EM&Kyx+v2UjQ1ka86kh70bTu5!yC+Ni7j(3#Wt zTu?UH=66ac{~ph}2VQ?VHP4=pu28LaRLSFwu%kE!Zx@dowM0Ll} zBKeABzLqnMx4!HzegFULpDDA}DVN|6tm(bj$b4Y|2t^rGH~!STnQb%=05h z=CwYqbvd4Q%ULJv%YoT9Ca0ZY4>~@7hER2Z_X9D$?~Ok1)L!xzFfqJX+p^1Hxm*P^ z1A|9~<1;1(1{IU({$jrmNHZ|p&;bp?f<|Rg3RuvnEan_ITnT7w7032Xly)0j1E|mj knc1)b)a(m8^q>9m_3-DOYF}3~FfcH9y85}Sb4q9e08)CU0RR91 diff --git a/doc/qtcreator/images/qtcreator-preferences-clangd.webp b/doc/qtcreator/images/qtcreator-preferences-clangd.webp new file mode 100644 index 0000000000000000000000000000000000000000..6d363c02f930dba521b073ff07e696cbf99c206b GIT binary patch literal 11832 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 F7yuj1^Opbs literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc index cd7a71f3d70..0edfdcc22c7 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -161,7 +161,7 @@ \list 1 \li Select \preferences > \uicontrol C++ > \uicontrol Clangd > \uicontrol {Use clangd}. - \image qtcreator-options-clangd.png "clangd preferences" + \image qtcreator-preferences-clangd.webp "Clangd preferences" \li In \uicontrol {Path to executable}, enter the path to clangd version 14, or later. \li In the \uicontrol {Background indexing} field, select \uicontrol Off @@ -169,15 +169,25 @@ by default. You can set the indexing priority depending on whether the accuracy of results or speed is more important to you during global symbol searches. + \li In \uicontrol {Header/source switch mode}, select the C/C++ + backend for switching between header and source files. While the + clangd implementation has more capabilities than the built-in + code model, it tends to find false positives. \uicontrol {Try Both} + uses clangd if the built-in code model does not find anything. \li By default, clangd attempts to use all unused cores. You can set a fixed number of cores to use in \uicontrol {Worker thread count}. Background indexing also uses this many worker threads. - \li Select \uicontrol {Insert header files on completion} to allow - clangd to insert header files as part of symbol completion. \li Set the number of \uicontrol {Completion results} if you regularly miss important results during code completion. Set it to 0 to remove the limit on the number of completion results. Setting this to 0 or a very high number can make code completion slow. + \li In \uicontrol {Completion ranking model}, select the clangd model to + use for ranking completion suggestions. This determines their order + in the selection list. The \uicontrol {Decision Forest} model + (\uicontrol Default) results from pre-trained machine learning + and usually provides better results than the hand-crafted + \uicontrol Heuristic model. Select the latter if the completion + suggestions stray too much from your expectations for your code base. \li In \uicontrol {Document update threshold}, specify the amount of time \QC waits before sending document changes to the server. If the document changes again while waiting, this timeout is reset. From 26b2a755a81bc5b26f7a59f0a87362c6dc80d353 Mon Sep 17 00:00:00 2001 From: Ludovic Le Brun Date: Wed, 18 Oct 2023 19:02:58 +0200 Subject: [PATCH 58/86] Fix install .so plugins Remove the period from the file extension .so because the completeSuffix function of the FilePath class does not return the first period of the extension. Change-Id: Ifd850e54337c399d6440b6ad765c3b23df9ed330 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/plugininstallwizard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/plugininstallwizard.cpp b/src/plugins/coreplugin/plugininstallwizard.cpp index 85f2f3effef..9a0b92c871e 100644 --- a/src/plugins/coreplugin/plugininstallwizard.cpp +++ b/src/plugins/coreplugin/plugininstallwizard.cpp @@ -58,7 +58,7 @@ static QStringList libraryNameFilter() static bool hasLibSuffix(const FilePath &path) { return (HostOsInfo::isWindowsHost() && path.endsWith(".dll")) - || (HostOsInfo::isLinuxHost() && path.completeSuffix().startsWith(".so")) + || (HostOsInfo::isLinuxHost() && path.completeSuffix().startsWith("so")) || (HostOsInfo::isMacHost() && path.endsWith(".dylib")); } From fe129cc0c4c098532e89bc046968caaca82d9f81 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 17 Oct 2023 17:30:17 +0200 Subject: [PATCH 59/86] CMake: Reduce number of FilePath conversions in fileapidataextractor.cpp Change-Id: If143843782b0bfdbdd68ab1a387d0feabfb60a33 Reviewed-by: Cristian Adam Reviewed-by: --- .../fileapidataextractor.cpp | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 13a240d4e85..aa53ff0437f 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -420,21 +420,13 @@ static RawProjectParts generateRawProjectParts(const QFuture &cancelFuture QStringList fragments = splitFragments(ci.fragments); // Get all sources from the compiler group, except generated sources - QStringList sources; - auto addToSources = [sourceDirectory, &sources](const QString &source) { - const FilePath sourcePath = FilePath::fromString(source); - if (sourcePath.isAbsolutePath()) - sources.push_back(source); - else - sources.push_back( - sourceDirectory.pathAppended(source).absoluteFilePath().path()); - }; + FilePaths sources; for (auto idx: ci.sources) { SourceInfo si = t.sources.at(idx); if (si.isGenerated) continue; - addToSources(si.path); + sources.append(sourceDirectory.resolvePath(si.path)); } // Skip groups with only generated source files e.g. /.rcc/qrc_.cpp @@ -442,12 +434,12 @@ static RawProjectParts generateRawProjectParts(const QFuture &cancelFuture continue; // If we are not in a pch compiler group, add all the headers that are not generated - const bool hasPchSource = anyOf(sources, [buildDirectory](const QString &path) { - return isPchFile(buildDirectory, FilePath::fromString(path)); + const bool hasPchSource = anyOf(sources, [buildDirectory](const FilePath &path) { + return isPchFile(buildDirectory, path); }); - const bool hasUnitySources = allOf(sources, [buildDirectory](const QString &path) { - return isUnityFile(buildDirectory, FilePath::fromString(path)); + const bool hasUnitySources = allOf(sources, [buildDirectory](const FilePath &path) { + return isUnityFile(buildDirectory, path); }); QString headerMimeType; @@ -469,19 +461,20 @@ static RawProjectParts generateRawProjectParts(const QFuture &cancelFuture const bool sourceUnityType = hasUnitySources ? mime.inherits(sourceMimeType) : false; if (headerType || sourceUnityType) - addToSources(si.path); + sources.append(sourceDirectory.resolvePath(si.path)); } } } - sources.removeDuplicates(); + FilePath::removeDuplicates(sources); // Set project files except pch / unity files - rpp.setFiles(Utils::filtered(sources, - [buildDirectory](const QString &path) { - const FilePath filePath = FilePath::fromString(path); + const FilePaths filtered = Utils::filtered(sources, + [buildDirectory](const FilePath &filePath) { return !isPchFile(buildDirectory, filePath) && !isUnityFile(buildDirectory, filePath); - }), + }); + + rpp.setFiles(Utils::transform(filtered, &FilePath::toFSPathString), {}, [headerMimeType](const QString &path) { // Similar to ProjectFile::classify but classify headers with language From 5f45c36b6f665babe67d3cb0c805a13ee1e3ef2c Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 20 Oct 2023 09:03:09 +0200 Subject: [PATCH 60/86] TextEditor: do not scroll to cursor postion on select all Since Qt 6.5.1 QPlainTextEdit::selectAll emits correctly cursorPositionChanged on selectAll which calls some multitextcursor update code on our side. Avoid setting the cursor back to the QPlainTextEdit in this update code by setting the expected MultiTextCursor before calling selectAll. Fixes: QTCREATORBUG-29763 Change-Id: I77f05ac40a9dd126efcd72089a699c908c68da21 Reviewed-by: Christian Stenger --- src/plugins/texteditor/texteditor.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 66e3616af91..4a87ecc62af 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -8038,10 +8038,12 @@ void TextEditorWidget::cut() void TextEditorWidget::selectAll() { - QPlainTextEdit::selectAll(); // Directly update the internal multi text cursor here to prevent calling setTextCursor. - // This would indirectly makes sure the cursor is visible which is not desired for select all. - const_cast(d->m_cursors).setCursors({QPlainTextEdit::textCursor()}); + // This would indirectly make sure the cursor is visible which is not desired for select all. + QTextCursor c = QPlainTextEdit::textCursor(); + c.select(QTextCursor::Document); + const_cast(d->m_cursors).setCursors({c}); + QPlainTextEdit::selectAll(); } void TextEditorWidget::copy() From a18ea390e1cf4f4f300053abb3b7328f99145335 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 20 Oct 2023 10:53:59 +0200 Subject: [PATCH 61/86] LanguageClient: Fix crashed client restart condition Change-Id: I4b0195a512b6b1dcbcc6fd02f6014a27b4606ea0 Reviewed-by: Christian Stenger --- src/plugins/languageclient/client.cpp | 4 +++- src/plugins/languageclient/client.h | 1 + src/plugins/languageclient/languageclientmanager.cpp | 3 ++- src/plugins/qmljseditor/qmljseditordocument.cpp | 1 + src/plugins/qmljseditor/qmllsclient.cpp | 1 + 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 2fcfc0210fc..7583b065988 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -574,6 +574,8 @@ QString Client::stateString() const //: language client state case InitializeRequested: return Tr::tr("initialize requested"); //: language client state + case FailedToInitialize: return Tr::tr("failed to initialize"); + //: language client state case Initialized: return Tr::tr("initialized"); //: language client state case ShutdownRequested: return Tr::tr("shutdown requested"); @@ -1696,7 +1698,7 @@ bool ClientPrivate::reset() void Client::setError(const QString &message) { log(message); - d->m_state = Error; + d->m_state = d->m_state < Initialized ? FailedToInitialize : Error; } ProgressManager *Client::progressManager() diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index da8c8166644..aba2b996754 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -77,6 +77,7 @@ public: enum State { Uninitialized, InitializeRequested, + FailedToInitialize, Initialized, ShutdownRequested, Shutdown, diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 839ececce7c..bb655e2d8f8 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -172,7 +172,8 @@ void LanguageClientManager::clientFinished(Client *client) = managerInstance->m_clientForDocument.keys(client); if (unexpectedFinish) { if (!PluginManager::isShuttingDown()) { - if (client->state() == Client::Initialized && client->reset()) { + const bool shouldRestart = client->state() > Client::FailedToInitialize; + if (shouldRestart && client->reset()) { qCDebug(Log) << "restart unexpectedly finished client: " << client->name() << client; client->log( Tr::tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 065e39e0c37..37f49d08712 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -784,6 +784,7 @@ void QmlJSEditorDocumentPrivate::settingsChanged() case LanguageClient::Client::State::Initialized: setSourcesWithCapabilities(client->capabilities()); break; + case LanguageClient::Client::State::FailedToInitialize: case LanguageClient::Client::State::Error: qCWarning(qmllsLog) << "qmlls" << newQmlls << "requested for document" << q->filePath() << "had errors, skipping setSourcesWithCababilities"; diff --git a/src/plugins/qmljseditor/qmllsclient.cpp b/src/plugins/qmljseditor/qmllsclient.cpp index 6777f267cc1..4cc8769bb1b 100644 --- a/src/plugins/qmljseditor/qmllsclient.cpp +++ b/src/plugins/qmljseditor/qmllsclient.cpp @@ -39,6 +39,7 @@ QmllsClient *QmllsClient::clientForQmlls(const FilePath &qmlls) case Client::State::InitializeRequested: case Client::State::Initialized: return client; + case Client::State::FailedToInitialize: case Client::State::ShutdownRequested: case Client::State::Shutdown: case Client::State::Error: From 3d77369e4c714a9af4586c86f5ed4d7abcee6dba Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 19 Oct 2023 17:38:35 +0200 Subject: [PATCH 62/86] ClangTools: Fix clang-tidy documentationUrl for version 17.x.x Amends 51a650f30b0d75129b3eb77ed7b7d38a07cf810e Fixes: QTCREATORBUG-29782 Change-Id: I4ce740900beb718d9628c35042b3467ec23de8d3 Reviewed-by: Christian Kandeler --- src/plugins/clangtools/clangtoolsutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangtools/clangtoolsutils.cpp b/src/plugins/clangtools/clangtoolsutils.cpp index 1ad142fd459..029a879ce11 100644 --- a/src/plugins/clangtools/clangtoolsutils.cpp +++ b/src/plugins/clangtools/clangtoolsutils.cpp @@ -316,7 +316,7 @@ static QVersionNumber fixupVersion(const VersionAndSuffix &versionAndSuffix) version = QVersionNumber(12); // Version 17.0.0 was never released due to a git issue - if (version == QVersionNumber(17)) + if (version.majorVersion() == 17) version = QVersionNumber(17, 0, 1); return version; From 19511eaf1a4eff9f26d21c8dfba5f55374a2baa6 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 20 Oct 2023 13:04:32 +0200 Subject: [PATCH 63/86] BuildManager: Don't stop the run control being started Fixes: QTCREATORBUG-29689 Change-Id: I65b5b6e94176ae2dcf09374755b4c3d70e844a3c Reviewed-by: Cristian Adam Reviewed-by: --- src/plugins/clangtools/clangtool.cpp | 19 ++++++++++++------- src/plugins/projectexplorer/buildmanager.cpp | 13 +++++++++---- src/plugins/projectexplorer/buildmanager.h | 5 +++-- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 2e3a5c3ae5d..c25108a4185 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -70,16 +70,20 @@ static Q_LOGGING_CATEGORY(LOG, "qtc.clangtools.runcontrol", QtWarningMsg) namespace ClangTools::Internal { -class ProjectBuilderTaskAdapter : public TaskAdapter> +class ProjectBuilderTaskAdapter : public TaskAdapter> { public: void start() final { connect(BuildManager::instance(), &BuildManager::buildQueueFinished, this, &TaskInterface::done); - Target *target = *task(); + RunControl *runControl = *task(); + QTC_ASSERT(runControl, emit done(false); return); + Target *target = runControl->target(); QTC_ASSERT(target, emit done(false); return); - if (!BuildManager::isBuilding(target)) - BuildManager::buildProjectWithDependencies(target->project()); + if (!BuildManager::isBuilding(target)) { + BuildManager::buildProjectWithDependencies(target->project(), ConfigSelection::Active, + runControl); + } } }; @@ -678,10 +682,11 @@ Group ClangTool::runRecipe(const RunSettings &runSettings, QList topTasks { onGroupSetup(onTopSetup) }; if (buildBeforeAnalysis) { - const auto onSetup = [target](QPointer &buildTarget) { - buildTarget = target; + QPointer runControl(m_runControl); + const auto onSetup = [runControl](QPointer &buildRunControl) { + buildRunControl = runControl; }; - const auto onError = [this](const QPointer &) { + const auto onError = [this](const QPointer &) { const QString message(Tr::tr("Failed to build the project.")); m_infoBarWidget->setError(InfoBarWidget::Error, message, [this] { showOutputPane(); }); m_runControl->postMessage(message, ErrorMessageFormat); diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index dcb0bdf87ff..6c74b5cf828 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -106,7 +106,8 @@ static const QList buildConfigsForSelection(const Target * } static int queue(const QList &projects, const QList &stepIds, - ConfigSelection configSelection, const RunConfiguration *forRunConfig = nullptr) + ConfigSelection configSelection, const RunConfiguration *forRunConfig = nullptr, + RunControl *starter = nullptr) { if (!ProjectExplorerPlugin::saveModifiedFiles()) return -1; @@ -117,7 +118,10 @@ static int queue(const QList &projects, const QList &stepIds, StopBeforeBuild stopCondition = settings.stopBeforeBuild; if (stopCondition == StopBeforeBuild::SameApp && !forRunConfig) stopCondition = StopBeforeBuild::SameBuildDir; - const auto isStoppableRc = [&projects, stopCondition, configSelection, forRunConfig](RunControl *rc) { + const auto isStoppableRc = [&projects, stopCondition, configSelection, forRunConfig, + starter](RunControl *rc) { + if (rc == starter) + return false; if (!rc->isRunning()) return false; @@ -354,10 +358,11 @@ void BuildManager::rebuildProjectWithoutDependencies(Project *project) ConfigSelection::Active); } -void BuildManager::buildProjectWithDependencies(Project *project, ConfigSelection configSelection) +void BuildManager::buildProjectWithDependencies(Project *project, ConfigSelection configSelection, + RunControl *starter) { queue(ProjectManager::projectOrder(project), {Id(Constants::BUILDSTEPS_BUILD)}, - configSelection); + configSelection, nullptr, starter); } void BuildManager::cleanProjectWithDependencies(Project *project, ConfigSelection configSelection) diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h index 3ad4c84afd2..ec068615ab5 100644 --- a/src/plugins/projectexplorer/buildmanager.h +++ b/src/plugins/projectexplorer/buildmanager.h @@ -14,6 +14,7 @@ namespace ProjectExplorer { class BuildItem; class Project; class RunConfiguration; +class RunControl; class Task; enum class BuildForRunConfigStatus { Building, NotBuilding, BuildFailed }; @@ -33,8 +34,8 @@ public: static void buildProjectWithoutDependencies(Project *project); static void cleanProjectWithoutDependencies(Project *project); static void rebuildProjectWithoutDependencies(Project *project); - static void buildProjectWithDependencies( - Project *project, ConfigSelection configSelection = ConfigSelection::Active); + static void buildProjectWithDependencies(Project *project, + ConfigSelection configSelection = ConfigSelection::Active, RunControl *starter = nullptr); static void cleanProjectWithDependencies(Project *project, ConfigSelection configSelection); static void rebuildProjectWithDependencies(Project *project, ConfigSelection configSelection); static void buildProjects(const QList &projects, ConfigSelection configSelection); From 531fe36ac56ec93d37fe9e554a987459d4528057 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 20 Oct 2023 08:22:13 +0200 Subject: [PATCH 64/86] CMakePM: Silence warning This is not handling the respective role correctly, just silencing the warning. No change in current functionality. Change-Id: Icd904941d5fc496d66b8e1eb7eec0031840f519d Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp index b26f9a70b5b..7d017d5d86a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp @@ -174,6 +174,9 @@ QVariant CMakeTargetNode::data(Id role) const if (role == Ios::Constants::IosCmakeGenerator) return value("CMAKE_GENERATOR"); + if (role == ProjectExplorer::Constants::QT_KEYWORDS_ENABLED) // FIXME handle correctly + return value(role.toString().toUtf8()); + QTC_ASSERT(false, qDebug() << "Unknown role" << role.toString()); // Better guess than "not present". return value(role.toString().toUtf8()); From 73d0c4a29db71f8f95591f99023b3dc936346abc Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 20 Oct 2023 08:18:47 +0200 Subject: [PATCH 65/86] AutoTest: Tweak Test Case wizard We now support Catch2 in two different versions which means we need different include directives depending on the version. Let the user choose the correct version instead of providing a fixed one that may be correct or not. Change-Id: I0199070b4f4602b8e08b7ac60731071f0cd33141 Reviewed-by: David Schulz --- .../templates/wizards/files/testing/file.cpp | 6 +++++- .../wizards/files/testing/wizard.json | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/templates/wizards/files/testing/file.cpp b/share/qtcreator/templates/wizards/files/testing/file.cpp index 981fd0478e7..de5539dc022 100644 --- a/share/qtcreator/templates/wizards/files/testing/file.cpp +++ b/share/qtcreator/templates/wizards/files/testing/file.cpp @@ -24,8 +24,12 @@ BOOST_AUTO_TEST_CASE( %{TestCaseName} ) BOOST_AUTO_TEST_SUITE_END() @endif -@if "%{TestFrameWork}" == "Catch2" +@if "%{TestFrameWork}" == "Catch2" +@if "%{Catch2Version}" == "V2" #include +@else +#include +@endif TEST_CASE("Another test with Catch2", "[fancy]") { diff --git a/share/qtcreator/templates/wizards/files/testing/wizard.json b/share/qtcreator/templates/wizards/files/testing/wizard.json index 8a5bb84bf56..e15997abf0a 100644 --- a/share/qtcreator/templates/wizards/files/testing/wizard.json +++ b/share/qtcreator/templates/wizards/files/testing/wizard.json @@ -61,6 +61,26 @@ ] } }, + { + "name": "Catch2Version", + "trDisplayName": "Catch2 version:", + "visible": "%{JS: value('TestFrameWork') == 'Catch2'}", + "type": "ComboBox", + "data": { + "index": 1, + "items": + [ + { + "trKey": "2.x", + "value": "V2" + }, + { + "trKey": "3.x", + "value": "V3" + } + ] + } + }, { "name": "TestSuiteName", "trDisplayName": "Test suite name:", From 60de12efd2cc3afeea140746d757989ed0f9873b Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 20 Oct 2023 14:42:46 +0200 Subject: [PATCH 66/86] CMakePM: clang-tidy fix for "performance-unnecessary-value-param" Change-Id: Ia22d7c3fe6c29a5e0999145b6c4b281818dd72bf Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp | 2 +- src/plugins/cmakeprojectmanager/cmaketool.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 40562776967..ed81a8fea95 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -1098,7 +1098,7 @@ static bool isWindowsARM64(const Kit *k) && targetAbi.wordWidth() == 64; } -static CommandLine defaultInitialCMakeCommand(const Kit *k, const QString buildType) +static CommandLine defaultInitialCMakeCommand(const Kit *k, const QString &buildType) { // Generator: CMakeTool *tool = CMakeKitAspect::cmakeTool(k); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index f49df2083b3..e50cecc821b 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -656,7 +656,7 @@ void CMakeTool::fetchFromCapabilities(bool ignoreCache) const QTC_ASSERT_EXPECTED(result, return); } -static int getVersion(const QVariantMap &obj, const QString value) +static int getVersion(const QVariantMap &obj, const QString &value) { bool ok; int result = obj.value(value).toInt(&ok); From 43121fa574c2de4c8b5268e707104552894aab9e Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 20 Oct 2023 14:46:33 +0200 Subject: [PATCH 67/86] CMakePM: clang-tidy fix for 'perf*-unnecessary-copy-initialization' Change-Id: I9c407f7254328e7278096239f6f3946c34e873d5 Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp | 6 +++--- src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp | 2 +- src/plugins/cmakeprojectmanager/cmaketool.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp index 2646c5c5808..b02b2e779c0 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp @@ -372,9 +372,9 @@ CMakeConfig CMakeConfig::fromFile(const Utils::FilePath &cacheFile, QString *err continue; QTC_ASSERT(pieces.size() == 3, continue); - const QByteArray key = pieces.at(0); - const QByteArray type = pieces.at(1); - const QByteArray value = pieces.at(2); + const QByteArray &key = pieces.at(0); + const QByteArray &type = pieces.at(1); + const QByteArray &value = pieces.at(2); if (key.endsWith("-ADVANCED") && value == "1") { advancedSet.insert(key.left(key.size() - 9 /* "-ADVANCED" */)); diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 583729ee933..74d5056bf78 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -1085,7 +1085,7 @@ void CMakeProjectImporter::persistTemporaryCMake(Kit *k, const QVariantList &vl) if (vl.isEmpty()) return; // No temporary CMake QTC_ASSERT(vl.count() == 1, return); - const QVariant data = vl.at(0); + const QVariant &data = vl.at(0); CMakeTool *tmpCmake = CMakeToolManager::findById(Id::fromSetting(data)); CMakeTool *actualCmake = CMakeKitAspect::cmakeTool(k); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index e50cecc821b..f9d7149a344 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -490,7 +490,7 @@ void CMakeTool::parseFunctionDetailsOutput(const QString &output) const QStringList lines = output.split('\n'); for (int i = 0; i < lines.count(); ++i) { - const QString line = lines.at(i); + const QString &line = lines.at(i); if (line == "::") { expectDefinition = true; From 69815af272d40092db04cb452f06e02315e265c6 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 20 Oct 2023 14:51:43 +0200 Subject: [PATCH 68/86] CMakePM: clang-tidy fix for 'performance-implicit-conversion-in-loop' Change-Id: I67e5adad19a3454986381c5548bbe96cf1cc1e6a Reviewed-by: Alessandro Portale --- .../cmakeprojectmanager/cmakebuildsystem.cpp | 2 +- .../cmakeprojectmanager/fileapiparser.cpp | 18 +++++++++--------- .../cmakeprojectmanager/presetsparser.cpp | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 57c7cda2961..7f7ebccdd0a 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -1521,7 +1521,7 @@ void CMakeBuildSystem::runCTest() const QJsonArray nodes = btGraph.value("nodes").toArray(); const QJsonArray tests = jsonObj.value("tests").toArray(); int counter = 0; - for (const QJsonValue &testVal : tests) { + for (const auto &testVal : tests) { ++counter; const QJsonObject test = testVal.toObject(); QTC_ASSERT(!test.isEmpty(), continue); diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp index 943bebc1c18..e70ed3ced7a 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.cpp +++ b/src/plugins/cmakeprojectmanager/fileapiparser.cpp @@ -91,7 +91,7 @@ std::vector indexList(const QJsonValue &v) std::vector result; result.reserve(static_cast(indexList.count())); - for (const QJsonValue &v : indexList) { + for (const auto &v : indexList) { result.push_back(v.toInt(-1)); } return result; @@ -139,7 +139,7 @@ static ReplyFileContents readReplyFile(const FilePath &filePath, QString &errorM bool hadInvalidObject = false; { const QJsonArray objects = rootObject.value("objects").toArray(); - for (const QJsonValue &v : objects) { + for (const auto &v : objects) { const QJsonObject object = v.toObject(); { ReplyObject r; @@ -178,7 +178,7 @@ static CMakeConfig readCacheFile(const FilePath &cacheFile, QString &errorMessag } const QJsonArray entries = root.value("entries").toArray(); - for (const QJsonValue &v : entries) { + for (const auto &v : entries) { CMakeConfigItem item; const QJsonObject entry = v.toObject(); @@ -190,7 +190,7 @@ static CMakeConfig readCacheFile(const FilePath &cacheFile, QString &errorMessag { const QJsonArray properties = entry.value("properties").toArray(); - for (const QJsonValue &v : properties) { + for (const auto &v : properties) { const QJsonObject prop = v.toObject(); auto nv = nameValue(prop); if (nv.first == "ADVANCED") { @@ -223,7 +223,7 @@ static std::vector readCMakeFilesFile(const FilePath &cmakeFilesF } const QJsonArray inputs = root.value("inputs").toArray(); - for (const QJsonValue &v : inputs) { + for (const auto &v : inputs) { CMakeFileInfo info; const QJsonObject input = v.toObject(); info.path = cmakeFilesFile.withNewPath(input.value("path").toString()); @@ -253,7 +253,7 @@ std::vector extractDirectories(const QJsonArray &directories, QString } std::vector result; - for (const QJsonValue &v : directories) { + for (const auto &v : directories) { const QJsonObject obj = v.toObject(); if (obj.isEmpty()) { errorMessage = Tr::tr( @@ -283,7 +283,7 @@ static std::vector extractProjects(const QJsonArray &projects, QString } std::vector result; - for (const QJsonValue &v : projects) { + for (const auto &v : projects) { const QJsonObject obj = v.toObject(); if (obj.isEmpty()) { qCDebug(cmakeFileApi) << "Empty project skipped!"; @@ -314,7 +314,7 @@ static std::vector extractProjects(const QJsonArray &projects, QString static std::vector extractTargets(const QJsonArray &targets, QString &errorMessage) { std::vector result; - for (const QJsonValue &v : targets) { + for (const auto &v : targets) { const QJsonObject obj = v.toObject(); if (obj.isEmpty()) { errorMessage = Tr::tr( @@ -436,7 +436,7 @@ static std::vector extractConfigurations(const QJsonArray &config } std::vector result; - for (const QJsonValue &v : configs) { + for (const auto &v : configs) { const QJsonObject obj = v.toObject(); if (obj.isEmpty()) { errorMessage = Tr::tr( diff --git a/src/plugins/cmakeprojectmanager/presetsparser.cpp b/src/plugins/cmakeprojectmanager/presetsparser.cpp index 91943b02f7d..3befe4d99d8 100644 --- a/src/plugins/cmakeprojectmanager/presetsparser.cpp +++ b/src/plugins/cmakeprojectmanager/presetsparser.cpp @@ -44,7 +44,7 @@ std::optional parseInclude(const QJsonValue &jsonValue) if (jsonValue.isArray()) { includes = QStringList(); const QJsonArray includeArray = jsonValue.toArray(); - for (const QJsonValue &includeValue : includeArray) + for (const auto &includeValue : includeArray) includes.value() << includeValue.toString(); } } @@ -103,7 +103,7 @@ std::optional parseCondition(const QJsonValue &jsonVa if (object.value("list").isArray()) { condition->list = QStringList(); const QJsonArray listArray = object.value("list").toArray(); - for (const QJsonValue &listValue : listArray) + for (const auto &listValue : listArray) condition->list.value() << listValue.toString(); } } @@ -127,7 +127,7 @@ std::optional parseCondition(const QJsonValue &jsonVa if (object.value("conditions").isArray()) { condition->conditions = std::vector(); const QJsonArray conditionsArray = object.value("conditions").toArray(); - for (const QJsonValue &conditionsValue : conditionsArray) { + for (const auto &conditionsValue : conditionsArray) { condition->conditions.value().emplace_back( std::make_shared( parseCondition(conditionsValue).value())); @@ -160,7 +160,7 @@ bool parseConfigurePresets(const QJsonValue &jsonValue, return false; const QJsonArray configurePresetsArray = jsonValue.toArray(); - for (const QJsonValue &presetJson : configurePresetsArray) { + for (const auto &presetJson : configurePresetsArray) { if (!presetJson.isObject()) continue; @@ -176,7 +176,7 @@ bool parseConfigurePresets(const QJsonValue &jsonValue, preset.inherits = QStringList(); if (inherits.isArray()) { const QJsonArray inheritsArray = inherits.toArray(); - for (const QJsonValue &inheritsValue : inheritsArray) + for (const auto &inheritsValue : inheritsArray) preset.inherits.value() << inheritsValue.toString(); } else { QString inheritsValue = inherits.toString(); @@ -350,7 +350,7 @@ bool parseBuildPresets(const QJsonValue &jsonValue, return false; const QJsonArray buildPresetsArray = jsonValue.toArray(); - for (const QJsonValue &presetJson : buildPresetsArray) { + for (const auto &presetJson : buildPresetsArray) { if (!presetJson.isObject()) continue; @@ -366,7 +366,7 @@ bool parseBuildPresets(const QJsonValue &jsonValue, preset.inherits = QStringList(); if (inherits.isArray()) { const QJsonArray inheritsArray = inherits.toArray(); - for (const QJsonValue &inheritsValue : inheritsArray) + for (const auto &inheritsValue : inheritsArray) preset.inherits.value() << inheritsValue.toString(); } else { QString inheritsValue = inherits.toString(); @@ -404,7 +404,7 @@ bool parseBuildPresets(const QJsonValue &jsonValue, preset.targets = QStringList(); if (targets.isArray()) { const QJsonArray targetsArray = targets.toArray(); - for (const QJsonValue &targetsValue : targetsArray) + for (const auto &targetsValue : targetsArray) preset.targets.value() << targetsValue.toString(); } else { QString targetsValue = targets.toString(); @@ -424,7 +424,7 @@ bool parseBuildPresets(const QJsonValue &jsonValue, if (nativeToolOptions.isArray()) { preset.nativeToolOptions = QStringList(); const QJsonArray toolOptionsArray = nativeToolOptions.toArray(); - for (const QJsonValue &toolOptionsValue : toolOptionsArray) + for (const auto &toolOptionsValue : toolOptionsArray) preset.nativeToolOptions.value() << toolOptionsValue.toString(); } } From 55cccfa59eb68dd59de90939063acda56241c082 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 20 Oct 2023 15:00:44 +0200 Subject: [PATCH 69/86] CMakePM: clang-tidy fix for 'no-automatic-move' See https://releases.llvm.org/17.0.1/tools/clang/tools/extra/docs/clang- tidy/checks/performance/no-automatic-move.html Change-Id: If265c9b0e2aea49e5923f079cd621e10bb958286 Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakebuildstep.cpp | 2 +- src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp | 2 +- src/plugins/cmakeprojectmanager/cmaketool.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index 8187311a887..31a6ae23c02 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -372,7 +372,7 @@ GroupItem CMakeBuildStep::runRecipe() const auto onEnd = [this] { updateDeploymentData(); }; - const Group root { + Group root { ignoreReturnValue() ? finishAllAndDone : stopOnError, ProjectParserTask(onParserSetup, {}, onParserError), defaultProcessTask(), diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 7f7ebccdd0a..7c0001c6a86 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -1532,7 +1532,7 @@ void CMakeBuildSystem::runCTest() if (bt != -1) { QSet seen; std::function findAncestor = [&](int index){ - const QJsonObject node = nodes.at(index).toObject(); + QJsonObject node = nodes.at(index).toObject(); const int parent = node.value("parent").toInt(-1); if (parent < 0 || !Utils::insert(seen, parent)) return node; diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index f9d7149a344..fdaf5e6bfc6 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -228,7 +228,7 @@ FilePath CMakeTool::cmakeExecutable(const FilePath &path) } } - const FilePath resolvedPath = path.canonicalPath(); + FilePath resolvedPath = path.canonicalPath(); // Evil hack to make snap-packages of CMake work. See QTCREATORBUG-23376 if (path.osType() == OsTypeLinux && resolvedPath.fileName() == "snap") return path; From aef415a25d8088a993d78ca409f66930d2c9937a Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 20 Oct 2023 15:05:12 +0200 Subject: [PATCH 70/86] CMakePM: clang-tidy fix for 'move-const-arg' See https://releases.llvm.org/17.0.1/tools/clang/tools/extra/docs/clang- tidy/checks/performance/move-const-arg.html Change-Id: Ic20445321286fdcb8b02e1b2cf170e0fe60fd1fd Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/fileapiparser.cpp | 4 ++-- src/plugins/cmakeprojectmanager/fileapireader.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp index e70ed3ced7a..5038f2e85e3 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.cpp +++ b/src/plugins/cmakeprojectmanager/fileapiparser.cpp @@ -874,11 +874,11 @@ FileApiData FileApiParser::parseData(QPromise> & return result; } - auto it = std::find_if(codeModels.cbegin(), codeModels.cend(), + auto it = std::find_if(codeModels.begin(), codeModels.end(), [cmakeBuildType](const Configuration& cfg) { return QString::compare(cfg.name, cmakeBuildType, Qt::CaseInsensitive) == 0; }); - if (it == codeModels.cend()) { + if (it == codeModels.end()) { QStringList buildTypes; for (const Configuration &cfg: codeModels) buildTypes << cfg.name; diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index 732be976b7e..ee1edb26c02 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -285,8 +285,8 @@ void FileApiReader::endState(const FilePath &replyFilePath, bool restoredFromBac m_projectParts = std::move(value->projectParts); m_rootProjectNode = std::move(value->rootProjectNode); m_ctestPath = std::move(value->ctestPath); - m_isMultiConfig = std::move(value->isMultiConfig); - m_usesAllCapsTargets = std::move(value->usesAllCapsTargets); + m_isMultiConfig = value->isMultiConfig; + m_usesAllCapsTargets = value->usesAllCapsTargets; if (value->errorMessage.isEmpty()) { emit this->dataAvailable(restoredFromBackup); From 76f082186eafe8066187e581c8668e0ef69bf96e Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 26 Sep 2023 18:20:11 +0200 Subject: [PATCH 71/86] Android: Fix build dir for Qt6/CMake + changed LIBRARY_OUTPUT_DIRECTORY The "proper" build directory is required during different stages of the Android application deployment. For example in order to determine the input .json file for the androiddeployqt launch. If the CMake target has a modified LIBRARY_OUTPUT_DIRECTORY property, an incorrect build directory was determined. This change adds a hack which in such case (and only for Qt6 + CMake) tries to find the right build directory, which also contains the .json file. Fixes: QTCREATORBUG-26479 Change-Id: I24342f696aed7a322030eb9310d3ca71bcada81c Reviewed-by: Qt CI Bot Reviewed-by: Assam Boudjelthia --- src/plugins/android/androidmanager.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index b161698d686..aa8e3fe43aa 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -262,6 +262,19 @@ FilePath buildDirectory(const Target *target) FilePath parentDuildDir = buildDir.parentDir(); if (parentDuildDir.endsWith(libsDir) || libsDir.endsWith(libsDir + "/")) return parentDuildDir.parentDir().parentDir(); + } else { + // Qt6 + CMake: Very cautios hack to work around QTCREATORBUG-26479 for simple projects + const QString jsonFileName = + AndroidQtVersion::androidDeploymentSettingsFileName(target); + const FilePath jsonFile = buildDir / jsonFileName; + if (!jsonFile.exists()) { + const FilePath projectBuildDir = bs->buildConfiguration()->buildDirectory(); + if (buildDir != projectBuildDir) { + const FilePath projectJsonFile = projectBuildDir / jsonFileName; + if (projectJsonFile.exists()) + buildDir = projectBuildDir; + } + } } return buildDir; } From 61088bba699be5a42afbf394506c3a5d5773810c Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 20 Oct 2023 16:08:07 +0200 Subject: [PATCH 72/86] Fix UI text capitalization, punctuation, and phrasing Change-Id: I41951660a464601063e5cedd417db2cb7cd37e44 Reviewed-by: Jarek Kobus Reviewed-by: Alessandro Portale --- src/libs/utils/process.cpp | 2 +- src/plugins/debugger/dap/pydapengine.cpp | 2 +- src/plugins/qmlpreview/qmlpreviewplugin.cpp | 4 ++-- src/plugins/screenrecorder/cropandtrim.cpp | 4 ++-- src/plugins/screenrecorder/export.cpp | 2 +- src/plugins/screenrecorder/ffmpegutils.cpp | 2 +- src/plugins/screenrecorder/record.cpp | 6 +++--- src/plugins/screenrecorder/screenrecordersettings.cpp | 6 +++--- src/plugins/terminal/terminalsettings.cpp | 2 +- src/plugins/texteditor/jsoneditor.cpp | 2 +- src/plugins/texteditor/markdowneditor.cpp | 2 +- src/plugins/texteditor/texteditor.cpp | 2 +- src/plugins/valgrind/xmlprotocol/parser.cpp | 8 ++++---- 13 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/libs/utils/process.cpp b/src/libs/utils/process.cpp index b10ea090dfc..534dcff78f1 100644 --- a/src/libs/utils/process.cpp +++ b/src/libs/utils/process.cpp @@ -1257,7 +1257,7 @@ void Process::start() d->m_result = ProcessResult::StartFailed; d->m_resultData.m_exitCode = 255; d->m_resultData.m_exitStatus = QProcess::CrashExit; - d->m_resultData.m_errorString = Tr::tr("Failed to create process interface for \"%1\"") + d->m_resultData.m_errorString = Tr::tr("Failed to create process interface for \"%1\".") .arg(d->m_setup.m_commandLine.toUserOutput()); d->m_resultData.m_error = QProcess::FailedToStart; d->emitGuardedSignal(&Process::done); diff --git a/src/plugins/debugger/dap/pydapengine.cpp b/src/plugins/debugger/dap/pydapengine.cpp index 2257aab76ad..4bbb479126f 100644 --- a/src/plugins/debugger/dap/pydapengine.cpp +++ b/src/plugins/debugger/dap/pydapengine.cpp @@ -253,7 +253,7 @@ void PyDapEngine::setupEngine() Utils::InfoBarEntry info(installDebugPyInfoBarId, Tr::tr( - "Python Debugging Support is not available. Please install debugpy package."), + "Python debugging support is not available. Install the debugpy package."), Utils::InfoBarEntry::GlobalSuppression::Enabled); info.addCustomButton(Tr::tr("Install debugpy"), [this] { Core::ICore::infoBar()->removeInfo(installDebugPyInfoBarId); diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.cpp b/src/plugins/qmlpreview/qmlpreviewplugin.cpp index 464c9b88f05..011b6f43d2f 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.cpp +++ b/src/plugins/qmlpreview/qmlpreviewplugin.cpp @@ -333,8 +333,8 @@ void QmlPreviewPlugin::previewCurrentFile() return; if (runningPreviews().isEmpty()) - QMessageBox::warning(Core::ICore::dialogParent(), Tr::tr("QML Preview not running"), - Tr::tr("Please start the QML Preview for the project before selecting " + QMessageBox::warning(Core::ICore::dialogParent(), Tr::tr("QML Preview Not Running"), + Tr::tr("Start the QML Preview for the project before selecting " "a specific file for preview.")); const QString file = currentNode->filePath().toString(); diff --git a/src/plugins/screenrecorder/cropandtrim.cpp b/src/plugins/screenrecorder/cropandtrim.cpp index c52cc011610..819f0e285b6 100644 --- a/src/plugins/screenrecorder/cropandtrim.cpp +++ b/src/plugins/screenrecorder/cropandtrim.cpp @@ -299,11 +299,11 @@ CropWidget::CropWidget(QWidget *parent) m_warningIcon = new CropSizeWarningIcon(CropSizeWarningIcon::StandardVariant); auto saveImageButton = new QToolButton; - saveImageButton->setToolTip(Tr::tr("Save current, cropped frame as image file...")); + saveImageButton->setToolTip(Tr::tr("Save current, cropped frame as image file.")); saveImageButton->setIcon(Icons::SAVEFILE.icon()); auto copyImageToClipboardAction = new QAction(Tr::tr("Copy current, cropped frame as image " - "into the Clipboard"), this); + "to the clipboard."), this); copyImageToClipboardAction->setIcon(Icons::SNAPSHOT.icon()); copyImageToClipboardAction->setShortcut(QKeySequence::Copy); diff --git a/src/plugins/screenrecorder/export.cpp b/src/plugins/screenrecorder/export.cpp index 76696250943..0c9b67d2a34 100644 --- a/src/plugins/screenrecorder/export.cpp +++ b/src/plugins/screenrecorder/export.cpp @@ -155,7 +155,7 @@ ExportWidget::ExportWidget(QWidget *parent) [&lastFormat] (const Format &f) { return f.displayName == lastFormat(); }).fileDialogFilter(); - FilePath file = FileUtils::getSaveFilePath(nullptr, Tr::tr("Save as"), lastDir(), + FilePath file = FileUtils::getSaveFilePath(nullptr, Tr::tr("Save As"), lastDir(), fileDialogFilters(), &selectedFilter); if (!file.isEmpty()) { m_currentFormat = findOr(formats(), defaultFormat, diff --git a/src/plugins/screenrecorder/ffmpegutils.cpp b/src/plugins/screenrecorder/ffmpegutils.cpp index 08a018e0a6e..96223c3781e 100644 --- a/src/plugins/screenrecorder/ffmpegutils.cpp +++ b/src/plugins/screenrecorder/ffmpegutils.cpp @@ -98,7 +98,7 @@ CropSizeWarningIcon::CropSizeWarningIcon(IconVariant backgroundType, QWidget *pa { setMinimumSize(warningIconSize); setToolTip(Tr::tr("Width and height are not both divisible by 2. " - "The Video export for some of the lossy formats will not work.")); + "The video export for some of the lossy formats will not work.")); m_updateTimer = new QTimer(this); m_updateTimer->setInterval(350); m_updateTimer->setSingleShot(true); diff --git a/src/plugins/screenrecorder/record.cpp b/src/plugins/screenrecorder/record.cpp index 60635219bba..40efe047911 100644 --- a/src/plugins/screenrecorder/record.cpp +++ b/src/plugins/screenrecorder/record.cpp @@ -108,7 +108,7 @@ RecordOptionsDialog::RecordOptionsDialog(QWidget *parent) Column { Row { m_screenId, st }, Group { - title(Tr::tr("Recorded screen area")), + title(Tr::tr("Recorded screen area:")), Column { m_cropScene, Row { st, m_cropRectLabel, m_resetButton }, @@ -210,7 +210,7 @@ RecordWidget::RecordWidget(const FilePath &recordFile, QWidget *parent) progressLabel->setEnabled(false); progressLabel->setAlignment(Qt::AlignVCenter | Qt::AlignRight); - m_openClipAction = new QAction(Tr::tr("Open Mov/qtrle rgb24 file"), this); + m_openClipAction = new QAction(Tr::tr("Open Mov/qtrle rgb24 File"), this); addAction(m_openClipAction); setContextMenuPolicy(Qt::ActionsContextMenu); @@ -289,7 +289,7 @@ RecordWidget::RecordWidget(const FilePath &recordFile, QWidget *parent) } else if (!clip.isLossless()) { QMessageBox::critical(Core::ICore::dialogParent(), Tr::tr("Clip Not Supported"), - Tr::tr("Please chose a clip with the \"qtrle\" codec and " + Tr::tr("Choose a clip with the \"qtrle\" codec and " "pixel format \"rgb24\".")); } else { m_clipInfo.duration = 0; diff --git a/src/plugins/screenrecorder/screenrecordersettings.cpp b/src/plugins/screenrecorder/screenrecordersettings.cpp index f5ac792a949..2d492af2509 100644 --- a/src/plugins/screenrecorder/screenrecordersettings.cpp +++ b/src/plugins/screenrecorder/screenrecordersettings.cpp @@ -173,7 +173,7 @@ ScreenRecorderSettings::ScreenRecorderSettings() using namespace Layouting; return Column { Group { - title(Tr::tr("FFmpeg installation")), + title(Tr::tr("FFmpeg Installation")), Form { ffmpegTool, br, ffprobeTool, br, @@ -181,7 +181,7 @@ ScreenRecorderSettings::ScreenRecorderSettings() }, }, Group { - title(Tr::tr("Record settings")), + title(Tr::tr("Record Settings")), Column { captureCursor, captureMouseClicks, @@ -191,7 +191,7 @@ ScreenRecorderSettings::ScreenRecorderSettings() }, }, Group { - title(Tr::tr("Export settings")), + title(Tr::tr("Export Settings")), Column { animatedImagesAsEndlessLoop, }, diff --git a/src/plugins/terminal/terminalsettings.cpp b/src/plugins/terminal/terminalsettings.cpp index 57093d20a6e..b6bfe3c37c7 100644 --- a/src/plugins/terminal/terminalsettings.cpp +++ b/src/plugins/terminal/terminalsettings.cpp @@ -489,7 +489,7 @@ TerminalSettings::TerminalSettings() lockKeyboard.setSettingsKey("LockKeyboard"); lockKeyboard.setLabelText(Tr::tr("Block shortcuts in terminal")); lockKeyboard.setToolTip( - Tr::tr("Keeps Qt Creator short cuts from interfering with the terminal.")); + Tr::tr("Keeps Qt Creator shortcuts from interfering with the terminal.")); lockKeyboard.setDefaultValue(true); audibleBell.setSettingsKey("AudibleBell"); diff --git a/src/plugins/texteditor/jsoneditor.cpp b/src/plugins/texteditor/jsoneditor.cpp index d49f5efacea..348df6f4d1f 100644 --- a/src/plugins/texteditor/jsoneditor.cpp +++ b/src/plugins/texteditor/jsoneditor.cpp @@ -151,7 +151,7 @@ public: JsonEditorFactory::JsonEditorFactory() { setId(JSON_EDITOR_ID); - setDisplayName(Tr::tr("Json Editor")); + setDisplayName(Tr::tr("JSON Editor")); addMimeType(JSON_MIME_TYPE); setEditorCreator([] { return new BaseTextEditor; }); diff --git a/src/plugins/texteditor/markdowneditor.cpp b/src/plugins/texteditor/markdowneditor.cpp index 0ad3f0ac2f3..935d215f321 100644 --- a/src/plugins/texteditor/markdowneditor.cpp +++ b/src/plugins/texteditor/markdowneditor.cpp @@ -487,7 +487,7 @@ MarkdownEditorFactory::MarkdownEditorFactory() editor->triggerInlineCode(); }); cmd = ActionManager::registerAction(&m_linkAction, LINK_ACTION, textContext); - cmd->setDescription(Tr::tr("Hyper Link")); + cmd->setDescription(Tr::tr("Hyperlink")); QObject::connect(&m_linkAction, &QAction::triggered, EditorManager::instance(), [] { auto editor = qobject_cast(EditorManager::currentEditor()); if (editor) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 4a87ecc62af..4905d745f9a 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -9072,7 +9072,7 @@ expected_str TextEditorWidget::configureGenericHighlighter(const QString & { Highlighter::Definition definition = TextEditor::Highlighter::definitionForName(definitionName); if (!definition.isValid()) - return make_unexpected(Tr::tr("Could not find definition")); + return make_unexpected(Tr::tr("Could not find definition.")); d->configureGenericHighlighter(definition); d->removeSyntaxInfoBar(); diff --git a/src/plugins/valgrind/xmlprotocol/parser.cpp b/src/plugins/valgrind/xmlprotocol/parser.cpp index 33d78b3ef49..df464e33247 100644 --- a/src/plugins/valgrind/xmlprotocol/parser.cpp +++ b/src/plugins/valgrind/xmlprotocol/parser.cpp @@ -126,11 +126,11 @@ private: QMutexLocker locker(&m_mutex); while (true) { if (m_state == State::Canceled) - return make_unexpected(Tr::tr("Parsing canceled")); + return make_unexpected(Tr::tr("Parsing canceled.")); if (!m_inputBuffer.isEmpty()) return std::exchange(m_inputBuffer, {}); if (m_state == State::Finalized) - return make_unexpected(Tr::tr("Premature end of XML document")); + return make_unexpected(Tr::tr("Premature end of XML document.")); m_waitCondition.wait(&m_mutex); } QTC_CHECK(false); @@ -198,7 +198,7 @@ static qint64 parseInt64(const QString &str, const QString &context) bool ok; const quint64 v = str.toLongLong(&ok); if (!ok) - throw ParserException{Tr::tr("Could not parse hex number from \"%1\" (%2)").arg(str, context)}; + throw ParserException{Tr::tr("Could not parse hex number from \"%1\" (%2).").arg(str, context)}; return v; } @@ -238,7 +238,7 @@ QString ParserThread::blockingReadElementText() //affects at least Qt <= 4.7.1. Reported as QTBUG-14661. if (!m_reader.isStartElement()) - throw ParserException{Tr::tr("Trying to read element text although current position is not start of element")}; + throw ParserException{Tr::tr("Trying to read element text although current position is not start of element.")}; QString result; From 423315178ae35e95cc6111451ff7a8f554466855 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 20 Oct 2023 18:11:33 +0200 Subject: [PATCH 73/86] CMakePM: Fix display of header / source files Qt Creator will display the header / source files based on the sourceDirectory of the target as base directory. The source_group(TREE ) will result CMake in making a source group named "TREE" which should not be displayed in the project view. Amends 9280f7f757b8ceb50000a1baeac702f23b66e7d5 Fixes: QTCREATORBUG-23942 Fixes: QTCREATORBUG-29105 Change-Id: Ib71ffcc559376ea1596a5b21cb7e7fa779bd8d79 Reviewed-by: Alessandro Portale --- .../fileapidataextractor.cpp | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index aa53ff0437f..e097ef2c76d 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -644,29 +644,18 @@ static void addCompileGroups(ProjectNode *targetRoot, } } - // Calculate base directory for source groups: for (size_t i = 0; i < sourceGroupFileNodes.size(); ++i) { std::vector> ¤t = sourceGroupFileNodes[i]; - FilePath baseDirectory; - // All the sourceGroupFileNodes are below sourceDirectory, so this is safe: - for (const std::unique_ptr &fn : current) { - if (baseDirectory.isEmpty()) { - baseDirectory = fn->filePath().parentDir(); - } else { - baseDirectory = FileUtils::commonPath(baseDirectory, fn->filePath()); - } - } - - FolderNode *insertNode = createSourceGroupNode(td.sourceGroups[i], - baseDirectory, - targetRoot); - + FolderNode *insertNode = td.sourceGroups[i] == "TREE" + ? targetRoot + : createSourceGroupNode(td.sourceGroups[i], + sourceDirectory, + targetRoot); if (showSourceFolders) { - insertNode->addNestedNodes(std::move(current), baseDirectory); + insertNode->addNestedNodes(std::move(current), sourceDirectory); } else { - for (auto &fileNodes : current) { + for (auto &fileNodes : current) insertNode->addNode(std::move(fileNodes)); - } } } From e454dc0f1f80590db54ab4a5b1d083db2fff6b7d Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 20 Oct 2023 17:12:58 +0200 Subject: [PATCH 74/86] Doc: Describe setting default C++ file name extensions for a project Task-number: QTCREATORBUG-29392 Change-Id: I2bba1d26dc6177a1f6b3f78483e669244fa15ff1 Reviewed-by: Reviewed-by: Christian Kandeler --- dist/changelog/changes-12.0.0.md | 2 ++ ...tor-projects-settings-cpp-file-naming.webp | Bin 0 -> 4726 bytes .../creator-only/creator-files-creating.qdoc | 27 ++++++++++++++---- .../creator-projects-settings-overview.qdoc | 1 + 4 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-projects-settings-cpp-file-naming.webp diff --git a/dist/changelog/changes-12.0.0.md b/dist/changelog/changes-12.0.0.md index b26621ddf2e..8ab1abf9cc2 100644 --- a/dist/changelog/changes-12.0.0.md +++ b/dist/changelog/changes-12.0.0.md @@ -172,7 +172,9 @@ Projects * Project specific settings * Added C++ file naming settings ([QTCREATORBUG-22033](https://bugreports.qt.io/browse/QTCREATORBUG-22033)) + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-how-to-set-cpp-file-naming.html)) * Added documentation comment settings + ([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-how-to-document-code.html)) * Added an option for the Doxygen command prefix ([QTCREATORBUG-8096](https://bugreports.qt.io/browse/QTCREATORBUG-8096)) * Improved performance of filtering the target setup page diff --git a/doc/qtcreator/images/qtcreator-projects-settings-cpp-file-naming.webp b/doc/qtcreator/images/qtcreator-projects-settings-cpp-file-naming.webp new file mode 100644 index 0000000000000000000000000000000000000000..9e222cc6e91a8a2c3b171b90f0d8ba9f4be08aba GIT binary patch literal 4726 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc index 63d14734597..f1f6441ee24 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc @@ -103,19 +103,34 @@ You can also create your own project and class wizards. - \section1 Set file naming preferences + \sa {Create files}, {Set C++ file naming preferences}, {Use project wizards}, + {Custom Wizards} +*/ - The names of the header and source file are based on the class name. To - change the default suffix of a file, select \preferences > \uicontrol {C++} > - \uicontrol {File Naming}. +/*! + \page creator-how-to-set-cpp-file-naming.html + \previouspage creator-how-tos.html - \image qtcreator-options-cpp-files.png "C++ File Naming preferences" + \ingroup creator-how-to-projects + + \title Set C++ file naming preferences + + When you use the new file wizard to create a C++ header and source file for a + new class in a C++ project, the names of the header and source file are based + on the class name. To change the default suffix of a file for a project, + select \uicontrol Projects > \uicontrol {Project Settings} > + \uicontrol {C++ File Naming}. + + \image qtcreator-projects-settings-cpp-file-naming.webp {C++ File Naming settings for a project} In the \uicontrol {License template} field, enter \l{Using Variables in Wizards}{predefined wizard variables} to specify the path and filename of the license to use in the source and header files. - \sa {Create files}, {Use project wizards}, {Custom Wizards} + To globally change the preferences, select \preferences > \uicontrol {C++} > + \uicontrol {File Naming}. + + \sa {Create C++ classes}, {Use project wizards} */ /*! 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 e71e2d26844..ba199b27297 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 @@ -40,6 +40,7 @@ \li \l{Parsing C++ Files with the Clang Code Model}{Clangd} \li \l{Using Clang Tools}{Clang Tools} \li \l{Specify code style}{C++ Code Style} + \li \l{Set C++ file naming preferences}{C++ File Naming} \li \l{Using Custom Output Parsers}{Custom Output Parsers} \li \l{Specify dependencies}{Dependencies} \li \l{Document code}{Documentation Comments} From 76bcd85f215f8256230132df816c6d9eb89ec77d Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Fri, 20 Oct 2023 11:44:27 +0200 Subject: [PATCH 75/86] WebAssembly: Avoid soft assert on toolchain auto detection Windows only: When toolchains get restored on startup, WebAssemblyToolChain would try to add MinGW to an environment. That env is used for querying the compiler version. In order to find MinGW, the MinGW toolchain is queried from ToolChainManager. But since the ToolChainManager is not yet loaded at this moment, we get a QTC_CHEK assert from ToolChainManager::toolChain. This change prevents querying the ToolChainManager before it is loaded. The compiler version can successfully be determined without MinGW in path. Whether we really need to query compiler versions that early is another question outside the scope of this change. Change-Id: I46edbb80edc58d7465e90e99f7f8381708f704a1 Reviewed-by: David Schulz Reviewed-by: --- src/plugins/webassembly/webassemblytoolchain.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/webassembly/webassemblytoolchain.cpp b/src/plugins/webassembly/webassemblytoolchain.cpp index 3174e0e9548..925b7f5dbfb 100644 --- a/src/plugins/webassembly/webassemblytoolchain.cpp +++ b/src/plugins/webassembly/webassemblytoolchain.cpp @@ -42,6 +42,12 @@ static const Abi &toolChainAbi() static void addRegisteredMinGWToEnvironment(Environment &env) { + if (!ToolChainManager::isLoaded()) { + // Avoid querying the ToolChainManager before it is loaded, which is the case during + // toolchain restoration. The compiler version can be determined without MinGW in path. + return; + } + const ToolChain *toolChain = ToolChainManager::toolChain([](const ToolChain *t){ return t->typeId() == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID; }); @@ -54,7 +60,7 @@ void WebAssemblyToolChain::addToEnvironment(Environment &env) const const FilePath emSdk = settings().emSdk(); WebAssemblyEmSdk::addToEnvironment(emSdk, env); if (env.osType() == OsTypeWindows) - addRegisteredMinGWToEnvironment(env); + addRegisteredMinGWToEnvironment(env); // qmake based builds require [mingw32-]make.exe } WebAssemblyToolChain::WebAssemblyToolChain() : From 86e8676bec36b3dfbb5faf529545753d4988c6c3 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 19 Oct 2023 16:36:34 +0200 Subject: [PATCH 76/86] Doc: Describe setting DPI rounding policy Task-number: QTCREATORBUG-29392 Change-Id: I45eef9d1282f7df3f75f08ff55745c4205f553d9 Reviewed-by: Alessandro Portale --- ...tor-preferences-environment-interface.webp | Bin 5980 -> 6132 bytes .../creator-how-to-set-high-dpi-scaling.qdoc | 17 ++++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/doc/qtcreator/images/qtcreator-preferences-environment-interface.webp b/doc/qtcreator/images/qtcreator-preferences-environment-interface.webp index d6d5098bc638ef8f44b946e11d90d59e793815b2..a03cb3d5794eca8053ef82558153a047bba53ce0 100644 GIT binary patch literal 6132 zcmWIYbaQ(n&cG1v>J$(bVBzyXoPk0Af1@wM*9X=A|4)?iJfB*w|9npIzD}0oy^}X= z)L+gy&6+|w`5zhcu-v`B>o&4(QTG(ezRlV4;=95^R!_da=1rWuD|RzqGw?6U zy;<|MOGc z9o6#W8()9jD1UIhGvBFu^~Tv7MGvn}PLBWm>FcN0AG8hj%=*(dJFa4ztF2B!o+4`dt&w9C8|DyIAM!?3)8i_VwhdPcN;1FhBN2liHO|ev!*g<=W9Pu~wUR zAKI9c8D(}lZ|&WEp409wx@>%7_U-F0xe7~Tjd}aCE$)83V-jA)>wbQf`}3*GdPLa5 zCinB*Y3;aUm*12B)cyMQ6;=lMd&~ZQF=e&*P`azCEBW0nGf&YCiK}J`h|N=Fxf@_} z+3Uudbu6cR&%d<0o))!p@BNtDj>ZArXCLHDoc7M!QdKwM+&2e78`*}i!fhw!xGZ%3 zCZN_*a$je?Tv%zVOyABs`j0L$(Qx~_`7YCtVJZbTjSy9gxPu|Ss<$C3EedxVEKP12UEq+&DoVl}} z^X`iDs{7|v1($ft-?%X9RqacOu=EF}e+UU_w?1-iJmH`evA}Ro znGsL;UGwA>!9N}qT++|Yy8qz$=YV`YrSOZAE9N=Gtex6^cXoPIzyzhYyAMY3F5kYs zSj(5aEqvJnuZG{@d}pe2R#@#;+FJ7T(z5mM#o8{5yli0i1E1fl{eEw|=Qci8|CQGg*+mu@uX604s=2@ZAiGVYZOngeh0p_S8_m+* zekfuqXs!yc&%HDyN+BsVi}B8aaPGYpQ%Y`F9o5TVTr}-&msomb>Gt*FdwyRvertDj z@5h$quAGiqQ5t?5Ikqsk`k3Bm51l6yrtf;b_-xp`HG%buQ@Os|K6`)n(YLxg@jes% zG~`yuNQB)#zl8bl%Px*Tx8f>Ou7$HlTo`)1!pb{TcOEnKpN+$dAOg!$^tk_4{(Q7?`zTzWmiNxSwyx%sO9ntue3F#KxE)Y3R` ziE(bgpBpy=|GZtW+I{ZjOPA-D{ zi~HJi+u0mJtQkKJ?D?pbwPvo*&m8tuZQcx_Jcn6>vfHN}QQzt~@s-Xik^L5PN@f}f z_DV^ZJxbo(_|W3VokE7Xhurl$nXbLvec42Og^iIkQ`Mv7hEvL$3w?4gTn+YdcJQxh zd6fM&>BF(Gf4hVIKIZ+2h1OX6M8)iNmpFL)x^!%kNf{~Lz9W&otWH>2j5># zymK~#tMugw#pSbnR<}(zeWxZnF*5DD$mcLG;ZnCH6SvNND0d`uO|STF4d?8JkB<~X zCpu4joH}tGhts6h^6$)*mafs>J!#U!q__QjGNmeuqNMbvZ{i7Bmo960<>s{IDhH)Y z)=lHs_|08WH}#dQ%aV6I62Mi6#qG z6h)l3zw?Tj3%dciR$N!tGP@5mUN&g;`eLufs zX#AWlhGid&R;}ro-!7XG(tAU~zWw&a6;fLazdbTDS*3T}U=L^KFLt&?^K(tgm6d)U zS9c8bkd6#{v7sm7+k-7-xl4CezyEvZ^6%9T%AQ1NDJwO_|4aSHwoY zco$cFEbM#stBdPT?r1BUARaWa&1i-&*Dj59i<}Q{%rH{skxv%cdMW(&@prG+yo=ao z_WPFqZiRK5uI4Va3U#rnW#U|W@3-qN+uAe1BF`<32z=D{7QM51%3T?4jp>{EWCVMy z4qmt{`>`@@8NYWx|7XWN_XFx3mKw&L3FcCIci^~$tL~RjQ&ZMiGao(VZcl#nQS%S) z)gq;P@B6a8B!?XQz|y{1zAxrZ>8|RoLitQ6}s8%*xCwasnDnVM~dE5nXKxIl(^q;`=e}ytW=2py7-Oy z`?&YNO|`zGlE;>u_3;1x&^cQ+{D1#v_k&YQ97~@r`TN_?&d2OmU*cw-BW2C|l5ZF= zZ@jwTy@c5rhaA%k>o#9wfoMVNikUHGM^5mW>~vexaj)y(QjwTi5ZyqA515QCShM(~jJ0h4Wj#+n?{+H5+jMHWDZ<%et=~z2J4Fbx9>sFeYzLRe0lbPWGt%s5 z{xR9owCH$g_~)2K2ei7bZV8&J^}JES-_<-n{HOiux5?|jpa1f6b@?Ot1M#PVUVglu z!K`T`d}6ZK%oVefR$Sz|a>!`0Xv%|`OcCX6T^_P4+74{qv#6xu-;~nTayzH^o6gL* z(U8U2F(Jr}!*Ft)pryY}NM)1fgc<+(zpY)rjejc7eful^(~6x{4!HC_S6?x0#YHZr znDRfeZp{@db}c;F@vkfQp^tJF|A)T?7Z`XIkIBwaDBH1d&n~9zmJYcUj!Rl!i7c7% zG}QfRfzQYI_Y>F?I}HS0-+QpMh1Z z%~g%fY#AJeeU`smT`u#4Ea}^~MZcnHfy9;H$9xv#p7-5U_G*9LHCj4E=XNttI)!6RR}y7uIdO#sbm2b~1<4Bslw3Cw!d|Y{Ab^u0waXEz=+TmL)BDN|!|K z)1+pmZ_eBlct&{L6N8%NZeLn=GX`MK3N=a$o=<%uRHvo zvX$@BGK{#LHiu*3qPCZB5)&35T6JK%>Xj*4s%G z_Lm}K?QWGH3*EO!#pjH&{in?3r`#8M#vV?aqq1;OTHqrcyA>u9?Q6}K+A#1ee>+D) zDdwc&&%T5Eo_&uG%kJC=o+dZwBu95tuGc^h0B(5MfLwxXN&il!v3z))T(;N5|IGD=r4;|&d%mr zeQf8X!wH4)WgqMAY+wKM@?ZWH@rz!v&%Ai#+w;l#DOU`pTG+(ZxGiBkyG26aA@|*F zQ>(<5X;&8cnZK*p~hL@=& zYYLOj$o9S2Rq^Swr(wCprtD8Um$uBXmU;N~=t(d=RY3A)qhOr!$qDlhf8|(z5F%P? z*(Ra?ta#4f-JLd@a#!$5JLEKO5O!w%y|McFwS~{^p4l9;+jBfH;A#uIyq_e`@_#!)uo9^6}0$?Y@tJ%u3$pXR)?px zTAM7kT>55t{4%d1!}E{Rq;D>iS|`R-*}qWiiHTWrC-iI|MiH^%G7*)j_PCArd21JE+skf z8QL0_gnwmyqgwaFY5DS9d`0KZPE(s981>lc#6-cPN+k*(PaWYWmNEt(B>X@sTswCv6a0amSipTzoQrs-ULf z%AJv+DGYYO;SE7$3&nzqI@F)v*!Fs6kB|e09|(3lz62@9FbZJ9_8giFM-F*Q*@6 zlX&^`i-^ZdW?0MIEPa}ypS3SJd2z4qsq&n>EgNlr_MPoD+g5PjP&zmJ;l5-s?(eew zDgkVZ?`GvZ-1qqO#+GAu&K&vE^EmI=to(+*2W++FCs_P1cF&&C{eI`?|1-`q|K6gg z?$)Js$Fq{}bJpfI$BC&6yJp{Mo+a$&uWfqn{+(N2)Fz~v^UwKg_9RPY(YBeLHtIVa zttSb)ZGM*YJio4SmV;DuZ}WD=+3BWzt~T9*hb^QoMoLLuIvhF4w51~IjJ5 z8!2Wb?I)(2;Ad!CZe*Ega!NMs&(bH)8YLsw+^;YUf0blow`O8ygHy-OgL5A;a@GbY zZSFqFJSF&z>;{c~gHy8C7$UnT>SX9X`*Vy_@X=>B*#I#^>m9|R2l5}bG)T`7Ka(Q9 z_(sA5Ew!18Z>gp}I;S0^ZqEN^^-rDfEIr2BcOE|3@3fcCm~Cwpm2JitXleRn`k|eQ zdGDTNtSx%vaJir7XJPUfo+nPEkhRf zg*ES)bH7nHeW{3b4fns5Kg2&y?$GdAliJGXeOPfS%SA^9-PZEB`O;1krhlI8x_>IK z`pM(GyA%H9F|Z#wCii%PxR<26p}a!mRypN2EzjNE{r_$KVg0eTLsEab$(+@qFIqKA zwmRs$@8omJpS@_&%ITTCUuw>rVDDbnZ+@L?SJS=H1)P?vZY`ST`byf^q1NqJ=EfqG znfs;g_n(^*^4-CGTIQP&@s;jwoOiAr`)DKl;I_zOogk*{Hqk|;4RXB8QVrgw<`i(B zDeqEud*ASL{^SRVKUDJ`oV~B~JZtN`P+5(}{i`yxw;OyB^V{pQD`w`;858-rdQYC& z)>J-kx8dQpc2j<6`~J+_%(K#YQt7&5+h-Rp+|_p9!lZ1~>60qAK20%V+~;AI`uNc6 zf>kH4WJIp)M6z9dc|$+&cR}*%ecRW0XJ`rs@iX_$wLd^7+LT@Yhc=6CzY=CtNcPv1Y0Gw1)Wt7uxJyxOYME933NV$*8J zyVqG&zw8RTa$V%m(Nnu(I&Z|(G#pDwi*~GUz8EfYDv;aMsDNGAD*Umu+>d*^^s;!j zvfi_N!4Utds7|@{Nu%58jYZqTYya!qlUORDzxe&$8HzKme}2)-u;+J-h+6c@&3fTQ zc4<#MkIJVOtYt_PUFmGCW3*XIQQ_k>#`SK^#>WOHObgoS zgI21y{C~H{aPx%i|Np;VaJ_z#+WqFmZOcld_+q$LtjwHS=FGRG!Ow1ciun^Kt{39! zx?Iket#Z2rgD+d@w#Rrd%5IS;FD(F0%Xn{@eBBtPS7IzQ5Ct zmajHw&@R36;@iq?oWG-!{rvx5%hPsTRvIPpR^q@^t9!+>7XNHLFL(28$IZLX(zgf9 z^_>tof3n!o<;**RjxV44XyN6n-val2IrVFLoT5I5$O(q4p3JSAe%s{+vlK4v+r4^j ze0g5olHK>-CRcZ@;AUzya`g`gU5SHYfULlKKUy$nIS6=GX>=CQFeU-&d>EBJa^VbNb-r1M@ zn9I&4RX<_Ou;>&@KdRiJd@?=h*Mw71q~>ly-AF*0mr;qi-o`faY%gSzC!%k_?3Wt3lf zYWX^&#FbX;!r3AbTFNh4CzU%qPTs%KQxu2Q&=mUjO4?|uE|1ulI_7e1!^t^PRs==S6dA9Gj8 zZk-|h`gwssbN{Jd=Cw85f71R$@#xLE|7+u)v!7;v$PUo|b7p~9z(2d^sX10pSMT2W zDdl2I#V6Ju^ZJc{sIiH!eLqdU?z{VI-j(8YX&=r?AXIL(=yLn;P<+8xBfHjvu4}*c zR-FuCpLNju<z$t@;Z8NxST2Hh=cch!7X<%e0xwc04#H z$2PrK-9PYI*u0YyRfIH!mdr9SO5lEe$K{?x?o;E}w>xK?i`I>uyJuFz%Xsn2!LjMt zB1^bt7)~lxC(~ zu>pJN25W}3j}~anbZvBgCZN(%Qv0ocou=`_bw_W-m#h;pY*@T}Be$^6!PY5LX4GxE zZ?WCHVQHRIm$X9l+!+PIasd;qgkR69J{H{XIf>=eA)h`KotcXM&vn}>)hq=9w4CN2 zJ^t?V`ga}4y*vJW-uw5cZDC{C@2Tf)pHEOKy%zq%_Jc@jWvI`=WqFKV>7MgCtY=G=O@l36oPROZ6$M{)L=pMK|A zU3Gb4KX-e8-|{%?O0D(HnWFQo&NQ&4wF!yXxJH)cg|=^wydmX!X=e1CvrGyh9+tDU zdhU8MUb@&Kk)j~TbHPf^dOMeU?CjDhntO^iMsJoywYYf0a{UQW>`*w@*Kxwx5s5wqwDScePGjS@>Y4j8f?gM%EKOUK1{7zWUdp zU)WgO^Phc!R>Gl(*(q;66#Ob^EE2aj_jKYFFf@{t*SoN{^_`5DmCxK17Pf|t+H1uJ zZrV$Itv#_`yjse3>fOru*@8|Jx)>*2f5W8fFj0l;<=LWdo3!3_?<~)G^4RtqcE1>GrsWa+!<$nq`4A3oad-@I@t(Kcorky5TLksh1W5@XXh?oY?o_lk;=;Qs9{L2N_RFpW>7jQ@r}FEua|4m_y2y7 zapb(-ez`Z9AEQ{VH?_QpTlMVb8~MID$KJ_(yzKu?s}SU}zNglY{N=@#eU5v3;F@XQvQd+kW@yBvoNT&y9-`0h#XV`{r) zzr$&PNLtrKFaIw$bwi8$%iaBw#h=S1?<xpYL-&F57vF&a7STFhR@V(B;aHi);hb}j`%(3R%;JyB44T3}{NJ`l&**l4 z<^M`~=U*?@d@GRoP^xt$^6b8VsV85(i<_T${Y2{3NJGhqsnh(oCN2Lmaj(}o(VHJ$ zzIia?S?1m-rL}XIUR_;%>RfE^3iCPIM^#h||0e7&)H~~SwPi|=NOq%7*n1_xw_EOc zZ05Q2B5m^3qa~{YCOu%CwMJ9%8dIdlB_A2*Ij^s+7Uj4n-#$r2z`DR^_of5qY|d_o z=wAF>RK}orU0FHn9M7(RNfWy6@iGYHR<5^y^8MEt9d`CU=Z*5E3sfFCzPNXa$yz$! zBqUL>7t0<=K5<&KZQ|1h-Ya+&uWf!SdnCst{?V>{<~>Y5?egceCvJEd5%ySN z^Gk~v-{+T`er#9z;P6MG&f1K(>lXiquA4mF4a^sR96bLx-o5$J5B3l22M_)DcD~!9 zZ8n>0ar*f~KbZb#?dx$ns_v`(ST)YAb?(R2AB3btv%`+9f6$!~q7yB-zej&TV4>96 z6K_4QNDH*s>Id9BW?5cY_ehl6b7Cs@WU+;(E#^5swQx@T{pZv9%e(GO&73<^>s4TX z8H@7I{2$AV7oL{jTUf+%@y5N!pF3WQeqG^id`OY^*@3huj{lYm7q}$Nn*3_sSv%t` z7c!1zOeixkJO3!e{CrZu4vR9a-4@FvO4v{C`P-!#?{H{=`85mk*9$LB4LtJLFuY^? z{HTOq2*nZL}_u+P(QctC5hJo@)VTK);{t zwT}Ifw;N|)m2Ul^zRyupK>FdC=EXAKV-Bi6Y(9GS2h-QP@78wM8ourNA+$u{&4q#+ zP0Y_8?iKxTP4h|g`i}CbiyB9=Q`bAhwLHJL;>HFey$8h^Atv``K9#ZSc5^*?>_=FQ zVEoba3kxjX*lse|C%^yqV^<69bB%@@|9;qggnvQrU&~+L4=-Nk_%Y*cE`#%_-&u-zfS~NPqF+B85Lk+>Xx@-FU~?YT8@2 zL;g7>bB-AnsXxm4v!3s`rt*f;AN|jkAN=<7=}-To0X15In`$4~8?E0e_Rrez^_qf3 zGs?FvTH^NV70+GnfXO@NNVsPRs`VTSV7PZVciYUbs#}GA%e-B7CVQ>z?Hbv#CB2Im z?Yh_--lMpML)a}*qv6KoA1mJ+yAYD5dadvJNBtxAjU6STKf6=oUVmZ;Dd=NT)7{+M zta@hVGfjcOn78jZ6w`hN&60PTud(ZHPWbaQ+lGFT)siaJbC=aH8pa&e$zLY%rOd?4 zzu$DN`M0CvUMUMoG%KG-t4mdY4C=zC)B2rHR!ItOyIvq6-`Z))>5CtoXFq{c;Uj|&;^!|v^)kENlH<89<*@IGvL{|<9GY^c@pAg!C`Fso|7Hgr_e(WryXz`Y-d`D*_|A5&)XN*C z>&r{u?b6qH_)W<`jk|qSaqzkoW^3}C`Z@zryI$@(dLXGav~jsw2>+MZkc%Q!)0z(k z^Y8^WCdLKLx_g%Q#Jr=ILd?sn1=5u9bevs5!FoJB)@PWaKH(<@zfaED%)@y2=U!^bmr9z18W z^tIS>C&ttRuJW2&%BphSD}2`Zeg56jtiJj?yG)v@CmglEsMFMR`N*Z$$%ZL2lU79) z?)|m0nDxu8BnQTXjALhax5QlkI#>6q)5)(|GdC=0u3DRQIQrvX(GztaRmZY@5X|F*4Q;2Y(lwrWNLz|v`T6gYlW#X!yEfpJimEO8a&6s>MHhtNh**e7v z*%p%zE8HsNuhhS^`LEpk=Zm-Rs@m4p##QT{Z87<8zv8Ct=P!I&yuj%&i)^C6x5ukb z?Ff2*b;7ET)2y!_jcQt(sFUqlxoY;~tr?Y(Q6Wppj&GKbk+hzWXnbi&@JxeckCKjE z_jKx=P=1&3XeZ5M%Z_Uk2*0_A@q1h+J*$3_> zTd14u^{Xkj*0o!@Ysc@5D~%>EL)7M++%cn&``7f{%@upKFCTO8^xzKROW!Ui->cp& z$Prt#UFnb7S1rfeJ98JR{*XFWqJL>=-t8NiHdVJiPHDGrF22{>sQAJz>Y>QliBEgy zF7B2r5ArYU$~oimF?mg^#nfWvl=Z^FZ+0kvJet}tX}6YuY8C6j>ju-dEUG!Z`iRNz z*eivflJAuiZQ|V3&-O3nP+E;0`&b{^(tv&Z38Nyj4}pH*XX6HwoMupCHf{b!J84oja4%?w)NqJ=4TiJA{uf zr^JXkS=%bUv8CU2R+LY%YW>PzDQDKRi5$+~{kvwxvZD{WP6&3SB>t(2@-bc-SMz($ zv*KsH4UfF{|GH!R{puEp7y)yo#(d{vCjO#ZXPhjavh$QrzrA0I=+1M7ch9$WMfs@d zUDM(FxWXhk`Rt<$eTVNY{t>bH#s`DlN<}$qB4uttE7m>#_gp@*{*XL}(X};m{P)YA z{Bh;oPrjO{DEsse^+)p?8#07VPp9Z{KAAq*yV3Q_1P#ydlRH+syo|J6+**85>|pt$ z`(6J9?b~Its(v;#nFTc#1Ycb(y77pk?3+hPET6V7NE53loc1;AXj6scKH==G@(1e0 z{;SnVs4BSYY&yPZ($3nFoaVDeE2pT&giUYwov!jF>YV6@G7WLXtxCrCj+LA{{J%@H zaR0a86aIIt5j2?-eNg=o&$-1_%+X6etTbOd%kS7b4V9LbTL(nTs@G20F-_V0-m%hs z{QreM#ZRdKjcn$>xTo&LO#Y= zX1$+1fzvQ()8Q%k38&ZgRO~;PEbu@2kI=QONvmVK4jj8I)EU=UIh`%ipR?n-Y{rC> zqGEel)53(Ds(Y4y<9_km`$84l&4jJdSM(S1n4Wm{J?zcP>ld=vB8|7~=lxL5@%~W4 zz4}exkA72mWG{W?=k0`b9=@G@UP1HrPiaj4xS`vv*@pS%KHl_|QBtAvTpr~!iL2@I zw1+%$XR})(a_30hjwXfk4%?KARMigAk*DVmXHv`SR| zd7$J{-yJ6?PN`fDfV?Gm@C->Ds^9T(g+zgU5>x4|lm}?@jr>bxN$N987>ob=tUi#Z~%(x;i?-g49aG{Cl7vmnekQJ#L zoO*>)q{~D76wK~ih||;d;$6zxCtGsY{}oS)a_f^er&Et!d3;t`q@FP8T-D8+qFxS zR#q^#=#ho+2#mz8zYMHGfK}@Q%IGQ#*dC zh6H?%t2mx$?(iuu=7(v?`mM2*(huGXJo~GD>{D}u@s}woH~C)OJvwVESK#S|JiEGc z-@S?CdwL=Ejk@pbLl=(4uWc`Sp;vacOr!l>()3&q=i8N4A0FOe`v3XgE*tw5b8np9 z{qJ)O*Pl;o-^>&Koh(ypvHif&HToMZF51spef8JkSnE2oe_6pj3;CamRs0F@&(8R9 z@oVh**_)GVOb~0j+Y?mRo{MmKK?Fh``&kQ zuhhdfnFVH+Z*0JghF<-W;9@=4u2Dg_JM+7Pq(pZ~2d zExFgfwa@M5%z#gffd^X~bauXKkFq=><(_Q&X{X}cgsKz&o^!9x_}o|+68|_u!p-^@ zr&s5xDEH9o7Fj7XwqLu*;T+c<8nr2O+oix29Me8~tt{HGBKL%z=2cOblh?lOwVQ0= zyYJuH!YdsHd21I7w(a3ty(eY$l1o~5mGo3~rfNA>A5x9>tciJ?QBh+uPsdIElhv9} zU2`XStuCqGm=f!|Qb>hkTFz4Qyk9$y1v(#Ev$fAnVgui5eg|E|Oj& z__*LU#r21^^lxgd+_Gv@;rA&_-cvcOe15XE9+PrUwgDMBY3(G_7AIGZO)_gb?vyS~ z59RzhMRVJqn8z7Ej)eKtuzpfHam_+%-9|y-oei5z``WTi9w|*S?VEM-cig(tl6&>f X{;Hp{;Ac0JJ#8{g?z2GB|Bb8woT{5k diff --git a/doc/qtcreator/src/howto/creator-how-to-set-high-dpi-scaling.qdoc b/doc/qtcreator/src/howto/creator-how-to-set-high-dpi-scaling.qdoc index c0b2d4d6bea..103565ef95d 100644 --- a/doc/qtcreator/src/howto/creator-how-to-set-high-dpi-scaling.qdoc +++ b/doc/qtcreator/src/howto/creator-how-to-set-high-dpi-scaling.qdoc @@ -15,27 +15,30 @@ \title Set high DPI scaling The operating systems that \QC supports implement high dots-per-inch (DPI) - scaling at varying levels. Therefore, \QC handles high DPI scaling - differently on different operating systems: + scaling at varying levels. Therefore, \QC handles \l{High DPI}{high DPI} + scaling differently on different operating systems: \list \li On \macos, \QC forces high DPI scaling, which means that it allows Qt to use the system scaling factor as the \QC scaling factor. - \li On Windows, if you do not set \l{High DPI} - {scaling environment variables}, \QC instructs Qt to detect the - scaling factor and use it as the \QC scaling factor. \li On Linux, \QC leaves it to the user to enable high DPI scaling because the process varies so much on different distributions and windowing systems that it cannot be reliably done automatically. \endlist - To override the default approach and always enable high DPI scaling: + Setting the scale factor or DPI to the exact physical display DPI may not + give good visual results due to the fractional scaling involved. + \l {Qt::HighDpiScaleFactorRoundingPolicy}{Rounding} the scale factor to 25% + increments can improve the results. + + To set the DPI rounding policy: \list 1 \li Select \preferences > \uicontrol Environment > \uicontrol Interface. \image qtcreator-preferences-environment-interface.webp {Interface tab in Environment preferences} - \li Select \uicontrol {Enable high DPI scaling}. + \li In \uicontrol {DPI rounding policy}, select an option to round + DPI up or down. \li Restart \QC to have the change take effect. \endlist */ From 8da7d88e3a3f09c35041d906918576e41e7da6f1 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 23 Oct 2023 14:15:07 +0200 Subject: [PATCH 77/86] ProjectExplorer: Fix restoring project dependencies Amends d6fe357d81da96475c02eb3c73f660d8121381e4. Fixes: QTCREATORBUG-29796 Change-Id: I7788b4e5c2477bb3edf9764b08cfa344a5e9c9c0 Reviewed-by: Christian Stenger --- src/plugins/projectexplorer/projectmanager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projectmanager.cpp b/src/plugins/projectexplorer/projectmanager.cpp index 9706a011ae2..4943773f4b0 100644 --- a/src/plugins/projectexplorer/projectmanager.cpp +++ b/src/plugins/projectexplorer/projectmanager.cpp @@ -573,7 +573,8 @@ void ProjectManager::removeProjects(const QList &remove) void ProjectManagerPrivate::restoreDependencies() { - QMap depMap = SessionManager::sessionValue("ProjectDependencies").toMap(); + QMap depMap = mapEntryFromStoreEntry(SessionManager::sessionValue( + "ProjectDependencies")).toMap(); auto i = depMap.constBegin(); while (i != depMap.constEnd()) { const QString &key = i.key(); From 4645c713d2dc871e52e146456a11f084d428db5c Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 23 Oct 2023 16:13:51 +0200 Subject: [PATCH 78/86] GenericDeployStep: Fix rsync step Don't use a copy of m_files for mkdirTask(), as m_files is modified by the running recipe. So, when the recipe is prepared, the m_files doesn't contain the right data, yet. This is going to be refactored in master, as it seems the isDeploymentNecessary() operating on mutable internals is confusing. Fixes: QTCREATORBUG-29609 Change-Id: I3f34584ffd9486322e8b26f95ac72b96a9306f8b Reviewed-by: Christian Kandeler --- src/plugins/remotelinux/genericdeploystep.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/remotelinux/genericdeploystep.cpp b/src/plugins/remotelinux/genericdeploystep.cpp index 5def5465258..4ae804689c2 100644 --- a/src/plugins/remotelinux/genericdeploystep.cpp +++ b/src/plugins/remotelinux/genericdeploystep.cpp @@ -90,9 +90,9 @@ GroupItem GenericDeployStep::mkdirTask() { using ResultType = expected_str; - const auto onSetup = [files = m_files](Async &async) { + const auto onSetup = [this](Async &async) { FilePaths remoteDirs; - for (const FileToTransfer &file : std::as_const(files)) + for (const FileToTransfer &file : std::as_const(m_files)) remoteDirs << file.m_target.parentDir(); FilePath::sort(remoteDirs); From f401d51a66bf655cd677ae0b232ae5588b683f11 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 23 Oct 2023 10:24:34 +0200 Subject: [PATCH 79/86] McuSupport: Fix dependencies and tests There is nowadays a hard dependency on QmlJSTools as there is need to access its QmlJSModelManager. Beside this adapt the tests to reflect the Key / QString changes happened inside the settings to avoid crashing the tests. Change-Id: I71cd0457e5f567da28cc089b514655418bd60b7d Reviewed-by: Yasser Grimes Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/CMakeLists.txt | 2 +- src/plugins/mcusupport/mcusupport.qbs | 1 + src/plugins/mcusupport/test/unittest.cpp | 67 ++++++++++++------------ 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/plugins/mcusupport/CMakeLists.txt b/src/plugins/mcusupport/CMakeLists.txt index f52c31b82ab..aa8b4f2bf1b 100644 --- a/src/plugins/mcusupport/CMakeLists.txt +++ b/src/plugins/mcusupport/CMakeLists.txt @@ -1,6 +1,6 @@ add_qtc_plugin(McuSupport DEPENDS Qt::Core QmlJS - PLUGIN_DEPENDS Core BareMetal ProjectExplorer Debugger CMakeProjectManager QtSupport + PLUGIN_DEPENDS Core BareMetal ProjectExplorer Debugger CMakeProjectManager QmlJSTools QtSupport SOURCES mcukitaspect.cpp mcukitaspect.h mcusupport.qrc diff --git a/src/plugins/mcusupport/mcusupport.qbs b/src/plugins/mcusupport/mcusupport.qbs index b14c6a90a23..e944ba5ce97 100644 --- a/src/plugins/mcusupport/mcusupport.qbs +++ b/src/plugins/mcusupport/mcusupport.qbs @@ -14,6 +14,7 @@ QtcPlugin { Depends { name: "Debugger" } Depends { name: "CMakeProjectManager" } Depends { name: "QmlJS" } + Depends { name: "QmlJSTools" } Depends { name: "QtSupport" } Depends { name: "qtc_gtest_gmock"; condition: qtc.withPluginTests; required: false } diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index 5692ceee751..13ed66f8035 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -954,34 +954,34 @@ void McuSupportTest::test_legacy_createTargetWithToolchainPackages_data() QTest::newRow("armgcc_mimxrt1050_evk_freertos_json") << armgcc_mimxrt1050_evk_freertos_json << armGccToolchainFilePath - << armGccToolchainFileUnexpandedPath << armGccDir << armGccDirectorySetting + << armGccToolchainFileUnexpandedPath << armGccDir << keyFromString(armGccDirectorySetting) << QStringList{armGccVersion}; QTest::newRow("armgcc_mimxrt1064_evk_freertos_json") << armgcc_mimxrt1064_evk_freertos_json << armGccToolchainFilePath - << armGccToolchainFileUnexpandedPath << armGccDir << armGccDirectorySetting + << armGccToolchainFileUnexpandedPath << armGccDir << keyFromString(armGccDirectorySetting) << QStringList{armGccVersion}; QTest::newRow("armgcc_mimxrt1170_evk_freertos_json") << armgcc_mimxrt1170_evk_freertos_json << armGccToolchainFilePath - << armGccToolchainFileUnexpandedPath << armGccDir << armGccDirectorySetting + << armGccToolchainFileUnexpandedPath << armGccDir << keyFromString(armGccDirectorySetting) << QStringList{armGccVersion}; QTest::newRow("armgcc_stm32h750b_discovery_baremetal_json") << armgcc_stm32h750b_discovery_baremetal_json << armGccToolchainFilePath - << armGccToolchainFileUnexpandedPath << armGccDir << armGccDirectorySetting + << armGccToolchainFileUnexpandedPath << armGccDir << keyFromString(armGccDirectorySetting) << QStringList{armGccVersion}; QTest::newRow("armgcc_stm32f769i_discovery_freertos_json") << armgcc_stm32f769i_discovery_freertos_json << armGccToolchainFilePath - << armGccToolchainFileUnexpandedPath << armGccDir << armGccDirectorySetting + << armGccToolchainFileUnexpandedPath << armGccDir << keyFromString(armGccDirectorySetting) << QStringList{armGccVersion}; QTest::newRow("iar_stm32f469i_discovery_baremetal_json") << iar_stm32f469i_discovery_baremetal_json << iarToolchainFilePath - << iarToolchainFileUnexpandedPath << iarDir << iarSetting << iarVersions; + << iarToolchainFileUnexpandedPath << iarDir << keyFromString(iarSetting) << iarVersions; QTest::newRow("iar_mimxrt1064_evk_freertos_json") << iar_mimxrt1064_evk_freertos_json << iarToolchainFilePath - << iarToolchainFileUnexpandedPath << iarDir << iarSetting << iarVersions; + << iarToolchainFileUnexpandedPath << iarDir << keyFromString(iarSetting) << iarVersions; QTest::newRow("ghs_rh850_d1m1a_baremetal_json") << ghs_rh850_d1m1a_baremetal_json << greenhillToolchainFilePath - << greenhillToolchainFileUnexpandedPath << greenhillCompilerDir << greenhillSetting - << greenhillVersions; + << greenhillToolchainFileUnexpandedPath << greenhillCompilerDir + << keyFromString(greenhillSetting) << greenhillVersions; } void McuSupportTest::test_legacy_createTargetWithToolchainPackages() @@ -1145,22 +1145,22 @@ void McuSupportTest::test_legacy_createFreeRtosPackage_data() QTest::newRow("armgcc_mimxrt1050_evk_freertos_json") << armgcc_mimxrt1050_evk_freertos_json << QStringList{boardSdkVersion} - << QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1050) + << keyFromString(QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1050)) << FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix << FilePath::fromUserInput(freeRtosDetectionPath); QTest::newRow("armgcc_mimxrt1064_evk_freertos_json") << armgcc_mimxrt1064_evk_freertos_json << QStringList{boardSdkVersion} - << QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064) + << keyFromString(QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064)) << FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix << FilePath::fromUserInput(freeRtosDetectionPath); QTest::newRow("iar_mimxrt1064_evk_freertos_json") << iar_mimxrt1064_evk_freertos_json << QStringList{boardSdkVersion} - << QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064) + << keyFromString(QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(nxp1064)) << FilePath::fromUserInput(boardSdkDir) / freeRtosNxpPathSuffix << FilePath::fromUserInput(freeRtosDetectionPath); QTest::newRow("armgcc_stm32f769i_discovery_freertos_json") << armgcc_stm32f769i_discovery_freertos_json << QStringList{"1.16.0"} - << QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(stm32f7) + << keyFromString(QString{Legacy::Constants::SETTINGS_KEY_FREERTOS_PREFIX}.append(stm32f7)) << FilePath::fromUserInput(boardSdkDir) / freeRtosStmPathSuffix << FilePath::fromUserInput(freeRtosDetectionPath); } @@ -1495,7 +1495,7 @@ void McuSupportTest::test_legacy_createThirdPartyPackage_data() QTest::addColumn("json"); QTest::addColumn("path"); QTest::addColumn("defaultPath"); - QTest::addColumn("setting"); + QTest::addColumn("setting"); QTest::addColumn("cmakeVar"); QTest::addColumn("envVar"); QTest::addColumn("label"); @@ -1504,42 +1504,42 @@ void McuSupportTest::test_legacy_createThirdPartyPackage_data() QTest::newRow("armgcc_mimxrt1050_evk_freertos_json mcuXpresso") << PackageCreator{[this]() { return Legacy::createMcuXpressoIdePackage(settingsMockPtr); }} << armgcc_mimxrt1050_evk_freertos_json << xpressoIdePath << xpressoIdePath - << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel + << keyFromString(xpressoIdeSetting) << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel << xpressoIdeDetectionPath; QTest::newRow("armgcc_mimxrt1064_evk_freertos_json mcuXpresso") << PackageCreator{[this]() { return Legacy::createMcuXpressoIdePackage(settingsMockPtr); }} << armgcc_mimxrt1064_evk_freertos_json << xpressoIdePath << xpressoIdePath - << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel - << xpressoIdeDetectionPath; + << keyFromString(xpressoIdeSetting) << xpressoIdeCmakeVar << xpressoIdeEnvVar + << xpressoIdeLabel << xpressoIdeDetectionPath; QTest::newRow("armgcc_mimxrt1170_evk_freertos_json mcuXpresso") << PackageCreator{[this]() { return Legacy::createMcuXpressoIdePackage(settingsMockPtr); }} << armgcc_mimxrt1170_evk_freertos_json << xpressoIdePath << xpressoIdePath - << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel - << xpressoIdeDetectionPath; + << keyFromString(xpressoIdeSetting) << xpressoIdeCmakeVar << xpressoIdeEnvVar + << xpressoIdeLabel << xpressoIdeDetectionPath; QTest::newRow("armgcc_stm32h750b_discovery_baremetal_json stmCubeProgrammer") << PackageCreator{[this]() { return Legacy::createStm32CubeProgrammerPackage(settingsMockPtr); }} << armgcc_stm32h750b_discovery_baremetal_json << stmCubeProgrammerPath - << stmCubeProgrammerPath << stmCubeProgrammerSetting << empty << empty + << stmCubeProgrammerPath << keyFromString(stmCubeProgrammerSetting) << empty << empty << stmCubeProgrammerLabel << stmCubeProgrammerDetectionPath; QTest::newRow("armgcc_stm32f769i_discovery_freertos_json stmCubeProgrammer") << PackageCreator{[this]() { return Legacy::createStm32CubeProgrammerPackage(settingsMockPtr); }} << armgcc_stm32f769i_discovery_freertos_json << stmCubeProgrammerPath - << stmCubeProgrammerPath << stmCubeProgrammerSetting << empty << empty + << stmCubeProgrammerPath << keyFromString(stmCubeProgrammerSetting) << empty << empty << stmCubeProgrammerLabel << stmCubeProgrammerDetectionPath; QTest::newRow("ghs_rh850_d1m1a_baremetal_json renesasProgrammer") << PackageCreator{[this]() { return Legacy::createRenesasProgrammerPackage(settingsMockPtr); }} - << ghs_rh850_d1m1a_baremetal_json << empty << empty << renesasProgrammerSetting - << renesasProgrammerCmakeVar << renesasProgrammerEnvVar << renesasProgrammerLabel - << renesasProgrammerDetectionPath; + << ghs_rh850_d1m1a_baremetal_json << empty << empty + << keyFromString(renesasProgrammerSetting) << renesasProgrammerCmakeVar + << renesasProgrammerEnvVar << renesasProgrammerLabel << renesasProgrammerDetectionPath; } void McuSupportTest::test_legacy_createThirdPartyPackage() @@ -1592,33 +1592,34 @@ void McuSupportTest::test_createThirdPartyPackage_data() QTest::newRow("armgcc_mimxrt1050_evk_freertos_json mcuXpresso") << armgcc_mimxrt1050_evk_freertos_json << xpressoIdePath << xpressoIdePath - << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel - << xpressoIdeDetectionPath; + << keyFromString(xpressoIdeSetting) << xpressoIdeCmakeVar << xpressoIdeEnvVar + << xpressoIdeLabel << xpressoIdeDetectionPath; QTest::newRow("armgcc_mimxrt1064_evk_freertos_json mcuXpresso") << armgcc_mimxrt1064_evk_freertos_json << xpressoIdePath << xpressoIdePath - << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel - << xpressoIdeDetectionPath; + << keyFromString(xpressoIdeSetting) << xpressoIdeCmakeVar << xpressoIdeEnvVar + << xpressoIdeLabel << xpressoIdeDetectionPath; QTest::newRow("armgcc_mimxrt1170_evk_freertos_json mcuXpresso") << armgcc_mimxrt1170_evk_freertos_json << xpressoIdePath << xpressoIdePath - << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel + << keyFromString(xpressoIdeSetting) << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel << xpressoIdeDetectionPath; QTest::newRow("armgcc_stm32h750b_discovery_baremetal_json stmCubeProgrammer") << armgcc_stm32h750b_discovery_baremetal_json << stmCubeProgrammerPath - << stmCubeProgrammerPath << stmCubeProgrammerSetting << empty << empty + << stmCubeProgrammerPath << keyFromString(stmCubeProgrammerSetting) << empty << empty << stmCubeProgrammerLabel << stmCubeProgrammerDetectionPath; QTest::newRow("armgcc_stm32f769i_discovery_freertos_json stmCubeProgrammer") << armgcc_stm32f769i_discovery_freertos_json << stmCubeProgrammerPath - << stmCubeProgrammerPath << stmCubeProgrammerSetting << empty << empty + << stmCubeProgrammerPath << keyFromString(stmCubeProgrammerSetting) << empty << empty << stmCubeProgrammerLabel << stmCubeProgrammerDetectionPath; QTest::newRow("ghs_rh850_d1m1a_baremetal_json renesasProgrammer") << ghs_rh850_d1m1a_baremetal_json << renesasProgrammerDefaultPath << empty - << "FlashProgrammerPath" << renesasProgrammerCmakeVar << "RenesasFlashProgrammer_PATH" - << renesasProgrammerLabel << renesasProgrammerDetectionPath; + << keyFromString("FlashProgrammerPath") << renesasProgrammerCmakeVar + << "RenesasFlashProgrammer_PATH" << renesasProgrammerLabel + << renesasProgrammerDetectionPath; } void McuSupportTest::test_createThirdPartyPackage() From bed9ed55c4fa950e3f2168fb318b4dcf345bbe7f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 19 Oct 2023 15:44:57 +0200 Subject: [PATCH 80/86] EditorManager: Native dialogs on macOS can't change their buttons In this case we try to add a menu to a button. "Native" is the default, so explicitly request a non-native message box. This is the message box that pops up e.g. when trying to open an empty file foo.ui (the widget designer rejects to open it, Qt Creator provides the option to open with a different editor in the error dialog). Task-number: QTBUG-118419 Change-Id: Iab3ee14593a55c2056303cfa16b99cea25893522 Reviewed-by: Qt CI Bot Reviewed-by: Marcus Tillmanns --- src/plugins/coreplugin/editormanager/editormanager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 4b059a10fd7..ad31e04ea98 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -873,6 +873,9 @@ IEditor *EditorManagerPrivate::openEditor(EditorView *view, const FilePath &file IEditorFactory *selectedFactory = nullptr; if (!factories.isEmpty()) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0) + msgbox.setOptions(QMessageBox::Option::DontUseNativeDialog); +#endif auto button = qobject_cast(msgbox.button(QMessageBox::Open)); QTC_ASSERT(button, return nullptr); auto menu = new QMenu(button); From 176be6a563da09817d7a195b5d22866602af639b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 20 Oct 2023 10:38:08 +0200 Subject: [PATCH 81/86] COIN/GitHub: Switch to Qt 6.6.0 Which we use for the packages Change-Id: I7fa6c001f356ca23409444567d94246731d0fffe Reviewed-by: Reviewed-by: David Schulz Reviewed-by: Qt CI Bot --- .github/workflows/build_cmake.yml | 4 ++-- coin/instructions/common_environment.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index 416223c75af..d866f1f6d70 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -7,7 +7,7 @@ on: - 'doc/**' env: - QT_VERSION: 6.5.2 + QT_VERSION: 6.6.0 MACOS_DEPLOYMENT_TARGET: 10.15 CLANG_VERSION: 17.0.1 ELFUTILS_VERSION: 0.175 @@ -201,7 +201,7 @@ jobs: set(url_os "linux_x64") set(qt_package_arch_suffix "gcc_64") set(qt_dir_prefix "${qt_version}/gcc_64") - set(qt_package_suffix "-Linux-RHEL_8_4-GCC-Linux-RHEL_8_4-X86_64") + set(qt_package_suffix "-Linux-RHEL_8_6-GCC-Linux-RHEL_8_6-X86_64") elseif ("${{ runner.os }}" STREQUAL "macOS") set(url_os "mac_x64") set(qt_package_arch_suffix "clang_64") diff --git a/coin/instructions/common_environment.yaml b/coin/instructions/common_environment.yaml index ea72589c1df..0f651d187a8 100644 --- a/coin/instructions/common_environment.yaml +++ b/coin/instructions/common_environment.yaml @@ -10,7 +10,7 @@ instructions: variableValue: https://ci-files02-hki.ci.qt.io/packages/jenkins/qtcreator_libclang/libclang-release_17.0.1-based - type: EnvironmentVariable variableName: QTC_QT_BASE_URL - variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.5/6.5.2-released/Qt" + variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.6/6.6.0-released/Qt" - type: EnvironmentVariable variableName: QTC_QT_MODULES variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquickcontrols2 qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations qtwebengine" @@ -39,7 +39,7 @@ instructions: instructions: - type: EnvironmentVariable variableName: QTC_QT_POSTFIX - variableValue: "-Linux-RHEL_8_4-GCC-Linux-RHEL_8_4-X86_64.7z" + variableValue: "-Linux-RHEL_8_6-GCC-Linux-RHEL_8_6-X86_64.7z" - type: EnvironmentVariable variableName: QTC_SDKTOOL_QT_EXT variableValue: ".tar.xz" From 1d64d764acfd110c1717ba1602f194bd46a2e550 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 20 Oct 2023 13:03:05 +0200 Subject: [PATCH 82/86] Clangd: Edit tooltip text for "Header/source switch mode" field Use the phrasing "tends to find false positives" instead of "has some bugs". Add

    at the ends of paragraph elements. Change-Id: Ie524f2615625b52bf2de5b66b8938f49e3d0255f Reviewed-by: Eike Ziller --- share/qtcreator/translations/qtcreator_fr.ts | 4 ++-- .../cppeditor/cppcodemodelsettingspage.cpp | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index 059f2e80e93..673d54af1ea 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -20281,8 +20281,8 @@ Double-cliquez pour modifier l’élément. C++ - <p>If background indexing is enabled, global symbol searches will yield more accurate results, at the cost of additional CPU load when the project is first opened. The indexing result is persisted in the project's build directory. If you disable background indexing, a faster, but less accurate, built-in indexer is used instead. The thread priority for building the background index can be adjusted since clangd 15.</p><p>Background Priority: Minimum priority, runs on idle CPUs. May leave 'performance' cores unused.</p><p>Normal Priority: Reduced priority compared to interactive work.</p>Low Priority: Same priority as other clangd work. - <p>Si l’indexation en arrière-plan est activée, les recherches globales de symboles donneront des résultats plus précis, au prix d’une charge de travail supplémentaire du CPU lors de la première ouverture du projet. Le résultat de l’indexation est conservé dans le répertoire de construction du projet. Si vous désactivez l’indexation en arrière-plan, un indexeur intégré plus rapide, mais moins précis, est utilisé à la place. La priorité des threads pour la construction de l’index d’arrière-plan peut être ajustée depuis clangd 15.</p><p>Priorité d’arrière-plan : priorité minimale, s’exécute sur les processeurs inactifs. Peut laisser les cœurs de « performance » inutilisés.</p><p>Priorité normale : priorité réduite par rapport au travail interactif.</p>Priorité basse : même priorité que les autres travaux de clangd. + <p>If background indexing is enabled, global symbol searches will yield more accurate results, at the cost of additional CPU load when the project is first opened. The indexing result is persisted in the project's build directory. If you disable background indexing, a faster, but less accurate, built-in indexer is used instead. The thread priority for building the background index can be adjusted since clangd 15.</p><p>Background Priority: Minimum priority, runs on idle CPUs. May leave 'performance' cores unused.</p><p>Normal Priority: Reduced priority compared to interactive work.</p><p>Low Priority: Same priority as other clangd work.</p> + <p>Si l’indexation en arrière-plan est activée, les recherches globales de symboles donneront des résultats plus précis, au prix d’une charge de travail supplémentaire du CPU lors de la première ouverture du projet. Le résultat de l’indexation est conservé dans le répertoire de construction du projet. Si vous désactivez l’indexation en arrière-plan, un indexeur intégré plus rapide, mais moins précis, est utilisé à la place. La priorité des threads pour la construction de l’index d’arrière-plan peut être ajustée depuis clangd 15.</p><p>Priorité d’arrière-plan : priorité minimale, s’exécute sur les processeurs inactifs. Peut laisser les cœurs de « performance » inutilisés.</p><p>Priorité normale : priorité réduite par rapport au travail interactif.</p><p>Priorité basse : même priorité que les autres travaux de clangd.</p> <p>Which C/C++ backend to use when switching between header and source file.<p>The clangd implementation has more capabilities, but also has some bugs not present in the built-in variant.<p>When "Try Both" is selected, clangd will be employed only if the built-in variant does not find anything. diff --git a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp index 1c8ff05fee8..2c46504f17f 100644 --- a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp @@ -223,21 +223,21 @@ ClangdSettingsWidget::ClangdSettingsWidget(const ClangdSettings::Data &settingsD "

    Background Priority: Minimum priority, runs on idle CPUs. May leave 'performance' " "cores unused.

    " "

    Normal Priority: Reduced priority compared to interactive work.

    " - "Low Priority: Same priority as other clangd work."); + "

    Low Priority: Same priority as other clangd work.

    "); const QString headerSourceSwitchToolTip = Tr::tr( - "

    Which C/C++ backend to use when switching between header and source file." - "

    The clangd implementation has more capabilities, but also has some bugs not present " - "in the built-in variant." - "

    When \"Try Both\" is selected, clangd will be employed only if the built-in variant " - "does not find anything."); + "

    The C/C++ backend to use for switching between header and source files.

    " + "

    While the clangd implementation has more capabilities than the built-in " + "code model, it tends to find false positives.

    " + "

    When \"Try Both\" is selected, clangd is used only if the built-in variant " + "does not find anything.

    "); using RankingModel = ClangdSettings::CompletionRankingModel; const QString completionRankingModelToolTip = Tr::tr( - "

    Which model clangd should use to rank possible completions." - "

    This determines the order of candidates in the combo box when doing code completion." + "

    Which model clangd should use to rank possible completions.

    " + "

    This determines the order of candidates in the combo box when doing code completion.

    " "

    The \"%1\" model used by default results from (pre-trained) machine learning and " - "provides superior results on average." + "provides superior results on average.

    " "

    If you feel that its suggestions stray too much from your expectations for your " - "code base, you can try switching to the hand-crafted \"%2\" model.").arg( + "code base, you can try switching to the hand-crafted \"%2\" model.

    ").arg( ClangdSettings::rankingModelToDisplayString(RankingModel::DecisionForest), ClangdSettings::rankingModelToDisplayString(RankingModel::Heuristics)); const QString workerThreadsToolTip = Tr::tr( From f811edf4a28d06c4e36ebbe2a69d8c75ea64810f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 24 Oct 2023 09:08:16 +0200 Subject: [PATCH 83/86] Help: Fix text of View > Show Left Sidebar check item The text should never be "Hide Left Sidebar", because it is a checked item. Just set the tooltip, like done in coreplugin/navigationwidget.cpp Task-number: QTCREATORBUG-27733 Change-Id: I0cda56712724a69cb08411e62be57b88909416fe Reviewed-by: Jarek Kobus --- src/plugins/help/helpwidget.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp index a2d9eca985a..daa6e83c576 100644 --- a/src/plugins/help/helpwidget.cpp +++ b/src/plugins/help/helpwidget.cpp @@ -229,11 +229,14 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget m_toggleSideBarAction->setChecked(false); cmd = Core::ActionManager::registerAction(m_toggleSideBarAction, Core::Constants::TOGGLE_LEFT_SIDEBAR, context); - connect(m_toggleSideBarAction, &QAction::toggled, m_toggleSideBarAction, [this](bool checked) { - m_toggleSideBarAction->setText(::Core::Tr::tr( - checked ? Core::Constants::TR_HIDE_LEFT_SIDEBAR - : Core::Constants::TR_SHOW_LEFT_SIDEBAR)); - }); + connect(m_toggleSideBarAction, + &QAction::toggled, + m_toggleSideBarAction, + [this](bool checked) { + m_toggleSideBarAction->setToolTip( + ::Core::Tr::tr(checked ? Core::Constants::TR_HIDE_LEFT_SIDEBAR + : Core::Constants::TR_SHOW_LEFT_SIDEBAR)); + }); addSideBar(); m_toggleSideBarAction->setChecked(m_sideBar->isVisibleTo(this)); connect(m_toggleSideBarAction, &QAction::triggered, m_sideBar, &Core::SideBar::setVisible); From ddffbe676de3d87e71a7379db3405853ebee518a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 20 Oct 2023 14:26:04 +0200 Subject: [PATCH 84/86] Help: Do not allow opening temporary in Help mode In case we have no documentation for an "F1 help request" we display some temporary with a small hint. Disallow opening this inside the Help mode to avoid triggering an open request which ends up in a system dialog trying to open the temporary local file. Fixes: QTCREATORBUG-29371 Change-Id: If61c37eb2576cf6f9dcc70b58527a66b284b30f0 Reviewed-by: Eike Ziller --- src/plugins/help/helpwidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp index daa6e83c576..c79bb052eb5 100644 --- a/src/plugins/help/helpwidget.cpp +++ b/src/plugins/help/helpwidget.cpp @@ -695,6 +695,8 @@ HelpViewer *HelpWidget::insertViewer(int index, const QUrl &url) if (currentViewer() == viewer) { m_addBookmarkAction->setEnabled(isBookmarkable(url)); m_openOnlineDocumentationAction->setEnabled(LocalHelpManager::canOpenOnlineHelp(url)); + if (m_switchToHelp) + m_switchToHelp->setEnabled(url != QUrl("about:blank")); } }); connect(viewer, &HelpViewer::forwardAvailable, this, [viewer, this](bool available) { From 0fe891678a9d47b4bc956edba911659bd22d9bb8 Mon Sep 17 00:00:00 2001 From: Riitta-Leena Miettinen Date: Thu, 19 Oct 2023 10:46:46 +0200 Subject: [PATCH 85/86] Doc: Use a link to "Find preferences" as value of \preferences - Add the instructions for finding the Preferences menu to the "Find a particular preference" topic and rename it "Find preferences". - Remove the "Find menu items on macOS" topic Change-Id: I627e5c20d2c63efb4490d446608b923ac15a6aac Reviewed-by: Reviewed-by: Eike Ziller --- doc/config/macros.qdocconf | 2 +- .../creator-coding-edit-mode.qdoc | 2 +- .../creator-only/creator-preferences-nim.qdoc | 2 +- ...ator-preferences-text-editor-behavior.qdoc | 2 +- .../creator-how-to-find-preferences.qdoc | 33 ++++++++++++++++ .../src/howto/creator-how-to-macos.qdoc | 38 ------------------- .../howto/creator-only/creator-how-tos.qdoc | 14 ------- ...reator-preferences-qtquick-code-style.qdoc | 2 +- .../src/user-interface/creator-ui.qdoc | 2 +- 9 files changed, 39 insertions(+), 58 deletions(-) create mode 100644 doc/qtcreator/src/howto/creator-how-to-find-preferences.qdoc delete mode 100644 doc/qtcreator/src/howto/creator-how-to-macos.qdoc diff --git a/doc/config/macros.qdocconf b/doc/config/macros.qdocconf index f70ce0c3926..f881062d136 100644 --- a/doc/config/macros.qdocconf +++ b/doc/config/macros.qdocconf @@ -39,7 +39,7 @@ macro.QOI = "Qt Online Installer" macro.QMT = "Qt Maintenance Tool" macro.qtcversion = $QTC_VERSION macro.param = "\\e" -macro.preferences = "\\uicontrol Edit (or \\uicontrol {\\QC} on \\macos) > \\uicontrol Preferences" +macro.preferences = "\\l{Find preferences}{Preferences}" macro.raisedaster.HTML = "*" macro.rarrow.HTML = "→" macro.reg.HTML = "®" diff --git a/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc b/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc index 0f4933bee49..6a649e96db7 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc @@ -306,7 +306,7 @@ split, prepend \key {Ctrl+E} to the shortcut. For example, press \key {Ctrl+E,F2} to follow the symbol in the next split. If necessary, the view is automatically split. To change the default behavior, select - \preferen \uicontrol {Text Editor} > \uicontrol Display > + \preferences > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Always open links in another split}. Additional symbols are displayed and switching between definition and declaration is done in diff --git a/doc/qtcreator/src/editors/creator-only/creator-preferences-nim.qdoc b/doc/qtcreator/src/editors/creator-only/creator-preferences-nim.qdoc index 3d77de55346..a72320b71fe 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-preferences-nim.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-preferences-nim.qdoc @@ -29,6 +29,6 @@ To specify different settings for a particular project, select \uicontrol Projects > \uicontrol {Code Style}. - \sa {Find a particular preference}, {Indent text or code}, + \sa {Find preferences}, {Indent text or code}, {Specify code style}, {Setting Up Nimble} */ diff --git a/doc/qtcreator/src/editors/creator-preferences-text-editor-behavior.qdoc b/doc/qtcreator/src/editors/creator-preferences-text-editor-behavior.qdoc index 553e0993961..aeaf45def30 100644 --- a/doc/qtcreator/src/editors/creator-preferences-text-editor-behavior.qdoc +++ b/doc/qtcreator/src/editors/creator-preferences-text-editor-behavior.qdoc @@ -89,7 +89,7 @@ commenting out a selection, select \uicontrol {Prefer single line comments}. \if defined(qtcreator) - \sa {Find a particular preference}, {C++ Code Style}, {Nim} + \sa {Find preferences}, {C++ Code Style}, {Nim} \endif \sa {Indent text or code}, {Qt Quick Code Style} diff --git a/doc/qtcreator/src/howto/creator-how-to-find-preferences.qdoc b/doc/qtcreator/src/howto/creator-how-to-find-preferences.qdoc new file mode 100644 index 00000000000..a39f64963d9 --- /dev/null +++ b/doc/qtcreator/src/howto/creator-how-to-find-preferences.qdoc @@ -0,0 +1,33 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-how-to-find-preferences.html + \if defined(qtcreator) + \previouspage creator-how-tos.html + \else + \previouspage creator-quick-tour.html + \endif + + \ingroup creator-how-to-ui + \ingroup studio-how-to + + \title Find preferences + + \QC uses standard names and locations on Linux, \macos, and Windows for + standard features, such as \e preferences. + + \table + \header + \li Linux and Windows + \li \macos + \row + \li \uicontrol Edit > \uicontrol Preferences + \li \uicontrol {\QC} > \uicontrol Preferences + \endtable + + To find a particular preference, use the filter located at the top left of + the \uicontrol Preferences dialog. + + \image qtcreator-preferences.webp {Filtering preferences} +*/ diff --git a/doc/qtcreator/src/howto/creator-how-to-macos.qdoc b/doc/qtcreator/src/howto/creator-how-to-macos.qdoc deleted file mode 100644 index 30e5815efd9..00000000000 --- a/doc/qtcreator/src/howto/creator-how-to-macos.qdoc +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (C) 2023 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \page creator-how-to-macos.html - \if defined(qtcreator) - \previouspage creator-how-tos.html - \else - \previouspage creator-quick-tour.html - \endif - - \ingroup creator-how-to-ui - \ingroup studio-how-to - - \title Find menu items on \macos - - \QC uses standard names and locations for standard features, such as - \e preferences. In this manual, the names and locations on - Windows and Linux are usually used to keep the instructions short. Here are - some places to check if you cannot find a function, dialog, or keyboard - shortcut on \macos when following the instructions: - - \table - \header - \li For - \li Look In - \row - \li \uicontrol Edit > \uicontrol Preferences - \li \uicontrol {\QC} > \uicontrol Preferences - \row - \li \uicontrol Help > \uicontrol {About Plugins} - \li \uicontrol {\QC} > \uicontrol {About Plugins} - \row - \li Keyboard shortcuts - \li \uicontrol {\QC} > \uicontrol Preferences > \uicontrol Environment > - \uicontrol Keyboard - \endtable -*/ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index 99206c237a8..fb9bccd529c 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -95,20 +95,6 @@ \endlist */ -/*! - \page creator-how-to-find-preferences.html - \previouspage creator-how-tos.html - - \ingroup creator-how-to-ui - - \title Find a particular preference - - To find a particular preference in \preferences, - use the filter located at the top left of the \uicontrol Preferences dialog. - - \image qtcreator-preferences.webp {Filtering preferences} -*/ - /*! \page creator-how-to-run-from-cli.html \previouspage creator-how-tos.html diff --git a/doc/qtcreator/src/qtquick/creator-preferences-qtquick-code-style.qdoc b/doc/qtcreator/src/qtquick/creator-preferences-qtquick-code-style.qdoc index 333ff9694eb..6ea13251620 100644 --- a/doc/qtcreator/src/qtquick/creator-preferences-qtquick-code-style.qdoc +++ b/doc/qtcreator/src/qtquick/creator-preferences-qtquick-code-style.qdoc @@ -40,6 +40,6 @@ \sa {Indent text or code} \if defined(qtcreator) - \sa {Find a particular preference}, {Specify code style} + \sa {Find preferences}, {Specify code style} \endif */ diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index 9d0e642b325..bf4bb2c455d 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -118,7 +118,7 @@ The following topics describe how to customize the UI: \list - \li \l {Find menu items on \macos} + \li \l {Find preferences} \li \l {Set high DPI scaling} \li \l {Switch UI themes} \li \l {View output} From 5e3d14e2e932da0a3dc3314d2802bc3df0dc504c Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Sun, 22 Oct 2023 14:22:20 +0200 Subject: [PATCH 86/86] CMakePM: Allow CMAKE_SYSROOT to be taken from the CMake preset probe One could have a toolchainfile that sets the CMAKE_SYSROOT. We need to be able to read the value later, and not just from the CMake Presets cmakeCache array. Task-number: QTCREATORBUG-29643 Change-Id: I63697219195b043813516c8214329ce583dc0676 Reviewed-by: Alessandro Portale Reviewed-by: --- src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 74d5056bf78..b8748bc6f98 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -264,6 +264,7 @@ static CMakeConfig configurationFromPresetProbe( const QString prefixPath = cache.stringValueOf("CMAKE_PREFIX_PATH"); const QString findRootPath = cache.stringValueOf("CMAKE_FIND_ROOT_PATH"); const QString qtHostPath = cache.stringValueOf("QT_HOST_PATH"); + const QString sysRoot = cache.stringValueOf("CMAKE_SYSROOT"); if (!cmakeMakeProgram.isEmpty()) { args.emplace_back( @@ -282,6 +283,9 @@ static CMakeConfig configurationFromPresetProbe( if (!qtHostPath.isEmpty()) { args.emplace_back(QStringLiteral("-DQT_HOST_PATH=%1").arg(qtHostPath)); } + if (!sysRoot.isEmpty()) { + args.emplace_back(QStringLiteral("-DCMAKE_SYSROOT=%1").arg(sysRoot)); + } } qCDebug(cmInputLog) << "CMake probing for compilers: " << cmakeExecutable.toUserOutput() @@ -745,9 +749,6 @@ QList CMakeProjectImporter::examineDirectory(const FilePath &importPath, const CMakeConfig cache = configurePreset.cacheVariables ? configurePreset.cacheVariables.value() : CMakeConfig(); - - data->sysroot = cache.filePathValueOf("CMAKE_SYSROOT"); - CMakeConfig config; const bool noCompilers = cache.valueOf("CMAKE_C_COMPILER").isEmpty() && cache.valueOf("CMAKE_CXX_COMPILER").isEmpty(); @@ -778,6 +779,8 @@ QList CMakeProjectImporter::examineDirectory(const FilePath &importPath, configurePreset.generator.value().toUtf8()); } + data->sysroot = config.filePathValueOf("CMAKE_SYSROOT"); + const auto [qmake, cmakePrefixPath] = qtInfoFromCMakeCache(config, env); if (!qmake.isEmpty()) data->qt = findOrCreateQtVersion(qmake);