From a6a14234219e31789864386247296aff37d706d8 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 2 Nov 2021 17:41:36 +0100 Subject: [PATCH 01/32] ClangCodeModel: Fix assertion in clangd timing logger Change-Id: If5134e5160b8278b2d0ef7037a00abe3b4b035ad Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 7efc37a5728..17fe2775074 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -928,6 +928,7 @@ public: m_started = false; qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": took " << m_elapsedMs << " ms in UI thread"; + m_elapsedMs = 0; } void startSubtask() { From 7e99926efd53ccc3cbc5e574874022e989466877 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 2 Nov 2021 16:42:48 +0100 Subject: [PATCH 02/32] CppEditor: Make sure all clangd-related widgets are enabled/disabled ... when the general clangd checkbox is toggled. Change-Id: Icb2503e5e2d66cba4fb81a3dc7a891e8ed694132 Reviewed-by: David Schulz --- .../cppeditor/cppcodemodelsettingspage.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp index 3e899ae01f6..022d4cf6fbf 100644 --- a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp @@ -255,15 +255,16 @@ ClangdSettingsWidget::ClangdSettingsWidget(const ClangdSettings::Data &settingsD layout->addLayout(formLayout); layout->addStretch(1); - const auto toggleEnabled = [=](const bool checked) { - chooserLabel->setEnabled(checked); - d->clangdChooser.setEnabled(checked); - indexingLabel->setEnabled(checked); - d->indexingCheckBox.setEnabled(checked); - autoIncludeHeadersLabel->setEnabled(checked); - d->autoIncludeHeadersCheckBox.setEnabled(checked); - d->threadLimitSpinBox.setEnabled(checked); - d->versionWarningLabel.setEnabled(checked); + static const auto setWidgetsEnabled = [](QLayout *layout, bool enabled, const auto &f) -> void { + for (int i = 0; i < layout->count(); ++i) { + if (QWidget * const w = layout->itemAt(i)->widget()) + w->setEnabled(enabled); + else if (QLayout * const l = layout->itemAt(i)->layout()) + f(l, enabled, f); + } + }; + const auto toggleEnabled = [formLayout](const bool checked) { + setWidgetsEnabled(formLayout, checked, setWidgetsEnabled); }; connect(&d->useClangdCheckBox, &QCheckBox::toggled, toggleEnabled); toggleEnabled(d->useClangdCheckBox.isChecked()); From 05b40bbcd37b8a224d27d4a9d70e1fce74ae7871 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 20 Oct 2021 21:20:03 +0200 Subject: [PATCH 03/32] auto-setup.cmake: Add QT_CREATOR_CONAN_BUILD_POLICY cache variable By having QT_CREATOR_CONAN_BUILD_POLICY as a cache variable the users can change the default value of "missing" to something else like for example "never". Change-Id: I8b447c40d1331976d0ee35ecb34b4d68c5742771 Reviewed-by: Eike Ziller Reviewed-by: Alessandro Portale --- src/share/3rdparty/package-manager/auto-setup.cmake | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/share/3rdparty/package-manager/auto-setup.cmake b/src/share/3rdparty/package-manager/auto-setup.cmake index 3380596f10e..601d95f9dd0 100644 --- a/src/share/3rdparty/package-manager/auto-setup.cmake +++ b/src/share/3rdparty/package-manager/auto-setup.cmake @@ -29,6 +29,7 @@ macro(qtc_auto_setup_conan) if (conanfile_txt AND NOT QT_CREATOR_SKIP_CONAN_SETUP) option(QT_CREATOR_SKIP_CONAN_SETUP "Skip Qt Creator's conan package manager auto-setup" OFF) + set(QT_CREATOR_CONAN_BUILD_POLICY "missing" CACHE STRING "Qt Creator's conan package manager auto-setup build policy. This is used for the BUILD property of cmake_conan_run") # Get conan from Qt SDK set(qt_creator_ini "${CMAKE_CURRENT_LIST_DIR}/../QtProject/QtCreator.ini") @@ -73,6 +74,14 @@ macro(qtc_auto_setup_conan) endif() endif() + set(conanfile_build_policy_file "${CMAKE_BINARY_DIR}/conan-dependencies/conanfile.buildpolicy") + if (EXISTS "${conanfile_build_policy_file}") + file(READ "${conanfile_build_policy_file}" build_policy) + if (NOT "${build_policy}" STREQUAL "${QT_CREATOR_CONAN_BUILD_POLICY}") + set(do_conan_installation ON) + endif() + endif() + if (do_conan_installation) message(STATUS "Qt Creator: conan package manager auto-setup. " "Skip this step by setting QT_CREATOR_SKIP_CONAN_SETUP to ON.") @@ -93,7 +102,7 @@ macro(qtc_auto_setup_conan) CONANFILE \"${conanfile_txt}\" INSTALL_FOLDER \"${CMAKE_BINARY_DIR}/conan-dependencies\" GENERATORS cmake_paths json - BUILD missing + BUILD ${QT_CREATOR_CONAN_BUILD_POLICY} ENV CONAN_CMAKE_TOOLCHAIN_FILE=\"${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake\" )") @@ -108,6 +117,7 @@ macro(qtc_auto_setup_conan) ) if (result EQUAL 0) file(WRITE "${conanfile_timestamp_file}" "${conanfile_timestamp}") + file(WRITE "${conanfile_build_policy_file}" ${QT_CREATOR_CONAN_BUILD_POLICY}) else() message(WARNING "Qt Creator's conan package manager auto-setup failed. Consider setting " "QT_CREATOR_SKIP_CONAN_SETUP to ON and reconfigure to skip this step.") From a8938f891645696bb1f60d10b564834e47eb9785 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 3 Nov 2021 13:37:45 +0100 Subject: [PATCH 04/32] QmlDesigner: Improve icons for layouts and positioners Task-number: QDS-4287 Change-Id: I8e8cd98cdcb335177b72a28f12c121a3bb591f77 Reviewed-by: Brook Cronin Reviewed-by: Thomas Hartmann --- .../images/column-layouts-icon-16px.png | Bin 97 -> 113 bytes .../images/column-layouts-icon.png | Bin 110 -> 118 bytes .../images/column-layouts-icon@2x.png | Bin 118 -> 121 bytes .../images/grid-layouts-icon-16px.png | Bin 107 -> 96 bytes .../images/grid-layouts-icon.png | Bin 122 -> 103 bytes .../images/grid-layouts-icon@2x.png | Bin 124 -> 130 bytes .../images/row-layouts-icon-16px.png | Bin 92 -> 115 bytes .../images/row-layouts-icon.png | Bin 110 -> 120 bytes .../images/row-layouts-icon@2x.png | Bin 118 -> 126 bytes .../images/column-positioner-icon-16px.png | Bin 97 -> 113 bytes .../images/column-positioner-icon.png | Bin 110 -> 118 bytes .../images/column-positioner-icon@2x.png | Bin 108 -> 121 bytes .../images/flow-positioner-icon-16px.png | Bin 116 -> 98 bytes .../images/flow-positioner-icon.png | Bin 114 -> 101 bytes .../images/flow-positioner-icon@2x.png | Bin 129 -> 129 bytes .../images/grid-positioner-icon-16px.png | Bin 102 -> 93 bytes .../images/grid-positioner-icon.png | Bin 127 -> 97 bytes .../images/grid-positioner-icon@2x.png | Bin 137 -> 125 bytes .../images/row-positioner-icon-16px.png | Bin 92 -> 115 bytes .../images/row-positioner-icon.png | Bin 110 -> 120 bytes .../images/row-positioner-icon@2x.png | Bin 118 -> 126 bytes 21 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/plugins/qmldesigner/componentsplugin/images/column-layouts-icon-16px.png b/src/plugins/qmldesigner/componentsplugin/images/column-layouts-icon-16px.png index 1113e8148b843ff34f3664d243ce58cb68edd35a..8d963e2bab543609ad2d306b5dfc501d2a9f0b1a 100644 GIT binary patch delta 94 zcmYc+oFEa&#LU3JkTh5P69WSSXMj(L>;M1%tE#FF?%#j<+5JKW1_s8GAirP+hi5m^ z7#JADJY5_^IAoKbL>>6hJMnURqx4(_e-qO bbP0l+XkKiB%X6 diff --git a/src/plugins/qmldesigner/componentsplugin/images/column-layouts-icon@2x.png b/src/plugins/qmldesigner/componentsplugin/images/column-layouts-icon@2x.png index ffef790cdc0039cb83a84464b0c86e13296d407b..3247384285dbcadb8ac578d550b5256ebc4811ba 100644 GIT binary patch delta 85 zcmXS`oS+%-|NsB0s;Yzg_n&@tzmS1}fw3gWFPOpM*^M*?1_n7#7sn8diOC5HQfru) rbLK2v=pbO4VX>HR>3nBTRtEEooGFzv-7YXNFfe$!`njxgN@xNA@#`PS delta 82 zcmb;{o1p2-z`(Eq46e)c$ucl7FqH)P1v3a_tK5xYU|^8)ba4#P2u_aJnkCA7eO0Kp jghNl@IgR#hG7M#lFff(``2{mLJiC#`z`!8v>Eal|5uN;}zEQAG;)f&0 bdJYD`Br(QYy~TwL3=9mOu6{1-oD!Me8VDNPHb6Mw<&;$S~r64W< delta 103 zcmYeVnjn$H#LU3JFjw+wHUk3#XMj(LD+2?=3NW}X(@(X5gcy=R=fq_BY)5S4F<9u?00-wR! zre-#ib5|~0xL{ylc*in9KKW_S27?3B_&S&w?jJd#>m{iw&%nUI;OXk;vd$@?2>?aj BB!vI~ delta 89 zcmZo-teK!0%)r2~0t~Lp^vNbf9%NGg=7`&;M1%tE#FF?%#j<+5JKW1_s8GAirP+hi5m^ z7#J8NJY5_^IHHpi8k$2L4j7o48ugekt>NWkDEKA%`qh!&?-&>u7(8A5T-G@yGywo@ C3L=#N delta 73 zcmXSpnIPf9!N$PAApiM)A_D`1vZsq`kB#LU3JFjw+wHUk3#XMj(L>;M1%tE#FF?%#j<+5JKW1_s8GAirP+hi5m^ z7#J92JzX3_IHHpi6nM6TF&^Y%yLw?|;zGeIOBc8avoT~^$e%s;ne!|I0|SGntDnm{ Hr-UW|CBP&5 delta 91 zcmb=(n;;R!!N$PA@SxoG2Ll6xsi%u$h(~8~%*Ldn^=wj1YEe>lSqC3%NDvWV=~*n9 wdxfcsk(-&hSz)cNgTe~DWM4fs~R1e diff --git a/src/plugins/qmldesigner/qtquickplugin/images/column-positioner-icon-16px.png b/src/plugins/qmldesigner/qtquickplugin/images/column-positioner-icon-16px.png index 1113e8148b843ff34f3664d243ce58cb68edd35a..8d963e2bab543609ad2d306b5dfc501d2a9f0b1a 100644 GIT binary patch delta 94 zcmYc+oFEa&#LU3JkTh5P69WSSXMj(L>;M1%tE#FF?%#j<+5JKW1_s8GAirP+hi5m^ z7#JADJY5_^IAoKbL>>6hJMnURqx4(_e-qO bbP0l+XkKiB%X6 diff --git a/src/plugins/qmldesigner/qtquickplugin/images/column-positioner-icon@2x.png b/src/plugins/qmldesigner/qtquickplugin/images/column-positioner-icon@2x.png index 68db302e96ad8f53aecca554b080a2c070b9ff2f..3247384285dbcadb8ac578d550b5256ebc4811ba 100644 GIT binary patch delta 102 zcmd0)oFI|N#LU3Jpp_#i!oa}58Q>G*`v3p`s;a7k`}d!IcE6B;fq}6k$S;_|;n|He z1_lN>PZ!4!jfu$#3Q}vBm~-YVUFaZSnqje+Z|QtzPgVx=jGQTzGulyy#N3J delta 89 zcmb=-nII9u$jrdNkb5Tk2m=EHTYyi9>k2UVC~;4Sfq{XsB*-tA!Qt7BGzJC+5l7K_+vffS};P4n4CEjUF2r8Q#1S;1!5jwVQ!~fx*+&&t;ucLK6Vq C-ygjI diff --git a/src/plugins/qmldesigner/qtquickplugin/images/flow-positioner-icon.png b/src/plugins/qmldesigner/qtquickplugin/images/flow-positioner-icon.png index 5bb3e91da3387612ac194b827d910046b588be22..f8fa80970eb586531da4272e130c6c2ca3029169 100644 GIT binary patch delta 65 zcmXR)ouFw`RaJFx|9*iB=N~gLFi3g2IEHXUC;#~W-=3L6eu8?>!z{@eoJlL97}iv1 W&Y0?Fu$zH_fx*+&&t;ucLK6UJ0~o#l delta 78 zcmYc-nxN^)z`(F##fmfcSLiS>Fff(``2{mLJiC#`z`!8o>Eal|5uNrV delta 83 zcmaz|n;_xG!N$PAApiM)A_D`1uBVG*h(&L5%*Ldn^=v8vf`SK695`^mVU2|_b8Er_ oUWtkW7E;{J3_Zt~n3)+Yd=!4CK66uJU|?YIboFyt=akR{08UC8X8-^I diff --git a/src/plugins/qmldesigner/qtquickplugin/images/grid-positioner-icon.png b/src/plugins/qmldesigner/qtquickplugin/images/grid-positioner-icon.png index 7457fbd7e19db77934eb430a5080a1efa920fd95..10d0b69a7bcbc56fdb07dad33c16b0ea7b85e408 100644 GIT binary patch delta 78 zcmbK|D+2?=3K%eE6YOVTU|=o@@(X5Q6!>@R>2C%G z26;~x#}JO0$v^%d{3rjvo=r((O+&@o)nXZIpG3K?D`VLB!ta?8$AUu)3=9mOu6{1- HoD!MJWSpRq$`jxd;>y6lumT2**#!F;7#NsKg8YIR7zO^_ditAzfkD&L#W6(VeDaU~ z|LvLo|Nn0<;n3rFY@wdS8N1l6S)$C>SA}{X=y~`inBl#w=c~Inj|4F=Ffe$!`njxg HN@xNAw5Tg- diff --git a/src/plugins/qmldesigner/qtquickplugin/images/row-positioner-icon-16px.png b/src/plugins/qmldesigner/qtquickplugin/images/row-positioner-icon-16px.png index 9e17cc85bf898b4f0b9a8ba95539883ee76eee4b..1c5be822459c59606c817724d97adc2073935f71 100644 GIT binary patch delta 96 zcmazko*)s;#LU3JkTh5P69WSSXMj(L>;M1%tE#FF?%#j<+5JKW1_s8GAirP+hi5m^ z7#J8NJY5_^IHHpi8k$2L4j7o48ugekt>NWkDEKA%`qh!&?-&>u7(8A5T-G@yGywo@ C3L=#N delta 73 zcmXSpnIPf9!N$PAApiM)A_D`1vZsq`kB#LU3JFjw+wHUk3#XMj(L>;M1%tE#FF?%#j<+5JKW1_s8GAirP+hi5m^ z7#J92JzX3_IHHpi6nM6TF&^Y%yLw?|;zGeIOBc8avoT~^$e%s;ne!|I0|SGntDnm{ Hr-UW|CBP&5 delta 91 zcmb=(n;;R!!N$PA@SxoG2Ll6xsi%u$h(~8~%*Ldn^=wj1YEe>lSqC3%NDvWV=~*n9 wdxfcsk(-&hSz)cNgTe~DWM4fs~R1e From d4efd4a369d5768625bf3d46026500fbe7eeb536 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 3 Nov 2021 19:27:04 +0100 Subject: [PATCH 05/32] Android: Improve prior commit Actually use the version variable that was defined prior to the line. Amends: 0de09fe3a3da4a0a74788644c66f8a41a252c07f Change-Id: Ie05e1a4e1be0fa0729dd1de38fc6b5351d02d380 Reviewed-by: Assam Boudjelthia --- src/plugins/android/androidconfigurations.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 25862d4fc1f..c9e3603dddd 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -848,7 +848,7 @@ bool AndroidConfig::isValidNdk(const QString &ndkLocation) const return false; const QVersionNumber version = ndkVersion(ndkPath); - if (ndkVersion(ndkPath).isNull()) + if (version.isNull()) return false; const FilePath ndkPlatformsDir = ndkPath.pathAppended("platforms"); From cf72b0064ee80287524e5126c710a48806ef6f84 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 2 Nov 2021 16:24:00 +0100 Subject: [PATCH 06/32] Doc: Describe clangd support and configuration Task-number: QTCREATORBUG-26514 Change-Id: I709fb009763fa577ce3887d2107f23dc1daf17eb Reviewed-by: Christian Kandeler --- .../images/qtcreator-options-clangd.png | Bin 0 -> 6895 bytes .../creator-only/creator-clang-codemodel.qdoc | 49 ++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-options-clangd.png diff --git a/doc/qtcreator/images/qtcreator-options-clangd.png b/doc/qtcreator/images/qtcreator-options-clangd.png new file mode 100644 index 0000000000000000000000000000000000000000..a277d076c96ae463a2750fa9169f01805fee828c GIT binary patch literal 6895 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 O1_n=8KbLh*2~7Y)y@h4~ literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc index d190f3c97a4..34f8cc28ba2 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -138,10 +138,6 @@ edit the value for the \uicontrol {Do not index files greater than} check box. To index all files, deselect the check box. - \li To use clangd instead of the built-in code model for features such as - \e {Find References to Symbol}, check the \uicontrol {Use clangd} checkbox. - \note This is an experimental feature, which might not work reliably yet. - \li The \uicontrol {Diagnostic Configuration} field shows the Clang checks to perform. Click the value of the field to open the \uicontrol {Diagnostic Configurations} dialog, where you can @@ -151,6 +147,51 @@ \endlist + \section1 Configuring clangd + + You can use the experimental clangd support instead of libclang to receive + exact and complete results for services such as finding references, + following symbols under cursor, and using the locator, even for complex + constructs that the built-in code model cannot handle correctly. These + improvements are based on clangd's \e index. When you \l{Opening Projects} + {open a project}, clangd scans the source files to generate the index. For + large projects, this can take a while, but the index is persistent and + re-scanning is incremental, so nothing is lost by closing and re-starting + \QC. + + Because clangd considers only the on-disk state of included header files + when parsing a source file, you need to save changes in header files to + have them considered elsewhere for completion, diagnostics, and so on. + Partly for this reason, files that are changed by refactoring actions are + saved automatically. To disable this feature, select \uicontrol Tools > + \uicontrol Options > \uicontrol Environment > \uicontrol System > + \uicontrol {Auto-save files after refactoring}. + + The document outline in the \l{Viewing Defined Types and Symbols} + {Outline} view is backed by clangd's document symbol support, which + makes the results more reliable than before. + + To use clangd for the current project instead of the built-in code model or + Clang: + + \list 1 + \li Select \uicontrol Tools > \uicontrol Options > \uicontrol C++ > + \uicontrol Clang > \uicontrol {Use clangd (EXPERIMENTAL)}. + \image qtcreator-options-clangd.png "clangd options" + \li In \uicontrol {Path to executable}, enter the path to clangd + version 13, or later. + \li For more accurate results during global symbol searches, select + \uicontrol {Enable background indexing}. However, this increases the + CPU load the first time you open the project. + \li Select \uicontrol {Insert header files on completion} to allow + clangd to insert header files as part of symbol completion. + \li By default, clangd attempts to use all unused cores. You can set a + fixed number of cores to use in \uicontrol {Worker thread count}. + \li In \uicontrol {Document update threshold}, specify the amount of + time \QC waits before sending document changes to the server. + If the document changes again while waiting, this timeout is reset. + \endlist + \section1 Clang Checks In addition to using the built-in checks, you can select \uicontrol Copy to From 533ed337065b03cd62f8e42db4425e067ba6856f Mon Sep 17 00:00:00 2001 From: Tapani Mattila Date: Wed, 3 Nov 2021 11:37:48 +0200 Subject: [PATCH 07/32] CMake file generation: Dialog for deselecting generated files Task-number: QDS-5331 Change-Id: Ib1470069ab444dfd792e40fadc338d6452b727ca Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/CMakeLists.txt | 1 + .../qmldesigner/cmakegeneratordialog.cpp | 150 ++++++++++++++++++ .../qmldesigner/cmakegeneratordialog.h | 77 +++++++++ .../qmldesigner/generatecmakelists.cpp | 73 +++++++-- src/plugins/qmldesigner/generatecmakelists.h | 13 +- src/plugins/qmldesigner/qmldesignerplugin.pri | 2 + src/plugins/qmldesigner/qmldesignerplugin.qbs | 2 + 7 files changed, 308 insertions(+), 10 deletions(-) create mode 100644 src/plugins/qmldesigner/cmakegeneratordialog.cpp create mode 100644 src/plugins/qmldesigner/cmakegeneratordialog.h diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 48cdb6f123d..30b8baaf381 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -27,6 +27,7 @@ add_qtc_plugin(QmlDesigner designmodewidget.cpp designmodewidget.h documentmanager.cpp documentmanager.h documentwarningwidget.cpp documentwarningwidget.h + cmakegeneratordialog.h cmakegeneratordialog.cpp generateresource.cpp generateresource.h generatecmakelists.cpp generatecmakelists.h openuiqmlfiledialog.cpp openuiqmlfiledialog.h openuiqmlfiledialog.ui diff --git a/src/plugins/qmldesigner/cmakegeneratordialog.cpp b/src/plugins/qmldesigner/cmakegeneratordialog.cpp new file mode 100644 index 00000000000..67eaa7b510d --- /dev/null +++ b/src/plugins/qmldesigner/cmakegeneratordialog.cpp @@ -0,0 +1,150 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Tooling +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + + +#include "cmakegeneratordialog.h" + +#include +#include +#include +#include +#include + +using namespace Utils; + +namespace QmlDesigner { +namespace GenerateCmake { + +CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePaths &files) + : QDialog() +{ + QVBoxLayout *layout = new QVBoxLayout(this); + setLayout(layout); + + QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); + + auto *okButton = buttons->button(QDialogButtonBox::Ok); + okButton->setDefault(true); + + connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); + + model = new CheckableFileListModel(rootDir, files, this); + + QListView *list = new QListView(this); + list->setModel(model); + + layout->addWidget(list); + layout->addWidget(buttons); +} + +FilePaths CmakeGeneratorDialog::getFilePaths() +{ + FilePaths paths; + + QList items = model->checkedItems(); + for (CheckableStandardItem *item: items) { + paths.append(FilePath::fromString(item->text())); + } + + return paths; +} + +CheckableFileListModel::CheckableFileListModel(const FilePath &rootDir, const FilePaths &files, QObject *parent) + :QStandardItemModel(parent), + rootDir(rootDir) +{ + for (const FilePath &file: files) { + appendRow(new CheckableStandardItem(file.toString(), true)); + } +} + +QList CheckableFileListModel::checkedItems() const +{ + QList allItems = findItems(".*", Qt::MatchRegularExpression); + QList checkedItems; + for (QStandardItem *standardItem : allItems) { + CheckableStandardItem *item = static_cast(standardItem); + if (item->isChecked()) + checkedItems.append(item); + } + + return checkedItems; +} + +CheckableStandardItem::CheckableStandardItem(const QString &text, bool checked) + :QStandardItem(text), + checked(checked) +{ + setFlags(flags() |= Qt::ItemIsUserCheckable); +} + +void CheckableStandardItem::setChecked(bool checked) +{ + this->checked = checked; +} + +bool CheckableStandardItem::isChecked() const +{ + return this->checked; +} + +int CheckableStandardItem::type() const +{ + return QStandardItem::UserType + 0x74d4f1; +} + +QVariant CheckableFileListModel::data(const QModelIndex &index, int role) const +{ + if (index.isValid()) { + if (role == Qt::CheckStateRole) { + CheckableStandardItem *item = static_cast(QStandardItemModel::item(index.row())); + return item->isChecked() ? Qt::Checked : Qt::Unchecked; + } + else if (role == Qt::DisplayRole) { + QVariant data = QStandardItemModel::data(index, role); + QString relativePath = data.toString().remove(rootDir.toString()); + return QVariant(relativePath); + } + } + + return QStandardItemModel::data(index, role); +} + +bool CheckableFileListModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (index.isValid() && role == Qt::CheckStateRole) + { + CheckableStandardItem *item = static_cast(QStandardItemModel::item(index.row())); + item->setChecked(value.value()); + + return true; + } + + return QStandardItemModel::setData(index, value, role); +} + +} +} diff --git a/src/plugins/qmldesigner/cmakegeneratordialog.h b/src/plugins/qmldesigner/cmakegeneratordialog.h new file mode 100644 index 00000000000..17c33a5fa1b --- /dev/null +++ b/src/plugins/qmldesigner/cmakegeneratordialog.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Tooling +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + + +#ifndef CMAKEGENERATORDIALOG_H +#define CMAKEGENERATORDIALOG_H + +#include + +#include +#include + +namespace QmlDesigner { +namespace GenerateCmake { + +class CheckableStandardItem : public QStandardItem +{ +public: + CheckableStandardItem(const QString &text, bool checked = false); + bool isChecked() const; + void setChecked(bool checked); + int type() const; + +private: + bool checked; +}; + +class CheckableFileListModel : public QStandardItemModel +{ +public: + CheckableFileListModel(const Utils::FilePath &rootDir, const Utils::FilePaths &files, QObject *parent = nullptr); + QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex &index, const QVariant &value, int role); + QList checkedItems() const; + +private: + Utils::FilePath rootDir; +}; + +class CmakeGeneratorDialog : public QDialog +{ +public: + CmakeGeneratorDialog(const Utils::FilePath &rootDir, const Utils::FilePaths &files); + Utils::FilePaths getFilePaths(); + +private: + CheckableFileListModel *model; +}; + +} +} + +Q_DECLARE_METATYPE(QmlDesigner::GenerateCmake::CheckableStandardItem) + +#endif // CMAKEGENERATORDIALOG_H diff --git a/src/plugins/qmldesigner/generatecmakelists.cpp b/src/plugins/qmldesigner/generatecmakelists.cpp index fdadd059277..feeaa2fe19e 100644 --- a/src/plugins/qmldesigner/generatecmakelists.cpp +++ b/src/plugins/qmldesigner/generatecmakelists.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "generatecmakelists.h" +#include "cmakegeneratordialog.h" #include #include @@ -39,6 +40,7 @@ #include #include +#include #include #include #include @@ -49,6 +51,13 @@ namespace QmlDesigner { namespace GenerateCmake { +bool operator==(const GeneratableFile &left, const GeneratableFile &right) +{ + return (left.filePath == right.filePath && left.content == right.content); +} + +QVector queuedFiles; + void generateMenuEntry() { Core::ActionContainer *buildMenu = @@ -67,19 +76,65 @@ void generateMenuEntry() void onGenerateCmakeLists() { + queuedFiles.clear(); FilePath rootDir = ProjectExplorer::SessionManager::startupProject()->projectDirectory(); GenerateCmakeLists::generateMainCmake(rootDir); GenerateEntryPoints::generateMainCpp(rootDir); GenerateEntryPoints::generateMainQml(rootDir); + if (showConfirmationDialog(rootDir)) + writeQueuedFiles(); } -bool writeFile(const FilePath &filePath, const QString &fileContent) +void removeUnconfirmedQueuedFiles(const Utils::FilePaths confirmedFiles) { - QFile file(filePath.toString()); - file.open(QIODevice::WriteOnly); - QTextStream stream(&file); - stream << fileContent; - file.close(); + QtConcurrent::blockingFilter(queuedFiles, [confirmedFiles](const GeneratableFile &qf) { + return confirmedFiles.contains(qf.filePath); + }); +} + +bool showConfirmationDialog(const Utils::FilePath &rootDir) +{ + Utils::FilePaths files; + for (GeneratableFile &file: queuedFiles) + files.append(file.filePath); + + CmakeGeneratorDialog dialog(rootDir, files); + if (dialog.exec()) { + Utils::FilePaths confirmedFiles = dialog.getFilePaths(); + removeUnconfirmedQueuedFiles(confirmedFiles); + + return true; + } + + return false; +} + +bool queueFile(const FilePath &filePath, const QString &fileContent) +{ + GeneratableFile file; + file.filePath = filePath; + file.content = fileContent; + queuedFiles.append(file); + + return true; +} + +bool writeQueuedFiles() +{ + for (GeneratableFile &file: queuedFiles) + if (!writeFile(file)) + return false; + + return true; +} + +bool writeFile(const GeneratableFile &file) +{ + QFile fileHandle(file.filePath.toString()); + fileHandle.open(QIODevice::WriteOnly); + QTextStream stream(&fileHandle); + stream << file.content; + fileHandle.close(); return true; } @@ -295,7 +350,7 @@ QStringList getDirectoryTreeResources(const FilePath &dir) void createCmakeFile(const FilePath &dir, const QString &content) { FilePath filePath = dir.pathAppended(CMAKEFILENAME); - GenerateCmake::writeFile(filePath, content); + GenerateCmake::queueFile(filePath, content); } bool isFileBlacklisted(const QString &fileName) @@ -327,7 +382,7 @@ bool generateMainCpp(const FilePath &dir) templatefile.close(); FilePath filePath = dir.pathAppended(MAIN_CPPFILE_NAME); - return GenerateCmake::writeFile(filePath, content); + return GenerateCmake::queueFile(filePath, content); } const char MAIN_QMLFILE_CONTENT[] = "import %1Qml\n\n%2 {\n}\n"; @@ -343,7 +398,7 @@ bool generateMainQml(const FilePath &dir) if (const auto aspect = runConfiguration->aspect()) mainClass = FilePath::fromString(aspect->mainScript()).baseName(); - return GenerateCmake::writeFile(filePath, QString(MAIN_QMLFILE_CONTENT).arg(projectName).arg(mainClass)); + return GenerateCmake::queueFile(filePath, QString(MAIN_QMLFILE_CONTENT).arg(projectName).arg(mainClass)); } } diff --git a/src/plugins/qmldesigner/generatecmakelists.h b/src/plugins/qmldesigner/generatecmakelists.h index 18b28f88d58..d1603a1860b 100644 --- a/src/plugins/qmldesigner/generatecmakelists.h +++ b/src/plugins/qmldesigner/generatecmakelists.h @@ -31,9 +31,20 @@ namespace QmlDesigner { namespace GenerateCmake { +struct GeneratableFile { + Utils::FilePath filePath; + QString content; +}; + +bool operator==(const GeneratableFile &left, const GeneratableFile &right); + void generateMenuEntry(); void onGenerateCmakeLists(); -bool writeFile(const Utils::FilePath &filePath, const QString &fileContent); +void removeUnconfirmedQueuedFiles(const Utils::FilePaths confirmedFiles); +bool showConfirmationDialog(const Utils::FilePath &rootDir); +bool queueFile(const Utils::FilePath &filePath, const QString &fileContent); +bool writeFile(const GeneratableFile &file); +bool writeQueuedFiles(); } namespace GenerateCmakeLists { void generateMainCmake(const Utils::FilePath &rootDir); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pri b/src/plugins/qmldesigner/qmldesignerplugin.pri index 4cf7edf4ba1..cc249ece07a 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pri +++ b/src/plugins/qmldesigner/qmldesignerplugin.pri @@ -6,6 +6,7 @@ HEADERS += $$PWD/qmldesignerconstants.h \ $$PWD/editorproxy.h \ $$PWD/generateresource.h \ $$PWD/generatecmakelists.h \ + $$PWD/cmakegeneratordialog.h \ $$PWD/settingspage.h \ $$PWD/designmodecontext.h \ $$PWD/documentmanager.h \ @@ -22,6 +23,7 @@ SOURCES += $$PWD/qmldesignerplugin.cpp \ $$PWD/editorproxy.cpp \ $$PWD/generateresource.cpp \ $$PWD/generatecmakelists.cpp \ + $$PWD/cmakegeneratordialog.cpp \ $$PWD/settingspage.cpp \ $$PWD/designmodecontext.cpp \ $$PWD/documentmanager.cpp \ diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 80b54747a6e..6a3e76edac4 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -1009,6 +1009,8 @@ Project { "generateresource.h", "generatecmakelists.cpp", "generatecmakelists.h", + "cmakegeneratordialog.cpp", + "cmakegeneratordialog.h", "designersettings.cpp", "designersettings.h", "designmodecontext.cpp", From e95968a20630f08404c57d434e95f80cb140620e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 4 Nov 2021 14:53:31 +0100 Subject: [PATCH 08/32] Update qlitehtml to latest master Get latest fixes in qlitehtml and litehtml Change-Id: Iea46961014bf899bccc71a8cd9360ad6d6743817 Reviewed-by: Jarek Kobus --- src/libs/qlitehtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/qlitehtml b/src/libs/qlitehtml index e6fcc8ddb4e..4931b7aa30f 160000 --- a/src/libs/qlitehtml +++ b/src/libs/qlitehtml @@ -1 +1 @@ -Subproject commit e6fcc8ddb4e435160cca6a94bd7b011fd1698656 +Subproject commit 4931b7aa30f256c20573d283561aa432fecf8f38 From 06410dcb809eab179a1526fc1e33fbc2ef15bf7b Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 4 Nov 2021 16:57:22 +0100 Subject: [PATCH 09/32] CMakePM: Fix importing of Qt projects Amends ca04d9afcde Fixes: QTCREATORBUG-25767 Change-Id: I099662a52bbae40541698edb80ba0576eda70884 Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 3de996bd4da..601ed3a1e70 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -168,7 +168,7 @@ static FilePath qmakeFromCMakeCache(const CMakeConfig &config) "project(qmake-probe LANGUAGES NONE)\n" "\n" "# Bypass Qt6's usage of find_dependency, which would require compiler\n" -"# and source code probing, which slows things unnecessarily" +"# and source code probing, which slows things unnecessarily\n" "file(WRITE \"${CMAKE_SOURCE_DIR}/CMakeFindDependencyMacro.cmake\"\n" "[=[" " macro(find_dependency dep)\n" From 48c30ed76c2faf4c731ec1d3bc9f517f80752cc5 Mon Sep 17 00:00:00 2001 From: Tuomo Pelkonen Date: Wed, 3 Nov 2021 16:47:04 +0200 Subject: [PATCH 10/32] QmlProject: set project languages from application side Even though this does not save the project languages to the .qmlproject file, this is needed for the languages to be synced during runtime. Saving the changes to the .qmlproject file is done in multilanguage-plugin itself. Change-Id: I771a2e68c3e776422e52d40f4b8526c9ae4e84c4 Reviewed-by: Tim Jenssen --- src/plugins/qmlprojectmanager/qmlproject.cpp | 12 ++++++++++++ src/plugins/qmlprojectmanager/qmlproject.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 876fa4e1882..0dc6f5c5a18 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -347,6 +347,12 @@ QStringList QmlBuildSystem::supportedLanguages() const return {}; } +void QmlBuildSystem::setSupportedLanguages(QStringList languages) +{ + if (m_projectItem) + m_projectItem.data()->setSupportedLanguages(languages); +} + QString QmlBuildSystem::primaryLanguage() const { if (m_projectItem) @@ -354,6 +360,12 @@ QString QmlBuildSystem::primaryLanguage() const return {}; } +void QmlBuildSystem::setPrimaryLanguage(QString language) +{ + if (m_projectItem) + m_projectItem.data()->setPrimaryLanguage(language); +} + void QmlBuildSystem::refreshProjectFile() { refresh(QmlBuildSystem::ProjectFile | Files); diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index 64c0cc90ecb..4f347d07e1d 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -89,7 +89,9 @@ public: QStringList customImportPaths() const; QStringList customFileSelectors() const; QStringList supportedLanguages() const; + void setSupportedLanguages(QStringList languages); QString primaryLanguage() const; + void setPrimaryLanguage(QString language); bool forceFreeType() const; bool addFiles(const QStringList &filePaths); From 02b8bb3ac4ed14abfe275e20ac5379eb431159bb Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Tue, 19 Oct 2021 12:54:41 +0200 Subject: [PATCH 11/32] QmlDesigner: Add wizard font icons Task-number: QDS-5284 Change-Id: Ifb1e4128d4ae74396a35566bae2c43017c4e1f34 Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot --- .../imports/StudioTheme/InternalConstants.qml | 15 +++++++++++---- .../imports/StudioTheme/icons.ttf | Bin 18624 -> 20464 bytes .../components/componentcore/theme.h | 7 +++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml index 66f973e1f49..0dff2cba8ba 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml @@ -162,10 +162,17 @@ QtObject { readonly property string visibilityOff: "\u009D" // visibilityOff2 readonly property string visibilityOn: "\u009E" readonly property string wildcard: "\u009F" - readonly property string zoomAll: "\u00A0" - readonly property string zoomIn: "\u00A1" - readonly property string zoomOut: "\u00A2" - readonly property string zoomSelection: "\u00A3" + readonly property string wizardsAutomotive: "\u00A0" + readonly property string wizardsDesktop: "\u00A1" + readonly property string wizardsGeneric: "\u00A2" + readonly property string wizardsMcuEmpty: "\u00A3" + readonly property string wizardsMcuGraph: "\u00A4" + readonly property string wizardsMobile: "\u00A5" + readonly property string wizardsUnknown: "\u00A6" + readonly property string zoomAll: "\u00A7" + readonly property string zoomIn: "\u00A8" + readonly property string zoomOut: "\u00A9" + readonly property string zoomSelection: "\u00AA" readonly property font iconFont: Qt.font({ "family": controlIcons.name, diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf index da54c6b603040d53244e888807ffedd5c7f1f966..403bb7205ade2b259d1d70370c82fe762623eb09 100644 GIT binary patch delta 2332 zcmX>wk@3TP#(D-u1_lORh6V;^h5$FW5Z~zntI8P|{I4)DFv$1^>l;OOq`EOMFh(#i zFeD`BCKl{|r}&$Jf$0td1EW)NS&0IJB2y&;1B(I!0|QHXVsXL${|w9w4E|>r7#KLx zb1KtVtFJ{dFt9o>FxZA5-^1MSMp5Nvx12^*v1_lO(yK@vT zLTDz%i<1~_S$i2~F>p_IVvJ;5wRsMsCZjk=7KB00VqoBdLWap_n6w#JP5!~OOQI7b z-Oa$z1)>=k7}_Cp&*oFi0gPhOYSIg&FUfex?2wg_ZIQhvryv(4w`#Kr>qL`!ZU%<` zcbQ)>RWg_|*fKaXcryeuL^Gr^PmWy>S|`@cFe|R=5~zYa%|#qj4VcGCTdD-BC6(W>}>4zOlshK3kJpLR?IQkC#!%;%~dE zw6v-;qbawtl$zn<>8$LkGN$#)Yt*Eq)TI77$%u-|h$wOK@d@+sF+SrL7LgGV;p67v z6XN4rXzbx>^p_7rGP@Zn|K(FMGE`>zq-4Yx%59*|$jr#Z#>vFYB_N_KAgs*HA;QCF zz{VlK$*C^P#mvdX!NtYR!NJHZFiRTbfJxfStlaY4?7Ym}Y&WIrK|;nNAj?&Fxxltt zi16`&++qRcGcNNm`4?yE;c3FS(8TlaBgRE4hDOT&;#3Tc7#KL<(Z|mq&!Ehp&S1mf z#^B2k$iTozAQV+i6-8C+MHNkrMa4xSp>4}(Xl`m^W~^u=#wx043JG;aBXdO&F=JJA zMRw*~P#9nfiNBSMCI4nIhMDV#^8eH06VnkFU@Q?3{};kIm5bwFA3GQ07GdUpOne-S zcSZlXiZN9}{p5=2snu7m9NWJAq5{8wm^eSb%vC`N3Bj{x*||9XJr?8OQ{m%dU|?ck z_^6?4raf^!jZQcwj71$U={#!6#VOC(^ zXOLmgU@&8_XK)Am7u7#TX67bpApeMn8MA^p${@dqse;)c2~kk0FjW*(XI5udWvmxB zRTLCA7iVr#(r46H`twxDz(A>=Pn1!FubfXrgpaXET7yYbMpj*uv5!{-Ci*v-*(G!J zo}7O_n6Bsl*>k(&0JDOT(w_sM2x4|nHvBVNn1@$bSW;M3Lq=9ZT~0H~p($D)Q?T0~=C&N;1eYs4$o?xPW~JDp9lPuM2f28-xY*dVzJHfwW91fOJO#}Kn9<3=g5(iU#&(5!0!Oh}Z)B!wYAk9l#xBAR zDtg&Ol}$~|%|Ou9L|si;iJgsI-Hy@N2u~^$v6hf#VrLfTWnnR6W@cj*=VoDN=VoVT zGG|uTP{fn^dX0?a4+%-}a&riAv2$^-3b1jqvk7x>vavF=u?w=xD={!^-eOtLq;AG& z4z33o7+4r285cp>tPBE-_n>Sx21zF6$x$}C>NyN28JHOuSvVP37>pS6plntK1;#y4 zHXDNxP5>ls}hS+iXBT!@^kY`GRso+ip$c4prS6R z#n~nK1;|3~sd=eInaLm_VW=wK?Y6i5a))s2^22^05N&^T>t<8 delta 488 zcmew`pYgy%#(D-u1_lORh6V;^h5$FW5Z`GYdZG*r9!nS)7-al|^^GDsQtcTS7$X=M z7!s0m6AN}Hv}ZCfFr8swV020@D^XxjWU6FfU=d(oU|>m4EH3!}pMjZy!D9{s0|Q5T zPGuTn9WTe(7a((?jk%56xgn@xUB_p?_ zLPV8&6$1m~4v<(*esZF_u;mN}1{M(p21dTz#EJrj3k-`G7#J-W7#I}t5_412`}JQj zFxW6KFfhF+$S*FL(SDYlfx+$t0|VzKu;&;V7_?@Z>%{Zhd}ZKfe!;-Nz;M_6@d60V z^mxG}MqAc4hC&98$xe)sjEgtVVbo+~=VJiF$#3 zNd{&HMix#676v26Y$%(RL4k26l+DIq#Q0{jld}>dyCH)CgD!)` Date: Thu, 4 Nov 2021 19:16:23 +0100 Subject: [PATCH 12/32] Android: Enable locating NDK's lldb-server on Windows hosts For Windows, lldb-server on the local file system is not a QDir::Executable, but just a QDir::Files. Task-number: QTCREATORBUG-26281 Change-Id: I4eb91ad9bce62401a945c46a1d2f94b654f9eaa2 Reviewed-by: hjk --- src/plugins/android/androidrunnerworker.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index aa88fdc903c..e2edfdd8065 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -195,7 +195,9 @@ static FilePath debugServer(bool useLldb, const Target *target) const QString abiNeedle = lldbServerArch2(preferredAbi); // The new, built-in LLDB. - QDirIterator it(prebuilt.toString(), QDir::Files|QDir::Executable, QDirIterator::Subdirectories); + const QDir::Filters dirFilter = HostOsInfo::isWindowsHost() ? QDir::Files + : QDir::Files|QDir::Executable; + QDirIterator it(prebuilt.toString(), dirFilter, QDirIterator::Subdirectories); while (it.hasNext()) { it.next(); const QString filePath = it.filePath(); From 083c8029b0c160759238de3d4b24284dfc16cb19 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 5 Nov 2021 06:55:46 +0100 Subject: [PATCH 13/32] QmlDesigner: Fix compile for Qt5 Amends 533ed337065. Change-Id: Ib5471918400bff62792d8fe8a0eaaffa6e8e68e8 Reviewed-by: Ulf Hermann Reviewed-by: Cristian Adam Reviewed-by: hjk --- src/plugins/qmldesigner/cmakegeneratordialog.cpp | 4 ++++ src/plugins/qmldesigner/cmakegeneratordialog.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/cmakegeneratordialog.cpp b/src/plugins/qmldesigner/cmakegeneratordialog.cpp index 67eaa7b510d..59625c6035f 100644 --- a/src/plugins/qmldesigner/cmakegeneratordialog.cpp +++ b/src/plugins/qmldesigner/cmakegeneratordialog.cpp @@ -83,7 +83,11 @@ CheckableFileListModel::CheckableFileListModel(const FilePath &rootDir, const Fi QList CheckableFileListModel::checkedItems() const { +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QList allItems = findItems("*", Qt::MatchWildcard); +#else QList allItems = findItems(".*", Qt::MatchRegularExpression); +#endif QList checkedItems; for (QStandardItem *standardItem : allItems) { CheckableStandardItem *item = static_cast(standardItem); diff --git a/src/plugins/qmldesigner/cmakegeneratordialog.h b/src/plugins/qmldesigner/cmakegeneratordialog.h index 17c33a5fa1b..34201365100 100644 --- a/src/plugins/qmldesigner/cmakegeneratordialog.h +++ b/src/plugins/qmldesigner/cmakegeneratordialog.h @@ -38,7 +38,7 @@ namespace GenerateCmake { class CheckableStandardItem : public QStandardItem { public: - CheckableStandardItem(const QString &text, bool checked = false); + explicit CheckableStandardItem(const QString &text = QString(), bool checked = false); bool isChecked() const; void setChecked(bool checked); int type() const; From b7853efaf3a3e2d6b6ae0c77ddd886934b1ba234 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 11 Aug 2021 15:37:13 +0200 Subject: [PATCH 14/32] Re-enable QWebEngine help viewer backend for Qt 6.2 Fixes: QTCREATORBUG-26380 Change-Id: I8aa31bebd5a8a20f664a17bca2f657fcfac4b1f5 Reviewed-by: Tim Jenssen --- src/plugins/help/CMakeLists.txt | 7 +------ src/plugins/help/webenginehelpviewer.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/plugins/help/CMakeLists.txt b/src/plugins/help/CMakeLists.txt index e63599eb07e..09050db7b96 100644 --- a/src/plugins/help/CMakeLists.txt +++ b/src/plugins/help/CMakeLists.txt @@ -49,12 +49,7 @@ extend_qtc_plugin(Help macwebkithelpviewer.mm ) -set(BUILD_HELPVIEWERBACKEND_QTWEBENGINE_DEFAULT YES) -if (Qt6_FOUND) - set(BUILD_HELPVIEWERBACKEND_QTWEBENGINE_DEFAULT NO) -endif () - -option(BUILD_HELPVIEWERBACKEND_QTWEBENGINE "Build QtWebEngine based help viewer backend." ${BUILD_HELPVIEWERBACKEND_QTWEBENGINE_DEFAULT}) +option(BUILD_HELPVIEWERBACKEND_QTWEBENGINE "Build QtWebEngine based help viewer backend." YES) find_package(Qt5 COMPONENTS WebEngineWidgets QUIET) extend_qtc_plugin(Help CONDITION BUILD_HELPVIEWERBACKEND_QTWEBENGINE AND TARGET Qt5::WebEngineWidgets diff --git a/src/plugins/help/webenginehelpviewer.cpp b/src/plugins/help/webenginehelpviewer.cpp index 65d80c4d30c..7ece25833ff 100644 --- a/src/plugins/help/webenginehelpviewer.cpp +++ b/src/plugins/help/webenginehelpviewer.cpp @@ -37,7 +37,11 @@ #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0) +#include +#else #include +#endif #include #include #include @@ -335,7 +339,11 @@ bool WebView::eventFilter(QObject *src, QEvent *e) void WebView::contextMenuEvent(QContextMenuEvent *event) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0) + QMenu *menu = createStandardContextMenu(); +#else QMenu *menu = page()->createStandardContextMenu(); +#endif // insert Open as New Page etc if OpenLinkInThisWindow is also there const QList actions = menu->actions(); auto it = std::find(actions.cbegin(), actions.cend(), @@ -344,7 +352,11 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) // insert after ++it; QAction *before = (it == actions.cend() ? 0 : *it); +#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0) + QUrl url = lastContextMenuRequest()->linkUrl(); +#else QUrl url = page()->contextMenuData().linkUrl(); +#endif if (m_viewer->isActionVisible(HelpViewer::Action::NewPage)) { auto openLink = new QAction(QCoreApplication::translate("HelpViewer", Constants::TR_OPEN_LINK_AS_NEW_PAGE), menu); From ae8db2d55aa170c0d8e239e5ce539d0e5c5de109 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 4 Nov 2021 14:20:14 +0100 Subject: [PATCH 15/32] QmlDesigner: Fix build if Qt::Svg is not installed Make presence of the Qt::Svg target a condition for building QmlDesigner. Fixes CMake Error at cmake/QtCreatorAPI.cmake:442 (add_library): Target "QmlDesigner" links to target "Qt5::Svg" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing? Call Stack (most recent call first): src/plugins/qmldesigner/CMakeLists.txt:6 (add_qtc_plugin) Amends: 14c4f257fe7e9ef5953e60dacca36b7140454328 Change-Id: Iea2f75e72e5d8f8460b3ee9957ffcf54471e029c Reviewed-by: Eike Ziller --- src/plugins/qmldesigner/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 30b8baaf381..8af14b2550e 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -4,7 +4,7 @@ if (APPLE) endif() add_qtc_plugin(QmlDesigner - CONDITION TARGET Qt5::QuickWidgets + CONDITION TARGET Qt5::QuickWidgets AND TARGET Qt5::Svg DEPENDS QmlJS LanguageUtils QmlEditorWidgets AdvancedDockingSystem Qt5::QuickWidgets Qt5::CorePrivate Sqlite Qt5::Xml Qt5::Svg From 14effaf9cb5ac0491c877de1ea565967b50e304d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 4 Nov 2021 19:49:57 +0100 Subject: [PATCH 16/32] Allow clearing the wizards path The QmlDesigner now depends on the CppEditor plugin and the CppEditor plugin enables most of the C++ related wizards. The easiest solution is to simply clear the wizard paths before setting the QDS specific path. Change-Id: I7ee6c84693053e6ad32ec28a6cf262dee615992f Reviewed-by: Qt CI Bot Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp | 5 +++++ src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index 31155c276c0..d460995aa81 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -494,6 +494,11 @@ void JsonWizardFactory::addWizardPath(const FilePath &path) searchPaths().append(path); } +void JsonWizardFactory::clearWizardPaths() +{ + searchPaths().clear(); +} + void JsonWizardFactory::setVerbose(int level) { m_verbose = level; diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h index d69aaa00f0b..2ecabe6bc3d 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h @@ -51,6 +51,7 @@ class PROJECTEXPLORER_EXPORT JsonWizardFactory : public Core::IWizardFactory public: // Add search paths for wizard.json files. All subdirs are going to be checked. static void addWizardPath(const Utils::FilePath &path); + static void clearWizardPaths(); // actual interface of the wizard factory: class Generator { From 39374307f19dccf8d7b72f757ec5ae0332dbffc6 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 4 Nov 2021 15:05:31 +0200 Subject: [PATCH 17/32] QmlDesigner: Hide items with non-2D Item parents on form editor Items that do not have 2D Item parent, such as 2D items embedded into a 3D scene should not have form editor items created for them. Fixes: QDS-5356 Change-Id: I11e38c99718977dcb94152925fcdf2d2caf57c9d Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot --- .../components/formeditor/formeditorview.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 187bc4ca17f..a72fcb1387c 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -326,13 +326,15 @@ void FormEditorView::propertiesAboutToBeRemoved(const QList& p m_currentTool->itemsAboutToRemoved(removedItems); } -static inline bool hasNodeSourceParent(const ModelNode &node) +static inline bool hasNodeSourceOrNonItemParent(const ModelNode &node) { if (node.hasParentProperty() && node.parentProperty().parentModelNode().isValid()) { ModelNode parent = node.parentProperty().parentModelNode(); - if (parent.nodeSourceType() != ModelNode::NodeWithoutSource) + if (parent.nodeSourceType() != ModelNode::NodeWithoutSource + || !QmlItemNode::isItemOrWindow(parent)) { return true; - return hasNodeSourceParent(parent); + } + return hasNodeSourceOrNonItemParent(parent); } return false; } @@ -867,7 +869,7 @@ void FormEditorView::addOrRemoveFormEditorItem(const ModelNode &node) removeNodeFromScene(itemNode); } }; - if (hasNodeSourceParent(node)) { + if (hasNodeSourceOrNonItemParent(node)) { removeItemFromScene(); } else if (itemNode.isValid()) { if (node.nodeSourceType() == ModelNode::NodeWithoutSource) { From 61c8895da383f0cecf19ef62985f5a10cd9be89d Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 4 Nov 2021 17:13:03 +0100 Subject: [PATCH 18/32] Doc: Describe new search options Update screenshots. Task-number: QTCREATORBUG-26278 Change-Id: I6db12622fc207a6ed6d61da4f27f6ba469d6d307 Reviewed-by: Eike Ziller --- .../images/qtcreator-search-allprojects.png | Bin 14387 -> 8271 bytes .../images/qtcreator-search-filesystem.png | Bin 20861 -> 11041 bytes .../images/qtcreator-searchresults.png | Bin 10297 -> 19626 bytes doc/qtcreator/src/editors/creator-search.qdoc | 9 ++++++++- 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/qtcreator/images/qtcreator-search-allprojects.png b/doc/qtcreator/images/qtcreator-search-allprojects.png index c48cd50b47299ffe91c701d4e306dd72e309d2fb..c442572f99653a82df593e017f8bdf430baeba92 100644 GIT binary patch literal 8271 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 F2>?jm6Dj}z literal 14387 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 diff --git a/doc/qtcreator/images/qtcreator-search-filesystem.png b/doc/qtcreator/images/qtcreator-search-filesystem.png index b8a886c9c947e4d8ec10363fa7d11c3e3ef8a4de..df344a79e33f74b67b7f15189ef9b1c0c10cf55c 100644 GIT binary patch literal 11041 zcmeAS@N?(olHy`uVBq!ia0y~yU|P$-z$n4N#K6Gt^J2tu1_rGco-U3d6}R5b&7Lgd zzH`C(_z1CxmIK9%$M~2o+}$*DqI>b3tjs*yO*MkkRO731CYV?Y+TB>tTsY^2qQptF zZ7H)qu*p0T>N)gdhApGaZ|RG2Z|>S3c>YiHxA3>M)nRF2rKP2%=S$9hKJvP-G%WPm z(%r9WwTyRv^who=~1`-zsY~{c^DWNzR6WEFfcI4frtu*H${5!`_6bWFfiCK z@V_{8-PR(xVQtYRh7S$4<(mbVD}KM-o_}vo->d)s_vq21huis2$Iq<$eAfK?CawvWF8z2i+2115z)G&*WtsYeZ%d1|sha+K zd-Z0|PQ$;sM%B*MkN9@y-?zKZoU&-jTdy`@&WOm!m&+$TeVQ8B$aI!d_0!+?_5Xi9 zpKs3lpjA9>#>|t5&$xcir>;G3iWlGieeb)9uidvB z$&VjD{(HsP(D37n#ry{-QxQ{&wVel;*|f-OKb|lSr0E= zy7cz;_N#~HerZ@Jz4;;IC(jV$vU<<&N4D@2StPDJm-3^#AX4 zuXFS5^+mn5vi8|p{jrPwdelRu@^`kUw(CRZ$!QFd!Ub<`Y<#h3YOwCh|FiG^c{cz5 zpXWvF={;N6V|Ew3eQa_5+w>ClNt@VTGtR$pfcZcbbN!Qv?*D#W-+$^p)AzS4+%1?t z@0)T>|AF14*X11BCn{Xb$uE)Jv3=_8?f=F0T?_k=XEnXa=<&D7Is6@IucfzMwaoVY z@8#aSd&S1@SHCvs*S_?Q|8YqC-|Tju6Q^x_ox|Sk{eCZfer=fCbk&VhOF4q3hG<;% zdTL!~^n1_GQ=+PG8GGFhe`m1V_*&jhK{4s$?)!i9u2(piER18l#k%NR&$@{(y8bh@#F{1~_QVFr`RHqA5izTO!9u=;(i%)V=3 z9H~dOHSco#Yv;9LxTNynxc$FEL(vbm4)6Z_zuPwD`xC~Gv5tF{T`H|Af3Ds>J411^ z|E1mUk8o$bys<+&(p-zR^Q)1~fr9Rd=l<`^7vs14u^_F!{QW&sRm11Ux%p4H$^BiL z`}q6*|9{Q*edPVG^u^ZUmh`;3UoRJa=boXW-=a6&-@{G0Pi_AE z&!0aV)xNv4b6&`S{a1g_y!Xdwvz7UB_9I3UYUYFmmDW5r{It&Mkb-u)bn#?o;V->a zs;6e{v~`HzI7?39{rA)Q``0Y}6aVLt_@@sSw`OYedVS-b@|1DXzx%b{V7e0Xrs zFu!8id&b{3WoLgde0}7#vu2Wb&WtZxUu*Aqvpd#9Q%=D4eY@&M@?4nb8uq)tSaqTU!`3Wg_n7wg#p3=gQ}pMvNgnxk zRKLz}ccun&{hSAn`|aa;3!B3DXUv}6UGwN+yZpJE8$O=1et+WRpLgZ^UoWpWZu>F0 zuksh`CH?vDnCbuy-_H%6 zhLy8DzgW)NE}gyKL66_#WyXb2hkV

1UONj4erC(M2uuD6VK3tU|GK`6-NSs( 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 literal 20861 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ìPF{t(%`c7thLi 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 WtPY4em4i+mWbkzLb6Mw<&;$UTo13oy diff --git a/doc/qtcreator/images/qtcreator-searchresults.png b/doc/qtcreator/images/qtcreator-searchresults.png index 8c0a0b0ebb90f7b96c4dc190f84f53a548d3a80e..3e2bc2f53096cd8ad1d99cbae3ff55a4ae37ecd4 100644 GIT binary patch literal 19626 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 literal 10297 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 JS?83{1ORprbz=Yk diff --git a/doc/qtcreator/src/editors/creator-search.qdoc b/doc/qtcreator/src/editors/creator-search.qdoc index fb11d9c0e01..887ae4cf3b1 100644 --- a/doc/qtcreator/src/editors/creator-search.qdoc +++ b/doc/qtcreator/src/editors/creator-search.qdoc @@ -116,7 +116,8 @@ \section1 Advanced Search - To search through projects, files on a file system or currently open files: + To search through projects, files on a file system, files in all project + directories, or currently open files: \list 1 @@ -136,6 +137,9 @@ \li \uicontrol {Current Project} searches from the project you are currently editing. + \li \uicontrol {Files in All Project Directories} searches from + all project directories. + \li \uicontrol {Files in File System} recursively searches from the selected directory. @@ -206,6 +210,9 @@ To clear the search results, select the \inlineimage clean_pane_small.png (\uicontrol Clear) button. + To expand and collapse the search results, select the + \uicontrol {Expand All} button. + To start a new search, select the \inlineimage qtcreator-new-search-icon.png (\uicontrol {New Search}) button. From b19f236c24e8106d6168a44136d95a27a4debfee Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 4 Nov 2021 17:09:50 +0100 Subject: [PATCH 19/32] Doc: Describe new Project and File System menu commands - Show some accidentally hidden information in Qt Creator Manual Task-number: QTCREATORBUG-26278 Change-Id: Ia611633d52e4b012a40d7be548313e62f8ce3683 Reviewed-by: Eike Ziller --- .../creator-file-system-view.qdoc | 14 ++++++++++--- .../user-interface/creator-projects-view.qdoc | 21 ++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc index 630c0a1996c..87a62b46171 100644 --- a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc @@ -38,6 +38,9 @@ \uicontrol Design mode: \image qtcreator-filesystem-view-design.png "File System view in the Design mode" + \else + \image qtcreator-filesystem-view.png "File System view in the sidebar" + \endif To move to the root directory of the file system, select \uicontrol Computer in the menu (1). Select \uicontrol Home to move to the user's home @@ -89,14 +92,19 @@ \li Collapse all open folders. \endlist - \section1 File System View in Sidebar - \endif + \section1 File System View Toolbar + \if defined(qtdesignstudio) In the \uicontrol Edit and \uicontrol Debug mode, the \uicontrol {File System} view is displayed in the \l{Working with Sidebars} - {sidebar}. It has a toolbar with additional options: + {sidebar}. It has a toolbar with additional options. \image qtcreator-filesystem-view.png "File System view in the sidebar" + \else + The toolbar in the \uicontrol {File System} view contains additional + options. + \endif + To manage view contents, select \inlineimage filtericon.png (\uicontrol Options): diff --git a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc index cc9f5cbcfe4..558296a0bb8 100644 --- a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc @@ -45,6 +45,9 @@ \uicontrol Design mode: \image qtcreator-projects-view-design.png "Projects view in the Design mode" + \else + \image qtcreator-projects-view-edit.png "Projects view in the sidebar" + \endif You can use the project tree in the following ways: @@ -97,23 +100,29 @@ \li Expand or collapse the tree view to show or hide all files and folders. \li Close all files in a project. - \li Close projects. By default, all files in the project are also + \li Close the selected project or all projects except the selected + one. By default, all files in the projects are also closed. To keep them open, deselect the \uicontrol Tools > \uicontrol Options > \uicontrol {Build & Run} > \uicontrol General > \uicontrol {Close source files along with project} check box. \endlist For managing files and directories, the same functions are available as in - the \l {File System} view. + the \l {File System} view. To view a project in it, select + \uicontrol {Show in File System View}. - \section1 Projects View in Sidebar - \endif + \section1 Projects View Toolbar + \if defined(qtdesignstudio) In the \uicontrol Edit and \uicontrol Debug mode, the \uicontrol Projects view is displayed in the \l{Working with Sidebars}{sidebar}. It has a - toolbar with additional options: + toolbar with additional options. \image qtcreator-projects-view-edit.png "Projects view in the sidebar" + \else + The toolbar in the \uicontrol Projects view contains additional options. + \endif + To filter view contents, select \inlineimage filtericon.png (\uicontrol {Filter Tree}): @@ -141,9 +150,7 @@ (currently qmake and Qbs). The faithful display of the project structure allows to specify exactly where a new file should be placed in the build system. - \endif - \if defined(qtcreator) If the project is under version control, information from the version control system might be displayed in brackets after the project name. This is currently implemented for Git (the branch name or a tag is From a7c8c97a688df40a2ce4a65aaf2c910f012570f8 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 4 Nov 2021 18:00:32 +0100 Subject: [PATCH 20/32] Android: FilePathify part of debugger abi detection Change-Id: I3abbc780c1e1301db4c6d367dcdf1dcf8cbf556d Reviewed-by: Alessandro Portale --- src/plugins/android/androidmanager.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 16ff0dc5139..df77eb31a13 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -418,17 +418,18 @@ static QString preferredAbi(const QStringList &appAbis, const Target *target) QString AndroidManager::apkDevicePreferredAbi(const Target *target) { - auto libsPath = androidBuildDirectory(target).pathAppended("libs"); + const FilePath libsPath = androidBuildDirectory(target).pathAppended("libs"); if (!libsPath.exists()) { if (const ProjectNode *node = currentProjectNode(target)) return preferredAbi(node->data(Android::Constants::AndroidAbis).toStringList(), target); } QStringList apkAbis; - const auto libsPaths = QDir{libsPath.toString()}.entryList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const auto &abi : libsPaths) - if (!QDir{libsPath.pathAppended(abi).toString()}.entryList(QStringList("*.so"), QDir::Files | QDir::NoDotAndDotDot).isEmpty()) - apkAbis << abi; + const FilePaths libsPaths = libsPath.dirEntries(QDir::Dirs | QDir::NoDotAndDotDot); + for (const FilePath &abiDir : libsPaths) { + if (!abiDir.dirEntries(QStringList("*.so"), QDir::Files | QDir::NoDotAndDotDot).isEmpty()) + apkAbis << abiDir.fileName(); + } return preferredAbi(apkAbis, target); } From e96c664fcefc45a0c9d19b80c38dfd4975625325 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 3 Nov 2021 12:22:22 +0100 Subject: [PATCH 21/32] Editor: Fix drop position of drag and drop operation Change-Id: I6649b0506e06bccb681c66afc91ad85f763206c4 Reviewed-by: Christian Stenger --- src/plugins/texteditor/texteditor.cpp | 28 +++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 59ac0bba32c..12f6c04c5a7 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -7378,21 +7378,25 @@ void TextEditorWidget::insertFromMimeData(const QMimeData *source) void TextEditorWidget::dropEvent(QDropEvent *e) { const QMimeData *mime = e->mimeData(); + if (!canInsertFromMimeData(mime)) + return; + // Update multi text cursor before inserting data + MultiTextCursor cursor = multiTextCursor(); + cursor.beginEditBlock(); + const QTextCursor eventCursor = cursorForPosition(e->pos()); + if (e->dropAction() == Qt::MoveAction) + cursor.removeSelectedText(); + cursor.setCursors({eventCursor}); + setMultiTextCursor(cursor); + QMimeData *mimeOverwrite = nullptr; if (mime && (mime->hasText() || mime->hasHtml())) { - QMimeData *mimeOverwrite = duplicateMimeData(mime); + mimeOverwrite = duplicateMimeData(mime); mimeOverwrite->setProperty(dropProperty, true); - auto dropOverwrite = new QDropEvent(e->pos(), - e->possibleActions(), - mimeOverwrite, - e->mouseButtons(), - e->keyboardModifiers()); - QPlainTextEdit::dropEvent(dropOverwrite); - e->setAccepted(dropOverwrite->isAccepted()); - delete dropOverwrite; - delete mimeOverwrite; - } else { - QPlainTextEdit::dropEvent(e); + mime = mimeOverwrite; } + insertFromMimeData(mime); + delete mimeOverwrite; + cursor.endEditBlock(); } QMimeData *TextEditorWidget::duplicateMimeData(const QMimeData *source) From fe9e8417f202fa26117b7484cb8c11bc40b97483 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 3 Nov 2021 12:52:32 +0100 Subject: [PATCH 22/32] Editor: Fix drop location marker Change-Id: Id63ff9e8089fd8aaf38fb61ff6d79384a60135d7 Reviewed-by: Christian Stenger --- src/plugins/texteditor/texteditor.cpp | 55 ++++++++++++++++++++++----- src/plugins/texteditor/texteditor.h | 2 + 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 12f6c04c5a7..7a769703895 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -768,6 +768,7 @@ public: bool m_markDragging = false; QCursor m_markDragCursor; TextMark* m_dragMark = nullptr; + QTextCursor m_dndCursor; QScopedPointer m_clipboardAssistProvider; @@ -4298,9 +4299,18 @@ void TextEditorWidgetPrivate::addCursorsPosition(PaintEventData &data, QPainter &painter, const PaintEventBlockData &blockData) const { - for (const QTextCursor &cursor : m_cursors) { - if (blockContainsCursor(blockData, cursor)) - data.cursors.append(generateCursorData(cursor.positionInBlock(), data, blockData, painter)); + if (!m_dndCursor.isNull()) { + if (blockContainsCursor(blockData, m_dndCursor)) { + data.cursors.append( + generateCursorData(m_dndCursor.positionInBlock(), data, blockData, painter)); + } + } else { + for (const QTextCursor &cursor : m_cursors) { + if (blockContainsCursor(blockData, cursor)) { + data.cursors.append( + generateCursorData(cursor.positionInBlock(), data, blockData, painter)); + } + } } } @@ -4377,13 +4387,17 @@ void TextEditorWidget::paintEvent(QPaintEvent *e) d->paintCurrentLineHighlight(data, painter); - bool drawCursor = d->m_cursorVisible - && Utils::anyOf(d->m_cursors, - [&](const QTextCursor &cursor) { - return blockContainsCursor(blockData, cursor); - }); - - bool drawCursorAsBlock = drawCursor && overwriteMode(); + bool drawCursor = false; + bool drawCursorAsBlock = false; + if (d->m_dndCursor.isNull()) { + drawCursor = d->m_cursorVisible + && Utils::anyOf(d->m_cursors, [&](const QTextCursor &cursor) { + return blockContainsCursor(blockData, cursor); + }); + drawCursorAsBlock = drawCursor && overwriteMode(); + } else { + drawCursor = blockContainsCursor(blockData, d->m_dndCursor); + } if (drawCursorAsBlock) { for (const QTextCursor &cursor : multiTextCursor()) { @@ -7375,8 +7389,29 @@ void TextEditorWidget::insertFromMimeData(const QMimeData *source) setMultiTextCursor(cursor); } +void TextEditorWidget::dragLeaveEvent(QDragLeaveEvent *) +{ + const QRect rect = cursorRect(d->m_dndCursor); + d->m_dndCursor = QTextCursor(); + if (!rect.isNull()) + viewport()->update(rect); +} + +void TextEditorWidget::dragMoveEvent(QDragMoveEvent *e) +{ + const QRect rect = cursorRect(d->m_dndCursor); + d->m_dndCursor = cursorForPosition(e->pos()); + if (!rect.isNull()) + viewport()->update(rect); + viewport()->update(cursorRect(d->m_dndCursor)); +} + void TextEditorWidget::dropEvent(QDropEvent *e) { + const QRect rect = cursorRect(d->m_dndCursor); + d->m_dndCursor = QTextCursor(); + if (!rect.isNull()) + viewport()->update(rect); const QMimeData *mime = e->mimeData(); if (!canInsertFromMimeData(mime)) return; diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index 5811f466e43..9d71130e742 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -531,6 +531,8 @@ protected: QMimeData *createMimeDataFromSelection() const override; bool canInsertFromMimeData(const QMimeData *source) const override; void insertFromMimeData(const QMimeData *source) override; + void dragLeaveEvent(QDragLeaveEvent *e) override; + void dragMoveEvent(QDragMoveEvent *e) override; void dropEvent(QDropEvent *e) override; virtual QString plainTextFromSelection(const QTextCursor &cursor) const; From b6c8871dbd00233bc772313865414b64a480f940 Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Thu, 4 Nov 2021 14:43:17 +0100 Subject: [PATCH 23/32] Fix formeditor zoom shortcuts The shortcuts of the formeditor related to zoom did not work on macOs since they where specified in a wrong manner. Zoom in/out are now specified in terms of QKeySequence::StandardKey. Zoom all/selection are now specified in terms of strings. Change-Id: I7a779b81a9464eea59a8443cd5d5e6cec3316fd6 Reviewed-by: Brook Cronin Reviewed-by: Thomas Hartmann --- .../components/formeditor/formeditorwidget.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 842dee7e130..a777d5df87b 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -246,14 +246,14 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) }; m_zoomInAction = new QAction(zoomInIcon, tr("Zoom In"), this); - m_zoomInAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_Plus)); + m_zoomInAction->setShortcut(QKeySequence(QKeySequence::ZoomIn)); addAction(m_zoomInAction.data()); upperActions.append(m_zoomInAction.data()); m_toolBox->addRightSideAction(m_zoomInAction.data()); connect(m_zoomInAction.data(), &QAction::triggered, zoomIn); m_zoomOutAction = new QAction(zoomOutIcon, tr("Zoom Out"), this); - m_zoomOutAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_Minus)); + m_zoomOutAction->setShortcut(QKeySequence(QKeySequence::ZoomOut)); addAction(m_zoomOutAction.data()); upperActions.append(m_zoomOutAction.data()); m_toolBox->addRightSideAction(m_zoomOutAction.data()); @@ -266,7 +266,8 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) connect(m_zoomAction.data(), &ZoomAction::zoomLevelChanged, setZoomLevel); m_zoomAllAction = new QAction(zoomAllIcon, tr("Zoom screen to fit all content."), this); - m_zoomAllAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_0)); + m_zoomAllAction->setShortcut(QKeySequence(tr("Ctrl+Alt+0"))); + addAction(m_zoomAllAction.data()); upperActions.append(m_zoomAllAction.data()); m_toolBox->addRightSideAction(m_zoomAllAction.data()); @@ -275,7 +276,7 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) m_zoomSelectionAction = new QAction(zoomSelectionIcon, tr("Zoom screen to fit current selection."), this); - m_zoomSelectionAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_I)); + m_zoomSelectionAction->setShortcut(QKeySequence(tr("Ctrl+Alt+i"))); addAction(m_zoomSelectionAction.data()); upperActions.append(m_zoomSelectionAction.data()); m_toolBox->addRightSideAction(m_zoomSelectionAction.data()); From 69c8be67aec03c64eb5405c98d1e219857c0771e Mon Sep 17 00:00:00 2001 From: Tomi Korpipaa Date: Tue, 19 Oct 2021 10:04:15 +0300 Subject: [PATCH 24/32] Add particle editor support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a way to edit and view particles visually, as editing only the properties in property editor does not help visualize how the particle effect is going to look. Support toggling the effects on/off, pausing, resuming, and scrubbing the time back and forth. Only the selected particle system is animated to allow concentrating on that particular system without being confused by other possible particle systems. Fixes: QDS-4623 Change-Id: I2677c56a73279d451d77df1d131bd7294e6b23bb Reviewed-by: Tomi Korpipää Reviewed-by: Thomas Hartmann --- .../commands/view3dactioncommand.cpp | 18 +++ .../qmlpuppet/commands/view3dactioncommand.h | 18 ++- .../qml2puppet/instances/animationdriver.cpp | 81 ++++++++++ .../qml2puppet/instances/animationdriver.h | 88 +++++++++++ .../qml2puppet/instances/instances.pri | 6 +- .../instances/nodeinstanceserver.cpp | 47 +++++- .../qml2puppet/instances/nodeinstanceserver.h | 22 ++- .../qt5informationnodeinstanceserver.cpp | 142 ++++++++++++++++-- .../qt5informationnodeinstanceserver.h | 17 +++ .../instances/qt5nodeinstanceclientproxy.cpp | 1 + .../instances/qt5nodeinstanceserver.cpp | 3 +- .../qml2puppet/instances/viewconfig.cpp | 45 ++++++ .../qml2puppet/instances/viewconfig.h | 34 +++++ .../qmlprivategate/qmlprivategate_56.cpp | 23 ++- src/libs/clangsupport/diagnosticcontainer.cpp | 12 ++ src/libs/clangsupport/diagnosticcontainer.h | 3 + src/libs/clangsupport/fixitcontainer.cpp | 12 ++ src/libs/clangsupport/fixitcontainer.h | 1 + .../clangsupport/sourcerangecontainer.cpp | 12 ++ src/libs/clangsupport/sourcerangecontainer.h | 1 + src/plugins/qmldesigner/CMakeLists.txt | 1 + .../qmldesigner/components/edit3d/edit3d.qrc | 12 +- .../components/edit3d/edit3dview.cpp | 59 ++++++++ .../components/edit3d/edit3dview.h | 7 + .../components/edit3d/edit3dwidget.cpp | 20 ++- .../edit3d/images/particles_off.png | Bin 0 -> 226 bytes .../edit3d/images/particles_off@2x.png | Bin 0 -> 395 bytes .../components/edit3d/images/particles_on.png | Bin 0 -> 299 bytes .../edit3d/images/particles_on@2x.png | Bin 0 -> 375 bytes .../edit3d/images/particles_pause.png | Bin 0 -> 116 bytes .../edit3d/images/particles_pause@2x.png | Bin 0 -> 105 bytes .../edit3d/images/particles_play.png | Bin 0 -> 157 bytes .../edit3d/images/particles_play@2x.png | Bin 0 -> 203 bytes .../edit3d/images/particles_restart.png | Bin 0 -> 214 bytes .../edit3d/images/particles_restart@2x.png | Bin 0 -> 375 bytes .../components/edit3d/images/playpause.png | Bin 0 -> 300 bytes .../components/edit3d/images/playpause@2x.png | Bin 0 -> 1159 bytes .../components/formeditor/formeditor.pri | 6 +- .../components/formeditor/formeditor.qrc | 6 + .../formeditor/formeditorwidget.cpp | 2 +- .../components/formeditor/scrubbg.png | Bin 0 -> 152 bytes .../components/formeditor/scrubbg@2x.png | Bin 0 -> 166 bytes .../components/formeditor/scrubhandle-24.png | Bin 0 -> 362 bytes .../components/formeditor/scrubhandle-48.png | Bin 0 -> 695 bytes .../formeditor/scrubhandle-disabled-24.png | Bin 0 -> 438 bytes .../formeditor/scrubhandle-disabled-48.png | Bin 0 -> 829 bytes .../components/formeditor/seekerslider.cpp | 138 +++++++++++++++++ .../components/formeditor/seekerslider.h | 73 +++++++++ .../components/formeditor/toolbox.cpp | 12 +- .../components/formeditor/toolbox.h | 5 +- .../designercore/instances/puppetcreator.cpp | 12 +- .../qmldesigner/qmldesignerconstants.h | 4 + src/plugins/qmldesigner/qmldesignericons.h | 10 ++ src/plugins/qmldesigner/qmldesignerplugin.qbs | 2 + src/tools/qml2puppet/CMakeLists.txt | 2 + src/tools/qml2puppet/qml2puppet.qbs | 5 +- 56 files changed, 932 insertions(+), 30 deletions(-) create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/instances/animationdriver.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/instances/animationdriver.h create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/instances/viewconfig.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/instances/viewconfig.h create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_off.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_off@2x.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_on.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_on@2x.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_pause.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_pause@2x.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_play.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_play@2x.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_restart.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/particles_restart@2x.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/playpause.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/playpause@2x.png create mode 100644 src/plugins/qmldesigner/components/formeditor/scrubbg.png create mode 100644 src/plugins/qmldesigner/components/formeditor/scrubbg@2x.png create mode 100644 src/plugins/qmldesigner/components/formeditor/scrubhandle-24.png create mode 100644 src/plugins/qmldesigner/components/formeditor/scrubhandle-48.png create mode 100644 src/plugins/qmldesigner/components/formeditor/scrubhandle-disabled-24.png create mode 100644 src/plugins/qmldesigner/components/formeditor/scrubhandle-disabled-48.png create mode 100644 src/plugins/qmldesigner/components/formeditor/seekerslider.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/seekerslider.h diff --git a/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.cpp index ae94ed79812..211fe6d54bd 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.cpp @@ -33,9 +33,18 @@ namespace QmlDesigner { View3DActionCommand::View3DActionCommand(Type type, bool enable) : m_type(type) , m_enabled(enable) + , m_position(0) { } +View3DActionCommand::View3DActionCommand(int pos) + : m_type(ParticlesSeek) + , m_enabled(true) + , m_position(pos) +{ + +} + bool View3DActionCommand::isEnabled() const { return m_enabled; @@ -46,10 +55,16 @@ View3DActionCommand::Type View3DActionCommand::type() const return m_type; } +int View3DActionCommand::position() const +{ + return m_position; +} + QDataStream &operator<<(QDataStream &out, const View3DActionCommand &command) { out << qint32(command.isEnabled()); out << qint32(command.type()); + out << qint32(command.position()); return out; } @@ -58,10 +73,13 @@ QDataStream &operator>>(QDataStream &in, View3DActionCommand &command) { qint32 enabled; qint32 type; + qint32 pos; in >> enabled; in >> type; + in >> pos; command.m_enabled = bool(enabled); command.m_type = View3DActionCommand::Type(type); + command.m_position = pos; return in; } diff --git a/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.h b/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.h index 332b6006c39..c564bb2ec59 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.h +++ b/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.h @@ -44,18 +44,34 @@ public: CameraToggle, OrientationToggle, EditLightToggle, - ShowGrid + ShowGrid, + Edit3DParticleModeToggle, + ParticlesPlay, + ParticlesRestart, + ParticlesSeek, }; explicit View3DActionCommand(Type type, bool enable); + View3DActionCommand() = default; bool isEnabled() const; Type type() const; + int position() const; private: Type m_type = Empty; bool m_enabled = false; + int m_position = 0; + +protected: + View3DActionCommand(int pos); +}; + +class View3DSeekActionCommand : public View3DActionCommand +{ +public: + View3DSeekActionCommand(int pos) : View3DActionCommand(pos) {} }; QDataStream &operator<<(QDataStream &out, const View3DActionCommand &command); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/animationdriver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/animationdriver.cpp new file mode 100644 index 00000000000..4f32513b7ec --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/animationdriver.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "animationdriver.h" +#include "private/qabstractanimation_p.h" + +AnimationDriver::AnimationDriver(QObject *parent) + : QAnimationDriver(parent) +{ + setProperty("allowNegativeDelta", true); + install(); + connect(this, SIGNAL(started()), this, SLOT(startTimer())); + connect(this, SIGNAL(stopped()), this, SLOT(stopTimer())); +} + +AnimationDriver::~AnimationDriver() +{ + +} + +void AnimationDriver::timerEvent(QTimerEvent *e) +{ + Q_ASSERT(e->timerId() == m_timer.timerId()); + Q_UNUSED(e); + + quint32 old = elapsed(); + // Provide same time for all users + if (m_seekerEnabled) { + m_seekerElapsed += (m_seekerPos * 100) / 30; + if (m_seekerElapsed + m_elapsed < -100) // -100 to allow small negative value + m_seekerElapsed = -m_elapsed - 100; + } else { + m_elapsed = QAnimationDriver::elapsed(); + } + m_delta = elapsed() - old; + advance(); + Q_EMIT advanced(); +} + +void AnimationDriver::startTimer() +{ + m_timer.start(m_interval, Qt::PreciseTimer, this); +} + +void AnimationDriver::stopTimer() +{ + m_timer.stop(); +} + +void AnimationDriver::setSeekerPosition(int position) +{ + if (!m_seekerEnabled) + return; + + if (!m_timer.isActive()) + restart(); + + m_seekerPos = position; +} diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/animationdriver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/animationdriver.h new file mode 100644 index 00000000000..f4f50f0afcd --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/animationdriver.h @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include +#include +#include + +class AnimationDriver : public QAnimationDriver +{ + Q_OBJECT +public: + AnimationDriver(QObject *parent = nullptr); + ~AnimationDriver(); + void timerEvent(QTimerEvent *e) override; + void setInterval(int interval) + { + m_interval = qBound(1, interval, 60); + } + int interval() const + { + return m_interval; + } + void reset() + { + stop(); + stopTimer(); + } + void restart() + { + start(); + startTimer(); + } + qint64 elapsed() const override + { + return m_elapsed + m_seekerElapsed; + } + void setSeekerPosition(int position); + void setSeekerEnabled(bool enable) + { + m_seekerEnabled = enable; + } + bool isSeekerEnabled() const + { + return m_seekerEnabled; + } + bool isAnimating() const + { + return (!m_seekerEnabled && m_timer.isActive()) || (m_seekerEnabled && m_delta && m_seekerPos); + } +Q_SIGNALS: + void advanced(); + +private: + Q_SLOT void startTimer(); + Q_SLOT void stopTimer(); + + QBasicTimer m_timer; + int m_interval = 16; + int m_seekerPos = 0; + bool m_seekerEnabled = false; + qint64 m_elapsed = 0; + qint64 m_seekerElapsed = 0; + qint64 m_delta = 0; +}; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri index ff3ee9394b9..59ac62420c9 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri @@ -44,6 +44,8 @@ HEADERS += $$PWD/qt5nodeinstanceserver.h \ $$PWD/qt3dpresentationnodeinstance.h \ $$PWD/quick3dnodeinstance.h \ $$PWD/quick3dtexturenodeinstance.h \ + $$PWD/viewconfig.h \ + $$PWD/animationdriver.h SOURCES += $$PWD/qt5nodeinstanceserver.cpp \ @@ -74,4 +76,6 @@ SOURCES += $$PWD/qt5nodeinstanceserver.cpp \ $$PWD/layoutnodeinstance.cpp \ $$PWD/qt3dpresentationnodeinstance.cpp \ $$PWD/quick3dnodeinstance.cpp \ - $$PWD/quick3dtexturenodeinstance.cpp + $$PWD/quick3dtexturenodeinstance.cpp \ + $$PWD/viewconfig.cpp \ + $$PWD/animationdriver.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index bd3994400ba..c1c086c58d6 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -332,7 +332,8 @@ void NodeInstanceServer::createScene(const CreateSceneCommand &command) registerFonts(command.resourceUrl); setTranslationLanguage(command.language); - Internal::QmlPrivateGate::stopUnifiedTimer(); + if (!ViewConfig::isParticleViewMode()) + Internal::QmlPrivateGate::stopUnifiedTimer(); setupScene(command); setupState(command.stateInstanceId); @@ -783,6 +784,15 @@ QList NodeInstanceServer::allSubContextsForObject(QObject *object return contextList; } +QList NodeInstanceServer::allSubObjectsForObject(QObject *object) +{ + QList subChildren; + if (object) + subChildren = object->findChildren(); + + return subChildren; +} + void NodeInstanceServer::removeAllInstanceRelationships() { for (ServerNodeInstance &instance : m_objectInstanceHash) { @@ -1563,4 +1573,39 @@ bool NodeInstanceServer::isInformationServer() const return false; } +static QString baseProperty(const QString &property) +{ + int index = property.indexOf('.'); + if (index > 0) + return property.left(index); + return property; +} + +void NodeInstanceServer::addAnimation(QQuickAbstractAnimation *animation) +{ + if (!m_animations.contains(animation)) { + m_animations.push_back(animation); + + QQuickPropertyAnimation *panim = qobject_cast(animation); + if (panim) { + QObject *target = panim->target(); + QString property = panim->property(); + QVariant value = target->property(qPrintable(baseProperty(property))); + m_defaultValues.push_back(value); + } else { + m_defaultValues.push_back({}); + } + } +} + +QVector NodeInstanceServer::animations() const +{ + return m_animations; +} + +QVariant NodeInstanceServer::animationDefaultValue(int index) const +{ + return m_defaultValues.at(index); +} + } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h index 47dfd6c0b50..f2255bd891d 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -43,6 +43,20 @@ #include #include "servernodeinstance.h" #include "debugoutputcommand.h" +#include "viewconfig.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include namespace QtHelpers { template @@ -217,6 +231,9 @@ public: virtual QImage grabItem(QQuickItem *item) = 0; virtual bool isInformationServer() const; + void addAnimation(QQuickAbstractAnimation *animation); + QVector animations() const; + QVariant animationDefaultValue(int index) const; public slots: void refreshLocalFileProperty(const QString &path); @@ -291,7 +308,8 @@ protected: void setupDefaultDummyData(); QList setupInstances(const CreateSceneCommand &command); - QList allSubContextsForObject(QObject *object); + QList allSubContextsForObject(QObject *object); + static QList allSubObjectsForObject(QObject *object); virtual void resizeCanvasToRootItem() = 0; void setupState(qint32 stateInstanceId); @@ -322,6 +340,8 @@ private: std::unique_ptr multilanguageLink; int m_needsExtraRenderCount = 0; int m_extraRenderCurrentPass = 0; + QVector m_animations; + QVector m_defaultValues; }; } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index ee20e5636c4..419e75cfa04 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -87,6 +87,7 @@ #include #include #include +#include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include @@ -103,10 +104,6 @@ #endif #endif -#ifdef QUICK3D_PARTICLES_MODULE -#include -#endif - #ifdef IMPORT_QUICK3D_ASSETS #include #endif @@ -216,7 +213,7 @@ void Qt5InformationNodeInstanceServer::createAuxiliaryQuickView(const QUrl &url, void Qt5InformationNodeInstanceServer::updateLockedAndHiddenStates(const QSet &instances) { - if (!isQuick3DMode()) + if (!ViewConfig::isQuick3DMode()) return; // We only want to update the topmost parents in the set @@ -406,9 +403,83 @@ void Qt5InformationNodeInstanceServer::createEditView3D() #endif } +#ifdef QUICK3D_PARTICLES_MODULE +void Qt5InformationNodeInstanceServer::resetParticleSystem() +{ + if (!m_targetParticleSystem) + return; + m_targetParticleSystem->reset(); +#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 2) + m_targetParticleSystem->setEditorTime(0); +#endif + if (m_particleAnimationDriver) + m_particleAnimationDriver->reset(); +} + +void Qt5InformationNodeInstanceServer::handleParticleSystemSelected(QQuick3DParticleSystem* targetParticleSystem) +{ + if (!m_particleAnimationDriver) + return; + + m_particleAnimationDriver->reset(); + // stop the previously selected from animating + resetParticleSystem(); + + m_targetParticleSystem = targetParticleSystem; + + resetParticleSystem(); +#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 2) + QObject::disconnect(m_particleAnimationConnection); + m_particleAnimationConnection = connect(m_particleAnimationDriver, &AnimationDriver::advanced, [this] () { + if (m_targetParticleSystem) + m_targetParticleSystem->setEditorTime(m_particleAnimationDriver->elapsed()); + }); +#endif + if (m_particleAnimationPlaying && m_targetParticleSystem->visible()) + m_particleAnimationDriver->restart(); + QObject::connect(m_targetParticleSystem, &QQuick3DNode::visibleChanged, [this] () { + if (m_particleAnimationPlaying && m_targetParticleSystem->visible()) { + m_particleAnimationDriver->restart(); + } else { + m_particleAnimationDriver->reset(); + resetParticleSystem(); + } + }); + + const auto anim = animations(); + for (auto a : anim) + a->restart(); +} + +static QString baseProperty(const QString &property) +{ + int index = property.indexOf('.'); + if (index > 0) + return property.left(index); + return property; +} + +void Qt5InformationNodeInstanceServer::handleParticleSystemDeselected() +{ + m_targetParticleSystem = nullptr; + const auto anim = animations(); + int i = 0; + for (auto a : anim) { + a->stop(); + QQuickPropertyAnimation *panim = qobject_cast(a); + if (panim) + panim->target()->setProperty(qPrintable(baseProperty(panim->property())), animationDefaultValue(i)); + i++; + } +} +#endif + // The selection has changed in the edit view 3D. Empty list indicates selection is cleared. void Qt5InformationNodeInstanceServer::handleSelectionChanged(const QVariant &objs) { +#ifdef QUICK3D_PARTICLES_MODULE + resetParticleSystem(); +#endif QList instanceList; const QVariantList varObjs = objs.value(); for (const auto &object : varObjs) { @@ -829,6 +900,12 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView() m_render3DEditViewTimer.start(0); --m_need3DEditViewRender; } +#ifdef QUICK3D_PARTICLES_MODULE + if (ViewConfig::isParticleViewMode() + && m_particleAnimationDriver && m_particleAnimationDriver->isAnimating()) { + m_need3DEditViewRender++; + } +#endif #ifdef FPS_COUNTER // Force constant rendering for accurate fps count if (!m_render3DEditViewTimer.isActive()) @@ -1084,6 +1161,12 @@ Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceC _fpsTimer->start(); } #endif +#ifdef QUICK3D_PARTICLES_MODULE + if (ViewConfig::isParticleViewMode()) { + m_particleAnimationDriver = new AnimationDriver(this); + m_particleAnimationDriver->setInterval(17); + } +#endif } Qt5InformationNodeInstanceServer::~Qt5InformationNodeInstanceServer() @@ -1205,7 +1288,7 @@ QList Qt5InformationNodeInstanceServer::createInstances( void Qt5InformationNodeInstanceServer::initializeAuxiliaryViews() { #ifdef QUICK3D_MODULE - if (isQuick3DMode()) + if (ViewConfig::isQuick3DMode()) createEditView3D(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/qt6/ModelNode3DImageView.qml"), @@ -1665,7 +1748,7 @@ void Qt5InformationNodeInstanceServer::createScene(const CreateSceneCommand &com sendChildrenChangedCommand(instanceList); nodeInstanceClient()->componentCompleted(createComponentCompletedCommand(instanceList)); - if (isQuick3DMode()) { + if (ViewConfig::isQuick3DMode()) { setup3DEditView(instanceList, command.edit3dToolStates); updateRotationBlocks(command.auxiliaryChanges); } @@ -1735,7 +1818,9 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm { if (!m_editView3DSetupDone) return; - +#ifdef QUICK3D_PARTICLES_MODULE + resetParticleSystem(); +#endif m_lastSelectionChangeCommand = command; if (m_selectionChangeTimer.isActive()) { // If selection was recently changed by puppet, hold updating the selection for a bit to @@ -1762,13 +1847,17 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm if (firstSceneRoot && sceneRoot == firstSceneRoot && instance.isSubclassOf("QQuick3DNode")) object = instance.internalObject(); +#ifdef QUICK3D_PARTICLES_MODULE + auto particlesystem = qobject_cast(instance.internalObject()); + if (particlesystem) + handleParticleSystemSelected(particlesystem); + else + handleParticleSystemDeselected(); +#endif auto isSelectableAsRoot = [&]() -> bool { #ifdef QUICK3D_MODULE if (qobject_cast(object) || qobject_cast(object) -#ifdef QUICK3D_PARTICLES_MODULE - || qobject_cast(object) -#endif || qobject_cast(object)) { return true; } @@ -1900,6 +1989,33 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c case View3DActionCommand::ShowGrid: updatedState.insert("showGrid", command.isEnabled()); break; +#ifdef QUICK3D_PARTICLES_MODULE + case View3DActionCommand::Edit3DParticleModeToggle: + updatedState.insert("enableParticleViewMode", command.isEnabled()); + break; + case View3DActionCommand::ParticlesPlay: + m_particleAnimationPlaying = command.isEnabled(); + if (m_particleAnimationPlaying) { + m_particleAnimationDriver->reset(); + m_particleAnimationDriver->restart(); + m_particleAnimationDriver->setSeekerEnabled(false); + m_particleAnimationDriver->setSeekerPosition(0); + } else { + m_particleAnimationDriver->reset(); + m_particleAnimationDriver->setSeekerEnabled(true); + } + break; + case View3DActionCommand::ParticlesRestart: + resetParticleSystem(); + m_particleAnimationPlaying = true; + m_particleAnimationDriver->restart(); + m_particleAnimationDriver->setSeekerEnabled(false); + m_particleAnimationDriver->setSeekerPosition(0); + break; + case View3DActionCommand::ParticlesSeek: + m_particleAnimationDriver->setSeekerPosition(static_cast(command).position()); + break; +#endif default: break; } @@ -1977,7 +2093,7 @@ void Qt5InformationNodeInstanceServer::handleInstanceLocked(const ServerNodeInst bool enable, bool checkAncestors) { #ifdef QUICK3D_MODULE - if (!isQuick3DMode()) + if (!ViewConfig::isQuick3DMode()) return; bool edit3dLocked = enable; @@ -2015,7 +2131,7 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst bool enable, bool checkAncestors) { #ifdef QUICK3D_MODULE - if (!isQuick3DMode()) + if (!ViewConfig::isQuick3DMode()) return; bool edit3dHidden = enable; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index d827075c452..25a4b900ce8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -32,8 +32,14 @@ #include "requestmodelnodepreviewimagecommand.h" #include "propertybindingcontainer.h" #include "propertyabstractcontainer.h" +#include "animationdriver.h" + +#ifdef QUICK3D_PARTICLES_MODULE +#include +#endif #include +#include #include #include #include @@ -140,6 +146,11 @@ private: void removeRotationBlocks(const QVector &instanceIds); void createAuxiliaryQuickView(const QUrl &url, RenderViewData &viewData); +#ifdef QUICK3D_PARTICLES_MODULE + void handleParticleSystemSelected(QQuick3DParticleSystem* targetParticleSystem); + void resetParticleSystem(); + void handleParticleSystemDeselected(); +#endif RenderViewData m_editView3DData; RenderViewData m_modelNode3DImageViewData; @@ -161,6 +172,12 @@ private: QTimer m_render3DEditViewTimer; QTimer m_renderModelNodeImageViewTimer; QTimer m_inputEventTimer; +#ifdef QUICK3D_PARTICLES_MODULE + bool m_particleAnimationPlaying = true; + AnimationDriver *m_particleAnimationDriver = nullptr; + QMetaObject::Connection m_particleAnimationConnection; + QQuick3DParticleSystem* m_targetParticleSystem = nullptr; +#endif QObjectList m_changedNodes; QList m_changedProperties; ChangeSelectionCommand m_lastSelectionChangeCommand; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp index 44eaab88d22..8b1221a4f44 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp @@ -82,6 +82,7 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) : setNodeInstanceServer(std::make_unique(this)); initializeSocket(); } else if (QCoreApplication::arguments().at(2) == QLatin1String("editormode")) { + ViewConfig::enableParticleView(true); setNodeInstanceServer(std::make_unique(this)); initializeSocket(); } else if (QCoreApplication::arguments().at(2) == QLatin1String("rendermode")) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index 9f8f5caf528..dbffe2f4fbe 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -60,7 +60,8 @@ namespace QmlDesigner { Qt5NodeInstanceServer::Qt5NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) : NodeInstanceServer(nodeInstanceClient) { - DesignerSupport::activateDesignerMode(); + if (!ViewConfig::isParticleViewMode()) + DesignerSupport::activateDesignerMode(); } Qt5NodeInstanceServer::~Qt5NodeInstanceServer() diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/viewconfig.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/viewconfig.cpp new file mode 100644 index 00000000000..4a20bfcc406 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/viewconfig.cpp @@ -0,0 +1,45 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "viewconfig.h" +#include + +bool ViewConfig::isQuick3DMode() +{ + static bool mode3D = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_MODE"); + return mode3D; +} + +static bool particleViewEnabled = false; +void ViewConfig::enableParticleView(bool enable) +{ + particleViewEnabled = enable; +} + +bool ViewConfig::isParticleViewMode() +{ + static bool particleviewmode = !qEnvironmentVariableIsSet("QT_QUICK3D_DISABLE_PARTICLE_SYSTEMS"); + return particleviewmode && particleViewEnabled; +} diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/viewconfig.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/viewconfig.h new file mode 100644 index 00000000000..dcb51551d74 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/viewconfig.h @@ -0,0 +1,34 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +class ViewConfig +{ +public: + static bool isQuick3DMode(); + static void enableParticleView(bool enable); + static bool isParticleViewMode(); +}; diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp index e920263e1bd..195fd805f47 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,19 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + namespace QmlDesigner { namespace Internal { @@ -382,8 +396,15 @@ void doComponentCompleteRecursive(QObject *object, NodeInstanceServer *nodeInsta static_cast(item)->componentComplete(); } else { QQmlParserStatus *qmlParserStatus = dynamic_cast(object); - if (qmlParserStatus) + if (qmlParserStatus) { qmlParserStatus->componentComplete(); + auto *anim = dynamic_cast(object); + if (anim && ViewConfig::isParticleViewMode()) { + nodeInstanceServer->addAnimation(anim); + anim->setEnableUserControl(); + anim->stop(); + } + } } } } diff --git a/src/libs/clangsupport/diagnosticcontainer.cpp b/src/libs/clangsupport/diagnosticcontainer.cpp index 889e51d650c..1f7c013f0b5 100644 --- a/src/libs/clangsupport/diagnosticcontainer.cpp +++ b/src/libs/clangsupport/diagnosticcontainer.cpp @@ -47,5 +47,17 @@ QDebug operator<<(QDebug debug, const DiagnosticContainer &container) return debug; } +QDebug operator<<(QDebug debug, const QVector &containers) +{ + debug.nospace() << "{"; + for (int i = 0; i < containers.size(); i++) { + debug.nospace() << containers[i]; + if (i < containers.size() - 1) + debug.nospace() << ", "; + } + debug.nospace() << "}"; + return debug; +} + } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/diagnosticcontainer.h b/src/libs/clangsupport/diagnosticcontainer.h index f8344ccf767..65306bf8a6b 100644 --- a/src/libs/clangsupport/diagnosticcontainer.h +++ b/src/libs/clangsupport/diagnosticcontainer.h @@ -123,5 +123,8 @@ public: }; CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const DiagnosticContainer &container); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const QVector &container); + + } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/fixitcontainer.cpp b/src/libs/clangsupport/fixitcontainer.cpp index 29caaf71018..7b1404ac9ec 100644 --- a/src/libs/clangsupport/fixitcontainer.cpp +++ b/src/libs/clangsupport/fixitcontainer.cpp @@ -39,5 +39,17 @@ QDebug operator<<(QDebug debug, const FixItContainer &container) return debug; } +QDebug operator<<(QDebug debug, const QVector &containers) +{ + debug.nospace() << "{"; + for (int i = 0; i < containers.size(); i++) { + debug.nospace() << containers[i]; + if (i < containers.size() - 1) + debug.nospace() << ", "; + } + debug.nospace() << "}"; + return debug; +} + } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/fixitcontainer.h b/src/libs/clangsupport/fixitcontainer.h index e13199712ef..81667fe76e0 100644 --- a/src/libs/clangsupport/fixitcontainer.h +++ b/src/libs/clangsupport/fixitcontainer.h @@ -69,5 +69,6 @@ public: }; CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const FixItContainer &container); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const QVector &container); } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/sourcerangecontainer.cpp b/src/libs/clangsupport/sourcerangecontainer.cpp index 81348356285..d9146d0ff33 100644 --- a/src/libs/clangsupport/sourcerangecontainer.cpp +++ b/src/libs/clangsupport/sourcerangecontainer.cpp @@ -39,4 +39,16 @@ QDebug operator<<(QDebug debug, const SourceRangeContainer &container) return debug; } +QDebug operator<<(QDebug debug, const QVector &containers) +{ + debug.nospace() << "{"; + for (int i = 0; i < containers.size(); i++) { + debug.nospace() << containers[i]; + if (i < containers.size() - 1) + debug.nospace() << ", "; + } + debug.nospace() << "}"; + return debug; +} + } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/sourcerangecontainer.h b/src/libs/clangsupport/sourcerangecontainer.h index 603143e210a..39a0e6cb210 100644 --- a/src/libs/clangsupport/sourcerangecontainer.h +++ b/src/libs/clangsupport/sourcerangecontainer.h @@ -85,5 +85,6 @@ public: }; CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const SourceRangeContainer &container); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const QVector &container); } // namespace ClangBackEnd diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 8af14b2550e..901a631a421 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -202,6 +202,7 @@ extend_qtc_plugin(QmlDesigner rubberbandselectionmanipulator.cpp rubberbandselectionmanipulator.h scaleitem.cpp scaleitem.h scalemanipulator.cpp scalemanipulator.h + seekerslider.cpp seekerslider.h selectionindicator.cpp selectionindicator.h selectionrectangle.cpp selectionrectangle.h selectiontool.cpp selectiontool.h diff --git a/src/plugins/qmldesigner/components/edit3d/edit3d.qrc b/src/plugins/qmldesigner/components/edit3d/edit3d.qrc index 69e7113f023..13ac3b0a499 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3d.qrc +++ b/src/plugins/qmldesigner/components/edit3d/edit3d.qrc @@ -34,5 +34,15 @@ images/select_item@2x.png images/orthographic_camera.png images/orthographic_camera@2x.png - + images/particles_off.png + images/particles_off@2x.png + images/particles_on.png + images/particles_on@2x.png + images/particles_play.png + images/particles_play@2x.png + images/particles_pause.png + images/particles_pause@2x.png + images/particles_restart.png + images/particles_restart@2x.png + diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index e5a8c1747aa..3e08e0fc4e7 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -209,6 +209,11 @@ QSize Edit3DView::canvasSize() const return {}; } +void Edit3DView::setSeeker(SeekerSlider *slider) +{ + m_seeker = slider; +} + void Edit3DView::createEdit3DActions() { m_selectionModeAction @@ -272,9 +277,59 @@ void Edit3DView::createEdit3DActions() Icons::EDIT3D_GRID_ON.icon()); SelectionContextOperation resetTrigger = [this](const SelectionContext &) { + m_particlesPlayAction->action()->setEnabled(particlemode); + m_particlesRestartAction->action()->setEnabled(particlemode); + if (particlemode) + m_particlesPlayAction->action()->setChecked(true); + if (m_seeker) + m_seeker->setEnabled(false); setCurrentStateNode(rootModelNode()); resetPuppet(); }; + + SelectionContextOperation particlesTrigger = [this](const SelectionContext &) { + particlemode = !particlemode; + m_particlesPlayAction->action()->setEnabled(particlemode); + m_particlesRestartAction->action()->setEnabled(particlemode); + if (m_seeker) + m_seeker->setEnabled(false); + QmlDesigner::DesignerSettings::setValue("particleMode", particlemode); + setCurrentStateNode(rootModelNode()); + resetPuppet(); + }; + + SelectionContextOperation particlesRestartTrigger = [this](const SelectionContext &) { + m_particlesPlayAction->action()->setChecked(true); + if (m_seeker) + m_seeker->setEnabled(false); + }; + + SelectionContextOperation particlesPlayTrigger = [this](const SelectionContext &) { + if (m_seeker) + m_seeker->setEnabled(!m_particlesPlayAction->action()->isChecked()); + }; + + m_particleViewModeAction + = new Edit3DAction( + QmlDesigner::Constants::EDIT3D_PARTICLE_MODE, View3DActionCommand::Edit3DParticleModeToggle, + QCoreApplication::translate("ParticleViewModeAction", "Toggle particle animation On/Off"), + QKeySequence(Qt::Key_V), true, false, Icons::EDIT3D_PARTICLE_OFF.icon(), + Icons::EDIT3D_PARTICLE_ON.icon(), particlesTrigger); + particlemode = false; + m_particlesPlayAction + = new Edit3DAction( + QmlDesigner::Constants::EDIT3D_PARTICLES_PLAY, View3DActionCommand::ParticlesPlay, + QCoreApplication::translate("ParticlesPlayAction", "Play Particles"), + QKeySequence(Qt::Key_W), true, true, Icons::EDIT3D_PARTICLE_PLAY.icon(), + Icons::EDIT3D_PARTICLE_PAUSE.icon(), particlesPlayTrigger); + m_particlesRestartAction + = new Edit3DAction( + QmlDesigner::Constants::EDIT3D_PARTICLES_RESTART, View3DActionCommand::ParticlesRestart, + QCoreApplication::translate("ParticlesRestartAction", "Restart Particles"), + QKeySequence(Qt::Key_E), false, false, Icons::EDIT3D_PARTICLE_RESTART.icon(), + Icons::EDIT3D_PARTICLE_RESTART.icon(), particlesRestartTrigger); + m_particlesPlayAction->action()->setEnabled(particlemode); + m_particlesRestartAction->action()->setEnabled(particlemode); m_resetAction = new Edit3DAction( QmlDesigner::Constants::EDIT3D_RESET_VIEW, View3DActionCommand::Empty, @@ -296,6 +351,10 @@ void Edit3DView::createEdit3DActions() m_leftActions << m_editLightAction; m_leftActions << m_showGridAction; + m_rightActions << m_particleViewModeAction; + m_rightActions << m_particlesPlayAction; + m_rightActions << m_particlesRestartAction; + m_rightActions << nullptr; m_rightActions << m_resetAction; } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index 6c3ae892a91..2001dbbcf4d 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -25,6 +25,7 @@ #pragma once #include "view3dactioncommand.h" +#include "seekerslider.h" #include #include @@ -68,6 +69,7 @@ public: void createEdit3DActions(); QVector leftActions() const; QVector rightActions() const; + void setSeeker(SeekerSlider *slider); void addQuick3DImport(); @@ -90,6 +92,11 @@ private: Edit3DAction *m_editLightAction = nullptr; Edit3DAction *m_showGridAction = nullptr; Edit3DAction *m_resetAction = nullptr; + Edit3DAction *m_particleViewModeAction = nullptr; + Edit3DAction *m_particlesPlayAction = nullptr; + Edit3DAction *m_particlesRestartAction = nullptr; + SeekerSlider *m_seeker = nullptr; + int particlemode; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 968cab58466..57a4877301d 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -33,6 +33,8 @@ #include "qmldesignerplugin.h" #include "qmlvisualnode.h" #include "viewmanager.h" +#include +#include #include #include @@ -64,8 +66,11 @@ Edit3DWidget::Edit3DWidget(Edit3DView *view) : fillLayout->setSpacing(0); setLayout(fillLayout); + SeekerSlider *seeker = new SeekerSlider(this); + seeker->setEnabled(false); + // Initialize toolbar - m_toolBox = new ToolBox(this); + m_toolBox = new ToolBox(seeker, this); fillLayout->addWidget(m_toolBox.data()); // Iterate through view actions. A null action indicates a separator and a second null action @@ -100,7 +105,10 @@ Edit3DWidget::Edit3DWidget(Edit3DView *view) : auto separator = new QAction(this); separator->setSeparator(true); addAction(separator); - m_toolBox->addLeftSideAction(separator); + if (left) + m_toolBox->addLeftSideAction(separator); + else + m_toolBox->addRightSideAction(separator); previousWasSeparator = true; } } @@ -109,6 +117,14 @@ Edit3DWidget::Edit3DWidget(Edit3DView *view) : addActionsToToolBox(view->leftActions(), true); addActionsToToolBox(view->rightActions(), false); + view->setSeeker(seeker); + seeker->setToolTip(QLatin1String("Seek particle system time when paused.")); + + QObject::connect(seeker, &SeekerSlider::positionChanged, [this, seeker](){ + QmlDesignerPlugin::instance()->viewManager().nodeInstanceView() + ->view3DAction(View3DSeekActionCommand(seeker->position())); + }); + // Onboarding label contains instructions for new users how to get 3D content into the project m_onboardingLabel = new QLabel(this); QString labelText = diff --git a/src/plugins/qmldesigner/components/edit3d/images/particles_off.png b/src/plugins/qmldesigner/components/edit3d/images/particles_off.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5c8355414be3d6d21615d485742ff4ddfae16e GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)Rqtn_qo43W6(+q;po#X-Q8 zJ=(x+ChL-z zeT%|RYOVVf;&(HKjh-;pH;!1`q z+71Vw3cjl^Y+aOyw{r+$y3QE(!Q^CLx8niJpPEkp zBm$0aj6b1PAnmi4)tK=}dTIjeY|irL#6L^x4gNX^S4v7s?07S2o>I-k9gmC;HL>r0 z%Q_>#hv65OBL9=Wccj$1p0MdWc$_D!67SH&YAREARJoOTS_8{25la)0YZV!*|b()1R&7i=%Zcv#Dz)uda29sX@HWjrVJmk_Gl=T(^?vl?)YiIdbUG v!O&ojZM9dI`tRRoZ(|nDBk}#*1rauelvzbKr{y9yfI`{R)z4*}Q$iB}fNqlZ literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/particles_on.png b/src/plugins/qmldesigner/components/edit3d/images/particles_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c01b374040d72677d896ab96fff41a578332751b GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)RqeDZX043W5;{Nw-s>wJ@& z_y1!)xW4`VzyIk!{%5Z@>i%cA;Kcgmvfw&K)_H6jj5e^@vwFQS;9UEQEu`?wl&SXb zuKr(sPlu;x)^te+FXx)j<$r%|^_~*=?|}Y<0~4)h`+j}*H$Gv}{!ijJ0?xL^_qX1u zeD>(ZH_nXH>kq%`*~Grj?%zI_i*J-J_3-dq%Klg1bvf>ztjdSnog&Q5H~0RZ zuHviL9K&vsJbQ-N?>*~pPq|jp%<<>{wgTDt$2R`yxc+}3)BpPVZqs|4SHCijdGLSz zD9KiJ*UY9G4zY@aLXyxWK{?Ko8U0^)1C<^Ldil5*9a2`(D)=*fi7DrWmqou)oIg*D{qpU> zk59*v7naB{Ep%Ay`m$lwDuc?`oz|Xj8&2 zw8S#+-ktdenQm_O+gN9tRQ#h%LN?@EdCX4N5`)+_ZZ5vES-Uljrm+Q|*!lccp+)nP z1ZOFaK84n_c;?01Ot|Bm*2*t9anQ7TOG%l;&eSv6;v9!W<}fD2oDhmj-fk)r5qM$M zvhz#I`M#>FJDz0lSzmsxLhOkq!(???V>7#*p*$A8X{N6kW~@ALin{HfR?^TH{SwDg2KD;%|-_cBBVtF#^t eI^Dj^W^w!uAB!(iAFrPSg{Y^ipUXO@geCxZgQIK! literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/particles_pause.png b/src/plugins/qmldesigner/components/edit3d/images/particles_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..89d6fd8211c4225d8e5059d4b4a880a12a005940 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdoVYd_r9R|Nqax!0_wWFKcV- z-@ku*dwUxh87)psyTQP~Am!=e7{YNq`2d@cbIj2LJdVn#j<1Xb!V;JmUUsn^=ie*b R%D}+D;OXk;vd$@?2>@;3Bc1>N literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/particles_pause@2x.png b/src/plugins/qmldesigner/components/edit3d/images/particles_pause@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..94276bf81e6a14df70d7a986f29d06723ca0500e GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;ICT0c(20oEV=?n}EoB=)|uK)l4XJBARNJx-7 znbE|+z##4E;us=vIaz_v$M*pbv#}F%gmb$c^E25)3=B5{BqlR&Sf|6lz`)??>gTe~ HDWM4fhA|nP literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/particles_play.png b/src/plugins/qmldesigner/components/edit3d/images/particles_play.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c2c58d2b8516cac1f79054622b5c000691fe71 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r9R|Nqax!0`S1_t&pq z@7}$;sHn)((^E`L?8c27*REZgHEY(iY16c{w07pKZeUzopr01(|YvH$=8 literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/particles_play@2x.png b/src/plugins/qmldesigner/components/edit3d/images/particles_play@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..07dedc164ee2f18a7b130745bde07f317ed950ad GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I7G?$phQ^Te;|vT8x&b~RuK)l4XJBCX{{8#$ zr(%KQ#u!@0!A=1;uF+}5h z@&djGIu61KHH#Y56lV13DM&QyDOkwHI-KJ4bqF}a;Oh{uh0)g`pp1D|!vi5!6UKun zC5#6-oS05Zv_0A$wuSNTOBNgRxeg4f$t*^0CIONR3>jaAmAz)ZPG?|XVDNPHb6Mw< G&;$UnTu4R$ literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/particles_restart.png b/src/plugins/qmldesigner/components/edit3d/images/particles_restart.png new file mode 100644 index 0000000000000000000000000000000000000000..e427433e4e791de90b934ddcd5e58f6970c2b8d7 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)Rq%=L6}43UszJ-D#<5Q7BU zh5Vk|4|JF}IPgkEmu_ReV!$Xp$MI?z<0Q4Ss-_Y#yqrv~msmcYE`QI;pwLidW2ca? zyGH%xJB~fG<~&c$FcPZa`z`uv%It(Qb0te{IBtna8l?N?zMr$*w@54dUr_BNpGgx< zy+h{vybzopr0A@Q-egFUf literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/particles_restart@2x.png b/src/plugins/qmldesigner/components/edit3d/images/particles_restart@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90981337b17d50551bec1d25de2a99ac68c32830 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2AJ5LwK5R21WC$G;tY#`HO ze^2~{bdMP8TTv!&Z)a`MmL3t2>1$gpO z+phC_a!tA2;`lau_Bl7NE`JuCV1CrUu!>E_=+Tqs>|6cd@Z}!qw!|7XW z9SWl*gfC6m^>u<9i&ew*vo|f%uQANryEF(_JH=%QgJN{AAv2ey2twm&Ozk7sk`Miu@tkPZYUYVpUWnB~;e* zS~%F~Rj*`W_19aVYd~Z3jY|p>4(dEs71tJ56<3wle){yVPl*mQ!%{_k$3M$@iy0Ug7(8A5T-G@yGywp_ C{A~sR literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/playpause@2x.png b/src/plugins/qmldesigner/components/edit3d/images/playpause@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4b92db41cca020ee78c0144b0c81eab7fa39cab8 GIT binary patch literal 1159 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANMUex5FlArbCxr^kBC4wpFo zd8KE->-0bWBL1jo1!>=Y!xop3#wsYPpJbFVH+an!@kdjYJT&)Sncb&Q@$jsMG)I#a zdsy^DHy7^R0gv9CD$$aR(p|Ldn9JmU=WidcF`2a|bMNiC4^5_!3Y;5ZG+nK-t&H>5xxV)vv$1c3DZDoPO!nEv@eE?%mB(XZG~=UY#Ig!^_L7#PcU$Wr)8m6E2dp5Pv^J{u~`t`|`hE{X^dS;%#a^(t(>}Q9B-={VT8OzGb za!s<>vn??y>Q-*f;*PCbw;osdn3R#BA=%4ve!s7;@3#KjEiw_2bA8mh@7=iZqf;e+ zgU^0t#=YC3!oseVsyq=+Dbn$@YiVg&^SChSX^FD3a@Ue2D(ss--dPZC!Nb<9V`*7A z%ZD#KEi5ENBk6yY z?A?1eYhy%QriqlOXCAu&!|EhAqgsdM6Vo>T{P^O<3#Yoef7eymdAB{e^Xb#4=_$Kp z9iG4J=IiX}mln3N`Zu=p*Xti#V< zR#tY+M{V+TxxG9VuMRkV&Mqu0RNQAgXYSmaFXI_!&X|#4n)bW-sccjIny}T{X44yO zBHi|0c=PUEmbjSM8I{k^e*B2goqjrg^2;&?W22<*DHC2YPrJ#aUcGDAu6|EUA_V~U^<@BUAhu&Vk9Bgg$htsp^;6cYsZ}0B=64R$o-|hAO z%a<*0lcjat^YYg5DS9|)zEeLrd(tE!!#Oij*x5b9+1REhoVHuPcJ0^sFIZVwziR9h zul^zVU`lPnv@avczXK#*=_DrSU&KKjGW2!`$u%hSsfXdJ1g59w+AkYPrjxfFfZ2iSv`}o cz#jIe@pa)g`_@lnU|?YIboFyt=akR{0F>`H2mk;8 literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/formeditor/formeditor.pri b/src/plugins/qmldesigner/components/formeditor/formeditor.pri index 833260dd1a0..df905d377db 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditor.pri +++ b/src/plugins/qmldesigner/components/formeditor/formeditor.pri @@ -42,7 +42,8 @@ SOURCES += formeditoritem.cpp \ backgroundaction.cpp \ formeditortoolbutton.cpp \ formeditorannotationicon.cpp \ - transitiontool.cpp + transitiontool.cpp \ + seekerslider.cpp HEADERS += formeditorscene.h \ formeditorwidget.h \ @@ -87,6 +88,7 @@ HEADERS += formeditorscene.h \ backgroundaction.h \ formeditortoolbutton.h \ formeditorannotationicon.h \ - transitiontool.h + transitiontool.h \ + seekerslider.h RESOURCES += formeditor.qrc diff --git a/src/plugins/qmldesigner/components/formeditor/formeditor.qrc b/src/plugins/qmldesigner/components/formeditor/formeditor.qrc index 45170bde01d..23a15d7effa 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditor.qrc +++ b/src/plugins/qmldesigner/components/formeditor/formeditor.qrc @@ -8,5 +8,11 @@ snapping_and_anchoring@2x.png annotationsIcon.png annotationsIconActive.png + scrubbg.png + scrubbg@2x.png + scrubhandle-24.png + scrubhandle-48.png + scrubhandle-disabled-24.png + scrubhandle-disabled-48.png diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index a777d5df87b..31aa8a4de69 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -139,7 +139,7 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) addAction(m_rootHeightAction.data()); upperActions.append(m_rootHeightAction.data()); - m_toolBox = new ToolBox(this); + m_toolBox = new ToolBox(nullptr, this); fillLayout->addWidget(m_toolBox.data()); m_toolBox->setLeftSideActions(upperActions); diff --git a/src/plugins/qmldesigner/components/formeditor/scrubbg.png b/src/plugins/qmldesigner/components/formeditor/scrubbg.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3237983acfe1da17420aa0a7c04510f64e3129 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0y~yU`SzLVBle4W?*1Q%VrH=U|^6A@Ck8cU|`q?25oI^ zU0q!f5fSn6@rH(mmX?;0mNU{A7#P?~g8YIR90CrUzi?mjsMI|M1_o767sn8d^T`PZ z7-z6Zc(7i%8q~)!YvPU6haNKJDWS@-rxSX;7!r1MIqTbsgKT8*boFyt=akR{0Qvka AGynhq literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/formeditor/scrubbg@2x.png b/src/plugins/qmldesigner/components/formeditor/scrubbg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ff06eb3cba5d20dc0adb60b5212d98966de965 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0y~yU^v0Rz#zfG%)r3l>#@EG#0l^Tab;j&*a!w~ZEam$ zU518+mX?+qH*TDFNc2Ag0|RSGkY6xE!-NCpg%}t_85kHWJY5_^JdP(PD2N(x8eEX; zi88X$;XKNC$g9w!WyYfk9>-HdUaU}EJgq0nD2sEeuB7fOcin|ERT&=6n_#dwYVt$| P1_lOCS3j3^P68N2n_HEakX3dmAa_FrP`f= zfkCPy$S;_Ig-6lNt6=(!g^O0LUc3I(=`)va-g*A<^Ur@C=Vli$Ffgq1ba4#PIA1!+ zovFn@#A&12wvDdBJN`SS8GZwR= r1FE+ydws_C)?S_`n|c1f`pjCvD6&7?@lF*30|SGntDnm{r-UW|*vzKc literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/formeditor/scrubhandle-48.png b/src/plugins/qmldesigner/components/formeditor/scrubhandle-48.png new file mode 100644 index 0000000000000000000000000000000000000000..1613f758ba5a11fd13f296e1d0a655037cf06ec5 GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_W(N3#xZ17!IyljLcJp}* z3=BpkL4Lsu96SOdvdTJo239sfsaaE|%~`l)>9W;p*R9{MaqIRS`wtvFe*WsU>n~ov zdH>o@=ZTgWqM z%za#&HEH*CuXn!ZJE!zLyz^PO;mG%A&Y>>((naDAw}nso_h6#%J!i+N(+d^ugvI^S z*rm$y&#Wnv&Pk%9)yWjBh$4#1^`tR@Gf3H93 zO3bme)XB5=XU~54$dn^a{MqikrxnlCJ^EPsXUC_%S09&}^j+R9HFFaG6#k5aS;f|s z+DshQT1;0s85d=j$~IIiNOEYFII#DNc*Dk1484p7w%-}bwAi;We^6P;F0g%dLmAJ7 z>04MMR&iYrO3>D1nUrRF!KWcWis?-#Zw9}?6`6z}_8AOke0!xz8`@S*=4V;Otie#D zdSIbk0fP{u#a9M)2Zq;G2Y&r;xH@eOe{O8p>0`CG;(1@6POshjwtm6BxB6MSOy7)@ zuLqqdTJmXq)pL*3u%7zAis3z*i|Pv(IPE+yaq7*>*RM0fk~A_;|6=XZ(N67pwJR@t z>9UIa-R=FCUp@}V+Z}Xzt8v-y<;^NzH}_B8r?u$O&(F-$o=^Fxu!}K|fq{X+)78&q Iol`;+00I?Uvj6}9 literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/formeditor/scrubhandle-disabled-24.png b/src/plugins/qmldesigner/components/formeditor/scrubhandle-disabled-24.png new file mode 100644 index 0000000000000000000000000000000000000000..403e5d655a9fe8730122422866109d7a45d4b2a6 GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4rT@hhU+WOo?>8Ns0i>0aosdPp!;0H9tH*m zjglb0U6Y8bD6@=Uisj7;6841+Em%R*y~jbLWOpBgx$1vQ$21MDQOy=eXcn&+Pd}Ow~D)Fi4u=5$E|-W bG~Zl4TKHLr`TuGL1_lOCS3j3^P6GO literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/formeditor/scrubhandle-disabled-48.png b/src/plugins/qmldesigner/components/formeditor/scrubhandle-disabled-48.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9c10d733f9502f52cc4bbda3166db0418f37c5 GIT binary patch literal 829 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_P6qgdxNaIQ!0J-|O$G)A zr;;GQU-Qgj^;snQ85kHJdb&7bzP|8Z>!-nc5!I8Q_Z^#W>#0@t z?4(Qh@juOVmWIb4FaL4bqEhdB^LH0+W*sT(YLluSd3Wp88yR@21Fwd&%?K%#2`FWn zarOSx={5}~Tm2Y!&0wh5efKS+&MGV36}uQ-Ed3cP%^_vQzCy4eQr)tg;g=Qv3jPNk zL8=VK`ss{McQ!6iTFHGOP;3F8L-?gD33=T&9X?)5SQf;aupq~Qxnb5VhO;&f!V7fS zKX6wzH1S&$F@{$*Tq)&@dCt79ap|A!Q_>l24~QQ~wR<3RKyCxy$*POjZfDKhvGDK3 z4R$rxj^F;r6d51*T4}=mGZUsszIK|nJLKM!f7>N)Pyb!sw25Cvbc*xIDrP^=YmFMq z4p;_Gc@?+n$&Yu3YeoK7+&HOs=ZbNQZCBmV^?_|0-f!m%{35mAC35ZIxMHEU+qn{H s=IWWhjZ4hW-+ue~n5 + +#include +#include +#include +#include + +namespace QmlDesigner { + +SeekerSlider::SeekerSlider(QWidget *parentWidget) + : QWidget(parentWidget), + m_bgIcon(QLatin1String(":/icon/layout/scrubbg.png")) +{ + m_handleIcon.addFile(QLatin1String(":/icon/layout/scrubhandle-24.png"), QSize(24, 24)); + m_handleIcon.addFile(QLatin1String(":/icon/layout/scrubhandle-48.png"), QSize(48, 48)); + m_handleIcon.addFile(QLatin1String(":/icon/layout/scrubhandle-disabled-24.png"), QSize(24, 24), QIcon::Disabled); + m_handleIcon.addFile(QLatin1String(":/icon/layout/scrubhandle-disabled-48.png"), QSize(48, 48), QIcon::Disabled); + const Utils::Icon bg({{":/icon/layout/scrubbg.png", Utils::Theme::IconsBaseColor}}); + m_bgWidth = bg.pixmap().width(); + m_bgHeight = bg.pixmap().height(); + m_handleWidth = m_bgHeight; + m_handleHeight = m_bgHeight; + int width = m_bgWidth + m_handleWidth * 2; + m_sliderHalfWidth = m_bgWidth / 2; + setMinimumWidth(width); + setMaximumWidth(width); + setProperty("panelwidget", true); + setProperty("panelwidget_singlerow", true); +} + +void SeekerSlider::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event) + QPainter painter(this); + { + QStyleOptionToolBar option; + option.rect = rect(); + option.state = QStyle::State_Horizontal; + style()->drawControl(QStyle::CE_ToolBar, &option, &painter, this); + } + + int x = rect().width() / 2; + int y = rect().height() / 2; + + const QPixmap bg = m_bgIcon.pixmap(QSize(m_bgWidth, m_bgHeight), isEnabled() ? QIcon::Normal : QIcon::Disabled, QIcon::On); + painter.drawPixmap(x - m_bgWidth / 2, y - m_bgHeight / 2, bg); + + if (m_moving) { + const QPixmap handle = m_handleIcon.pixmap(QSize(m_handleWidth, m_handleHeight), QIcon::Active, QIcon::On); + painter.drawPixmap(x - m_handleWidth / 2 + m_sliderPos, y - m_handleHeight / 2, handle); + } else { + const QPixmap handle = m_handleIcon.pixmap(QSize(m_handleWidth, m_handleHeight), isEnabled() ? QIcon::Normal : QIcon::Disabled, QIcon::On); + painter.drawPixmap(x - m_handleWidth / 2, y - m_handleHeight / 2, handle); + } +} + +void SeekerSlider::mousePressEvent(QMouseEvent *event) +{ + if (event->button() != Qt::LeftButton) { + QWidget::mousePressEvent(event); + return; + } + + int x = rect().width() / 2; + int y = rect().height() / 2; + auto pos = event->localPos(); + if (pos.x() >= x - m_handleWidth / 2 && pos.x() <= x + m_handleWidth / 2 + && pos.y() >= y - m_handleHeight / 2 && pos.y() <= y + m_handleHeight / 2) { + m_moving = true; + m_startPos = pos.x(); + } +} + +void SeekerSlider::mouseMoveEvent(QMouseEvent *event) +{ + if (!m_moving) { + QWidget::mouseMoveEvent(event); + return; + } + + auto pos = event->localPos(); + int delta = pos.x() - m_startPos; + m_sliderPos = qBound(-m_sliderHalfWidth, delta, m_sliderHalfWidth); + delta = m_maxPosition * m_sliderPos / m_sliderHalfWidth; + if (delta != m_position) { + m_position = delta; + Q_EMIT positionChanged(); + update(); + } +} + +void SeekerSlider::mouseReleaseEvent(QMouseEvent *event) +{ + if (!m_moving) { + QWidget::mouseReleaseEvent(event); + return; + } + + m_moving = false; + m_position = 0; + m_startPos = 0; + m_sliderPos = 0; + Q_EMIT positionChanged(); + update(); +} + +int SeekerSlider::position() const +{ + return m_position; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/seekerslider.h b/src/plugins/qmldesigner/components/formeditor/seekerslider.h new file mode 100644 index 00000000000..79b320d6507 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/seekerslider.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ +#pragma once + +#include +#include +#include + +namespace QmlDesigner { + +class SeekerSlider : public QWidget +{ + Q_OBJECT +public: + SeekerSlider(QWidget *parentWidget); + int position() const; + int maxPosition() const + { + return m_maxPosition; + } + + void setMaxPosition(int pos) + { + m_maxPosition = qMax(0, pos); + } + +Q_SIGNALS: + void positionChanged(); + +protected: + void paintEvent(QPaintEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + +private: + int m_position = 0; + int m_startPos = 0; + int m_sliderPos = 0; + int m_sliderHalfWidth = 0; + int m_maxPosition = 30; + bool m_moving = false; + int m_bgWidth; + int m_bgHeight; + int m_handleWidth; + int m_handleHeight; + QIcon m_bgIcon; + QIcon m_handleIcon; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/toolbox.cpp b/src/plugins/qmldesigner/components/formeditor/toolbox.cpp index c72db4c37c2..433ddc661b7 100644 --- a/src/plugins/qmldesigner/components/formeditor/toolbox.cpp +++ b/src/plugins/qmldesigner/components/formeditor/toolbox.cpp @@ -33,10 +33,11 @@ namespace QmlDesigner { -ToolBox::ToolBox(QWidget *parentWidget) +ToolBox::ToolBox(SeekerSlider *seeker, QWidget *parentWidget) : Utils::StyledBar(parentWidget), m_leftToolBar(new QToolBar(QLatin1String("LeftSidebar"), this)), - m_rightToolBar(new QToolBar(QLatin1String("RightSidebar"), this)) + m_rightToolBar(new QToolBar(QLatin1String("RightSidebar"), this)), + m_seeker(seeker) { m_leftToolBar->setFloatable(true); m_leftToolBar->setMovable(true); @@ -62,6 +63,8 @@ ToolBox::ToolBox(QWidget *parentWidget) m_rightToolBar->setOrientation(Qt::Horizontal); horizontalLayout->addWidget(m_leftToolBar); horizontalLayout->addWidget(stretchToolbar); + if (seeker) + horizontalLayout->addWidget(m_seeker); horizontalLayout->addWidget(m_rightToolBar); } @@ -94,4 +97,9 @@ QList ToolBox::actions() const return m_leftToolBar->actions() + m_rightToolBar->actions(); } +SeekerSlider *ToolBox::seeker() const +{ + return m_seeker; +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/toolbox.h b/src/plugins/qmldesigner/components/formeditor/toolbox.h index 72bd0ffb8b5..d1d5676f957 100644 --- a/src/plugins/qmldesigner/components/formeditor/toolbox.h +++ b/src/plugins/qmldesigner/components/formeditor/toolbox.h @@ -25,6 +25,7 @@ #pragma once #include +#include QT_BEGIN_NAMESPACE class QToolBar; @@ -37,16 +38,18 @@ namespace QmlDesigner { class ToolBox : public Utils::StyledBar { public: - ToolBox(QWidget *parentWidget); + ToolBox(SeekerSlider *seeker, QWidget *parentWidget); void setLeftSideActions(const QList &actions); void setRightSideActions(const QList &actions); void addLeftSideAction(QAction *action); void addRightSideAction(QAction *action); QList actions() const; + SeekerSlider *seeker() const; private: QToolBar *m_leftToolBar; QToolBar *m_rightToolBar; + SeekerSlider *m_seeker; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index 41563efd417..23014b7ce92 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -533,10 +533,20 @@ QProcessEnvironment PuppetCreator::processEnvironment() const QmlDesigner::Import import = QmlDesigner::Import::createLibraryImport("QtQuick3D", "1.0"); if (m_model->hasImport(import, true, true)) environment.set("QMLDESIGNER_QUICK3D_MODE", "true"); + + import = QmlDesigner::Import::createLibraryImport("QtQuick3D.Particles3D", "1.0"); + if (m_model->hasImport(import, true, true)) + environment.set("QMLDESIGNER_QUICK3D_PARTICLES3D_MODE", "true"); + import = QmlDesigner::Import::createLibraryImport("QtCharts", "2.0"); if (m_model->hasImport(import, true, true)) environment.set("QMLDESIGNER_FORCE_QAPPLICATION", "true"); - environment.set("QT_QUICK3D_DISABLE_PARTICLE_SYSTEMS", "1"); + + bool particlemode = QmlDesigner::DesignerSettings::getValue("particleMode").toBool(); + if (!particlemode) + environment.set("QT_QUICK3D_DISABLE_PARTICLE_SYSTEMS", "1"); + else + environment.set("QT_QUICK3D_EDITOR_PARTICLE_SYSTEMS", "1"); #endif QStringList importPaths = m_model->importPaths(); diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 937cfc8005f..2ed1daeb883 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -64,6 +64,10 @@ const char EDIT3D_ORIENTATION[] = "QmlDesigner.Editor3D.OrientationToggle"; const char EDIT3D_EDIT_LIGHT[] = "QmlDesigner.Editor3D.EditLightToggle"; const char EDIT3D_EDIT_SHOW_GRID[] = "QmlDesigner.Editor3D.ToggleGrid"; const char EDIT3D_RESET_VIEW[] = "QmlDesigner.Editor3D.ResetView"; +const char EDIT3D_PARTICLE_MODE[] = "QmlDesigner.Editor3D.ParticleViewModeToggle"; +const char EDIT3D_PARTICLES_PLAY[] = "QmlDesigner.Editor3D.ParticlesPlay"; +const char EDIT3D_PARTICLES_RESTART[] = "QmlDesigner.Editor3D.ParticlesRestart"; + const char QML_DESIGNER_SUBFOLDER[] = "/designer/"; const char QUICK_3D_ASSETS_FOLDER[] = "/Quick3DAssets"; diff --git a/src/plugins/qmldesigner/qmldesignericons.h b/src/plugins/qmldesigner/qmldesignericons.h index b4a97d8fae8..50e4ea1dd03 100644 --- a/src/plugins/qmldesigner/qmldesignericons.h +++ b/src/plugins/qmldesigner/qmldesignericons.h @@ -51,6 +51,16 @@ const Utils::Icon EDIT3D_LIGHT_ON({ {":/edit3d/images/edit_light_on.png", Utils::Theme::QmlDesigner_HighlightColor}}); const Utils::Icon EDIT3D_LIGHT_OFF({ {":/edit3d/images/edit_light_off.png", Utils::Theme::IconsBaseColor}}); +const Utils::Icon EDIT3D_PARTICLE_ON({ + {":/edit3d/images/particles_on.png", Utils::Theme::QmlDesigner_HighlightColor}}); +const Utils::Icon EDIT3D_PARTICLE_OFF({ + {":/edit3d/images/particles_off.png", Utils::Theme::IconsBaseColor}}); +const Utils::Icon EDIT3D_PARTICLE_PLAY({ + {":/edit3d/images/particles_play.png", Utils::Theme::QmlDesigner_HighlightColor}}); +const Utils::Icon EDIT3D_PARTICLE_PAUSE({ + {":/edit3d/images/particles_pause.png", Utils::Theme::QmlDesigner_HighlightColor}}); +const Utils::Icon EDIT3D_PARTICLE_RESTART({ + {":/edit3d/images/particles_restart.png", Utils::Theme::QmlDesigner_HighlightColor}}); const Utils::Icon EDIT3D_GRID_ON({ {":/edit3d/images/grid_on.png", Utils::Theme::QmlDesigner_HighlightColor}}); const Utils::Icon EDIT3D_GRID_OFF({ diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 6a3e76edac4..4e20e2b52ed 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -577,6 +577,8 @@ Project { "formeditor/scaleitem.h", "formeditor/scalemanipulator.cpp", "formeditor/scalemanipulator.h", + "formeditor/seekerslider.cpp", + "formeditor/seekerslider.h", "formeditor/selectionindicator.cpp", "formeditor/selectionindicator.h", "formeditor/selectionrectangle.cpp", diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 4606ee57082..60aaee4a528 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -221,6 +221,8 @@ extend_qtc_executable(qml2puppet nodeinstanceserverdispatcher.cpp nodeinstanceserverdispatcher.h capturenodeinstanceserverdispatcher.cpp capturenodeinstanceserverdispatcher.h qt5captureimagenodeinstanceserver.cpp qt5captureimagenodeinstanceserver.h + viewconfig.cpp viewconfig.h + animationdriver.cpp animationdriver.h ) extend_qtc_executable(qml2puppet diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 83acc77ba36..626aed22255 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -16,7 +16,6 @@ QtcTool { ] } Depends { name: "Qt.quick3d-private"; required: false } - Depends { name: "Qt.quick3dparticles-private"; required: false } property bool useQuick3d: Utilities.versionCompare(Qt.core.version, "5.15") >= 0 && Qt["quick3d-private"].present property bool useParticle3d: Utilities.versionCompare(Qt.core.version, "6.2") >= 0 @@ -249,6 +248,10 @@ QtcTool { "instances/nodeinstanceserverdispatcher.h", "instances/capturenodeinstanceserverdispatcher.cpp", "instances/capturenodeinstanceserverdispatcher.h", + "instances/viewconfig.cpp", + "instances/viewconfig.h", + "instances/animationdriver.cpp", + "instances/animationdriver.h", "editor3d/generalhelper.cpp", "editor3d/mousearea3d.cpp", "editor3d/geometrybase.cpp", From 590d01e8a91ab1038b83cbedaeb2606346a2d1cf Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 2 Nov 2021 15:05:11 +0200 Subject: [PATCH 25/32] QmlDesigner: Block modifying imports when editing in-file subcomponent Adding import statements fails silently when editing in-file subcomponent, and removing them can crash creator, so block various cases in component library, navigator, and 3D edit view that do this. Fixes: QDS-5353 Change-Id: Ide5429cd97d2bf78f884b14e83cdffd10399f929 Reviewed-by: Thomas Hartmann --- .../itemLibraryQmlSources/ItemsView.qml | 2 +- .../itemLibraryQmlSources/LibraryHeader.qml | 6 ++-- .../components/edit3d/edit3dview.cpp | 4 ++- .../components/integration/designdocument.cpp | 5 ++++ .../components/integration/designdocument.h | 1 + .../itemlibrary/itemlibrarymodel.cpp | 6 ++-- .../itemlibrary/itemlibrarywidget.cpp | 16 +++++++++++ .../itemlibrary/itemlibrarywidget.h | 8 +++++- .../navigator/navigatortreemodel.cpp | 28 +++++++++++-------- 9 files changed, 57 insertions(+), 19 deletions(-) diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml index cbd9e5ed504..034d460d8fd 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml @@ -116,7 +116,7 @@ Item { text: qsTr("Remove Module") visible: itemsView.currentCategory === null height: visible ? implicitHeight : 0 - enabled: itemsView.importToRemove !== "" + enabled: itemsView.importToRemove !== "" && !rootView.subCompEditMode onTriggered: rootView.removeImport(itemsView.importToRemove) } diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/LibraryHeader.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/LibraryHeader.qml index 8eaa7bbcc75..f5ad0eae3f2 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/LibraryHeader.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/LibraryHeader.qml @@ -93,8 +93,10 @@ Item { anchors.topMargin: 1 width: 24 height: 24 - color: mouseArea.containsMouse ? StudioTheme.Values.themeControlBackgroundHover - : StudioTheme.Values.themeControlBackground + color: mouseArea.containsMouse && enabled + ? StudioTheme.Values.themeControlBackgroundHover + : StudioTheme.Values.themeControlBackground + enabled: index !== 0 || !rootView.subCompEditMode Label { // + sign text: StudioTheme.Constants.plus diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 3e08e0fc4e7..c6fa4a0bdb5 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -370,7 +371,8 @@ QVector Edit3DView::rightActions() const void Edit3DView::addQuick3DImport() { - if (model()) { + DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); + if (document && !document->inFileComponentModelActive() && model()) { const QList imports = model()->possibleImports(); for (const auto &import : imports) { if (import.url() == "QtQuick3D") { diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 4b5e2170972..0c0268f4ca5 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -210,6 +210,11 @@ bool DesignDocument::pasteSVG() return true; } +bool DesignDocument::inFileComponentModelActive() const +{ + return !m_inFileComponentModel.isNull(); +} + QList DesignDocument::qmlParseWarnings() const { return m_rewriterView->warnings(); diff --git a/src/plugins/qmldesigner/components/integration/designdocument.h b/src/plugins/qmldesigner/components/integration/designdocument.h index ed2ef9ed112..13c258958bd 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.h +++ b/src/plugins/qmldesigner/components/integration/designdocument.h @@ -76,6 +76,7 @@ public: Model *currentModel() const; Model *documentModel() const; + bool inFileComponentModelActive() const; void contextHelp(const Core::IContext::HelpCallback &callback) const; QList qmlParseWarnings() const; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index b571cc4981d..9c856c99289 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -354,7 +354,8 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) beginResetModel(); clearSections(); - Utils::FilePath qmlFileName = QmlDesignerPlugin::instance()->currentDesignDocument()->fileName(); + DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); + Utils::FilePath qmlFileName = document->fileName(); ProjectExplorer::Project *project = ProjectExplorer::SessionManager::projectForFile(qmlFileName); QString projectName = project ? project->displayName() : ""; @@ -398,6 +399,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) itemLibImport->setImportExpanded(loadExpandedState(itemLibImport->importUrl())); } + const bool blockNewImports = document->inFileComponentModelActive(); const QList itemLibEntries = itemLibraryInfo->entries(); for (const ItemLibraryEntry &entry : itemLibEntries) { NodeMetaInfo metaInfo = model->metaInfo(entry.typeName()); @@ -429,7 +431,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) bool hasImport = model->hasImport(import, true, true); bool isImportPossible = false; if (!hasImport) - isImportPossible = model->isImportPossible(import, true, true); + isImportPossible = !blockNewImports && model->isImportPossible(import, true, true); bool isUsable = (valid && (isItem || forceVisibility)) && (entry.requiredImport().isEmpty() || hasImport); if (!blocked && (isUsable || isImportPossible)) { diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index fb4de1d84b7..03547fcee77 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -400,6 +400,17 @@ void ItemLibraryWidget::setModel(Model *model) return; setItemLibraryInfo(model->metaInfo().itemLibraryInfo()); + + if (DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument()) { + const bool subCompEditMode = document->inFileComponentModelActive(); + if (m_subCompEditMode != subCompEditMode) { + m_subCompEditMode = subCompEditMode; + // Switch out of module add panel if it's active + if (m_subCompEditMode && m_stackedWidget->currentIndex() == 2) + m_stackedWidget->setCurrentIndex(0); + emit subCompEditModeChanged(); + } + } } void ItemLibraryWidget::handleTabChanged(int index) @@ -545,6 +556,11 @@ QPair ItemLibraryWidget::getAssetTypeAndData(const QString return {}; } +bool ItemLibraryWidget::subCompEditMode() const +{ + return m_subCompEditMode; +} + void ItemLibraryWidget::setFlowMode(bool b) { m_itemLibraryModel->setFlowMode(b); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h index 5f631ae2434..cd00a18fc23 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h @@ -71,6 +71,8 @@ class ItemLibraryWidget : public QFrame Q_OBJECT public: + Q_PROPERTY(bool subCompEditMode READ subCompEditMode NOTIFY subCompEditModeChanged) + ItemLibraryWidget(AsynchronousImageCache &imageCache, AsynchronousImageCache &asynchronousFontImageCache, SynchronousImageCache &synchronousFontImageCache); @@ -94,6 +96,8 @@ public: inline static bool isHorizontalLayout = false; + bool subCompEditMode() const; + Q_INVOKABLE void startDragAndDrop(const QVariant &itemLibEntry, const QPointF &mousePos); Q_INVOKABLE void startDragAsset(const QStringList &assetPaths, const QPointF &mousePos); Q_INVOKABLE void removeImport(const QString &importUrl); @@ -108,7 +112,8 @@ public: Q_INVOKABLE QSet supportedDropSuffixes(); signals: - void itemActivated(const QString& itemName); + void itemActivated(const QString &itemName); + void subCompEditModeChanged(); protected: bool eventFilter(QObject *obj, QEvent *event) override; @@ -152,6 +157,7 @@ private: bool m_updateRetry = false; QString m_filterText; QPoint m_dragStartPoint; + bool m_subCompEditMode = false; inline static int HORIZONTAL_LAYOUT_WIDTH_LIMIT = 600; }; diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 03386b38f1a..cb98389b171 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -551,20 +551,24 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *mimeData, QList addedNodes; ModelNode currNode; - QSet neededImports; - for (const QString &assetPath : assetsPaths) { - QString assetType = ItemLibraryWidget::getAssetTypeAndData(assetPath).first; - if (assetType == "application/vnd.bauhaus.libraryresource.shader") - neededImports.insert("QtQuick3D"); - else if (assetType == "application/vnd.bauhaus.libraryresource.sound") - neededImports.insert("QtMultimedia"); + // Adding required imports is skipped if we are editing in-file subcomponent + DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); + if (document && !document->inFileComponentModelActive()) { + QSet neededImports; + for (const QString &assetPath : assetsPaths) { + QString assetType = ItemLibraryWidget::getAssetTypeAndData(assetPath).first; + if (assetType == "application/vnd.bauhaus.libraryresource.shader") + neededImports.insert("QtQuick3D"); + else if (assetType == "application/vnd.bauhaus.libraryresource.sound") + neededImports.insert("QtMultimedia"); - if (neededImports.size() == 2) - break; - }; + if (neededImports.size() == 2) + break; + }; - for (const QString &import : std::as_const(neededImports)) - addImport(import); + for (const QString &import : std::as_const(neededImports)) + addImport(import); + } m_view->executeInTransaction("NavigatorTreeModel::dropMimeData", [&] { for (const QString &assetPath : assetsPaths) { From 525d70647c701c4cb6b7f9c801e9ddb1b408eb87 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 23 Sep 2021 19:24:12 +0200 Subject: [PATCH 26/32] QmlDesigner: Update documentation for arc Change-Id: Ic039b97041745671697206165276ec94d6a69968 Reviewed-by: Leena Miettinen --- .../src/qtquick/library/qtquick-shapes.qdoc | 7 +------ .../studio-shapes-arc-outline-properties.png | Bin 13355 -> 7885 bytes 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/doc/qtcreator/src/qtquick/library/qtquick-shapes.qdoc b/doc/qtcreator/src/qtquick/library/qtquick-shapes.qdoc index a174a52ab1c..c87f7af0e90 100644 --- a/doc/qtcreator/src/qtquick/library/qtquick-shapes.qdoc +++ b/doc/qtcreator/src/qtquick/library/qtquick-shapes.qdoc @@ -200,12 +200,7 @@ To create an arc with an outline, select the \uicontrol {Full outline} check box. The \uicontrol {Outline width} field sets the width of - the arc outline, including the stroke. The \uicontrol {Outline start} - and \uicontrol {Outline end} fields set the width of the start and - end points of the outline separately. The width of the outline between - them is calculated automatically. You can adjust the inner and outer - curves of the outline in the \uicontrol {Inner radius} and - \uicontrol {Outer radius} fields. + the arc outline, including the stroke. The \uicontrol {Round outline}, \uicontrol {Round start}, and \uicontrol {Round end} properties specify whether the end points of the diff --git a/doc/qtdesignstudio/images/studio-shapes-arc-outline-properties.png b/doc/qtdesignstudio/images/studio-shapes-arc-outline-properties.png index ead21b05a600f5428a68fb64cba125fc00d2f14a..d2987ec7900c42292c3ca503d385d8a1a12c0202 100644 GIT binary patch literal 7885 zcmeAS@N?(olHy`uVBq!ia0y~yVC-jLVA#OH#K6E%vADE`fkAGHr;B4q#jUqHl=-hU1bEPb{1Rq$84(sQ@ZF8}vjn1LaJ^AG3vtaDl}RXl=YIZ*l3v<#4Z4dC%wf-_87bz4X^so%b`I zD9e>3FD{+4_PD=%!Nz-X)2q@9SKfcSrIgG1>s`Hzzgj!$OE0VyTz6epW%;q+pX^NY ze%>i6KXkITtp1I@sMMn|}R-)m^`{m;j(KRPB{$UhhM)i*n9k<0vv z(GrPUXIWQw{+#wF`E1u8S!tear}8J-@0>Vm(xjqaE%%S*nv3MBySx@#RQJ+(U8nN( znwQ13B~@OP>Qi!W{8||r^!-KZcl{M+pYDCyymEsmL-y&gef#z;&42Lz{eNS|e;Zea ztk(Ik`0VUw+`p&vb+%tjdp&L2)o=Ty*y0kuKb`8h#WgSLT$s7rZ7=U#?s=>R_qI&U zTkl^e${10cy!v{}*UzhdJ(*lz7yE6GZCp+gPuUe_-Ic5R)3l2wH(y`s==xFb*6eLw z0`+aHISxe4;XKFvIyS`Bk6AZ4dg{@-|Jj>9ou4A6*ie}VLcGFN%Ul1SNWZIfzK|%JKNJXy;~pulz01) z&g->DHcn-=toVKW+w1eY^eg^4CmC(?DtpLX${`W|D2r*sv7E1QH4p0o*XiE-`TeM~ zcILSak5)aOKL1bccipp>^I6^4YtyD*GoP~cXTN-s_FuJI>yljK!$P8_d*02GU8lsb z;i~n9xPk>?#!-TMKkDzgb#<3MOQU(!)zbDA`mB}@zaOvKWcz>R?N5@I_47jt@BY@G zuamx-<>Y+3tho_g_pYr|upD#t9 zjy}2LfBCPdySe1lFFOvbk`%bcxMIj#NsyZqU)#E+%nxpsWPZ}y#aJrcpZE$Q}; zV<}I<@2uQcYHE3<_5Zq=`L%yGu1cEU;CAEawf;Mn310&zr=Of5v;WS;byvgDc{(=mBjwfU^##rWGB?O(Y^8mS%E_rK?R^VAcQgw^p4 zPXgZFh;XkgeZJygm^9z@m2&mZk1V=aVZHtv-&6Jv&u;Hay*z7s=*C^zzNcz`-*}~b z^OWAc$Uvzx=A1j!(wfA6YahR|{d?#0`IBPa``mo;*uuK$*rU!LGKVirO4SpZaJoe8 zw&ur`du&eK3p%ju{CAONZGn#^!OU5WhZ8#AEL~@|=jh>}ZLB*_-J7)eN9LI)T)GuH ze~o9K7N4n{ z#6*r&8Pp#OWtGZ7v zKJe>y+s5M?%Y5F?S@_R~|5dZ0%_g?C;ysaloL{>(-khJdH7oS7r}}L3U3HH?9zWG~ zDr)AM&C!Zdn z#;d>b*WIEo-o0e?d;J@OJCC=i&&ybKxaF7qy-l3kF5T2Bp1yiEU%0g0MwefE?uIQo z&@}PmwC;&^dC^Tludm$t-M(fzkJ6nt($g+mMHL&F+_>+$BZSXv)l>icuS^WM)}B6P-X<=aZv6%OJtH)rfP zdhOoHlPCWcEZr14JyAP9=jntStM-;VQJ7d8;h(vR=X~_1ys+^0?iJ2F zrse@AcCxcxSZbT{J$-R5eOKGMJo94T>Q9GP?)WtCwxZJXD}ComVwsbDez%B~md<$b zb=TCBnI@}x+3yN0w%5q{x^SCPj9)p=bLkd;3$=0$u0Oor>QAfP@G{?K^>|aj`&$2K zK|M|GTJL)=_J#klx_tMh{Iuq*xeHg6SVXN?y4=Wf&vfO>$&xQCXT0%?Z`}6i-I>td z@D@G4eB=GnMWF}tikF3-yO6L={c7-&PaoL7iJUcD>07Fww|n~eFs}S^>3e&wOUlhW zUuC2mB>k%Ic7*Jn>!oi!9`&z{j62i%pyl$(GNUDlhYsEjUKMvLY}L=^V^{q=>{8xJM^Thd*(VdI4=WkcB zlu}8O4PL*>dQaj@h4=HDCpnj%pIx%`g=k!Ax`oXDz}0IyOCP`d)%n26MU>Yj-{PT* zS5~moX_iPwrR&AE#wq{JzKBGs2Hor2Q1gA>qngsxls(TDY~2@<@m4d|W>WIcIr;hP z{%uJ~f+rbpg#{F!X^>++7? zuPjZdTJYw{zXKEU^S5OFUiahUG)||@9V^1V-?5RBdzhX5+t1Qt^Nnh6+skw7l~T$b zLb5y^&n%mosU7QHT~}V7@hyJ+GPUJ#|FY9os9ik$Veb};B?TE}c|J=eGIxdEwqNpI zv#mJj^OZGWS2u)AjWyS-Uc5Zx(A=A{!Rwb@DcV^URQkT-q<`R!edZ$nFZnO#T)t#^ z@vcDGvo5VIp(oDnd%06QYw4rN(08$$POaNK^CW78J8RN*QcJ4+x2wYjn$&% z+Uw@t&{LBS%ek&R{akzQBK?h=+l=_E_x7hPd0TFx88>^UOX}2nD|b~^rhz3uG!ZuR{x87pw_;Y0p8ew zG-f`mZak&Ou;FUg#;aW&oFE+s!x%vA6NU|<4Qm-1z_u`enkNh(lNmsbnrKE)6NceH z*n8HWZMs$;4G&%5OmdBFzJDc*XXE?M)2x;1wf8Gpl@g_AR6KiOCOC;{O-b~}+P-Z1m>=eF=(Un*;{;lBHp zoa>Am4&|oG1uT);F?sI9Qp5N2a*CF{uGatNzAbd#p5M;7snW5xDr_S%CKaX4c3!l9 zTk`sb><`knPQ5CayGYIJPuWH04Ucj|*Szz(>9f}>QX=YSlEUf3AA)k&?%%rU`%2@P zl+R&sgTQRsP7eoN;~h+b{jj>EizN4z-E$}G-?H|eqQ%^kWnMK}`u&@>i)?uL zS<_v1qHq1_g_$|rMN{{xwns>B+jMV!@V5p2cfT)K^e1VCsbWF@xpg@?+1a~h%ch+- z+c2t`-#oN9e+ayxY$sEZX*0eTAGg{Eh(7w;~`0a_^ zd)8*2O%7gl@7%kKohuugYK5APeK{xj>im_}Jr5_E8q9focF9FEx%xFZE7nXsX|;Rm z=Hg8}@>yEw74EWaRofrv9B-*QdgG1%=BTZ!J}#NuYxwk8asEr^&)eqKu9B60^-6B0 zM84hIgOSYJ9$Dt_+g{hGpCKpr=J^TZ&-T$X#CBah`}g%1b>U4Vn#uc)yDXf#>fY;x z@6JV+9Y4aBw}6xRQ+p`CANwwE=1a3f-f9N@;QI3~y-E42D{Jfa_vIR*{F7}?%t`+p zBM}hZ;<%Ci))bXu8 z_u9_R+b1~vmgv(If63}IMyt}+*qh&&wRXQm*u|}=;O-SUJdWWx5_fz!2n#YT){V!&uuhP!8jLuwjNMrs5Gr8&|>-fYk zz7dYPay4;L>MM}jHic#i)JI0|EzD>?681KrnA!F5<%ON|HV6H>wMlfN;hvO)n9G+# zf~(f9agGzzig{t!Hue8acIC~*tA6#wChhX}y1rzYf7+7giJPotJDJ1W?smPeUt9j8 zY(<3nl(1gC?_WPOd%4}7G&eHN(z*HOyeR=Q;w%q;-WC+z@=AM$bl1ApZqo} zcA7*<$f~-tVee)Br00J9wJ@{KGj~;W;qARO+kz@~-~P~HnyP(Bb7kocjRyC1i+3;k z-t*Gx#a1or%T{YrHvIq8=iB~jp83(6i8icZGuF;oQGG2bey3Zch(=0f+E-tjp3;Pu zZdQ{zynO#xewuyAms3}mcVpR->pSL2ZmRFsN!OnBbKUG!A6I$A-kg>v8n^Iof9KkJ z$`)szRV@DG*Yb4t?XJ&Pr%wDhtNGfLZxPq#UHbpX<->mCZJR8=y*TPn=yPCR^7Slh zH_`6nVc+iG*)dT>@WFojzYF&$U+qoY_tzuPqyM#$&a zI7^xw(t471|H~cjtwA5xXnlY8I`msPpI@?tx~c!!tWaL>(3{h3Oni43?@oSobxM@p zb-z{bWH&}jZ`*X|=iQ$yud?m#o_Be?eroviG+CZ5pL1Qe6_s+DCK)Gh@6M>Xe&WmQ zspVSS=ViYL1WmSEmg0Wr>84q;y7m|g1~IxtJ}A%A{$&2hM=bfDo2rD5*lf?cr&wm| zPwS{$bJW~$uChwFA?K!gNjQCGM9GIco41R4p# z?BxFSJ5b)la3DL7M?o{V?3%IsmCIK%H4ojS~IWYr=Z2CF>W3 z7yMhcO)0*r>QRy7Jz?cC1V@jNM&20WVu_HErf`%2&$(;00?g+E%hB5YAmd<}?R!xO=+&mZN*!+vQ84#&G zxwK3>{dtO{-Ib7_2h%Ux+Uia({dOw#tG}C-`0cI%WgbwOyP0H+k}Ty=wl z|C@)lTv(g;E`GWF%n3`qB|mQyY7JXewZ46qb^c9RVd))>YCI?8!)z^NU+D3Alyay20b_hFU$I721bXu5h%;2Q0ZJ!v1O6)~ni~ALZ`8IdexpeBHV4&oAA8 z^rMpI2JVQH+%#P+S^M^l3ja@ZO*#vQzh277i)1D zTz~q+JJ)rG=+^&>re!CoY5aWV{`9Vg_u^+W_wdfPtyR|Bs(s4STQWCQGSv9meCeFC z*UC4BmaN@mSlGRG@8rpoe?Rm}{jKTF)X5yyzqZQTPj#Ml?sXoqwg6Y5_9J3H*Cy=y zsJMT5#unqNQ@74pYZ97R)tF=R%_CM;Z_!QlEh~8Kq88;Hz40gZ@s%?PXLlNi+ueP! z;F7}Mixzx}n&$6KPq$4KUVlv6Y2_T5-wzioEZMx{Db|W(2B*=QKj-ZvX3h=1n*K)U za%|8pHPc!nWn2EqcVBwQY`FC*tmc3A-ox9Sk6J}<%__Nd@i4!ZWUhBvTIEw7-n8nV zZAn#6dCuSVTD!TckJtTm=#xB9Uudh|e4cgMq5I>uE1h}sU1j?BvwL>bpO_W#M4_-^ z>ZbJ%E`+gf+*x}kd8wlM^T+FBqXqpu*B*9dw7FYx#dL4_nFk+_hL$ZWjX0U`|EcV3 zzN@zRU7HVAaIJ}oe)-x#?Dr|tQ;QrFPaCh!f0Vd}+1p%Xl1oU|uk(}di{yD_%*^Q6 zs=W8u*E19TR;O4-Up!NOH>5Y*^%d8ilGPu$-q!o%s21JG@x1yxHu#o%7t`5Hv*XfJ z%au;dS>k=Zgjc-A_nFG!Zy9&5v?!{J=a}9vI@`N8r_Z*^FhE9l!}A+kZ}kNpeYA1v zUvu+36<3xY@BQmF-g}fLN4(j)bl%Hz_JW(N6|}Z4QAiWM#I|PH%!KEe&R1t`unbx* zyXRHl7d{vnqpQg;LxzfR!ZnN^Pe&Y|^w#n|^kG8cLXq}YH zTDxm&KA)KrX1HqR1sk6N)%|yqU{#BHY>beUdc5z7DXY>$Mg5=V_pB9*TGyy$-TCy~ z`*Z36@t?m!9?LHb0l}ix;)z-4fXY4x$NC;n$=>Kyx{>uWGW$87Shmz-wtI)a}gy7SAe+&$JM z38fhSwR>{U=kdKOn>KnlZTJxu#%k>BgsNaI6Dgkvv7#X03LOL=aRjcEro6ao|-rudDeJt#Wx4(ak-U;iM z+Et6?p+lffK@FxE+WXF5ERKBcX|&(I^1}7D-y0tn|0#0cEw+El&;4R4M{jh!EL@hm zL+|Z@#=my?Q73<-RWe+gx3*;c40)^_jOn*uDYHZxqE;!JpjFEBZSX4PvLLKV@o2(b zr38z?suW$RZLB++_o}u>{a@%9wwT1~Lf;Fmy3pE6Vs$aoc6U0|niB5NykY5^^@ z9)d?OycTHaMy&-F>PhLUFr3&j3T&_dz610RI?maHIa`j`2Ros(9Vt=QSP z=;O-^F6Sdxo~>q&RNkg!);67|C%bA^me=~Jr6;tVTDgrK@plAr;T?e)LS1g@Jhp!p zOuD!&C4CxX@GDh&S@^jRd)8hNUHEI!`?kejwTjFSy-e91H9dmu`qWjvE{|tiS++}j z``y#&+O6An^Pc~;w|NaOy!bAXy=%HR-RHXd`p}y*uO+HB|D9f*V-@m!kLEeP$C?{{ z;V=dcLNIfq{X+)78&qol`;+0LYtP3jhEB literal 13355 zcmeAS@N?(olHy`uVBq!ia0y~yVC-jLU^L@kVqjnpv+d+%U@-pV>EaktaqI2epYg(x z`@YZrzofeA**)v>cQ)V8`7Yh$Xy(!6kP^soL1*2Lg-yK;8dX}otxWkt<^QC@b1Q>O{jPqGeLiQ(`d{|( z3=9Wi9{gXx&A_lhl!4(u7z4u%E(V4KZ3c#hwGgp0!qI=F!v*WV)O=hk&*is#&BT9y zy|cBfYx0l16L^-gP=Dv?N&R{JA7Xaezn-BS$$q`!_iY<_cfiO%B(MNACQdt3EquGatVYm>cW#w-Eh-)~QT zdMCbYmCMKZD`kw<-3r;+x?#G=o9rv1Yd&qbxoSb=?-xa3X=%?cGEeND7JqH4j6nU* zUDx)z25A0XIc2|Vj8ui;s`WijZxsDkvAtqhp!Z{aiR9bMmnKJU5M| kx1rz23}2 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 From a17170d0275179f783b1b9f390bba4a2f26b3872 Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Fri, 5 Nov 2021 16:38:43 +0300 Subject: [PATCH 27/32] Update Qbs submodule to the top of 1.21 branch Change-Id: I12cd44b90e5418cca88b5a267c740b26e4496f1d Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index ae937f07673..c0f2da3065f 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit ae937f07673aa95b67218e4be36a38e4438c0171 +Subproject commit c0f2da3065fd00b4d4193786865f7603e07c4515 From 12ccd9ec548c38bbe024121d55bb90650ba7d5a4 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Tue, 26 Oct 2021 18:33:09 +0300 Subject: [PATCH 28/32] Andriod: declare QLatin1String as char[] instead in AndroidManger Change-Id: I4f11950dcdfa0caddf02bf2b123ff78a9c01c062 Reviewed-by: hjk --- src/plugins/android/androidmanager.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index df77eb31a13..b1a1f15fdee 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -81,12 +81,12 @@ using namespace Android::Internal; namespace Android { -const QLatin1String AndroidManifestName("AndroidManifest.xml"); -const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber"); -const QLatin1String AndroidDeviceAbis("AndroidDeviceAbis"); -const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel"); -const char qtcSignature[] = "This file is generated by QtCreator to be read by androiddeployqt " - "and should not be modified by hand."; +const char AndroidManifestName[] = "AndroidManifest.xml"; +const char AndroidDeviceSn[] = "AndroidDeviceSerialNumber"; +const char AndroidDeviceAbis[] = "AndroidDeviceAbis"; +const char ApiLevelKey[] = "AndroidVersion.ApiLevel"; +const char qtcSignature[] = "This file is generated by QtCreator to be read by " + "androiddeployqt and should not be modified by hand."; static Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager", QtWarningMsg) @@ -132,7 +132,8 @@ QString AndroidManager::activityName(const Target *target) QDomDocument doc; if (!openManifest(target, doc)) return QString(); - QDomElement activityElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")); + QDomElement activityElem = doc.documentElement().firstChildElement( + QLatin1String("application")).firstChildElement(QLatin1String("activity")); return activityElem.attribute(QLatin1String("android:name")); } From 0830e5018560ef084baf351452151d8777119312 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 5 Nov 2021 14:55:10 +0100 Subject: [PATCH 29/32] Fix "forever" timeout in QtcProcess::waitFor... methods Change-Id: I57aac503599fa94f530e073164b86b5247702ce5 Reviewed-by: Alessandro Portale --- src/libs/utils/launchersocket.cpp | 16 +++++----------- src/libs/utils/launchersocket.h | 3 ++- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index fc7b865e676..1dc3b45e328 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -30,7 +30,6 @@ #include "qtcassert.h" #include -#include #include #include @@ -542,14 +541,11 @@ bool CallerHandle::isCalledFromLaunchersThread() const bool LauncherHandle::waitForSignal(int msecs, CallerHandle::SignalType newSignal) { QTC_ASSERT(!isCalledFromLaunchersThread(), return false); - QElapsedTimer timer; - timer.start(); + QDeadlineTimer deadline(msecs); while (true) { - const int remainingMsecs = msecs - timer.elapsed(); - if (remainingMsecs <= 0) + if (deadline.hasExpired()) break; - const bool timedOut = !doWaitForSignal(qMax(remainingMsecs, 0), newSignal); - if (timedOut) + if (!doWaitForSignal(deadline, newSignal)) break; m_awaitingShouldContinue = true; // TODO: make it recursive? const QList flushedSignals = m_callerHandle->flushFor(newSignal); @@ -563,14 +559,12 @@ bool LauncherHandle::waitForSignal(int msecs, CallerHandle::SignalType newSignal return true; if (wasCanceled) return true; // or false? is false only in case of timeout? - if (timer.hasExpired(msecs)) - break; } return false; } // Called from caller's thread exclusively. -bool LauncherHandle::doWaitForSignal(int msecs, CallerHandle::SignalType newSignal) +bool LauncherHandle::doWaitForSignal(QDeadlineTimer deadline, CallerHandle::SignalType newSignal) { QMutexLocker locker(&m_mutex); QTC_ASSERT(isCalledFromCallersThread(), return false); @@ -585,7 +579,7 @@ bool LauncherHandle::doWaitForSignal(int msecs, CallerHandle::SignalType newSign return true; m_waitingFor = newSignal; - const bool ret = m_waitCondition.wait(&m_mutex, msecs); + const bool ret = m_waitCondition.wait(&m_mutex, deadline); m_waitingFor = CallerHandle::SignalType::NoSignal; return ret; } diff --git a/src/libs/utils/launchersocket.h b/src/libs/utils/launchersocket.h index 9708cf0430c..42b5fa757e8 100644 --- a/src/libs/utils/launchersocket.h +++ b/src/libs/utils/launchersocket.h @@ -28,6 +28,7 @@ #include "launcherpackets.h" #include "processutils.h" +#include #include #include #include @@ -213,7 +214,7 @@ public: private: // Called from caller's thread exclusively. - bool doWaitForSignal(int msecs, CallerHandle::SignalType newSignal); + bool doWaitForSignal(QDeadlineTimer deadline, CallerHandle::SignalType newSignal); // Called from launcher's thread exclusively. Call me with mutex locked. void wakeUpIfWaitingFor(CallerHandle::SignalType newSignal); From f686bce68fb2d1e1de66642ce20e59bba25670ba Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 5 Nov 2021 14:49:51 +0100 Subject: [PATCH 30/32] QmlJS: Soften strict equality check Pt II Disable strict equality check for undefined values as there are too many ways the code model just assumes "undefined" as the information would be present at runtime only or to avoid too complex evaluation. Task-number: QTCREATORBUG-25917 Change-Id: I7c6da04f52ba767c4ef5c21078dc14ac4de86687 Reviewed-by: Fabian Kosmale --- src/libs/qmljs/qmljscheck.cpp | 8 +++++--- tests/auto/qml/codemodel/check/equality-checks.qml | 14 +++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 38595a8b363..bd5d25834ed 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -1275,6 +1275,9 @@ static bool isIntegerValue(const Value *value) static bool strictCompareConstant(const Value *lhs, const Value *rhs) { + // attached properties and working at runtime cases may be undefined at evaluation time + if (lhs->asUndefinedValue() || rhs->asUndefinedValue()) + return false; if (lhs->asUnknownValue() || rhs->asUnknownValue()) return false; if (lhs->asFunctionValue() || rhs->asFunctionValue()) // function evaluation not implemented @@ -1283,12 +1286,11 @@ static bool strictCompareConstant(const Value *lhs, const Value *rhs) return false; if (lhs->asBooleanValue() && !rhs->asBooleanValue()) return true; - // attached properties and working at runtime cases may be undefined at evaluation time - if (lhs->asNumberValue() && (!rhs->asNumberValue() && !rhs->asUndefinedValue())) + if (lhs->asNumberValue() && !rhs->asNumberValue()) return true; if (lhs->asStringValue() && !rhs->asStringValue()) return true; - if (lhs->asObjectValue() && (!rhs->asObjectValue() || !rhs->asNullValue() || !rhs->asUndefinedValue())) + if (lhs->asObjectValue() && (!rhs->asObjectValue() || !rhs->asNullValue())) return true; return false; } diff --git a/tests/auto/qml/codemodel/check/equality-checks.qml b/tests/auto/qml/codemodel/check/equality-checks.qml index 0a24cccce9a..1a2c1f7580b 100644 --- a/tests/auto/qml/codemodel/check/equality-checks.qml +++ b/tests/auto/qml/codemodel/check/equality-checks.qml @@ -71,14 +71,14 @@ Rectangle { if (s === s) {} if (s === n) {} // 325 15 17 if (s === N) {} // 325 15 17 - if (s === u) {} // 325 15 17 + if (s === u) {} if (s === b) {} // 325 15 17 if (s === o) {} // 325 15 17 if (s === k) {} if (s !== s) {} if (s !== n) {} // 325 15 17 if (s !== N) {} // 325 15 17 - if (s !== u) {} // 325 15 17 + if (s !== u) {} if (s !== b) {} // 325 15 17 if (s !== o) {} // 325 15 17 if (s !== k) {} @@ -100,19 +100,19 @@ Rectangle { if (N === o) {} // 325 15 17 if (N === k) {} - if (u === s) {} // 325 15 17 + if (u === s) {} if (u === n) {} if (u === N) {} if (u === u) {} - if (u === b) {} // 325 15 17 - if (u === o) {} // 325 15 17 + if (u === b) {} + if (u === o) {} if (u === k) {} if (b === s) {} // 325 15 17 if (b === n) {} // 325 15 17 if (b === N) {} // 325 15 17 - if (b === u) {} // 325 15 17 + if (b === u) {} if (b === b) {} if (b === o) {} // 325 15 17 if (b === k) {} @@ -120,7 +120,7 @@ Rectangle { if (o === s) {} // 325 15 17 if (o === n) {} // 325 15 17 if (o === N) {} // 325 15 17 - if (o === u) {} // 325 15 17 + if (o === u) {} if (o === b) {} // 325 15 17 if (o === o) {} // 325 15 17 if (o === k) {} From a98f5de6c1f475d8069ee464fad890d4894aab5e Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Nov 2021 13:07:45 +0100 Subject: [PATCH 31/32] Debugger: Fix LLDB/Python startup for Android Uses the right python version and connects. but the device side keeps saying "Waiting for Debugger". Change-Id: I0bc9dadfa9e12831006cd486984bc29e197d7fbd Reviewed-by: Christian Stenger --- src/plugins/debugger/lldb/lldbengine.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 200579b6dd5..a5440edb7fd 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -213,7 +213,15 @@ void LldbEngine::setupEngine() showMessage("STARTING LLDB: " + lldbCmd.toUserOutput()); Environment environment = runParameters().debugger.environment; environment.appendOrSet("PYTHONUNBUFFERED", "1"); // avoid flushing problem on macOS + if (lldbCmd.path().contains("/ndk-bundle/")) { + FilePath androidPythonDir = lldbCmd.parentDir().parentDir().pathAppended("python3"); + if (HostOsInfo::isAnyUnixHost()) + androidPythonDir = androidPythonDir.pathAppended("bin"); + if (androidPythonDir.exists()) + environment.prependOrSetPath(androidPythonDir.path()); + } m_lldbProc.setEnvironment(environment); + if (runParameters().debugger.workingDirectory.isDir()) m_lldbProc.setWorkingDirectory(runParameters().debugger.workingDirectory); From e0c115fb9b1806e77930bbc9d4484eaefa8aee5f Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 5 Nov 2021 08:56:49 +0100 Subject: [PATCH 32/32] Editor: Allow creating block selections with alt+shift again These block selections are a convenience for people used to the block selection allowing to also unselect parts again (at least as long as alt+shift is pressed). Fixes: QTCREATORBUG-26535 Fixes: QTCREATORBUG-26529 Change-Id: I19558dc1d823c268cc1cfda0ea8151bac483701f Reviewed-by: Orgad Shaneh --- src/libs/utils/multitextcursor.cpp | 2 +- src/libs/utils/multitextcursor.h | 3 + src/plugins/texteditor/tabsettings.cpp | 5 ++ src/plugins/texteditor/tabsettings.h | 1 + src/plugins/texteditor/texteditor.cpp | 109 ++++++++++++++++++++++++- 5 files changed, 117 insertions(+), 3 deletions(-) diff --git a/src/libs/utils/multitextcursor.cpp b/src/libs/utils/multitextcursor.cpp index 7225de9344a..a73c58bbb1d 100644 --- a/src/libs/utils/multitextcursor.cpp +++ b/src/libs/utils/multitextcursor.cpp @@ -294,7 +294,7 @@ static QTextLine currentTextLine(const QTextCursor &cursor) return layout->lineForTextPosition(relativePos); } -bool multiCursorAddEvent(QKeyEvent *e, QKeySequence::StandardKey matchKey) +bool MultiTextCursor::multiCursorAddEvent(QKeyEvent *e, QKeySequence::StandardKey matchKey) { uint searchkey = (e->modifiers() | e->key()) & ~(Qt::KeypadModifier diff --git a/src/libs/utils/multitextcursor.h b/src/libs/utils/multitextcursor.h index 90938848e8b..8fdf041faa0 100644 --- a/src/libs/utils/multitextcursor.h +++ b/src/libs/utils/multitextcursor.h @@ -27,6 +27,7 @@ #include "utils_global.h" +#include #include QT_BEGIN_NAMESPACE @@ -99,6 +100,8 @@ public: const_iterator constBegin() const { return m_cursors.constBegin(); } const_iterator constEnd() const { return m_cursors.constEnd(); } + static bool multiCursorAddEvent(QKeyEvent *e, QKeySequence::StandardKey matchKey); + private: QList m_cursors; }; diff --git a/src/plugins/texteditor/tabsettings.cpp b/src/plugins/texteditor/tabsettings.cpp index c61a0b3fb33..c363815572f 100644 --- a/src/plugins/texteditor/tabsettings.cpp +++ b/src/plugins/texteditor/tabsettings.cpp @@ -204,6 +204,11 @@ int TabSettings::columnAt(const QString &text, int position) const return column; } +int TabSettings::columnAtCursorPosition(const QTextCursor &cursor) const +{ + return columnAt(cursor.block().text(), cursor.positionInBlock()); +} + int TabSettings::positionAtColumn(const QString &text, int column, int *offset, bool allowOverstep) const { int col = 0; diff --git a/src/plugins/texteditor/tabsettings.h b/src/plugins/texteditor/tabsettings.h index e73d81b3651..c6446046a81 100644 --- a/src/plugins/texteditor/tabsettings.h +++ b/src/plugins/texteditor/tabsettings.h @@ -66,6 +66,7 @@ public: int lineIndentPosition(const QString &text) const; int columnAt(const QString &text, int position) const; + int columnAtCursorPosition(const QTextCursor &cursor) const; int positionAtColumn(const QString &text, int column, int *offset = nullptr, bool allowOverstep = false) const; int columnCountForText(const QString &text, int startColumn = 0) const; int indentedColumn(int column, bool doIndent = true) const; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 7a769703895..499897522db 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -782,6 +782,18 @@ public: bool m_scrollBarUpdateScheduled = false; const MultiTextCursor m_cursors; + struct BlockSelection + { + int blockNumber = -1; + int column = -1; + int anchorBlockNumber = -1; + int anchorColumn = -1; + }; + QList m_blockSelections; + QList generateCursorsForBlockSelection(const BlockSelection &blockSelection); + void initBlockSelection(); + void clearBlockSelection(); + void handleMoveBlockSelection(QTextCursor::MoveOperation op); class UndoCursor { @@ -1348,6 +1360,81 @@ void TextEditorWidgetPrivate::updateAutoCompleteHighlight() q->setExtraSelections(TextEditorWidget::AutoCompleteSelection, extraSelections); } +QList TextEditorWidgetPrivate::generateCursorsForBlockSelection( + const BlockSelection &blockSelection) +{ + const TabSettings tabSettings = m_document->tabSettings(); + + QList result; + QTextBlock block = m_document->document()->findBlockByNumber(blockSelection.anchorBlockNumber); + QTextCursor cursor(block); + cursor.setPosition(block.position() + + tabSettings.positionAtColumn(block.text(), blockSelection.anchorColumn)); + + const bool forward = blockSelection.blockNumber > blockSelection.anchorBlockNumber + || (blockSelection.blockNumber == blockSelection.anchorBlockNumber + && blockSelection.column == blockSelection.anchorColumn); + + while (block.isValid()) { + const QString &blockText = block.text(); + cursor.setPosition(block.position() + + tabSettings.positionAtColumn(blockText, blockSelection.anchorColumn)); + cursor.setPosition(block.position() + + tabSettings.positionAtColumn(blockText, blockSelection.column), + QTextCursor::KeepAnchor); + result.append(cursor); + if (block.blockNumber() == blockSelection.blockNumber) + break; + block = forward ? block.next() : block.previous(); + } + return result; +} + +void TextEditorWidgetPrivate::initBlockSelection() +{ + const TabSettings tabSettings = m_document->tabSettings(); + for (const QTextCursor &cursor : m_cursors) { + const int column = tabSettings.columnAtCursorPosition(cursor); + QTextCursor anchor = cursor; + anchor.setPosition(anchor.anchor()); + const int anchorColumn = tabSettings.columnAtCursorPosition(anchor); + m_blockSelections.append({cursor.blockNumber(), column, anchor.blockNumber(), anchorColumn}); + } +} + +void TextEditorWidgetPrivate::clearBlockSelection() +{ + m_blockSelections.clear(); +} + +void TextEditorWidgetPrivate::handleMoveBlockSelection(QTextCursor::MoveOperation op) +{ + if (m_blockSelections.isEmpty()) + initBlockSelection(); + QList cursors; + for (BlockSelection &blockSelection : m_blockSelections) { + switch (op) { + case QTextCursor::Up: + blockSelection.blockNumber = qMax(0, blockSelection.blockNumber - 1); + break; + case QTextCursor::Down: + blockSelection.blockNumber = qMin(m_document->document()->blockCount() - 1, + blockSelection.blockNumber + 1); + break; + case QTextCursor::NextCharacter: + ++blockSelection.column; + break; + case QTextCursor::PreviousCharacter: + blockSelection.column = qMax(0, blockSelection.column - 1); + break; + default: + return; + } + cursors.append(generateCursorsForBlockSelection(blockSelection)); + } + q->setMultiTextCursor(MultiTextCursor(cursors)); +} + void TextEditorWidget::selectEncoding() { TextDocument *doc = d->m_document.data(); @@ -2181,6 +2268,8 @@ static inline bool isPrintableText(const QString &text) void TextEditorWidget::keyPressEvent(QKeyEvent *e) { + ExecuteOnDestruction eod([&]() { d->clearBlockSelection(); }); + if (!isModifier(e) && mouseHidingEnabled()) viewport()->setCursor(Qt::BlankCursor); ToolTip::hide(); @@ -2420,7 +2509,23 @@ void TextEditorWidget::keyPressEvent(QKeyEvent *e) } if (ro || !isPrintableText(eventText)) { - if (!d->cursorMoveKeyEvent(e)) { + QTextCursor::MoveOperation blockSelectionOperation = QTextCursor::NoMove; + if (e->modifiers() & Qt::AltModifier && !Utils::HostOsInfo::isMacHost()) { + if (MultiTextCursor::multiCursorAddEvent(e, QKeySequence::MoveToNextLine)) + blockSelectionOperation = QTextCursor::Down; + else if (MultiTextCursor::multiCursorAddEvent(e, QKeySequence::MoveToPreviousLine)) + blockSelectionOperation = QTextCursor::Up; + else if (MultiTextCursor::multiCursorAddEvent(e, QKeySequence::MoveToNextChar)) + blockSelectionOperation = QTextCursor::NextCharacter; + else if (MultiTextCursor::multiCursorAddEvent(e, QKeySequence::MoveToPreviousChar)) + blockSelectionOperation = QTextCursor::PreviousCharacter; + } + + if (blockSelectionOperation != QTextCursor::NoMove) { + auto doNothing = [](){}; + eod.reset(doNothing); + d->handleMoveBlockSelection(blockSelectionOperation); + } else if (!d->cursorMoveKeyEvent(e)) { QTextCursor cursor = textCursor(); bool cursorWithinSnippet = false; if (d->m_snippetOverlay->isVisible() @@ -5134,7 +5239,7 @@ void TextEditorWidget::mouseMoveEvent(QMouseEvent *e) cursor.addCursor(c); } cursor.mergeCursors(); - if (!cursor.isNull() && cursor != multiTextCursor()) + if (!cursor.isNull()) setMultiTextCursor(cursor); } else { if (startMouseMoveCursor.has_value())