From a6fd8d2f60bdd46d1cbdfdb5598fac4f9f651e49 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 30 May 2023 16:35:41 +0200 Subject: [PATCH 001/204] Update qbs submodule to HEAD of 2.0 branch Change-Id: I962397da7fa19d4ba0948550a0cf35c9278637c8 Reviewed-by: Christian Stenger Reviewed-by: --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index eaeba4a45e7..1a575d27436 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit eaeba4a45e7d95b7bb3f4fe907e862d947faf092 +Subproject commit 1a575d27436ef71e999c709b11e6d7a24e57916e From 7a37a9c76c7a88364d37cf9ddd59e6b1194d42cc Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 30 May 2023 16:18:06 +0200 Subject: [PATCH 002/204] ProjectExplorer: Consider the case of no active target ... in BuildManager. Fixes: QTCREATORBUG-29207 Change-Id: Icbcdc957cd9105f7c4b9bc27fc9feb34dd547955 Reviewed-by: Reviewed-by: Christian Stenger Reviewed-by: Qt CI Bot --- src/plugins/projectexplorer/buildmanager.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index 57bfde6e46a..1f0e0fb1483 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -61,7 +61,9 @@ static const QList targetsForSelection(const Project *project, { if (targetSelection == ConfigSelection::All) return project->targets(); - return {project->activeTarget()}; + if (project->activeTarget()) + return {project->activeTarget()}; + return {}; } static const QList buildConfigsForSelection(const Target *target, From 65a7d3a200279518217bd61b723708f389bad3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sivert=20Kr=C3=B8vel?= Date: Tue, 4 Apr 2023 13:10:32 +0200 Subject: [PATCH 003/204] McuSupport: Update test data Change-Id: I56a82274bd34ac9a34a785c43cc066ca6598fbaa Reviewed-by: Eike Ziller Reviewed-by: Reviewed-by: Christian Stenger Reviewed-by: Yasser Grimes --- src/plugins/mcusupport/test/unittest.cpp | 58 +++++++++++++++++++++--- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index b9fc108ef76..0804a1cbf05 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -146,9 +146,9 @@ const QString stmCubeProgrammerDetectionPath{HostOsInfo::isWindowsHost() ? QString("bin/STM32_Programmer_CLI.exe") : QString("bin/STM32_Programmer.sh")}; -const char renesasProgrammerSetting[]{"FlashProgrammerPath"}; +const char renesasProgrammerSetting[]{"RenesasFlashProgrammer"}; const char renesasProgrammerCmakeVar[]{"RENESAS_FLASH_PROGRAMMER_PATH"}; -const QString renesasProgrammerEnvVar{"RenesasFlashProgrammer_PATH"}; +const char renesasProgrammerEnvVar[]{"RENESAS_FLASH_PROGRAMMER_PATH"}; const char renesasProgrammerLabel[]{"Renesas Flash Programmer"}; const QString renesasProgrammerDetectionPath{HostOsInfo::withExecutableSuffix("rfp-cli")}; @@ -1543,9 +1543,9 @@ void McuSupportTest::test_legacy_createThirdPartyPackage_data() << PackageCreator{[this]() { return Legacy::createRenesasProgrammerPackage(settingsMockPtr); }} - << ghs_rh850_d1m1a_baremetal_json << defaultToolPath << defaultToolPath - << renesasProgrammerSetting << renesasProgrammerCmakeVar << renesasProgrammerEnvVar - << renesasProgrammerLabel << renesasProgrammerDetectionPath; + << ghs_rh850_d1m1a_baremetal_json << empty << empty << renesasProgrammerSetting + << renesasProgrammerCmakeVar << renesasProgrammerEnvVar << renesasProgrammerLabel + << renesasProgrammerDetectionPath; } void McuSupportTest::test_legacy_createThirdPartyPackage() @@ -1578,7 +1578,53 @@ void McuSupportTest::test_legacy_createThirdPartyPackage() void McuSupportTest::test_createThirdPartyPackage_data() { - test_legacy_createThirdPartyPackage_data(); + QTest::addColumn("json"); + QTest::addColumn("path"); + QTest::addColumn("defaultPath"); + QTest::addColumn("setting"); + QTest::addColumn("cmakeVar"); + QTest::addColumn("envVar"); + QTest::addColumn("label"); + QTest::addColumn("detectionPath"); + + // Sometimes the jsons have different values than the legacy packages + // Enter the expected values from the jsons here when they diverge from legacy values + QString programFiles = qtcEnvironmentVariable("Env:PROGRAMFILES(x86)"); + const QString renesasProgrammerDefaultPath = { + HostOsInfo::isWindowsHost() + ? QString("%1/Renesas Electronics/Programming Tools/Renesas " + "Flash Programmer V3.09").arg(programFiles) + : QString("")}; + + QTest::newRow("armgcc_mimxrt1050_evk_freertos_json mcuXpresso") + << armgcc_mimxrt1050_evk_freertos_json << xpressoIdePath << xpressoIdePath + << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel + << xpressoIdeDetectionPath; + + QTest::newRow("armgcc_mimxrt1064_evk_freertos_json mcuXpresso") + << armgcc_mimxrt1064_evk_freertos_json << xpressoIdePath << xpressoIdePath + << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel + << xpressoIdeDetectionPath; + + QTest::newRow("armgcc_mimxrt1170_evk_freertos_json mcuXpresso") + << armgcc_mimxrt1170_evk_freertos_json << xpressoIdePath << xpressoIdePath + << xpressoIdeSetting << xpressoIdeCmakeVar << xpressoIdeEnvVar << xpressoIdeLabel + << xpressoIdeDetectionPath; + + QTest::newRow("armgcc_stm32h750b_discovery_baremetal_json stmCubeProgrammer") + << armgcc_stm32h750b_discovery_baremetal_json << stmCubeProgrammerPath + << stmCubeProgrammerPath << stmCubeProgrammerSetting << empty << empty + << stmCubeProgrammerLabel << stmCubeProgrammerDetectionPath; + + QTest::newRow("armgcc_stm32f769i_discovery_freertos_json stmCubeProgrammer") + << armgcc_stm32f769i_discovery_freertos_json << stmCubeProgrammerPath + << stmCubeProgrammerPath << stmCubeProgrammerSetting << empty << empty + << stmCubeProgrammerLabel << stmCubeProgrammerDetectionPath; + + QTest::newRow("ghs_rh850_d1m1a_baremetal_json renesasProgrammer") + << ghs_rh850_d1m1a_baremetal_json << renesasProgrammerDefaultPath << empty + << "FlashProgrammerPath" << renesasProgrammerCmakeVar << "RenesasFlashProgrammer_PATH" + << renesasProgrammerLabel << renesasProgrammerDetectionPath; } void McuSupportTest::test_createThirdPartyPackage() From c2d008a3228d2862de692a16a5274b0472b60451 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 2 Jun 2023 09:59:27 +0200 Subject: [PATCH 004/204] ClangFormat: use fromUserInput to prevent asserts Change-Id: I9f33c8e8ef276d771d727a6678cf72e80e7d46d9 Reviewed-by: Qt CI Bot Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Christian Kandeler --- src/plugins/clangformat/llvmfilesystem.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/clangformat/llvmfilesystem.h b/src/plugins/clangformat/llvmfilesystem.h index 675791f349e..fface01fc08 100644 --- a/src/plugins/clangformat/llvmfilesystem.h +++ b/src/plugins/clangformat/llvmfilesystem.h @@ -50,7 +50,7 @@ public: Q_UNUSED(RequiresNullTerminator); Q_UNUSED(IsVolatile); - const FilePath path = FilePath::fromString(QString::fromStdString(Name.str())); + const FilePath path = FilePath::fromUserInput(QString::fromStdString(Name.str())); const expected_str contents = path.fileContents(FileSize, 0); QTC_ASSERT_EXPECTED(contents, return std::error_code()); @@ -72,7 +72,7 @@ public: ErrorOr status(const Twine &Path) override { - const Utils::FilePath path = FilePath::fromString(QString::fromStdString(Path.str())); + const FilePath path = FilePath::fromUserInput(QString::fromStdString(Path.str())); QFileInfo fInfo(QString::fromStdString(Path.str())); if (!fInfo.exists()) From f939f19b9dfc524fd99ea606955f05115eed158f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Wed, 7 Jun 2023 22:55:12 +0200 Subject: [PATCH 005/204] SquishTests: Update tst_opencreator_qbs for Python3 Change-Id: If0e03204c49e80eb2bfca6e0d14413aad9d790f4 Reviewed-by: Christian Stenger Reviewed-by: --- tests/system/suite_general/tst_opencreator_qbs/test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system/suite_general/tst_opencreator_qbs/test.py b/tests/system/suite_general/tst_opencreator_qbs/test.py index 555e1437582..88c39f57533 100644 --- a/tests/system/suite_general/tst_opencreator_qbs/test.py +++ b/tests/system/suite_general/tst_opencreator_qbs/test.py @@ -25,8 +25,8 @@ def main(): test.warning("Parsing project timed out") compareProjectTree(rootNodeTemplate % "Qt Creator", "projecttree_creator.tsv") buildIssuesTexts = map(lambda i: str(i[3]), getBuildIssues()) - deprecationWarnings = filter(lambda s: "deprecated" in s, buildIssuesTexts) + deprecationWarnings = "\n".join(set(filter(lambda s: "deprecated" in s, buildIssuesTexts))) if deprecationWarnings: test.warning("Creator claims that the .qbs file uses deprecated features.", - "\n".join(set(deprecationWarnings))) + deprecationWarnings) invokeMenuItem("File", "Exit") From 27a61d482f4e8e04c503783229b5ea5eb2143805 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Jun 2023 12:42:21 +0200 Subject: [PATCH 006/204] ClangFormat: Fix that formatting was wrongly disabled After starting Qt Creator with the Beautifier plugin, turning its automatic format on save option on, and restarting Qt Creator _without_ the Beautifier plugin, clang format was no longer formatting on save. The clang format based formatting is supposed to be disabled if - the Beautifier plugin is enabled, and - its automatic format on save option is enabled. Fix the check for the first condition, the plugin can be present but disabled, explicitly check if it is enabled. Change-Id: I5c9c270dd47ceec665aebca5b613f0c4a5357d72 Reviewed-by: Artem Sokolovskii Reviewed-by: Reviewed-by: Christian Kandeler --- src/plugins/clangformat/clangformatindenter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangformat/clangformatindenter.cpp b/src/plugins/clangformat/clangformatindenter.cpp index 94e0fafd8e0..fa3a9d5d636 100644 --- a/src/plugins/clangformat/clangformatindenter.cpp +++ b/src/plugins/clangformat/clangformatindenter.cpp @@ -32,7 +32,7 @@ static bool isBeautifierPluginActivated() return std::find_if(specs.begin(), specs.end(), [](ExtensionSystem::PluginSpec *spec) { - return spec->name() == "Beautifier"; + return spec->name() == "Beautifier" && spec->isEffectivelyEnabled(); }) != specs.end(); } From fb724ec38b886ba9d7591239a2197812fef4eeb2 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 8 Jun 2023 15:46:14 +0200 Subject: [PATCH 007/204] Terminal: New keyboard lock icon Change-Id: Ie3964d599fb15def190c51dd33351fa0224cacfc Reviewed-by: Marcus Tillmanns --- src/plugins/terminal/images/keyboardlock.png | Bin 0 -> 180 bytes .../terminal/images/keyboardlock@2x.png | Bin 0 -> 333 bytes src/plugins/terminal/terminal.qrc | 2 + src/plugins/terminal/terminalicons.h | 7 ++++ src/plugins/terminal/terminalpane.cpp | 4 +- src/tools/icons/qtcreatoricons.svg | 36 ++++++++++++++++++ 6 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/plugins/terminal/images/keyboardlock.png create mode 100644 src/plugins/terminal/images/keyboardlock@2x.png diff --git a/src/plugins/terminal/images/keyboardlock.png b/src/plugins/terminal/images/keyboardlock.png new file mode 100644 index 0000000000000000000000000000000000000000..167f10a56b4b257f6b4be8bf9db0ce4dfb3cb0de GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)RqRC~HOhDb=V9^4q(%)sDq z(4J`mmzvS}(oYpHZyZTkA#zMehH3R@J%)xk+jp+Yiu2!D`;STHdg!yq*(+9k+^9e4 zA$vvtq$6gcolqdkr911BAi2z?xEB+u}sd(Cy`g#SBE i@6-zoJ^k08f#Ls8vn6d?rq0y|Imgr0&t;ucLK6U4cSV!{ literal 0 HcmV?d00001 diff --git a/src/plugins/terminal/images/keyboardlock@2x.png b/src/plugins/terminal/images/keyboardlock@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a095404451142daa01bd73a3218c14ff788bb5d5 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2A5lKEvd$ACoJs;?L#&WB#S|hh+|X z7+aT7@585zIa(K1?dokTW_{|qU>V;t)hiP0Y#Q>VSNYZ4WHxM2h`MzwyKM1RrCAG4 zHtH}%ExXEgN$%%~LWb|@i{bSJhLm>VA20{?#I7#?{~7$9XeU z=H4`zYiiqg!XQevHBslx*8?FDc^#J=#qWz7K0C0KtN7XK#QG=~+ikYF*}o32d@r~B m__4EVq|V+H{`UK0-6h_=NfVSB7N!J(!pYOs&t;ucLK6V{DU1XF literal 0 HcmV?d00001 diff --git a/src/plugins/terminal/terminal.qrc b/src/plugins/terminal/terminal.qrc index 63c28169dfd..60981bc2f91 100644 --- a/src/plugins/terminal/terminal.qrc +++ b/src/plugins/terminal/terminal.qrc @@ -1,5 +1,7 @@ + images/keyboardlock.png + images/keyboardlock@2x.png images/settingscategory_terminal.png images/settingscategory_terminal@2x.png images/terminal.png diff --git a/src/plugins/terminal/terminalicons.h b/src/plugins/terminal/terminalicons.h index ca503f50f96..911bf904863 100644 --- a/src/plugins/terminal/terminalicons.h +++ b/src/plugins/terminal/terminalicons.h @@ -15,4 +15,11 @@ static Utils::Icon CLOSE_TERMINAL_ICON( {{":/terminal/images/terminal.png", Utils::Theme::IconsBaseColor}, {":/utils/images/iconoverlay_close_small.png", Utils::Theme::IconsStopToolBarColor}}); +static Utils::Icon LOCK_KEYBOARD_ICON( + {{":/terminal/images/keyboardlock.png", Utils::Theme::IconsBaseColor}, + {":/codemodel/images/private.png", Utils::Theme::IconsBaseColor}}); + +static Utils::Icon UNLOCK_KEYBOARD_ICON( + {{":/terminal/images/keyboardlock.png", Utils::Theme::IconsBaseColor}}); + } // namespace Terminal diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index f77c9bf5f27..df3a37ee37c 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -247,10 +247,10 @@ void TerminalPane::initActions() auto updateLockKeyboard = [this](bool locked) { TerminalSettings::instance().lockKeyboard.setValue(locked); if (locked) { - lockKeyboard.setIcon(Icons::LOCKED_TOOLBAR.icon()); + lockKeyboard.setIcon(LOCK_KEYBOARD_ICON.icon()); lockKeyboard.setToolTip(Tr::tr("Keyboard shortcuts will be send to the Terminal")); } else { - lockKeyboard.setIcon(Icons::UNLOCKED_TOOLBAR.icon()); + lockKeyboard.setIcon(UNLOCK_KEYBOARD_ICON.icon()); lockKeyboard.setToolTip(Tr::tr("Keyboard shortcuts will be send to Qt Creator")); } }; diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 2c162eaa351..13a4fe5b918 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -3604,6 +3604,42 @@ id="use3673" transform="matrix(-1,0,0,1,2258,0)" /> + + + + + + Date: Thu, 8 Jun 2023 12:41:27 +0200 Subject: [PATCH 008/204] DiffEditor: Move some methods into protected section They are used only in subclasses. Task-number: QTCREATORBUG-23242 Change-Id: I0aa037c7499a9a552e351fbd36885ce9b736656b Reviewed-by: Orgad Shaneh Reviewed-by: --- src/plugins/diffeditor/diffeditorcontroller.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h index 1f791b2dcb3..beebfb987c2 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.h +++ b/src/plugins/diffeditor/diffeditorcontroller.h @@ -30,12 +30,9 @@ public: explicit DiffEditorController(Core::IDocument *document); void requestReload(); - bool isReloading() const; Utils::FilePath workingDirectory() const; void setWorkingDirectory(const Utils::FilePath &directory); - int contextLineCount() const; - bool ignoreWhitespace() const; enum PatchOption { NoOption = 0, @@ -60,6 +57,10 @@ signals: const ChunkSelection &selection); protected: + bool isReloading() const; + int contextLineCount() const; + bool ignoreWhitespace() const; + // Core functions: void setReloadRecipe(const Tasking::Group &recipe) { m_reloadRecipe = recipe; } void setDiffFiles(const QList &diffFileList); From 4c90e09553965233e9dc55a9fd1e813a2468373e Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 8 Jun 2023 13:51:33 +0300 Subject: [PATCH 009/204] Find: Remove "Filtering" placeholder text Added by mistake in f48a6bb826. Change-Id: I843c39a1cec3cd25ef1c6e52784f82d1e5ab68cf Reviewed-by: hjk Reviewed-by: Eike Ziller Reviewed-by: Jarek Kobus --- src/plugins/coreplugin/find/findtoolwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/coreplugin/find/findtoolwindow.cpp b/src/plugins/coreplugin/find/findtoolwindow.cpp index 0125671d34e..d1e3a9fd235 100644 --- a/src/plugins/coreplugin/find/findtoolwindow.cpp +++ b/src/plugins/coreplugin/find/findtoolwindow.cpp @@ -65,6 +65,7 @@ FindToolWindow::FindToolWindow(QWidget *parent) m_searchTerm = new FancyLineEdit(this); m_searchTerm->setFiltering(true); + m_searchTerm->setPlaceholderText({}); m_searchLabel = new QLabel(this); m_searchLabel->setText(Tr::tr("Search f&or:", nullptr)); From 335b70de5dadc2c99423e5a4eba91737e402c8e7 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 8 Jun 2023 16:33:22 +0200 Subject: [PATCH 010/204] Application Templates: Fix QDS compatible project This adds the newly introduced insight file to the file list. Fixes: QTCREATORBUG-29234 Change-Id: I1d10e48a03d1147c4633b77e2a7384a073b5c1de Reviewed-by: David Schulz --- .../wizards/projects/qtquickapplication/wizard.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickapplication/wizard.json index 42b2d1ec0c1..806787d4591 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/wizard.json @@ -161,6 +161,11 @@ "target": "%{ProjectDirectory}/qmlcomponents", "condition": "%{QdsProjectStyle}" }, + { + "source": "%{QdsWizardPath}/common/insight.tpl", + "target": "%{ProjectDirectory}/insight", + "condition": "%{QdsProjectStyle}" + }, { "source": "%{QdsWizardPath}/common/main.qml", "target": "%{ProjectDirectory}/main.qml", From 1647968b92fa212e95f63a6e4b74ae4700a25306 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 8 Jun 2023 15:10:21 +0200 Subject: [PATCH 011/204] Terminal: Don't always open default terminals If a "Run in Terminal" app is started, or the user selects "Open Terminal here" we don't want to open another terminal when the pane becomes visible. So we move the check after we added the terminal. Change-Id: Idd90d6e9dbba513dd020d91ffebb594fd90d688a Reviewed-by: Artem Sokolovskii Reviewed-by: David Schulz --- src/plugins/terminal/terminalpane.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index df3a37ee37c..821ee0d921a 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -114,8 +114,6 @@ static std::optional startupProjectDirectory() void TerminalPane::openTerminal(const OpenTerminalParameters ¶meters) { OpenTerminalParameters parametersCopy{parameters}; - if (!m_isVisible) - emit showPage(IOutputPane::ModeSwitch); if (!parametersCopy.workingDirectory) { const std::optional projectDir = startupProjectDirectory(); @@ -139,6 +137,9 @@ void TerminalPane::openTerminal(const OpenTerminalParameters ¶meters) m_tabWidget.setCurrentIndex(m_tabWidget.addTab(terminalWidget, Tr::tr("Terminal"))); setupTerminalWidget(terminalWidget); + if (!m_isVisible) + emit showPage(IOutputPane::ModeSwitch); + m_tabWidget.currentWidget()->setFocus(); emit navigateStateUpdate(); @@ -146,11 +147,14 @@ void TerminalPane::openTerminal(const OpenTerminalParameters ¶meters) void TerminalPane::addTerminal(TerminalWidget *terminal, const QString &title) { - if (!m_isVisible) - emit showPage(IOutputPane::ModeSwitch); m_tabWidget.setCurrentIndex(m_tabWidget.addTab(terminal, title)); setupTerminalWidget(terminal); + if (!m_isVisible) + emit showPage(IOutputPane::ModeSwitch); + + terminal->setFocus(); + emit navigateStateUpdate(); } From c1b7d23e567521da44a33a069f4506ccb96251fd Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 8 Jun 2023 18:00:58 +0200 Subject: [PATCH 012/204] Terminal: Fix string typo send -> sent Change-Id: I7a4658f316023206f716b856027f93414013d6b8 Reviewed-by: Marcus Tillmanns --- src/plugins/terminal/terminalpane.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index 821ee0d921a..71e979282bc 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -252,10 +252,10 @@ void TerminalPane::initActions() TerminalSettings::instance().lockKeyboard.setValue(locked); if (locked) { lockKeyboard.setIcon(LOCK_KEYBOARD_ICON.icon()); - lockKeyboard.setToolTip(Tr::tr("Keyboard shortcuts will be send to the Terminal")); + lockKeyboard.setToolTip(Tr::tr("Keyboard shortcuts will be sent to the Terminal")); } else { lockKeyboard.setIcon(UNLOCK_KEYBOARD_ICON.icon()); - lockKeyboard.setToolTip(Tr::tr("Keyboard shortcuts will be send to Qt Creator")); + lockKeyboard.setToolTip(Tr::tr("Keyboard shortcuts will be sent to Qt Creator")); } }; From ebb2b9b73ae1fe7a09c419be6d2490fa12d3e46f Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 8 Jun 2023 11:44:18 +0200 Subject: [PATCH 013/204] QmakeProjectManager: Avoid endless loop on self-referencing mkspec links Change-Id: I2b8fda49931c2f133f96c6e1c8001757d926af9e Reviewed-by: Marcus Tillmanns --- src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index 39618c41956..c494f5544a6 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -659,7 +659,7 @@ QString QmakeBuildConfiguration::extractSpecFromArguments(QString *args, parsedSpec = baseMkspecDir.pathAppended(parsedSpec.path()); } - while (parsedSpec.isSymLink()) + for (int i = 0; i < 5 && parsedSpec.isSymLink(); ++i) parsedSpec = parsedSpec.symLinkTarget(); if (parsedSpec.isChildOf(baseMkspecDir)) { From c72c2cbf193f64d54a2ec03b31579ec450e92584 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Jun 2023 15:41:45 +0200 Subject: [PATCH 014/204] UpdateInfo: Start maintenancetool with low priority Reflect that it is supposed to be a background activity. Fixes: QTIFW-3024 Change-Id: I799552016c96e896992dd505cbfd86fa744c9502 Reviewed-by: Jarek Kobus Reviewed-by: Tim Jenssen Reviewed-by: --- src/plugins/updateinfo/updateinfoplugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/updateinfo/updateinfoplugin.cpp b/src/plugins/updateinfo/updateinfoplugin.cpp index 4891d9e8fdf..985817720a1 100644 --- a/src/plugins/updateinfo/updateinfoplugin.cpp +++ b/src/plugins/updateinfo/updateinfoplugin.cpp @@ -122,6 +122,7 @@ void UpdateInfoPlugin::startCheckForUpdates() const auto doSetup = [this](Process &process, const QStringList &args) { process.setCommand({d->m_maintenanceTool, args}); + process.setLowPriority(); }; const auto doCleanup = [this] { d->m_taskTree.release()->deleteLater(); From 7f2ad8079d6558444c78e3c87ff66a3fa02d9af1 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Jun 2023 14:14:23 +0200 Subject: [PATCH 015/204] MIME preferences: Add globs and current handler name to filter It is most useful if a user can type a file extension in the filter to find the corresponding MIME type(s). Also fix resetting the filter model when reopening the preferences. Change-Id: I583e021dcdd2791288f913bc64d2be07e06ebfd3 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/coreplugin/mimetypesettings.cpp | 43 ++++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/plugins/coreplugin/mimetypesettings.cpp b/src/plugins/coreplugin/mimetypesettings.cpp index 116fcf4a06e..e3dac8ded96 100644 --- a/src/plugins/coreplugin/mimetypesettings.cpp +++ b/src/plugins/coreplugin/mimetypesettings.cpp @@ -83,9 +83,7 @@ public: class MimeTypeSettingsModel : public QAbstractTableModel { public: - enum class Role { - DefaultHandler = Qt::UserRole - }; + enum class Role { DefaultHandler = Qt::UserRole, MimeType }; MimeTypeSettingsModel(QObject *parent = nullptr) : QAbstractTableModel(parent) {} @@ -158,6 +156,8 @@ QVariant MimeTypeSettingsModel::data(const QModelIndex &modelIndex, int role) co } } return QVariant(); + } else if (role == int(Role::MimeType)) { + return QVariant::fromValue(m_mimeTypes.at(modelIndex.row())); } return QVariant(); } @@ -222,6 +222,37 @@ void MimeTypeSettingsModel::resetUserDefaults() endResetModel(); } +class MimeFilterModel : public QSortFilterProxyModel +{ +public: + explicit MimeFilterModel(QObject *parent = nullptr); + +protected: + bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; +}; + +MimeFilterModel::MimeFilterModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ +} + +bool MimeFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const +{ + const QModelIndex &index = sourceModel()->index(source_row, 0, source_parent); + const MimeType mt + = sourceModel()->data(index, int(MimeTypeSettingsModel::Role::MimeType)).value(); + const QModelIndex &handlerIndex = sourceModel()->index(source_row, 1, source_parent); + const QString handlerText = sourceModel()->data(handlerIndex, Qt::DisplayRole).toString(); + + const QStringList matchStrings = mt.globPatterns() << mt.name() << handlerText; + const QRegularExpression regex = filterRegularExpression(); + for (const QString &str : matchStrings) { + if (regex.match(str).hasMatch()) + return true; + } + return false; +} + // MimeTypeSettingsPrivate class MimeTypeSettingsPrivate : public QObject { @@ -256,7 +287,7 @@ public: static UserMimeTypeHash m_userModifiedMimeTypes; // these are already in mime database MimeTypeSettingsModel *m_model; - QSortFilterProxyModel *m_filterModel; + MimeFilterModel *m_filterModel; UserMimeTypeHash m_pendingModifiedMimeTypes; // currently edited in the options page QString m_filterPattern; QPointer m_widget; @@ -277,10 +308,11 @@ MimeTypeSettingsPrivate::UserMimeTypeHash MimeTypeSettingsPrivate::m_userModifie MimeTypeSettingsPrivate::MimeTypeSettingsPrivate() : m_model(new MimeTypeSettingsModel(this)) - , m_filterModel(new QSortFilterProxyModel(this)) + , m_filterModel(new MimeFilterModel(this)) { m_filterModel->setSourceModel(m_model); m_filterModel->setFilterKeyColumn(-1); + m_filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); connect(ICore::instance(), &ICore::saveSettingsRequested, this, &MimeTypeSettingsPrivate::writeUserModifiedMimeTypes); } @@ -317,6 +349,7 @@ void MimeTypeSettingsPrivate::configureUi(QWidget *w) auto filterLineEdit = new FancyLineEdit; filterLineEdit->setObjectName("filterLineEdit"); filterLineEdit->setFiltering(true); + m_filterModel->setFilterWildcard({}); m_mimeTypesTreeView = new QTreeView; m_mimeTypesTreeView->setObjectName("mimeTypesTreeView"); From 2caf4efbb2fc49a86c553e249f3f67381c615fc2 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 8 Jun 2023 16:10:03 +0200 Subject: [PATCH 016/204] DiffEditor: Refactor DiffEditorController Replace requestChunkActions() and chunkActionsRequested() with a virtual method addExtraActions(). Implement it in GitBaseDiffEditorController. Task-number: QTCREATORBUG-23242 Change-Id: I5da166b35d1146b9fd439e748803531d982ad2a8 Reviewed-by: Qt CI Bot Reviewed-by: Orgad Shaneh --- .../diffeditor/diffeditorcontroller.cpp | 15 +- src/plugins/diffeditor/diffeditorcontroller.h | 26 ++- .../diffeditor/diffeditorwidgetcontroller.cpp | 2 +- src/plugins/git/gitclient.cpp | 169 ++++++++---------- src/plugins/git/gitclient.h | 6 - 5 files changed, 98 insertions(+), 120 deletions(-) diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp index 1ab7bfccb2d..4756afc7828 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp @@ -124,17 +124,20 @@ void DiffEditorController::reloadFinished(bool success) m_document->endReload(success); } +void DiffEditorController::addExtraActions(QMenu *menu, int fileIndex, int chunkIndex, + const ChunkSelection &selection) +{ + Q_UNUSED(menu) + Q_UNUSED(fileIndex) + Q_UNUSED(chunkIndex) + Q_UNUSED(selection) +} + void DiffEditorController::setStartupFile(const QString &startupFile) { m_document->setStartupFile(startupFile); } -void DiffEditorController::requestChunkActions(QMenu *menu, int fileIndex, int chunkIndex, - const ChunkSelection &selection) -{ - emit chunkActionsRequested(menu, fileIndex, chunkIndex, selection); -} - bool DiffEditorController::chunkExists(int fileIndex, int chunkIndex) const { if (!m_document) diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h index beebfb987c2..1fddc31c4dd 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.h +++ b/src/plugins/diffeditor/diffeditorcontroller.h @@ -19,7 +19,10 @@ namespace Utils { class FilePath; } namespace DiffEditor { -namespace Internal { class DiffEditorDocument; } +namespace Internal { +class DiffEditorDocument; +class DiffEditorWidgetController; +} class ChunkSelection; @@ -40,26 +43,18 @@ public: AddPrefix = 2 }; Q_DECLARE_FLAGS(PatchOptions, PatchOption) - QString makePatch(int fileIndex, int chunkIndex, const ChunkSelection &selection, - PatchOptions options) const; - static Core::IDocument *findOrCreateDocument(const QString &vcsId, - const QString &displayName); + static Core::IDocument *findOrCreateDocument(const QString &vcsId, const QString &displayName); static DiffEditorController *controller(Core::IDocument *document); - void requestChunkActions(QMenu *menu, int fileIndex, int chunkIndex, - const ChunkSelection &selection); - bool chunkExists(int fileIndex, int chunkIndex) const; - Core::IDocument *document() const; - -signals: - void chunkActionsRequested(QMenu *menu, int fileIndex, int chunkIndex, - const ChunkSelection &selection); - protected: bool isReloading() const; int contextLineCount() const; bool ignoreWhitespace() const; + bool chunkExists(int fileIndex, int chunkIndex) const; + Core::IDocument *document() const; + QString makePatch(int fileIndex, int chunkIndex, const ChunkSelection &selection, + PatchOptions options) const; // Core functions: void setReloadRecipe(const Tasking::Group &recipe) { m_reloadRecipe = recipe; } @@ -72,6 +67,9 @@ protected: private: void reloadFinished(bool success); + friend class Internal::DiffEditorWidgetController; + virtual void addExtraActions(QMenu *menu, int fileIndex, int chunkIndex, + const ChunkSelection &selection); Internal::DiffEditorDocument *const m_document; QString m_displayName; diff --git a/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp b/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp index e3f321c7c44..26d94b73677 100644 --- a/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp @@ -280,7 +280,7 @@ void DiffEditorWidgetController::addExtraActions(QMenu *menu, int fileIndex, int const ChunkSelection &selection) { if (DiffEditorController *controller = m_document->controller()) - controller->requestChunkActions(menu, fileIndex, chunkIndex, selection); + controller->addExtraActions(menu, fileIndex, chunkIndex, selection); } void DiffEditorWidgetController::updateCannotDecodeInfo() diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 845531ed825..69cf636e72c 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -112,6 +112,38 @@ static QString branchesDisplay(const QString &prefix, QStringList *branches, boo /////////////////////////////// +static void stage(DiffEditorController *diffController, const QString &patch, bool revert) +{ + TemporaryFile patchFile("git-patchfile"); + if (!patchFile.open()) + return; + + const FilePath baseDir = diffController->workingDirectory(); + QTextCodec *codec = EditorManager::defaultTextCodec(); + const QByteArray patchData = codec ? codec->fromUnicode(patch) : patch.toLocal8Bit(); + patchFile.write(patchData); + patchFile.close(); + + QStringList args = {"--cached"}; + if (revert) + args << "--reverse"; + QString errorMessage; + if (GitClient::instance()->synchronousApplyPatch(baseDir, patchFile.fileName(), + &errorMessage, args)) { + if (errorMessage.isEmpty()) { + if (revert) + VcsOutputWindow::appendSilently(Tr::tr("Chunk successfully unstaged")); + else + VcsOutputWindow::appendSilently(Tr::tr("Chunk successfully staged")); + } else { + VcsOutputWindow::appendError(errorMessage); + } + diffController->requestReload(); + } else { + VcsOutputWindow::appendError(errorMessage); + } +} + class GitBaseDiffEditorController : public VcsBaseDiffEditorController { Q_OBJECT @@ -120,6 +152,50 @@ protected: explicit GitBaseDiffEditorController(IDocument *document); QStringList addConfigurationArguments(const QStringList &args) const; + +private: + void addExtraActions(QMenu *menu, int fileIndex, int chunkIndex, + const ChunkSelection &selection) final + { + menu->addSeparator(); + + auto stageChunk = [this, fileIndex, chunkIndex](DiffEditorController::PatchOptions options, + const DiffEditor::ChunkSelection &selection) { + options |= DiffEditorController::AddPrefix; + const QString patch = makePatch(fileIndex, chunkIndex, selection, options); + stage(this, patch, options & Revert); + }; + + QAction *stageChunkAction = menu->addAction(Tr::tr("Stage Chunk")); + connect(stageChunkAction, &QAction::triggered, this, [stageChunk] { + stageChunk(DiffEditorController::NoOption, {}); + }); + QAction *stageLinesAction = menu->addAction(Tr::tr("Stage Selection (%n Lines)", "", + selection.selectedRowsCount())); + connect(stageLinesAction, &QAction::triggered, this, [stageChunk, selection] { + stageChunk(DiffEditorController::NoOption, selection); + }); + QAction *unstageChunkAction = menu->addAction(Tr::tr("Unstage Chunk")); + connect(unstageChunkAction, &QAction::triggered, this, [stageChunk] { + stageChunk(DiffEditorController::Revert, {}); + }); + QAction *unstageLinesAction = menu->addAction(Tr::tr("Unstage Selection (%n Lines)", "", + selection.selectedRowsCount())); + connect(unstageLinesAction, &QAction::triggered, this, [stageChunk, selection] { + stageChunk(DiffEditorController::Revert, selection); + }); + + if (selection.isNull()) { + stageLinesAction->setVisible(false); + unstageLinesAction->setVisible(false); + } + if (!chunkExists(fileIndex, chunkIndex)) { + stageChunkAction->setEnabled(false); + stageLinesAction->setEnabled(false); + unstageChunkAction->setEnabled(false); + unstageLinesAction->setEnabled(false); + } + } }; class GitDiffEditorController : public GitBaseDiffEditorController @@ -850,95 +926,6 @@ QTextCodec *GitClient::encoding(GitClient::EncodingType encodingType, const File } } -void GitClient::chunkActionsRequested(DiffEditor::DiffEditorController *controller, - QMenu *menu, int fileIndex, int chunkIndex, - const DiffEditor::ChunkSelection &selection) const -{ - QPointer diffController(controller); - - auto stageChunk = [this](QPointer diffController, - int fileIndex, int chunkIndex, DiffEditorController::PatchOptions options, - const DiffEditor::ChunkSelection &selection) { - if (diffController.isNull()) - return; - - options |= DiffEditorController::AddPrefix; - const QString patch = diffController->makePatch(fileIndex, chunkIndex, selection, options); - stage(diffController, patch, options & Revert); - }; - - menu->addSeparator(); - QAction *stageChunkAction = menu->addAction(Tr::tr("Stage Chunk")); - connect(stageChunkAction, &QAction::triggered, this, - [stageChunk, diffController, fileIndex, chunkIndex] { - stageChunk(diffController, fileIndex, chunkIndex, - DiffEditorController::NoOption, DiffEditor::ChunkSelection()); - }); - QAction *stageLinesAction = menu->addAction(Tr::tr("Stage Selection (%n Lines)", "", selection.selectedRowsCount())); - connect(stageLinesAction, &QAction::triggered, this, - [stageChunk, diffController, fileIndex, chunkIndex, selection] { - stageChunk(diffController, fileIndex, chunkIndex, - DiffEditorController::NoOption, selection); - }); - QAction *unstageChunkAction = menu->addAction(Tr::tr("Unstage Chunk")); - connect(unstageChunkAction, &QAction::triggered, this, - [stageChunk, diffController, fileIndex, chunkIndex] { - stageChunk(diffController, fileIndex, chunkIndex, - DiffEditorController::Revert, DiffEditor::ChunkSelection()); - }); - QAction *unstageLinesAction = menu->addAction(Tr::tr("Unstage Selection (%n Lines)", "", selection.selectedRowsCount())); - connect(unstageLinesAction, &QAction::triggered, this, - [stageChunk, diffController, fileIndex, chunkIndex, selection] { - stageChunk(diffController, fileIndex, chunkIndex, - DiffEditorController::Revert, - selection); - }); - if (selection.isNull()) { - stageLinesAction->setVisible(false); - unstageLinesAction->setVisible(false); - } - if (!diffController || !diffController->chunkExists(fileIndex, chunkIndex)) { - stageChunkAction->setEnabled(false); - stageLinesAction->setEnabled(false); - unstageChunkAction->setEnabled(false); - unstageLinesAction->setEnabled(false); - } -} - -void GitClient::stage(DiffEditor::DiffEditorController *diffController, - const QString &patch, bool revert) const -{ - TemporaryFile patchFile("git-patchfile"); - if (!patchFile.open()) - return; - - const FilePath baseDir = diffController->workingDirectory(); - QTextCodec *codec = EditorManager::defaultTextCodec(); - const QByteArray patchData = codec - ? codec->fromUnicode(patch) : patch.toLocal8Bit(); - patchFile.write(patchData); - patchFile.close(); - - QStringList args = {"--cached"}; - if (revert) - args << "--reverse"; - QString errorMessage; - if (synchronousApplyPatch(baseDir, patchFile.fileName(), - &errorMessage, args)) { - if (errorMessage.isEmpty()) { - if (revert) - VcsOutputWindow::appendSilently(Tr::tr("Chunk successfully unstaged")); - else - VcsOutputWindow::appendSilently(Tr::tr("Chunk successfully staged")); - } else { - VcsOutputWindow::appendError(errorMessage); - } - diffController->requestReload(); - } else { - VcsOutputWindow::appendError(errorMessage); - } -} - void GitClient::requestReload(const QString &documentId, const FilePath &source, const QString &title, const FilePath &workingDirectory, std::function factory) const @@ -956,10 +943,6 @@ void GitClient::requestReload(const QString &documentId, const FilePath &source, using namespace std::placeholders; - connect(controller, &DiffEditorController::chunkActionsRequested, this, - std::bind(&GitClient::chunkActionsRequested, this, controller, _1, _2, _3, _4), - Qt::DirectConnection); - VcsBase::setSource(document, sourceCopy); EditorManager::activateEditorForDocument(document); controller->requestReload(); diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 398b1c1cc86..6e2878be024 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -363,12 +363,6 @@ private: static GitSettings &settings(); void finishSubmoduleUpdate(); - void chunkActionsRequested(DiffEditor::DiffEditorController *controller, - QMenu *menu, int fileIndex, int chunkIndex, - const DiffEditor::ChunkSelection &selection) const; - - void stage(DiffEditor::DiffEditorController *diffController, - const QString &patch, bool revert) const; void requestReload(const QString &documentId, const Utils::FilePath &source, const QString &title, const Utils::FilePath &workingDirectory, From d93d1743fd9197febc69d3b2801113830e8e47a8 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 8 Jun 2023 16:23:06 +0200 Subject: [PATCH 017/204] DiffEditor: Use nested using namespace declarations Change-Id: Iaf695a7c95f4267b5480036dedfa0485b841ca6e Reviewed-by: Qt CI Bot Reviewed-by: Orgad Shaneh --- src/plugins/diffeditor/diffeditor.cpp | 6 ++---- src/plugins/diffeditor/diffeditor.h | 6 ++---- src/plugins/diffeditor/diffeditordocument.cpp | 6 ++---- src/plugins/diffeditor/diffeditorfactory.cpp | 6 ++---- src/plugins/diffeditor/diffeditorfactory.h | 6 ++---- src/plugins/diffeditor/diffeditorplugin.cpp | 6 ++---- src/plugins/diffeditor/diffeditorplugin.h | 6 ++---- src/plugins/diffeditor/diffeditorwidgetcontroller.cpp | 7 ++----- src/plugins/diffeditor/diffview.cpp | 6 ++---- src/plugins/diffeditor/selectabletexteditorwidget.cpp | 6 ++---- src/plugins/diffeditor/selectabletexteditorwidget.h | 6 ++---- src/plugins/diffeditor/sidebysidediffeditorwidget.cpp | 6 ++---- src/plugins/diffeditor/unifieddiffeditorwidget.cpp | 6 ++---- src/plugins/git/gitclient.h | 1 - 14 files changed, 26 insertions(+), 54 deletions(-) diff --git a/src/plugins/diffeditor/diffeditor.cpp b/src/plugins/diffeditor/diffeditor.cpp index 929c30c3398..ddf91b4e1ec 100644 --- a/src/plugins/diffeditor/diffeditor.cpp +++ b/src/plugins/diffeditor/diffeditor.cpp @@ -51,8 +51,7 @@ using namespace Core; using namespace TextEditor; using namespace Utils; -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { class DescriptionEditorWidget : public TextEditorWidget { @@ -618,7 +617,6 @@ void DiffEditor::showDiffView(IDiffView *view) setupView(view); } -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal #include "diffeditor.moc" diff --git a/src/plugins/diffeditor/diffeditor.h b/src/plugins/diffeditor/diffeditor.h index 49922d323eb..24f89d55030 100644 --- a/src/plugins/diffeditor/diffeditor.h +++ b/src/plugins/diffeditor/diffeditor.h @@ -18,9 +18,8 @@ QT_END_NAMESPACE namespace TextEditor { class TextEditorWidget; } -namespace DiffEditor { +namespace DiffEditor::Internal { -namespace Internal { class DescriptionEditorWidget; class DiffEditorDocument; class IDiffView; @@ -95,5 +94,4 @@ private: bool m_showDescription = true; }; -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/diffeditordocument.cpp b/src/plugins/diffeditor/diffeditordocument.cpp index 1d43064d60f..ed89d69c4f0 100644 --- a/src/plugins/diffeditor/diffeditordocument.cpp +++ b/src/plugins/diffeditor/diffeditordocument.cpp @@ -24,8 +24,7 @@ using namespace Core; using namespace Utils; -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { DiffEditorDocument::DiffEditorDocument() : Core::BaseTextDocument() @@ -388,5 +387,4 @@ void DiffEditorDocument::endReload(bool success) emit reloadFinished(success); } -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/diffeditorfactory.cpp b/src/plugins/diffeditor/diffeditorfactory.cpp index a771fda53a1..70537dd3f73 100644 --- a/src/plugins/diffeditor/diffeditorfactory.cpp +++ b/src/plugins/diffeditor/diffeditorfactory.cpp @@ -15,8 +15,7 @@ using namespace Core; using namespace TextEditor; using namespace Utils; -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { DiffEditorFactory::DiffEditorFactory() : descriptionHandler { @@ -50,5 +49,4 @@ DiffEditorFactory::DiffEditorFactory() : setEditorCreator([] { return new DiffEditor(new DiffEditorDocument); }); } -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/diffeditorfactory.h b/src/plugins/diffeditor/diffeditorfactory.h index bebabb208aa..e39f0fc46fc 100644 --- a/src/plugins/diffeditor/diffeditorfactory.h +++ b/src/plugins/diffeditor/diffeditorfactory.h @@ -7,8 +7,7 @@ #include -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { class DiffEditorFactory : public Core::IEditorFactory { @@ -22,5 +21,4 @@ private: TextEditor::TextEditorActionHandler rightHandler; }; -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 10ae3b76a26..3112170bc41 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -29,8 +29,7 @@ using namespace Core; using namespace TextEditor; using namespace Utils; -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { class ReloadInput { public: @@ -535,8 +534,7 @@ void DiffEditorPlugin::initialize() d = new DiffEditorPluginPrivate; } -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal #ifdef WITH_TESTS diff --git a/src/plugins/diffeditor/diffeditorplugin.h b/src/plugins/diffeditor/diffeditorplugin.h index 17b6a2d430d..9888628daac 100644 --- a/src/plugins/diffeditor/diffeditorplugin.h +++ b/src/plugins/diffeditor/diffeditorplugin.h @@ -6,8 +6,7 @@ #include #include -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { class DiffEditorServiceImpl : public QObject, public Core::DiffService { @@ -46,5 +45,4 @@ private slots: #endif // WITH_TESTS }; -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp b/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp index 26d94b73677..0f3a57ee086 100644 --- a/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorwidgetcontroller.cpp @@ -29,8 +29,7 @@ using namespace Core; using namespace TextEditor; using namespace Utils; -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { DiffEditorWidgetController::DiffEditorWidgetController(QWidget *diffEditorWidget) : QObject(diffEditorWidget) @@ -330,6 +329,4 @@ DiffEditorInput::DiffEditorInput(DiffEditorWidgetController *controller) , m_charFormat{&controller->m_charFormat[LeftSide], &controller->m_charFormat[RightSide]} { } - -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/diffview.cpp b/src/plugins/diffeditor/diffview.cpp index 686f9798b23..1b513aefc33 100644 --- a/src/plugins/diffeditor/diffview.cpp +++ b/src/plugins/diffeditor/diffview.cpp @@ -14,8 +14,7 @@ #include -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { IDiffView::IDiffView(QObject *parent) : QObject(parent) { } @@ -230,5 +229,4 @@ void SideBySideView::setSync(bool sync) m_widget->setHorizontalSync(sync); } -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/selectabletexteditorwidget.cpp b/src/plugins/diffeditor/selectabletexteditorwidget.cpp index bbf0480a6bb..e0c95f6abd3 100644 --- a/src/plugins/diffeditor/selectabletexteditorwidget.cpp +++ b/src/plugins/diffeditor/selectabletexteditorwidget.cpp @@ -13,8 +13,7 @@ using namespace TextEditor; -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { SelectableTextEditorWidget::SelectableTextEditorWidget(Utils::Id id, QWidget *parent) : TextEditorWidget(parent) @@ -142,5 +141,4 @@ void SelectableTextEditorWidget::paintBlock(QPainter *painter, TextEditorWidget::paintBlock(painter, block, offset, newSelections, clipRect); } -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/selectabletexteditorwidget.h b/src/plugins/diffeditor/selectabletexteditorwidget.h index ca128aa28e5..4b0d465204f 100644 --- a/src/plugins/diffeditor/selectabletexteditorwidget.h +++ b/src/plugins/diffeditor/selectabletexteditorwidget.h @@ -7,8 +7,7 @@ namespace TextEditor { class DisplaySettings; } -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { class DiffSelection { @@ -46,5 +45,4 @@ private: DiffSelections m_diffSelections; }; -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index ef8e2504972..341edce7334 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -35,8 +35,7 @@ using namespace Utils; using namespace std::placeholders; -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { static DiffSide oppositeSide(DiffSide side) { @@ -1104,7 +1103,6 @@ void SideBySideDiffEditorWidget::syncCursor(SideDiffEditorWidget *source, SideDi dest->horizontalScrollBar()->setValue(oldHSliderPos); } -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal #include "sidebysidediffeditorwidget.moc" diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index 0c06c85bae0..d5633d50ec0 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -28,8 +28,7 @@ using namespace Core; using namespace TextEditor; using namespace Utils; -namespace DiffEditor { -namespace Internal { +namespace DiffEditor::Internal { UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent) : SelectableTextEditorWidget("DiffEditor.UnifiedDiffEditor", parent) @@ -589,5 +588,4 @@ void UnifiedDiffEditorWidget::setCurrentDiffFileIndex(int diffFileIndex) verticalScrollBar()->setValue(blockNumber); } -} // namespace Internal -} // namespace DiffEditor +} // namespace DiffEditor::Internal diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 6e2878be024..3604eb9f3cf 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -21,7 +21,6 @@ #include QT_BEGIN_NAMESPACE -class QProcessEnvironment; class QMenu; QT_END_NAMESPACE From e98c523b3f47b4c220439ac293ccacdbb2311518 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 9 Jun 2023 09:32:42 +0200 Subject: [PATCH 018/204] QmlDesigner: Fix a few more Qt deprecation related warnings Change-Id: I245693e0aa58454f631b9150cd86f3034c5cfbe6 Reviewed-by: Eike Ziller --- src/plugins/android/androidrunnerworker.cpp | 4 ++-- .../components/materialeditor/materialeditorview.cpp | 8 ++++---- .../components/propertyeditor/propertyeditorview.cpp | 8 ++++---- .../components/textureeditor/textureeditorview.cpp | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index b9a09629fb2..529f7ab0ca7 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -264,13 +264,13 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa m_extraAppParams = runControl->commandLine().arguments(); if (auto aspect = runControl->aspect(Constants::ANDROID_AM_START_ARGS)) { - QTC_CHECK(aspect->value.type() == QVariant::String); + QTC_CHECK(aspect->value.typeId() == QVariant::String); const QString startArgs = aspect->value.toString(); m_amStartExtraArgs = ProcessArgs::splitArgs(startArgs, OsTypeOtherUnix); } if (auto aspect = runControl->aspect(Constants::ANDROID_PRESTARTSHELLCMDLIST)) { - QTC_CHECK(aspect->value.type() == QVariant::String); + QTC_CHECK(aspect->value.typeId() == QVariant::String); const QStringList commands = aspect->value.toString().split('\n', Qt::SkipEmptyParts); for (const QString &shellCmd : commands) m_beforeStartAdbCommands.append(QString("shell %1").arg(shellCmd)); diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index 96e01072904..01d55d13db5 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -149,7 +149,7 @@ void MaterialEditorView::changeValue(const QString &name) if (name == "state" && castedValue.toString() == "base state") castedValue = ""; - if (castedValue.type() == QVariant::Color) { + if (castedValue.typeId() == QVariant::Color) { QColor color = castedValue.value(); QColor newColor = QColor(color.name()); newColor.setAlpha(color.alpha()); @@ -161,9 +161,9 @@ void MaterialEditorView::changeValue(const QString &name) } else { // QVector*D(0, 0, 0) detects as null variant though it is valid value if (castedValue.isValid() - && (!castedValue.isNull() || castedValue.type() == QVariant::Vector2D - || castedValue.type() == QVariant::Vector3D - || castedValue.type() == QVariant::Vector4D)) { + && (!castedValue.isNull() || castedValue.typeId() == QVariant::Vector2D + || castedValue.typeId() == QVariant::Vector3D + || castedValue.typeId() == QVariant::Vector4D)) { commitVariantValueToModel(propertyName, castedValue); } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index b8f998e8fae..8b1907f3d99 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -202,7 +202,7 @@ void PropertyEditorView::changeValue(const QString &name) if (name == "state" && castedValue.toString() == "base state") castedValue = ""; - if (castedValue.type() == QVariant::Color) { + if (castedValue.typeId() == QVariant::Color) { QColor color = castedValue.value(); QColor newColor = QColor(color.name()); newColor.setAlpha(color.alpha()); @@ -215,9 +215,9 @@ void PropertyEditorView::changeValue(const QString &name) } else { // QVector*D(0, 0, 0) detects as null variant though it is valid value if (castedValue.isValid() - && (!castedValue.isNull() || castedValue.type() == QVariant::Vector2D - || castedValue.type() == QVariant::Vector3D - || castedValue.type() == QVariant::Vector4D)) { + && (!castedValue.isNull() || castedValue.typeId() == QVariant::Vector2D + || castedValue.typeId() == QVariant::Vector3D + || castedValue.typeId() == QVariant::Vector4D)) { commitVariantValueToModel(propertyName, castedValue); } } diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp index a4132d0eb7a..5dd429f7600 100644 --- a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp +++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp @@ -153,9 +153,9 @@ void TextureEditorView::changeValue(const QString &name) } else { // QVector*D(0, 0, 0) detects as null variant though it is valid value if (castedValue.isValid() - && (!castedValue.isNull() || castedValue.type() == QVariant::Vector2D - || castedValue.type() == QVariant::Vector3D - || castedValue.type() == QVariant::Vector4D)) { + && (!castedValue.isNull() || castedValue.typeId() == QVariant::Vector2D + || castedValue.typeId() == QVariant::Vector3D + || castedValue.typeId() == QVariant::Vector4D)) { commitVariantValueToModel(propertyName, castedValue); } } From daad58175b0a6d23cb1b002d749b5db9392235f8 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 8 Jun 2023 14:22:46 +0200 Subject: [PATCH 019/204] Doc: Describe what to do if Ctrl+Shift+U stops finding references MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTCREATORBUG-29134 Change-Id: I7c6816b692ae9decdad42c1a8ec73418735d0019 Reviewed-by: André Hartmann Reviewed-by: David Schulz --- .../src/howto/creator-keyboard-shortcuts.qdoc | 4 +++- .../overview/creator-only/creator-issues.qdoc | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc b/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc index 62d34751441..0bef6d3498b 100644 --- a/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc +++ b/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -433,6 +433,8 @@ \row \li Find references to symbol under cursor \li Ctrl+Shift+U + \note If this keyboard shortcut does not work on Linux, see + \l {Editing Issues}. \row \li Follow symbol under cursor diff --git a/doc/qtcreator/src/overview/creator-only/creator-issues.qdoc b/doc/qtcreator/src/overview/creator-only/creator-issues.qdoc index 9a09a24b093..80b7466214f 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-issues.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-issues.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2019 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -68,6 +68,23 @@ \li Code completion does not support typedefs for nested classes. + \li When developing on Linux, the \key {Ctrl+Shift+U} keyboard shortcut + might not work because it conflicts with a shortcut of the + Intelligent Input Bus (ibus). You can change the shortcut for finding + references to the symbol under the cursor either in \QC or in ibus. + + To set another \l {Keyboard Shortcuts}{keyboard shortcut} + in \QC, select \uicontrol Edit > \uicontrol Preferences > + \uicontrol Environment > \uicontrol Keyboard. + + To change the shortcut in ibus, enter the following command on the + command line to start ibus setup: + \badcode + ibus-setup + \endcode + + Then, change the unicode code point shortcut in the \uicontrol Emoji + tab to something else than \key {u}. \endlist \section1 Projects Issues From 45abf54a611ae6c5dbd997d0ad5ab0a943b90f5a Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 9 Jun 2023 09:30:41 +0200 Subject: [PATCH 020/204] Handle Qt deprecation warning for shortcut setup Change-Id: If13b353111611bd2419ec17d7795836da2ec00fe Reviewed-by: Aleksei German --- src/plugins/insight/insightwidget.cpp | 2 +- .../assetslibrary/assetslibrarywidget.cpp | 2 +- .../contentlibrary/contentlibrarywidget.cpp | 2 +- .../materialeditor/materialeditorview.cpp | 2 +- .../propertyeditor/propertyeditorview.cpp | 4 ++-- .../components/richtexteditor/richtexteditor.cpp | 16 ++++++++-------- .../stateseditor/stateseditorwidget.cpp | 2 +- .../stateseditornew/stateseditorwidget.cpp | 2 +- .../textureeditor/textureeditorview.cpp | 2 +- src/plugins/vcsbase/submiteditorwidget.cpp | 2 +- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/plugins/insight/insightwidget.cpp b/src/plugins/insight/insightwidget.cpp index aaf152bea31..03a46b03443 100644 --- a/src/plugins/insight/insightwidget.cpp +++ b/src/plugins/insight/insightwidget.cpp @@ -51,7 +51,7 @@ InsightWidget::InsightWidget(InsightView *insightView, InsightModel *insightMode engine()->addImportPath(propertyEditorResourcesPath() + "/imports"); engine()->addImportPath(qmlSourcesPath() + "/imports"); - m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F11), this); + m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F11), this); connect(m_qmlSourceUpdateShortcut, &QShortcut::activated, this, diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 3b106d30b57..9a8a611c664 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -133,7 +133,7 @@ AssetsLibraryWidget::AssetsLibraryWidget(AsynchronousImageCache &asynchronousFon setStyleSheet(Theme::replaceCssColors( QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css")))); - m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F6), this); + m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F6), this); connect(m_qmlSourceUpdateShortcut, &QShortcut::activated, this, &AssetsLibraryWidget::reloadQmlSource); connect(this, &AssetsLibraryWidget::extFilesDrop, diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp index 0c7bf24030a..4c15cce8d7a 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp @@ -140,7 +140,7 @@ ContentLibraryWidget::ContentLibraryWidget() setStyleSheet(Theme::replaceCssColors( QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css")))); - m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F11), this); + m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F11), this); connect(m_qmlSourceUpdateShortcut, &QShortcut::activated, this, &ContentLibraryWidget::reloadQmlSource); QmlDesignerPlugin::trackWidgetFocusTime(this, Constants::EVENT_CONTENTLIBRARY_TIME); diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index 01d55d13db5..55c587f3cb4 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -59,7 +59,7 @@ MaterialEditorView::MaterialEditorView(ExternalDependenciesInterface &externalDe , m_stackedWidget(new QStackedWidget) , m_dynamicPropertiesModel(new DynamicPropertiesModel(true, this)) { - m_updateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F7), m_stackedWidget); + m_updateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F7), m_stackedWidget); connect(m_updateShortcut, &QShortcut::activated, this, &MaterialEditorView::reloadQml); m_ensureMatLibTimer.callOnTimeout([this] { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index 8b1907f3d99..2cf47789e43 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -72,9 +72,9 @@ PropertyEditorView::PropertyEditorView(AsynchronousImageCache &imageCache, m_qmlDir = PropertyEditorQmlBackend::propertyEditorResourcesPath(); if (Utils::HostOsInfo::isMacHost()) - m_updateShortcut = new QShortcut(QKeySequence(Qt::ALT + Qt::Key_F3), m_stackedWidget); + m_updateShortcut = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_F3), m_stackedWidget); else - m_updateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F3), m_stackedWidget); + m_updateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F3), m_stackedWidget); connect(m_updateShortcut, &QShortcut::activated, this, &PropertyEditorView::reloadQml); m_stackedWidget->setStyleSheet(Theme::replaceCssColors( diff --git a/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp b/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp index 258c8a0a68f..9f22d5118a6 100644 --- a/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp +++ b/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp @@ -331,7 +331,7 @@ void RichTextEditor::setupTextActions() fmt.setFontWeight(checked ? QFont::Bold : QFont::Normal); mergeFormatOnWordOrSelection(fmt); }); - m_actionTextBold->setShortcut(Qt::CTRL + Qt::Key_B); + m_actionTextBold->setShortcut(Qt::CTRL | Qt::Key_B); QFont bold; bold.setBold(true); m_actionTextBold->setFont(bold); @@ -344,7 +344,7 @@ void RichTextEditor::setupTextActions() fmt.setFontItalic(checked); mergeFormatOnWordOrSelection(fmt); }); - m_actionTextItalic->setShortcut(Qt::CTRL + Qt::Key_I); + m_actionTextItalic->setShortcut(Qt::CTRL | Qt::Key_I); QFont italic; italic.setItalic(true); m_actionTextItalic->setFont(italic); @@ -357,7 +357,7 @@ void RichTextEditor::setupTextActions() fmt.setFontUnderline(checked); mergeFormatOnWordOrSelection(fmt); }); - m_actionTextUnderline->setShortcut(Qt::CTRL + Qt::Key_U); + m_actionTextUnderline->setShortcut(Qt::CTRL | Qt::Key_U); QFont underline; underline.setUnderline(true); m_actionTextUnderline->setFont(underline); @@ -417,25 +417,25 @@ void RichTextEditor::setupAlignActions() { const QIcon leftIcon(getIcon(Theme::Icon::textAlignLeft)); m_actionAlignLeft = ui->toolBar->addAction(leftIcon, tr("&Left"), [this]() { ui->textEdit->setAlignment(Qt::AlignLeft | Qt::AlignAbsolute); }); - m_actionAlignLeft->setShortcut(Qt::CTRL + Qt::Key_L); + m_actionAlignLeft->setShortcut(Qt::CTRL | Qt::Key_L); m_actionAlignLeft->setCheckable(true); m_actionAlignLeft->setPriority(QAction::LowPriority); const QIcon centerIcon(getIcon(Theme::Icon::textAlignCenter)); m_actionAlignCenter = ui->toolBar->addAction(centerIcon, tr("C&enter"), [this]() { ui->textEdit->setAlignment(Qt::AlignHCenter); }); - m_actionAlignCenter->setShortcut(Qt::CTRL + Qt::Key_E); + m_actionAlignCenter->setShortcut(Qt::CTRL | Qt::Key_E); m_actionAlignCenter->setCheckable(true); m_actionAlignCenter->setPriority(QAction::LowPriority); const QIcon rightIcon(getIcon(Theme::Icon::textAlignRight)); m_actionAlignRight = ui->toolBar->addAction(rightIcon, tr("&Right"), [this]() { ui->textEdit->setAlignment(Qt::AlignRight | Qt::AlignAbsolute); }); - m_actionAlignRight->setShortcut(Qt::CTRL + Qt::Key_R); + m_actionAlignRight->setShortcut(Qt::CTRL | Qt::Key_R); m_actionAlignRight->setCheckable(true); m_actionAlignRight->setPriority(QAction::LowPriority); const QIcon fillIcon(getIcon(Theme::Icon::textFullJustification)); m_actionAlignJustify = ui->toolBar->addAction(fillIcon, tr("&Justify"), [this]() { ui->textEdit->setAlignment(Qt::AlignJustify); }); - m_actionAlignJustify->setShortcut(Qt::CTRL + Qt::Key_J); + m_actionAlignJustify->setShortcut(Qt::CTRL | Qt::Key_J); m_actionAlignJustify->setCheckable(true); m_actionAlignJustify->setPriority(QAction::LowPriority); @@ -549,7 +549,7 @@ void RichTextEditor::setupTableActions() m_actionTableSettings = ui->toolBar->addAction(tableIcon, tr("&Table Settings"), [this](bool checked) { ui->tableBar->setVisible(checked); }); - m_actionTableSettings->setShortcut(Qt::CTRL + Qt::Key_T); + m_actionTableSettings->setShortcut(Qt::CTRL | Qt::Key_T); m_actionTableSettings->setCheckable(true); m_actionTableSettings->setPriority(QAction::LowPriority); diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp index 0501747d983..5c127727521 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp @@ -81,7 +81,7 @@ StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, engine()->addImportPath(qmlSourcesPath()); engine()->addImportPath(propertyEditorResourcesPath() + "/imports"); - m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F4), this); + m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F4), this); connect(m_qmlSourceUpdateShortcut, &QShortcut::activated, this, &StatesEditorWidget::reloadQmlSource); setResizeMode(QQuickWidget::SizeRootObjectToView); diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.cpp b/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.cpp index f3fd945ae6b..e07ba02ae01 100644 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.cpp +++ b/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.cpp @@ -106,7 +106,7 @@ StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, engine()->addImportPath(propertyEditorResourcesPath() + "/imports"); engine()->addImportPath(qmlSourcesPath() + "/imports"); - m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F10), this); + m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F10), this); connect(m_qmlSourceUpdateShortcut, &QShortcut::activated, this, &StatesEditorWidget::reloadQmlSource); setObjectName(Constants::OBJECT_NAME_STATES_EDITOR); diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp index 5dd429f7600..221de40509f 100644 --- a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp +++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp @@ -57,7 +57,7 @@ TextureEditorView::TextureEditorView(AsynchronousImageCache &imageCache, , m_stackedWidget(new QStackedWidget) , m_dynamicPropertiesModel(new DynamicPropertiesModel(true, this)) { - m_updateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F12), m_stackedWidget); + m_updateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F12), m_stackedWidget); connect(m_updateShortcut, &QShortcut::activated, this, &TextureEditorView::reloadQml); m_ensureMatLibTimer.callOnTimeout([this] { diff --git a/src/plugins/vcsbase/submiteditorwidget.cpp b/src/plugins/vcsbase/submiteditorwidget.cpp index 00b4200580a..38548d63f51 100644 --- a/src/plugins/vcsbase/submiteditorwidget.cpp +++ b/src/plugins/vcsbase/submiteditorwidget.cpp @@ -263,7 +263,7 @@ void SubmitEditorWidget::registerActions(QAction *editorUndoAction, QAction *edi d->m_submitButton = new QActionPushButton(submitAction); d->buttonLayout->addWidget(d->m_submitButton); if (!d->m_submitShortcut) - d->m_submitShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Return), this); + d->m_submitShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Return), this); connect(d->m_submitShortcut, &QShortcut::activated, submitAction, [submitAction] { if (submitAction->isEnabled()) From f3b25b1d62783c192474f7aa69dacdc9d4d1e9ff Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 6 Jun 2023 16:47:28 +0200 Subject: [PATCH 021/204] Doc: Describe adding devices without using a wizard You can select to add a remote Linux, QNX, or Boot2Qt device in the pull-down menu of the Add button and device preferences in the Devices tab. Task-number: QTCREATORBUG-28996 Change-Id: I65836a859e0d14b88768d4f83321ffa8093ed966 Reviewed-by: hjk --- ...tcreator-boot2qt-device-configurations.png | Bin 21668 -> 0 bytes ...creator-boot2qt-device-configurations.webp | Bin 0 -> 14580 bytes ...ator-preferences-devices-remote-linux.webp | Bin 10564 -> 12926 bytes doc/qtcreator/src/linux-mobile/b2qtdev.qdoc | 18 +++++++++++++----- doc/qtcreator/src/linux-mobile/linuxdev.qdoc | 3 +++ 5 files changed, 16 insertions(+), 5 deletions(-) delete mode 100644 doc/qtcreator/images/qtcreator-boot2qt-device-configurations.png create mode 100644 doc/qtcreator/images/qtcreator-boot2qt-device-configurations.webp diff --git a/doc/qtcreator/images/qtcreator-boot2qt-device-configurations.png b/doc/qtcreator/images/qtcreator-boot2qt-device-configurations.png deleted file mode 100644 index 584c595dcb333f96fb905b9b2c8db4e7fc6a76ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21668 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 z 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�Zxvg*O) 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 E0ArADAOHXW literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-preferences-devices-remote-linux.webp b/doc/qtcreator/images/qtcreator-preferences-devices-remote-linux.webp index a7fcb124adf0b9fec49ea90151ec913fe8cde113..4b97b88b7a26c75a003c71da285857905bd85896 100644 GIT binary patch literal 12926 zcmWIYbaN{+Vqge&bqWXzu<*$=Vqnle%hb#8wd>KgT$#-O8`rB}pC@R@7{bc9ME7*+ zqU3E#(%Q>5o_kTV;ojmuWyybYPg|5{t+{^0?En4Z<-Pa3tD5#6H&wisIQ`3`(uES= z;|z*spIkgc#N%P1)VFU({fzihs;@H3-#h$wT21W#|NmF*IxX6yBh&f#0FQA*kIqBq zMWWL0M0|2sYxd0PI3N*e*xb41@v;u(;x{}KKd44_JYK~Tb!*$&+{Nkq(?Y{`{$o9C z%sTgLL4xp^?u0m&!$uN^G)|wo_~FF9Pw9-#|DDg?+O{>fZ-1~2v zvt#tHeSDi8qZ<2af8}>?d%GcbaWl{LfT>S@D+DZ3ef>%B!1O1#wu$aM>B^b0M#3a3 z?b$o6@4uFE9XRI@SRypnW$Bae_x^89`8R9k%$YNFr)7aC&oefYZo5sAN$(BcZ0E}5 zZ}i{AMEJtHw@i1~Z%nxDQKV9O<<;6h?>L3O%>CbXXUB#|_K^odng5m_F`J}x)u{UC zkALs|V%BW_m}MG%??%xkzos6mW1F5D&0VQ>dT#W+sTOSNFQcy(Xv)p@_%60~N|tM` z#0u`;ulD5~35*fe-80cR`d-E4Ia6jVoxbAXrBWroOSZ9LURxKL@my)GEsZyS^x~B4 z;)zbX6K~yDiGBWZW!8>AJ6^}mDgArHYh~D#w#Ho>*1vo0CS(6@){>1)$D?|tAHQaw zwlqXL>##%YjqvZKs(r_=)nDh?T-r8E*Z1@}qr-5(6x2;nHe*XU_7W(5d!*W7;{~A<$ zNLaz3w6^O0eI_|mh0rf67=A9l_x(@a``;7omLC7~F0NvChMM&Ui|TLR>+*vQj!5?U z-jqmtV)Vd{U*vPa^$wvm7tPi*tbbelU2M(LJGR?*KCYg&<99=Ya_#Fa8g883Hf1aB z{d2M_KficO2>0)N`*m%3ui0+D%c$7!_v^d;)xQOPpJlkllrtg4Mlm~@Veg)_35Wi& z&&=5HSl^fRty=L7sdb#P3x4I@xOn>#lX;lZkGP}V57pS@mdB}tep%u0^Gf%uTg;a? zFz23R{js~@d-bC3n?}wZMu&g4&B_Ybv)@zY#vJ|FNbH51g_{LkyywoSkG<=C7V!Eb-_u`;vYc-kCuY|c|1@7cX?zqqYS-Bnq3 zG2N&^B0#Kc@*F-uimaH=n`%bC?Cn*W9W?Q*@m2*&TVq82}Pe*0Wl`2FCeR~yef zDw)$J%NoP2t1BAMaJ_kx$A&}Aw-4;w+txkt!p`15%WnJI#=f~wxUpmRPd`DPxVdez zF*+S0AD@i1 z_qBy9h5ETvrU$K}W?)f%;!Go*2o?Wf|y`{3F;!4f_7lDpZtM<*muw2aDepl=pMJK!F zHDV#o&FfhOKS?fm(pJy1__=WD^v;Uu_g5}bHgP|2^jD#2+_p9MgVdK?YrL>+&HbeK zyVs{$Y;)lbe`I1By{lXN;PE3BmC1jlk&5o{M-|FZJDAQId9QDnyyS(%Y1M=opT9o8 zyKbY%oT8QA=f7XHi0fR;)Hh0V-$-74bZEJo&Vs$K{PP7>c3YT4-q&{N=3Xde=>K%S z$dd=_QpAtmpVA>F?qr%YkE@LuGfMDf7MG>!(ibSUvr-f?4?WYEhdS ziSHNh-~azJa%uOz2P^jK$w*vZyX>InZ537S_JYqk6Fj>2?3Azn?dIU9V0Yj5&m~Wr z>Qxpto}OW$m$!>AJ{WO~-+INgMyZakITafXejIod@H*P&5qOO z$LEQC3x4lj6w?vEb=up2H?6Z4xK-@l%F8WTVb4^uCU?g&73(kVJBn1YmqmWpT2P!e zw{-m}Lrde&m4~g=j{Xj9`JukK`L#m;cQfznhG{du?wQ#BL0e3|pV_U{*OKAkvuj13 z8<=LyQ~k2tJUY~Osm?}Y@!qFSf3tsD{d=Omzd}|%eriVHE$$qHHwO>pvfZ8hP->x; z%Jp>|{~5pEt&R^~xS_)Cq0~Fc=f6J$^l)7G5b#r4h!|6v#6VGjwPqt^tcIdMIm2m%A^|I$dT>%;2?VVbg zMHD*8vNnV3)g%$f${7CxB0i9F9!K~kyPNWNa@`&e^z|c@ijBkW!=+sBtW}; z#k3QBv5X5_WFEW~l;cYXnD+ZP{}xxm#j%(D_>TXAE8cn7OTKY_TYp35 z2-{J`mNg9Bt2pyc7;@h;`St6aynVwho_))CSIoR|iuvC6{T<)Z#M)=Q-D&<%mpk^T zd0@$7@rn1hhc~FK6NtZekCmz7ocTeC4)cpMHP*bfdoRvz787e-r!T%vGwp{}=!2&H zVW*OmoA##PN#Cp{-B{SLqGHDjQNA#S2?^n*cdv__t#9amX}0j^&T7ZSnNGQEcP}f% z8OJM|)v#4AowKrZ^O?AFo3EtLGm>X|>hn40{F|!z{f{;YZ#HhpauMq9Qd@VycuU{3 z^<_`DpUQIOn38{XxqZCg$<*wNDczq}L_{lhap$^JbyoRY^XMpi{&Loi({qo0$SN$4 zI-FK)r|%tLz3?tH?!dM#N;Y~EiK7JhzWX~9gDSDT)<3NM(NRroMiSJkE^m>Hc?)?@Z8J&d$`@0K5R{2XVlu262oeJ`*QxjsTGyB zMq-N(?$BNOauKi5+LQBF?67#ep=|ex${)q2y0z0xB-R_RJrc_v^W6HD*pCChS^4Yy zJ0emx8t%_{-1@y+?#IQIL8n8P8N_b*rq$4p+nKLndVjxWIg543rDwe}!*mw)=#{SK z-mvh)?(d@8c6PWdIeU*iCsr$mneo8rUJrlEC z$Cn=Zo_Ilj&J`}jroC4mWuMQ<^7uUr&J z``Nuq@{mq_ptnuS$QTfRypdk_|&s9 zSMQzilH~=l&&gc97R1B2uBn!D@t3Tnw##>Cc$Abblk^GSD*U7`YZ-f`Q$ua$A&uWT zZr;yUxa?ZBbDH3Hx5?LIwxslNT@G#Cxp>w~M>+TAm495fru5w^PZ3yUH0|TkU}x`V zD>P!Sva`*VxyyRi)%)2BgV@j+OIOYO<0=br+QFtju5Zu&2-3bY)8y&4UEeMmzS+Az ztC6F+q(9|@MvD=rh@|yKh5CyH3)W6sl%<`kn)hJ!mWLi40hdl}|8`?H$HqUdroqME z5_Q98I%Pk67{R6GQ)}$42c%| zPL)S#1qeI3M{~->GvqcdzrUqyw?^?(hJpy*1;&^8j<3?3JXtgBLfIu}!=DizGoI?N zlHAc|!jpeWzA=;duy~MJh!?ZXdRczwK3mXNPcyPS@eUr(fcAQA^Fj5+k?8l zi`XB8KRnc^qagY!ML$t=PwK(dD)*;y{NuSKDZrqYczzRiH~+(sIXsHNb>AJ&&Eade zTl4U-?=Qta6L!cf%aW*^yzfbog_PU9CGN3(pATL%_@rk0swgJ2uWh3F%G-)Pdpz&* zB|hzi~ z!oNvdj7@iV+FC7mX5hLjLZGqZvmgH_qxBX7Qv>r3F@4zcD>rC+vt0fqkBqSJb$pEn zTeFgWT@{(Yqxy8Nd;jdhKTBt6O*c3=bHf3n^>wqayj^ho?8VM4JuTI|BKsz7Ye`!e zX&Kue6}>sGqhM3Gam~HxQ0?^Nv$ki+MMWRZTasz{eJ!KQ4c!B^k&}HJ1#EBZFI<0~ zpJSf;{%0@t9Vk|Pqo(d+@rBi2yvWPcwplLw*oQL$ZVitOVk{hOBeqmduJVo&yk@o0 zueq&l%^QcPE!Sr|2#Na=AAa+Q$c~&Ncr!dFf<}?5x-m@gmPm8lr04Z@)B` zUz}ekJk2QPa1(o`cB6h-`Yq9~qWKdhxt%>6WVOJiuBRYzo2)_Gk*WJ%{K?x@B6RLl zYpmp|S?e?Ap3L8}LcEM~w}R?^o{oJNddv2#{`27e2k-kwrU#ueQ04VvpQ6sNZlQ#b z=-Zt#Z@T>Fb!bd%(eS=0lu{BIWwdf-jq7!@HNqvTFB#vvdnksKcPKS3*zc7nQo=ri zi8D#|nbE!{|F>>+YTn1hJ@3uM)2v^Y=C5FwcS(6A^SkpWQf@aUc|C#1f2DU;67z=EJ+Bf#-v!8n4Ci;W-t0(d;TE7_aR*m#mh;g>|)7pe^y&Rudlu@6$<@#6$6L7V1jSbg&Q4@UrSE58r zKS*1~_S=ceQ)Q#2jubqzy)|L~irWvlwyyE_+#FeZOf&byk4u6@ZI#>JZ;qX6{I0Nd zveJ{!;-vyDwf`2qYus=?{)(-Id`r#0MeA-(P5XJHK|lFsNrLdB{OKM`p&+!pg~BUnD2}wJ^#LdURU%i1`k&$ec4w*m4#e(e~91JL0p(=I^t|w?1Z-zy0>@OY!@-b0SK2CYWp1*Rh*7-xodpA=`7} zHl}o`S6kFY_*m@@Ea3_9c*tz=koVE+$7}y=a&T*a&n!>MIvw!TDBU6$FE4*L_|f#_X_1!4D}9siwj6Wzyww_# zbZ5$rWX-kDayBn@et+A%$=LdMWpDD`FBymVD#e3-76u>-13=eeYL1&XfUS-vJJo+zF&dqz>` zmkpMsTJuDA9d5Gft+e>%)3kZUalIui?E0739mie9>-r1wyntYcf^us|Fq4`JmT-aXd ztbU1I^upsSChr&A`IjJXnd5gVz4hHJf&NnA9e1By<>xw=WGDSn#Svs)Qp}tU{`qFy zmy0_Si+>5e%zU-rg`S7V#|U%Yya=E9mfbC0{;O%G$Pp3b>UCgRDYMD6^eiUuHlk5ks)oE`G`=KZZO@2AC>-fpI&E_jV-MsIZwXgof`}H~jledK5NP_4mC@>pZ_io;2kvc- z)SoJ+c}941;@mWIciHrM_H~bHSywL%=2+68$*PvO>Bu>m0`;YT+=_LTHG%`rHb?6F z^o#J#*(> zB>~KS&)3i0#l7k2K8A*^8lR+fFVxCqr5L=PosqcDGxx#M-FNw{O@BCB70^c`-6;(}^_g zS24%EJT+Gb{xl3JD*f3#OUgp^Rm#)n(@m=OUoTO3dyfB6%F~N(q2i6svP}MU(Z@K~ z=Y3UVe0RNeA?JLbFEKMttyp}-JZ-gktcLWZ_T6p^crK@IlUlS^EOGXfBVotgr*>56 z@AG6+Q!(qc>e{;4TV<|{TJ5J#VP}F=gLO7Bq!)egiT1c~G3*kT{mL#C#@bJxN@rZo zw@a)2V!p9RTP{hY!oj?xXM5kaNeMaUANCzx#9lY~?PBk0hKD`}ZWtY%5YAK@VVM+h z(X`jfYtN$H37Z}m&s6sho991K{c$|6fotZ1S$+G?NGEvlFFU%-N705?;ZsY)tkYe! zC7EZrxFnBVi&4yK7C7GFySPv2Q}WUjp0rQ)4ARQ~-}=`)GHH6~7Wi_pclJ7=g1N^P z58wE}$;wI!Lyo46#)PxxdrgzhN} zINY@^`%2&>iw|2FOdJaO>}$jw`}!Vks*;br#r8r+zJ|$ZgV~Bi*Xu^FG&nEJz9J*M z^>*|HhKH8_4lwWXbdX`zll>sN(r(ul0f}hiH$Q|!q_1pPlr2>%QvT3))#n!l(~dq{ zvB&f4w~I?tH(F}t2kosb$qdg~cXR5pd-c=)pRfKHVky3V`fq#hBfA}zJzQF$I8X8M z;_06Egg(COe^#u>`m|<7{&OyI>_Yd9ZJ1yB zEZop_<;ZKFtXb>6JZVk(KJV1Qts34N7s~!yWbb?V57VEA+L^QB*w&`l@`Nujp5V4k z-s$58hL2K{XZe+Rl)TUMn6O*m=Kp`P|Cp=Ho?rfw^iyJzkJ6+UP3 zN9c;;N~VtzDsk08moMyW*|zJXh?=~}?(ZVjmpZDuU32)HzaKv)mlL-*DLPqdQGKAR ze&UL+WL@h~ao)hi zF+1|&yelSeu8Q4yrN+4M*52h!ZLUg2?Gul#$vvyDH+jn6_G4}ZQ|*mZ_M}S~WC$vK z2vP?8RqHM%1e9U6q&-bfd|4pwHYWZam z^WDnwTWh$>d!IeJfhK{!?oBM2np3k|Zt*RzzzGe{4IgM!MmsG&^oZ4S)fJWXUVdH{ zUR_p|Ejrh;Fa9l>H|eRBj@RFyyRXA6!z*Vlzwgdj;l;Z5{N7K0^B)!8pZ>(+FSpM< zhxFNL4<4-WWs|;stM})H2PY;f&p(>arLF&=B@IAG{TJ_wubbIal4gvF$ zIV-p<eZHnu^#-XU%#%R83*X|by1<9p8m-%dnO+GR z{Sq=?-?%;4aYDoL2{$i&mJwEbvG;C^PqyXL+g)ms3GoZpux9i)-|^EAiT~epd*%b1 zoAZ}VE;an4{AZ=pgqy4O98}pZB$D|lbk*m@sl4jR97g=&-=srl?$KMwaO=fa2cF%2 zGu`ea?5y@ZAb;?@gS0G@jA~CPtE1IQmg(N-(-XpfdA{5!7R+|{^~D?JlMQAZ$(s}* zd^h%Dfnv6Wr1_usJM0%-Io$fkZK?Wt?->*Lrc70|^;#IL8F-)PNtD;lHBQg%IN46U zG8ALwtPt80{ok!h>fZYQZ1L@rRi;Kx`B5jFXwZ2_rBQ9-UWIpmGBOXJoUt*WVu#nt zQ%_1)z83FZ@oM+Y7r(R~hG^~j=@5Eox{+!_U*(H3FAkv(OTw1DFmL?HKEFLvt8}A+ zz2OrzP1bjRG9nM3+|l^s;iAA9d-TMb&nQNIh)P+ocwfez#n-q>v_y>!mo>fcT2)S$WYy6F~@))T6Ca7O{i z@8ii|?$kJSXOZ^0m4{etUM{d-b?eo&j)zO4f4IoryE5y%!sk7ARyZ3l`cK_owkb<# zYtKF#vA-vL1E+higcZmt%y+*cdE2LbYlP#pudd&J&z;^JvNPcP)$&z~pU9rvzS`}b zir4>%!UdCdc|C6~UorE2*ZyF&%)S5pcAuVHcx&t7jO!C_uUmYGYjJFH-tKo3x2rbz z6oVK_2j<*fxBAG8+v_$%h?d)VpWGiT)h@Q~bC}iRQ^_K`!g|;86sF|7-5;eMO=&;O zG;#X6GjAo7GL4Luir?B-siC=E<4zgluRCSQ#;4wTMJ;;EJyCtenYWihGNjd%FUP%j zE4tw9e3OgHpR%Xyl;sprQVwQ+P$lHHx!MOzw4GOZgj#Te45&ZogN* z{O;4E7H_Zp?qBTshE;&?L^&73DtUJASzg!A8r4m>yMRM2sGwYc{r8{^oPV88Hw1KNY zY|@m+Qm|^iBa?OX@z0Vfe#cC8Eh9yGR4OM&gqX=s_R;NCGpxxHZY%w?Czkn1Nya9*=520|{bo$rkliq+Yk%dnYZ-Sq zxA9K6ylm0hi#tSer0=L%FD}%IQQyX!H+kvB9U@`3&35=sb9)@L!!1{uPsMw2XNt-$ zLwW&pe3`xI9gl$D7L%8D{0~l@ zx?tY6L8sU5mZ}>^=Xu=#gNbgfmy4#%aahcCxUnTuo$ZkwdvZh3^e@TpzjL|Y*q3;B zeTU_rEqiCqU|!OsWBmAl*YN^Lspdt&k!rQOW}UuNE2r?~OO~FyQ7_|%XM495s;JMK zw)hE))YYT^&z*5y*dtJMQDw5wYlo~Tw+>4Osk1MnGbBH{cu#)wnStxpCX-(?)&@Pk zD{_R5r*LmYRNo}wjF8lV*(WkSgj6fJU#Yv7DA~ZDQQ_lZC$u$7-*DHrBQgr2Pkf}l za(_y1c*i5)zs2OH9sdFa9q+{g2PY_Ts$C79UlG;!h|^@1g^Wjv$@hMF0p5keGfph% zFIgnGZTaIl;Z5$>=Yjl^k;IblBISs%uJ5Mv%pMu1FP&gD`8dCc(@bmLw8d9gq?V?g znk-ez&wAir?!4)1S1OiNY0Pf57ck_#BpkA8^?qTkgN{KHkMcaYaI!-!YF5sC_6Y*h zmQM88enq6Z$vIUY5(-o2Yx>`HwUSz3IJ-4-=M@1fUt{_2H`knWixcVDV0-1??|wKDz@7^^T*XKYws<2#}~cV^RDc+s>!>o-+WOkt&Di(`|87nE3>b- z79OfUc~ZY@R>#zPOPb!jZhmgnfBxh6;%@>XR(1@tHHe={RQBckQRYm;@3 zKVR$JVtAr_RQBBj@m}5Aes>)eBvx!^<=iXep*`nUR{5dDC%M(*6@{N{Qj6bHvv0yT zpPx@mp7M71x=)ibeNZapzQ8&rk8+CA>~u-y!mWz3;zG()l5&eNx}8 z{o`S zlwT%)aA?)Cx)T?!tlxD;_|x1bQ%U`0HkEas*ky0WSJ(-&cyV|>o~ypU;$3^uWc@fk zUejd`PRjRZT0Cu6o;0IKFnh;=g)&T?4d0JQ-ruXHI?Hm(yhkgH{A2dq^Kkw3$`S-?-uD5!t=f!KFPUMKe;FLqU}8#~W!SzWejb|~vLZx0!nV)avp zLqscfPyX+B;c~{j_ph7E=H#oW^uDjN6F$Rly6or5_|o!1&Ybv}uN#FvUfXDW{M*7n zkpPxL|GDaWlx{!Jm{6j%YUTQ}nd*~D%N;o-_2crFY%_Z`wSh}4oa2^BrSF0I*4;r{ z4(TO|CzSDjH2S)FvB2B7bSHc>2xYP><=-fFGWxbf_J!bkFN_>lv`jF$_tSe*=Hs(GUM^pJ{%+XaeQVhS zjuQXJbA#YMA98tr!2Zzi)kD%$YFm zJ%0KJf@(gfu}%+`EzxeYf_2(Vf#zO=^Z(4pBS*eLt=I9iH{db8m{Aa}a zsh3%^*H6gSd}9#yY0LM-e~Vv~yyWB$uDl?ep?rHU!*?^2r?)SA|Jf=2{^lCbjSL4L zP1%0Fy{$;|_u2y93TMeF_YbYMY2B`=!gNRYPw$7)YugUKJEdvw;n5!W@qUu@&pfjZ zkq{TYm)`Z=TFjcRf+yEB+>ewF=D45mbCuNHV|)BkZ^tD4;JMT^|JUs~hA&IM8+&-~ z^%Pcq!@J{yg0E@f%Gt?6EN{YWzMeKIDKxydMDR_;s}CEl&c1Rtakcr%-Nkk*zTcm{ zLq8=Zn7q9Hw4BCZ*fv-&$#sS2fw~HagB}2i`6Fz zTogZFv7Ke_{w6>3I2ND6D_eqB7JpKEn!e$!#a_?Xf4{4hp1Zf?>%Yx+!k@HVy!UsL z|A*!N_Zyph*;J;pOk|rNH%og`lF!^zR_$5K+&=7EytbuCROmY5UM%n{ZjzuD%S)aM6@JSWcl-UHAv7T= zW&ZoEhQEqVduMtb_*B_^d+Ukslez-TJf<^P&5e8TJ@9Crufkm)BU#@a+XH<&GjE18 zp3EvTJYh9S!d5wcs>Re&wvw4D%jKRnu{TDa`_N>3K_D+g>Attpn-K2_od1(dzI{B@ z=p&`Kd{L!2=P#)VGO~+14ZY47d@Ega)%irGwde0pzVL%v{;~WwON(0BI9X*GO>56^3tO7uWqo*x**4jMb!`_zJ?ei3356Er}6RA+rfA{a4NaN81(>XL-?4}57t5#+%&???|;`^i> z+vX_<+dRq1oFs8VWsgzJvHfX6S`)N_c+Q;?S-HH-YC+CNnW9BuZt+rUEq}j1CFFRE z=Ue$Hr~BSYhqg^Bn&9_9t7dzH+zFK{Mb>Q>Lu*+7e`*imNs#tbXxr3xF{f=S z>TPD*?%|qM%XR4c&ebb>-lt}ZE>iX|2dzfjW29hJbMQm@gkOh_iSJ&$zid@9uk|wF zb*gI$&(?>>zPCU9vcXH#aF_R{GZQCbGCV{L<)--_J#t{@yrYLF$?WhuceNtooi9(! zYWGKpk#i+>xShXN5pish?B2`I3rhS?78OkEFh752^ZB^#v)I(%mOgxtz%g^>*@!iP zQ&b-U0HdmN^-R!+nE&qs#{Wmv00uwtAo=o@}^!DToJdtW>YnbcbESE zFKIQF(X;tvcM0uYKV@$Ci)&v4nWeVA=X$Hr9u(v9{9^30fZ)r*R`R!YU256n^2PYf zX6AnLT!reHlfF8uP7;Yf1zIZh^7O=yYpZ(xcs6MqfAw(1tdsLhZd7g%ouU6*>)vX0 zw-?8w_yqsH-|_39v$PfKUcXM2ql=2BY8C%r{!yrU>iCCbsZisalj9WUut%THs5$j8 zvP4+<%i-`ftjpUw8ax&6&5!-U9?Qv`x?$&n7BS7~E+#h5U%asWptGw}@Ylv^d0O5_ z4n1fSUm3TYCCe^)t>gOOV+${>ooVq~^2s@4Q@Lq#I~&((KT5p0tB0#xuBZL!xgY#f zwUT6Xn%(1i|4vw`+x^%Lh~WA>zo|196fRh2a=PSmSnXenyQOnB6vZSN_!?h& z)ga!q-=*}xh5MrM|5)vR?E3Q}ET(w%nqMkbkB?^0k-n<9e$TeFvlD{%Rjdn%{Tw=N h|H1Mf|LmTy-F$9w>fVMUbEj1Ok4$4Z9Ju=(#oWs58S-9t=M8>DZ-}g`cby)gE%iW!Sbws`YmLJ*Ht9}6Rdq}Tg^^i zoP023gJH$oJ=Gh$_b*~}|D<MS&BZ`5lvL7W+6bV|a z5L&YRjrYd`j)syG6b?U`_|V=+ogZ- z?1sH^ofB`ozUj$h{qlpVpZ?+4x=%YyRtue}v_4(1_XXdYce4BbPAjr=3C(Zcuu`aj zdEPV!!;fpTgMN7bVSP~Zed6Dm>e_WS!E?Xd(9RM6rn*7=r-Px8kCU2Y0pFjL2~{W6 z{EvTsaF8b|f8CpiiZ>Uh9o`h%vEyE~LSNqX8Ae%)C&|oHlDMjMbKJd!Dd-dSXA^V?4la{Ed?Bh7_rMT!%VdlxT)2h^s3-)H% zNM6kKI%4MizQ9Jzx=vGjUi?`vgD;*7LT+ezDCjh}M+hBTkf8B*%d>AvqT4+#lwZC5 z`jSS}nFzbTC$yqVGcP|biOMnj?|v}FxXSqHoZ}ZR`)qSP>uLF(Q7+N5_}ePwR84K( zU@fJ&?)wil{=TkTe}A6i0ZFzwnd?{2Sm~#~wdUmqb!XGstI6v(Y@W4cuiiQ3-<`6) z?$@+q^tFT?I*j-F)RwcV3-;}0dHdm9^711d|M!V|ui3=R^@pu;m*!`o=d&_wm7Au$ zUv}{QvxEC)r`=f*w)*PiEk8H$Wj-(rpM5#*OiRQl;KEF)-{^9w*cQ?4* zKF_zF&vNGJ@3!sxmIj*Shzq`>bp-GEe=a{HTtrq04oM`&~K}3x3%ZeYrViN9} zdZs`0mW>T#{JT#>(X%Rdd8}XS;g>0Mx>SAGuJp)Ey_1wmWy0olp`AzF%&ZiltnQMuwIL%*jqJ7@=1QFeWo zY})!>_UXy5R!)1kAgdwYPxAktJ+lm?r#sJ5DtsD}W$GR2eN+b59iOsJd%3bu`Q7#V zr;H_zPiKFT*CesHT+6C1sIW=-%-7jFg-ncv2rKw!`jOzn$ zFO14npYgxq6aVk&-HfZ;>WsECMP8|1Ro0Y$E=IR~6>mn#)3YTJ)h9h(?e|&c%>QDG zLF*~a|G&2vy9e)oa&@0+<;sGuoA_;X8q2VlxR#-fJ+kP42>;BS~Lo&EN8A@|Kdv zY)%hic3CdE@N{-%#r%)&_UUrz?*CY%@Fe4`|FWaujV6wf1-46gPuFZp30?J**38KgxVcVsok9O0Rv(rnM?b07d4%3& zIupG4?UpS@d9^R3Cclbd+`00fl75lm?Y$L}uOj>RSII58)p+j$#qu3 zUv_66-sIYC;&!fP&c4)dF%n0_4u5>*A@ls$%8bOI1IhswyA&EymUKApitIM6i#h#y z{_oR?0_W>>H|zI@7fMcMndX=`spsG4Ia)%(sXdTLey+PkcfYxAw2tQs<^ zjK%BUU1a{n+PmmtY;^0L|6BP>k6GEXvo8L%boRkdcD2_N`fEh_yuS3b&VJw0%k}fc z{`w7H5Aq+gek3o_wd!54zQ0|$9p{gxkKa#b8Fw9fb(5{D|NHLW`>QV2B>uT2`}mcd z@ka6cla3!?aZ%sWqx;rPo}<8YxthW{p<~k&pPbCl;LuGzomO@>Kp^hewE7$=u0yA9 zT#5j3(tTMUrsh=M3ITCym0KpPUsBj?uq{Mz(Y{H)s*GlFaU^?-D!$QPnQg+${%W`D zf&=W6XGR%C9*8uWF;8rU>XaW|LTS^2BhNZ4+!M{>RinCarfSJFo@L8f+nAsB76d=i z-WieW9NIYZj;GO=puK(UdjE5FE>N*t9lmX0O|n41Bkj&JI?HcKIsSY7Rd;jQni;3v zDxXPrId`sCG1=TAH|=1Bk=MlHbJH#6%uW@2n%O!*eX&UH`t6J#m)hP^Sle%8ZN95k z)ul(Ux_M*JTM-4XXmbW57S6K{o!NEl;5@ar7&5r#}y}|%pUu7-r6Yl?aYl8vc^m`T=rekiYbqtsaGbL?f9C> zEC2kk|HI`+GCldwyVdWy@Yqj-u7H+IKJ~ll z>2AguJg&Kc*Cl2!MKdnom{ah})%BR9_s0KcBo)gK9y+iJWJ}f@{`pydKAmAoFG%1p zu(_`LNQ!sDl^G@9Za)YP_Z)7qw7{n|5l?y!T)kv(6XAI__ zczb6|_%Puo`|iZ&oEwz1cPgoK)x3JMifw}SVd4BMs{cBVT|D@XwYBN_1Id3qF<)d4 zGxjwmHYpl7Y82b?DBd`boc}m?_KOmp@5>Et+;UnMsIXcpe6Q!vw8lz5O&%`yh3DsA zC~K)+v+?rAo3~~(7+een`|{PACy%NYR&y&w-EDARf1SB!TAt&5j$?O%qMUTRc_x1; zPr4T&tMQZ?AfW`m`K-wN|O;hu7}=b#C_ki>FTP{x2QNdy&aw*%r5^ z3wyhM+cSN+x;^}3!0z(>HjScr;0Z( zwbj!zwoN~U zl9$Oat@+q^A!gq0)Yq?1wsQHtmk}}6*!Y8`F67YhpC6P9TonuWGFLpEpS$g;qtDF> zb`A@H3)8z_mSm-J*E&p8lRD)nv*Lr->8Do48&ooazpRzjo|@^gYva+GQzK056pPE9 z)t;?05lM2*jucfzyk z)2thdjf3JJ33QdoczNzRJhO^z&o0Xyjvu2DN*{KXEIGC< z+;&^fhgZ*TRNGh|Uf$}1>cxVz zJ+dc@B5GAV7z$deFQN_{lDU+B&{-|=P{lqaA&OWa;(euwi@ zTkp;#EXoBJb+4G8lo7k`6tMhw;cg3wQ%UyIj)vYcRXflbcFj;#TaxMeW2UW(T<7dr zSEIQjLhRM-6uqUNUw`LmU&P9C-KBV|@RQ?@L_4yNMHg zO|_ZgzQX5bXDR-PxH0|m!CqJO*E24OHh-wy6(V>f+w$VMqWu?dE%3cvzn-;pQ_8+; zo99GD#T2e{<5cvjdia}1LE{GNnWl9NY!eP#cidhX{Wj@Pf2(A|%Lm66U9no$(!NW; z|HCrw%X7-6-FGUiu3P)eR^0npimq;er>=(Lh9%-TSF+lg^ENN$Pdm7h!EM?Pp-nBz zl`U%Qr`5F2jBb#X-gS&+cLdl;a~Ej8x6@TG{T%sD{KcZU%g&?QnEDp;mZ;HRh=X)#f63(+XYTsj3sf77V zlbh;-BN}ZcUXzs2IFO$6(%FfpPa{f&-|sb#kLUv~wp@YCxs8QIb}i-?+;*2l$)6I8 zmG-X4G~iu4`zue3-t5y;cNK_jNl378e%bKp#^0QsYmFN$B~+g~*LUtea7jGl>Zu!N zSTkNc_;*Thy5x}!tjtsRH2Rt6I9tw8dG7oz-a0vYvEy~wru^$Kr0q&Ibwe0_H@LlO zST3Wq*4V*vhSGEAn$~Hrd0h@nH|Hn`JQsEPdgFub=Nb+uSjsnjZd(%Fc71PTTECu}H3ciNTktGvt-lrft9czRzD@XSLxY z#n1?^JGTyP*>GG@mFMN-Z0oWm^YvE;J$F8QuzA&nDLbBq-`XVC9&)u{=dHRjm91O% zaFbTb`U&7yThHqiM(zF>@CnQZ~zUfljX}J2e?&e4LKAmhl+?o}3cvJXCNX|FhZtDLXt`-zy*2XJ)-_vTnLkZ2)5|+a2}nZ!f~d zPOf_56@K^N7KH$>m<{)4zSN#$6d;lpB=n@yVbHIRO^=gu-Lu_Pmo{{9&UZf8-^|_; zSYUT2X(h*%SKod{&GYyhlW;M{F#cTo?7xq$)>`ncoAhwA%yR7#3m%7$smd(ZA74n0 z4|>t3u_!|Rz*l3dyEP3zR3s{7RS!#8%Kw_LlT!Xxg3q^Vxx3Vk-}{1m`adsp$c_7Q zT*OjdXu9@-?z{-wxT2lc^1ra9tc<%b*J|bJJjch65AvpV{=U|AVDH|XsMo=*^^EeG z`iHyAj?LpeWhi~FeNXk-f)z)n>56My?e_03YH^%CS+UYc;o*mOXFOPTX>5PmeZo1% z-TUZC*Lv$d2DK;q&hPHlS+rNmIpOhR%}OKVmJc?DYC(s^e}oks+$hxUyynRvpDkQ> zr%Wh0-L!+zpQodbJyk`EargEkSG!Kuu=P1SN$%wdlx3h3>hz9au_#L9hBHU?#0Z;8C)!1QR*9lmI@wvDE`H@<28 zuGQbcG<{aYFTG68QnMY!~VCe z>Jzr^HHfjWyzq0v*5eZ@<+B1;Mjc!x`%6hr|Bjh4hj?ew7S;a85B=RYonBesGbJ&x zL3yI9+1m;BCnDKS{wye4zVLfVOuFUanW7IoQYQLZKjAN$W>{pGV%BPE5fypktU#2) zqcE{mvYk2$m&qPd`|x$mhN*LAE<9jl%eseu;%vn&4lZkTLTrR0?<|u&6nK8pQH?2Y zy(4F4EzEydc37y)_{o$dVIMtG3TKyjXng%Tdy&!Aq+*K)wH%vs#>a|f#&fcQHRL*V8kfm#^J8;UU{Fn&-aWH)84KJou=6uFLI`A zy|G|&7<0D?^Xw$C%V%z zS9@`TudZ<-bL!Gfn*%d#jT@O$RWIGt(DZrW5ZPH`=G8Shjs28YfzIc-$zq*ViDGw> zn`AV!EvGw+GH=aab1Uvd_Kh_nJT?1vW>qULPu#p{SK*(KDUoMb=N_;8%=*byrK%)n z+k?BuvoEkre09vwz%4{TZROk6ImZ;c-W)4jKAp{8>oXhACh6nPy1VuA1IyYrxF2`V zF4JzTm${>(aHMgQ5jRKSlZ9ubgx7xkS8=F5ZWB|)jQSfZBLrvb-Ti&sHzZ_sHkaBY z17S7ecdUZ5tK=TYX>|OnE6%h{E?pvYrnURb4sn;R=rK9}+7kZ|M1x8fHsy<+7$q0sp9$)Pi!mc2XCa(rF* z)g9t4iJNY2df$7d%-mbFPi~6&dh-QU+YYYGnU|6IwP}uHQe6)s8C1 zzJFwUx}bUQ-3Q+dnvDOjdQ1$+{MuCGncuLv<>iBW=budN8wmrCM_~xzKrQV|tLd^WPY^joBSQXJ!eV@^s z!L)3z*Rj0{Mw6eM=Dl$@A>aH#??e`bcT11_I-wX6Woz5;a!Z1#!UZ;kV_=U+G?!mK z@_y5j$c(^nE@y|2Q^MBA&NOvCF)hr0eM!%2_iVL4&zGj`xGyLy}b=^V93yb{LM2b*s2-wqW1C@8vemu8XOL)9lW3+GB6YpqQReABFZ;*yx* z-Hbx-$cfjCEk8Dzw3w|;4`e^NOS9|X77uUEjP<+y<2PT+ySV?@=QV%j*%KE}T3Ow? zuV8iRL|LYA8^OJsxul(>mkO+yo%GSD^!ESn`yaY`=+D{w?er&0mD0=M0jG>hXFvKg zX;Iq+H{F!i%VsFe=B+!ZQ6VO&!xj98GvqVp(>mG7vya}|e@y&f|9+?J?GJn>Es0jk z+A1MDO(us^>z$Ij4O?gUJ%OlsPRKgvScs&o_&ee`6T!E zF(_nhJ#kvt_esD#fvAYnT(=${cH>QXy{u!}XKuHHTTeXjn0a*in^QkZJE87Go(RwDqhWO*3>>6Yy>1){sOEsGC&sduHL^Id5D3&zW-ahry&Z zGXo!GaV-0G?ci*-vkFNcb)A!s%imk`eZ{7XqFvf${4=b?M73(>%18u#yiky`BQfDs z#;TP4lRo<9N(Fq=l)Qgn*@gH-pL$ur(`f{%TB{VcI3Z+}(l2rgVV zOE+mjw>$TZE%7Opc7@axWO-7cuUZEM<_i(9uY|7iK~@v~dEZe`l-{^I&$-Hp|A zlw`S<@-F4b7jg>Jbc#CP)v?6-kpHe3;(*3;Wx-=Z95K4K9pq6$nydnkLI~Kz5~Ybg0prh|ZZ=3-&T? zoL6;g`pjDP7=Jdu@}oOsrinlF-^by1)ymtN!`ouhsr6#F51+L8A}qzo*A#YNYZBu& z-!)Q6HyiQ2Mm`?I$JSJrDL;sp%hD+5fu!pz(*i zjbB>+%s;hx=V{^OHJ%ya0$cY=zh?}sTPj%lLcOclu)m1mhM&CEnU9{kE~(s=SgX#u ze0S27Gwok2Kh%1BU%1t&+w!cl)4Vc?g|UuTzU9TVZE0Z+t$V8Q^@4u}i_zlGpF@?H z@Af##ZrLtVGGj5=UvlMb-<2ZgT}WqencMug=g++OgR39t&z{qDy6B(0+Fgn2TZ%1Z ztd6&L7fKxx>Ra_myYYv!{X$8d_yWBZE^V*;R>nWAIDK`8@8iRH#Y+_BZojaJs@*bA z<#tKo$HE%7KRcLrX}hV}hDrvVJ3sxK*1y{PsPh@Kt)FDF3)~iM$$78zW_RYR`uqNu z7^j*wzCL;3!{frA>N@KWzU#W^Ss%9b&WRU3IdfdzT%0HIy+Jx$Aorf{?L|6rmql;H z8qVy$_TuCJnVa@@@0zUi;Ett_f?&(rxfg$CoJ~`GoPEn=LAYT};L08G-(N*vz4CF| z!`Y#V>{C0|Ka#6e&kIN{KlmfsWQKOZeJ$ydL-mW#39sm}>OQpLGLK}bSZG(&jZ(HJ zH#2iC99(B?aNaMtnN5BJ=ef<74_stnd44nV4ab?ym+uJ9NMF8FndAJqNy3X}_q*~O z?+Q+_Wpkg^;nRA7^@+`<4R%xVn-mPrpA+I+I{gc$_Z5M8qRUTI+1X?&8C~^HS<1C4 zyNExm!Rq|E49@fCJW_14clNm}8FjP&Vqn!UcGU6o>~!4J#Bbiw(yVGQ<;u#!rtr$N zLZ#Oe9Tb&}m>YG)4dhg}6{H3J=F|M|{O{nZX+b50Go@6tZ+!JAWcS_?-p9-#)qhCW z$IR(m7h_TDecdUQWz$wn=GkfQB<#n@e)?M$Pg)oIg|i{H>Pp8J@6qiM<37A8^!d%m zO-|8nUKSBdmrrbnT*F+@y?W{1RhKqz4rxt3toJbCz>{8`He|gxFIOSvtTh%d~ke3m%&n6c#@t}VqHZvgN5?l6~1r9 zn$z}OF0k^=6}#`t{BFA2)4L{jHk?&*Yh1o5a?XbK&J#Q8wmf4g?0L=lSooi{yi~^X z!_}$Hd;CngxWDtPU3POu%Xal?U#0lZMoWK{yJ9Nce4wo{?(xE#XV$%*)$8c6{o{o{ z$-&oidYE?grY@Uza|Y`^MG$M*O$k=N*JjgZ&Pq!bsfZ|*KJDYXS=04_*h%kQv-=l? zA6m3adD&N;7{Tf*R(pj0Eq?Iq&iiGh-6Q&4p(V%kg#=^r8GDBT%p z38gkg{uL))q&=FrXio3-icXiSEUR`~{n4++OpkNw}e#}#06U}nff+Z!(`gciu6U# z*Epx?7@y2}6x9}duxS3Oo6OG*Bm6w$@#LNxmmj#5#<1Uxm7Sfj>h+ZxgL^YSbiNX( zUvc}{>=HAF4kiGsjC+TsE5yRfA~n`dEwiJTlJSt9nxIU;xXx5&b}*^=Dw>Z zDYYpcUUWMmEo+wVNsiEeWyfU+xGAk|k)q$l;I+p6WJzQ+c9=d(wnJXsJlMh6@ zuK#%9&APi6A$h=FZdO!p>NB>BrqYuO4*t0P!7q66j^cw^v(C2MKG&}P=eCZBru{M@7C#f(LrO9H;lNp`)EB=c-vtB=JNON){= zWr-F2`#412^u5tqzH`Z2Hl@dYOn1yG)*61<@ua$?uHEG|5BoJGL+dfrUtEtOIZtJAow~s3Q{ITUo^IqGUO%*v?+u|OT+uwU)$2CP@ z(j;kT`Fl&s-@keH`R?xBhkIFtrcJu|?(XjPdG!jN(>iA)GQGdox#vmd=DOQ=Y_{<* zuYD?U=bD7merGRs)l=HK(_f!q$b8UWtr5h|?$^4>`Wikt% z?hC4saqR54?iQb)cGFR~@ZIeY~VgP1RWYV%JsKTj%oF8PVi#ndGd4yrq!)E;f3Uu&{nwe4rN&||T=7Py?62#H zU;dsa^ \uicontrol Preferences > \uicontrol Devices > + \uicontrol Devices > \uicontrol Add > \uicontrol {Boot2Qt Device} to create + either a network connection or a USB connection to it. + + \image qtcreator-boot2qt-device-configurations.webp {Devices tab in Preferences} + + To add a device without using a wizard, select \uicontrol {Boot2Qt Device} in + the pull-down menu of the \uicontrol Add button. \note On Ubuntu Linux, the development user account must have access to the plugged-in devices. To grant them access to the device via USB, create a new @@ -46,8 +52,6 @@ You can edit the settings later in \uicontrol Edit > \uicontrol Preferences > \uicontrol Devices > \uicontrol Devices. - \image qtcreator-boot2qt-device-configurations.png {Devices dialog} - To reboot the selected device, select \uicontrol {Reboot Device}. To restore the default application to the device, select @@ -122,6 +126,10 @@ parameters that have sensible default values. One of these is the SSH port number, which is available in the variable \c %{Device:SshPort}. + + To add a device without using the wizard, select + \uicontrol {Boot2Qt Device} in the pull-down menu of the + \uicontrol Add button. \endlist \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > \uicontrol Add to add a kit for building applications for the diff --git a/doc/qtcreator/src/linux-mobile/linuxdev.qdoc b/doc/qtcreator/src/linux-mobile/linuxdev.qdoc index 028619c7fad..41820632d36 100644 --- a/doc/qtcreator/src/linux-mobile/linuxdev.qdoc +++ b/doc/qtcreator/src/linux-mobile/linuxdev.qdoc @@ -107,6 +107,9 @@ All of these parameters can be edited later, as well as additional ones that the wizard does not show because there are sensible default values. + To add a device without using the wizard, select + \uicontrol {Add Remote Linux Device} in the pull-down + menu of the \uicontrol Add button. \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Kits > \uicontrol Add to add a kit for building for the device. Select the From d7a26911e45119229d229b4af0501abdc636121d Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Wed, 7 Jun 2023 09:28:19 +0200 Subject: [PATCH 022/204] Debugger: Use the pathUsage parameter Previously the "Path:" option for breakpoints was ignored by the lldb engine. Change-Id: I3878ff7b50da994b26b9c42483e4640adc5c60cc Reviewed-by: hjk Reviewed-by: --- src/plugins/debugger/breakhandler.cpp | 13 +++++++++++-- src/plugins/debugger/breakhandler.h | 4 +++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 180b2c0a07d..963aced456c 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -1107,7 +1107,7 @@ QVariant BreakpointItem::data(int column, int role) const return QVariant(); } -void BreakpointItem::addToCommand(DebuggerCommand *cmd) const +void BreakpointItem::addToCommand(DebuggerCommand *cmd, BreakpointPathUsage defaultPathUsage) const { QTC_ASSERT(m_globalBreakpoint, return); const BreakpointParameters &requested = requestedParameters(); @@ -1120,10 +1120,19 @@ void BreakpointItem::addToCommand(DebuggerCommand *cmd) const cmd->arg("function", requested.functionName); cmd->arg("oneshot", requested.oneShot); cmd->arg("enabled", requested.enabled); - cmd->arg("file", requested.fileName.path()); cmd->arg("line", requested.textPosition.line); cmd->arg("address", requested.address); cmd->arg("expression", requested.expression); + + BreakpointPathUsage pathUsage = (requested.pathUsage + == BreakpointPathUsage::BreakpointPathUsageEngineDefault) + ? defaultPathUsage + : requested.pathUsage; + + cmd->arg("file", + pathUsage == BreakpointPathUsage::BreakpointUseFullPath + ? requested.fileName.path() + : requested.fileName.fileName()); } void BreakpointItem::updateFromGdbOutput(const GdbMi &bkpt, const FilePath &fileRoot) diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index e850151c3be..0132e2bcaf6 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -107,7 +107,9 @@ public: int markerLineNumber() const; const BreakpointParameters &requestedParameters() const; - void addToCommand(DebuggerCommand *cmd) const; + void addToCommand(DebuggerCommand *cmd, + BreakpointPathUsage defaultPathUsage + = BreakpointPathUsage::BreakpointUseFullPath) const; void updateFromGdbOutput(const GdbMi &bkpt, const Utils::FilePath &fileRoot); int modelId() const; From ac77e56f3a9dfb8ac91748dacb155fe1d89f3639 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 8 Jun 2023 15:53:58 +0200 Subject: [PATCH 023/204] Doc: Add a "What's New" section to the change log Add short sections for each new main feature, such as a plugin. Task-number: QTCREATORBUG-28996 Change-Id: Iceca604064bb151bf7dd2239c0520546266c53f9 Reviewed-by: hjk Reviewed-by: Eike Ziller --- dist/changelog/changes-11.0.0.md | 93 ++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 28 deletions(-) diff --git a/dist/changelog/changes-11.0.0.md b/dist/changelog/changes-11.0.0.md index 32860826363..bbe5edeb21f 100644 --- a/dist/changelog/changes-11.0.0.md +++ b/dist/changelog/changes-11.0.0.md @@ -10,17 +10,74 @@ the public Git repository. For example: git clone git://code.qt.io/qt-creator/qt-creator.git git log --cherry-pick --pretty=oneline origin/10.0..v11.0.0 +What's new? +------------ + +* Markdown editor with preview (QTCREATORBUG-27883) +* Internal terminal (QTCREATORBUG-8511) +* Experimental support for GitHub Copilot +* Experimental support for the `vcpkg` C/C++ package manager +* Experimental support for the Axivion static analyzer + +### Markdown + +You can open markdown (.md) files for editing or select `File > New File > +General > Markdown File` to create a new file. + +([Documentation](https://doc-snapshots.qt.io/qtcreator-11.0/creator-markdown-editor.html)) + +### Terminal + +When you select the `Run in Terminal` check box and run an application or the +`Open Terminal` button to open a terminal, the default terminal opens in the +`Terminal` output view. It supports multiple tabs, as well as various +shells, colors, and fonts. + +To use an external terminal, deselect the `Use internal terminal` check box in +`Preferences > Terminal`. + +([Documentation](https://doc-snapshots.qt.io/qtcreator-11.0/creator-output-panes.html#terminal)) + +### Copilot + +The experimental Copilot plugin integrates +[GitHub Copilot](https://github.com/features/copilot), which uses OpenAI to +suggest code in the `Edit` mode. + +To set Copilot preferences, select `Preferences > Copilot`. + +([Documentation](https://doc-snapshots.qt.io/qtcreator-11.0/creator-copilot.html)) + +### vcpkg + +The experimental vcpkg plugin integrates the [vcpgk](https://vcpkg.io) +package manager for downloading and managing libraries. + +Select the `vcpkg` installation location in `Preferences > CMake > Vcpkg > Path`. + +To create a new `vcpkg.json` package manifest file, select `File > New File > +vcpkg`. The file is automatically added to the CMakeLists.txt file for the +project. + +Edit manifest files in the manifest editor. To search for packages to add to the +file, select the `Search Package` button on the manifest editor toolbar. + +([Documentation](https://doc-snapshots.qt.io/qtcreator-11.0/creator-vcpkg.html)) + +### Axivion + +After you configure access to the [Axivion](https://www.axivion.com) Dashboard +and link a project to an Axivion project in the project settings, Qt Creator +shows annotations of the latest run in the editors and allows you to view some +details on the issues. + +([Documentation](https://doc-snapshots.qt.io/qtcreator-11.0/creator-axivion.html)) + General ------- -* Added a `Terminal` view (QTCREATORBUG-8511) - ([Documentation](https://doc-snapshots.qt.io/qtcreator-11.0/creator-output-panes.html#terminal)) - * Opt-out via `Preferences` > `Terminal` preferences - * Added support for - * different shells, colors, fonts, and multiple tabs - * opening file paths in Qt Creator with `Ctrl+click` (`Cmd+click` on - macOS) -* Added a more spacious "relaxed" toolbar style `Environment > Interface` +* Added a more spacious `Relaxed` toolbar style to `Preferences > Environment > + Interface` * Added a pin button to progress details instead of automatically resetting their position (QTCREATORBUG-28829) * Improved the selection and navigation in the `Issues` view @@ -52,9 +109,6 @@ Editing ### Language Server Protocol -* Added experimental support for GitHub Copilot - ([GitHub documentation](https://github.com/features/copilot)) - ([Qt Creator documentation](https://doc-snapshots.qt.io/qtcreator-11.0/creator-copilot.html)) * Added missing actions for opening the `Call Hierarchy` (QTCREATORBUG-28839, QTCREATORBUG-28842) @@ -70,11 +124,6 @@ Editing * Added the option to create a virtual environment (`venv`) to the Python interpreter selector and the wizard (PYSIDE-2152) -### Markdown - -* Added a Markdown editor with preview (QTCREATORBUG-27883) -* Added a wizard for Markdown files (QTCREATORBUG-29056) - Projects -------- @@ -95,14 +144,6 @@ Projects * Added an option for the interpreter to the wizards -### vcpkg - -* Added experimental support for `vcpkg` - ([vcpgk documentation](https://vcpkg.io/en/)) -* Added an option for the `vcpkg` installation location -* Added a search dialog for packages -* Added a wizard and an editor for `vcpkg.json` files - Debugging --------- @@ -133,10 +174,6 @@ Analyzer * Fixed that a `.clang-tidy` file in the project directory was not used by default (QTCREATORBUG-28852) -### Axivion - -* Added experimental support - Version Control Systems ----------------------- From 37d2240dfc79720c610ebcbdc61c2948a77eaab8 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 9 Jun 2023 09:17:02 +0200 Subject: [PATCH 024/204] Some more Qt deprecation s/type/typeId/ Change-Id: I403af524146f0582709c1264e7517d8769dd723b Reviewed-by: Eike Ziller --- src/libs/utils/json.cpp | 2 +- src/plugins/android/androidconfigurations.cpp | 2 +- src/plugins/android/androidrunnerworker.cpp | 2 +- src/plugins/designer/formeditor.cpp | 2 +- src/plugins/qbsprojectmanager/qbsprofilemanager.cpp | 6 +++--- src/plugins/qmljseditor/quicktoolbar.cpp | 2 +- src/plugins/qtsupport/qtkitinformation.cpp | 2 +- src/plugins/squish/squishwizardpages.cpp | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/libs/utils/json.cpp b/src/libs/utils/json.cpp index 70bbc90990a..5afd4a685b7 100644 --- a/src/libs/utils/json.cpp +++ b/src/libs/utils/json.cpp @@ -65,7 +65,7 @@ QString JsonValue::kindToString(JsonValue::Kind kind) JsonValue *JsonValue::build(const QVariant &variant, JsonMemoryPool *pool) { - switch (variant.type()) { + switch (variant.typeId()) { case QVariant::List: { auto newValue = new (pool) JsonArrayValue; diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 9c444f6e756..82410682c60 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -191,7 +191,7 @@ void AndroidConfig::load(const QSettings &settings) { // user settings QVariant emulatorArgs = settings.value(EmulatorArgsKey, QString("-netdelay none -netspeed full")); - if (emulatorArgs.type() == QVariant::StringList) // Changed in 8.0 from QStringList to QString. + if (emulatorArgs.typeId() == QVariant::StringList) // Changed in 8.0 from QStringList to QString. emulatorArgs = ProcessArgs::joinArgs(emulatorArgs.toStringList()); m_emulatorArgs = emulatorArgs.toString(); m_sdkLocation = FilePath::fromUserInput(settings.value(SDKLocationKey).toString()).cleanPath(); diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 529f7ab0ca7..2f52d694f3c 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -280,7 +280,7 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa m_beforeStartAdbCommands.append(QString("shell %1").arg(shellCmd)); if (auto aspect = runControl->aspect(Constants::ANDROID_POSTFINISHSHELLCMDLIST)) { - QTC_CHECK(aspect->value.type() == QVariant::String); + QTC_CHECK(aspect->value.typeId() == QVariant::String); const QStringList commands = aspect->value.toString().split('\n', Qt::SkipEmptyParts); for (const QString &shellCmd : commands) m_afterFinishAdbCommands.append(QString("shell %1").arg(shellCmd)); diff --git a/src/plugins/designer/formeditor.cpp b/src/plugins/designer/formeditor.cpp index 96e65796500..ab2dd3ddd1e 100644 --- a/src/plugins/designer/formeditor.cpp +++ b/src/plugins/designer/formeditor.cpp @@ -647,7 +647,7 @@ ActionContainer *FormEditorData::createPreviewStyleMenu(QActionGroup *actionGrou QString name = menuId; name += dot; const QVariant data = a->data(); - const bool isDeviceProfile = data.type() == QVariant::Int; + const bool isDeviceProfile = data.typeId() == QVariant::Int; if (isDeviceProfile) { name += deviceProfilePrefix; name += dot; diff --git a/src/plugins/qbsprojectmanager/qbsprofilemanager.cpp b/src/plugins/qbsprojectmanager/qbsprofilemanager.cpp index 2d952513ab8..5a0fb654a3e 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilemanager.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilemanager.cpp @@ -60,7 +60,7 @@ QString toJSLiteral(const QVariant &val) { if (!val.isValid()) return QString("undefined"); - if (val.type() == QVariant::List || val.type() == QVariant::StringList) { + if (val.typeId() == QVariant::List || val.typeId() == QVariant::StringList) { QString res; const auto list = val.toList(); for (const QVariant &child : list) { @@ -71,7 +71,7 @@ QString toJSLiteral(const QVariant &val) res.append(']'); return res; } - if (val.type() == QVariant::Map) { + if (val.typeId() == QVariant::Map) { const QVariantMap &vm = val.toMap(); QString str("{"); for (auto it = vm.begin(); it != vm.end(); ++it) { @@ -82,7 +82,7 @@ QString toJSLiteral(const QVariant &val) str += '}'; return str; } - if (val.type() == QVariant::Bool) + if (val.typeId() == QVariant::Bool) return toJSLiteral(val.toBool()); if (val.canConvert(QVariant::String)) return toJSLiteral(val.toString()); diff --git a/src/plugins/qmljseditor/quicktoolbar.cpp b/src/plugins/qmljseditor/quicktoolbar.cpp index 670dd0ce306..cce60c03cf9 100644 --- a/src/plugins/qmljseditor/quicktoolbar.cpp +++ b/src/plugins/qmljseditor/quicktoolbar.cpp @@ -255,7 +255,7 @@ void QuickToolBar::setProperty(const QString &propertyName, const QVariant &valu { QString stringValue = value.toString(); - if (value.type() == QVariant::Color) + if (value.typeId() == QVariant::Color) stringValue = QLatin1Char('\"') + value.toString() + QLatin1Char('\"'); if (cast(m_node) || cast(m_node)) { diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 18d6d7b9c83..4d57a423ee1 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -337,7 +337,7 @@ int QtKitAspect::qtVersionId(const Kit *k) int id = -1; QVariant data = k->value(QtKitAspect::id(), -1); - if (data.type() == QVariant::Int) { + if (data.typeId() == QVariant::Int) { bool ok; id = data.toInt(&ok); if (!ok) diff --git a/src/plugins/squish/squishwizardpages.cpp b/src/plugins/squish/squishwizardpages.cpp index 70003cb2bf4..33567b11199 100644 --- a/src/plugins/squish/squishwizardpages.cpp +++ b/src/plugins/squish/squishwizardpages.cpp @@ -282,7 +282,7 @@ bool SquishFileGenerator::setup(const QVariant &data, QString *errorMessage) if (data.isNull()) return false; - if (data.type() != QVariant::Map) { + if (data.typeId() != QVariant::Map) { *errorMessage = Tr::tr("Key is not an object."); return false; } From 0f3a92b45a8a5eda32a600f108a2dc2c028b71a8 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 9 Jun 2023 10:37:49 +0200 Subject: [PATCH 025/204] Update qbs submodule to HEAD of 2.0 branch Change-Id: I65d713ee07c4b7c74623b39cd77367e7eb72b623 Reviewed-by: Qt CI Bot Reviewed-by: Christian Stenger --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 1a575d27436..134d6b6666c 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 1a575d27436ef71e999c709b11e6d7a24e57916e +Subproject commit 134d6b6666c1d121b6134a02c4766576705700aa From 35c60cd7b42a83b2c1642e2b32ea7f4f08ac4ad1 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 1 Jun 2023 15:23:53 +0200 Subject: [PATCH 026/204] Incredibuild: Auto-register aspects in build steps Change-Id: Ic36ac230c92df4b18649aa19a57f7a424a593db3 Reviewed-by: Christian Stenger --- src/libs/utils/aspects.cpp | 8 +- src/libs/utils/aspects.h | 6 +- .../incredibuild/buildconsolebuildstep.cpp | 348 +++++++++--------- .../incredibuild/ibconsolebuildstep.cpp | 69 ++-- 4 files changed, 214 insertions(+), 217 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 5ba4922d668..4c824df6015 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -2346,16 +2346,12 @@ void IntegersAspect::setDefaultValue(const QList &value) A text display does not have a real value. */ -TextDisplay::TextDisplay(AspectContainer *container) - : BaseAspect(container), d(new Internal::TextDisplayPrivate) -{} - /*! Constructs a text display showing the \a message with an icon representing type \a type. */ -TextDisplay::TextDisplay(const QString &message, InfoLabel::InfoType type) - : d(new Internal::TextDisplayPrivate) +TextDisplay::TextDisplay(AspectContainer *container, const QString &message, InfoLabel::InfoType type) + : BaseAspect(container), d(new Internal::TextDisplayPrivate) { d->m_message = message; d->m_type = type; diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index b99c28c0bef..297842b3787 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -610,9 +610,9 @@ class QTCREATOR_UTILS_EXPORT TextDisplay : public BaseAspect Q_OBJECT public: - explicit TextDisplay(AspectContainer *container); - TextDisplay(const QString &message = {}, - InfoLabel::InfoType type = InfoLabel::None); + explicit TextDisplay(AspectContainer *container, + const QString &message = {}, + InfoLabel::InfoType type = InfoLabel::None); ~TextDisplay() override; void addToLayout(Layouting::LayoutItem &parent) override; diff --git a/src/plugins/incredibuild/buildconsolebuildstep.cpp b/src/plugins/incredibuild/buildconsolebuildstep.cpp index c28c1cd6769..d654ebd25e1 100644 --- a/src/plugins/incredibuild/buildconsolebuildstep.cpp +++ b/src/plugins/incredibuild/buildconsolebuildstep.cpp @@ -50,6 +50,39 @@ public: BuildConsoleBuildStep(BuildStepList *buildStepList, Id id); void setupOutputFormatter(OutputFormatter *formatter) final; + + TextDisplay t1{this, "" + Tr::tr("Target and Configuration")}; + CommandBuilderAspect commandBuilder{this}; + + TextDisplay t2{this, "" + Tr::tr("Enter the appropriate arguments to your build command.")}; + TextDisplay t3{this, "" + Tr::tr("Make sure the build command's multi-job " + "parameter value is large enough " + "(such as -j200 for the JOM or Make build tools)")}; + BoolAspect keepJobNum{this}; + + TextDisplay t4{this, "" + Tr::tr("IncrediBuild Distribution Control")}; + FilePathAspect profileXml{this}; + BoolAspect avoidLocal{this}; + IntegerAspect maxCpu{this}; + SelectionAspect maxWinVer{this}; + SelectionAspect minWinVer{this}; + + TextDisplay t5{this, "" + Tr::tr("Output and Logging")}; + StringAspect title{this}; + FilePathAspect monFile{this}; + BoolAspect suppressStdOut{this}; + FilePathAspect logFile{this}; + BoolAspect showCmd{this}; + BoolAspect showAgents{this}; + BoolAspect showTime{this}; + BoolAspect hideHeader{this}; + SelectionAspect logLevel{this}; + + TextDisplay t6{this, "" + Tr::tr("Miscellaneous")}; + StringAspect setEnv{this}; + BoolAspect stopOnError{this}; + StringAspect additionalArguments{this}; + BoolAspect openMonitor{this}; }; BuildConsoleBuildStep::BuildConsoleBuildStep(BuildStepList *buildStepList, Id id) @@ -57,230 +90,197 @@ BuildConsoleBuildStep::BuildConsoleBuildStep(BuildStepList *buildStepList, Id id { setDisplayName(Tr::tr("IncrediBuild for Windows")); - addAspect("" + Tr::tr("Target and Configuration")); + commandBuilder.setSettingsKey("IncrediBuild.BuildConsole.CommandBuilder"); - auto commandBuilder = addAspect(this); - commandBuilder->setSettingsKey("IncrediBuild.BuildConsole.CommandBuilder"); + keepJobNum.setSettingsKey("IncrediBuild.BuildConsole.KeepJobNum"); + keepJobNum.setLabel(Tr::tr("Keep original jobs number:")); + keepJobNum.setToolTip(Tr::tr("Forces IncrediBuild to not override the -j command line switch, " + "that controls the number of parallel spawned tasks. The default " + "IncrediBuild behavior is to set it to 200.")); - addAspect("" + Tr::tr("Enter the appropriate arguments to your build command.")); - addAspect("" + Tr::tr("Make sure the build command's multi-job " - "parameter value is large enough " - "(such as -j200 for the JOM or Make build tools)")); + profileXml.setSettingsKey("IncrediBuild.BuildConsole.ProfileXml"); + profileXml.setLabelText(Tr::tr("Profile.xml:")); + profileXml.setExpectedKind(PathChooser::Kind::File); + profileXml.setBaseFileName(PathChooser::homePath()); + profileXml.setHistoryCompleter("IncrediBuild.BuildConsole.ProfileXml.History"); + profileXml.setToolTip(Tr::tr("Defines how Automatic " + "Interception Interface should handle the various processes " + "involved in a distributed job. It is not necessary for " + "\"Visual Studio\" or \"Make and Build tools\" builds, " + "but can be used to provide configuration options if those " + "builds use additional processes that are not included in " + "those packages. It is required to configure distributable " + "processes in \"Dev Tools\" builds.")); - auto keepJobNum = addAspect(); - keepJobNum->setSettingsKey("IncrediBuild.BuildConsole.KeepJobNum"); - keepJobNum->setLabel(Tr::tr("Keep original jobs number:")); - keepJobNum->setToolTip(Tr::tr("Forces IncrediBuild to not override the -j command line switch, " - "that controls the number of parallel spawned tasks. The default " - "IncrediBuild behavior is to set it to 200.")); + avoidLocal.setSettingsKey("IncrediBuild.BuildConsole.AvoidLocal"); + avoidLocal.setLabel(Tr::tr("Avoid local task execution:")); + avoidLocal.setToolTip(Tr::tr("Overrides the Agent Settings dialog Avoid task execution on local " + "machine when possible option. This allows to free more resources " + "on the initiator machine and could be beneficial to distribution " + "in scenarios where the initiating machine is bottlenecking the " + "build with High CPU usage.")); - addAspect("" + Tr::tr("IncrediBuild Distribution Control")); + maxCpu.setSettingsKey("IncrediBuild.BuildConsole.MaxCpu"); + maxCpu.setToolTip(Tr::tr("Determines the maximum number of CPU cores that can be used in a " + "build, regardless of the number of available Agents. " + "It takes into account both local and remote cores, even if the " + "Avoid Task Execution on Local Machine option is selected.")); + maxCpu.setLabel(Tr::tr("Maximum CPUs to utilize in the build:")); + maxCpu.setRange(0, 65536); - auto profileXml = addAspect(); - profileXml->setSettingsKey("IncrediBuild.BuildConsole.ProfileXml"); - profileXml->setLabelText(Tr::tr("Profile.xml:")); - profileXml->setExpectedKind(PathChooser::Kind::File); - profileXml->setBaseFileName(PathChooser::homePath()); - profileXml->setHistoryCompleter("IncrediBuild.BuildConsole.ProfileXml.History"); - profileXml->setToolTip(Tr::tr("Defines how Automatic " - "Interception Interface should handle the various processes " - "involved in a distributed job. It is not necessary for " - "\"Visual Studio\" or \"Make and Build tools\" builds, " - "but can be used to provide configuration options if those " - "builds use additional processes that are not included in " - "those packages. It is required to configure distributable " - "processes in \"Dev Tools\" builds.")); - - auto avoidLocal = addAspect(); - avoidLocal->setSettingsKey("IncrediBuild.BuildConsole.AvoidLocal"); - avoidLocal->setLabel(Tr::tr("Avoid local task execution:")); - avoidLocal->setToolTip(Tr::tr("Overrides the Agent Settings dialog Avoid task execution on local " - "machine when possible option. This allows to free more resources " - "on the initiator machine and could be beneficial to distribution " - "in scenarios where the initiating machine is bottlenecking the " - "build with High CPU usage.")); - - auto maxCpu = addAspect(); - maxCpu->setSettingsKey("IncrediBuild.BuildConsole.MaxCpu"); - maxCpu->setToolTip(Tr::tr("Determines the maximum number of CPU cores that can be used in a " - "build, regardless of the number of available Agents. " - "It takes into account both local and remote cores, even if the " - "Avoid Task Execution on Local Machine option is selected.")); - maxCpu->setLabel(Tr::tr("Maximum CPUs to utilize in the build:")); - maxCpu->setRange(0, 65536); - - auto maxWinVer = addAspect(); - maxWinVer->setSettingsKey("IncrediBuild.BuildConsole.MaxWinVer"); - maxWinVer->setDisplayName(Tr::tr("Newest allowed helper machine OS:")); - maxWinVer->setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); - maxWinVer->setToolTip(Tr::tr("Specifies the newest operating system installed on a helper " - "machine to be allowed to participate as helper in the build.")); + maxWinVer.setSettingsKey("IncrediBuild.BuildConsole.MaxWinVer"); + maxWinVer.setDisplayName(Tr::tr("Newest allowed helper machine OS:")); + maxWinVer.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); + maxWinVer.setToolTip(Tr::tr("Specifies the newest operating system installed on a helper " + "machine to be allowed to participate as helper in the build.")); for (const QString &version : supportedWindowsVersions()) - maxWinVer->addOption(version); + maxWinVer.addOption(version); - auto minWinVer = addAspect(); - minWinVer->setSettingsKey("IncrediBuild.BuildConsole.MinWinVer"); - minWinVer->setDisplayName(Tr::tr("Oldest allowed helper machine OS:")); - minWinVer->setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); - minWinVer->setToolTip(Tr::tr("Specifies the oldest operating system installed on a helper " - "machine to be allowed to participate as helper in the build.")); + minWinVer.setSettingsKey("IncrediBuild.BuildConsole.MinWinVer"); + minWinVer.setDisplayName(Tr::tr("Oldest allowed helper machine OS:")); + minWinVer.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); + minWinVer.setToolTip(Tr::tr("Specifies the oldest operating system installed on a helper " + "machine to be allowed to participate as helper in the build.")); for (const QString &version : supportedWindowsVersions()) - minWinVer->addOption(version); + minWinVer.addOption(version); - addAspect("" + Tr::tr("Output and Logging")); + title.setSettingsKey("IncrediBuild.BuildConsole.Title"); + title.setLabelText(Tr::tr("Build title:")); + title.setDisplayStyle(StringAspect::LineEditDisplay); + title.setToolTip(Tr::tr("Specifies a custom header line which will be displayed in the " + "beginning of the build output text. This title will also be used " + "for the Build History and Build Monitor displays.")); - auto title = addAspect(); - title->setSettingsKey("IncrediBuild.BuildConsole.Title"); - title->setLabelText(Tr::tr("Build title:")); - title->setDisplayStyle(StringAspect::LineEditDisplay); - title->setToolTip(Tr::tr("Specifies a custom header line which will be displayed in the " - "beginning of the build output text. This title will also be used " - "for the Build History and Build Monitor displays.")); + monFile.setSettingsKey("IncrediBuild.BuildConsole.MonFile"); + monFile.setLabelText(Tr::tr("Save IncrediBuild monitor file:")); + monFile.setExpectedKind(PathChooser::Kind::Any); + monFile.setBaseFileName(PathChooser::homePath()); + monFile.setHistoryCompleter(QLatin1String("IncrediBuild.BuildConsole.MonFile.History")); + monFile.setToolTip(Tr::tr("Writes a copy of the build progress file (.ib_mon) to the specified " + "location. If only a folder name is given, a generated GUID will serve " + "as the file name. The full path of the saved Build Monitor will be " + "written to the end of the build output.")); - auto monFile = addAspect(); - monFile->setSettingsKey("IncrediBuild.BuildConsole.MonFile"); - monFile->setLabelText(Tr::tr("Save IncrediBuild monitor file:")); - monFile->setExpectedKind(PathChooser::Kind::Any); - monFile->setBaseFileName(PathChooser::homePath()); - monFile->setHistoryCompleter(QLatin1String("IncrediBuild.BuildConsole.MonFile.History")); - monFile->setToolTip(Tr::tr("Writes a copy of the build progress file (.ib_mon) to the specified " - "location. If only a folder name is given, a generated GUID will serve " - "as the file name. The full path of the saved Build Monitor will be " - "written to the end of the build output.")); + suppressStdOut.setSettingsKey("IncrediBuild.BuildConsole.SuppressStdOut"); + suppressStdOut.setLabel(Tr::tr("Suppress STDOUT:")); + suppressStdOut.setToolTip(Tr::tr("Does not write anything to the standard output.")); - auto suppressStdOut = addAspect(); - suppressStdOut->setSettingsKey("IncrediBuild.BuildConsole.SuppressStdOut"); - suppressStdOut->setLabel(Tr::tr("Suppress STDOUT:")); - suppressStdOut->setToolTip(Tr::tr("Does not write anything to the standard output.")); + logFile.setSettingsKey("IncrediBuild.BuildConsole.LogFile"); + logFile.setLabelText(Tr::tr("Output Log file:")); + logFile.setExpectedKind(PathChooser::Kind::SaveFile); + logFile.setBaseFileName(PathChooser::homePath()); + logFile.setHistoryCompleter(QLatin1String("IncrediBuild.BuildConsole.LogFile.History")); + logFile.setToolTip(Tr::tr("Writes build output to a file.")); - auto logFile = addAspect(); - logFile->setSettingsKey("IncrediBuild.BuildConsole.LogFile"); - logFile->setLabelText(Tr::tr("Output Log file:")); - logFile->setExpectedKind(PathChooser::Kind::SaveFile); - logFile->setBaseFileName(PathChooser::homePath()); - logFile->setHistoryCompleter(QLatin1String("IncrediBuild.BuildConsole.LogFile.History")); - logFile->setToolTip(Tr::tr("Writes build output to a file.")); + showCmd.setSettingsKey("IncrediBuild.BuildConsole.ShowCmd"); + showCmd.setLabel(Tr::tr("Show Commands in output:")); + showCmd.setToolTip(Tr::tr("Shows, for each file built, the command-line used by IncrediBuild " + "to build the file.")); - auto showCmd = addAspect(); - showCmd->setSettingsKey("IncrediBuild.BuildConsole.ShowCmd"); - showCmd->setLabel(Tr::tr("Show Commands in output:")); - showCmd->setToolTip(Tr::tr("Shows, for each file built, the command-line used by IncrediBuild " - "to build the file.")); + showAgents.setSettingsKey("IncrediBuild.BuildConsole.ShowAgents"); + showAgents.setLabel(Tr::tr("Show Agents in output:")); + showAgents.setToolTip(Tr::tr("Shows the Agent used to build each file.")); - auto showAgents = addAspect(); - showAgents->setSettingsKey("IncrediBuild.BuildConsole.ShowAgents"); - showAgents->setLabel(Tr::tr("Show Agents in output:")); - showAgents->setToolTip(Tr::tr("Shows the Agent used to build each file.")); + showTime.setSettingsKey("IncrediBuild.BuildConsole.ShowTime"); + showTime.setLabel(Tr::tr("Show Time in output:")); + showTime.setToolTip(Tr::tr("Shows the Start and Finish time for each file built.")); - auto showTime = addAspect(); - showTime->setSettingsKey("IncrediBuild.BuildConsole.ShowTime"); - showTime->setLabel(Tr::tr("Show Time in output:")); - showTime->setToolTip(Tr::tr("Shows the Start and Finish time for each file built.")); + hideHeader.setSettingsKey("IncrediBuild.BuildConsole.HideHeader"); + hideHeader.setLabel(Tr::tr("Hide IncrediBuild Header in output:")); + hideHeader.setToolTip(Tr::tr("Suppresses IncrediBuild's header in the build output")); - auto hideHeader = addAspect(); - hideHeader->setSettingsKey("IncrediBuild.BuildConsole.HideHeader"); - hideHeader->setLabel(Tr::tr("Hide IncrediBuild Header in output:")); - hideHeader->setToolTip(Tr::tr("Suppresses IncrediBuild's header in the build output")); + logLevel.setSettingsKey("IncrediBuild.BuildConsole.LogLevel"); + logLevel.setDisplayName(Tr::tr("Internal IncrediBuild logging level:")); + logLevel.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); + logLevel.addOption(QString()); + logLevel.addOption("Minimal"); + logLevel.addOption("Extended"); + logLevel.addOption("Detailed"); + logLevel.setToolTip(Tr::tr("Overrides the internal Incredibuild logging level for this build. " + "Does not affect output or any user accessible logging. Used mainly " + "to troubleshoot issues with the help of IncrediBuild support")); - auto logLevel = addAspect(); - logLevel->setSettingsKey("IncrediBuild.BuildConsole.LogLevel"); - logLevel->setDisplayName(Tr::tr("Internal IncrediBuild logging level:")); - logLevel->setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); - logLevel->addOption(QString()); - logLevel->addOption("Minimal"); - logLevel->addOption("Extended"); - logLevel->addOption("Detailed"); - logLevel->setToolTip(Tr::tr("Overrides the internal Incredibuild logging level for this build. " - "Does not affect output or any user accessible logging. Used mainly " - "to troubleshoot issues with the help of IncrediBuild support")); + setEnv.setSettingsKey("IncrediBuild.BuildConsole.SetEnv"); + setEnv.setLabelText(Tr::tr("Set an Environment Variable:")); + setEnv.setDisplayStyle(StringAspect::LineEditDisplay); + setEnv.setToolTip(Tr::tr("Sets or overrides environment variables for the context of the build.")); - addAspect("" + Tr::tr("Miscellaneous")); + stopOnError.setSettingsKey("IncrediBuild.BuildConsole.StopOnError"); + stopOnError.setLabel(Tr::tr("Stop on errors:")); + stopOnError.setToolTip(Tr::tr("When specified, the execution will stop as soon as an error " + "is encountered. This is the default behavior in " + "\"Visual Studio\" builds, but not the default for " + "\"Make and Build tools\" or \"Dev Tools\" builds")); - auto setEnv = addAspect(); - setEnv->setSettingsKey("IncrediBuild.BuildConsole.SetEnv"); - setEnv->setLabelText(Tr::tr("Set an Environment Variable:")); - setEnv->setDisplayStyle(StringAspect::LineEditDisplay); - setEnv->setToolTip(Tr::tr("Sets or overrides environment variables for the context of the build.")); + additionalArguments.setSettingsKey("IncrediBuild.BuildConsole.AdditionalArguments"); + additionalArguments.setLabelText(Tr::tr("Additional Arguments:")); + additionalArguments.setDisplayStyle(StringAspect::LineEditDisplay); + additionalArguments.setToolTip(Tr::tr("Add additional buildconsole arguments manually. " + "The value of this field will be concatenated to the " + "final buildconsole command line")); - auto stopOnError = addAspect(); - stopOnError->setSettingsKey("IncrediBuild.BuildConsole.StopOnError"); - stopOnError->setLabel(Tr::tr("Stop on errors:")); - stopOnError->setToolTip(Tr::tr("When specified, the execution will stop as soon as an error " - "is encountered. This is the default behavior in " - "\"Visual Studio\" builds, but not the default for " - "\"Make and Build tools\" or \"Dev Tools\" builds")); + openMonitor.setSettingsKey("IncrediBuild.BuildConsole.OpenMonitor"); + openMonitor.setLabel(Tr::tr("Open Build Monitor:")); + openMonitor.setToolTip(Tr::tr("Opens Build Monitor once the build starts.")); - auto additionalArguments = addAspect(); - additionalArguments->setSettingsKey("IncrediBuild.BuildConsole.AdditionalArguments"); - additionalArguments->setLabelText(Tr::tr("Additional Arguments:")); - additionalArguments->setDisplayStyle(StringAspect::LineEditDisplay); - additionalArguments->setToolTip(Tr::tr("Add additional buildconsole arguments manually. " - "The value of this field will be concatenated to the " - "final buildconsole command line")); - - auto openMonitor = addAspect(); - openMonitor->setSettingsKey("IncrediBuild.BuildConsole.OpenMonitor"); - openMonitor->setLabel(Tr::tr("Open Build Monitor:")); - openMonitor->setToolTip(Tr::tr("Opens Build Monitor once the build starts.")); - - setCommandLineProvider([=] { + setCommandLineProvider([this] { QStringList args; QString cmd("/Command= %1"); - cmd = cmd.arg(commandBuilder->fullCommandFlag(keepJobNum->value())); + cmd = cmd.arg(commandBuilder.fullCommandFlag(keepJobNum())); args.append(cmd); - if (!profileXml->value().isEmpty()) - args.append("/Profile=" + profileXml->value()); + if (!profileXml().isEmpty()) + args.append("/Profile=" + profileXml().path()); - args.append(QString("/AvoidLocal=%1").arg(avoidLocal->value() ? QString("ON") : QString("OFF"))); + args.append(QString("/AvoidLocal=%1").arg(avoidLocal() ? QString("ON") : QString("OFF"))); - if (maxCpu->value() > 0) - args.append(QString("/MaxCPUs=%1").arg(maxCpu->value())); + if (maxCpu() > 0) + args.append(QString("/MaxCPUs=%1").arg(maxCpu())); - if (!maxWinVer->stringValue().isEmpty()) - args.append(QString("/MaxWinVer=%1").arg(normalizeWinVerArgument(maxWinVer->stringValue()))); + if (!maxWinVer.stringValue().isEmpty()) + args.append(QString("/MaxWinVer=%1").arg(normalizeWinVerArgument(maxWinVer.stringValue()))); - if (!minWinVer->stringValue().isEmpty()) - args.append(QString("/MinWinVer=%1").arg(normalizeWinVerArgument(minWinVer->stringValue()))); + if (!minWinVer.stringValue().isEmpty()) + args.append(QString("/MinWinVer=%1").arg(normalizeWinVerArgument(minWinVer.stringValue()))); - if (!title->value().isEmpty()) - args.append(QString("/Title=" + title->value())); + if (!title().isEmpty()) + args.append("/Title=" + title()); - if (!monFile->value().isEmpty()) - args.append(QString("/Mon=" + monFile->value())); + if (!monFile().isEmpty()) + args.append("/Mon=" + monFile().path()); - if (suppressStdOut->value()) + if (suppressStdOut()) args.append("/Silent"); - if (!logFile->value().isEmpty()) - args.append(QString("/Log=" + logFile->value())); + if (!logFile().isEmpty()) + args.append("/Log=" + logFile().path()); - if (showCmd->value()) + if (showCmd()) args.append("/ShowCmd"); - if (showAgents->value()) + if (showAgents()) args.append("/ShowAgent"); - if (showAgents->value()) + if (showAgents()) args.append("/ShowTime"); - if (hideHeader->value()) + if (hideHeader()) args.append("/NoLogo"); - if (!logLevel->stringValue().isEmpty()) - args.append(QString("/LogLevel=" + logLevel->stringValue())); + if (!logLevel.stringValue().isEmpty()) + args.append("/LogLevel=" + logLevel.stringValue()); - if (!setEnv->value().isEmpty()) - args.append(QString("/SetEnv=" + setEnv->value())); + if (!setEnv().isEmpty()) + args.append("/SetEnv=" + setEnv()); - if (stopOnError->value()) + if (stopOnError()) args.append("/StopOnErrors"); - if (!additionalArguments->value().isEmpty()) - args.append(additionalArguments->value()); + if (!additionalArguments().isEmpty()) + args.append(additionalArguments()); - if (openMonitor->value()) + if (openMonitor()) args.append("/OpenMonitor"); return CommandLine("BuildConsole.exe", args); diff --git a/src/plugins/incredibuild/ibconsolebuildstep.cpp b/src/plugins/incredibuild/ibconsolebuildstep.cpp index 3bd453fdb8c..c53ffad4552 100644 --- a/src/plugins/incredibuild/ibconsolebuildstep.cpp +++ b/src/plugins/incredibuild/ibconsolebuildstep.cpp @@ -28,6 +28,21 @@ public: IBConsoleBuildStep(BuildStepList *buildStepList, Id id); void setupOutputFormatter(OutputFormatter *formatter) final; + + TextDisplay t1{this, "" + Tr::tr("Target and Configuration")}; + CommandBuilderAspect commandBuilder{this}; + BoolAspect keepJobNum{this}; + + TextDisplay t2{this, "" + Tr::tr("Enter the appropriate arguments to your build command.")}; + TextDisplay t3{this, "" + Tr::tr("Make sure the build command's " + "multi-job parameter value is large enough (such as " + "-j200 for the JOM or Make build tools)")}; + + TextDisplay t4{this, "" + Tr::tr("IncrediBuild Distribution Control")}; + + IntegerAspect nice{this}; + BoolAspect forceRemote{this}; + BoolAspect alternate{this}; }; IBConsoleBuildStep::IBConsoleBuildStep(BuildStepList *buildStepList, Id id) @@ -35,52 +50,38 @@ IBConsoleBuildStep::IBConsoleBuildStep(BuildStepList *buildStepList, Id id) { setDisplayName(Tr::tr("IncrediBuild for Linux")); - addAspect("" + Tr::tr("Target and Configuration")); + commandBuilder.setSettingsKey("IncrediBuild.IBConsole.CommandBuilder"); - auto commandBuilder = addAspect(this); - commandBuilder->setSettingsKey("IncrediBuild.IBConsole.CommandBuilder"); + keepJobNum.setSettingsKey("IncrediBuild.IBConsole.KeepJobNum"); + keepJobNum.setLabel(Tr::tr("Keep original jobs number:")); + keepJobNum.setToolTip(Tr::tr("Forces IncrediBuild to not override the -j command line switch, " + "that controls the number of parallel spawned tasks. The default " + "IncrediBuild behavior is to set it to 200.")); - addAspect("" + Tr::tr("Enter the appropriate arguments to your build command.")); - addAspect("" + Tr::tr("Make sure the build command's " - "multi-job parameter value is large enough (such as " - "-j200 for the JOM or Make build tools)")); + nice.setSettingsKey("IncrediBuild.IBConsole.Nice"); + nice.setToolTip(Tr::tr("Specify nice value. Nice Value should be numeric and between -20 and 19")); + nice.setLabel(Tr::tr("Nice value:")); + nice.setRange(-20, 19); - auto keepJobNum = addAspect(); - keepJobNum->setSettingsKey("IncrediBuild.IBConsole.KeepJobNum"); - keepJobNum->setLabel(Tr::tr("Keep original jobs number:")); - keepJobNum->setToolTip(Tr::tr("Forces IncrediBuild to not override the -j command line switch, " - "that controls the number of parallel spawned tasks. The default " - "IncrediBuild behavior is to set it to 200.")); + forceRemote.setSettingsKey("IncrediBuild.IBConsole.Alternate"); + forceRemote.setLabel(Tr::tr("Force remote:")); - addAspect("" + Tr::tr("IncrediBuild Distribution Control")); + alternate.setSettingsKey("IncrediBuild.IBConsole.ForceRemote"); + alternate.setLabel(Tr::tr("Alternate tasks preference:")); - auto nice = addAspect(); - nice->setSettingsKey("IncrediBuild.IBConsole.Nice"); - nice->setToolTip(Tr::tr("Specify nice value. Nice Value should be numeric and between -20 and 19")); - nice->setLabel(Tr::tr("Nice value:")); - nice->setRange(-20, 19); - - auto forceRemote = addAspect(); - forceRemote->setSettingsKey("IncrediBuild.IBConsole.Alternate"); - forceRemote->setLabel(Tr::tr("Force remote:")); - - auto alternate = addAspect(); - alternate->setSettingsKey("IncrediBuild.IBConsole.ForceRemote"); - alternate->setLabel(Tr::tr("Alternate tasks preference:")); - - setCommandLineProvider([=] { + setCommandLineProvider([this] { QStringList args; - if (nice->value() != 0) - args.append(QString("--nice %1 ").arg(nice->value())); + if (nice() != 0) + args.append(QString("--nice %1 ").arg(nice())); - if (alternate->value()) + if (alternate()) args.append("--alternate"); - if (forceRemote->value()) + if (forceRemote()) args.append("--force-remote"); - args.append(commandBuilder->fullCommandFlag(keepJobNum->value())); + args.append(commandBuilder.fullCommandFlag(keepJobNum())); return CommandLine("ib_console", args); }); From 59fe58a60a1744d8d98f583b52557336c0d5f4a5 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 9 Jun 2023 11:34:59 +0200 Subject: [PATCH 027/204] PE: Fix build step layout Change-Id: I3c3ddc6a20d3233a85499a946bf21f284531f8df Reviewed-by: hjk --- src/plugins/projectexplorer/buildstep.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index f4d5fba031c..d896836a500 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -165,7 +165,7 @@ QWidget *BuildStep::createConfigWidget() Layouting::Form form; for (BaseAspect *aspect : std::as_const(*this)) { if (aspect->isVisible()) - form.addItem(aspect); + form.addItems({aspect, Layouting::br()}); } form.addItem(Layouting::noMargin); auto widget = form.emerge(); From 790cabade19d2c35c3c056db3b599dacaeec51c8 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 9 Jun 2023 09:10:42 +0200 Subject: [PATCH 028/204] Incredibuild: Fix quoting of additional command line args Change-Id: I215c330e79b4df6a2b65f774a4e8d7d1a7157973 Reviewed-by: Christian Stenger --- .../incredibuild/buildconsolebuildstep.cpp | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/plugins/incredibuild/buildconsolebuildstep.cpp b/src/plugins/incredibuild/buildconsolebuildstep.cpp index d654ebd25e1..19ac73dd0cf 100644 --- a/src/plugins/incredibuild/buildconsolebuildstep.cpp +++ b/src/plugins/incredibuild/buildconsolebuildstep.cpp @@ -224,66 +224,64 @@ BuildConsoleBuildStep::BuildConsoleBuildStep(BuildStepList *buildStepList, Id id openMonitor.setToolTip(Tr::tr("Opens Build Monitor once the build starts.")); setCommandLineProvider([this] { - QStringList args; + CommandLine cmd("BuildConsole.exe"); - QString cmd("/Command= %1"); - cmd = cmd.arg(commandBuilder.fullCommandFlag(keepJobNum())); - args.append(cmd); + cmd.addArgs(QString("/Command=%1").arg(commandBuilder.fullCommandFlag(keepJobNum())), CommandLine::Raw); if (!profileXml().isEmpty()) - args.append("/Profile=" + profileXml().path()); + cmd.addArg(QString("/Profile=%1").arg(profileXml().path())); - args.append(QString("/AvoidLocal=%1").arg(avoidLocal() ? QString("ON") : QString("OFF"))); + cmd.addArg(QString("/AvoidLocal=%1").arg(avoidLocal() ? QString("ON") : QString("OFF"))); if (maxCpu() > 0) - args.append(QString("/MaxCPUs=%1").arg(maxCpu())); + cmd.addArg(QString("/MaxCPUs=%1").arg(maxCpu())); if (!maxWinVer.stringValue().isEmpty()) - args.append(QString("/MaxWinVer=%1").arg(normalizeWinVerArgument(maxWinVer.stringValue()))); + cmd.addArg(QString("/MaxWinVer=%1").arg(normalizeWinVerArgument(maxWinVer.stringValue()))); if (!minWinVer.stringValue().isEmpty()) - args.append(QString("/MinWinVer=%1").arg(normalizeWinVerArgument(minWinVer.stringValue()))); + cmd.addArg(QString("/MinWinVer=%1").arg(normalizeWinVerArgument(minWinVer.stringValue()))); if (!title().isEmpty()) - args.append("/Title=" + title()); + cmd.addArg("/Title=" + title()); if (!monFile().isEmpty()) - args.append("/Mon=" + monFile().path()); + cmd.addArg("/Mon=" + monFile().path()); if (suppressStdOut()) - args.append("/Silent"); + cmd.addArg("/Silent"); if (!logFile().isEmpty()) - args.append("/Log=" + logFile().path()); + cmd.addArg("/Log=" + logFile().path()); if (showCmd()) - args.append("/ShowCmd"); + cmd.addArg("/ShowCmd"); if (showAgents()) - args.append("/ShowAgent"); + cmd.addArg("/ShowAgent"); if (showAgents()) - args.append("/ShowTime"); + cmd.addArg("/ShowTime"); if (hideHeader()) - args.append("/NoLogo"); + cmd.addArg("/NoLogo"); if (!logLevel.stringValue().isEmpty()) - args.append("/LogLevel=" + logLevel.stringValue()); + cmd.addArg("/LogLevel=" + logLevel.stringValue()); if (!setEnv().isEmpty()) - args.append("/SetEnv=" + setEnv()); + cmd.addArg("/SetEnv=" + setEnv()); if (stopOnError()) - args.append("/StopOnErrors"); + cmd.addArg("/StopOnErrors"); if (!additionalArguments().isEmpty()) - args.append(additionalArguments()); + cmd.addArgs(additionalArguments(), CommandLine::Raw); if (openMonitor()) - args.append("/OpenMonitor"); + cmd.addArg("/OpenMonitor"); - return CommandLine("BuildConsole.exe", args); + return cmd; }); } From 3381a6219a9f2406724ee36a5c0d9ed5e2261aff Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Jun 2023 15:16:35 +0200 Subject: [PATCH 029/204] Debugger test: Automatically sign on macOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "gui" manual test is used for release testing attaching a running application and a core file to the debugger. For this, the application must be signed with the right entitlements. Since ad-hoc signing is sufficient, this doesn't require any setup on the testers computer. So, make this signing automatic. Change-Id: I7042a3091848ee1c9f7f3843507f3ca616d36179 Reviewed-by: Robert Löhning Reviewed-by: Reviewed-by: Christian Stenger --- tests/manual/debugger/gui/CMakeLists.txt | 9 +++++++++ tests/manual/debugger/gui/entitlements.plist | 9 +++++++++ tests/manual/debugger/gui/gui.pro | 2 ++ 3 files changed, 20 insertions(+) create mode 100644 tests/manual/debugger/gui/entitlements.plist diff --git a/tests/manual/debugger/gui/CMakeLists.txt b/tests/manual/debugger/gui/CMakeLists.txt index 21c89f291cb..15c0aeb9491 100644 --- a/tests/manual/debugger/gui/CMakeLists.txt +++ b/tests/manual/debugger/gui/CMakeLists.txt @@ -17,6 +17,15 @@ add_executable(manual_test_debugger_gui ) target_link_libraries(manual_test_debugger_gui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) +if(APPLE) + # codesign in a way that allows attaching a debugger and writing core files + add_custom_command(TARGET manual_test_debugger_gui + POST_BUILD + VERBATIM + COMMAND codesign -f -s "-" --entitlements "${CMAKE_CURRENT_SOURCE_DIR}/entitlements.plist" "$" + ) +endif() + if (NOT QT_CREATOR_API_DEFINED) if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX "/tmp/manual_test_debugger_gui" CACHE PATH "default install path" FORCE) diff --git a/tests/manual/debugger/gui/entitlements.plist b/tests/manual/debugger/gui/entitlements.plist new file mode 100644 index 00000000000..914941775e9 --- /dev/null +++ b/tests/manual/debugger/gui/entitlements.plist @@ -0,0 +1,9 @@ + + + + + + com.apple.security.get-task-allow + + + diff --git a/tests/manual/debugger/gui/gui.pro b/tests/manual/debugger/gui/gui.pro index 887e9cec779..94501d41709 100644 --- a/tests/manual/debugger/gui/gui.pro +++ b/tests/manual/debugger/gui/gui.pro @@ -9,3 +9,5 @@ SOURCES += \ HEADERS += mainwindow.h FORMS += mainwindow.ui + +macos: QMAKE_POST_LINK = codesign -f -s - --entitlements "$${PWD}/entitlements.plist" "$${OUT_PWD}/gui.app" From 6eca1f5dc8f2432efbe809d9bbead1bca10426c4 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 9 Jun 2023 07:56:05 +0200 Subject: [PATCH 030/204] LanguageClient: improve inspector layout Replace the list widget to switch between servers with a combo box on top of the inspector to gain horizontal space for the actual information. Change-Id: Ic50d5dd6a44eeea43caa3d3f9cee621b58d44306 Reviewed-by: Christian Kandeler --- src/plugins/languageclient/lspinspector.cpp | 50 ++++++++++----------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/src/plugins/languageclient/lspinspector.cpp b/src/plugins/languageclient/lspinspector.cpp index 09307a06c3e..31a353c2787 100644 --- a/src/plugins/languageclient/lspinspector.cpp +++ b/src/plugins/languageclient/lspinspector.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -334,7 +335,7 @@ private: QTabWidget * const m_tabWidget; enum class TabIndex { Log, Capabilities, Custom }; - QListWidget *m_clients = nullptr; + QComboBox *m_clients = nullptr; }; void LspInspector::show(const QString &defaultClient) @@ -401,34 +402,34 @@ LspInspectorWidget::LspInspectorWidget(LspInspector *inspector) this, &LspInspectorWidget::updateCapabilities); connect(Core::ICore::instance(), &Core::ICore::coreAboutToClose, this, &QWidget::close); - m_clients = new QListWidget; - m_clients->addItems(inspector->clients()); - m_clients->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::MinimumExpanding); - auto mainLayout = new QVBoxLayout; - auto mainSplitter = new Core::MiniSplitter; - mainSplitter->setOrientation(Qt::Horizontal); - mainSplitter->addWidget(m_clients); - mainSplitter->addWidget(m_tabWidget); - mainSplitter->setStretchFactor(0, 0); - mainSplitter->setStretchFactor(1, 1); + + m_clients = new QComboBox; + m_clients->addItem(Tr::tr("