From 3f318fe628f189883815833ab39b0d403e66eed0 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 28 Jun 2024 14:50:33 +0200 Subject: [PATCH 01/22] TextEditor: collect tab and typing settings only once ... and not for each cursor in a multi text cursor when handling the backspace key. Change-Id: I1e6b9409163306ee665f4519afe11cb87997c270 Reviewed-by: Christian Stenger --- src/plugins/texteditor/texteditor.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index d75db87a166..666576ed1b9 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -7402,6 +7402,10 @@ void TextEditorWidgetPrivate::handleBackspaceKey() QTC_ASSERT(!q->multiTextCursor().hasSelection(), return); MultiTextCursor cursor = m_cursors; cursor.beginEditBlock(); + + const TabSettings tabSettings = m_document->tabSettings(); + const TypingSettings &typingSettings = m_document->typingSettings(); + for (QTextCursor &c : cursor) { const int pos = c.position(); if (!pos) @@ -7414,9 +7418,6 @@ void TextEditorWidgetPrivate::handleBackspaceKey() cursorWithinSnippet = snippetCheckCursor(snippetCursor); } - const TabSettings tabSettings = m_document->tabSettings(); - const TypingSettings &typingSettings = m_document->typingSettings(); - if (typingSettings.m_autoIndent && !m_autoCompleteHighlightPos.isEmpty() && (m_autoCompleteHighlightPos.last() == c) && m_removeAutoCompletedText && m_autoCompleter->autoBackspace(c)) { From c9b74decc2dec3476520d2703e666da1fa7defc7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 28 Jun 2024 15:04:16 +0200 Subject: [PATCH 02/22] TextEditor: fix unindent on backspace for mixed multi text cursors Fixes: QTCREATORBUG-31158 Change-Id: I141e01f51531dffee10835c74370d2df11c3fcc7 Reviewed-by: Christian Stenger --- src/plugins/texteditor/texteditor.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 666576ed1b9..5f201222b1f 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -7406,6 +7406,21 @@ void TextEditorWidgetPrivate::handleBackspaceKey() const TabSettings tabSettings = m_document->tabSettings(); const TypingSettings &typingSettings = m_document->typingSettings(); + auto behavior = typingSettings.m_smartBackspaceBehavior; + if (cursor.hasMultipleCursors()) { + if (behavior == TypingSettings::BackspaceFollowsPreviousIndents) { + behavior = TypingSettings::BackspaceNeverIndents; + } else if (behavior == TypingSettings::BackspaceUnindents) { + for (QTextCursor &c : cursor) { + if (c.positionInBlock() == 0 + || c.positionInBlock() > TabSettings::firstNonSpace(c.block().text())) { + behavior = TypingSettings::BackspaceNeverIndents; + break; + } + } + } + } + for (QTextCursor &c : cursor) { const int pos = c.position(); if (!pos) @@ -7425,12 +7440,12 @@ void TextEditorWidgetPrivate::handleBackspaceKey() } bool handled = false; - if (typingSettings.m_smartBackspaceBehavior == TypingSettings::BackspaceNeverIndents) { + if (behavior == TypingSettings::BackspaceNeverIndents) { if (cursorWithinSnippet) c.beginEditBlock(); c.deletePreviousChar(); handled = true; - } else if (typingSettings.m_smartBackspaceBehavior + } else if (behavior == TypingSettings::BackspaceFollowsPreviousIndents) { QTextBlock currentBlock = c.block(); int positionInBlock = pos - currentBlock.position(); @@ -7465,7 +7480,7 @@ void TextEditorWidgetPrivate::handleBackspaceKey() } } } - } else if (typingSettings.m_smartBackspaceBehavior == TypingSettings::BackspaceUnindents) { + } else if (behavior == TypingSettings::BackspaceUnindents) { if (c.positionInBlock() == 0 || c.positionInBlock() > TabSettings::firstNonSpace(c.block().text())) { if (cursorWithinSnippet) From 476401aa0c5906d1bf30938a1b56fbfc38fa967e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 28 Jun 2024 11:30:58 +0200 Subject: [PATCH 03/22] JsonWizards: Fix wizards for Design Studio Let Design Studio directly change the location where the pre-installed wizards are located - clearing wizard paths to set a new one is call order dependent and therefore fragile (as can be seen) - it doesn't really make sense to prevent user templates Also fix addWizardPath, even though it is then no longer used in our own code. Amends 3249b106e5eae2fcfa416c94d77aa3ffe31dc2cb Change-Id: I404387aea1bc85aef5f229e6699bd9802b218e65 Reviewed-by: Christian Stenger --- .../jsonwizard/jsonwizardfactory.cpp | 16 +++++++++++----- .../jsonwizard/jsonwizardfactory.h | 4 +++- .../studiowelcome/studiowelcomeplugin.cpp | 3 +-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index 4e8d4964169..6da06b0616a 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -568,14 +568,15 @@ static QStringList environmentTemplatesPaths() } static bool s_searchPathsInitialized = false; +Q_GLOBAL_STATIC(FilePath, s_installedWizardsPath, {Core::ICore::resourcePath(WIZARD_PATH)}) +Q_GLOBAL_STATIC(FilePaths, s_additionalWizardPaths) FilePaths &JsonWizardFactory::searchPaths() { static FilePaths m_searchPaths; if (!s_searchPathsInitialized) { s_searchPathsInitialized = true; - m_searchPaths = {Core::ICore::userResourcePath(WIZARD_PATH), - Core::ICore::resourcePath(WIZARD_PATH)}; + m_searchPaths = {Core::ICore::userResourcePath(WIZARD_PATH), *s_installedWizardsPath}; for (const QString &environmentTemplateDirName : environmentTemplatesPaths()) m_searchPaths << FilePath::fromString(environmentTemplateDirName); m_searchPaths << Utils::transform( @@ -594,6 +595,7 @@ FilePaths &JsonWizardFactory::searchPaths() } } } + m_searchPaths += *s_additionalWizardPaths; } return m_searchPaths; @@ -606,12 +608,16 @@ void JsonWizardFactory::resetSearchPaths() void JsonWizardFactory::addWizardPath(const FilePath &path) { - searchPaths().append(path); + s_additionalWizardPaths->append(path); } -void JsonWizardFactory::clearWizardPaths() +/*! + \internal +*/ +void JsonWizardFactory::setInstalledWizardsPath(const Utils::FilePath &path) { - searchPaths().clear(); + *s_installedWizardsPath = path; + resetSearchPaths(); } void JsonWizardFactory::setVerbose(int level) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h index 1ab133d5bd3..30e69ee5c89 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h @@ -27,7 +27,6 @@ class PROJECTEXPLORER_EXPORT JsonWizardFactory : public Core::IWizardFactory public: // Add search paths for wizard.json files. All subdirs are going to be checked. static void addWizardPath(const Utils::FilePath &path); - static void clearWizardPaths(); // actual interface of the wizard factory: class Generator { @@ -58,6 +57,9 @@ public: virtual std::pair screenSizeInfoFromPage(const QString &pageType) const; + // internal + static void setInstalledWizardsPath(const Utils::FilePath &path); + private: Utils::Wizard *runWizardImpl(const Utils::FilePath &path, QWidget *parent, Utils::Id platform, const QVariantMap &variables, bool showWizard = true) override; diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index 6cb94efb35b..a2094a0d423 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -609,8 +609,7 @@ void StudioWelcomePlugin::extensionsInitialized() // Enable QDS new project dialog and QDS wizards if (Core::ICore::isQtDesignStudio()) { - ProjectExplorer::JsonWizardFactory::clearWizardPaths(); - ProjectExplorer::JsonWizardFactory::addWizardPath( + ProjectExplorer::JsonWizardFactory::setInstalledWizardsPath( Core::ICore::resourcePath("qmldesigner/studio_templates")); Core::ICore::setNewDialogFactory([](QWidget *parent) { return new QdsNewDialog(parent); }); From 315e08a68482a67d7d6d76f8fd5aaf7a750acb2a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 1 Jul 2024 10:38:17 +0200 Subject: [PATCH 04/22] Core: Fix painting custom delegate Fixes: QTCREATORBUG-30775 Change-Id: I553f6e095353765756597fe2d6014fe7a2fa8046 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/locator/locatorsettingspage.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/plugins/coreplugin/locator/locatorsettingspage.cpp b/src/plugins/coreplugin/locator/locatorsettingspage.cpp index 4eeeb1a0ac3..dffe60501c4 100644 --- a/src/plugins/coreplugin/locator/locatorsettingspage.cpp +++ b/src/plugins/coreplugin/locator/locatorsettingspage.cpp @@ -214,21 +214,13 @@ void RichTextDelegate::paint(QPainter *painter, m_doc.setHtml(options.text); m_doc.setTextWidth(options.rect.width()); options.text = ""; - options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter); + options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter, options.widget); painter->translate(options.rect.left(), options.rect.top()); QRect clip(0, 0, options.rect.width(), options.rect.height()); QAbstractTextDocumentLayout::PaintContext paintContext; paintContext.palette = options.palette; painter->setClipRect(clip); paintContext.clip = clip; - if (qobject_cast(options.widget)->selectionModel()->isSelected(index)) { - QAbstractTextDocumentLayout::Selection selection; - selection.cursor = QTextCursor(&m_doc); - selection.cursor.select(QTextCursor::Document); - selection.format.setBackground(options.palette.brush(QPalette::Highlight)); - selection.format.setForeground(options.palette.brush(QPalette::HighlightedText)); - paintContext.selections << selection; - } m_doc.documentLayout()->draw(painter, paintContext); painter->restore(); } From 2ef07ef02d962ff3e25f6827d4928e24621d78b5 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 25 Jun 2024 15:22:38 +0200 Subject: [PATCH 05/22] LanguageClient: show number of children in call and type hierarchy Change-Id: Ia4b0d651992d6a17b1adb73624eb8cec4de2f7e9 Reviewed-by: Christian Stenger --- src/plugins/languageclient/callandtypehierarchy.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/plugins/languageclient/callandtypehierarchy.cpp b/src/plugins/languageclient/callandtypehierarchy.cpp index 8cfc3578c37..4b8f7117132 100644 --- a/src/plugins/languageclient/callandtypehierarchy.cpp +++ b/src/plugins/languageclient/callandtypehierarchy.cpp @@ -66,10 +66,14 @@ protected: return QVariant::fromValue( Link(m_client->serverUriToHostPath(m_item.uri()), start.line() + 1, start.character())); } - case AnnotationRole: + case AnnotationRole: { + QStringList result; if (const std::optional detail = m_item.detail()) - return *detail; - return {}; + result << *detail; + if (childCount() > 0) + result << QString("[%1]").arg(childCount()); + return result.isEmpty() ? QVariant() : QVariant(result.join(' ')); + } default: return TreeItem::data(column, role); } From e8c32fe472d90f25304a90aab1b1e08f756ec205 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 27 Jun 2024 13:36:26 +0200 Subject: [PATCH 06/22] Doc: Omit "native" when discussing debuggers Also avoid talking about "debugger plugin". Change-Id: Iba60f8ad9c655812b6a48e38c1523ddce4f8dcb6 Reviewed-by: hjk --- .../creator-only/creator-debugger-setup.qdoc | 12 +++--- .../creator-only/creator-debugger.qdoc | 42 +++++++++---------- .../howto/creator-only/creator-how-tos.qdoc | 3 +- .../src/howto/creator-only/qtcreator-faq.qdoc | 2 +- .../creator-only/creator-overview.qdoc | 8 ++-- .../creator-only/creator-reference.qdoc | 2 +- .../creator-projects-debuggers.qdoc | 7 ++-- .../python/creator-python-development.qdoc | 2 +- 8 files changed, 37 insertions(+), 41 deletions(-) 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 c726d15e601..a6bc84a87b0 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger-setup.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger-setup.qdoc @@ -14,11 +14,11 @@ \ingroup creator-reference-debugger - \title Supported Native Debuggers + \title Supported Debuggers \brief Summary of supported debugger versions. - \QC supports native debuggers for debugging compiled code. + You can use \QC to debug compiled code. On most supported platforms, you can use the GNU Symbolic Debugger (GDB). On Microsoft Windows, when using the Microsoft toolchain, you need the Microsoft Console Debugger (CDB). On \macos and Linux, you can use the LLDB @@ -34,7 +34,7 @@ \header \li Platform \li Compiler - \li Native Debugger + \li Debugger \row \li Linux \li GCC, ICC @@ -57,9 +57,9 @@ \li Debugging Tools for Windows/CDB \endtable - The debugger plugin automatically selects a suitable native debugger for + \QC automatically selects a suitable debugger for each \l{Kits}{kit} from the ones found on the computer. The automatic - setup fails if the native debugger is not installed on the computer or + setup fails if the debugger is not installed on the computer or if \QC does not support the installed version. \section1 GDB Versions @@ -123,7 +123,7 @@ {Mac OS X Debugging Magic}. \section1 LLDB Versions - The LLDB native debugger has similar functionality to the GDB debugger. LLDB + The LLDB debugger has similar functionality to the GDB debugger. LLDB is the default debugger in Xcode on \macos for C++ on the desktop. LLDB is typically used with the Clang compiler (even though you can use it with GCC, too). diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc index 25c127aa413..cdfc9ac8fb5 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc @@ -14,8 +14,7 @@ \title Debugging - The \QC debugger plugin acts as an interface between the \QC - core and external native debuggers that you can use to: + You can use debuggers to: \list \li Debug executable binary files - GNU Symbolic Debugger (GDB), @@ -28,7 +27,7 @@ \section1 Setting Up the Debugger - The debugger plugin automatically selects a suitable native debugger for + \QC automatically selects a suitable debugger for each \l{Kits}{kit} from the ones found on your system. You can select another kit. To specify the debugger and compiler to use for each kit, go to \preferences > \uicontrol Kits. @@ -36,7 +35,7 @@ \image qtcreator-kits.png {Kits preferences} You need to set up the debugger only if the automatic setup fails because - the native debugger is missing (for example, you must install the CDB + the debugger is missing (for example, you must install the CDB debugger on Windows yourself) or because \QC does not support the installed version. For example, when your system does not have GDB installed or the installed version is outdated, and you want to use a locally @@ -58,11 +57,11 @@ Optionally, you can set up the Microsoft Symbol Server if you need symbol information from Microsoft modules that is not found locally. - For more information, see \l{Supported Native Debuggers} and \l{CDB Paths}. + For more information, see \l{Supported Debuggers} and \l{CDB Paths}. \section1 Launching the Debugger - The debugger plugin can run the native debuggers in various operating modes + The debuggers run in various operating modes depending on where and how you start and run the debugged process. Some of the modes are only available for a particular operating system or platform: @@ -93,9 +92,8 @@ \section2 GDB Run Modes - The GDB native debugger used internally by the debugger plugin runs in - different modes to cope with the variety of supported platforms and - environments: + The GDB debugger runs in different modes to cope with the variety of + supported platforms and environments: \list \li \e{Plain mode} debugs locally started processes that do not need @@ -770,7 +768,7 @@ The log view acts as a console, so you can send the contents of the line under the text cursor in the log directly to the - native debugger. + debugger. \li \l{Troubleshooting Debugger} \l {Debugger Log} @@ -865,9 +863,9 @@ \title Examine complex values in Debug views - \QC displays the raw information from the native debuggers in a clear and + \QC displays the raw information from the debuggers in a clear and concise manner to simplify the debugging process without losing the power - of the native debuggers. + of the debuggers. \image qtcreator-locals.png {Locals view} @@ -1150,8 +1148,8 @@ \brief View information about the modules included in a debugged application. - The \uicontrol Modules view displays information that the debugger plugin - has about modules included in the application that is being debugged. + The \uicontrol Modules view displays information about modules included in + the application that is being debugged. A module is: @@ -1389,13 +1387,13 @@ \li Set \l{Debugger}{debugger preferences}. \endlist - \section1 Directly Interacting with Native Debuggers + \section1 Directly Interacting with Debuggers You can use the left pane of the \uicontrol {Debugger Log} view to directly - interact with the command line of the native debugger. + interact with the command line of the debugger. Press \key {Ctrl+Enter} to send the contents of the line under the - text cursor to the native debugger. Or, enter the command in the + text cursor to the debugger. Or, enter the command in the \uicontrol Command field. The right side pane of the \uicontrol {Debugger Log} view shows the command output. @@ -1464,7 +1462,7 @@ \brief Load, customize, and add debugging helpers. \QC uses Python scripts to translate raw memory contents and type information - data from native debugger backends (GDB, LLDB, and CDB are currently supported) + data from debugger backends (GDB, LLDB, and CDB are currently supported) into the form presented to the user in the \l {Local Variables and Function Parameters}{Locals} and \l {Evaluating Expressions}{Expressions} views. @@ -1520,7 +1518,7 @@ of Qt, or of your own library, at the same time. To add debugging helpers for custom types, add debugging helper - implementations to the startup file of the native debuggers (for example, + implementations to the startup file of the debuggers (for example, \c{~/.gdbinit} or \c{~/.lldbinit}) or specify them directly in the \uicontrol {Additional Startup Commands} in \preferences > \uicontrol Debugger > \uicontrol GDB. @@ -1733,7 +1731,7 @@ \endcode \li \c{putCallItem(self, name, rettype, value, func, *args)} - Uses the - native debugger backend to place the function call \c func returning + debugger backend to place the function call \c func returning \c rettype on the value specified by \a {value} and to output the resulting item. @@ -1880,7 +1878,7 @@ an integral or floating point type. Type objects, that is, instances of the \c{Dumper.Type} class, can be - created by native debugger backends, usually by evaluating Debug Information + created by debugger backends, usually by evaluating Debug Information built into or shipped alongside the debugged binary, or created on-the-fly by the debugging helper. @@ -2110,7 +2108,7 @@ \l {Run on many platforms}{build and run kit selector} picked a runnable target and you can run the application. - \li Make sure the debugger is \l{Supported Native Debuggers}{set up properly}. + \li Make sure the debugger is \l{Supported Debuggers}{set up properly}. \li In the \uicontrol Debug mode, go to \uicontrol View > \uicontrol Views > \uicontrol {Debugger Log} to open the 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 baf079c08f3..d31fe7a97bd 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -66,8 +66,7 @@ \section1 Debug - Use native debuggers to inspect the state of your application while - debugging. + Use debuggers to inspect the state of your application while it is running. \generatelist creator-how-to-debug diff --git a/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc b/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc index 8685f850ce4..a67a8fb7657 100644 --- a/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc +++ b/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc @@ -143,7 +143,7 @@ You must use Python version 2.6 or 2.7. - For more information, see \l{Supported Native Debuggers}. + For more information, see \l{Supported Debuggers}. \b {How do I generate a core file in \QC?} diff --git a/doc/qtcreator/src/overview/creator-only/creator-overview.qdoc b/doc/qtcreator/src/overview/creator-only/creator-overview.qdoc index d7afb4ee549..1efaf8238d8 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-overview.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-overview.qdoc @@ -266,10 +266,10 @@ to find the next one. \endlist - \QC integrates several native debuggers for inspecting the state of - your application while debugging. The debugger plugin automatically selects - a suitable native debugger for each kit from the ones it finds on the - computer. Edit the kits to override this choice. + \QC integrates several debuggers for inspecting the state of your + application. It automatically selects a suitable debugger for each + kit from the ones it finds on the computer. Edit the kits to override + this choice. If you install \QC with \QOI, the GNU Symbolic Debugger is installed automatically and you should be ready to start debugging after you create diff --git a/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc b/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc index 7415815ff02..6f2ed53a14e 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc @@ -21,7 +21,7 @@ \section1 Debuggers - Set up and use native debuggers to debug executable binary files, as well as + Set up and use debuggers to debug executable binary files, as well as QML, Java, and Python source code. \annotatedlist creator-reference-debugger 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 a99de7c59ab..8720339ca6a 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-debuggers.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-debuggers.qdoc @@ -15,12 +15,11 @@ \title Add debuggers - The \QC debugger plugin acts as an interface between the \QC core and - external native debuggers such as the GNU Symbolic Debugger (GDB), + You can use debuggers, such as the GNU Symbolic Debugger (GDB), the Microsoft Console Debugger (CDB), a QML/JavaScript debugger, and the debugger of the low level virtual machine (LLVM) project, LLDB. - The debugger plugin automatically selects a suitable native debugger for + \QC automatically selects a suitable debugger for each \l{Kits}{kit} from the ones found on your system. To override this choice, select \preferences > \uicontrol Kits. @@ -75,6 +74,6 @@ The debugger disappears from the list when you select \uicontrol Apply. Until then, you can cancel the deletion by clicking \uicontrol Restore. - \sa {Debugging}, {Debuggers}, {Debugger}, {Supported Native Debuggers}, + \sa {Debugging}, {Debuggers}, {Debugger}, {Supported Debuggers}, {Troubleshooting Debugger} */ diff --git a/doc/qtcreator/src/python/creator-python-development.qdoc b/doc/qtcreator/src/python/creator-python-development.qdoc index ba8053c3d3d..10f054dcdab 100644 --- a/doc/qtcreator/src/python/creator-python-development.qdoc +++ b/doc/qtcreator/src/python/creator-python-development.qdoc @@ -26,7 +26,7 @@ \li \l{Run Python applications} \li \l{Python Run Settings} \li \l{PDB versions} - \li \l{Supported Native Debuggers} + \li \l{Supported Debuggers} \endlist For more information about developing with Qt for Python, including From b6f253548f1941e7e40cbc56f220067859036d31 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 27 Jun 2024 12:00:23 +0200 Subject: [PATCH 07/22] Doc: Describe the "Use SSH port forwarding for debugging" option ... in Preferences > Devices for a Remote Linux Device. Add links between developing for remote Linux and debugging remotely with GDB. Task-number: QTCREATORBUG-30604 Change-Id: I149447ce5e30409452c203fecc41417822a3d8b2 Reviewed-by: hjk --- dist/changelog/changes-14.0.0.md | 3 ++- ...ator-preferences-devices-remote-linux.webp | Bin 12926 -> 13396 bytes .../creator-only/creator-debugger.qdoc | 20 ++++++++++++++++-- ...tor-projects-how-to-run-generic-linux.qdoc | 3 ++- doc/qtcreator/src/linux-mobile/linuxdev.qdoc | 2 +- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md index 7fe40fd9554..97fe1bb68dd 100644 --- a/dist/changelog/changes-14.0.0.md +++ b/dist/changelog/changes-14.0.0.md @@ -291,7 +291,8 @@ Platforms ### Remote Linux -* Added the option to use SSH port forwarding for debugging +* Added the `Use SSH port forwarding for debugging` option in `Preferences` > + `Devices` for a `Remote Linux Device` * Improved the performance of the generic deployment method * Fixed that the file size check that is performed before parsing C++ files could freeze Qt Creator until finished for remote projects diff --git a/doc/qtcreator/images/qtcreator-preferences-devices-remote-linux.webp b/doc/qtcreator/images/qtcreator-preferences-devices-remote-linux.webp index 4b97b88b7a26c75a003c71da285857905bd85896..565d63ad6dfc6dfb75e99c2c0586cf3202f8bf5d 100644 GIT binary patch literal 13396 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 literal 12926 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 h|H1Mf|LmTy-F$9w>fVMUbEj1Ok4$4Z9 \uicontrol Devices. + \image qtcreator-preferences-devices-remote-linux.webp {Remote Linux device preferences} + \li In \uicontrol Device, select \uicontrol {Remote Linux Device}. + \li Select \uicontrol {Use SSH port forwarding for debugging}. + \li Select \uicontrol OK. + \endlist + + \sa {Debug}{How To: Debug}, {Remote Linux}{How To: Develop for remote Linux}, + {GDB}, {Debugging}, {Debuggers}, {Debugger}, {Kits} */ /*! diff --git a/doc/qtcreator/src/linux-mobile/creator-projects-how-to-run-generic-linux.qdoc b/doc/qtcreator/src/linux-mobile/creator-projects-how-to-run-generic-linux.qdoc index 241b0ce2f34..aeb17305cf8 100644 --- a/doc/qtcreator/src/linux-mobile/creator-projects-how-to-run-generic-linux.qdoc +++ b/doc/qtcreator/src/linux-mobile/creator-projects-how-to-run-generic-linux.qdoc @@ -35,5 +35,6 @@ it is compatible with the GDB on the host. \sa {Remote Linux}{How To: Develop for remote Linux}, - {Run on many platforms}, {Compilers}, {Embedded Platforms}, {Kits} + {Debug remotely with GDB}, {Run on many platforms}, {Compilers}, + {Embedded Platforms}, {Kits} */ diff --git a/doc/qtcreator/src/linux-mobile/linuxdev.qdoc b/doc/qtcreator/src/linux-mobile/linuxdev.qdoc index e0ec120b85b..6691ca4b2c4 100644 --- a/doc/qtcreator/src/linux-mobile/linuxdev.qdoc +++ b/doc/qtcreator/src/linux-mobile/linuxdev.qdoc @@ -138,6 +138,6 @@ \include qtcreator-add-linux-device.qdocinc {add linux device} {Remote Linux Device} \sa {Remote Linux}{How To: Develop for remote Linux}, - {Developing for Remote Linux Devices}, + {Debug remotely with GDB}, {Developing for Remote Linux Devices}, {Remote Linux Deploy Configuration} */ From ab493600ee0d2da3305902c74ba880fad1c1ab7e Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 27 Jun 2024 16:04:46 +0200 Subject: [PATCH 08/22] Lua: Fix meta name Change-Id: I81a70bc8a010a53e9a741e7dea0710e8b2525205 Reviewed-by: Eike Ziller --- src/plugins/lua/meta/gui.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/lua/meta/gui.lua b/src/plugins/lua/meta/gui.lua index 71f9f20cf65..ac3df927809 100644 --- a/src/plugins/lua/meta/gui.lua +++ b/src/plugins/lua/meta/gui.lua @@ -1,4 +1,4 @@ ----@meta Layout +---@meta Gui local gui = {} From 7fb28d6bdcb04cb89293ec7271cc0defef7452a8 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 27 Jun 2024 23:09:22 +0200 Subject: [PATCH 09/22] Mode icons: Update Welcome, Edit, Project and Build icons - New house/Welcome - Pen/Design points to bottom left - New wrench/project without circle - New hammer/build with attached handle and rotated 45 degrees Task-number: QTCREATORBUG-31080 Change-Id: I97499ead9e097d523c36d9b08a4b65240e3a5042 Reviewed-by: hjk --- .../coreplugin/images/mode_design_mask.png | Bin 287 -> 291 bytes .../coreplugin/images/mode_design_mask@2x.png | Bin 538 -> 540 bytes .../images/build_hammer_mask.png | Bin 294 -> 300 bytes .../images/build_hammer_mask@2x.png | Bin 611 -> 501 bytes .../images/mode_project_mask.png | Bin 359 -> 321 bytes .../images/mode_project_mask@2x.png | Bin 760 -> 594 bytes .../welcome/images/mode_welcome_mask.png | Bin 191 -> 179 bytes .../welcome/images/mode_welcome_mask@2x.png | Bin 285 -> 273 bytes src/tools/icons/qtcreatoricons.svg | 128 ++++++++++-------- 9 files changed, 69 insertions(+), 59 deletions(-) diff --git a/src/plugins/coreplugin/images/mode_design_mask.png b/src/plugins/coreplugin/images/mode_design_mask.png index c2a82ef8914303263eae86110f538ba3f1ff3e0d..2cd54a4c0c49036f7f1bf6dbfa98f9763c5c0a50 100644 GIT binary patch delta 264 zcmbQww3umvO8qNO7sn8b({C@YUd0qBa_r;(W8OEj0({g8AMH6h=kZ(5mV+h<29amd zc7JV<>1jGDF3@7=C!GI)`^2VQ>D&5Z!~eCG{uG-ORdaIolPzAVvTd4AW~inKrF2a; z_U(x|7V1{N%<#m{^^Je_XYyQf-8$Xzj?JWim%SZF&MJR=={oOUeJ9f=W%e-7BHdMM z+5dPkq*xzUnfbu8(Nr}uXzo0ny?11uwHsZSVwU{+0{5%x>0S#ZbEoW!@a%5vuAY$V ze|dYJdB~N5@5TNLccp88Y`nFA&(*%B=p`G2#pKtQJ=y$psuKB7+UsdCp>bCY; zwyKg>=P_25Nuhb$9aZ!c7T+_qUP&B_zge*IZBvHGTrb%VO%g!l1N7?{{LhJSiA;n9)CxlT&S{7OPWG5Xv+ zS0!qD_Mh!C@oW>@q!itDd&@Z$-MHUI$345li%w1!^LqVDa^Zy6@Ba5H`Tt`5VIy$J Sa0dee1B0ilpUXO@geCy-k#}AI diff --git a/src/plugins/coreplugin/images/mode_design_mask@2x.png b/src/plugins/coreplugin/images/mode_design_mask@2x.png index 9a060d749836c09286c8c94cb8b9eb51741ff9c7..a52d6274f0c6f1394989b02ec52f954516f6162c 100644 GIT binary patch delta 514 zcmbQmGKXb?O8sL`7srr@!*4I!X5S7FIredXYBsmUmX44K{u30P_c?eSaK8OOSFrVw z=7hV>#ua|Yd)~gdQeq(aS~I0vq+oN!+eZ!u_aDK#@9+Fj zDGF!To9+;@|1jHyjH4gxmhHZ&_eb#RdZRWarK10-+z(d&Q0BZ)m*lhiHA9Zwk80)3 z0v1}mk5;W+pPQ@j&x3!#I-a@A9FyfA^*{NgzW85m)h8!=clG@)(;UuuKVEU>pr5^X zBv<9x{laQ9cN}YU**kM`L_^Q@XD!C)7@L delta 512 zcmbQkGK*z`O8rAm7srr@!*8z{dMi6h9Q#;rwoF(_-BJ7xiv<-%(O0$XB-cf?x2A%8p9EW?UB2y2N-O5JOuuh!pH6d66myWAv3t_;_p2v|e78HXgGuJBr0b;H zCZQ`IH+sn4*zYAe@#04&2JQ259xN=2dnPU0^~E7Y)@+KEdz*Qm;!VBPQ` zMWo?D$dipccPbS2XCE*>sWGwsgyM$BjUL<)zAj~#a(AnLVlepPa7^?;m#P!c$rK`eH==vSv{Z9p^~_t(vlg#+&N)5t?wW&l*a#GN6*hSo%?X#g~`&zEZKR=!*7Y a?OT67IC=K+?QaYW3=E#GelF{r5}E)GM)EfR diff --git a/src/plugins/projectexplorer/images/build_hammer_mask.png b/src/plugins/projectexplorer/images/build_hammer_mask.png index c30f933962a306041d2306217643f7a4d84b8228..e75c3e15cff86f07f755ff94d2d789b2fcbfb685 100644 GIT binary patch delta 273 zcmZ3+w1#PdO8sX~7sn8b)5$;l1q^tqRqOkGPkL+5`^~z1Qn6drSUB4=`l8#`}^{A$1j)uzZT+ocfavp(@KZ1rX@@-%1^JH;n=?D(f|MV zX9zYdV~X~1cZz-WlR3QV=fNWtT)VkiG_82fE#I)pL1U-l$pamstdsilUKqLmSC~>( g-#3Mao58T|&wK%ijn^3%xEL5bUHx3vIVCg!0FMZFtpET3 delta 267 zcmZ3(w2WzjO8r|;7sn8b)5$;l1q^tKRsS!OHZ+L5`uFJKC6gN)r#3epe8So_2rlDtRr$ z@W&(WyH0G!t7UqQf7IA{?o^H93`M?pnM$LScgYVbyWCHTu^oK=i)U>`(y!@Ohg)9q zblv}`@iO&71?v~VeP5K0ZCKlIkTHJJujA(hn7#2}H1_n=8KNpsDP6#5X44-u|ymtq$!P*CTZK4FE&n$H?}{l(Ust(%)tmfudYubh`&XKj5# zUnfb$E$KZVxbDU+c6VyCuE zowMvuxHY@`vG&_vy)vxTH5)pEQuq9}wNkCwAewr$ewR=7l#aWF!3;ZBUE(%~-*z`i zS=A^<&8sAdSETvIZqJ6D0!JA%moZ9Q)xPMl@qT}d+vgDdD)yuDhJNIk!yebdL&k$UySTrd_!pbGNW5>z` z3mvz#b=;n3ZY}4`Gtqr>v(*)YKkp-?xsKf9Q2PGW@~!@@c->`hdl^1W+VD2iweb$) zxt*c1U1hr(zqC#jblJwRi|g6m6%)3*G8|vT7wV_g)w|GZ&H5SAr}CfYu5Q0}vt9mv lvUgm~_Wp?yKh;lIuaN&z^z!z`Fa`z&22WQ%mvv4FO#t4X+=&1H delta 587 zcmey${Fr5eay^rlr;B4q#NoHs{5>Wo${hIkez&Ep;*4htb+p1ovMM@G@QJE9$?+)d zW?4Jes^!U-6i;zZ%@3D4Rs?%YVA-fA$EC!|`6@`{#IN?INe?on|C5`W|Dyo^Pjip5I>l(YPy6=YWV}DG{-LUA(2fU-w`lz; z_F6JMK1^es(>x0X(dcbIc`yGvCFhyX{=moU(nAG?eFc}qB0Jd_R`l+T{cRM%dEnRT z%G<`CGN%6nzdv}s@8!g=qW*7;`peFB*yNf0wtJm$y8jx3K*u@{#k6mazX{HMVFf675%XN{_DfqN6+K_FZDBvtzw1SU9OpDArtlV=dvZ?oZAPKkioYuA4Q)L_l`q-X{XHS8 zdWqLWv}>)y?A0z@Qx7=rOe}KmT=VO|%h_w$T@L-4nQPy0|4EEs{&0tP(ws`=45Q+k5^9tCddoX^N2(f=T1)2z;e$*)ai z**3QCm}2uRHRI?1!;>A~eEQ$+zCl|vouh5l4xM8aQmciS+noQaJBJt;q$GtZ9r*CC zp1=8#^8zkjHt#iFDw6a5{LeVIK;zhh%88D$tA)hdbpQXaH%PBf`0!`ryo0Q>C&`QP zOm%pb{C$c1|5!<@jT($UpIS}1dqm-fTrlU6?bo%0(znbs>KqE3RgC0 z?mT)(M6)B7^^Wf42nh+Ldie+bySG1=mo$_VV~AV-~8 delta 332 zcmX@e^qgseO1++^i(`nz>8F?XdpRXa9RH}#nf@^$w%Lp86)%V5_W)-#-Sp09S9W`x z*(ANfHH2r;*|LonW0W(pbaX8qyZyqBOwbe%s7+A-)j@n+Zs}!*HnMGXoah%_;bHWU+k*tr?Bz;HTXDri;Cy; z*9AExZdGzhxm?_yQpXZrFJ0u?=hyM3P|MS*<;Z6<|5d?!6MfYtEs<4V{4O<_Q*io9 zm6=Km((+Y@w+cOG6xcl}&hv(lB)`Txxn33TMYU2-nTS+T>N?TEq|isE&oEh znBQVqZqdu-&Lxy==80o&cYXarVzotjw}SU&E4P_iPhLHKSrT*J@oYr+s`>w-R+iLX qO*&`&bj|Cu({q2??{cfIVbXtmdu4hu+eHQj1_n=8KbLh*2~7Z^J(;8c diff --git a/src/plugins/projectexplorer/images/mode_project_mask@2x.png b/src/plugins/projectexplorer/images/mode_project_mask@2x.png index 79d0e7a5488f53d953102d8dd051dc19d21ef845..30a39506c44b8df241a09d520d4585e0111098f8 100644 GIT binary patch delta 569 zcmeytdWmI%O1-3~i(^Q{;kQ?9GejIEj(z;UwqU`rjLfI4rW{G4Ey9n&b8N1-icIb9 zcqqkcEvS>*qWmB{z(m7I=Ze~lpw3g7DoboRRtP8_;}psj5#j!-_dROO>gr;F`*W9U zxUqb;X5E>0`#$SzVo`JrQgQv4pYp0~<%Z1#kA6v)Kly03sHDGsr{d+?okyk19OrGj zJcXI>#9Qsh&aYs^r&y z2^Ne&(cE*k^hD`b=zlq(apB*}s|~VMPhv_Y>`6UfZMsQ(hrZH%hOWY9Mbk^1d%7lk zl0VGsw|XL9LYRxx&Vn;ehxgZW$b=|cCb+qzEaF`d!}8&*@PY+y+ZY}mm&xyb*O#Bd zVzI`pkLmgn&yT$)Dj!Udl4M}&)ZQmJQSQMysg(>j_4kVlzgEb1Su%^UM~w6Nm)b2k zHUAWqF5O^$bIC6!W6GPi-VEobcw~sY-EIGZ(e_ldjQO*DZoB3Cnb*v`sA#x2tX^q% z{sJS@SlL(6j1$(r@Y2i^nLT?}Xn)DsZ4)kj4GQn)mXK|>FO|KW^yB>cZ@FLp_O_o& z{(NfDyjcE%C2C4vlNoky|FnJsOIz=mtv1~gmw4E|Pl`AptA5yt>%hMwZLK9t>xHGo zE{XoD5tb4wVvDFNHu6Y|=!o=Pb6r-jazdezL6lmVijDVo_DB|`XK$YI9^6|QDe`EN gi04F+!qfU@lkYzb@LXNaz`(%Z>FVdQ&MBb@0GTfa8vpj)TeJZ$r$|R*f>W-uh-;6u@OG)-1HBO< z*IJh6DJH~xn#543x@`rc>5m`ECTdd-F)^zo-QkqD#I?>L)7w(-RC3g*z1xqp8qN)U ze&&vTc~$x|nJ4-tmpr6AmH(@4vb`A_JZ^%ds0!nZVy^^P3sq}XP8r|uVgfxbBmOsx0JyOmSaXq^5*q%E-t?qPj@k1;+vv% z|7dxFPMyHS4a_gDxNqZbO!s>5sj=`=PKe7Mhr$r?kBm1@)%{u{VW6rc9hML!{*vw0 z)PJ8Pf;YWa8|G@R$5=<@QcuYG7AV@^6UV&kci-{3kLul(lU%eBGPY%E@#uvc*Z*oNH$;oSWPBymbN^%TownJz^|#x< zUwd?`YyQSW*0eAD34#V%O3dyOj~M;xU&=eYWSEmUakaaIqV1(>=-8a~hNt{#jp_a}#0@f9vpXSK+A{3@bQPyd_tQGu)fy z8RyH;xAQRb{5K4_&n{)CI)v3b?c@2H#uVc2qxMCMLFOKBYJcS$hLG7lFO()uyP>!7 zT3_T3=7j+V{_nUZ)xE_vNTcZ96IJb^PxqIG<*nTwCB%7p?|e=1I_Es{&0tP(ws?ufx0iRUoH7fq&wo?t?BC%tK#Fljr!ZuBq z?fCdoX)IeGr^S>S@8pDzzfB7arz*T;o87iDg>#d%Lta$V!WQPE>JIY@6EqSXKHD|< zbE}&1BqTJub25uO2yHqhbHwWcW1En4iKv;fhItYbgUpNPegYSA)=yzzU|{fc^>bP0 Hl+XkK(sVg* delta 163 zcmdnYxSw%?N`0HBi(`nz>Es{&0tP(Qs_G>reh)%F?VU5Tv2o`c>pWF;lg3XDp|jKr zG#Dip7QOiYe{vL$PiFi^O-3oksf;T_?K&2+q_MCpkYEW;YJBB2fsfln)ofQro$bQx z=7(a^(kY@IHZ4MIBL9^?22ADPa1eC$Vw>!GC7_9GgT_Y3P?<#IrXpoA28NU)U+S!v T$QE|w!r-x-x*v=mtRk>b?wMVM2)ouI{8M9Wmks)Hww3pj9PZZMF z|C*P>-v0IK3C_!scPH;oK2hbOwcmM9&Xd{|%${z~^pk51j|e#Hxy - - - - + + + + + - - - + + + + - - - - - - + + + + + + - - - - + Date: Fri, 28 Jun 2024 15:44:41 +0200 Subject: [PATCH 10/22] ExtensionManager: Make remote repo access optional Off by default. Change-Id: Ib27fa134f095be7c923cc4ce41ef4e2f6ec01ff0 Reviewed-by: hjk --- src/plugins/extensionmanager/CMakeLists.txt | 2 + .../extensionmanager/extensionmanager.qbs | 2 + .../extensionmanagersettings.cpp | 59 +++++++++++++++++++ .../extensionmanagersettings.h | 21 +++++++ .../extensionmanager/extensionsbrowser.cpp | 11 +++- 5 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 src/plugins/extensionmanager/extensionmanagersettings.cpp create mode 100644 src/plugins/extensionmanager/extensionmanagersettings.h diff --git a/src/plugins/extensionmanager/CMakeLists.txt b/src/plugins/extensionmanager/CMakeLists.txt index 094c1eb7d91..56236df9fb7 100644 --- a/src/plugins/extensionmanager/CMakeLists.txt +++ b/src/plugins/extensionmanager/CMakeLists.txt @@ -5,6 +5,8 @@ add_qtc_plugin(ExtensionManager extensionmanagerconstants.h extensionmanagerplugin.cpp extensionmanagertr.h + extensionmanagersettings.cpp + extensionmanagersettings.h extensionmanagerwidget.cpp extensionmanagerwidget.h extensionsbrowser.cpp diff --git a/src/plugins/extensionmanager/extensionmanager.qbs b/src/plugins/extensionmanager/extensionmanager.qbs index 0d5fa5cb259..994d75f7366 100644 --- a/src/plugins/extensionmanager/extensionmanager.qbs +++ b/src/plugins/extensionmanager/extensionmanager.qbs @@ -13,6 +13,8 @@ QtcPlugin { "extensionmanagerconstants.h", "extensionmanagerplugin.cpp", "extensionmanagertr.h", + "extensionmanagersettings.cpp", + "extensionmanagersettings.h", "extensionmanagerwidget.cpp", "extensionmanagerwidget.h", "extensionsbrowser.cpp", diff --git a/src/plugins/extensionmanager/extensionmanagersettings.cpp b/src/plugins/extensionmanager/extensionmanagersettings.cpp new file mode 100644 index 00000000000..54f4920181c --- /dev/null +++ b/src/plugins/extensionmanager/extensionmanagersettings.cpp @@ -0,0 +1,59 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "extensionmanagersettings.h" +#include "extensionmanagertr.h" + +#include +#include + +#include + +namespace ExtensionManager::Internal { + +ExtensionManagerSettings &settings() +{ + static ExtensionManagerSettings theExtensionManagerSettings; + return theExtensionManagerSettings; +} + +ExtensionManagerSettings::ExtensionManagerSettings() +{ + setAutoApply(false); + setSettingsGroup("ExtensionManager"); + + externalRepoUrl.setDefaultValue("https://qc-extensions.qt.io"); + externalRepoUrl.setReadOnly(true); + + useExternalRepo.setSettingsKey("UseExternalRepo"); + useExternalRepo.setLabelText(Tr::tr("Use external repository")); + useExternalRepo.setToolTip(Tr::tr("Repository: %1").arg(externalRepoUrl())); + useExternalRepo.setDefaultValue(false); + + setLayouter([this] { + using namespace Layouting; + + return Column { + useExternalRepo, + st + }; + }); + + readSettings(); +} + +class ExtensionManagerSettingsPage : public Core::IOptionsPage +{ +public: + ExtensionManagerSettingsPage() + { + setId("ExtensionManager"); + setDisplayName(Tr::tr("Extensions")); + setCategory(Core::Constants::SETTINGS_CATEGORY_CORE); + setSettingsProvider([] { return &settings(); }); + } +}; + +const ExtensionManagerSettingsPage settingsPage; + +} // ExtensionManager::Internal diff --git a/src/plugins/extensionmanager/extensionmanagersettings.h b/src/plugins/extensionmanager/extensionmanagersettings.h new file mode 100644 index 00000000000..ed6b2f2aec4 --- /dev/null +++ b/src/plugins/extensionmanager/extensionmanagersettings.h @@ -0,0 +1,21 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include + +namespace ExtensionManager::Internal { + +class ExtensionManagerSettings final : public Utils::AspectContainer +{ +public: + ExtensionManagerSettings(); + + Utils::StringAspect externalRepoUrl{this}; + Utils::BoolAspect useExternalRepo{this}; +}; + +ExtensionManagerSettings &settings(); + +} // ExtensionManager::Internal diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index da757c0bbfb..c90d2bb59a1 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -5,7 +5,7 @@ #include "extensionmanagertr.h" #include "extensionsmodel.h" -#include "utils/hostosinfo.h" +#include "extensionmanagersettings.h" #ifdef WITH_TESTS #include "extensionmanager_test.h" @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -399,14 +400,18 @@ void ExtensionsBrowser::fetchExtensions() // d->model->setExtensionsJson(testData("defaultpacks")); return; #endif // WITH_TESTS + if (!settings().useExternalRepo()) { + d->model->setExtensionsJson({}); + return; + } + using namespace Tasking; const auto onQuerySetup = [this](NetworkQuery &query) { - const QString host = "https://qc-extensions.qt.io"; const QString url = "%1/api/v1/search?request="; const QString requestTemplate = R"({"version":"%1","host_os":"%2","host_os_version":"%3","host_architecture":"%4","page_size":200})"; - const QString request = url.arg(host) + requestTemplate + const QString request = url.arg(settings().externalRepoUrl()) + requestTemplate .arg(QCoreApplication::applicationVersion()) .arg(osTypeToString(HostOsInfo::hostOs())) .arg(QSysInfo::productVersion()) From d635151c0b7463851022f34daa02cde6ab9d0533 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 1 Jul 2024 15:57:25 +0200 Subject: [PATCH 11/22] Wizards: Bump default minimum Qt version for new QtQuick projects Fixes: QTCREATORBUG-31168 Change-Id: I5a4411bcce348c89151fc2a193f8d19dc00343ef Reviewed-by: Eike Ziller (cherry picked from commit 0142d59258586e85d306afabcde74d098b0f7c0f) --- .../templates/wizards/projects/qtquickapplication/wizard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickapplication/wizard.json index 2e885c2bb63..a41ee12e516 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/wizard.json @@ -87,7 +87,7 @@ { "trKey": "Qt 6.4", "value": "6.4" }, { "trKey": "Qt 6.5", "value": "6.5" } ], - "index": 1 + "index": 2 } } ] From 6cb0c69c436e5bd9a831297f838b3777dde24b84 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 11 Jun 2024 08:34:33 +0200 Subject: [PATCH 12/22] CplusPlus: Silence clang warning Silences a warning regarding ISO C++20 considering the overloaded operators as ambiguous. Change-Id: Ie27a8567899a91ab064a58694105af260addb74b Reviewed-by: hjk --- src/libs/3rdparty/cplusplus/AST.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index 3f48e192b93..085fff92bdb 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -99,8 +99,8 @@ public: iter = iter->next; return *this; } - bool operator==(const ListIterator &other) { return iter == other.iter; } - bool operator!=(const ListIterator &other) { return iter != other.iter; } + bool operator==(const ListIterator &other) const { return iter == other.iter; } + bool operator!=(const ListIterator &other) const { return iter != other.iter; } }; ListIterator begin() { return {this}; } ListIterator end() { return {nullptr}; } From 6d4e5a0002ff535380a3a5100c2ab294521ef5d2 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 1 Jul 2024 13:56:25 +0200 Subject: [PATCH 13/22] Cppcheck: Treat manual run settings as project settings Instead of always deriving from global settings store the settings for the manual run into the project settings. Fixes: QTCREATORBUG-31092 Change-Id: I7854cff4e71b58225c7e9c1198c4e60128ed07e4 Reviewed-by: hjk --- .../cppcheck/cppcheckmanualrundialog.cpp | 8 +-- .../cppcheck/cppcheckmanualrundialog.h | 8 +-- src/plugins/cppcheck/cppcheckplugin.cpp | 57 ++++++++++++++++++- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/src/plugins/cppcheck/cppcheckmanualrundialog.cpp b/src/plugins/cppcheck/cppcheckmanualrundialog.cpp index f5d5f687581..9ba540f50fd 100644 --- a/src/plugins/cppcheck/cppcheckmanualrundialog.cpp +++ b/src/plugins/cppcheck/cppcheckmanualrundialog.cpp @@ -19,10 +19,12 @@ namespace Cppcheck::Internal { -ManualRunDialog::ManualRunDialog(const ProjectExplorer::Project *project) +ManualRunDialog::ManualRunDialog(const ProjectExplorer::Project *project, + CppcheckSettings *settings) : m_model(new ProjectExplorer::SelectableFilesFromDirModel(this)) { QTC_ASSERT(project, return ); + QTC_ASSERT(settings, return); setWindowTitle(Tr::tr("Cppcheck Run Configuration")); @@ -52,9 +54,7 @@ ManualRunDialog::ManualRunDialog(const ProjectExplorer::Project *project) analyzeButton->setEnabled(m_model->hasCheckedFiles()); }); - m_manualRunSettings.readSettings(); - m_manualRunSettings.setAutoApply(true); - auto optionsWidget = m_manualRunSettings.layouter()().emerge(); + auto optionsWidget = settings->layouter()().emerge(); auto layout = new QVBoxLayout(this); layout->addWidget(optionsWidget); diff --git a/src/plugins/cppcheck/cppcheckmanualrundialog.h b/src/plugins/cppcheck/cppcheckmanualrundialog.h index fe5b920ee23..1f9c91e576a 100644 --- a/src/plugins/cppcheck/cppcheckmanualrundialog.h +++ b/src/plugins/cppcheck/cppcheckmanualrundialog.h @@ -3,8 +3,6 @@ #pragma once -#include "cppchecksettings.h" - #include namespace Utils { @@ -19,18 +17,18 @@ class SelectableFilesFromDirModel; namespace Cppcheck::Internal { +class CppcheckSettings; + class ManualRunDialog : public QDialog { public: - explicit ManualRunDialog(const ProjectExplorer::Project *project); + explicit ManualRunDialog(const ProjectExplorer::Project *project, CppcheckSettings *settings); Utils::FilePaths filePaths() const; QSize sizeHint() const override; - const CppcheckSettings &manualRunSettings() const { return m_manualRunSettings; } private: ProjectExplorer::SelectableFilesFromDirModel *m_model; - CppcheckSettings m_manualRunSettings; }; } // Cppcheck::Internal diff --git a/src/plugins/cppcheck/cppcheckplugin.cpp b/src/plugins/cppcheck/cppcheckplugin.cpp index 5bc99e54efb..341b25db029 100644 --- a/src/plugins/cppcheck/cppcheckplugin.cpp +++ b/src/plugins/cppcheck/cppcheckplugin.cpp @@ -40,6 +40,7 @@ class CppcheckPluginPrivate final : public QObject { public: explicit CppcheckPluginPrivate(); + ~CppcheckPluginPrivate(); CppcheckTextMarkManager marks; CppcheckTool tool{marks, Constants::CHECK_PROGRESS_ID}; @@ -49,9 +50,12 @@ public: Utils::Perspective perspective{Constants::PERSPECTIVE_ID, ::Cppcheck::Tr::tr("Cppcheck")}; Action *manualRunAction = nullptr; + QHash projectSettings; void startManualRun(); void updateManualRunAction(); + void saveProjectSettings(Project *project); + void loadProjectSettings(Project *project); }; CppcheckPluginPrivate::CppcheckPluginPrivate() @@ -104,6 +108,29 @@ CppcheckPluginPrivate::CppcheckPluginPrivate() action, &QAction::setEnabled); perspective.addToolBarAction(action); } + connect(ProjectManager::instance(), &ProjectManager::startupProjectChanged, + this, [this](Project *project) { + if (!project) + return; + CppcheckSettings *settings = projectSettings.value(project, nullptr); + if (!settings) { + settings = new CppcheckSettings; + settings->readSettings(); + settings->setAutoApply(true); + connect(project, &Project::aboutToSaveSettings, + this, [this, project]{ saveProjectSettings(project); }); + connect(project, &Project::settingsLoaded, + this, [this, project]{ loadProjectSettings(project); }); + projectSettings.insert(project, settings); + loadProjectSettings(project); + } + }); +} + +CppcheckPluginPrivate::~CppcheckPluginPrivate() +{ + qDeleteAll(projectSettings); + projectSettings.clear(); } void CppcheckPluginPrivate::startManualRun() @@ -112,7 +139,9 @@ void CppcheckPluginPrivate::startManualRun() if (!project) return; - ManualRunDialog dialog(project); + CppcheckSettings *settings = projectSettings.value(project, nullptr); + QTC_ASSERT(settings, return); + ManualRunDialog dialog(project, settings); if (dialog.exec() == ManualRunDialog::Rejected) return; @@ -123,7 +152,7 @@ void CppcheckPluginPrivate::startManualRun() return; manualRunTool.setProject(project); - manualRunTool.updateOptions(dialog.manualRunSettings()); + manualRunTool.updateOptions(*settings); manualRunTool.check(files); perspective.select(); } @@ -138,6 +167,30 @@ void CppcheckPluginPrivate::updateManualRunAction() manualRunAction->setEnabled(canRun); } +void CppcheckPluginPrivate::saveProjectSettings(Project *project) +{ + QTC_ASSERT(project, return); + CppcheckSettings *settings = projectSettings.value(project, nullptr); + QTC_ASSERT(settings, return); + + Store store; + settings->toMap(store); + project->setNamedSettings("CppcheckManual", Utils::variantFromStore(store)); +} + +void CppcheckPluginPrivate::loadProjectSettings(Project *project) +{ + QTC_ASSERT(project, return); + CppcheckSettings *settings = projectSettings.value(project, nullptr); + QTC_ASSERT(settings, return); + + const QVariant variant = project->namedSettings("CppcheckManual"); + if (!variant.isValid()) + return; + Store store = Utils::storeFromVariant(project->namedSettings("CppcheckManual")); + settings->fromMap(store); +} + class CppcheckPlugin final : public ExtensionSystem::IPlugin { Q_OBJECT From bdcac439366ba5da741327c59a4f3d54a6255125 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 1 Jul 2024 17:28:01 +0200 Subject: [PATCH 14/22] ExtensionManager: Make some text selectable by mouse Change-Id: Ic268c80713c4fe7121af32eb0e0bc3ea41ed1660 Reviewed-by: Alessandro Portale --- src/plugins/extensionmanager/extensionsbrowser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index c90d2bb59a1..60d9be94df0 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -449,6 +449,7 @@ QLabel *tfLabel(const TextFormat &tf, bool singleLine) label->setFixedHeight(tf.lineHeight()); label->setFont(tf.font()); label->setAlignment(Qt::Alignment(tf.drawTextFlags)); + label->setTextInteractionFlags(Qt::TextSelectableByMouse); QPalette pal = label->palette(); pal.setColor(QPalette::WindowText, tf.color()); From f207707cc968624afc7d0c503ac5251ea791364c Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 2 Jul 2024 01:13:15 +0200 Subject: [PATCH 15/22] LinuxDeviceTester: Get rid of unused storage The storage is now only set, never read -> thus remove it. Amends 3cd0dad3d46ab41bcc7e94d02a4840973779553b Change-Id: Icf95c03b923b07ed1a734fe522567d1851231960 Reviewed-by: hjk --- src/plugins/remotelinux/linuxdevicetester.cpp | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/plugins/remotelinux/linuxdevicetester.cpp b/src/plugins/remotelinux/linuxdevicetester.cpp index be9cb716865..f2900a22158 100644 --- a/src/plugins/remotelinux/linuxdevicetester.cpp +++ b/src/plugins/remotelinux/linuxdevicetester.cpp @@ -27,11 +27,6 @@ using namespace Utils; namespace RemoteLinux { namespace Internal { -struct TransferStorage -{ - bool useGenericCopy = false; -}; - class GenericLinuxDeviceTesterPrivate { public: @@ -43,8 +38,7 @@ public: GroupItem echoTask(const QString &contents) const; GroupItem unameTask() const; GroupItem gathererTask() const; - GroupItem transferTask(FileTransferMethod method, - const Storage &storage) const; + GroupItem transferTask(FileTransferMethod method) const; GroupItem transferTasks() const; GroupItem commandTasks() const; @@ -192,8 +186,7 @@ GroupItem GenericLinuxDeviceTesterPrivate::gathererTask() const }; } -GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod method, - const Storage &storage) const +GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod method) const { const auto onSetup = [this, method](FileTransfer &transfer) { emit q->progressMessage(Tr::tr("Checking whether \"%1\" works...") @@ -201,7 +194,7 @@ GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod metho transfer.setTransferMethod(method); transfer.setTestDevice(m_device); }; - const auto onDone = [this, method, storage](const FileTransfer &transfer, DoneWith result) { + const auto onDone = [this, method](const FileTransfer &transfer, DoneWith result) { const QString methodName = FileTransfer::transferMethodName(method); if (result == DoneWith::Success) { emit q->progressMessage(Tr::tr("\"%1\" is functional.\n").arg(methodName)); @@ -209,8 +202,6 @@ GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod metho m_device->setExtraData(Constants::SUPPORTS_RSYNC, true); else if (method == FileTransferMethod::Sftp) m_device->setExtraData(Constants::SUPPORTS_SFTP, true); - else - storage->useGenericCopy = true; return; } const ProcessResultData resultData = transfer.resultData(); @@ -251,13 +242,11 @@ GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod metho GroupItem GenericLinuxDeviceTesterPrivate::transferTasks() const { - Storage storage; return Group { continueOnSuccess, - storage, - transferTask(FileTransferMethod::GenericCopy, storage), - transferTask(FileTransferMethod::Sftp, storage), - transferTask(FileTransferMethod::Rsync, storage), + transferTask(FileTransferMethod::GenericCopy), + transferTask(FileTransferMethod::Sftp), + transferTask(FileTransferMethod::Rsync), onGroupDone([this] { emit q->errorMessage(Tr::tr("Deployment to this device will not work out of the box.") + "\n"); From 8b1c7d3865ebba38bfff8d58bc8d9cfadc8b81a3 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 1 Jul 2024 17:55:38 +0200 Subject: [PATCH 16/22] QtSupport: Stabilize Example sets sorting Design Studio examples entries come without version numbers. The lessThan implementation was called twice with the same two QDS items. To my understanding lessThan confused the algorithm by returning contradicting results. With this change only different QVersionNumbers are lessThan-ranked. Change-Id: I24fed43457c1f53c3fea693b20bdf2fd4db44b7a Reviewed-by: Eike Ziller --- src/plugins/qtsupport/exampleslistmodel.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/plugins/qtsupport/exampleslistmodel.cpp b/src/plugins/qtsupport/exampleslistmodel.cpp index 01c808275d3..bd73137b00d 100644 --- a/src/plugins/qtsupport/exampleslistmodel.cpp +++ b/src/plugins/qtsupport/exampleslistmodel.cpp @@ -161,14 +161,10 @@ void ExampleSetModel::recreateModel(const QtVersions &qtVersionsIn) // Sort by Qt version, example sets not associated to Qt last Utils::sort(items, [](QStandardItem *a, QStandardItem *b) { const QVersionNumber versionB = b->data(kVersionRole).value(); - if (versionB.isNull()) - return true; const QVersionNumber versionA = a->data(kVersionRole).value(); - if (versionA.isNull()) - return false; - if (versionA == versionB) - return a->data(Qt::DisplayRole).toString() < b->data(Qt::DisplayRole).toString(); - return versionA < versionB; + if (versionA != versionB) + return versionA < versionB; + return a->data(Qt::DisplayRole).toString() < b->data(Qt::DisplayRole).toString(); }); for (QStandardItem *item : std::as_const(items)) From e86e5f76a810585a58a318071e5ad1a39b45c340 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 2 Jul 2024 08:20:57 +0200 Subject: [PATCH 17/22] ClangTools: properly initialize diagnostic mark without document After removing the delegating constructor the code in the body of the called constructor was not executed anymore. Move that code into a separate function and call it from every constructor to make sure that the text mark is properly initialized. Amends d7ed05ae14e3ced9fc57707085da56de6a35cd9e. Fixes: QTCREATORBUG-31153 Change-Id: Ic320d470d39a927c3f7027a0041e843cdea5aa9c Reviewed-by: Christian Kandeler --- src/plugins/clangtools/diagnosticmark.cpp | 71 +++++++++++++---------- src/plugins/clangtools/diagnosticmark.h | 1 + 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/plugins/clangtools/diagnosticmark.cpp b/src/plugins/clangtools/diagnosticmark.cpp index 5ea0895b947..9eba17965f4 100644 --- a/src/plugins/clangtools/diagnosticmark.cpp +++ b/src/plugins/clangtools/diagnosticmark.cpp @@ -29,43 +29,15 @@ DiagnosticMark::DiagnosticMark(const Diagnostic &diagnostic, TextDocument *docum : TextMark(document, diagnostic.location.line, clangToolsCategory()) , m_diagnostic(diagnostic) { - setSettingsPage(Constants::SETTINGS_PAGE_ID); - - const bool isError = diagnostic.type == "error" || diagnostic.type == "fatal"; - setColor(isError ? Theme::CodeModel_Error_TextMarkColor : Theme::CodeModel_Warning_TextMarkColor); - setPriority(isError ? TextEditor::TextMark::HighPriority : TextEditor::TextMark::NormalPriority); - QIcon markIcon = diagnostic.icon(); - setIcon(markIcon.isNull() ? Icons::CODEMODEL_WARNING.icon() : markIcon); - setToolTip(createDiagnosticToolTipString(diagnostic, std::nullopt, true)); - setLineAnnotation(diagnostic.description); - setActionsProvider([diagnostic] { - // Copy to clipboard action - QList actions; - QAction *action = new QAction(); - action->setIcon(Icon::fromTheme("edit-copy")); - action->setToolTip(Tr::tr("Copy to Clipboard")); - QObject::connect(action, &QAction::triggered, [diagnostic] { - const QString text = createFullLocationString(diagnostic.location) - + ": " - + diagnostic.description; - setClipboardAndSelection(text); - }); - actions << action; - - // Disable diagnostic action - action = new QAction(); - action->setIcon(Icons::BROKEN.icon()); - action->setToolTip(Tr::tr("Disable Diagnostic")); - QObject::connect(action, &QAction::triggered, [diagnostic] { disableChecks({diagnostic}); }); - actions << action; - return actions; - }); + initialize(); } DiagnosticMark::DiagnosticMark(const Diagnostic &diagnostic) : TextMark(diagnostic.location.filePath, diagnostic.location.line, clangToolsCategory()) , m_diagnostic(diagnostic) -{} +{ + initialize(); +} void DiagnosticMark::disable() { @@ -89,6 +61,41 @@ Diagnostic DiagnosticMark::diagnostic() const return m_diagnostic; } +void DiagnosticMark::initialize() +{ + setSettingsPage(Constants::SETTINGS_PAGE_ID); + + const bool isError = m_diagnostic.type == "error" || m_diagnostic.type == "fatal"; + setColor(isError ? Theme::CodeModel_Error_TextMarkColor : Theme::CodeModel_Warning_TextMarkColor); + setPriority(isError ? TextEditor::TextMark::HighPriority : TextEditor::TextMark::NormalPriority); + QIcon markIcon = m_diagnostic.icon(); + setIcon(markIcon.isNull() ? Icons::CODEMODEL_WARNING.icon() : markIcon); + setToolTip(createDiagnosticToolTipString(m_diagnostic, std::nullopt, true)); + setLineAnnotation(m_diagnostic.description); + setActionsProvider([diagnostic = m_diagnostic] { + // Copy to clipboard action + QList actions; + QAction *action = new QAction(); + action->setIcon(Icon::fromTheme("edit-copy")); + action->setToolTip(Tr::tr("Copy to Clipboard")); + QObject::connect(action, &QAction::triggered, [diagnostic] { + const QString text = createFullLocationString(diagnostic.location) + + ": " + + diagnostic.description; + setClipboardAndSelection(text); + }); + actions << action; + + // Disable diagnostic action + action = new QAction(); + action->setIcon(Icons::BROKEN.icon()); + action->setToolTip(Tr::tr("Disable Diagnostic")); + QObject::connect(action, &QAction::triggered, [diagnostic] { disableChecks({diagnostic}); }); + actions << action; + return actions; + }); +} + } // namespace Internal } // namespace ClangTools diff --git a/src/plugins/clangtools/diagnosticmark.h b/src/plugins/clangtools/diagnosticmark.h index 6d566739d42..7d2999e66ec 100644 --- a/src/plugins/clangtools/diagnosticmark.h +++ b/src/plugins/clangtools/diagnosticmark.h @@ -25,6 +25,7 @@ public: std::optional toolType; private: + void initialize(); const Diagnostic m_diagnostic; bool m_enabled = true; }; From 67d2789523dd26a0bedf7edcf0c968e254e83065 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 27 Jun 2024 09:26:44 +0200 Subject: [PATCH 18/22] Update change log Change-Id: I963f63601bae4d1723f740be195f12245fd59010 Reviewed-by: Leena Miettinen --- dist/changelog/changes-14.0.0.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md index 97fe1bb68dd..2458857e830 100644 --- a/dist/changelog/changes-14.0.0.md +++ b/dist/changelog/changes-14.0.0.md @@ -15,6 +15,7 @@ General * Started work on supporting Lua based plugins (registering language servers, actions, preferences, and wizards) ([Documentation](https://doc-snapshots.qt.io/qtcreator-extending/lua-extensions.html)) +* Added a mode for managing extensions * Added `Clear` and `Save Contents` to context menus of all output views * Locator * Added the option to show results relative to project root @@ -38,6 +39,9 @@ Editing * Fixed that after hiding the editor in `Debug` mode, `Edit` mode always opened when opening documents, even if an external editor window was available ([QTCREATORBUG-30408](https://bugreports.qt.io/browse/QTCREATORBUG-30408)) +* Fixed that it wasn't possible to open a file in the text editor if it was + classified as a binary file format by the MIME database + ([QTCREATORBUG-31116](https://bugreports.qt.io/browse/QTCREATORBUG-31116)) ### C++ @@ -177,6 +181,12 @@ Projects * Fixed a crash when triggering `Follow Symbol` in a CMake file that does not belong to a project ([QTCREATORBUG-31077](https://bugreports.qt.io/browse/QTCREATORBUG-31077)) +* Fixed that multiple build configurations of the same type used the same + build directory + ([QTCREATORBUG-26066](https://bugreports.qt.io/browse/QTCREATORBUG-26066)) +* Fixed an issue with adding new files when file globs are used in the CMake + files + ([QTCREATORBUG-30445](https://bugreports.qt.io/browse/QTCREATORBUG-30445)) * Presets * Made CMake settings configurable ([QTCREATORBUG-25972](https://bugreports.qt.io/browse/QTCREATORBUG-25972), @@ -344,8 +354,10 @@ Michael Weghorn Miikka Heikkinen Orgad Shaneh Pranta Dastider +Ralf Habacker Robert Löhning Sami Shalayel +Semih Yavuz Sergey Silin Shrief Gabr Teea Poldsam From dfbe37542dd4db494bdad7d551c5d35b2201873f Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 2 Jul 2024 14:22:20 +0200 Subject: [PATCH 19/22] RemoteLinux: Fix potentially wrong name of deploy tool ... in error messages. For instance, one could get "rsync crashed" when it was actually sftp, misleading the user. Change-Id: I42bcecb8ca21c899ace78eb1397d3e71f2a0bb78 Reviewed-by: Jarek Kobus --- .../projectexplorer/devicesupport/filetransfer.h | 1 + src/plugins/remotelinux/genericdeploystep.cpp | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/devicesupport/filetransfer.h b/src/plugins/projectexplorer/devicesupport/filetransfer.h index 7ad6a5c5bc3..2d84351d55c 100644 --- a/src/plugins/projectexplorer/devicesupport/filetransfer.h +++ b/src/plugins/projectexplorer/devicesupport/filetransfer.h @@ -37,6 +37,7 @@ public: Utils::ProcessResultData resultData() const; static QString transferMethodName(FileTransferMethod method); + QString transferMethodName() const { return transferMethodName(transferMethod()); } signals: void progress(const QString &progressMessage); diff --git a/src/plugins/remotelinux/genericdeploystep.cpp b/src/plugins/remotelinux/genericdeploystep.cpp index 0002e69f5f2..cba80697f08 100644 --- a/src/plugins/remotelinux/genericdeploystep.cpp +++ b/src/plugins/remotelinux/genericdeploystep.cpp @@ -176,12 +176,16 @@ GroupItem GenericDeployStep::transferTask(const Storage &storag const auto onError = [this](const FileTransfer &transfer) { const ProcessResultData result = transfer.resultData(); if (result.m_error == QProcess::FailedToStart) { - addErrorMessage(Tr::tr("rsync failed to start: %1").arg(result.m_errorString)); + addErrorMessage(Tr::tr("%1 failed to start: %2") + .arg(transfer.transferMethodName(), result.m_errorString)); } else if (result.m_exitStatus == QProcess::CrashExit) { - addErrorMessage(Tr::tr("rsync crashed.")); + addErrorMessage(Tr::tr("%1 crashed.").arg(transfer.transferMethodName())); } else if (result.m_exitCode != 0) { - addErrorMessage(Tr::tr("rsync failed with exit code %1.").arg(result.m_exitCode) - + "\n" + result.m_errorString); + addErrorMessage( + Tr::tr("%1 failed with exit code %2.") + .arg(transfer.transferMethodName()) + .arg(result.m_exitCode) + + "\n" + result.m_errorString); } }; return FileTransferTask(onSetup, onError, CallDoneIf::Error); From 057a54364dc38e773c0f70aa97952d3b22056936 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 26 Jun 2024 11:19:26 +0200 Subject: [PATCH 20/22] Android: Synchronize startAvd()'s future This change fixes a possible deadlock on Creator shutdown after clicking "Start AVD" button from the Android device settings dialog, and quickly closing the started emulator window, the settings dialog and Creator (within 2 seconds). In case of no synchronization we may be starting new processes in separate thread after the QApplication has already been destroyed. Blocking run of processes requires constructing an event loop, which ends up with the following warnings (and a deadlock): "QEventLoop: Cannot be used without QApplication" "QObject::setParent: Cannot set parent, new parent is in a different thread". Add returned future to the global future synchronizer. Avoid long synchronization of startAvd() on shutdown by adding an optional future argument to the startAvd() and pass it to the waitForAvd(). Otherwise, we would need to wait up to 2 minutes for synchronization to finish. Change-Id: Ia1d71d309cb2dcdb5e31decfdfdea6df9a117ed5 Reviewed-by: Alessandro Portale --- src/plugins/android/androidavdmanager.cpp | 4 ++-- src/plugins/android/androidavdmanager.h | 2 +- src/plugins/android/androiddevice.cpp | 7 +++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp index 3b5c6ccf916..c9453bb9084 100644 --- a/src/plugins/android/androidavdmanager.cpp +++ b/src/plugins/android/androidavdmanager.cpp @@ -20,10 +20,10 @@ namespace Android::Internal::AndroidAvdManager { static Q_LOGGING_CATEGORY(avdManagerLog, "qtc.android.avdManager", QtWarningMsg) -QString startAvd(const QString &name) +QString startAvd(const QString &name, const std::optional> &future) { if (!findAvd(name).isEmpty() || startAvdAsync(name)) - return waitForAvd(name); + return waitForAvd(name, future); return {}; } diff --git a/src/plugins/android/androidavdmanager.h b/src/plugins/android/androidavdmanager.h index 5a1f188038c..7f1b094bdd2 100644 --- a/src/plugins/android/androidavdmanager.h +++ b/src/plugins/android/androidavdmanager.h @@ -8,7 +8,7 @@ namespace Android::Internal::AndroidAvdManager { -QString startAvd(const QString &name); +QString startAvd(const QString &name, const std::optional> &future = {}); bool startAvdAsync(const QString &avdName); QString findAvd(const QString &avdName); QString waitForAvd(const QString &avdName, const std::optional> &future = {}); diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 4972c653c9d..2e24eae73a8 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -111,15 +111,14 @@ static void startAvd(const IDevice::Ptr &device, QWidget *parent) const AndroidDevice *androidDev = static_cast(device.get()); const QString name = androidDev->avdName(); qCDebug(androidDeviceLog, "Starting Android AVD id \"%s\".", qPrintable(name)); - auto future = Utils::asyncRun([name, device] { - const QString serialNumber = AndroidAvdManager::startAvd(name); + Utils::futureSynchronizer()->addFuture(Utils::asyncRun([name, device](QPromise &promise) { + const QString serialNumber = AndroidAvdManager::startAvd(name, promise.future()); // Mark the AVD as ReadyToUse once we know it's started if (!serialNumber.isEmpty()) { DeviceManager *const devMgr = DeviceManager::instance(); devMgr->setDeviceState(device->id(), IDevice::DeviceReadyToUse); } - }); - // TODO: use future! + })); } static void setEmulatorArguments(QWidget *parent) From bb08762123283321f87334daf19a000e8b0d46cf Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 1 Jul 2024 10:51:55 +0200 Subject: [PATCH 21/22] Editor: Improve multi text cursor selection Allow to select text with ctrl+shift+(move operation in a line) Fixes: QTCREATORBUG-31166 Change-Id: I2ffd02ca4a25e9074cf073d1d7e6639931fe7dc7 Reviewed-by: Christian Stenger --- src/libs/utils/multitextcursor.cpp | 69 +++++++++++++-------------- src/libs/utils/multitextcursor.h | 5 +- src/plugins/texteditor/texteditor.cpp | 16 +++++-- 3 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/libs/utils/multitextcursor.cpp b/src/libs/utils/multitextcursor.cpp index 0c2e5b07925..7e991d3cd31 100644 --- a/src/libs/utils/multitextcursor.cpp +++ b/src/libs/utils/multitextcursor.cpp @@ -330,13 +330,10 @@ static QTextLine currentTextLine(const QTextCursor &cursor) return layout->lineForTextPosition(relativePos); } -bool MultiTextCursor::multiCursorAddEvent(QKeyEvent *e, QKeySequence::StandardKey matchKey) +bool MultiTextCursor::multiCursorEvent( + QKeyEvent *e, QKeySequence::StandardKey matchKey, Qt::KeyboardModifiers filterModifiers) { - uint searchkey = (e->modifiers() | e->key()) - & ~(Qt::KeypadModifier - | Qt::GroupSwitchModifier - | Qt::AltModifier - | Qt::ShiftModifier); + uint searchkey = (e->modifiers() | e->key()) & ~(filterModifiers | Qt::AltModifier); const QList bindings = QKeySequence::keyBindings(matchKey); return bindings.contains(QKeySequence(searchkey)); @@ -348,42 +345,42 @@ bool MultiTextCursor::handleMoveKeyEvent(QKeyEvent *e, { if (e->modifiers() & Qt::AltModifier && !Utils::HostOsInfo::isMacHost()) { QTextCursor::MoveOperation op = QTextCursor::NoMove; - if (multiCursorAddEvent(e, QKeySequence::MoveToNextWord)) { + if (multiCursorEvent(e, QKeySequence::MoveToNextWord)) { op = QTextCursor::WordRight; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToPreviousWord)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToPreviousWord)) { op = QTextCursor::WordLeft; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToEndOfBlock)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToEndOfBlock)) { op = QTextCursor::EndOfBlock; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToStartOfBlock)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToStartOfBlock)) { op = QTextCursor::StartOfBlock; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToNextLine)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToNextLine, Qt::ShiftModifier)) { op = QTextCursor::Down; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToPreviousLine)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToPreviousLine, Qt::ShiftModifier)) { op = QTextCursor::Up; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToStartOfLine)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToStartOfLine)) { op = QTextCursor::StartOfLine; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToEndOfLine)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToEndOfLine)) { op = QTextCursor::EndOfLine; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToStartOfDocument)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToStartOfDocument)) { op = QTextCursor::Start; - } else if (multiCursorAddEvent(e, QKeySequence::MoveToEndOfDocument)) { + } else if (multiCursorEvent(e, QKeySequence::MoveToEndOfDocument)) { op = QTextCursor::End; - } else { - return false; } - const std::list cursors = m_cursorList; - for (QTextCursor cursor : cursors) { - if (camelCaseNavigationEnabled && op == QTextCursor::WordRight) - CamelCaseCursor::right(&cursor, edit, QTextCursor::MoveAnchor); - else if (camelCaseNavigationEnabled && op == QTextCursor::WordLeft) - CamelCaseCursor::left(&cursor, edit, QTextCursor::MoveAnchor); - else - cursor.movePosition(op, QTextCursor::MoveAnchor); + if (op != QTextCursor::NoMove) { + const std::list cursors = m_cursorList; + for (QTextCursor cursor : cursors) { + if (camelCaseNavigationEnabled && op == QTextCursor::WordRight) + CamelCaseCursor::right(&cursor, edit, QTextCursor::MoveAnchor); + else if (camelCaseNavigationEnabled && op == QTextCursor::WordLeft) + CamelCaseCursor::left(&cursor, edit, QTextCursor::MoveAnchor); + else + cursor.movePosition(op, QTextCursor::MoveAnchor); - addCursor(cursor); + addCursor(cursor); + } + return true; } - return true; } for (auto it = m_cursorList.begin(); it != m_cursorList.end(); ++it) { @@ -395,28 +392,28 @@ bool MultiTextCursor::handleMoveKeyEvent(QKeyEvent *e, op = QTextCursor::Right; } else if (e == QKeySequence::MoveToPreviousChar) { op = QTextCursor::Left; - } else if (e == QKeySequence::SelectNextChar) { + } else if (multiCursorEvent(e, QKeySequence::SelectNextChar)) { op = QTextCursor::Right; mode = QTextCursor::KeepAnchor; - } else if (e == QKeySequence::SelectPreviousChar) { + } else if (multiCursorEvent(e, QKeySequence::SelectPreviousChar)) { op = QTextCursor::Left; mode = QTextCursor::KeepAnchor; - } else if (e == QKeySequence::SelectNextWord) { + } else if (multiCursorEvent(e, QKeySequence::SelectNextWord)) { op = QTextCursor::WordRight; mode = QTextCursor::KeepAnchor; - } else if (e == QKeySequence::SelectPreviousWord) { + } else if (multiCursorEvent(e, QKeySequence::SelectPreviousWord)) { op = QTextCursor::WordLeft; mode = QTextCursor::KeepAnchor; - } else if (e == QKeySequence::SelectStartOfLine) { + } else if (multiCursorEvent(e, QKeySequence::SelectStartOfLine)) { op = QTextCursor::StartOfLine; mode = QTextCursor::KeepAnchor; - } else if (e == QKeySequence::SelectEndOfLine) { + } else if (multiCursorEvent(e, QKeySequence::SelectEndOfLine)) { op = QTextCursor::EndOfLine; mode = QTextCursor::KeepAnchor; - } else if (e == QKeySequence::SelectStartOfBlock) { + } else if (multiCursorEvent(e, QKeySequence::SelectStartOfBlock)) { op = QTextCursor::StartOfBlock; mode = QTextCursor::KeepAnchor; - } else if (e == QKeySequence::SelectEndOfBlock) { + } else if (multiCursorEvent(e, QKeySequence::SelectEndOfBlock)) { op = QTextCursor::EndOfBlock; mode = QTextCursor::KeepAnchor; } else if (e == QKeySequence::SelectStartOfDocument) { diff --git a/src/libs/utils/multitextcursor.h b/src/libs/utils/multitextcursor.h index dc554dd2276..c1099013095 100644 --- a/src/libs/utils/multitextcursor.h +++ b/src/libs/utils/multitextcursor.h @@ -108,7 +108,10 @@ public: const_iterator constBegin() const { return m_cursorMap.cbegin(); } const_iterator constEnd() const { return m_cursorMap.cend(); } - static bool multiCursorAddEvent(QKeyEvent *e, QKeySequence::StandardKey matchKey); + static bool multiCursorEvent( + QKeyEvent *e, + QKeySequence::StandardKey matchKey, + Qt::KeyboardModifiers additionalFilterModifier = {}); private: std::list m_cursorList; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 5f201222b1f..30657f1741b 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -3089,15 +3089,21 @@ void TextEditorWidget::keyPressEvent(QKeyEvent *e) if (ro || !isPrintableText(eventText)) { QTextCursor::MoveOperation blockSelectionOperation = QTextCursor::NoMove; - if (e->modifiers() == (Qt::AltModifier | Qt::ShiftModifier) && !Utils::HostOsInfo::isMacHost()) { - if (MultiTextCursor::multiCursorAddEvent(e, QKeySequence::MoveToNextLine)) + if (e->modifiers() == (Qt::AltModifier | Qt::ShiftModifier) + && !Utils::HostOsInfo::isMacHost()) { + if (MultiTextCursor::multiCursorEvent( + e, QKeySequence::MoveToNextLine, Qt::ShiftModifier)) { blockSelectionOperation = QTextCursor::Down; - else if (MultiTextCursor::multiCursorAddEvent(e, QKeySequence::MoveToPreviousLine)) + } else if (MultiTextCursor::multiCursorEvent( + e, QKeySequence::MoveToPreviousLine, Qt::ShiftModifier)) { blockSelectionOperation = QTextCursor::Up; - else if (MultiTextCursor::multiCursorAddEvent(e, QKeySequence::MoveToNextChar)) + } else if (MultiTextCursor::multiCursorEvent( + e, QKeySequence::MoveToNextChar, Qt::ShiftModifier)) { blockSelectionOperation = QTextCursor::NextCharacter; - else if (MultiTextCursor::multiCursorAddEvent(e, QKeySequence::MoveToPreviousChar)) + } else if (MultiTextCursor::multiCursorEvent( + e, QKeySequence::MoveToPreviousChar, Qt::ShiftModifier)) { blockSelectionOperation = QTextCursor::PreviousCharacter; + } } if (blockSelectionOperation != QTextCursor::NoMove) { From 74eda13a4340e1b0ffc9ec32a512b11fc658f72f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 1 Jul 2024 08:21:33 +0200 Subject: [PATCH 22/22] Mode: Fix comment regarding contexts Nowadays all IContext instances of the whole parent hierarchy of the current focus widget are collected. Nevertheless it makes sense to just add the current mode's context. Change-Id: Ia42a693d9b4cd58ac63bb99749b5dfa62f7801aa Reviewed-by: David Schulz --- src/plugins/coreplugin/modemanager.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp index c93ebe9a361..c03dd3250cf 100644 --- a/src/plugins/coreplugin/modemanager.cpp +++ b/src/plugins/coreplugin/modemanager.cpp @@ -311,9 +311,8 @@ void ModeManager::currentTabChanged(int index) if (!mode) return; - // FIXME: This hardcoded context update is required for the Debug and Edit modes, since - // they use the editor widget, which is already a context widget so the main window won't - // go further up the parent tree to find the mode context. + // Set the mode's context regardless of focus widget. + // Whenever a mode is active, it's Context is active. ICore::updateAdditionalContexts(d->m_addedContexts, mode->context()); d->m_addedContexts = mode->context();