From 68347c9c9b9033a38e57c25918e5f09be482519a Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 11 Mar 2024 14:33:31 +0100 Subject: [PATCH 01/57] Debugger: Avoid a soft assert on QmlEngine shutdown Change-Id: Id26b41e878ed2b8b20099b62ed1c122966165665 Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerengine.cpp | 3 +++ src/plugins/debugger/qml/qmlengine.cpp | 21 ++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index b2224ac32b8..115398b13ca 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1438,6 +1438,9 @@ void DebuggerEnginePrivate::updateState() return; QTC_ASSERT(m_threadLabel, return); + if (m_isDying) + return; + const DebuggerState state = m_state; const bool companionPreventsAction = m_engine->companionPreventsActions(); diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 2ffe5bf313a..ee578c3af3a 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -478,12 +478,11 @@ void QmlEngine::gotoLocation(const Location &location) void QmlEngine::closeConnection() { - if (d->connectionTimer.isActive()) { - d->connectionTimer.stop(); - } else { - if (QmlDebugConnection *connection = d->connection()) - connection->close(); - } + d->automaticConnect = false; + d->retryOnConnectFail = false; + d->connectionTimer.stop(); + if (QmlDebugConnection *connection = d->connection()) + connection->close(); } void QmlEngine::startProcess() @@ -515,8 +514,8 @@ void QmlEngine::shutdownInferior() d->runCommand({DISCONNECT}); resetLocation(); - stopProcess(); closeConnection(); + stopProcess(); notifyInferiorShutdownFinished(); } @@ -574,6 +573,10 @@ void QmlEngine::continueInferior() void QmlEngine::interruptInferior() { + if (isDying()) { + notifyInferiorStopOk(); + return; + } showMessage(INTERRUPT, LogInput); d->runDirectCommand(INTERRUPT); showStatusMessage(Tr::tr("Waiting for JavaScript engine to interrupt on next statement.")); @@ -948,6 +951,8 @@ Context QmlEngine::languageContext() const void QmlEngine::disconnected() { + if (isDying()) + return; showMessage(Tr::tr("QML Debugger disconnected."), StatusBar); notifyInferiorExited(); } @@ -1122,6 +1127,8 @@ bool QmlEngine::isConnected() const void QmlEngine::showConnectionStateMessage(const QString &message) { + if (isDying()) + return; showMessage("QML Debugger: " + message, LogStatus); } From 726b023c7836212c3627e50d65e4f1e177f4fd03 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Mon, 11 Mar 2024 16:33:08 +0100 Subject: [PATCH 02/57] Terminal: Remove Close action A remnant of a wrong refactoring. Fixes: QTCREATORBUG-30519 Change-Id: I2fadb353b83762d4d821444a58f7631dcfd22b0d Reviewed-by: Reviewed-by: Eike Ziller --- src/plugins/terminal/terminalwidget.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 1e9b24ff014..9395172ddb5 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -689,9 +689,6 @@ void TerminalWidget::initActions(QObject *parent) moveCursorWordRightAction.setText(Tr::tr("Move Cursor Word Right")); moveCursorWordRightAction.setContext(context); moveCursorWordRightAction.setDefaultKeySequence({QKeySequence("Alt+Right")}); - - ActionBuilder closeAction(parent, Core::Constants::CLOSE); - closeAction.setText(Tr::tr("Close Terminal")); } void TerminalWidget::unlockGlobalAction(const Utils::Id &commandId) From da3bc4e86e4fce7132a1898b4234c20693cba1aa Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Mon, 11 Mar 2024 16:38:26 +0100 Subject: [PATCH 03/57] Terminal: Rename "Close" action Fixes: QTCREATORBUG-30520 Change-Id: I0fc2eaba533e6260763c0c02657cf3a7de7c9dce Reviewed-by: Reviewed-by: Eike Ziller --- src/plugins/terminal/terminalwidget.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 9395172ddb5..2bd0fa403dd 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -280,9 +280,10 @@ void TerminalWidget::setupActions() pasteAction.addOnTriggered(this, &TerminalWidget::pasteFromClipboard); m_paste = make_registered(pasteAction); - ActionBuilder closeAction(this, Core::Constants::CLOSE); - closeAction.setContext(m_context); - closeAction.addOnTriggered(this, &TerminalWidget::closeTerminal); + ActionBuilder(this, Core::Constants::CLOSE) + .setContext(m_context) + .addOnTriggered(this, &TerminalWidget::closeTerminal) + .setText(Tr::tr("Close Terminal")); // We do not register the close action, as we want it to be blocked if the keyboard is locked. ActionBuilder clearTerminalAction(this, Constants::CLEAR_TERMINAL); From d5750f8cb7bf3600412f3d60ae9162a5c793fe61 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 12 Mar 2024 09:41:02 +0100 Subject: [PATCH 04/57] Utils: Export TypedAspect Without the export, when compiled on macOS (with clang), the call "runControl()->aspect()" in runcontrol.cpp would return a nullptr, since ProjectExplorer and libUtils had different vtables for TypedAspect. Task-number: QTCREATORBUG-30516 Change-Id: Ic3cef6545e97f59af2a1138f13762c07d9402e4a Reviewed-by: hjk --- src/libs/utils/aspects.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index cb885cc495a..a7f076d038f 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -280,7 +280,7 @@ QTCREATOR_UTILS_EXPORT void createItem(Layouting::LayoutItem *item, const BaseAs QTCREATOR_UTILS_EXPORT void createItem(Layouting::LayoutItem *item, const BaseAspect *aspect); template -class TypedAspect : public BaseAspect +class QTCREATOR_UTILS_EXPORT TypedAspect : public BaseAspect { public: using valueType = ValueType; From 31e97d5069874bf974a2ba5c60ed9d5a195513f8 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 10:52:19 +0100 Subject: [PATCH 05/57] ClangFormat: Don't leak editor Amends e1f7469afb32efa51d665c9211767b214cd93573 Change-Id: I862bca5a57d818e8b813d557fa7c3a4e3690dcd2 Reviewed-by: Christian Kandeler --- src/plugins/clangformat/clangformatconfigwidget.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index 9adf94cafc1..e9f49a5eeec 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -101,7 +101,7 @@ private: QWidget *m_editorWidget = nullptr; QScrollArea *m_editorScrollArea = nullptr; TextEditor::SnippetEditorWidget *m_preview = nullptr; - Core::IEditor *m_editor = nullptr; + std::unique_ptr m_editor; std::unique_ptr m_config; @@ -156,8 +156,7 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc updatePreview(); } -void ClangFormatConfigWidget::slotCodeStyleChanged( - TextEditor::ICodeStylePreferences *codeStyle) +void ClangFormatConfigWidget::slotCodeStyleChanged(TextEditor::ICodeStylePreferences *codeStyle) { if (!codeStyle) return; @@ -177,7 +176,7 @@ void ClangFormatConfigWidget::initEditor(TextEditor::ICodeStylePreferences *code Core::EditorFactories factories = Core::IEditorFactory::preferredEditorTypes( m_config->filePath()); Core::IEditorFactory *factory = factories.takeFirst(); - m_editor = factory->createEditor(); + m_editor.reset(factory->createEditor()); QString errorString; m_editor->document()->open(&errorString, m_config->filePath(), m_config->filePath()); @@ -186,7 +185,7 @@ void ClangFormatConfigWidget::initEditor(TextEditor::ICodeStylePreferences *code invokeMethodForLanguageClientManager("documentOpened", Q_ARG(Core::IDocument *, m_editor->document())); invokeMethodForLanguageClientManager("editorOpened", - Q_ARG(Core::IEditor *, m_editor)); + Q_ARG(Core::IEditor *, m_editor.get())); m_editorWidget = m_editor->widget(); m_editorWidget->setEnabled(!codeStyle->isReadOnly() && !codeStyle->isTemporarilyReadOnly() @@ -221,7 +220,7 @@ void ClangFormatConfigWidget::initEditor(TextEditor::ICodeStylePreferences *code QShortcut *completionSC = new QShortcut(QKeySequence("Ctrl+Space"), this); connect(completionSC, &QShortcut::activated, this, [this] { - if (auto *editor = qobject_cast(m_editor)) + if (auto *editor = qobject_cast(m_editor.get())) editor->editorWidget()->invokeAssist(TextEditor::Completion); }); From 79573f2c76cf6fd1dfc3cce48578b1222df63121 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 11:26:41 +0100 Subject: [PATCH 06/57] CppEditor: Don't leak CppCodeStylePreferences Change-Id: I4414c69cebaeb429c5b6dfea6e6fa97b118e353e Reviewed-by: Christian Kandeler --- src/plugins/cppeditor/cppcodestylesettingspage.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/cppeditor/cppcodestylesettingspage.cpp b/src/plugins/cppeditor/cppcodestylesettingspage.cpp index 2ad6ba8baa9..ba0fc189417 100644 --- a/src/plugins/cppeditor/cppcodestylesettingspage.cpp +++ b/src/plugins/cppeditor/cppcodestylesettingspage.cpp @@ -562,7 +562,7 @@ public: CppCodeStyleSettingsPageWidget() { CppCodeStylePreferences *originalCodeStylePreferences = CppToolsSettings::cppCodeStyle(); - m_pageCppCodeStylePreferences = new CppCodeStylePreferences(); + m_pageCppCodeStylePreferences.reset(new CppCodeStylePreferences); m_pageCppCodeStylePreferences->setDelegatingPool( originalCodeStylePreferences->delegatingPool()); m_pageCppCodeStylePreferences->setCodeStyleSettings( @@ -573,7 +573,7 @@ public: m_pageCppCodeStylePreferences->setId(originalCodeStylePreferences->id()); m_codeStyleEditor = TextEditorSettings::codeStyleFactory(CppEditor::Constants::CPP_SETTINGS_ID) - ->createCodeStyleEditor(m_pageCppCodeStylePreferences); + ->createCodeStyleEditor(m_pageCppCodeStylePreferences.get()); auto hbox = new QVBoxLayout(this); hbox->addWidget(m_codeStyleEditor); @@ -603,7 +603,7 @@ public: m_codeStyleEditor->finish(); } - CppCodeStylePreferences *m_pageCppCodeStylePreferences = nullptr; + std::unique_ptr m_pageCppCodeStylePreferences; CodeStyleEditorWidget *m_codeStyleEditor; }; From 7c6c08a8ba16469522eb0589355df812896c2068 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 12 Mar 2024 12:27:00 +0100 Subject: [PATCH 07/57] Welcome: Draw stroke for hovered items As specified by design. Change-Id: Ia766ca16e3ce233aa73ac75d48d70b1379c39c37 Reviewed-by: Alessandro Portale --- src/plugins/coreplugin/welcomepagehelper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/welcomepagehelper.h b/src/plugins/coreplugin/welcomepagehelper.h index e55a5663e9a..a93d157c81a 100644 --- a/src/plugins/coreplugin/welcomepagehelper.h +++ b/src/plugins/coreplugin/welcomepagehelper.h @@ -62,7 +62,7 @@ constexpr qreal defaultCardBackgroundRounding = 3.75; constexpr Utils::Theme::Color cardDefaultBackground = Utils::Theme::Token_Background_Muted; constexpr Utils::Theme::Color cardDefaultStroke = Utils::Theme::Token_Stroke_Subtle; constexpr Utils::Theme::Color cardHoverBackground = Utils::Theme::Token_Background_Subtle; -constexpr Utils::Theme::Color cardHoverStroke = cardHoverBackground; +constexpr Utils::Theme::Color cardHoverStroke = cardDefaultStroke; CORE_EXPORT void drawCardBackground(QPainter *painter, const QRectF &rect, const QBrush &fill, const QPen &pen = QPen(Qt::NoPen), qreal rounding = defaultCardBackgroundRounding); From 8c0bb53c761274bbf4f64edb6c8c128291678670 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 5 Mar 2024 17:02:51 +0100 Subject: [PATCH 08/57] Doc: Turn "Comparing Files" into a how-to topic Hide it from the QDS Manual. Task-number: QTCREATORBUG-29361 Change-Id: I7c44aaed42e374b8e07d093279c8078ada18c250 Reviewed-by: Eike Ziller --- .../editors/creator-editors-writing-code.qdoc | 2 +- .../creator-only/creator-code-pasting.qdoc | 2 +- .../creator-diff-editor.qdoc | 66 +++++++++++-------- doc/qtcreator/src/qtcreator-toc.qdoc | 1 - .../src/qtquick/qtquick-toolbars.qdoc | 2 +- .../creator-file-system-view.qdoc | 4 +- .../src/vcs/creator-only/creator-vcs.qdoc | 2 +- doc/qtcreator/src/vcs/creator-vcs-git.qdoc | 5 +- .../src/overviews/studio-finding.qdoc | 2 +- .../src/qtdesignstudio-toc.qdoc | 1 - 10 files changed, 48 insertions(+), 39 deletions(-) rename doc/qtcreator/src/editors/{ => creator-only}/creator-diff-editor.qdoc (72%) diff --git a/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc b/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc index 5706b2d70dd..b9eb672eb01 100644 --- a/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc +++ b/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc @@ -75,6 +75,6 @@ \endlist \if defined(qtcreator) - \sa {Edit Code}{How To: Edit Code}, {Edit Mode}, {Comparing Files} + \sa {Edit Code}{How To: Edit Code}, {Edit Mode} \endif */ 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 7e77b016b4c..a1dc27193c7 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-code-pasting.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-code-pasting.qdoc @@ -52,7 +52,7 @@ To paste any content that you copied to the clipboard, select \uicontrol Tools > \uicontrol {Code Pasting} > \uicontrol {Paste Snippet}. - To paste content from the \l{Comparing Files}{diff editor}, right-click a + To paste content from the \l{Compare files}{diff editor}, right-click a chunk and select \uicontrol {Send Chunk to CodePaster} in the context menu. To fetch a snippet of code from the server, select \uicontrol Tools > diff --git a/doc/qtcreator/src/editors/creator-diff-editor.qdoc b/doc/qtcreator/src/editors/creator-only/creator-diff-editor.qdoc similarity index 72% rename from doc/qtcreator/src/editors/creator-diff-editor.qdoc rename to doc/qtcreator/src/editors/creator-only/creator-diff-editor.qdoc index 8557cd8bffb..de83a3e1ab7 100644 --- a/doc/qtcreator/src/editors/creator-diff-editor.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-diff-editor.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2020 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -9,31 +9,31 @@ /*! \page creator-diff-editor.html - \if defined(qtdesignstudio) - \previouspage qt-quick-toolbars.html - \nextpage studio-finding.html - \else - \previouspage creator-macros.html - \nextpage creator-clang-codemodel.html - \endif + \previouspage creator-how-tos.html - \title Comparing Files + \ingroup creator-how-to-edit - You can use a diff editor to display unsaved changes in the current file or - all open files or to compare any two text files that can be either versions - of the same file or arbitrary files. + \title Compare files - To view unsaved changes in the current file, select \uicontrol Tools > + You can view unsaved changes in the current file or all open files, + as well as compare any two text files. They can be either versions of + the same file or arbitrary files. + + \section1 View unsaved changes + + To view unsaved changes in the current file, go to \uicontrol Tools > \uicontrol Diff > \uicontrol {Diff Current File}. - To view unsaved changes in all open files, select \uicontrol Tools > + To view unsaved changes in all open files, go to \uicontrol Tools > \uicontrol Diff > \uicontrol {Diff Open Files}. + \section1 Compare two files + To compare two files: \list 1 - \li Select \uicontrol Tools > \uicontrol Diff > + \li Go to \uicontrol Tools > \uicontrol Diff > \uicontrol {Diff External Files}. \li Select two files to compare. @@ -41,36 +41,32 @@ \endlist To compare the currently opened file against another file in a project - or the filesystem: + or the file system: \list 1 \li Open the first file in an editor. - \li Right click on the second file in the \uicontrol Projects + \li Right-click the second file in the \uicontrol Projects or \uicontrol {File System} view and select \uicontrol {Diff Against Current File}. \endlist If \QC cannot detect the encoding of the files to compare, an info bar - appears that displays the option to reload the document using some other + displays the option to reload the document using some other encoding. For more information, see \l {Change text encoding}. - \section1 Viewing the Changes + \section1 View changes - \image creator-diff-editor.png "Diff editor output in the Edit mode" + \image creator-diff-editor.png {Diff editor output in the Edit mode} - The changes are displayed in the \uicontrol Edit mode. Color coding is + View the changes in the \uicontrol Edit mode. Color coding is used to mark changed lines. By default, red indicates lines that contain removed text (painted another shade of red) in the left pane and green indicates lines that contain added text (painted another shade of green) in the right pane. - To revert the changes, right-click added text and then select - \uicontrol {Revert Chunk} in the context menu. To apply the changes, select - removed text and then select \uicontrol {Apply Chunk}. - To view the differences in a unified view where changed rows are placed below each other, select \inlineimage icons/unifieddiff.png (\uicontrol {Switch to Unified Diff Editor}). @@ -85,22 +81,34 @@ show in \uicontrol {Context lines}. By default, the horizontal scroll bars in the left and right pane are - synchronized. To use them independently of each other, select the + synchronized. To use them independently of each other, select \inlineimage icons/linkicon.png - (\uicontrol {Synchronize Horizontal Scroll Bars}) button. + (\uicontrol {Synchronize Horizontal Scroll Bars}). + + \section1 Revert and apply changes + + To revert the changes, right-click added text and then select + \uicontrol {Revert Chunk} in the context menu. + + To apply the changes, select removed text and then select + \uicontrol {Apply Chunk}. + + \section1 Reload files If the files change outside \QC, select \inlineimage icons/reload_gray.png (\uicontrol {Reload Editor}) to compare them again and to show the results. \if defined(qtcreator) + \section1 Paste changes for review + To send a chunk of changes to a \l{Pasting and Fetching Code Snippets} {code pasting service}, select \uicontrol {Send Chunk to CodePaster} in the context menu. \endif - \section1 Changing the Colors + \section1 Change colors - To change the default colors, select \preferences > + To change the default colors, go to \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/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index c38beb825d3..5f254d59923 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -34,7 +34,6 @@ \li \l{Using Qt Quick Toolbars} \li \l{Pasting and Fetching Code Snippets} \li \l{Using Text Editing Macros} - \li \l{Comparing Files} \endlist \li \l{Configuring the Editor} \li \l{Using GitHub Copilot} diff --git a/doc/qtcreator/src/qtquick/qtquick-toolbars.qdoc b/doc/qtcreator/src/qtquick/qtquick-toolbars.qdoc index 2363e10a56b..829a711138f 100644 --- a/doc/qtcreator/src/qtquick/qtquick-toolbars.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-toolbars.qdoc @@ -11,7 +11,7 @@ \page qt-quick-toolbars.html \if defined(qtdesignstudio) \previouspage creator-preferences-qtquick-code-style.html - \nextpage creator-diff-editor.html + \nextpage studio-finding.html \else \previouspage creator-completing-code.html \nextpage creator-editor-codepasting.html 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 06226006d58..24f3b38479c 100644 --- a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc @@ -83,8 +83,10 @@ new filename. \li Remove existing files. \li Create new folders. + \if defined(qtcreator) \li Compare the selected file with the currently open file in the diff - editor. For more information, see \l{Comparing Files}. + editor. For more information, see \l{Compare files}. + \endif \li Display the contents of a particular directory in the view. \li Collapse all open folders. \endlist diff --git a/doc/qtcreator/src/vcs/creator-only/creator-vcs.qdoc b/doc/qtcreator/src/vcs/creator-only/creator-vcs.qdoc index d483e54ca9d..c0c8386911f 100644 --- a/doc/qtcreator/src/vcs/creator-only/creator-vcs.qdoc +++ b/doc/qtcreator/src/vcs/creator-only/creator-vcs.qdoc @@ -142,7 +142,7 @@ \image qtcreator-vcs-diff.png With Git, Mercurial, and Subversion, the diff is displayed side-by-side in - a \l{Comparing Files}{diff editor} by default. To use the inline diff view + a \l{Compare files}{diff editor} by default. To use the inline diff view instead, select the \uicontrol {Switch to Text Diff Editor} (1) option from the toolbar. In the inline diff view, you can use context menu commands to apply, revert, stage, and diff --git a/doc/qtcreator/src/vcs/creator-vcs-git.qdoc b/doc/qtcreator/src/vcs/creator-vcs-git.qdoc index 0b0cbb0ee20..f5662a33fa9 100644 --- a/doc/qtcreator/src/vcs/creator-vcs-git.qdoc +++ b/doc/qtcreator/src/vcs/creator-vcs-git.qdoc @@ -79,7 +79,7 @@ \image qtcreator-vcs-diff.png - The \l{Comparing Files}{diff editor} displays the diff side-by-side. To use + The diff editor displays the diff side-by-side. To use the unified diff view instead, select the \uicontrol {Switch to Unified Diff Editor} (1) option from the toolbar. In both views, you can use context menu commands to apply, revert, stage, @@ -638,6 +638,7 @@ visible only when you have merge conflicts to resolve. \if defined(qtcreator) - \sa {Set up version control systems}, {Version Control Systems} + \sa {Compare files}, {Set up version control systems}, + {Version Control Systems} \endif */ diff --git a/doc/qtdesignstudio/src/overviews/studio-finding.qdoc b/doc/qtdesignstudio/src/overviews/studio-finding.qdoc index ead5bc33af1..231efcef3eb 100644 --- a/doc/qtdesignstudio/src/overviews/studio-finding.qdoc +++ b/doc/qtdesignstudio/src/overviews/studio-finding.qdoc @@ -3,7 +3,7 @@ /*! \page studio-finding.html - \previouspage creator-diff-editor.html + \previouspage qt-quick-toolbars.html \nextpage creator-editor-finding.html \title Finding diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index d0b451e6299..4ecc7f4cfdd 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -207,7 +207,6 @@ \li \l{Behavior} \li \l{Qt Quick Code Style} \li \l{Using Qt Quick Toolbars} - \li \l{Comparing Files} \endlist \li \l{Finding} \list From e6eed39985f31b89f6f038d23972079a91c8e595 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 11 Mar 2024 17:07:20 +0100 Subject: [PATCH 09/57] Doc: Turn "Using Text Editing Macros" into a how-to topic Task-number: QTCREATORBUG-29361 Change-Id: I0d62d48036e08528c025eac8653e58ff0039e5a2 Reviewed-by: Eike Ziller --- ...creator-preferences-texteditor-macros.webp | Bin 0 -> 5428 bytes .../src/editors/creator-editors-options.qdoc | 5 -- .../editors/creator-editors-writing-code.qdoc | 6 -- .../creator-text-editing-macros.qdoc | 66 ++++++++++++------ doc/qtcreator/src/qtcreator-toc.qdoc | 1 - 5 files changed, 46 insertions(+), 32 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-preferences-texteditor-macros.webp diff --git a/doc/qtcreator/images/qtcreator-preferences-texteditor-macros.webp b/doc/qtcreator/images/qtcreator-preferences-texteditor-macros.webp new file mode 100644 index 0000000000000000000000000000000000000000..f8c7347f45db0cfa38b69a4eb08fa8be293255b3 GIT binary patch literal 5428 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/editors/creator-editors-options.qdoc b/doc/qtcreator/src/editors/creator-editors-options.qdoc index 152b89e6b15..fa1ee7df04c 100644 --- a/doc/qtcreator/src/editors/creator-editors-options.qdoc +++ b/doc/qtcreator/src/editors/creator-editors-options.qdoc @@ -49,11 +49,6 @@ \li Add, modify, and remove \l{Snippets}{code snippets} in \uicontrol Snippets. - \if defined(qtcreator) - \li View and remove \l{Using Text Editing Macros}{text editing macros} - in \uicontrol Macros. - \endif - \li Configure \l{Completion}{code completion} in \uicontrol Completion. \endlist diff --git a/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc b/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc index b9eb672eb01..c0ca9294607 100644 --- a/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc +++ b/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc @@ -65,12 +65,6 @@ colleagues to review a change that you plan to submit to a version control system. - \li \l{Using Text Editing Macros} - - When you have a file open in the code editor, you can record a - keyboard sequence as a macro. You can then play the macro to - repeat the sequence. You can save the latest macro and assign a - keyboard shortcut for running it or run it from the locator. \endif \endlist 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 fd4b4a8b709..796931f3289 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 @@ -1,35 +1,61 @@ -// Copyright (C) 2023 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! \previouspage creator-editor-codepasting.html \page creator-macros.html - \nextpage creator-diff-editor.html + \previouspage creator-how-tos.html - \title Using Text Editing Macros + \ingroup creator-how-to-edit - To record a text editing macro, select \uicontrol Tools > - \uicontrol {Text Editing Macros} > \uicontrol {Record Macro} - or press \key {Alt+[}. To stop recording, select \uicontrol Tools > - \uicontrol {Text Editing Macros} > \uicontrol {Stop Recording Macro} or - press \key {Alt+]}. + \title Record text editing macros + + When you have a file open in the code editor, you can record a + keyboard sequence as a macro. You can then play the macro to + repeat the sequence. You can save the latest macro and assign a + keyboard shortcut for running it or run it from the locator. + + \section1 Record macros + + To record a text editing macro: + + \list 1 + \li Go to \uicontrol Tools > \uicontrol {Text Editing Macros} > + \uicontrol {Record Macro} or press \key {Alt+[}. + \li Press keyboard keys. + \li To stop recording, go to \uicontrol Tools > + \uicontrol {Text Editing Macros} > \uicontrol {Stop Recording Macro} + or press \key {Alt+]}. + \endlist \note The macro recorder does not support code completion. - To play the last macro, select \uicontrol Tools > - \uicontrol {Text Editing Macros} > \uicontrol {Play Last Macro} or - press \key {Alt+R}. + \section1 Play macros - To save the last macro, select \uicontrol Tools > + To play the last macro: + + \list + \li Go to \uicontrol Tools > \uicontrol {Text Editing Macros} > + \uicontrol {Play Last Macro}. + \li Press \key {Alt+R}. + \li Enter \c rm in the locator. + \endlist + + \section1 Save macros + + To save the last macro, go to \uicontrol Tools > \uicontrol {Text Editing Macros} > \uicontrol {Save Last Macro}. - To assign a keyboard shortcut to a text editing macro, select - \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{Navigate with locator}. - - To view and remove saved macros, select \preferences > + To view and remove saved macros, go to \preferences > \uicontrol {Text Editor} > \uicontrol Macros. + + \image qtcreator-preferences-texteditor-macros.webp {Macros tab in Text Editor Preferences} + + \section1 Assign keyboard shortcuts to macros + + To assign a keyboard shortcut to a text editing macro, go to + \preferences > \uicontrol Environment > \uicontrol Keyboard. + + \sa {Assign keyboard shortcuts}, {Edit Code}{How To: Edit Code}, + {Navigate with locator} */ diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 5f254d59923..6e45a628343 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -33,7 +33,6 @@ \li \l{Checking Code Syntax} \li \l{Using Qt Quick Toolbars} \li \l{Pasting and Fetching Code Snippets} - \li \l{Using Text Editing Macros} \endlist \li \l{Configuring the Editor} \li \l{Using GitHub Copilot} From dd43b59ede2401ac94da331021604bb02b86e6b2 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 12 Mar 2024 12:29:50 +0100 Subject: [PATCH 10/57] MCU: Fix translated string It tried to use an existing string, but missed the full stop Amends 124c62a5a0bca8d64c26a64478b9875664d9fb9c Change-Id: Idf66621b714da86be700d4ac18c6df2c7a83a468 Reviewed-by: Yasser Grimes Reviewed-by: Leena Miettinen --- src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp b/src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp index 4100052cbd5..66f059ec88a 100644 --- a/src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp +++ b/src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp @@ -81,7 +81,7 @@ McuKitCreationDialog::McuKitCreationDialog(const MessagesList &messages, if (messages.empty()) { fixButton->setVisible(false); m_informationLabel->setText( - QCoreApplication::translate("QtC::Autotest", "No errors detected")); + QCoreApplication::translate("QtC::Autotest", "No errors detected.")); } if (messages.size() < 2) { From 6956771e0d21fec81f7adf87f88560473ed3b865 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 12:25:46 +0100 Subject: [PATCH 11/57] ProjectExplorerSettingsWidget: Don't leak QButtonGroup Change-Id: I64896287dda3df96078f7fabec4cd4437396f3f3 Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/projectexplorersettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projectexplorersettings.cpp b/src/plugins/projectexplorer/projectexplorersettings.cpp index 6cd79ce8f0b..b99a38d461d 100644 --- a/src/plugins/projectexplorer/projectexplorersettings.cpp +++ b/src/plugins/projectexplorer/projectexplorersettings.cpp @@ -196,7 +196,7 @@ ProjectExplorerSettingsWidget::ProjectExplorerSettingsWidget() m_jomCheckbox->setVisible(HostOsInfo::isWindowsHost()); jomLabel->setVisible(HostOsInfo::isWindowsHost()); - m_directoryButtonGroup = new QButtonGroup; + m_directoryButtonGroup = new QButtonGroup(this); m_directoryButtonGroup->setExclusive(true); m_directoryButtonGroup->addButton(m_currentDirectoryRadioButton, UseCurrentDirectory); m_directoryButtonGroup->addButton(m_directoryRadioButton, UseProjectDirectory); From 5e2140a01f7d10bbb28ded6237a2e9901d610de3 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 12 Mar 2024 14:43:32 +0100 Subject: [PATCH 12/57] Doc: Create links between Callgrind and Performance Analyzer Change-Id: Ia7073a8cef72f141253810558b30ba9c28083b7e Reviewed-by: Fabian Kosmale Reviewed-by: hjk --- doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc | 2 ++ doc/qtcreator/src/analyze/creator-valgrind.qdoc | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc b/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc index 07dd1128a17..77bc417d03a 100644 --- a/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc +++ b/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc @@ -505,4 +505,6 @@ The \l {Application Output} view shows some information even if the Performance Analyzer displays error messages. + + \sa {Profiling Function Execution} */ diff --git a/doc/qtcreator/src/analyze/creator-valgrind.qdoc b/doc/qtcreator/src/analyze/creator-valgrind.qdoc index 537f1acfea6..47d4b8c1d6c 100644 --- a/doc/qtcreator/src/analyze/creator-valgrind.qdoc +++ b/doc/qtcreator/src/analyze/creator-valgrind.qdoc @@ -323,7 +323,7 @@ \endlist - \sa {Detach views} + \sa {Analyzing CPU Usage}, {Detach views} */ /*! From 07399dfb0c4c294e51323b94cdfea85d6e1b029d Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 12 Mar 2024 12:58:02 +0100 Subject: [PATCH 13/57] Utils: Fix compile on windows Change-Id: I296e4a75984689a4cdbcea69519c4a27d5d5e90a Reviewed-by: Christian Stenger Reviewed-by: hjk --- src/libs/utils/aspects.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index a7f076d038f..2941cfec613 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -279,8 +279,12 @@ private: QTCREATOR_UTILS_EXPORT void createItem(Layouting::LayoutItem *item, const BaseAspect &aspect); QTCREATOR_UTILS_EXPORT void createItem(Layouting::LayoutItem *item, const BaseAspect *aspect); -template -class QTCREATOR_UTILS_EXPORT TypedAspect : public BaseAspect +template +class +#ifndef Q_OS_WIN + QTCREATOR_UTILS_EXPORT +#endif + TypedAspect : public BaseAspect { public: using valueType = ValueType; From 4e8bdd610b5899c83b75cebeeafcf82b6bec79f8 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 12 Mar 2024 14:24:06 +0100 Subject: [PATCH 14/57] Utils: Remove PresistentStoreCache It turns out caching the information is unreliable due to a variety of reasons. We remove the cache for now as its less dangerous than trying to fix each use case. Change-Id: I8238166486a2fb29c101f700af1c8d7e4ad7a172 Reviewed-by: hjk --- src/libs/utils/CMakeLists.txt | 1 - src/libs/utils/persistentcachestore.cpp | 115 ------------------ src/libs/utils/persistentcachestore.h | 22 ---- .../cmakeprojectmanager/cmakesettingspage.cpp | 2 +- src/plugins/cmakeprojectmanager/cmaketool.cpp | 30 ++--- src/plugins/cmakeprojectmanager/cmaketool.h | 8 +- src/plugins/python/pythonutils.cpp | 11 -- src/plugins/qtsupport/baseqtversion.cpp | 15 --- 8 files changed, 12 insertions(+), 192 deletions(-) delete mode 100644 src/libs/utils/persistentcachestore.cpp delete mode 100644 src/libs/utils/persistentcachestore.h diff --git a/src/libs/utils/CMakeLists.txt b/src/libs/utils/CMakeLists.txt index eb2eaed9ddc..18c8abda49b 100644 --- a/src/libs/utils/CMakeLists.txt +++ b/src/libs/utils/CMakeLists.txt @@ -117,7 +117,6 @@ add_qtc_library(Utils passworddialog.cpp passworddialog.h pathchooser.cpp pathchooser.h pathlisteditor.cpp pathlisteditor.h - persistentcachestore.cpp persistentcachestore.h persistentsettings.cpp persistentsettings.h pointeralgorithm.h port.cpp port.h diff --git a/src/libs/utils/persistentcachestore.cpp b/src/libs/utils/persistentcachestore.cpp deleted file mode 100644 index 0cac5f83cde..00000000000 --- a/src/libs/utils/persistentcachestore.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (C) 2023 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "persistentcachestore.h" - -#include "filepath.h" -#include "fileutils.h" - -#include -#include -#include - -namespace Utils { - -class PrivateGlobal -{ -public: - QMutex mutex; - QMap caches; -}; - -static expected_str cacheFolder() -{ - static const FilePath folder = FilePath::fromUserInput(QStandardPaths::writableLocation( - QStandardPaths::CacheLocation)) - / "CachedStores"; - static expected_str created = folder.ensureWritableDir(); - static expected_str result = created ? folder - : expected_str( - make_unexpected(created.error())); - - QTC_ASSERT_EXPECTED(result, return result); - return result; -} - -static PrivateGlobal &globals() -{ - static PrivateGlobal global; - return global; -} - -static expected_str filePathFromKey(const Key &cacheKey) -{ - static const expected_str folder = cacheFolder(); - if (!folder) - return folder; - - return (*folder / FileUtils::fileSystemFriendlyName(stringFromKey(cacheKey))).withSuffix(".json"); -} - -expected_str PersistentCacheStore::byKey(const Key &cacheKey) -{ - const expected_str path = filePathFromKey(cacheKey); - if (!path) - return make_unexpected(path.error()); - - QMutexLocker locker(&globals().mutex); - - auto it = globals().caches.find(cacheKey); - if (it != globals().caches.end()) - return it.value(); - - const expected_str contents = path->fileContents(); - if (!contents) - return make_unexpected(contents.error()); - - auto result = storeFromJson(*contents); - if (!result) - return result; - - if (result->value("__cache_key__").toString() != stringFromKey(cacheKey)) { - return make_unexpected(QString("Cache key mismatch: \"%1\" to \"%2\" in \"%3\".") - .arg(stringFromKey(cacheKey)) - .arg(result->value("__cache_key__").toString()) - .arg(path->toUserOutput())); - } - - return result; -} - -expected_str PersistentCacheStore::write(const Key &cacheKey, const Store &store) -{ - const expected_str path = filePathFromKey(cacheKey); - if (!path) - return make_unexpected(path.error()); - - QMutexLocker locker(&globals().mutex); - globals().caches.insert(cacheKey, store); - - // TODO: The writing of the store data could be done in a separate thread in the future. - Store storeCopy = store; - storeCopy.insert("__cache_key__", stringFromKey(cacheKey)); - storeCopy.insert("__last_modified__", QDateTime::currentDateTime().toString(Qt::ISODate)); - QByteArray json = jsonFromStore(storeCopy); - const expected_str result = path->writeFileContents(json); - if (!result) - return make_unexpected(result.error()); - return {}; -} - -expected_str PersistentCacheStore::clear(const Key &cacheKey) -{ - const expected_str path = filePathFromKey(cacheKey); - if (!path) - return make_unexpected(path.error()); - - QMutexLocker locker(&globals().mutex); - globals().caches.remove(cacheKey); - - if (!path->removeFile()) - return make_unexpected(QString("Failed to remove cache file.")); - return {}; -} - -} // namespace Utils diff --git a/src/libs/utils/persistentcachestore.h b/src/libs/utils/persistentcachestore.h deleted file mode 100644 index 0c40061d619..00000000000 --- a/src/libs/utils/persistentcachestore.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (C) 2023 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "utils_global.h" - -#include "expected.h" -#include "store.h" -#include "storekey.h" - -namespace Utils { - -class QTCREATOR_UTILS_EXPORT PersistentCacheStore -{ -public: - static expected_str byKey(const Key &cacheKey); - static expected_str write(const Key &cacheKey, const Store &store); - static expected_str clear(const Key &cacheKey); -}; - -} // namespace Utils diff --git a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp index 697af9c75fb..7847777c6ba 100644 --- a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp +++ b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp @@ -115,7 +115,7 @@ public: CMakeTool cmake(m_autodetected ? CMakeTool::AutoDetection : CMakeTool::ManualDetection, m_id); cmake.setFilePath(m_executable); - m_isSupported = cmake.hasFileApi(true); + m_isSupported = cmake.hasFileApi(); m_tooltip = Tr::tr("Version: %1").arg(cmake.versionDisplay()); m_tooltip += "
" + Tr::tr("Supports fileApi: %1").arg(m_isSupported ? Tr::tr("yes") : Tr::tr("no")); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index e90bc963a6f..af6637ee9b1 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -11,7 +11,6 @@ #include #include -#include #include #include #include @@ -155,13 +154,13 @@ FilePath CMakeTool::filePath() const return m_executable; } -bool CMakeTool::isValid(bool ignoreCache) const +bool CMakeTool::isValid() const { if (!m_id.isValid() || !m_introspection) return false; if (!m_introspection->m_didAttemptToRun) - readInformation(ignoreCache); + readInformation(); return m_introspection->m_haveCapabilitites && !m_introspection->m_fileApis.isEmpty(); } @@ -324,9 +323,9 @@ CMakeKeywords CMakeTool::keywords() return m_introspection->m_keywords; } -bool CMakeTool::hasFileApi(bool ignoreCache) const +bool CMakeTool::hasFileApi() const { - return isValid(ignoreCache) ? !m_introspection->m_fileApis.isEmpty() : false; + return isValid() ? !m_introspection->m_fileApis.isEmpty() : false; } CMakeTool::Version CMakeTool::version() const @@ -438,7 +437,7 @@ void CMakeTool::openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl) Core::HelpManager::showHelpUrl(linkUrl.arg(documentationUrl(version, online))); } -void CMakeTool::readInformation(bool ignoreCache) const +void CMakeTool::readInformation() const { QTC_ASSERT(m_introspection, return ); if (!m_introspection->m_haveCapabilitites && m_introspection->m_didAttemptToRun) @@ -446,7 +445,7 @@ void CMakeTool::readInformation(bool ignoreCache) const m_introspection->m_didAttemptToRun = true; - fetchFromCapabilities(ignoreCache); + fetchFromCapabilities(); } @@ -625,17 +624,8 @@ QStringList CMakeTool::parseSyntaxHighlightingXml() return moduleFunctions; } -void CMakeTool::fetchFromCapabilities(bool ignoreCache) const +void CMakeTool::fetchFromCapabilities() const { - expected_str cache = PersistentCacheStore::byKey( - keyFromString("CMake_" + cmakeExecutable().toUserOutput())); - - if (cache && !ignoreCache) { - m_introspection->m_haveCapabilitites = true; - parseFromCapabilities(cache->value("CleanedStdOut").toString()); - return; - } - Process cmake; runCMake(cmake, {"-E", "capabilities"}); @@ -646,12 +636,6 @@ void CMakeTool::fetchFromCapabilities(bool ignoreCache) const qCCritical(cmakeToolLog) << "Fetching capabilities failed: " << cmake.allOutput() << cmake.error(); m_introspection->m_haveCapabilitites = false; } - - Store newData{{"CleanedStdOut", cmake.cleanedStdOut()}}; - const auto result - = PersistentCacheStore::write(keyFromString("CMake_" + cmakeExecutable().toUserOutput()), - newData); - QTC_ASSERT_EXPECTED(result, return); } static int getVersion(const QVariantMap &obj, const QString &value) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index 0fa06e5ca14..cf13ad49c5b 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -74,7 +74,7 @@ public: static Utils::Id createId(); - bool isValid(bool ignoreCache = false) const; + bool isValid() const; Utils::Id id() const { return m_id; } Utils::Store toMap () const; @@ -91,7 +91,7 @@ public: bool autoCreateBuildDirectory() const; QList supportedGenerators() const; CMakeKeywords keywords(); - bool hasFileApi(bool ignoreCache = false) const; + bool hasFileApi() const; Version version() const; QString versionDisplay() const; @@ -113,14 +113,14 @@ public: static void openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl); private: - void readInformation(bool ignoreCache = false) const; + void readInformation() const; void runCMake(Utils::Process &proc, const QStringList &args, int timeoutS = 1) const; void parseFunctionDetailsOutput(const QString &output); QStringList parseVariableOutput(const QString &output); QStringList parseSyntaxHighlightingXml(); - void fetchFromCapabilities(bool ignoreCache = false) const; + void fetchFromCapabilities() const; void parseFromCapabilities(const QString &input) const; // Note: New items here need also be handled in CMakeToolItemModel::apply() diff --git a/src/plugins/python/pythonutils.cpp b/src/plugins/python/pythonutils.cpp index 2ecfe495bcd..0e0d66f6389 100644 --- a/src/plugins/python/pythonutils.cpp +++ b/src/plugins/python/pythonutils.cpp @@ -19,7 +19,6 @@ #include #include -#include #include #include @@ -201,20 +200,10 @@ static bool isUsableHelper(QHash *cache, const QString &keyStrin auto it = cache->find(python); if (it == cache->end()) { const Key key = keyFromString(keyString); - const auto store = PersistentCacheStore::byKey(key); - if (store && store->value(keyFromString(python.toString())).toBool()) { - cache->insert(python, true); - return true; - } Process process; process.setCommand({python, QStringList{"-m", commandArg, "-h"}}); process.runBlocking(); const bool usable = process.result() == ProcessResult::FinishedWithSuccess; - if (usable) { - Store newStore = store.value_or(Store{}); - newStore.insert(keyFromString(python.toString()), true); - PersistentCacheStore::write(key, newStore); - } it = cache->insert(python, usable); } return *it; diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 399efc3a1cd..e08c0227aff 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -768,12 +767,6 @@ void QtVersion::fromMap(const Store &map, const FilePath &filePath, bool forceRe } d->m_qmakeCommand = filePath.resolvePath(d->m_qmakeCommand); - const expected_str persistentStore = PersistentCacheStore::byKey( - Key("QtVersionData" + d->m_qmakeCommand.toString().toUtf8())); - - if (persistentStore && !forceRefreshCache) - d->m_data.fromMap(*persistentStore); - Store::const_iterator itQtAbis = map.find(QTVERSION_ABIS); if (itQtAbis != map.end()) { // Only the SDK Tool writes abis to the settings. If we find abis in the settings, we want @@ -804,11 +797,6 @@ Store QtVersion::toMap() const result.insert(QTVERSIONQMAKEPATH, qmakeFilePath().toSettings()); - if (d->m_data.versionInfoUpToDate) { - PersistentCacheStore::write(Key("QtVersionData" + d->m_qmakeCommand.toString().toUtf8()), - d->m_data.toMap()); - } - return result; } @@ -1419,9 +1407,6 @@ void QtVersionPrivate::updateVersionInfo() m_isUpdating = false; m_data.versionInfoUpToDate = true; - - PersistentCacheStore::write(Key("QtVersionData" + m_qmakeCommand.toString().toUtf8()), - m_data.toMap()); } QHash QtVersionPrivate::versionInfo() From 1ac1095d4d4c0a0d08c87b870d3a29243c183a43 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 5 Mar 2024 14:44:46 -0800 Subject: [PATCH 15/57] QmlDesigner: fix build with Qt 6.8 w/ the spaceship operator changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are new operator== overloads that are causing this to now be ambiguous. qlist.h: In instantiation of ‘qsizetype QtPrivate::indexOf(const QList&, const U&, qsizetype) [with V = QByteArray; U = Utils::SmallStringView; qsizetype = long long int]’: qlist.h:935:20: error: ambiguous overload for ‘operator==’ (operand types are ‘const QByteArray’ and ‘const Utils::SmallStringView’) qbytearray.h:520:5: note: candidate: ‘bool operator==(const QByteArray&, const QByteArrayView&)’ smallstringview.h:117:16: note: candidate: ‘constexpr bool Utils::operator==(SmallStringView, SmallStringView)’ Change-Id: I6818d78a57394e37857bfffd17b9ffb5101cdc5c Reviewed-by: Tim Jenssen Reviewed-by: Marco Bubke Reviewed-by: Ivan Solovev Reviewed-by: hjk --- src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index c695f488b1f..9193a1ba372 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -1718,7 +1718,7 @@ bool NodeMetaInfo::hasProperty(Utils::SmallStringView propertyName) const if constexpr (useProjectStorage()) return isValid() && bool(propertyId(*m_projectStorage, m_typeId, propertyName)); else - return isValid() && m_privateData->properties().contains(propertyName); + return isValid() && m_privateData->properties().contains(QByteArrayView(propertyName)); } PropertyMetaInfos NodeMetaInfo::properties() const From 6a74c829dfe7b8f159e20f43af7bbdf021318d21 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 12 Mar 2024 15:06:00 +0100 Subject: [PATCH 16/57] Doc: Extend "Using CMake with Conan" to vcpkg The automatic setup also works with vcpkg. Change-Id: I755e59ef0a88105da195e9abe30adca5e3011fae Reviewed-by: Cristian Adam --- .../creator-projects-cmake-building.qdoc | 28 +++++++++++-------- .../src/conan/creator-projects-conan.qdoc | 2 +- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc index 0bf54dde2fb..c71a8bed8cc 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc @@ -145,8 +145,8 @@ To view all variables, select the \uicontrol Advanced check box. - To view all variables by default, select \preferences > \uicontrol CMake > - \uicontrol General > \uicontrol {Show advanced options by default}. + To view all variables by default, go to \preferences > \uicontrol CMake > + \uicontrol General and select \uicontrol {Show advanced options by default}. \image qtcreator-preferences-cmake-general.webp "General tab in CMake Preferences" @@ -159,8 +159,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 \preferences > - \uicontrol CMake > \uicontrol General > + To be asked before \QC resets the changes, go to \preferences > + \uicontrol CMake > \uicontrol General and select \uicontrol {Ask before re-configuring with initial parameters}. \section1 Viewing CMake Output @@ -268,16 +268,20 @@ \uicontrol Build > \uicontrol {Rebuild Project}. This cleans up the build directory and performs a new build. - \section1 Using CMake with Conan + \section1 Using CMake with Package Managers - \QC can automatically set up the \l {Conan Package Manager} for use with - CMake. + To automatically set up the \l {Conan Package Manager}{Conan} or + \l {vcpkg Package Manager}{vcpkg} package manager for use with 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, - \c conanfile.py, or \c vcpkg.json file in the project source directory. + \list 1 + \li Create a CMake script file that installs dependencies from a + \c conanfile.txt, \c conanfile.py, or \c vcpkg.json file in + the project source directory. + \li Set the path to the script as the value of the + \c CMAKE_PROJECT_INCLUDE_BEFORE variable. + \li Go to \preferences > \uicontrol CMake > \uicontrol General and select + \uicontrol {Package manager auto setup}. + \endlist \section1 QTC_RUN Environment Variable diff --git a/doc/qtcreator/src/conan/creator-projects-conan.qdoc b/doc/qtcreator/src/conan/creator-projects-conan.qdoc index 0e1f60e664b..0e7229ba7c3 100644 --- a/doc/qtcreator/src/conan/creator-projects-conan.qdoc +++ b/doc/qtcreator/src/conan/creator-projects-conan.qdoc @@ -48,5 +48,5 @@ use with CMake. \sa {Conan Build Configuration}, {Enable and disable plugins}, - {Using CMake with Conan} + {Using CMake with Package Managers} */ From 1cf925bc176bbd6fb97991487cb08c322c68163f Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 5 Mar 2024 17:17:22 +0100 Subject: [PATCH 17/57] Doc: Describe the application manager plugin Task-number: QTCREATORBUG-30209 Change-Id: Icd40d6da99e7fa53f667745a4de32b03b1157c99 Reviewed-by: Dominik Holland --- dist/changelog/changes-13.0.0.md | 2 +- .../qtcreator-appman-deploy-settings.webp | Bin 0 -> 14380 bytes .../images/qtcreator-appman-kit-selector.webp | Bin 0 -> 5970 bytes .../images/qtcreator-appman-run-settings.webp | Bin 0 -> 5090 bytes .../src/appman/creator-appman-how-to-run.qdoc | 154 ++++++++++++++++++ .../external-resources.qdoc | 8 + doc/qtcreator/src/linux-mobile/b2qtdev.qdoc | 3 +- .../creator-embedded-platforms.qdoc | 6 +- .../creator-commercial-overview.qdoc | 25 --- .../creator-only/creator-mobile-targets.qdoc | 19 +-- doc/qtcreator/src/qtcreator.qdoc | 6 - .../config/qtdesignstudio.qdocconf | 1 + 12 files changed, 169 insertions(+), 55 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-appman-deploy-settings.webp create mode 100644 doc/qtcreator/images/qtcreator-appman-kit-selector.webp create mode 100644 doc/qtcreator/images/qtcreator-appman-run-settings.webp create mode 100644 doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc delete mode 100644 doc/qtcreator/src/overview/creator-only/creator-commercial-overview.qdoc diff --git a/dist/changelog/changes-13.0.0.md b/dist/changelog/changes-13.0.0.md index 163b25914cb..70f91721719 100644 --- a/dist/changelog/changes-13.0.0.md +++ b/dist/changelog/changes-13.0.0.md @@ -21,7 +21,7 @@ Adds support for Qt 6 based applications with CMake for creating, building, deploying, running, and debugging for devices that use the [Qt Application Manager](https://doc.qt.io/QtApplicationManager/). -([Documentation](https://doc.qt.io/qtcreator/creator-overview-qtasam.html)) +([Documentation](https://doc-snapshots.qt.io/qtcreator-13.0/creator-how-to-run-in-app-manager.html)) General ------- diff --git a/doc/qtcreator/images/qtcreator-appman-deploy-settings.webp b/doc/qtcreator/images/qtcreator-appman-deploy-settings.webp new file mode 100644 index 0000000000000000000000000000000000000000..cf3b2dc528720262c4e56d5cd449aee281831975 GIT binary patch literal 14380 zcmWIYbaPX&U|4#SB$2J3`Ky0Q*a;dkRvH*4HT~;b zbKCmc$9qX!B^l*^Ev9bVTfEIOwXEY##GA!=`WuD+p8scCE^Yb$^uKF6XYbm3G1|s= zmQ()5vWZXK;`(ede`R*Nd-+d!mwBK_JKej=Si!;IyT3=}|HTUDzkmK~cmDUMr5bzt zmu}vBlh4U#bE9yYj?S9Kq+OY9DlUmE23NinCH%~}zqF@$?d209QF13N*cD6!9pw}H z9_XH7OguBMF>Q96^s>sc7c{>u$#P+jk}v*|@M5vg!cE6I)ZBb#%XIgx&JAaNo@rzL zf{l$kzhVBNde-0h&)4^e{Mg*E;D*{%Tk|z1_*1iQKi+oscUpj3TB?^#`z{9OQ-&@(v9f+dERYJFMZI2(Dt9j>Zed&TdYX`wOj)$j^<&i;a=BW!_Oi{@ z_*-~R(}-^a$7Xf$5+A(>a;rbg?^b6^kDa6P=ut~tNx`)DZ#LD2S2rAgnRs~8g}_TT zdrohi7Tuhu4Gy5jD|d&ngZ899o@~FdwQ(H5~M0` zDC%;`|Jm8{sLAm6o1`$N8+TY4V;?6r3+v@2d-z*SKeEr8Rc*?}jZI}uCfWYy{6e?9 z66{euaM|dObxfyB%jyF0yP-FVr=Dz)I~bwD9KMnL!`Ya)gr_@v0@APRXq+?aJI+;tChdG|=MK|D$Jga(ChlBdFSh2$pLFF*G976P1U_Zd+~2)- zYSg-yeaE!-%KpBzqR`q-(=hM_>B$eMwZ}RAG&_uX{J`&aUuL%G`CcE|*d4_{m)TmZ@bOOsZSsw*9&F zf62dVPU?ZTPF-x>dnsJq@#cwhca9ubF6a4zHSSq_M)Ft5pWMg(r_AU*bSb=J`^HVP zuYL`yo4d6s?pfG>$EUr{bDU$&tZ;0}hzQ^n&$+#BsuwbPlrvXkbk%0P zoc!gO)z-zg5BIYPE_l*6?ell`@An?5G(Aq<_Px}5{gSGJQsf+dy!!p%M+I>=da$Yx2U9wHo#e2f#A6yS@PKr5Y zE;HDxYOlBAiND-U)}|OvRgce}j9b2*$hW9_;$OA(E$`U?ORYuK0d1^WEiO)H{bTsP zme%zJ)%}y6wKBtL>5tn}Rk%5{tHfQNEU#+$RQT)VrxG8v`Zp?GC55|Y@pfHN*z@Yg zq!uN2=7T?a*|AzZdBE%>8^ay5HZJPD z&Ap}e%o>^ehl_movf4c@33R(xrFCJ_r{jm5DvxXYbWVBvqgsB>qtu#nyPFSQT`Yf4 z^^fwe)1_9LZF?(NwF0om(DMlJ$wCbc5RlXYptsui8Bl7-1-~Ze}|L#W%Dk!gB+C$&My1E zGNFm#UBT>)yN-T!48EW7lv{pc#;s@`Zsp8H5_j&z&Q6+BcVJENx+7{1C!*b}jz8G( ziR-wFP>Mpz;mwbkZY1_H8vUF7s{35#SY*EBn5D z?G3XrSe#MgwkW@5YMkaA8LMSzc=)HXOyo!=lQaBkwr!SBsX+z zP}O9y?A7OXKYZ|drNI(Tp9u_Swd;a(Gd|c$C+{?TC^mEE?z1B8y4r)`%wJ0|E@`zK{BHk3=CFE++xBBG&(D)RAa$sCTkq58%Zcsxw^_wCT`m4&@V6-O-{QO1 z&aYj)-utg?0h3_}H?R2PJiUIQZYPKLuOLUi$E$gli|2h`{k6EVWWC4?HLq12 z_7}Uit?*r@U$o>Nw~wmz!k$)#Ql0hj)?|EzLch z?$zj}`XOTj)4#L5_3jzWrt$0E$NS1Z?R}^%1y00#-O-7QGZ#gMSLu3cTM5P-O6s3J zUz968=*6kX?ak%$#lHXQ3yLPz@O=-~KmK`tnd{blkFQQ$y8ZD_pJYe2D+`{wR-cJp$Jv{KtE}0$ z;(Ga>sNnwP*V!ZkT-=0Z_~-TNKdUJemOE=DbU8rg)dPzU8FwoGI4*oT>qEx1iTC86 zd~h$kqLJk^uV?-*{rznBLYGX-KD0Q}T-qmmYlpJwKb}(^G{ZNdZ2z}yo7QMA-xCveg`r}J-K_f@ z7dl^Ld|bCeB6^xRr}fWSoi9V|uR3qkQ@i9O%wuG6=FiVx(?xXx)6UHfnlHrQ`}mgW z+V^a1hj^B4tT`^ta_p?y!M!V9XMPm!Eo^=@D)tc{x-{w@OL^{5 z!F}hp?&)j^+>*RQ@6!4!-zJwRx9)ns@}s@vrVK?5$&Z~vEV73gW?z(eDIw;Zvoc#~ z>&gvoi#!{Cd`K_K&Rf|YxmNM(k}l;M?%AwokFm7e^f-|Ax%GkTS`mq7ysNT<76wX| zzDZd8q6TL24?zp{V_w8wt?B(1F0hRCCHfvtZd$5Rc z&E_qOHtY^#ow=@SiyybPSJ#x#;mg^5P`~fnvC=7_)uMtg0v=qyx7eoOyv+4}+qL0CB{F=Nq7iED4KY>HyuyK9C`O7)tbDt#ep+Fu7bhCylf_Vf)-R4J>9FT&(bb71?Kf&oS6o=4=5u-7 zi?dVDHhiC~tiY;f%kycP=H*(SdJGOk?=jQ#D*(+z7D5oWt%G}-iX`;U`L?&!a9@|?0+v!|o|;Ix)d7g6Qvgk{uP>K*rMH_se_hV5-KwEo-fOrVeXpp)w=3D#B_0@l?>1^)`&Mh|hcK5d4|AV)G zwoVh*@M`(yz$d@9n{!EubxQsGn~Nv+B^H*)z;S~$!p13rN z=l7qvJa?W>+SaL?zoAk7!1t*2t?oO_rwq88!@utWA(hVim{Yh6%Hr$o^*5B+JE-pOd zjBMGtwO!mUp*KrJw(@j$Cbc)5{t|HUi2YIKmal=5hK)v^&1zTF`JFr3N)4X7UC<5{ zd9^dRu%XfCZe}0_#1HV#?C6AnM1=nq@6NzT4 z+IY@s?|63A&t@Nv zE0p;>{|5h!)k2@=_i7fH)o{7oemeac*PUq{+fL^i{@=NP$HsZv49Dn-{K#mQ^AmJa zF7PonZ8KevT;Vd?@wVN?P5b@lJKi>6ww}II_S4mUd_`%QpSu<-r}4Jm37PO}_nmvf zKZ}d|?V7hGvX!Y7Tg(>v+?)NWYx9{mL8l6RzU+@rAr=8sF2V*qUtGm z!gc<%nQL@stUbBltu}M@@w;^gL*5DfD2!J6KigAsQzTpNWu7-hc7=A0FZWsITo3hM zWiS2H-vcHytLBl8yv4HL(;i5k*y%EH>94*IoR0enxj*UORXkyy=a})M=CRou(c{u9 z54Y{@jydyxj=r?wxt~Ix=X0M5C^`3LwqVpk?p*sk37;JE4~+X66{CeNK8TFdVg6*U z@WeZ7Zr%+Y{b@|!j&d#4ce?Q)GHwkA@4Tl+qkP`HPxcNnshB1nT{zV*(X*@V?58AN zj_PUR*3KLE9^Z9A;r_dV+)BaE_RqUTPlK$B*sIfg`^cvv>!Z1|#53|d+-`n%yq$Xe zp74dAt||GOmI`iR-ty*svb@}_9lPb^I3L*l>P=|8!T90tvzm)mxwQ@DL9LU$(@L5I zFKTF~oZK-tWXa^#8-{Q0eCk+m=0kCo@Z#S$We@8d?YYS5c18X42_wsC49%0`J5E(R ze0@dD?T2~x%*O4{&8-f0?Are6`j^BhrJk^*WT%ULo*yx34%@}V#2SMdfj#CeEAISo z%uxMtl>d4`Z_Q%2iZMuxb3^BYt|H;DE-rI`5G2Q>7Q=Xnl|*-C|f(;aN9R= zu0oFT{S)Hd^L)d@d$(>n&~W+tvb1=AeZ97jTUTtZ&-GfVXxZ!gwLjeSM%3Sh^S&{r zeC$v2jP!q8d$#{;;?vXwhuHHBdTusvzV3UrwMhS@llmdi>3=e|Nfj)5*1mS_+Vm+` zEwtnX7YDq*HhJw@pWESQ=X_iom?g3yV*SAbO?H<2qHoyuPU|uhsE* z8&R@?f6vt=+h-+b35)Pw-6IovJ^IhWM^X`g5BsXiF$Pt(1XNnA`c&{C{J^`c+JzD! zHdohN)iWZ`_xxQvy>E;!DH_46tk6U_H zeoSWfN@o76d;ZoA;6;{XlgCeNxEc;?bO#3rzL$G8yNf&ViL|Tc%QI1D zTepT@5)Dj!c%bM6Kl>{Ft)CpUre>Lxq#U{WYN4w9D~FDX71CilH&$-`=d8WGL1vr1 z!x{Z0ZibxY!cKeHI4kC_`1$esJI4JNIaxvsCTuje3-Eo*%+6*U`RVahwP3%H{aNxy ze_X!sJ$^^$)t&`P$FGEJcrG2$8Iblgc=5?IpZ$8z*J+;*xp~%o-$Z%26_rt;VY}kO zuTNUEY?_VKuDC4svw7j6FQd!t9D+mly?Q0}TxsPLx6ID<&$PIw9KGYP>XPr*$D!fZ z7X@8XTfNRT)mL+=)c^JW{$KSi>ED=<|89RMb98TFv!iuE^5Vp#9FeN&QJhzQ?f7wc z*|XHwd$ug`t!OXWw6#?G?W#Q1W=5{)h|>EPZ&{uC_UZsvL&OiUz_+U%6&5G2b@F*| z?z@ctyg(;I$GuH&h2s9sznh?awEN-0NlmBAQ%=a17aGci3FdeT$X+@5NNC|ThnGb+ zmdrgd@8Ifd*DCdt-k-C(@>k%(?x~@gvnCv}F?N)Hc4zmJFG*YDeai!bcRTi7=UJ8T zG+5>{voCAx*)pR0ss?NMBvcqo4qD%)~%z*pH7&6^NMNyBWe3rTkK1MSH1eV@R;b2g$u7V?mWdL zqL{L@Fu>NJ?xgAC3dgWlfyx@P5?)K=YA-V?*X`2a`-1}L?Bmeauhxh+)_8Km{C1GT?{>_Fs#VM6( z+D8r^R#q)&w)odCG(Y`!Q?QNP!Ge+o_v^bu??tmL-6$3I;L+L;VU0r)*>_L9e}18H z)s)!_EM^wSKf6=i@o$pV2aWE&Q2iAfvRY!Fs&RbY3 z@ykmle0Vkcz_w?R>~bsayh4QbAKtog`&QIpt_6&( zz6q%l6t8e@PTDKfm>Z#OBYXJS<{1ua!`t*qwmHez*n}jVkAJZDV5Yp;s?82EI&v$O zDoRe3$TeCN$TR9)nAgp5d%N@O5bX`!&a*dIu?SynyvUM&d`|WDAk|0fG)`^Iau8kP zb|W;;NWg91L?1)r$Fl_1CxzWRZ!%MK6VrlsLHU7(JD!Tay7wyn_R>$;#%ABc&n!C0 zw7@9k&|&`7RnGB0B>rS&K9T+zd*OC_#PvN(ekD$Lkjv}2xAxE5$9CzPe?REE@ZrAM z#&qqC#{+6EO-kSm3w~oLB~|igyKh^8z0l(Y6FIs&=Up?Lp{sCgA^RN(ub<*|yZGNL z2E=l&ZrFG&aN)HYg9E2MZ%u7Y4{qh~JE3ML(QK{VU@p6Y!}?zGVqf+{J7gxU(3n4C z>4Y0!{;b%%z<1-S7knoLlxBW?wff7J8MQA&FJ)ggPJX}2+e5!4q7`?)cfrRx0a1jB{5JVo=} z*|yzu+Pi428lT)exmTM%Gw;yX3Aw2eE!6FI%PLtW$H`@0#2@AxZ;$D5^Bw9l-(8Wh z{wB+h-k{fW=dfGG?OnlCebwNu%SOq&=le}Ur<9o%XZna||KT(&E1DYB8>;%sP0L}+ zjrC1!`o6k}FD7O0TE#E^YC>#mz4smk!7|agLOy(r-+h<(%9Sr%$(5{;%JF9N-bMa~ zW>Q)qJR9sTJ?VVIf5}*~##8+8J`LOH0e=(!KJ{f*kKVrM;Efd@`b$E@+szgp)rb&G zUM#ap=PpZk=gQu#P8lM?>%&imbxm(gKjd8P81-}Bw}-aJnne#zYq|LKQe0z5_LIV$ z6$f27{vF|A;#=b-xQxO3&~3x?PeaflUm>D#i^@wf0#1GO2X?E}^v*?pq+dFyhg5WPQs z(%<3^LuZ_l{%u~UX!zeVch8?WOXjm~?_8R&e1~ta};$+w8O}KYqmV-k7|w+-Q1@QLs~M zOmvKZ+V(FllfD(7jOGn1RBc&y@j>O*e3w6LYo~sGaM~{9zmSb=-P{+A`_pPZm2jw}oPp~& z*OmF1`%NdST<#F~DRZk^-C)@#n-j}V+4-1f@B5QD%i%|TpKWB&D&N{heYrZ()h`yx zMev;S(^Hw@-8RqBvq|h9oApA29h$AT3KzOMD|Gfa@Add_=!?v)>6;I&+{7>0*?*;F zQQ+QbDnc$c?cZhzOC0u_y7zD8(TxRcNepK_o(lO*-TT%u%dMC#DQMQjQ>yc|s&6+} z@VzxvH*m8H{Z^KC=ssu9#<=54MQ>NH5!mOS;FH|4ch9M;z156+_GA@rzpKQoudpp- zL-NT_A6@M7mM0vabkR}&WzIprgMF&W*S7?79G?{H8eGOzrxU5Ra#@b(p^Yggd%UBT zmw&$ZKuNik_w=eQjM?`#@t!}C8@VBBgGlnVZl9BBz6tLP=Oy*XEdnR1osS7~ zDjt=v_Ue7Az1jWv(ubx?eNrS9<7cWe1$TcGNxpR^`5H&*!JwW__mxu*92IKZdAy>_ zuxyId>2NXa*E_b{NIt%lx9auDAEo_oWcTS_am_p3q&IbDYf?e+cD<=Hd6nirabNg! z?&1FB8q19~J1*JGS|%cO&rbgOQlrgI?sa*Q3GNG@-kNmbV(H2=Z}?^{4@}6*?fURh zq;%z(9D$ij3PhyN2Fm*fPCj*p@8P5hk*KOemVY?9XN9C0{_pp`?eVcNv-zIYqwZ}g z!LLhVqO77HcwKw7V~dYxz^35iOAo3A2Q6Cfvdrh|q?k)mveVh(cesYkieZ?4Rp-mu zV>uTKGe4Babk;95+@|7P5+il5P1`d*lShs>YSH6M4^AKC^olWLzMpeOOm_OVqCfrL z995UTvzSq4{ru6k7h6?ccJ7$zyDedNT%nKm<~aAWJaJnM_ddR4R-(K;^5r*6MCM;NWd6S{|&bR+|ziV^2vW#Q>^ZWZI?Jf3vHDl-7^)pL9?kV;RIkk1- z^#^Na$1J#g_rQxjXMMRfw!L0cJ&V^KjC}rRlEfY^omcxC{@n@lN>LM^!Z`2pca_Km zlM3V>OrEgwk;J6HdDnxqBs^zjUYx{sKTP0=(b5ou@S>8J{cL8sePl5kk(pFV}$X&+aRdJ)#X`aWE%hKh&96HCNoM-7BNYN~zMh$+F<05*c5#f<=VJ<2HhKCB zEnOeHZR?_|-(;q%b*pxKY4K2+e@1=n`NB+}9`=bUd+(GvmVB^|kJw;$e5q%WL7?~h z7@LWcU4-wd{{9>#^xuA~bzX5?;hgN^bG~{%8tiShIJlqvp=?{YCgE_OclS^KGxgvZ z56~nCV&z5Bzv6?*Z|-RDZuM7vW-pzWe9-Gm{j3n3<4sB@WWh@`q(dKGdRSX~Y|7nL zKRkUIb&c~XeU?R~ZDTtlTlUs=Wyr-+KXV;jI^w>9ts;a(Zs|i$x(<+AiJx zWX^iz{iOX|<}403*IF7qzE%A!<3XkP+~U8w#(tF^Th63hUD4q;H8z&{=fz1Xx{rp3+!Fo(k4yf>XX#o z8FJdE{xnZsf}#~ibcf%@KUOOyoXJ_N^@4p(#G%QDdS-jiYQ8g3%=#18k5Bh?P41iD z5Z?UvT&kq5vEP#98y1sK_~?g<*I9g`g)F89#6YojLR7_32S{ zH+_XK9r^UbBkR$TD`)ntH{aa5EYEE9GkeW5J=U*Y$AmI^r*T^y`2YN-(w~L|4XYYG zdAIrB0~udzzi|1V=sS*Sg`S^6141lMhhGdVQ|`*-;he&9S4lUMMd`(p4=)0G<6EtM z?|aIpw(X+u<1PAL|38%J>nX-sJo@)-^Us{;HlNH}ziw4Yo&MCDE7DLx_@&OSgq+2@ z!?V}s9=w|*+_Z74${E?VdQW3TfoSP(U5{t{KjLz@tyXL3gdbj6~*~UG0{0e73 zd##rn;C8$q;C;=lP06>eT`+Qfd1adU%7=B*tDi+JU&}6gct-W1w2Pbe_kRzV<-dE? zY3260hp)_0_DZeXJbR%|qn>xz-#$slPn9JiJ`RT2sylYNFS~PImaqSU^1hviXH;+B zvz~w3q~d#19fmxb zhpRT~+xMFt_3e-6cPxE#=k?Vb_w(~aK1NPH_i{?#BITpgB?o*EG(h!>#q9yuy{*0DCK`v$M>iQhm7YY;!{{MgdRn&LU;}>uIOxyMAM!T)? zLDxIq@BMO;KIqtQcV&TC%#nHFvH8jz3vXu~2(9@oXYI&TEIN&edG154b=!nr2<+(c ze#@fS(YU%|vLfTMs)YRd8z&k9C0DV%Z#LNUh!F1G9%_x$iJn+p;wpD;i4b-Zr1ME%hxh0iIA zXEL^%G0);~{+(D*Y+knAM|0u{b!LgWD=+#d)#yBXnBgO^_~d#UPvvcQdJe9>CVlaN z7`vd1{N}y-Y4ggby|!F&>bqg5t)0Ljzb#sH%{+UzWhYOm4a4yXZcIK#$GLLCiwdqC6=qUU?epO^+w!?^$29fU*Z{#z&Z=^~ zul6?2HcY5|lR4$V#U!W#VyvhP)2^Kd6VB-y%?B?HIytXCrCaae&W!0bTaN7f`Sz^a|CRQ081%N} z+nm3*d-`n!CpY$489L&J7O{Zs;@X zNU56c*eR_v;n+O3Zq~Ad!X4QL>V=*;`wRliS`0TFJoctFT7Y-vl8nXDAEi23yjEyD z@=3fqN#(=?hhz1@wT-)E=6{Y}_7b}A=iTPi6TI5rd~TPYc)P**{=Mzm)_TwPeU9Uw z^ZSsUeVFelp+A<650&O`ZgxKL;zC5)Y5%N@v}R7{7Z(oYOqz7iaOp(D;uaZH^1?%?%_J^zd5KRj!) zQZ6EkUH1%|dWakQ5<#B>w|LBh7r$khe`SSlAZN&q`3GiC$!HF#3}n^j<*F`0VXTuwyc!x z+9BO#_9!%_elcU&@nyS2H*7sz-~QR+;Rf1GtOnz(%Rnqt2_PpvsFe-t_J%JSdhigT9xAZvKGaIUv(p9xyslU!Aze{zTZ z8}+5F!F$u5PTTq~+tbMN-rGJ=7GZhSkn=7nllJATxV=er?fkvdmWa;fSeKMA_r=wy zoo3IOYUJwvPPo4&UU1c?MWrjRJG+_R=nR($f4$fwmiKD%Ys>9|oI~E(%-byZ zN9yO+{C}s_5B%rw{kii0r|g97Q!B)GF5YRYsI~L1;s4@&F#(3py;G*~9y3_oopANY z)0)m>|9Jmg-~01>`rf~}`Mjq>->k zU0r6WUK5pDab)ST$XJuG{ru&B#r`b*F>^z~qwQSheBSyenhPw8sY|{xnSHKKQi8@JE#F zCZ|;|Vq$%CHZG!UNKinXrZIgcb z5~I|W`UxJcEzhGE<)?+TuDNv~z`W*vN{>%u&##RPGald4Ve{2^y}88HIZ`qH-(!>c z&*wZSF+KhC-1(LRMf)Ub*YX82RvDgWcWzs~Y~f_Z7asTbHG8K8XPmfDpWI&*CiX6T zTh%SE8Jk@{*X1hdT<7|=Vf*QO|27=#v@pKHbKm}K*u^7LcsU*ZMlhVo)j#3P86bY@ zmyWn?*v2(Sa_9Hn_T#ivw-C47S#wjK@r;LH!8!4_)z6&Ie?GuzyXEOKxlE@|!ux95 zRZj98wJ_;hnOzjD`W;!=hXNZK(&hW;f;D-JQClgI;jSljd9{%pnxHCLq^>Wjr zJI)+qTCkwk@P$+4e%BxGr+hwWE^vH)Q~z~`qJ1ollV0t(ZGI?E&qHc);gkcx@6)`L zCbrjlOiOp2ldv=FK>OvgT+PO|Pe1-$7Tdd0E^z|`*R2k{DPJSsS)VwaA7uHw<=m@% z%TF!cUAFhJ=7*I+HRr^GPkk}%{t>61kA=GLyjMRT`IsgZ~Tom>mA@f9%ATMZG2ZNk(D}#WB*!7g~ixUQgVq#b&{r zJ-0_h_xJBZ-=Zcp%-_cUv~J0V?H3h~ew*jU^F)|u-i6jpax+&ya;>h3G7Yn8%Uo`J zH6w9PUQIqn;LeZD7rZ`n&p!0EHrkHoe{=7HW|f@#+nx*VLuw_O2`FAB{m22)#<46s&Go5wD=KYl)Z?=E(nR@rn?`Bll_5)KXYbmT7i9Cn+4;UzhLw%WS9Z`}UD!BGU|qX76>9?2VVX*FF5bV2k;$Z@U+$%R4NetJ$#9<;aZb zwoc~XXNjH_OY!@5W6%8UP3tQXI&zUY)dF_x{x@sYw$;7e%+6(KC8FbBEfI)ib7kH}*|yUBj?q_m$`n zp1hx}yS6{{etJDE=iT}lu9I0EQctwB%ZGh!+xOvWyl!gC$LfV$yWXl^<+n8T-(S%& z(_qGgmIXpDl~T%9E~-hI_DIXt{*_Kf@EWaM&PFXBX?uTZ+3KdrR~;>{N_!Jq%K5TY zp!a97kd_W8hmtq9Oc1UtDIzZ|AVrx=+fA;F;bV0 zO4U2{%#B$ZmK@r-Ya*9`?zh!!Om$IT9|rB+E&MGszlpu+d$^ogM$v-qSXc9dp-QnW zcRX)jTo&S#a^=$fzOr>6{ytr?fa_mT$j+vj`C3y2%5N+%T586<=xAN)ui9v-A6r%S zeRp0Qedt?lwA767`}Nr-zBl&qdN3EAH2om5ocEyLo<|m-wCMGL5tJH>7WO`1e%P!U zbAS8OWBel8AN7jvS3X=RFqM1%<+i=o3(nM=Jvav5Eb`-tg9&qMK;wtn_utHR{l9!) zIfM85%gkEyo>wzJcHHUmZrt!Z^uNujb{WU)gCE{jFRB)bI4JNid4Vxk+v>&DB^+FB z-ixdM{aKSx5q!n}`^Q}k^E<-y=bwL9m+1W{ed*VecV*p;j1yA%&eeW*FTKS*Bf8LY z?R4G!-|Wu|`nhOF3+=wkz30q)p3iY%D#o#m#@DU>-Jd$){N>A1cMsp`@_v_LSzkXv z1gvuZ-A&aWw#8ii$s3_!oEy2ZGMM)FLY+A zZhmfW#=&-P5_j^~XuD?%YM$>^d1BIb3*_12`;Mh{KDGg@r!_5~-zf6C#B5M%B5TvJ zefOK2`g`Bp)W14saadVb)YVAiy-6<=w8PI_KAC-0BFleX=92T4pBL_%SNBli%T32k zYa*Ui=Lom!+_;%udraW#oj-y`&2}}Bwog;ntDKt|{py7Csi5=>-W^M~e?Kt)Me%yA zxfj?R_1}_bBkF^Heb4R`n=t1@mp5kGi%$5ulzC%Uv$24@!q{>-mlnH;GXLI zH+)LpJI+swcj$bp_!+tIMJRNsa{7+k+YTlE6XZowKueTgZjG7@UXt9Mb(XhxpVG$O z#EH8m~!5_`$BNL(W*I8=FGWo_IXcUS?#&1`-6+)Ow{VQEOUqV z(is(|57}6JZhV{M@S0DCg|TP{qh6`xF4q6`_uqg2A0C*LVR@Trj>d(F0tyLD%N9Bw zoHBV%@ujX3g@b4K+ho?SxWhG`5y`4oxcS8G#WNXQWwc9Rm{N3()JM6-VYo}`WtqxyX%O`X2 z2*bnRRe%1kTKnMLyH7&z%I*r^wKY!3e|PWB-KUB#Ocq5a-Pm<*Ug@%MIwCSDCRStIs2ByGmZ>w5zi&vk`j`rQwYrbRU z#jhRTwz*x;eeTA<;8c0Ya`#I18y4B8w#7fT-@(3Pt^AhlTW@`x&wJafZ^rL?_2=%V zpDWF|7++rV&&zM;{&(-~kE&dk3~D(lw)q~TbPb`1|L>QZs2lW=E$Vzy?)0^DJR8#fspR%8n?$8_wC81HS-i+Jxb=>2@?+UG!HJnGR!(%>dvP~wuho6m z^L*nv!mYVaW9OD@QBjFo?yk81|M&Zc2bSA5 z$L0L|boSn~S>ZDx+SKgK-+BdKb(3XX-PUBwDD2>tvP38JYM!6-`oQ#MrlBvHBZ73b z&hB#l_H)YFRU-2pQsYY(q;Hx~TkpWYq~w(KMMpoWan@%iFcbqM?z|xX+?>m9a zD<5}U+$K2tx=qXT%2`rPjMbCbzRk-CDQ%B=xnMb)a$!Qr=`h|Zvwd!FmL$z8T$em| zLHojsDR~Y%E-q$Q>26)F(0SZ{)k1+ymvux!zs!jac0Ra@=TTV4U$?p1XFna7w{T_S z0_$hXr!p+RU^uxgTi5Dxi{wr5JPXguA6J|H^bhUfZ7otczh~`|DM$T-5A&p`DoCgV z9vmo^*pwA#_ah;H=fXerQfgu+ zqJos8rd}<|V#(62nbkL~w@+GU!xhHYU9ZElC-89XwP3Z}xP!x@Nk#0+!nq;poZFds zPA@ZirLyT{_M|_*5?hmg1xk5@E$#hvFYHX{9H+(e%G&iDLV2EEmP!xWnkSdbZP+8V zc6Rb+|MHHf5*?CXmL0sjWUJVIeyJ}{cI&cv#ml!RgnQ zw&`Y{Jv(E)F#(p=bsxaPMY}fOzwL9CbxH4k|0}q;sbRbP3HfzD&mi} zc*I}Y_U(dE3BOZ)$Sv28k43lmXMfvvBzDQ{-^)Jzu9r*hde6JSE$D#Ve!)Z93bXDU znR1ThzecO+i9|0!1698x{*zdy{B=DV9DJ6iIm9{g*n;ItA97~j;#5>Uo^xoE&NF)u zG~4=ly1i@tOhvckLn42V{z=bU`1QWp*?Pt$PVYB9X%1jz3H+B6P<2^n#gZ3%nbjxV zwsUoOaYvuiJ|1IZ5nuD_seM6GrQQ3Z9COs42`|rI&r?-oG_`pvB5O3A@6%$*Xr;=DPk^v5}K& zB^QT8TJr;^H=b2nWW$VRHy^pBU0%7kz^eZKn%>TT=k#CCm)iI7Z~MKUPyhTamVUl2 zT2Ao*Ylba>32Z{qyto^NjxoByNj`c${M%Dhc8FD$-dm&ITw#>U9H3D_)iI@BQ3;iBEc7*oNExC-D}E z3h+tzRt9a3+qov7Fzj68QRnde^&1YB#2VV%_>e59KGRXk)XY&alyPF#TGjiUY!)f) zTy2j0=ciB2m8*I#e${^e=a+x}wzI9eZxQg9Eq9;sv-^B&+X5%Au=6@`D>Cyg>q;&T zvomao;xa38U5g`DJyW>q&KYvhU&5m9s^j`=tJcgjuwZ47-MhtU*+-!>&hx*2pa1*8 zgA=w>Zi=&<)VYxU=(W+OEgBOiuAh7QA=CGAuDM~K729Ql&U`QaAfuD=Ak#``S@X8p zjkis`a%8sLUK7C~S`js^XtBl$ex=rm$@3Poaj%ptQnc||GQHJ}!(W(H;@PrAr&~Ul z1lxs$+3#6edDx&PpP@gV#0m&ZFaPuvsRDyMhO*6pQQ_urI|gq7CbV!{a~ zE2^)a7Um26efiF;;Gk;n!VJNq3pratvW2<0bxP0Y>B=2{ciQHaA@@AXqWx#`v#&d@ z@}0)6_Wt|NJI{(N%{1S?je45;`L@}7ZO<8NZ{@_zNjdlYuLtW=wwLCAj;A(UH2G}e zc{h69bW=;uZwt;H6=S#UU*-JeXOrs6zX^+)Z#z!v>66ap|9oI`Ab0-6x!>eE>n1Lp z99=MJ`q}*Qu4DJlB+kDb7PwwvWeDTtLjk`s{ftbU{})V(iTR|WIMuvzgT7~)cb2u@ zf4LoQNiUz3TxV8S|EjWVzN@Op2_cK)s?Uzk$bGHC99x}fojEf_XX--h8D>HAUpz2L z?zVhW_+fEF!7sl9lNn9qJ=X3yTD_$632)V^Mva*}V?OOsIJYR=ApMd-*z*%-*!g>Z z9G5h@I>XyZQ0JvVXku94oXJrJoQI6pZe0?wZHCvk_Mmwao@*a%uD1Dn;p^9WgNenL z-o1V;$Qn>qb!l4Vmap6YpIPDHdGpVs)QexXo3P=deK+U0hB+D3_$J|>f0 z)1&HltGqe!*Cbu~^&rBUPSnNlL5pAJ~+Eu5z9&MKz( zb34;6RgH+c#dPUrZ!P0#24NwL>94E4vRP1ss2`=ZtCPEbP5oxD(-*I+VcF*w!eqJTHoKr zCUWNKr{8nGc7zysF5fLsWGxu_%+K#t^aR<(#eAl_{-sY;nRRlJ@!w~AV;yhs?bc2D z<;W)SeQmZyTK7$cte&JYwM{!`o-O2DaUz>nATDgmsnX51&mz*4T{z;iYBnE~v@Ls~ zFtfxfUFb;Um#DLz5x-Izj~eJTsm`6UN^Vk=$;*R>_hudnQ_@)@x8*6PXOH>!iq!Pl zzq&S3kujTYq)duP-1?6{;#bMSDaKN1tAG8OFE`W2UU+Fy`P-+7rBQ#SS?4OQ<%_cFmdOI-S2t%wfGboB8|y zrKeABICxe@G4$@_D3*6mZ=}ULeivaC4redkwoA#g>A`Nf1Z{SE>$K@Rb1VPMx!WK5 zbou^rcY(B|g1>Kt6b>_85xVaCL6|+Bg-_0cRo}RG!o}ycVGYiocH>!gn%P<4$HtZaZGD+$8H9u|dm5GRELgTn;oPF>Gn11I zaw{|>(>5E0ZsT58;gNMv<>P0KYrWFOSDDN?WP0;^cI-SZ&$n-f-SqD}b4yuOWB&)- zX!YB_*>5+;{NESKPT#$1b^obutmh3r(I_E>!^fNrXZ=^Sw%xt<%RUxs;cu4=L|ID@ znoV99aO}X@ssm}NN5iiAzR^iJAinC(VA;%=%y4jIQ}5eQlTS zb*uWv#B;@M%Q)j#zSKCefBExO{3@!7otzV7Iyn-YWCB)SpVr>Y`LW@Vo{;du6cH2I z=%ZK9*dJ9`zxCRxKPR$u=S%)AJ$>9J@RHzsgMvgyyTpcDlO5RRsWFFdUe#cxkdmLL z8+_+Pj9uty*>!$(#xE|$Rs@}VkbLPU=NHGfiyfank~CX>R4KE@Su*qHsa=QXB{^P^ z=QS!Y?Yezo*ZOB!#h!~Q)&K2j&{No_vFD?~q?qsXW}WsHUNe2!sjzw*hZm*EnN2%e zzxgO2@=U+r)tL~pJO-%BSMuU{q4q!NDSbeChnc zRaVSW_bu4v^W^SM*t~k_6b<(uPvfUwDVgwU!i~C&^z==f_PgubRD7=9Dm(d9ZSvz6 zey;nHzD_dHS-_P0D>!G!S;p-#yL-ZS z*-NU&`K?-4EI#p0e{sbV%j{`CkKX)V*?%M{Ni>L~vnVHBZQ0C%?V0J5KFBQHtm*&r z&i*6*!mcLTtJk}Rt&foNdwEtn_@STbp?4yee*Z}m?_xJU@xNPWN7;?SpWi2DKU<|& z5%xc_*1RCbcJ`yy;ql(H?I&oT{g4(_lX&g9{hGRx3Bt|Kj|PhOa35Pbzwo>Hp7$Sg z*2cb@lx5GvDsG|Wa`oco8CKi_F~_I<;vIpOy$B<|IGRkf>o#9wmf^xmQ!MqO6@>B{Y`+>rE-Xz^yAY+KJ45c|;xqrl%$xV` z(3ySBh{@`@>2c0U5oL**%uDB7Gzh(K|LNJs-v3`0sy;lzBGgivcZ_?puIggZdD&|( z)YpbtZ_13mU@@g)v!=hv-A&>1KECeXQ@K`Rg0-UI?I2NZ7u(hSRuzjHb#_I#p1%~h zeB;gq=G@>T>F&0WSw@C%CrTa zyuRqHdhXkLrQE|}-i;=MGx_g@gD0i(OtaTHV5>Lx{Ia!I4D|kJqv4_5Oi+@kRi9>(>up0?%{%#-QE@&M6$Ahuu;&Xc+ ze&;Xm=SSb^`PUV;MfYYvox}58Ncb1&m**4sOGy_JfLe~zcb6Z00ylSXY5><^e6 z<8mvzy{wnx=(7!$M+6N&eN0|^>Mtj=%Q>4Mxm5>V?x{ShAC~5jJ=OMiI$vypzeLNV zkEi;6KNb$F3<+QRV}4?Bl+M8#{^$Sx9sYCt+{5I@f95J}*>TlkDu3aoePwaKO~vbH z?el94zTv?mv8Af)mFVI`eePPx5Rog7^`@^5-4<}<^xZ?9cg}S?OaHpC!e6w{dB0%L zvt%tVy>s`CoA0Mvxd|twJ>5Ox|UYh$WxVOi0d0cQ> zyEV07;mQA56@?mC^N*a~a>cbFYj<(+{286M`n?R8+0IIBEb!~J+^^SgSEDQD;J2vN z)kn^J*V*M=;k%pV@~#k$jTJ>FWG?m1D9Z5q|E6w#mHRv91@f*=r~hmJ4f5V!w>Ze< zjFO4C(Su;WR^2J%LVUBbE)ah}-Oc~{$>=ls*%rtiu9&VXY) z%>DAaH=SK~$)Rz+@=tc=eO`-Ki|w2}^Z$(hGyb265X)ZAsKa0p4I=Vcq0Pe{=S&qusPz)UN#OU&d8&6xA|*kD9U&L6g8M;^TfUBx8HN7=N{9K z$1!)@YgAxcewA|g zoGU!_Z5(q>@RsDmmHTSCT9<2nT6w67w_)z7vh|GHG;eKuXcup1@zFNtD683j+b|p7 ziTNOR!l;&%#x!#bza@9BO tEpg0Ny=RwBi(>|rMBZ$B*?w5^+J&0$^I)E#lljd4Kw9AUgwNg#3;@T3Zbbk9 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-appman-run-settings.webp b/doc/qtcreator/images/qtcreator-appman-run-settings.webp new file mode 100644 index 0000000000000000000000000000000000000000..1afc5bdd26b87363a354c837fa18774e3efa6ef0 GIT binary patch literal 5090 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc b/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc new file mode 100644 index 00000000000..ef61f1b295a --- /dev/null +++ b/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc @@ -0,0 +1,154 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-how-to-run-in-app-manager.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-run + + \title Run in Qt Application Manager + + If you have set up \l{Qt Application Manager}, you can deploy, run, and + debug applications on the desktop, remote generic SSH Linux targets, or + \l{Boot2Qt}{Boot2Qt devices}. The applications can be either + \e {built-in applications} or \e {third-party applications}. The former + are part of the System UI or the base installation, while the latter + are dynamically installed, updated, and uninstalled. + + \note Enable the experimental Application Manager plugin to use it. + + To build a Qt Application Manager project, deploy it, and run selected apps + in the System UI: + + \list 1 + \li Open an application manager project. + \li In \uicontrol Projects > \uicontrol {Build & Run}, select a kit that + specifies the Qt version and the device to use. + \li Go to \preferences > \uicontrol Devices and specify a connection to + the device. + \li In \uicontrol Projects > \uicontrol {Build & Run}, specify settings + for deploying and running the application with the selected kit. + \li In the kit selector, select \inlineimage icons/run_small.png for the + run target. + \endlist + + You can see command-line output in the \l {Application Output} view. You + can start, stop, and debug applications from there. + + On Linux, running a multi-process application starts a new process that you + can stop. If the application uses a runtime of the type \c qml-inprocess, or + you are running on Windows or \macos, you cannot debug it as an individual + process. However, you can debug it as a part of the System UI. + + Debugging works transparently if you set it up for the run target. + + \section1 Application manager CMake functions + + Since Qt 6.7, when using CMake as the build system, use the following + functions in the CMakeLists.txt file to indicate, which applications + to create as built-in packages and which to create as installable packages: + + \list + \li \l {qt6_am_create_builtin_package} + \li \l {qt6_am_create_installable_package} + \endlist + + \section1 Customize the installation + + To change the settings for deploying and running the application with the + selected kit, go to \uicontrol Projects and select \uicontrol {Build & Run} + > \uicontrol Run. + + \image qtcreator-appman-deploy-settings.webp {Deploy to application manager} + + \section2 Automatic deployment configuration selection + + In an application manager project, the targets need different deployment + mechanisms. The System UI is deployed with the \e {default deployment + configuration}, while all application manager packages use an + \e {automatic application manager deploy configuration}, which deploys only + the package itself when a installable package should be started. + + The appropriate deployment configuration is automatically selected when the + current run configuration changes. + + \section2 Deployment configuration + + In \uicontrol Method, \uicontrol {Automatic Application Manager + Deploy Configuration} adds the necessary CMake and tool arguments, as well as + \uicontrol Targets to the effective \uicontrol Build command. You can select + the targets in the kit selector to deploy and run applications on them. + + \image qtcreator-appman-kit-selector.webp {Automatically generated run targets in the kit selector} + + \section2 Installation settings + + In \uicontrol {Install Application Manager Package}, you can customize the + \c {install-package} command. + + \QC uses the compiler from the kit (toolchain) to build the application. + Then, it installs the application package into the target system using the + \uicontrol Controller executable that must be running on the target. It + is delivered with Qt Application Manager. + + In \uicontrol {Command line arguments}, the \c --acknowledge argument + automatically acknowledges the installation. If the System UI implemented + a confirmation dialog, you can remove this flag to show the dialog to the + user when installing the package. + + To install some other package, select \uicontrol {Customize step}, and + then enter the path to the package file in \uicontrol {Package file}. + + \section1 Application manager run settings + + To specify settings for running applications, go to \uicontrol Projects > + \uicontrol {Run Settings}. + + \image qtcreator-appman-run-settings.webp {Run in Qt Application Manager} + + The following table summarizes the run settings for each application. + + \table + \header + \li Setting + \li Value + \row + \li \uicontrol {Controller} + \li The path to the controller that installs the application package into + the target system. + + When you run applications on a Boot2Qt device, you can see the device + ID here. + \row + \li \uicontrol {Application ID} + \li The ID of the \c ApplicationManager application. + \row + \li \uicontrol {Document URL} + \li The URL is passed to the started application, which can use it to + start an action, such as opening the passed file URL. + \row + \li \uicontrol {Application Manager instance ID} + \li The name of this application manager instance. Only useful if you are + running multiple instances at the same time and you need to address + them from the controller. A unique number is appended to this ID to + disambiguate instances with the same ID. + + If you have several application manager instances running, you can + override the instance ID in the \c config.yaml file. + \row + \li \uicontrol {Default instance} + \li Always communicates with the default instance. + \endtable + + \section1 Profile Qt Quick applications + + You can use the \l{Profiling QML Applications}{QML Profiler} to find causes + for typical performance problems in your Qt Quick applications, such as + slowness and unresponsive, stuttering user interfaces. You cannot profile an + in-process runtime as an individual process. + + \sa {Activate kits for a project}, {Connecting Boot2Qt Devices}, + {Connecting Remote Linux Devices}, {Enable and disable plugins}, + {Run on many platforms}, {Debugging}, {Profiling QML Applications} +*/ diff --git a/doc/qtcreator/src/external-resources/external-resources.qdoc b/doc/qtcreator/src/external-resources/external-resources.qdoc index e3295245df2..89662ca1ca1 100644 --- a/doc/qtcreator/src/external-resources/external-resources.qdoc +++ b/doc/qtcreator/src/external-resources/external-resources.qdoc @@ -173,3 +173,11 @@ \externalpage https://developer.android.com/studio/install \title Android Studio Installation Guide */ +/*! + \externalpage https://doc-snapshots.qt.io/applicationmanager-dev/cmake-qt6-am-create-builtin-package.html + \title qt6_am_create_builtin_package +*/ +/*! + \externalpage https://doc-snapshots.qt.io/applicationmanager-dev/cmake-qt6-am-create-installable-package.html + \title qt6_am_create_installable_package +*/ diff --git a/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc b/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc index b1cc26e9297..3f7499b5b5c 100644 --- a/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc +++ b/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc @@ -9,7 +9,8 @@ \title Connecting Boot2Qt Devices You can connect \l{Boot2Qt} devices to the development PC to run, debug, - and analyze applications built for them from \QC. + and analyze applications built for them from \QC. For this, you need the + appropriate \l{http://qt.io/licensing/}{Qt license}. If you have a tool chain for building applications for Boot2Qt devices installed on the development PC, you can add it to \QC. You can then diff --git a/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc b/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc index 14f642e38ba..261fad18125 100644 --- a/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc +++ b/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc @@ -60,8 +60,7 @@ \li \l{Connecting Boot2Qt Devices} \li \l{Boot2Qt Run Settings} \li \l{Deploying to Boot2Qt} - \li \l{https://doc.qt.io/qtcreator/creator-overview-qtasam.html} - {Qt Creator Plugin for Qt Application Manager} + \li \l{Run in Qt Application Manager} \endlist \section1 Remote Linux @@ -77,8 +76,7 @@ \li \l{Deploying to Remote Linux} \li \l{Remote Linux Run Settings} \li \l{Run on remote Linux devices} - \li \l{https://doc.qt.io/qtcreator/creator-overview-qtasam.html} - {Qt Creator Plugin for Qt Application Manager} + \li \l{Run in Qt Application Manager} \endlist \section1 Microcontroller Units (MCU) diff --git a/doc/qtcreator/src/overview/creator-only/creator-commercial-overview.qdoc b/doc/qtcreator/src/overview/creator-only/creator-commercial-overview.qdoc deleted file mode 100644 index f594ad49beb..00000000000 --- a/doc/qtcreator/src/overview/creator-only/creator-commercial-overview.qdoc +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -// ********************************************************************** -// NOTE: the sections are not ordered by their logical order to avoid -// reshuffling the file each time the index order changes (i.e., often). -// Run the fixnavi.pl script to adjust the links to the index order. -// ********************************************************************** - -/*! - \page creator-commercial-overview.html - - \title Commercial Features - - \commercial - - You can use the following \QC features if you have the appropriate - \l{http://qt.io/licensing/}{Qt license}: - - \list - \li \l{https://doc.qt.io/Boot2Qt/index.html}{Boot2Qt} - \li \l{https://doc.qt.io/qtcreator/creator-overview-qtasam.html} - {Qt Application Manager} integration - \endlist -*/ diff --git a/doc/qtcreator/src/overview/creator-only/creator-mobile-targets.qdoc b/doc/qtcreator/src/overview/creator-only/creator-mobile-targets.qdoc index cd64ccad70f..3c25ce4eab0 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-mobile-targets.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-mobile-targets.qdoc @@ -81,22 +81,5 @@ \endlist - \section1 Related Topics - - \list - - \li \l{Building Applications for the Web} - - You can use the experimental Qt WebAssembly plugin to build - applications in WebAssembly format, to deploy them, and to - run them in a web browser. - - \li \l{https://doc.qt.io/qtcreator/creator-overview-qtasam.html} - {Qt Creator Plugin for Qt Application Manager} - - You can use the experimental Qt Application Manager plugin - (commercial only) to deploy, run, and debug applications on the - local Linux PC, remote generic SSH Linux targets, or - \l{Boot2Qt}{Boot2Qt devices}. - \endlist + \sa {Building Applications for the Web}, {Run in Qt Application Manager} */ diff --git a/doc/qtcreator/src/qtcreator.qdoc b/doc/qtcreator/src/qtcreator.qdoc index ddc9b74cca6..6fa4967023f 100644 --- a/doc/qtcreator/src/qtcreator.qdoc +++ b/doc/qtcreator/src/qtcreator.qdoc @@ -25,12 +25,6 @@ to build applications in web format and run them in web browsers. - This manual also describes features that are only available if you have the - appropriate \l{http://qt.io/licensing/}{Qt license}. For more information, - see \l{Commercial Features}. - - - \table \row \li {4,1} \b {\l{All Topics}{Click Here for a List of All Topics}} diff --git a/doc/qtdesignstudio/config/qtdesignstudio.qdocconf b/doc/qtdesignstudio/config/qtdesignstudio.qdocconf index 86a948bd889..72b38940f7c 100644 --- a/doc/qtdesignstudio/config/qtdesignstudio.qdocconf +++ b/doc/qtdesignstudio/config/qtdesignstudio.qdocconf @@ -37,6 +37,7 @@ excludedirs += ../../qtcreator/examples/accelbubble \ ../../qtcreator/examples/transitions \ ../../qtcreator/src/analyze \ ../../qtcreator/src/android \ + ../../qtcreator/src/appman \ ../../qtcreator/src/baremetal \ ../../qtcreator/src/cmake \ ../../qtcreator/src/conan \ From 8713919f31f2aecc7e7c15f1fc9ce7906b8fefa0 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 12 Mar 2024 19:48:48 +0100 Subject: [PATCH 18/57] CMakePM: Fix dll path addition for MinGW Amends 0d8a542b4f7d8a7b4d27f42ff16d309fba6cbf22 Fixes: QTCREATORBUG-30529 Change-Id: Ic786f1e7075ef68cf9d590d27ef90b9d1e8631b0 Reviewed-by: Alessandro Portale --- .../fileapidataextractor.cpp | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index ad1e600124d..99d37e6c83b 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -301,9 +301,14 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t, continue; const FilePath buildDir = relativeLibs ? buildDirectory : currentBuildDir; - std::optional dllName; + FilePath tmp = buildDir.resolvePath(part); + if (f.role == "libraries") + tmp = tmp.parentDir(); + std::optional dllName; if (buildDir.osType() == OsTypeWindows && (f.role == "libraries")) { + part = FilePath::fromUserInput(part).fileName(); + // Skip object libraries on Windows. This case can happen with static qml plugins if (part.endsWith(".obj") || part.endsWith(".o")) continue; @@ -312,15 +317,17 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t, for (const QString &suffix : {QString(".lib"), QString(".dll.a"), QString(".a")}) { if (part.endsWith(suffix) && !dllName) - dllName = FilePath::fromUserInput( - part.chopped(suffix.length()).append(".dll")) - .fileName(); + dllName = part.chopped(suffix.length()).append(".dll"); } - } - FilePath tmp = buildDir.resolvePath(part); - if (f.role == "libraries") - tmp = tmp.parentDir(); + // MinGW has libQt6Core.a -> Qt6Core.dll + const QString mingwPrefix("lib"); + const QString mingwSuffix(".a"); + if (part.startsWith(mingwPrefix) && part.endsWith(mingwSuffix)) + dllName = part.chopped(mingwSuffix.length()) + .sliced(mingwPrefix.length()) + .append(".dll"); + } if (!tmp.isEmpty() && tmp.isDir()) { // f.role is libraryPath or frameworkPath @@ -349,6 +356,7 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t, } } ct.libraryDirectories = filteredUnique(librarySeachPaths); + qCInfo(cmakeLogger) << "libraryDirectories for target" << ct.title << ":" << ct.libraryDirectories; } return ct; } From c6ed1d42c34f6e502c950e71c43921e7f562089a Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 12 Mar 2024 22:29:25 +0100 Subject: [PATCH 19/57] Welcome: Fix application icon size for > 200% ui scaling Use the actual image dpr for arithmetics rather than the application dpr. Fixes: QTCREATORBUG-30464 Change-Id: I52083bcca067282a677a9d0e1b7c62e9c7270c64 Reviewed-by: Cristian Adam --- src/plugins/welcome/welcomeplugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index 994d097024c..069fe1e2630 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -139,7 +139,7 @@ public: const QPixmap croppedLogo = logo.copy(cropR); const int lineHeight = welcomeTF.lineHeight(); const QPixmap scaledCroppedLogo = - croppedLogo.scaledToHeight((lineHeight - 12) * devicePixelRatioF(), + croppedLogo.scaledToHeight((lineHeight - 12) * croppedLogo.devicePixelRatioF(), Qt::SmoothTransformation); ideIconLabel->setPixmap(scaledCroppedLogo); ideIconLabel->setFixedHeight(lineHeight); From 0817f7ae5e59a0e0a72aef918e6038a2ceeedfef Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 12 Mar 2024 22:50:03 +0100 Subject: [PATCH 20/57] Utils: Replace imageFileWithResolution with qt_findAtNxFile qt_findAtNxFile does a better job at returing a suited @Nx-image for "exotic" device pixel ratios. This change fixes for example the active mode icon when running Qt Creator at 250% ui scaling. Task-number: QTCREATORBUG-30464 Change-Id: Ia90ba3573fcd4af7941322d7dbc8905fe140192b Reviewed-by: Cristian Adam --- src/libs/utils/stylehelper.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 23beeb4b3ff..69b5e395565 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -856,11 +857,7 @@ QString StyleHelper::dpiSpecificImageFile(const QString &fileName) QString StyleHelper::imageFileWithResolution(const QString &fileName, int dpr) { - const QFileInfo fi(fileName); - return dpr == 1 ? fileName : - fi.path() + QLatin1Char('/') + fi.completeBaseName() - + QLatin1Char('@') + QString::number(dpr) - + QLatin1String("x.") + fi.suffix(); + return qt_findAtNxFile(fileName, dpr); } QList StyleHelper::availableImageResolutions(const QString &fileName) From fe5f9599251bd8811317e4236947dcf385107be8 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 12 Mar 2024 15:39:49 +0100 Subject: [PATCH 21/57] QmlPreview: Fix enabled state of editor action Kind of amends 42c1b1587484b5dd6dc562e7fd80dacbd041bd33. Change-Id: Ifd340d0f9bb206c48fd82cecf4e735cca0d70a7d Reviewed-by: Alessandro Portale --- src/plugins/qmlpreview/qmlpreviewplugin.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.cpp b/src/plugins/qmlpreview/qmlpreviewplugin.cpp index c871996a7bf..31638f76622 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.cpp +++ b/src/plugins/qmlpreview/qmlpreviewplugin.cpp @@ -199,7 +199,7 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent) previewFileAction->setVisible(fileNode && fileNode->fileType() == FileType::QML); }); connect(Core::EditorManager::instance(), &Core::EditorManager::editorOpened, this, - [runPreviewAction] (Core::IEditor *editor) { + [] (Core::IEditor *editor) { if (!editor) return; if (!editor->document()) @@ -225,8 +225,8 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent) {":/utils/images/run_small.png", Utils::Theme::IconsRunToolBarColor}, {":/utils/images/eyeoverlay.png", Utils::Theme::IconsDebugColor} }).icon(); - Utils::ProxyAction *action = - Utils::ProxyAction::proxyActionWithIcon(runPreviewAction, icon); + Utils::ProxyAction *action = Utils::ProxyAction::proxyActionWithIcon( + Core::ActionManager::command("QmlPreview.RunPreview")->action(), icon); toolBar->insertAction(nullptr, action); }); From 0aff25226448dbf6660af69ca8bfe0d5350984c7 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 13 Mar 2024 06:43:10 +0100 Subject: [PATCH 22/57] Utils: Fix qbs build Amends 4e8bdd610b5899c83b75cebeeafcf82b6bec79f8. Change-Id: I6a187c8cd28320836a12cfc4a778d507193c52a5 Reviewed-by: Eike Ziller --- src/libs/utils/utils.qbs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libs/utils/utils.qbs b/src/libs/utils/utils.qbs index 7bf55d8f247..20e3a707bc3 100644 --- a/src/libs/utils/utils.qbs +++ b/src/libs/utils/utils.qbs @@ -222,8 +222,6 @@ QtcLibrary { "pathchooser.h", "pathlisteditor.cpp", "pathlisteditor.h", - "persistentcachestore.cpp", - "persistentcachestore.h", "persistentsettings.cpp", "persistentsettings.h", "pointeralgorithm.h", From 84166b4eafa48c7c2ec127093d2ba88cca8bda97 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 16:57:34 +0100 Subject: [PATCH 23/57] PyLSConfigureWidget: Don't leak the editor Change-Id: Idc283b2cfabfcd1120520c5bbb4258b085c410a0 Reviewed-by: David Schulz --- src/plugins/python/pythonsettings.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index b144f4a7e84..98020fc7bcf 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -419,6 +419,7 @@ public: , m_mainGroup(new QGroupBox(Tr::tr("Use Python Language Server"))) { + m_editor->setParent(this); m_mainGroup->setCheckable(true); auto mainGroupLayout = new QVBoxLayout; From 16decfec672962e96551ca565d342ab20fc454b8 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 17:16:54 +0100 Subject: [PATCH 24/57] LanguageClientSettingsPageWidget: Don't leak QMenu Change-Id: Ia1bfc4aa66e6ed2e2b0e87ae89cf92b1bd5fa97a Reviewed-by: David Schulz --- src/plugins/languageclient/languageclientsettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 0a4da9b874e..503e79e2b8b 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -181,7 +181,7 @@ LanguageClientSettingsPageWidget::LanguageClientSettingsPageWidget(LanguageClien this, &LanguageClientSettingsPageWidget::currentChanged); auto buttonLayout = new QVBoxLayout(); auto addButton = new QPushButton(Tr::tr("&Add")); - auto addMenu = new QMenu; + auto addMenu = new QMenu(this); addMenu->clear(); for (const ClientType &type : clientTypes()) { auto action = new QAction(type.name); From 41f1bc141db20a26b143846b907ff74e8a8acffe Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 12 Mar 2024 12:54:31 +0100 Subject: [PATCH 25/57] Process: Preserve environment when "runAsRoot" is enabled Change-Id: I2078925b48d8fc3053e2be9632248e3fff9ea608 Reviewed-by: hjk --- src/libs/utils/process.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/utils/process.cpp b/src/libs/utils/process.cpp index 5bf44513654..111ebe89cf6 100644 --- a/src/libs/utils/process.cpp +++ b/src/libs/utils/process.cpp @@ -226,6 +226,7 @@ void DefaultImpl::start() if (m_setup.m_runAsRoot && !HostOsInfo::isWindowsHost()) { arguments.prepend(program); + arguments.prepend("-E"); arguments.prepend("-A"); program = "sudo"; } From 3f8bc98109c90c743ba7fddf2edde54c53761027 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 12 Mar 2024 12:54:13 +0100 Subject: [PATCH 26/57] Debugger: Add "Run as root" support for lldb Fixes: QTCREATORBUG-30516 Change-Id: I2f1e7522dd95847ad548a2390795a91a90c63a17 Reviewed-by: hjk Reviewed-by: --- src/plugins/debugger/lldb/lldbengine.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 1bb409bf948..2934f1db440 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -28,6 +28,8 @@ #include #include +#include + #include #include #include @@ -198,6 +200,11 @@ void LldbEngine::setupEngine() environment.appendOrSet("PYTHONPATH", "/usr/lib/llvm-14/lib/python3.10/dist-packages"); } + if (runParameters().runAsRoot) { + ProjectExplorer::RunControl::provideAskPassEntry(environment); + m_lldbProc.setRunAsRoot(true); + } + m_lldbProc.setEnvironment(environment); if (runParameters().debugger.workingDirectory.isDir()) From 3322186b0d6b60b752ec0a513d42d5c8c1c4c85f Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 12 Mar 2024 15:40:37 +0100 Subject: [PATCH 27/57] BaseQtVersion: Drop cache related paramenter QtVersion::fromMap Not used anymore. Change-Id: I992bde278af360d9d67fd86fd79bb035cafd2bec Reviewed-by: Marcus Tillmanns --- src/plugins/qnx/qnxqtversion.cpp | 4 ++-- src/plugins/qnx/qnxqtversion.h | 4 +--- src/plugins/qtsupport/baseqtversion.cpp | 6 +++--- src/plugins/qtsupport/baseqtversion.h | 6 ++---- src/plugins/qtsupport/qtoptionspage.cpp | 2 +- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/plugins/qnx/qnxqtversion.cpp b/src/plugins/qnx/qnxqtversion.cpp index 6a74d620dbc..31856271d15 100644 --- a/src/plugins/qnx/qnxqtversion.cpp +++ b/src/plugins/qnx/qnxqtversion.cpp @@ -116,9 +116,9 @@ Store QnxQtVersion::toMap() const return result; } -void QnxQtVersion::fromMap(const Store &map, const FilePath &, bool forceRefreshCache) +void QnxQtVersion::fromMap(const Store &map, const FilePath &) { - QtVersion::fromMap(map, {}, forceRefreshCache); + QtVersion::fromMap(map, {}); setSdpPath(FilePath::fromSettings(map.value(SDP_PATH_KEY))); } diff --git a/src/plugins/qnx/qnxqtversion.h b/src/plugins/qnx/qnxqtversion.h index db6c47666d8..309e881f5a9 100644 --- a/src/plugins/qnx/qnxqtversion.h +++ b/src/plugins/qnx/qnxqtversion.h @@ -28,9 +28,7 @@ public: QString cpuDir() const; Utils::Store toMap() const override; - void fromMap(const Utils::Store &map, - const Utils::FilePath &filePath, - bool forceRefreshCache) override; + void fromMap(const Utils::Store &map, const Utils::FilePath &filePath) override; ProjectExplorer::Abis detectQtAbis() const override; diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index e08c0227aff..cee3f88d8b6 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -740,7 +740,7 @@ bool QtVersion::hasReleaseBuild() const return !d->m_defaultConfigIsDebug || d->m_defaultConfigIsDebugAndRelease; } -void QtVersion::fromMap(const Store &map, const FilePath &filePath, bool forceRefreshCache) +void QtVersion::fromMap(const Store &map, const FilePath &filePath) { d->m_id = map.value(Constants::QTVERSIONID).toInt(); if (d->m_id == -1) // this happens on adding from installer, see updateFromInstaller => get a new unique id @@ -2448,13 +2448,13 @@ QtVersion *QtVersionFactory::create() const return version; } -QtVersion *QtVersion::clone(bool forceRefreshCache) const +QtVersion *QtVersion::clone() const { for (QtVersionFactory *factory : std::as_const(g_qtVersionFactories)) { if (factory->m_supportedType == d->m_type) { QtVersion *version = factory->create(); QTC_ASSERT(version, return nullptr); - version->fromMap(toMap(), {}, forceRefreshCache); + version->fromMap(toMap(), {}); // Qt Abis are either provided by SDK Tool, or detected from the binaries. // The auto detection is not perfect, and we always want to use the data provided by diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index 4220900fd34..5357a521cdb 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -49,9 +49,7 @@ public: virtual ~QtVersion(); - virtual void fromMap(const Utils::Store &map, - const Utils::FilePath &filePath = {}, - bool forceRefreshCache = false); + virtual void fromMap(const Utils::Store &map, const Utils::FilePath &filePath = {}); virtual bool equals(QtVersion *other); bool isAutodetected() const; @@ -223,7 +221,7 @@ private: friend class Internal::QtSettingsPageWidget; void setId(int id); - QtVersion *clone(bool forceRefreshCache = false) const; + QtVersion *clone() const; Internal::QtVersionPrivate *d = nullptr; }; diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index a33514b836f..7eb349d1da9 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -602,7 +602,7 @@ void QtSettingsPageWidget::updateQtVersions(const QList &additions, const Q // Add changed/added items: for (int a : std::as_const(toAdd)) { - QtVersion *version = QtVersionManager::version(a)->clone(true); + QtVersion *version = QtVersionManager::version(a)->clone(); auto *item = new QtVersionItem(version); // Insert in the right place: From 7a769c59e78c33abf881aef262f465a875496400 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 12 Mar 2024 16:47:24 +0100 Subject: [PATCH 28/57] Debugger: Add missing state transition DebuggerProcessFinished in EngineSetupRequested means EngineSetupFailed. Could be triggered with LLDB "Run as Root" plus in the dialog. Change-Id: Idbfcaebfc302c7646f9b85275d1d57be17cd0922 Reviewed-by: Reviewed-by: Marcus Tillmanns --- src/plugins/debugger/debuggerengine.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 115398b13ca..7bc21a6861b 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1797,6 +1797,9 @@ void DebuggerEngine::notifyDebuggerProcessFinished(const ProcessResultData &resu case DebuggerFinished: // Nothing to do. break; + case EngineSetupRequested: + notifyEngineSetupFailed(); + break; case EngineShutdownRequested: case InferiorShutdownRequested: notifyEngineShutdownFinished(); From c1015dde1545f17a8aaee98b7c0e0217f8df620c Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 13:10:39 +0100 Subject: [PATCH 29/57] DeviceSettingsWidget: Don't leak QActions Amends 662aabd29f8e847abed41cce5f4bb5747502ed9d Change-Id: I353a93b3b3752d639f9fc5d45467c843bed6a604 Reviewed-by: Marcus Tillmanns --- .../projectexplorer/devicesupport/devicesettingspage.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingspage.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingspage.cpp index a7405ef46e2..dfcfc83a1be 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingspage.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingspage.cpp @@ -77,7 +77,7 @@ private: DeviceManager * const m_deviceManager; DeviceManagerModel * const m_deviceManagerModel; QList m_additionalActionButtons; - IDeviceWidget *m_configWidget; + IDeviceWidget *m_configWidget = nullptr; QLabel *m_configurationLabel; QComboBox *m_configurationComboBox; @@ -97,7 +97,6 @@ private: DeviceSettingsWidget::DeviceSettingsWidget() : m_deviceManager(DeviceManager::cloneInstance()) , m_deviceManagerModel(new DeviceManagerModel(m_deviceManager, this)) - , m_configWidget(nullptr) { m_configurationLabel = new QLabel(Tr::tr("&Device:")); m_configurationComboBox = new QComboBox; @@ -116,7 +115,7 @@ DeviceSettingsWidget::DeviceSettingsWidget() connect(addButton, &OptionPushButton::clicked, this, &DeviceSettingsWidget::addDevice); QMenu *deviceTypeMenu = new QMenu(addButton); - QAction *defaultAction = new QAction(Tr::tr("&Start Wizard to Add Device...")); + QAction *defaultAction = new QAction(Tr::tr("&Start Wizard to Add Device..."), this); connect(defaultAction, &QAction::triggered, this, &DeviceSettingsWidget::addDevice); deviceTypeMenu->addAction(defaultAction); deviceTypeMenu->addSeparator(); @@ -128,7 +127,7 @@ DeviceSettingsWidget::DeviceSettingsWidget() continue; //: Add - QAction *action = new QAction(Tr::tr("Add %1").arg(factory->displayName())); + QAction *action = new QAction(Tr::tr("Add %1").arg(factory->displayName()), this); deviceTypeMenu->addAction(action); connect(action, &QAction::triggered, this, [factory, this] { From 3529f3115d8d9ba9a160df7ef8e2ad02734b987f Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 15:59:15 +0100 Subject: [PATCH 30/57] ToolChainOptionsWidget: Don't leak QActions Change-Id: I2018c10a708c4b4bfa2402620874735da5860fde Reviewed-by: hjk --- src/plugins/projectexplorer/toolchainoptionspage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 27b5b742c7b..470e64cf198 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -307,7 +307,7 @@ public: StaticTreeItem *parentForToolChain(Toolchain *tc); QAction *createAction(const QString &name, ToolchainFactory *factory, Utils::Id language) { - auto action = new QAction(name, nullptr); + auto action = new QAction(name, this); connect(action, &QAction::triggered, this, [this, factory, language] { createToolChain(factory, language); }); return action; From 5399eff2a997f7fabe58a162dc59b080b7c9e988 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 18:19:20 +0100 Subject: [PATCH 31/57] BaseQtVersion: Get rid of MacroExpanderWrapper Apparently the reasoning for having it, i.e. make std::unique_ptr "copyable" is not valid anymore. This change also fixes the leak of a MacroExpander returned by QtVersion::createMacroExpander(). Change-Id: I811ecf2eca8e5ce3a1da267da8290ba89df66db6 Reviewed-by: hjk --- src/plugins/qtsupport/baseqtversion.cpp | 29 ++++--------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index cee3f88d8b6..ae0ed49e069 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -249,19 +249,6 @@ static QSet versionedIds(const QVersionNumber &version) version.majorVersion(), version.minorVersion()); } -// Wrapper to make the std::unique_ptr "copyable": -class MacroExpanderWrapper -{ -public: - MacroExpanderWrapper() = default; - MacroExpanderWrapper(const MacroExpanderWrapper &other) { Q_UNUSED(other) } - MacroExpanderWrapper(MacroExpanderWrapper &&other) = default; - - MacroExpander *macroExpander(const QtVersion *qtversion) const; -private: - mutable std::unique_ptr m_expander; -}; - enum HostBinaries { Designer, Linguist, Rcc, Uic, QScxmlc }; class QtVersionPrivate @@ -329,19 +316,9 @@ public: FilePath m_qmlRuntimePath; FilePath m_qmlplugindumpPath; - MacroExpanderWrapper m_expander; + std::unique_ptr m_expander; }; -/////////////// -// MacroExpanderWrapper -/////////////// -MacroExpander *MacroExpanderWrapper::macroExpander(const QtVersion *qtversion) const -{ - if (!m_expander) - m_expander = QtVersion::createMacroExpander([qtversion]() { return qtversion; }); - return m_expander.get(); -} - } // Internal /////////////// @@ -1489,7 +1466,9 @@ FilePaths QtVersion::qtSoPaths() const MacroExpander *QtVersion::macroExpander() const { - return d->m_expander.macroExpander(this); + if (!d->m_expander) + d->m_expander = QtVersion::createMacroExpander([this] { return this; }); + return d->m_expander.get(); } std::unique_ptr From 0b656452dd280a68afea505828fdf375368a7cea Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 12 Mar 2024 22:12:02 +0100 Subject: [PATCH 32/57] GenericLinuxDeviceTester: Fix warning about QFutureWatcher connect Fix the warning: QFutureWatcher::connect: connecting after calling setFuture() is likely to produce race. Amends e8ad29d3affd115573d7ee7a5621a6ca6e168911 Change-Id: I834f41bd3b7c51520fb36945d4c09a8eafd2affc Reviewed-by: Marcus Tillmanns --- src/plugins/remotelinux/linuxdevicetester.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/remotelinux/linuxdevicetester.cpp b/src/plugins/remotelinux/linuxdevicetester.cpp index f279bc0c382..d66e44be6e6 100644 --- a/src/plugins/remotelinux/linuxdevicetester.cpp +++ b/src/plugins/remotelinux/linuxdevicetester.cpp @@ -330,8 +330,6 @@ void GenericLinuxDeviceTester::testDevice(const IDevice::Ptr &deviceConfiguratio d->m_device = std::static_pointer_cast(deviceConfiguration); d->m_connectionTest = new QFutureWatcher(this); - d->m_connectionTest->setFuture(d->m_device->tryToConnect()); - connect(d->m_connectionTest, &QFutureWatcher::finished, this, [this] { const bool success = d->m_connectionTest->result(); d->m_connectionTest->deleteLater(); @@ -345,6 +343,7 @@ void GenericLinuxDeviceTester::testDevice(const IDevice::Ptr &deviceConfiguratio emit finished(TestFailure); } }); + d->m_connectionTest->setFuture(d->m_device->tryToConnect()); } void GenericLinuxDeviceTester::stopTest() From 6760e2d64b69d9cb7b44ac2370d5bb8a8a4d4437 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 13 Mar 2024 09:55:44 +0100 Subject: [PATCH 33/57] Doc: Fix typo "a installable" > "an installable" Change-Id: Iea7ac4825de671ac892a8cbb228fb462a1f5be15 Reviewed-by: Leena Miettinen --- doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc b/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc index ef61f1b295a..a6319a7f2ad 100644 --- a/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc +++ b/doc/qtcreator/src/appman/creator-appman-how-to-run.qdoc @@ -68,7 +68,7 @@ mechanisms. The System UI is deployed with the \e {default deployment configuration}, while all application manager packages use an \e {automatic application manager deploy configuration}, which deploys only - the package itself when a installable package should be started. + the package itself when an installable package should be started. The appropriate deployment configuration is automatically selected when the current run configuration changes. From 3cdc4f5a96b58dd8bcaec856fa95e9868397f116 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 12 Mar 2024 09:49:42 +0100 Subject: [PATCH 34/57] Docker: Allow starting Container from all threads Limiting starting the container only from main thread is worse than the potential for data access races. DockerDevice needs a rewrite here. Change-Id: I485f5253d1f0ba0e7fb40ca7e1ddb37dd615212c Reviewed-by: Qt CI Bot Reviewed-by: hjk --- src/plugins/docker/dockerdevice.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 68cdee29d03..f0a8aeb12c9 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -937,11 +937,6 @@ expected_str DockerDevicePrivate::updateContainerAccess() return {}; } - if (QThread::currentThread() != thread()) { - expected_str result; - return make_unexpected(Tr::tr("Cannot start docker device from non-main thread")); - } - if (m_isShutdown) return make_unexpected(Tr::tr("Device is shut down")); @@ -949,14 +944,16 @@ expected_str DockerDevicePrivate::updateContainerAccess() return make_unexpected(Tr::tr("Docker system is not reachable")); expected_str result = startContainer(); - if (result) { - deviceSettings->containerStatus.setText(Tr::tr("Running")); - return result; - } + QString containerStatus = result ? Tr::tr("Running") : result.error().trimmed(); - const QString error = QString("Failed to start container: %1").arg(result.error()); - deviceSettings->containerStatus.setText(result.error().trimmed()); - return make_unexpected(error); + if (!result) + result = make_unexpected(QString("Failed to start container: %1").arg(result.error())); + + QTimer::singleShot(0, this, [this, containerStatus] { + deviceSettings->containerStatus.setText(containerStatus); + }); + + return result; } void DockerDevice::setMounts(const QStringList &mounts) const From 8a8f26d39a42bf3f7d66c528f19c2d1718ecf8f7 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 1 Mar 2024 13:22:52 +0100 Subject: [PATCH 35/57] Axivion: Avoid sort indicator overlapping column text If the column is too narrow we may overlap the text of the column header. Explicitly clear the area before painting the icon. Change-Id: If73c1e2cc66c21dd9ffa41710873faa654bf235e Reviewed-by: hjk --- src/plugins/axivion/issueheaderview.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/plugins/axivion/issueheaderview.cpp b/src/plugins/axivion/issueheaderview.cpp index a9dfd38b8df..3635568a5a8 100644 --- a/src/plugins/axivion/issueheaderview.cpp +++ b/src/plugins/axivion/issueheaderview.cpp @@ -144,7 +144,15 @@ void IssueHeaderView::paintSection(QPainter *painter, const QRect &rect, int log const int margin = style()->pixelMetric(QStyle::PM_HeaderGripMargin, nullptr, this); const QIcon icon = iconForSorted(logicalIndex == m_currentSortIndex ? m_currentSortOrder : SortOrder::None); const int offset = qMax((rect.height() - ICON_SIZE), 0) / 2; - const QRect iconRect(rect.left() + rect.width() - ICON_SIZE - margin, offset, ICON_SIZE, ICON_SIZE); + const int left = rect.left() + rect.width() - ICON_SIZE - margin; + const QRect iconRect(left, offset, ICON_SIZE, ICON_SIZE); + const QRect clearRect(left, 0, ICON_SIZE + margin, rect.height()); + painter->save(); + QStyleOptionHeader opt; + initStyleOption(&opt); + opt.rect = clearRect; + style()->drawControl(QStyle::CE_Header, &opt, painter, this); + painter->restore(); icon.paint(painter, iconRect); } From a8d339271e834c7eadc81674c8218d58518531d8 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 11 Mar 2024 13:37:18 +0100 Subject: [PATCH 36/57] Axivion: Disconnect from Job's finished signal Just to be sure we don't re-emit task's done signal. Change-Id: Ibcd0076c2c14044355e838be2e6ba47d1019b9d1 Reviewed-by: Christian Stenger Reviewed-by: --- src/plugins/axivion/credentialquery.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/axivion/credentialquery.cpp b/src/plugins/axivion/credentialquery.cpp index 14aabc3958e..f183c083736 100644 --- a/src/plugins/axivion/credentialquery.cpp +++ b/src/plugins/axivion/credentialquery.cpp @@ -44,6 +44,7 @@ void CredentialQueryTaskAdapter::start() task()->m_errorString = job->errorString(); else if (reader && job->error() == NoError) task()->m_data = reader->binaryData(); + disconnect(job, &Job::finished, this, nullptr); emit done(toDoneResult(success)); m_guard.release()->deleteLater(); }); From f6727adc10b4c4c3e6fdb42c56e35098f8912320 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 13 Mar 2024 12:38:55 +0100 Subject: [PATCH 37/57] Use Qt::TextShowMnemonic for text metrics and drawing Qt installations on KDE systems may insert shortcut ampersands into widgets texts. For self-painted widgets, we need therefore consider Qt::TextShowMnemonic when retrieving metrics of a text and when drawing it. This change addresses the issue for Utils::DetailsButton and Core::Button. Most likely, there are more places where this needs to be fixed. Task-number: QTCREATORBUG-30534 Change-Id: I98ef9bf8c8502d92d3a3884d1588be190934f5bd Reviewed-by: Eike Ziller Reviewed-by: Marcus Tillmanns --- src/libs/utils/detailsbutton.cpp | 4 ++-- src/plugins/coreplugin/welcomepagehelper.cpp | 4 ++-- src/plugins/coreplugin/welcomepagehelper.h | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/detailsbutton.cpp b/src/libs/utils/detailsbutton.cpp index 2fc7482d393..88c0ca273ea 100644 --- a/src/libs/utils/detailsbutton.cpp +++ b/src/libs/utils/detailsbutton.cpp @@ -78,7 +78,7 @@ DetailsButton::DetailsButton(QWidget *parent) QSize DetailsButton::sizeHint() const { - const QSize textSize = fontMetrics().size(Qt::TextSingleLine, text()); + const QSize textSize = fontMetrics().size(Qt::TextSingleLine | Qt::TextShowMnemonic, text()); return QSize(spacing + textSize.width() + spacing + 16 + spacing, spacing + fontMetrics().height() + spacing); } @@ -107,7 +107,7 @@ void DetailsButton::paintEvent(QPaintEvent *e) qDrawPlainRect(&p, rect(), outlineColor()); const QRect textRect(spacing + 3, 0, width(), height()); - p.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, text()); + p.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, text()); if (creatorTheme()->flag(Theme::FlatProjectsMode) || HostOsInfo::isMacHost()) { const QRect iconRect(width() - spacing - 15, 0, 16, height()); icon().paint(&p, iconRect); diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp index 9ae08c69384..883e9023c6d 100644 --- a/src/plugins/coreplugin/welcomepagehelper.cpp +++ b/src/plugins/coreplugin/welcomepagehelper.cpp @@ -100,7 +100,7 @@ static const TextFormat &buttonTF(Button::Role role, WidgetState state) using namespace WelcomePageHelpers; static const TextFormat mediumPrimaryTF {Theme::Token_Basic_White, StyleHelper::UiElement::UiElementButtonMedium, - Qt::AlignCenter | Qt::TextDontClip}; + Qt::AlignCenter | Qt::TextDontClip | Qt::TextShowMnemonic}; static const TextFormat mediumSecondaryTF {Theme::Token_Text_Default, mediumPrimaryTF.uiElement, mediumPrimaryTF.drawTextFlags}; static const TextFormat smallPrimaryTF @@ -110,7 +110,7 @@ static const TextFormat &buttonTF(Button::Role role, WidgetState state) {mediumSecondaryTF.themeColor, smallPrimaryTF.uiElement, smallPrimaryTF.drawTextFlags}; static const TextFormat smallListDefaultTF {Theme::Token_Text_Default, StyleHelper::UiElement::UiElementIconStandard, - Qt::AlignLeft | Qt::AlignVCenter | Qt::TextDontClip}; + Qt::AlignLeft | Qt::AlignVCenter | Qt::TextDontClip | Qt::TextShowMnemonic}; static const TextFormat smallListCheckedTF = smallListDefaultTF; static const TextFormat smallLinkDefaultTF {Theme::Token_Text_Default, StyleHelper::UiElement::UiElementIconStandard, diff --git a/src/plugins/coreplugin/welcomepagehelper.h b/src/plugins/coreplugin/welcomepagehelper.h index a93d157c81a..cce3b812527 100644 --- a/src/plugins/coreplugin/welcomepagehelper.h +++ b/src/plugins/coreplugin/welcomepagehelper.h @@ -54,7 +54,8 @@ public: const Utils::Theme::Color themeColor; const Utils::StyleHelper::UiElement uiElement; - const int drawTextFlags = Qt::AlignLeft | Qt::AlignBottom | Qt::TextDontClip; + const int drawTextFlags = Qt::AlignLeft | Qt::AlignBottom | Qt::TextDontClip + | Qt::TextShowMnemonic; }; CORE_EXPORT void setBackgroundColor(QWidget *widget, Utils::Theme::Color colorRole); From 90f66d63fadcd36a446be12cb4985f9d6c71c4e7 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 13 Mar 2024 13:17:23 +0100 Subject: [PATCH 38/57] Welcome: Enable hover effect on Welcome screen buttons Some styles (e.g. macOS, KDE) disable the hover effect on QAbstractButton. Setting the Qt::WA_Hover on our own button enforces the hover effect. Change-Id: I9f2f22c7e7c869a70ebb0e9032d162bd29e94166 Reviewed-by: Marcus Tillmanns --- src/plugins/coreplugin/welcomepagehelper.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp index 883e9023c6d..9cad69cdf17 100644 --- a/src/plugins/coreplugin/welcomepagehelper.cpp +++ b/src/plugins/coreplugin/welcomepagehelper.cpp @@ -137,6 +137,8 @@ Button::Button(const QString &text, Role role, QWidget *parent) , m_role(role) { setText(text); + setAttribute(Qt::WA_Hover); + updateMargins(); if (m_role == SmallList) setCheckable(true); From 52c39d007f75fdb34bb672ecc2216cabd9e95bb3 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 13 Mar 2024 13:11:23 +0100 Subject: [PATCH 39/57] CMakePM: Do not crash with CMake presets and no CMake tool If no CMake is found, show an error message (reusing an existing translated string). Fixes: QTCREATORBUG-30505 Change-Id: I6e3037ee97dfba21791191483fffab769a451125 Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 52ed82f8d77..d16b35f1ef0 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -723,8 +724,14 @@ QList CMakeProjectImporter::examineDirectory(const FilePath &importPath, if (!configurePreset.cmakeExecutable) { const CMakeTool *cmakeTool = CMakeToolManager::defaultCMakeTool(); - if (cmakeTool) + if (cmakeTool) { configurePreset.cmakeExecutable = cmakeTool->cmakeExecutable().toString(); + } else { + configurePreset.cmakeExecutable = QString(); + TaskHub::addTask( + BuildSystemTask(Task::TaskType::Error, Tr::tr(""))); + TaskHub::requestPopup(); + } } else { QString cmakeExecutable = configurePreset.cmakeExecutable.value(); CMakePresets::Macros::expand(configurePreset, env, projectDirectory(), cmakeExecutable); From a2ee1043c7ba7fb5c53861f594428a92b80ad118 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 13 Mar 2024 13:11:46 +0100 Subject: [PATCH 40/57] RemoteLinux: Fix crash on running test of an already configured device I got a crash when clicking "Test" in the configuration of an already existing ("Local Remote") device that was intentionally not yet set up with working authorized keys after dismissing the qtc-askpass dialog. The full reason is unclear, but this here fixes it for me. Change-Id: Ie07b89b85576beb59583370191e337fd1219db51 Reviewed-by: Christian Kandeler --- src/plugins/remotelinux/linuxdevice.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 30fac20a9d9..b9fcbb265af 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -865,7 +866,10 @@ public: void closeShell() { - m_shell.reset(); + if (QObject *shell = m_shell.get()) { + m_shell = nullptr; + shell->deleteLater(); + } } // Call me with shell mutex locked @@ -881,10 +885,10 @@ public: << m_displaylessSshParameters.host()); cmd.addArg("/bin/sh"); - m_shell.reset(new LinuxDeviceShell(cmd, - FilePath::fromString(QString("ssh://%1/").arg(parameters.userAtHostAndPort())))); + m_shell = new LinuxDeviceShell(cmd, + FilePath::fromString(QString("ssh://%1/").arg(parameters.userAtHostAndPort()))); connect(m_shell.get(), &DeviceShell::done, this, [this] { - m_shell.release()->deleteLater(); + closeShell(); }); auto result = m_shell->start(); if (!result) { @@ -981,7 +985,7 @@ private: mutable QMutex m_mutex; SshParameters m_displaylessSshParameters; QList m_connections; - std::unique_ptr m_shell; + QPointer m_shell; }; // LinuxDevice From b33fee0ded5c82a1f794703837a015c6fa5b1d87 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 12 Mar 2024 17:45:14 +0100 Subject: [PATCH 41/57] Debugger: Be a bit more explicit about states while quitting ... and make sure to use notifyInferiorIll only in states where the inferior might still be alive. Change-Id: Ie002cd8b70cc610b15bab00554c027494a0ad2e3 Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerengine.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 7bc21a6861b..1be2f566046 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -2017,11 +2017,16 @@ void DebuggerEngine::quitDebugger() case EngineShutdownRequested: case InferiorShutdownRequested: break; - case EngineRunFailed: - case DebuggerFinished: + case DebuggerNotReady: + case EngineSetupFailed: case InferiorShutdownFinished: + case EngineRunFailed: + case EngineShutdownFinished: + case DebuggerFinished: break; - default: + case InferiorRunRequested: + case InferiorRunFailed: + case InferiorStopRequested: // FIXME: We should disable the actions connected to that. notifyInferiorIll(); break; From 5211a9457aeb361b9cab59a1f9ed96e7077a7f66 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 11 Mar 2024 11:01:55 +0100 Subject: [PATCH 42/57] Axivion: Break the authorization process on error Break the authorization process on any error coming from unauthorized access trial except the UnauthenticatedException. Call onUnauthorizedGroupDone only after successful execution of dashboard's dtoRecipe(). Rename it to onUnauthorizedDashboard. Change-Id: Ia7ce0f326c91722d0e68d5228cb46b94b47a7892 Reviewed-by: Reviewed-by: Andreas Loth Reviewed-by: hjk --- src/plugins/axivion/axivionplugin.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index a5431b6069d..4421fd07d26 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -402,7 +402,7 @@ static Group fetchHtmlRecipe(const QUrl &url, const std::function typename DtoStorageType> static Group dtoRecipe(const Storage> &dtoStorage) { - const Storage storage; + const Storage> storage; const auto onNetworkQuerySetup = [dtoStorage](NetworkQuery &query) { QNetworkRequest request(dtoStorage->url); @@ -451,7 +451,7 @@ static Group dtoRecipe(const Storage> &dtoStorage) if constexpr (std::is_same_v) { // Suppress logging error on unauthorized dashboard fetch if (!dtoStorage->credential && error->type == "UnauthenticatedException") - return DoneResult::Error; + return DoneResult::Success; } errorString = Error(DashboardError(reply->url(), statusCode, @@ -473,11 +473,15 @@ static Group dtoRecipe(const Storage> &dtoStorage) }; const auto onDeserializeSetup = [storage](Async> &task) { + if (!*storage) + return SetupResult::StopWithSuccess; + const auto deserialize = [](QPromise> &promise, const QByteArray &input) { promise.addResult(DtoType::deserializeExpected(input)); }; task.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer()); - task.setConcurrentCallData(deserialize, *storage); + task.setConcurrentCallData(deserialize, **storage); + return SetupResult::Continue; }; const auto onDeserializeDone = [dtoStorage](const Async> &task, @@ -534,14 +538,13 @@ static Group authorizationRecipe() unauthorizedDashboardStorage->url = QUrl(settings().server.dashboard); return SetupResult::Continue; }; - const auto onUnauthorizedGroupDone = [unauthorizedDashboardStorage] { + const auto onUnauthorizedDashboard = [unauthorizedDashboardStorage] { if (unauthorizedDashboardStorage->dtoData) { dd->m_serverAccess = ServerAccess::NoAuthorization; dd->m_dashboardInfo = toDashboardInfo(*unauthorizedDashboardStorage); } else { dd->m_serverAccess = ServerAccess::WithAuthorization; } - return DoneResult::Success; }; const auto onCredentialLoopCondition = [](int) { @@ -649,7 +652,7 @@ static Group authorizationRecipe() unauthorizedDashboardStorage, onGroupSetup(onUnauthorizedGroupSetup), dtoRecipe(unauthorizedDashboardStorage), - onGroupDone(onUnauthorizedGroupDone) + Sync(onUnauthorizedDashboard) }, Group { LoopUntil(onCredentialLoopCondition), From d738d3ab954118c9a076bdc28302f4d6592213a7 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 28 Feb 2024 15:07:00 +0100 Subject: [PATCH 43/57] Axivion: Ensure the username matches on unauthenticated access Disallow the unauthenticated access when the username doesn't match the dashboard's username. Change-Id: If4a38091b0bba42d89da911be45f823c248cc25f Reviewed-by: Andreas Loth Reviewed-by: hjk Reviewed-by: --- src/plugins/axivion/axivionplugin.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index 4421fd07d26..f0f90d3f253 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -540,11 +540,19 @@ static Group authorizationRecipe() }; const auto onUnauthorizedDashboard = [unauthorizedDashboardStorage] { if (unauthorizedDashboardStorage->dtoData) { - dd->m_serverAccess = ServerAccess::NoAuthorization; - dd->m_dashboardInfo = toDashboardInfo(*unauthorizedDashboardStorage); - } else { - dd->m_serverAccess = ServerAccess::WithAuthorization; + const Dto::DashboardInfoDto &dashboardInfo = *unauthorizedDashboardStorage->dtoData; + const QString &username = settings().server.username; + if (username.isEmpty() + || (dashboardInfo.username && *dashboardInfo.username == username)) { + dd->m_serverAccess = ServerAccess::NoAuthorization; + dd->m_dashboardInfo = toDashboardInfo(*unauthorizedDashboardStorage); + return; + } + MessageManager::writeFlashing(QString("Axivion: %1") + .arg(Tr::tr("Unauthenticated access failed (wrong user), " + "using authenticated access..."))); } + dd->m_serverAccess = ServerAccess::WithAuthorization; }; const auto onCredentialLoopCondition = [](int) { From d70450d849d83cae0b23628454839afe30f92018 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 13 Mar 2024 14:31:16 +0100 Subject: [PATCH 44/57] Examples: Ignore remote Qt versions While showing examples from remote Qt versions would probably be possible, it is not a great idea performance-wise. Task-number: QTCREATORBUG-30512 Change-Id: I2d00640bc8cbb3b19a89af1b17108e28604ef5a8 Reviewed-by: Marcus Tillmanns --- src/plugins/qtsupport/exampleslistmodel.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/qtsupport/exampleslistmodel.cpp b/src/plugins/qtsupport/exampleslistmodel.cpp index e81535acb42..bb424077855 100644 --- a/src/plugins/qtsupport/exampleslistmodel.cpp +++ b/src/plugins/qtsupport/exampleslistmodel.cpp @@ -454,8 +454,10 @@ bool ExamplesViewController::isVisible() const void ExampleSetModel::updateQtVersionList() { - QtVersions versions = QtVersionManager::sortVersions(QtVersionManager::versions( - [](const QtVersion *v) { return v->hasExamples() || v->hasDemos(); })); + QtVersions versions = QtVersionManager::sortVersions( + QtVersionManager::versions([](const QtVersion *v) { + return !v->qmakeFilePath().needsDevice() && (v->hasExamples() || v->hasDemos()); + })); // prioritize default qt version ProjectExplorer::Kit *defaultKit = ProjectExplorer::KitManager::defaultKit(); From 1c64f2bd4e7cc7ae11cad46cd7a14a4a5c60dc3a Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 13 Mar 2024 14:04:10 +0100 Subject: [PATCH 45/57] AppMan: Fix crash when creating AppManagerInstallPackageStep ... in a situation where no device is present. This happened to me when trying to restore a "vanished" kit. Change-Id: I7019385af115a5cd653b9a79e4420f1f8df4797d Reviewed-by: Dominik Holland --- .../qtapplicationmanager/appmanagerinstallpackagestep.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/qtapplicationmanager/appmanagerinstallpackagestep.cpp b/src/plugins/qtapplicationmanager/appmanagerinstallpackagestep.cpp index f89514ba005..15d2833fa2d 100644 --- a/src/plugins/qtapplicationmanager/appmanagerinstallpackagestep.cpp +++ b/src/plugins/qtapplicationmanager/appmanagerinstallpackagestep.cpp @@ -74,7 +74,8 @@ AppManagerInstallPackageStep::AppManagerInstallPackageStep(BuildStepList *bsl, I const TargetInformation targetInformation(target()); - if (DeviceKitAspect::device(kit())->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { + IDeviceConstPtr device = DeviceKitAspect::device(kit()); + if (device && device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { packageFile.setDefaultPathValue(targetInformation.packageFilePath); } else { const Utils::FilePath packageFilePath = targetInformation.runDirectory.pathAppended( From 988832ae768394639cd0e98f58ab2b3f65347f5f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 13 Mar 2024 14:51:20 +0100 Subject: [PATCH 46/57] Do not use original ID when creating kit for vanished target If we use the same ID for the new kit as for the original, we get into problems if the original kit re-appears. This can happen when uninstalling a Qt version with the online installer, and later re-installing it. Or when changing the install settings path to a different online installation and back again via the command line or the "Link with Qt" functionality. Change-Id: Id99a3560ebed6264ad13dab5ff48945b30a8229f Reviewed-by: hjk Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/project.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 7f2eee43db7..1bb1629ef79 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -465,7 +465,6 @@ void Project::removeAllVanishedTargets() Target *Project::createKitAndTargetFromStore(const Utils::Store &store) { - const Id id = idFromMap(store); Id deviceTypeId = Id::fromSetting(store.value(Target::deviceTypeKey())); if (!deviceTypeId.isValid()) deviceTypeId = Constants::DESKTOP_DEVICE_TYPE; @@ -478,8 +477,7 @@ Target *Project::createKitAndTargetFromStore(const Utils::Store &store) kit->setUnexpandedDisplayName(kitName); DeviceTypeKitAspect::setDeviceTypeId(kit, deviceTypeId); kit->setup(); - }, - id); + }); QTC_ASSERT(k, return nullptr); auto t = std::make_unique(this, k, Target::_constructor_tag{}); if (!t->fromMap(store)) From 4a17bbbfd1bed00cd4b3b6fd5d77349ad079a9d6 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 13 Mar 2024 14:49:54 +0100 Subject: [PATCH 47/57] Axivion: Left-align the header columns Change-Id: Ie1384cf10bc30e12cac3c8b1d120edb030738a22 Reviewed-by: Jarek Kobus --- src/plugins/axivion/dynamiclistmodel.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/plugins/axivion/dynamiclistmodel.cpp b/src/plugins/axivion/dynamiclistmodel.cpp index 7c5262132b8..80419a32234 100644 --- a/src/plugins/axivion/dynamiclistmodel.cpp +++ b/src/plugins/axivion/dynamiclistmodel.cpp @@ -87,8 +87,13 @@ bool DynamicListModel::setData(const QModelIndex &index, const QVariant &value, QVariant DynamicListModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole && section < m_header.size()) + if (orientation == Qt::Vertical || section < 0 || section >= m_header.size()) + return {}; + if (role == Qt::DisplayRole) return m_header.at(section); + if (role == Qt::TextAlignmentRole) + return int(Qt::AlignLeft | Qt::AlignVCenter); + return {}; } From e97791ea6a3ff8580824141c5511eb5eec89ff55 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 13 Mar 2024 14:59:21 +0100 Subject: [PATCH 48/57] Axivion: Make columns movable again This got lost when replaced the default header implementation with a customized one. Change-Id: I5824b0e35a39746eb7056fbc95ea085505129f4e Reviewed-by: Jarek Kobus --- src/plugins/axivion/axivionoutputpane.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp index b6761197e07..d1c896205fe 100644 --- a/src/plugins/axivion/axivionoutputpane.cpp +++ b/src/plugins/axivion/axivionoutputpane.cpp @@ -349,6 +349,7 @@ IssuesWidget::IssuesWidget(QWidget *parent) m_issuesView->setFrameShape(QFrame::StyledPanel); // Bring back Qt default m_issuesView->setFrameShadow(QFrame::Sunken); // Bring back Qt default m_headerView = new IssueHeaderView(this); + m_headerView->setSectionsMovable(true); connect(m_headerView, &IssueHeaderView::sortTriggered, this, &IssuesWidget::onSearchParameterChanged); m_issuesView->setHeader(m_headerView); From e604f285e8b7ba496cc62da7f4a65106b6240946 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 13 Mar 2024 15:33:58 +0100 Subject: [PATCH 49/57] Android: Provide direct JDK download link to required version This changes the JDK download link to the JDK 17 packages on adoptium.net, which is the latest source for JDK binaries for all three host OSses. Fixes: QTCREATORBUG-30335 Change-Id: I54322c82b7854d948fe15462f198f8eac1f58981 Reviewed-by: Marcus Tillmanns --- src/plugins/android/androidsettingswidget.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 952465788f2..cb67d9fbeb7 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -49,6 +49,7 @@ using namespace Utils; namespace Android::Internal { static Q_LOGGING_CATEGORY(androidsettingswidget, "qtc.android.androidsettingswidget", QtWarningMsg); +constexpr int requiredJavaMajorVersion = 17; class SummaryWidget : public QWidget { @@ -221,7 +222,6 @@ static expected_str testJavaC(const FilePath &jdkPath) const QString javacCommand("javac"); const QString versionParameter("-version"); - constexpr int requiredMajorVersion = 17; const FilePath bin = jdkPath / "bin" / (javacCommand + QTC_HOST_EXE_SUFFIX); if (!bin.isExecutableFile()) @@ -254,9 +254,9 @@ static expected_str testJavaC(const FilePath &jdkPath) jdkVersion = QVersionNumber::fromString(stdOut.mid(outputPrefix.length()).split('\n').first()); - if (jdkVersion.isNull() || jdkVersion.majorVersion() != requiredMajorVersion) { + if (jdkVersion.isNull() || jdkVersion.majorVersion() != requiredJavaMajorVersion) { return make_unexpected(Tr::tr("Unsupported JDK version (needs to be %1): %2 (parsed: %3)") - .arg(requiredMajorVersion) + .arg(requiredJavaMajorVersion) .arg(stdOut) .arg(jdkVersion.toString())); } @@ -692,10 +692,10 @@ void AndroidSettingsWidget::openNDKDownloadUrl() void AndroidSettingsWidget::openOpenJDKDownloadUrl() { - if (HostOsInfo::isLinuxHost()) - QDesktopServices::openUrl(QUrl::fromUserInput("https://openjdk.java.net/install/")); - else - QDesktopServices::openUrl(QUrl::fromUserInput("https://adoptopenjdk.net/")); + const QString url = + QString::fromLatin1("https://adoptium.net/temurin/releases/?package=jdk&version=%1") + .arg(requiredJavaMajorVersion); + QDesktopServices::openUrl(QUrl::fromUserInput(url)); } void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) From cdad61d08a8ef3f02cdc3b11275b4dee461b9e8f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 13 Mar 2024 11:37:48 +0100 Subject: [PATCH 50/57] QmlDesigner: Add optional dependency on LicenseChecker It is important that the LicenseChecker's initialization (if that is available) happens before QmlDesigner's, so add an optional dependency to reflect that. Add a PLUGIN_MANUAL_DEPENDS option to add_qtc_plugin, which explicitly specifies the name, version and type. The existing PLUGIN_RECOMMENDS requires the plugin target to exist to extract the plugin's version. Change-Id: Ie2cf84e75964ce91ed8bbcdbeee9fa9770bed641 Reviewed-by: Cristian Adam Reviewed-by: Reviewed-by: Tim Jenssen --- cmake/QtCreatorAPI.cmake | 17 ++++++++++++++++- src/plugins/qmldesigner/CMakeLists.txt | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index 5cbd9cd4bf4..c27d24b43a1 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -330,7 +330,7 @@ function(add_qtc_plugin target_name) cmake_parse_arguments(_arg "SKIP_INSTALL;INTERNAL_ONLY;SKIP_TRANSLATION;EXPORT;SKIP_PCH" "VERSION;COMPAT_VERSION;PLUGIN_PATH;PLUGIN_NAME;OUTPUT_NAME;BUILD_DEFAULT;PLUGIN_CLASS" - "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;PUBLIC_DEFINES;INCLUDES;SYSTEM_INCLUDES;PUBLIC_INCLUDES;PUBLIC_SYSTEM_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;EXTRA_TRANSLATIONS;PLUGIN_DEPENDS;PLUGIN_RECOMMENDS;PLUGIN_TEST_DEPENDS;PROPERTIES" + "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;PUBLIC_DEFINES;INCLUDES;SYSTEM_INCLUDES;PUBLIC_INCLUDES;PUBLIC_SYSTEM_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;EXTRA_TRANSLATIONS;PLUGIN_DEPENDS;PLUGIN_RECOMMENDS;PLUGIN_TEST_DEPENDS;PLUGIN_MANUAL_DEPENDS;PROPERTIES" ${ARGN} ) @@ -421,6 +421,21 @@ function(add_qtc_plugin target_name) " { \"Name\" : \"${i}\", \"Version\" : \"${_v}\", \"Type\" : \"test\" }" ) endforeach(i) + list(LENGTH _arg_PLUGIN_MANUAL_DEPENDS manualdep_len) + math(EXPR manualdep_maxindex "${manualdep_len}-1") + if(manualdep_len GREATER 0) + # three items per entry: name, version, typeofdependency + foreach (i RANGE 0 ${manualdep_maxindex} 3) + math(EXPR dep_version_i "${i} + 1") + math(EXPR dep_type_i "${i} + 2") + list(GET _arg_PLUGIN_MANUAL_DEPENDS ${i} dep_name) + list(GET _arg_PLUGIN_MANUAL_DEPENDS ${dep_version_i} dep_version) + list(GET _arg_PLUGIN_MANUAL_DEPENDS ${dep_type_i} dep_type) + string(APPEND _arg_DEPENDENCY_STRING + " { \"Name\" : \"${dep_name}\", \"Version\" : \"${dep_version}\", \"Type\" : \"${dep_type}\" }" + ) + endforeach() + endif() string(REPLACE "} {" "},\n {" _arg_DEPENDENCY_STRING "${_arg_DEPENDENCY_STRING}" diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 7bfea271e5d..2e29b8dda82 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -478,6 +478,7 @@ add_qtc_plugin(QmlDesigner PLUGIN_DEPENDS Core ProjectExplorer QmlDesignerBase QmlJSEditor QmakeProjectManager QmlProjectManager QtSupport + PLUGIN_MANUAL_DEPENDS LicenseChecker ${IDE_VERSION} optional DEPENDS QmlJS LanguageUtils QmlEditorWidgets AdvancedDockingSystem Qt::QuickWidgets Qt::CorePrivate Qt::Xml Qt::Svg QmlDesignerCore Sqlite From 75b9b31c62467d66b5a5e9fd716887168305a3d8 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 13 Mar 2024 17:31:24 +0100 Subject: [PATCH 51/57] Doc: Turn "Using GitHub Copilot" into a how-to topic Task-number: QTCREATORBUG-29361 Change-Id: Ie682ebd399b0f478d106dba9876f4fea9834d340 Reviewed-by: Marcus Tillmanns --- doc/qtcreator/src/editors/creator-coding.qdoc | 4 -- .../editors/creator-only/creator-copilot.qdoc | 61 +++++++++---------- doc/qtcreator/src/qtcreator-toc.qdoc | 1 - 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/doc/qtcreator/src/editors/creator-coding.qdoc b/doc/qtcreator/src/editors/creator-coding.qdoc index 5df03c90ccd..781fbef65bf 100644 --- a/doc/qtcreator/src/editors/creator-coding.qdoc +++ b/doc/qtcreator/src/editors/creator-coding.qdoc @@ -56,9 +56,5 @@ \endlist - \if defined(qtcreator) - \sa {Using GitHub Copilot} - \else \sa {Apply quick fixes} - \endif */ diff --git a/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc b/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc index d2ca2681303..b3ded10f5d9 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc @@ -2,11 +2,12 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! - \previouspage creator-language-servers.html \page creator-copilot.html - \nextpage creator-mime-types.html + \previouspage creator-how-tos.html - \title Using GitHub Copilot + \ingroup creator-how-to-edit + + \title Use GitHub Copilot The Copilot plugin (disabled by default) integrates \l{https://github.com/features/copilot}{GitHub Copilot} into \QC. @@ -31,44 +32,43 @@ {Copilot.vim/Readme.md}. \endlist - \section1 Setting Copilot Preferences + \section1 Set Copilot preferences To set preferences for using Copilot: \list 1 - \li Select \preferences > \uicontrol Copilot. + \li Go to \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 {Enable Copilot} to use Copilot. \li Select \uicontrol {Sign In} to sign into your subscription, activate your device, and authorize the GitHub Copilot plugin. The button turns into a \uicontrol {Sign Out} button. - \li In the \uicontrol {Node.js path} field, enter the full path to the + \li In \uicontrol {Node.js path}, enter the full path to the Node.js executable. - \li In the \uicontrol {Path to agent.js} field, enter the path to + \li In \uicontrol {Path to agent.js}, enter the path to agent.js in the Copilot Neovim plugin installation folder. - \li Select the \uicontrol {Auto request} check box to receive suggestions + \li Select \uicontrol {Auto request} 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 + \li Select \uicontrol {Use proxy} to use a proxy server to connect to Copilot servers. - \li In the \uicontrol {Proxy host} field, enter the host name of the + \li In \uicontrol {Proxy host}, enter the host name of the proxy server. + \li In \uicontrol {Proxy port}, enter the port number 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 + \li Select \uicontrol {Reject unauthorized} 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 + \li In \uicontrol {Proxy user}, enter the user name to authenticate to the proxy server. - \li Select the \uicontrol {Save proxy password} check box to save the + \li Select \uicontrol {Save proxy password} 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. + \li In \uicontrol {Proxy password}, enter the password to save. + To see the password as you type, select + \inlineimage icons/original-size.png. \endlist - \section1 Receiving Suggestions + \section1 Receive suggestions When you write code in the \l {Edit Mode}{Edit} mode and \uicontrol {Auto request} is enabled, Copilot automatically makes @@ -93,20 +93,19 @@ To reject a suggestion, press \key Esc or the arrow keys. - \section1 Enabling and Disabling Suggestions + \section1 Turn suggestions on and off - You can enable and disable the Copilot suggestions either globally for all + You can turn the Copilot suggestions on and off either globally for all projects or at project level for a particular project. - 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 \preferences accordingly. + To turn Copilot suggestions on or off globally, select + \inlineimage icons/copilot.png (\uicontrol {Toggle Copilot}). This also + sets the value of \uicontrol {Enable Copilot} in \preferences > + \uicontrol Copilot accordingly. - To enable or disable Copilot suggestions for a particular project, - select \uicontrol Projects > \uicontrol {Project Settings} > - \uicontrol Copilot, and then select or deselect the - \uicontrol {Enable Copilot} check box. + To turn Copilot suggestions on or off for a particular project, + go to \uicontrol Projects > \uicontrol {Project Settings} > + \uicontrol Copilot and then select or clear \uicontrol {Enable Copilot}. - \sa {Enable and disable plugins} + \sa {Enable and disable plugins}, {Edit Mode} */ diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 6e45a628343..048d8b2e8fd 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -35,7 +35,6 @@ \li \l{Pasting and Fetching Code Snippets} \endlist \li \l{Configuring the Editor} - \li \l{Using GitHub Copilot} \endlist \li \l{Building and Running} \list From 5ebd4c833ea3e0d8aa38101e25d3e64b9dc853a3 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 13 Mar 2024 16:59:19 +0100 Subject: [PATCH 52/57] QtSupport: Restrict QtVersionManagerImpl lifetime to plugin lifetime This occasionally triggered crashes on static destruction when hard-killing Qt Creator. Giving QtVersionManagerImpl the plugin as QObject parent effectively re-instates the lifetime behavior from before we moved to delayed initialization. We keep the delayed initialization, at the (acceptable) prize of a somewhat quirky setup. Change-Id: I1b4be284a1b573325ed5cc441778eeb48b94c24b Reviewed-by: Eike Ziller Reviewed-by: --- src/plugins/qtsupport/qtsupportplugin.cpp | 2 ++ src/plugins/qtsupport/qtversionmanager.cpp | 15 ++++++++++++--- src/plugins/qtsupport/qtversionmanager.h | 2 ++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp index db0f8888af4..c8a7b7cf1f3 100644 --- a/src/plugins/qtsupport/qtsupportplugin.cpp +++ b/src/plugins/qtsupport/qtsupportplugin.cpp @@ -83,6 +83,8 @@ void QtSupportPlugin::initialize() addTestCreator(createQtProjectImporterTest); #endif + setupQtVersionManager(this); + setupDesktopQtVersion(); setupEmbeddedLinuxQtVersion(); setupGettingStartedWelcomePage(); diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index 063a1309846..746f4f8c5e6 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -89,7 +89,8 @@ static PersistentSettingsWriter *m_writer = nullptr; class QtVersionManagerImpl : public QObject { public: - QtVersionManagerImpl() + QtVersionManagerImpl(QObject *parent) + : QObject(parent) { qRegisterMetaType(); @@ -135,10 +136,18 @@ public: QTimer m_fileWatcherTimer; }; +static QObject *s_guard = nullptr; + +void Internal::setupQtVersionManager(QObject *guard) +{ + s_guard = guard; +} + QtVersionManagerImpl &qtVersionManagerImpl() { - static QtVersionManagerImpl theQtVersionManager; - return theQtVersionManager; + QTC_CHECK(s_guard); + static auto theQtVersionManager = new QtVersionManagerImpl(s_guard); + return *theQtVersionManager; } void QtVersionManagerImpl::triggerQtVersionRestore() diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h index 9fa2cfb5b16..9eb17a4d8cc 100644 --- a/src/plugins/qtsupport/qtversionmanager.h +++ b/src/plugins/qtsupport/qtversionmanager.h @@ -70,4 +70,6 @@ private: static int getUniqueId(); }; +namespace Internal { void setupQtVersionManager(QObject *guard); } + } // namespace QtSupport From fc4067a1188b6cf05f649ac236e231fc5a985b03 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 12 Mar 2024 10:04:42 +0100 Subject: [PATCH 53/57] Debugger: Annotate internal debug output with engine type Makes it easier to reason in mixed setups. Change-Id: I4f7aa43847dab51d4041fb1b9850ed9860a6dafc Reviewed-by: Qt CI Bot Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerengine.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 1be2f566046..fde7704c5bb 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1765,6 +1765,10 @@ void DebuggerEngine::showMessage(const QString &msg, int channel, int timeout) c d->m_logWindow->showInput(LogInput, msg); d->m_logWindow->showOutput(LogInput, msg); break; + case LogOutput: + case LogWarning: + d->m_logWindow->showOutput(channel, msg); + break; case LogError: d->m_logWindow->showInput(LogError, "ERROR: " + msg); d->m_logWindow->showOutput(LogError, "ERROR: " + msg); @@ -1779,7 +1783,7 @@ void DebuggerEngine::showMessage(const QString &msg, int channel, int timeout) c emit appendMessageRequested(msg, StdErrFormat, false); break; default: - d->m_logWindow->showOutput(channel, msg); + d->m_logWindow->showOutput(channel, QString("[%1] %2").arg(debuggerName(), msg)); break; } } From d0e240fd526c82c74ffa8ef665ac1243b58cc080 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 12 Mar 2024 09:35:30 +0100 Subject: [PATCH 54/57] Doc: Turn "Pasting and Fetching Code Snippets" into a how-to Task-number: QTCREATORBUG-29361 Change-Id: I0b2fe3cd2b3d3e3ec2c589ebcbd196832765c4ac Reviewed-by: Friedemann Kleint --- .../creator-only/creator-debugger.qdoc | 2 +- .../editors/creator-editors-writing-code.qdoc | 9 -- .../creator-only/creator-code-pasting.qdoc | 107 ++++++++++-------- .../creator-only/creator-diff-editor.qdoc | 2 +- .../creator-how-to-contact-qt.qdoc | 2 +- doc/qtcreator/src/qtcreator-toc.qdoc | 1 - 6 files changed, 63 insertions(+), 60 deletions(-) diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc index 34ea75fc528..adf3cb8b542 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc @@ -1992,7 +1992,7 @@ the right hand side to find out what went wrong. Always attach the contents of the pane to debugger-related questions to the \QC mailing list (qt-creator@qt-project.org) or paste them to a - \l{Pasting and Fetching Code Snippets}{code pasting service} before + \l{Paste and fetch code snippets}{code pasting service} before asking questions in the IRC (on the #qt-creator channel at Libera.Chat). \note Error 135 usually means that a dependent DLL cannot be found. diff --git a/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc b/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc index c0ca9294607..a720f795346 100644 --- a/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc +++ b/doc/qtcreator/src/editors/creator-editors-writing-code.qdoc @@ -57,15 +57,6 @@ few people can visualize the color \c {#18793f}. To easily edit these properties, you can use the Qt Quick Toolbars. - \if defined(qtcreator) - \li \l{Pasting and Fetching Code Snippets} - - You can cooperate with others by pasting and fetching - snippets of code from a server. For example, you might ask - colleagues to review a change that you plan to submit to a - version control system. - - \endif \endlist \if defined(qtcreator) 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 a1dc27193c7..735ca3066c9 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-code-pasting.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-code-pasting.qdoc @@ -1,16 +1,16 @@ -// Copyright (C) 2019 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! - \previouspage qt-quick-toolbars.html \page creator-editor-codepasting.html - \nextpage creator-macros.html + \previouspage creator-how-tos.html - \title Pasting and Fetching Code Snippets + \ingroup creator-how-to-edit - In \QC, you can paste snippets of code to a server or fetch snippets of - code from the server. To paste and fetch snippets of code, \QC uses the - following: + \title Paste and fetch code snippets + + To paste snippets of code to a server or fetch snippets of code from the + server, use one of the following code pasting services: \list \li \uicontrol {Pastebin.Com} @@ -18,59 +18,72 @@ \li \uicontrol {Shared network drives} \endlist - \section1 Specifying Settings for Code Pasting + For example, you might ask colleagues to review a change that you plan to + submit to a version control system. If you use the Git version control + system, create a \e{diff} view by going to \uicontrol Tools > + \uicontrol Git > \uicontrol {Local Repository} > \uicontrol Diff. + Then, upload its contents to the server by going to \uicontrol Tools > + \uicontrol {Code Pasting} > \uicontrol {Paste Snippet}. - To specify settings for the code pasting service: + The reviewers can retrieve the code snippet by selecting \uicontrol Tools > + \uicontrol {Code Pasting} > \uicontrol {Fetch Snippet}. If they have the + project currently opened in \QC, they can apply and test the change by + going to \uicontrol Tools > \uicontrol Git > \uicontrol {Local Repository} + > \uicontrol Patch > \uicontrol {Apply from Editor}. - \list 1 - \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. - \li In the \uicontrol Username field, enter your username. - \li In the \uicontrol {Expires after} field, specify the time to keep - the pasted snippet on the server. - \li Select the \uicontrol {Copy-paste URL to clipboard} check box to - copy the URL of the post on the code pasting service to the - clipboard when you paste a post. - \li Select the \uicontrol {Display General Messages after sending a post} - check box to display the URL in \l{View output}{General Messages} - when you paste a post. - \endlist + \section1 Paste snippets - Select \uicontrol Fileshare to specify the path to a shared network drive. - The code snippets are copied to the drive as simple files. You have to - delete obsolete files from the drive manually. - - \section1 Using Code Pasting Services - - To paste a snippet of code onto the server, select \uicontrol Tools > + To paste a snippet of code onto the server, go to \uicontrol Tools > \uicontrol {Code Pasting} > \uicontrol {Paste Snippet} or press \key {Alt+C,Alt+P}. By default, \QC copies the URL of the snippet to the clipboard and displays the URL in \uicontrol {General Messages}. - To paste any content that you copied to the clipboard, select + To paste any content that you copied to the clipboard, go to \uicontrol Tools > \uicontrol {Code Pasting} > \uicontrol {Paste Snippet}. To paste content from the \l{Compare files}{diff editor}, right-click a chunk and select \uicontrol {Send Chunk to CodePaster} in the context menu. - To fetch a snippet of code from the server, select \uicontrol Tools > - \uicontrol {Code Pasting} > \uicontrol {Fetch Snippet} or press - \key {Alt+C,Alt+F}. Select the snippet to fetch from the list. + \section1 Fetch snippets - To fetch the content stored at an URL, select \uicontrol Tools > + To fetch a snippet of code from the server: + + \list 1 + \li Go to \uicontrol Tools > \uicontrol {Code Pasting} > + \uicontrol {Fetch Snippet} or press \key {Alt+C,Alt+F}. + \li Select the snippet to fetch from the list. + \endlist + + To fetch the content stored at a URL, select \uicontrol Tools > \uicontrol {Code Pasting} > \uicontrol {Fetch from URL}. - For example, you might ask colleagues to review a change that you plan to - submit to a version control system. If you use the Git version control - system, you can create a \e{diff} view by selecting \uicontrol Tools > - \uicontrol Git > \uicontrol {Local Repository} > \uicontrol Diff. You can - then upload its contents to the server by selecting \uicontrol Tools > - \uicontrol {Code Pasting} > \uicontrol {Paste Snippet}. The reviewers can - retrieve the code snippet by selecting \uicontrol Tools > - \uicontrol {Code Pasting} > \uicontrol {Fetch Snippet}. If they have the - project currently opened in \QC, they can apply and test the change by - choosing \uicontrol Tools > \uicontrol Git > \uicontrol {Local Repository} - > \uicontrol Patch > \uicontrol {Apply from Editor}. + \section1 Set code pasting preferences + + To set preferences for a code pasting service: + + \list 1 + \li Go to \preferences > \uicontrol {Code Pasting} > \uicontrol General. + \image qtcreator-code-pasting-options.png {Code Pasting preferences} + \li In \uicontrol {Default protocol}, select a code pasting service to + use by default. + \li In \uicontrol Username, enter your username. + \li In \uicontrol {Expires after}, specify the time to keep + the pasted snippet on the server. + \li Select \uicontrol {Copy-paste URL to clipboard} to copy the URL of + the post on the code pasting service to the clipboard when you paste + a post. + \li Select \uicontrol {Display General Messages after sending a post} + to display the URL in \l{View output}{General Messages} + when you paste a post. + \endlist + + \section2 Set a shared network drive for code pasting + + Go to \preferences > \uicontrol {Code Pasting} > \uicontrol Fileshare to + specify the path to a shared network drive. + + The code snippets are copied to the drive as simple files. You have to + delete obsolete files from the drive manually. + + \sa {Git} */ diff --git a/doc/qtcreator/src/editors/creator-only/creator-diff-editor.qdoc b/doc/qtcreator/src/editors/creator-only/creator-diff-editor.qdoc index de83a3e1ab7..330af8d335e 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-diff-editor.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-diff-editor.qdoc @@ -101,7 +101,7 @@ \if defined(qtcreator) \section1 Paste changes for review - To send a chunk of changes to a \l{Pasting and Fetching Code Snippets} + To send a chunk of changes to a \l{Paste and fetch code snippets} {code pasting service}, select \uicontrol {Send Chunk to CodePaster} in the context menu. \endif diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-contact-qt.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-contact-qt.qdoc index 93b8844f240..2ca57713777 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-to-contact-qt.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-contact-qt.qdoc @@ -45,5 +45,5 @@ {#qt-creator} channel on Libera.Chat IRC, go to \uicontrol Help > \uicontrol Contact. - \sa {Pasting and Fetching Code Snippets}, {Technical Support} + \sa {Paste and fetch code snippets}, {Technical Support} */ diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 048d8b2e8fd..343f83c6af2 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -32,7 +32,6 @@ \li \l{Semantic Highlighting} \li \l{Checking Code Syntax} \li \l{Using Qt Quick Toolbars} - \li \l{Pasting and Fetching Code Snippets} \endlist \li \l{Configuring the Editor} \endlist From f6c3318e94f0cf09012fde878fbc969c38e9b6ab Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 11 Mar 2024 16:04:59 +0100 Subject: [PATCH 55/57] Doc: Turn "Running on Multiple Platforms" into how-to topics And hide it from the top level TOC in the manual. Link to "How To: Build with CMake" from CMake topics. Task-number: QTCREATORBUG-29361 Change-Id: If0522cdd9636ac075e8bdeafa0fc7248199aaf2a Reviewed-by: Christian Kandeler --- doc/qtcreator/src/android/androiddev.qdoc | 2 +- .../src/android/deploying-android.qdoc | 2 +- .../src/baremetal/creator-baremetal-dev.qdoc | 2 +- .../creator-projects-cmake-building.qdoc | 2 +- .../src/cmake/creator-projects-cmake.qdoc | 34 +++--- .../creator-only/creator-debugger.qdoc | 2 +- .../creator-build-settings-qmake.qdoc | 2 +- .../creator-projects-building-running.qdoc | 10 +- .../creator-projects-building.qdoc | 102 +++++++++--------- .../creator-projects-settings-build-qbs.qdoc | 2 +- doc/qtcreator/src/qtcreator-toc.qdoc | 3 +- doc/qtcreator/src/qtcreator.qdoc | 3 +- .../src/user-interface/creator-ui.qdoc | 2 +- .../src/webassembly/creator-webassembly.qdoc | 2 +- 14 files changed, 81 insertions(+), 89 deletions(-) diff --git a/doc/qtcreator/src/android/androiddev.qdoc b/doc/qtcreator/src/android/androiddev.qdoc index 7e172f0650a..c0fe2cedea0 100644 --- a/doc/qtcreator/src/android/androiddev.qdoc +++ b/doc/qtcreator/src/android/androiddev.qdoc @@ -202,7 +202,7 @@ To start an AVD, select \uicontrol {Start AVD}. Usually, you don't need to start AVDs separately because \QC starts them when you - select them in the \l{Building for Multiple Platforms}{kit selector} to + select them in the \l{Build for many platforms}{kit selector} to \l{Deploying to Android}{deploy applications} to them. To remove an AVD from the list and the kit selector, select diff --git a/doc/qtcreator/src/android/deploying-android.qdoc b/doc/qtcreator/src/android/deploying-android.qdoc index 2926d7739bd..2b3441290f3 100644 --- a/doc/qtcreator/src/android/deploying-android.qdoc +++ b/doc/qtcreator/src/android/deploying-android.qdoc @@ -61,7 +61,7 @@ To remove the current deployment method, select \uicontrol Remove. \QC deploys the packages on the Android device that you select in the - \l{Building for Multiple Platforms}{kit selector}. To add devices, select + \l{Build for many platforms}{kit selector}. To add devices, select \uicontrol Manage. For more information about specifying additional start options for diff --git a/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc b/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc index dfde42b473e..96fabb36244 100644 --- a/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc +++ b/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc @@ -262,7 +262,7 @@ You can build applications for and run them on bare metal devices in the same way as for and on the desktop. For more information, see - \l{Building for Multiple Platforms} and \l{Run on many platforms}. + \l{Build for many platforms} and \l{Run on many platforms}. \sa {Enable and disable plugins} */ diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc index c71a8bed8cc..aac591854cd 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc @@ -301,5 +301,5 @@ \sa {Activate kits for a project}, {Add custom output parsers}, {Configure projects for building}, {Configure projects for running}, - {Open projects}, {CMake} + {Build with CMake}{How To: Build with CMake}, {Open projects}, {CMake} */ diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc index a1130b7a89e..3fe99abfdf6 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc @@ -47,8 +47,8 @@ Typically, you cannot compile such projects without manual changes. \endlist - \sa {Build with CMake}{How To: Build with CMake}, {CMake Build Configuration}, - {Configure projects for building}, {Configure projects for running}, + \sa {Configure projects for building}, {Configure projects for running}, + {Build with CMake}{How To: Build with CMake}, {CMake Build Configuration}, {Debug CMake project files}, {Deploying to Remote Linux}, {Open projects}, {Use compilation databases} */ @@ -70,9 +70,8 @@ \image qtcreator-projects-view-edit.png {CMake project in Projects view} - To disable this - behavior, select \preferences > \uicontrol CMake > \uicontrol General, and - then deselect the \uicontrol {Autorun CMake} check box. + To disable this behavior, go to \preferences > \uicontrol CMake > + \uicontrol General and clear \uicontrol {Autorun CMake}. \image qtcreator-preferences-cmake-general.webp {General tab in CMake Preferences} @@ -100,7 +99,7 @@ box. The change takes effect after you select \uicontrol Build > \uicontrol {Run CMake}. - \sa {CMake}, {Manage files in CMake projects}, {Open projects}, + \sa {Build with CMake}{How To: Build with CMake}, {CMake}, {Open projects}, {File System}, {Projects} */ @@ -125,7 +124,8 @@ \li Switching to the Help mode \endlist - \sa {CMake}, {Read Documentation}{How To: Read Documentation} + \sa {Build with CMake}{How To: Build with CMake}, {CMake}, + {Read Documentation}{How To: Read Documentation} */ /*! @@ -183,7 +183,8 @@ \image qtcreator-kits-cmake.png {Kits preferences} - \sa {CMake}, {Add kits}, {kits-tab}{Kits} + \sa {Build with CMake}{How To: Build with CMake}, {CMake}, {Add kits}, + {kits-tab}{Kits} */ /*! @@ -234,8 +235,8 @@ Warnings and errors are displayed in \l {Issues}. - \sa {CMake}, {Add libraries to CMake projects}, {Complete CMake code}, - {Format CMake files}, {Completion}, {Snippets} + \sa {Build with CMake}{How To: Build with CMake}, {CMake}, {Completion}, + {Snippets} */ /*! @@ -263,7 +264,8 @@ Press \key Tab or \key Enter to accept the selected suggestion and complete the code. - \sa {CMake}, {Edit CMake configuration files}, {Completion}, {Snippets} + \sa {Build with CMake}{How To: Build with CMake}, {CMake}, {Completion}, + {Snippets} */ /*! @@ -297,8 +299,7 @@ current project. \endlist - \sa {CMake},{Complete CMake code}, {Edit CMake configuration files}, - {Edit MIME types} + \sa {Build with CMake}{How To: Build with CMake}, {Edit MIME types}, {CMake} */ /*! @@ -324,8 +325,7 @@ When you rename or remove files in the \l {Projects} or \l {File System} view, \QC renames them in the CMakeLists.txt file or removes them from it. - \sa {CMake}, {Add libraries to CMake projects}, {Create files}, - {Edit CMake configuration files}, {View CMake project contents}, + \sa {Create files}, {Build with CMake}{How To: Build with CMake}, {CMake}, {File System}, {Projects} */ @@ -377,6 +377,6 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") \endcode - \sa {CMake}, {Edit CMake configuration files}, {Complete CMake code}, - {Completion}, {Snippets} + \sa {Build with CMake}{How To: Build with CMake}, {CMake}, {Completion}, + {Snippets} */ diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc index adf3cb8b542..35bd896dff2 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc @@ -154,7 +154,7 @@ For \l {Creating a Qt for Python Application with Qt Widgets}{Python} projects, start debugging the \c main.py file. If you encounter problems, check the - active build target in the \l{Building for Multiple Platforms}{kit selector}. + active build target in the \l{Build for many platforms}{kit selector}. \section1 Debugger Operating Modes 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 18906bee8d5..3f24273f09c 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 @@ -39,7 +39,7 @@ In the \uicontrol {Tooltip in target selector} field, you can enter text that is displayed as a tooltip when you hover the mouse over the build - configuration in the \l{Building for Multiple Platforms}{kit selector}. + configuration in the \l{Build for many platforms}{kit selector}. You can create separate versions of project files to keep platform-dependent code separate. You can use qmake \l{Adding Platform Specific Source Files} diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-building-running.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-building-running.qdoc index 3f54c09e1a3..bd4743a437b 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-building-running.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-building-running.qdoc @@ -12,9 +12,7 @@ \page creator-building-running.html \nextpage creator-live-preview.html - \title Building and Running - - \image front-preview.png + \title Running on Devices \QC supports running and deploying Qt applications that you build for different target platforms or with different compilers, debuggers, or @@ -31,12 +29,6 @@ Android and embedded Linux devices. The changes you make to the UI are instantly visible to you in the preview. - \li \l{Building for Multiple Platforms} - - \e {Build configurations} have everything you need to compile - the sources into binaries. Build configurations use the tools and settings - defined in their corresponding kit. - \li \l{Deploying to Devices} \e {Deploy configurations} handle the packaging and copying of 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 512a3886ab4..d42df965a7e 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc @@ -8,23 +8,26 @@ // ********************************************************************** /*! - \previouspage qt-design-viewer.html \page creator-building-targets.html - \nextpage creator-running-targets.html + \previouspage creator-how-tos.html - \title Building for Multiple Platforms + \ingroup creator-how-to-build - You can build applications for multiple target platforms, or using different + \title Build for many platforms + + You can build applications for many target platforms, or using different compilers, debuggers or Qt versions. \l{glossary-buildandrun-kit}{Kits} - define the tools, \l{glossary-device}{device} type and other settings to use. + define the tools, \l{glossary-device}{device} type, and other settings to use. By default, when you run the application, you automatically build and deploy it first. However, you can also perform each operation separately. To check that the application code can be compiled and linked for a device, - you can build the project. The build errors and warnings are displayed in - the \l Issues. More detailed information is displayed in \l {Compile Output}. + build the project. You can see build errors and warnings in \l Issues and + more details in \l {Compile Output}. + + \section1 Build an application To build an application: @@ -37,7 +40,7 @@ \image qtcreator-kit-selector.webp {Kit selector} - \li Choose \uicontrol Build > \uicontrol {Build Project} or press + \li Select \uicontrol Build > \uicontrol {Build Project} or press \key {Ctrl+B}. Or, select \inlineimage icons/run_small.png (\uicontrol Run) to @@ -45,23 +48,25 @@ \endlist + \section1 Cancel builds + While the application is being built, the \inlineimage icons/build.png (\uicontrol Build) button changes to a \inlineimage icons/cancel-build.png - (\uicontrol {Cancel Build}) button. To cancel the build, select - the button, press \key {Alt+Backspace}, or select \uicontrol Build > - \uicontrol {Cancel Build}. + (\uicontrol {Cancel Build}) button. To cancel the build: - If you selected a build command and - decide you would also like to run the application, you can select the - \uicontrol Run button to schedule running the project after building is done. + \list + \li Select \inlineimage icons/cancel-build.png. + \li Press \key {Alt+Backspace}. + \li Go to \uicontrol Build > \uicontrol {Cancel Build}. + \endlist - For more information on the options you have, see - \l{Specifying Build Settings}. + If you selected a build command and now would also like to run the + application, select the \uicontrol Run button to schedule running + the project after building is done. - \section1 Additional Build Commands + \section1 Build projects in several configurations - The \uicontrol Build menu has additional commands for building, - rebuilding, and cleaning projects. + Go to \uicontrol Build to build, rebuild, and clean projects. To build the current project in all its configurations, that is, for all build configurations in all enabled kits, select @@ -74,20 +79,24 @@ To build all open projects in all their configurations, select \uicontrol {Build All Projects for All Configurations}. + \section1 Build files or subprojects + To quickly check the compile output for changes that you made in one file or - subproject, you can use the \uicontrol Build menu commands to build a file or - subproject. The available build menu commands depend on the build system - you selected for the project: CMake, qmake, or Qbs. + subproject, use the \uicontrol Build menu commands to build it. The available + build menu commands depend on the build system you selected for the project: + CMake, qmake, or Qbs. Select \uicontrol {Build for Run Configuration} to build the executable that corresponds to the selected run configuration. You can also use the \c cm filter in the \l {Navigate with locator} {locator}. - To remove all build artifacts, select one of \uicontrol {Clean} menu commands. + \section1 Remove build artifacts + + To remove all build artifacts, go to \uicontrol Build > \uicontrol {Clean}. To clean the build directory and then build the project, select - one of \uicontrol {Rebuild} menu commands. + \uicontrol {Rebuild}. To build and clean projects without dependencies, select the \uicontrol {Build Without Dependencies}, @@ -95,30 +104,23 @@ \uicontrol {Clean Without Dependencies} options in the context menu in the \uicontrol Projects view. - To run qmake or CMake to regenerate build system files, select - \uicontrol Build > \uicontrol {Run qmake} or \uicontrol {Run CMake}. - - \section1 Building with CMake - - \QC automatically runs CMake when you make changes to \c {CMakeLists.txt} - 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" - - For more information, see \l {CMake}. - - \section1 Building with qmake - - 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 \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" - - \sa {Configure projects for building}, {Configure projects for running}, - {qmake Build Configuration} + \sa {Configure projects for building}, {Build and Run}{How To: Build and Run}, + {Adding Docker Devices}, {Specifying Build Settings} +*/ + +/*! + \page creator-how-to-run-qmake-before-building.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-build-with-qmake + + \title Run qmake before building + + To prevent failures on incremental builds, always run qmake before building, + even though it takes more time. Go to \preferences > \uicontrol {Build & Run} + > \uicontrol Qmake, and select \uicontrol {Run qmake on every build}. + + \image qtcreator-preferences-build-run-qmake.png {Build & Run Qmake Preferences} + + \sa {Build and Run}{How To: Build and Run}, {qmake Build Configuration} */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-build-qbs.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-build-qbs.qdoc index f6594671bcf..f1b08ac048a 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-build-qbs.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-build-qbs.qdoc @@ -22,7 +22,7 @@ In the \uicontrol {Tooltip in target selector} field, you can enter text that is displayed as a tooltip when you hover the mouse over the build - configuration in the \l{Building for Multiple Platforms}{kit selector}. + configuration in the \l{Build for many platforms}{kit selector}. You can enter a name for the build configuration in the \uicontrol {Configuration name} field. diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 343f83c6af2..14fe5e27cdb 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -35,7 +35,7 @@ \endlist \li \l{Configuring the Editor} \endlist - \li \l{Building and Running} + \li \l{Running on Devices} \list \li \l{Validating with Target Hardware} \list @@ -43,7 +43,6 @@ \li \l{Previewing on Devices} \li \l{Previewing in Browsers} \endlist - \li \l{Building for Multiple Platforms} \li \l{Deploying to Devices} \list \li \l{Deploying to Android} diff --git a/doc/qtcreator/src/qtcreator.qdoc b/doc/qtcreator/src/qtcreator.qdoc index 6fa4967023f..0e8b476b40e 100644 --- a/doc/qtcreator/src/qtcreator.qdoc +++ b/doc/qtcreator/src/qtcreator.qdoc @@ -46,10 +46,9 @@ \li \l{Writing Code} \li \l{Configuring the Editor} \endlist - \li \b {\l{Building and Running}} + \li \b {\l{Running on Devices}} \list \li \l{Validating with Target Hardware} - \li \l{Building for Multiple Platforms} \li \l{Deploying to Devices} \li \l{Connecting Devices} \endlist diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index 066e93fbbf6..88f57493534 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -50,7 +50,7 @@ \li \inlineimage numbers/05.png \li Build button \li Build the application using the selected kit. - \li \l{Building for Multiple Platforms} + \li \l{Build for many platforms} \row \li \inlineimage numbers/06.png \li Locator diff --git a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc index e0ab35464c3..4a459e8cdd6 100644 --- a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc +++ b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc @@ -109,7 +109,7 @@ \endlist You can now build Qt applications in WebAssembly format and run them in - a web browser as described in \l {Building for Multiple Platforms} and + a web browser as described in \l {Build for many platforms} and \l{Run on many platforms}. \sa {Enable and disable plugins} From d5c357e67b11f3774c411c738fe0957f6d6f6645 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 14 Mar 2024 09:50:52 +0100 Subject: [PATCH 56/57] Doc: Add path to "Initial Configuration" It is not in the dialog described in the topic. Change-Id: Ia0d1a399a2926e78cb8a0cc772abb7e2adc14840 Reviewed-by: Fabian Kosmale --- .../editors/creator-only/creator-language-server.qdoc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 897facbe4ac..b9b09a17e85 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc @@ -238,12 +238,13 @@ \image qtcreator-qml-js-editing.webp {QML/JS Editing preferences} - When using \c qmlls from Qt 6.7 or later, it is recommended - to set \l{QT_QML_GENERATE_QMLLS_INI} to \c{ON} in - \uicontrol {Initial Configuration}. + When using \c qmlls from Qt 6.7 or later, set \l{QT_QML_GENERATE_QMLLS_INI} + to \c{ON} in \uicontrol Projects > \uicontrol {Build Settings} + > \uicontrol {Initial Configuration}. \sa {Manage Language Servers}{How To: Manage Language Servers}, - {Enabling and Disabling Messages}, {Language Servers} + {Enabling and Disabling Messages}, {CMake Build Configuration}, + {Language Servers} */ /*! From 11752615c5db419bd4bf9842b4f0ba1f8aca8051 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 14 Mar 2024 09:38:10 +0100 Subject: [PATCH 57/57] Process: Don't call waitForFinished() when process is not running Fixes: QTCREATORBUG-30537 Change-Id: I8594fd6982e22044a43e5a67411b50f1bdc02426 Reviewed-by: Marcus Tillmanns --- src/libs/utils/process.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/utils/process.cpp b/src/libs/utils/process.cpp index 111ebe89cf6..802ae632f1a 100644 --- a/src/libs/utils/process.cpp +++ b/src/libs/utils/process.cpp @@ -1934,7 +1934,7 @@ void Process::runBlocking(seconds timeout, EventLoopMode eventLoopMode) #endif } else { handleStart(); - if (!waitForFinished(timeout)) + if (state() != QProcess::NotRunning && !waitForFinished(timeout)) handleTimeout(); } if (blockingThresholdMs > 0) {