aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Jenssen <tim.jenssen@qt.io>2024-04-10 17:30:10 +0200
committerTim Jenssen <tim.jenssen@qt.io>2024-04-10 17:30:10 +0200
commit912082e6a81e0919e29ef0ecaed5b1e5d5292966 (patch)
tree99e8b7c7bf4e7cf726f76ab4cddcfbe69b270a33
parent682514a30403184eae7ecd1f6edef4c7e1833ccf (diff)
parentac6a2aeae404a278821c5cb6f47a7f07ff2bfc5e (diff)
Merge remote-tracking branch 'origin/13.0' into qds/dev
-rw-r--r--cmake/QtCreatorIDEBranding.cmake4
-rw-r--r--doc/qtcreator/config/style/qt5-sidebar.html7
-rw-r--r--doc/qtcreator/images/qtcreator-editor-open-files.webpbin12420 -> 10972 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-editor-symbols.webpbin16948 -> 17952 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-filesystem-view-design.webpbin0 -> 7396 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-filesystem-view.webpbin8870 -> 7184 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-scxml-editor.webpbin32822 -> 39652 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-sidebar.pngbin18628 -> 0 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-sidebar.webpbin0 -> 12582 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-toggle-progress-bar.webpbin1946 -> 2146 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-welcome-open-projects.webpbin17760 -> 12290 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-welcome-session.pngbin3341 -> 0 bytes
-rw-r--r--doc/qtcreator/images/qtcreator-welcome-session.webpbin0 -> 2282 bytes
-rw-r--r--doc/qtcreator/src/docker/creator-docker.qdoc2
-rw-r--r--doc/qtcreator/src/editors/creator-code-syntax.qdoc32
-rw-r--r--doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc3
-rw-r--r--doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc9
-rw-r--r--doc/qtcreator/src/howto/creator-sessions.qdoc4
-rw-r--r--doc/qtcreator/src/qtquick/qtquick-modules-with-plugins.qdoc43
-rw-r--r--doc/qtcreator/src/user-interface/creator-file-system-view.qdoc23
-rw-r--r--doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc2
-rw-r--r--qbs/modules/qtc/qtc.qbs4
-rw-r--r--share/qtcreator/translations/qtcreator_de.ts128
m---------src/libs/qlitehtml0
-rw-r--r--src/libs/utils/fsengine/diriterator.h20
-rw-r--r--src/libs/utils/fsengine/fileiteratordevicesappender.h106
-rw-r--r--src/libs/utils/fsengine/fixedlistfsengine.h11
-rw-r--r--src/libs/utils/fsengine/fsengine_impl.cpp15
-rw-r--r--src/libs/utils/fsengine/fsengine_impl.h15
-rw-r--r--src/libs/utils/fsengine/fsenginehandler.cpp34
-rw-r--r--src/libs/utils/fsengine/fsenginehandler.h4
-rw-r--r--src/libs/utils/fsengine/rootinjectfsengine.h12
-rw-r--r--src/plugins/android/androidconfigurations.cpp13
-rw-r--r--src/plugins/android/androidconstants.h7
-rw-r--r--src/plugins/android/androidqtversion.cpp38
-rw-r--r--src/plugins/android/androidqtversion.h1
-rw-r--r--src/plugins/axivion/axivionplugin.cpp5
-rw-r--r--src/plugins/clangtools/clangtoolsutils.cpp5
-rw-r--r--src/plugins/cmakeprojectmanager/fileapidataextractor.cpp19
-rw-r--r--src/plugins/coreplugin/icore.cpp47
-rw-r--r--src/plugins/coreplugin/manhattanstyle.cpp40
-rw-r--r--src/plugins/debugger/dap/pydapengine.cpp5
-rw-r--r--src/plugins/projectexplorer/devicesupport/idevice.cpp4
-rw-r--r--src/plugins/qmljseditor/qmljshoverhandler.cpp4
-rw-r--r--src/plugins/qtsupport/examplesparser.cpp6
-rw-r--r--src/plugins/remotelinux/linuxdevice.cpp2
-rw-r--r--src/plugins/texteditor/syntaxhighlighter.h2
-rw-r--r--src/plugins/texteditor/texteditorsettings.cpp8
-rw-r--r--src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp23
-rw-r--r--tests/system/shared/classes.py7
-rw-r--r--tests/system/shared/project.py2
-rw-r--r--tests/system/shared/qtcreator.py6
-rw-r--r--tests/system/shared/utils.py21
-rw-r--r--tests/system/suite_HELP/tst_HELP02/test.py8
-rw-r--r--tests/system/suite_editors/tst_revert_changes/test.py2
-rw-r--r--tests/system/suite_general/tst_cmake_speedcrunch/test.py4
-rw-r--r--tests/system/suite_general/tst_rename_file/test.py7
-rw-r--r--tests/system/suite_qtquick/tst_qml_outline/test.py2
-rw-r--r--tests/system/suite_tools/tst_codepasting/test.py2
59 files changed, 471 insertions, 297 deletions
diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake
index 801573093da..1310d12dfb2 100644
--- a/cmake/QtCreatorIDEBranding.cmake
+++ b/cmake/QtCreatorIDEBranding.cmake
@@ -1,6 +1,6 @@
-set(IDE_VERSION "13.0.0") # The IDE version.
+set(IDE_VERSION "13.0.1") # The IDE version.
set(IDE_VERSION_COMPAT "13.0.0") # The IDE Compatibility version.
-set(IDE_VERSION_DISPLAY "13.0.0") # The IDE display version.
+set(IDE_VERSION_DISPLAY "13.0.1") # The IDE display version.
set(IDE_COPYRIGHT_YEAR "2024") # The IDE current copyright year.
set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation.
diff --git a/doc/qtcreator/config/style/qt5-sidebar.html b/doc/qtcreator/config/style/qt5-sidebar.html
index 509808af114..327bd27a293 100644
--- a/doc/qtcreator/config/style/qt5-sidebar.html
+++ b/doc/qtcreator/config/style/qt5-sidebar.html
@@ -74,12 +74,15 @@
<li><a href="creator-keyboard-shortcuts.html">Keyboard Shortcuts</a></li>
<li><a href="creator-known-issues.html">Known Issues</a></li>
<li><a href="technical-support.html">Technical Support</a></li>
+ <li><a href="creator-version-control.html">Version Control Systems</a></li>
+ <li><a href="creator-reference.html#analyzers">Analyzers</a></li>
+ <li><a href="creator-reference.html#build-configurations">Build Configurations</a></li>
<li><a href="creator-reference.html#build-systems">Build Systems</a></li>
- <li><a href="creator-reference.html#Editors">Editors</a></li>
+ <li><a href="creator-reference.html#editors">Editors</a></li>
<li><a href="creator-reference.html#platforms">Platforms</a></li>
<li><a href="creator-reference.html#preferences">Preferences</a></li>
+ <li><a href="creator-reference.html#run-configurations">Run Configurations</a></li>
<li><a href="creator-reference.html#ui-design">UI Design</a></li>
- <li><a href="creator-version-control.html">Version Control Systems</a></li>
<li><a href="creator-reference.html#views">Views</a></li>
<li><a href="creator-reference.html">See All</a></li>
</ul>
diff --git a/doc/qtcreator/images/qtcreator-editor-open-files.webp b/doc/qtcreator/images/qtcreator-editor-open-files.webp
index 3ec7e58ae9d..f01cf7c52d9 100644
--- a/doc/qtcreator/images/qtcreator-editor-open-files.webp
+++ b/doc/qtcreator/images/qtcreator-editor-open-files.webp
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-editor-symbols.webp b/doc/qtcreator/images/qtcreator-editor-symbols.webp
index 70bcc2b442c..a42455aab80 100644
--- a/doc/qtcreator/images/qtcreator-editor-symbols.webp
+++ b/doc/qtcreator/images/qtcreator-editor-symbols.webp
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-filesystem-view-design.webp b/doc/qtcreator/images/qtcreator-filesystem-view-design.webp
new file mode 100644
index 00000000000..9d5995e416c
--- /dev/null
+++ b/doc/qtcreator/images/qtcreator-filesystem-view-design.webp
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-filesystem-view.webp b/doc/qtcreator/images/qtcreator-filesystem-view.webp
index 957a0e4b1b9..f16a8060c41 100644
--- a/doc/qtcreator/images/qtcreator-filesystem-view.webp
+++ b/doc/qtcreator/images/qtcreator-filesystem-view.webp
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-scxml-editor.webp b/doc/qtcreator/images/qtcreator-scxml-editor.webp
index d57a50dfb76..f78f7ff3d37 100644
--- a/doc/qtcreator/images/qtcreator-scxml-editor.webp
+++ b/doc/qtcreator/images/qtcreator-scxml-editor.webp
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-sidebar.png b/doc/qtcreator/images/qtcreator-sidebar.png
deleted file mode 100644
index 47d4e5e1f85..00000000000
--- a/doc/qtcreator/images/qtcreator-sidebar.png
+++ /dev/null
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-sidebar.webp b/doc/qtcreator/images/qtcreator-sidebar.webp
new file mode 100644
index 00000000000..fdf86400258
--- /dev/null
+++ b/doc/qtcreator/images/qtcreator-sidebar.webp
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-toggle-progress-bar.webp b/doc/qtcreator/images/qtcreator-toggle-progress-bar.webp
index c8438ae0026..d4170d4bc12 100644
--- a/doc/qtcreator/images/qtcreator-toggle-progress-bar.webp
+++ b/doc/qtcreator/images/qtcreator-toggle-progress-bar.webp
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-welcome-open-projects.webp b/doc/qtcreator/images/qtcreator-welcome-open-projects.webp
index 5281669b407..05af411f2dd 100644
--- a/doc/qtcreator/images/qtcreator-welcome-open-projects.webp
+++ b/doc/qtcreator/images/qtcreator-welcome-open-projects.webp
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-welcome-session.png b/doc/qtcreator/images/qtcreator-welcome-session.png
deleted file mode 100644
index 669ec914231..00000000000
--- a/doc/qtcreator/images/qtcreator-welcome-session.png
+++ /dev/null
Binary files differ
diff --git a/doc/qtcreator/images/qtcreator-welcome-session.webp b/doc/qtcreator/images/qtcreator-welcome-session.webp
new file mode 100644
index 00000000000..7a67042f1cb
--- /dev/null
+++ b/doc/qtcreator/images/qtcreator-welcome-session.webp
Binary files differ
diff --git a/doc/qtcreator/src/docker/creator-docker.qdoc b/doc/qtcreator/src/docker/creator-docker.qdoc
index 15f147d475c..c63ab4b3b59 100644
--- a/doc/qtcreator/src/docker/creator-docker.qdoc
+++ b/doc/qtcreator/src/docker/creator-docker.qdoc
@@ -22,7 +22,7 @@
{debuggers} and \l{Add Qt versions}{Qt versions}, in the Docker container
and creates kits for the devices.
- You can use CMake or qmake to build applications in the Docker container.
+ You are advised to use CMake to build applications in the Docker container.
To pull images from Docker hub or other registries, use the
\l{https://docs.docker.com/engine/reference/commandline/pull/}{docker pull}
diff --git a/doc/qtcreator/src/editors/creator-code-syntax.qdoc b/doc/qtcreator/src/editors/creator-code-syntax.qdoc
index f20ecadb8e5..5a383f9df8d 100644
--- a/doc/qtcreator/src/editors/creator-code-syntax.qdoc
+++ b/doc/qtcreator/src/editors/creator-code-syntax.qdoc
@@ -66,9 +66,6 @@
\section1 Set line annotation positions
- To specify the position of the line annotations when looking at them in the
- code editor, select \uicontrol {Annotation Settings} in the tooltip popup.
-
To specify the position where the annotations are displayed, go to
\preferences > \uicontrol {Text Editor} >
\uicontrol Display > \uicontrol {Line annotations}, and then select
@@ -83,13 +80,7 @@
view them.
\if defined(qtcreator)
- \section1 Inspect QML and JavaScript
-
- To inspect QML and JavaScript properties, methods, and enums, move the
- cursor over them and go to \uicontrol Tools > \uicontrol {QML/JS} >
- \uicontrol {Inspect API for Element Under Cursor}.
-
- \sa {Clangd}
+ \sa {Analyze code with Clang-Tidy and Clazy}
\endif
\sa {JavaScript and QML Checks}
@@ -760,24 +751,21 @@
\section1 Resetting the Code Model
- If you change the build and run kit when you have QML files open in the code
- editor, the code model might become corrupt. The following error message
- indicates that this might have happened: \e{Using Qt Quick 1 code model
- instead of Qt Quick 2}.
+ If you see the following error messages after you add a new QML module,
+ try building the project and then resetting the code model:
+
+ \list
+ \li QML module not found.
+ \li Unknown Component (M300).
+ \endlist
- To see the error message, move the mouse pointer over code that
+ To see an error message, move the mouse pointer over code that
\QC underlines in the code editor or when you open a QML file in \QDS.
To reset the code model, select \uicontrol Tools > \uicontrol {QML/JS} >
\uicontrol {Reset Code Model}.
- \if defined(qtcreator)
- If this does not help, try changing the QML emulation layer to the one that
- was built with the same Qt version as the one selected in the build and run
- kit.
- \endif
-
- \sa {Check code syntax}
+ \sa {Check code syntax}, {Using QML Modules with Plugins}
*/
/*!
diff --git a/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc b/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc
index 0e8bba269a7..dbf8b219ed0 100644
--- a/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc
+++ b/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc
@@ -184,7 +184,8 @@
\title Move between files
- The editor toolbar shows the file that is currently open (1) in the editor.
+ The editor toolbar shows the name of the file that is currently open (1) in
+ the editor.
\image qtcreator-editor-open-files.webp {Current file shown on Edit mode toolbar}
diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc
index 1b545943e3e..395c09ad72e 100644
--- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc
+++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc
@@ -423,6 +423,12 @@
\uicontrol {Find References to Symbol Under Cursor}.
\endlist
+ \section1 Inspect QML and JavaScript
+
+ To inspect QML and JavaScript properties, methods, and enums, place the
+ cursor over them and go to \uicontrol Tools > \uicontrol {QML/JS} >
+ \uicontrol {Inspect API for Element Under Cursor}.
+
\section1 Move between QML and C++
To move to the C++ implementation of a QML type in the code editor, place the
@@ -433,7 +439,8 @@
\li Go to \uicontrol {Follow Symbol Under Cursor} in the context menu.
\endlist
- \sa {Edit Code}{How To: Edit Code}, {Edit Mode}, {Navigate with locator}
+ \sa {Edit Code}{How To: Edit Code}, {Clangd}, {Edit Mode},
+ {Navigate with locator}
*/
/*!
diff --git a/doc/qtcreator/src/howto/creator-sessions.qdoc b/doc/qtcreator/src/howto/creator-sessions.qdoc
index 318502e54c4..0f455cbc0fc 100644
--- a/doc/qtcreator/src/howto/creator-sessions.qdoc
+++ b/doc/qtcreator/src/howto/creator-sessions.qdoc
@@ -60,7 +60,7 @@
To manage sessions, select \uicontrol File > \uicontrol Sessions > \uicontrol Manage.
- \image qtcreator-session-manager.png
+ \image qtcreator-session-manager.png {Session Manager}
To save a session under a new name, select \uicontrol Clone.
@@ -97,7 +97,7 @@
\key Ctrl+Alt+<number>, where \e <number> is the number of the session to
open (available for the first nine sessions).
- \image qtcreator-welcome-session.png
+ \image qtcreator-welcome-session.webp {Sessions in the Welcome mode}
To view more information about a session, select the down arrow icon that
appears when you move the mouse cursor over the session name. Select actions
diff --git a/doc/qtcreator/src/qtquick/qtquick-modules-with-plugins.qdoc b/doc/qtcreator/src/qtquick/qtquick-modules-with-plugins.qdoc
index 299bd057720..46651d8748a 100644
--- a/doc/qtcreator/src/qtquick/qtquick-modules-with-plugins.qdoc
+++ b/doc/qtcreator/src/qtquick/qtquick-modules-with-plugins.qdoc
@@ -36,22 +36,25 @@
\list 1
\li Create custom components and place all the \c .qml files in a
- directory dedicated to your module. For example:
+ directory dedicated to your module. For example,
\c {imports\asset_imports}.
- \li For Qt Quick UI Prototype projects (.qmlproject), specify the path to
+ \if defined(qtcreator)
+ \li For Qt Quick UI Prototype projects (.qmlproject), specify the path to
the directory that has the module in the .qmlproject file
of the application where you want to use the module
- as a value of the \c importPaths variable. For example
+ as a value of the \c importPaths variable. For example,
\c{importPaths: [ "imports", "asset_imports" ]}.
-
+ \else
+ \li Specify the path to the directory that has the module in the
+ .qmlproject file of the application where you want to use the module
+ as a value of the \c importPaths variable. For example,
+ \c{importPaths: [ "imports", "asset_imports" ]}.
+ \endif
\li Create a \c qmldir file for your module and place it
in the module directory. For more information, see
\l {Module Definition qmldir Files}.
- \li Create a \c qmltypes file, as instructed in
- \l {Generating Type Description Files}.
-
\li Create a directory named \c designer in your module directory.
\li Create a \c .metainfo file for your module and place it in the
@@ -66,18 +69,29 @@
\if defined(qtcreator)
\li Import the module into the project, as instructed in
\l {Importing QML Modules}.
- \endlist
\else
\li Build your module using the same Qt version and compiler as \QDS.
- For more information, see \l {Running QML Modules in Design Mode}.
+
+ Your module and components should now appear in \uicontrol Components.
+ \endif
+
\endlist
- Your module should now appear in \uicontrol Components. Your components
- should appear in a subsection of \uicontrol Components if a valid
- \c .metainfo file is in place.
+ \note If \QC cannot find the new QML module, build the project
+ and then go to \uicontrol {Tools} > \uicontrol {QML/JS} >
+ \uicontrol {Reset Code Model} to reset the code model.
+ \if defined(qtdesignstudio)
+ For more information about how to show the \uicontrol {Tools} menu, see
+ \l{Customizing the Menu}.
\endif
- \section1 Generating Type Description Files
+ \if defined(qtcreator)
+ \section1 Developing with Qt 6.1 or Earlier
+
+ Since Qt 6.2, CMake generates the \c qmltypes and \c qmldir files
+ automatically.
+
+ \section2 Generating Type Description Files
When \l{Defining QML Types from C++}{registering QML types}, make sure that
the QML module has a \c{plugins.qmltypes} file. Ideally, it should be located
@@ -110,6 +124,7 @@
\endcode
The import path affects all the targets built by the CMake project.
+ \endif
\if defined(qtdesignstudio)
\section1 Running QML Modules in Design Mode
@@ -128,4 +143,6 @@
environment variable to check whether the plugin is currently being run
by an application or edited in the \uicontrol Design mode.
\endif
+
+ \sa {Resetting the Code Model}
*/
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 ee93c4179b8..a8ce9dbb5ac 100644
--- a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc
+++ b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc
@@ -32,11 +32,11 @@
\image filesystem-view-design.webp {File System view}
\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
- directory. Further, you can select a project to move to an open project
- or \uicontrol Projects to move to the directory specified in the
- \uicontrol {Projects directory} field in \preferences >
+ To go to the root directory of the file system, select \uicontrol Computer
+ in the menu (1). Select \uicontrol Home to go to the user's home
+ directory. Further, you can select a project to go to an open project
+ or \uicontrol Projects to go to the directory specified in
+ \uicontrol {Projects directory} in \preferences >
\uicontrol {Build & Run} > \uicontrol General.
The file that is currently active in the editor determines which folder
@@ -50,8 +50,8 @@
\endlist
To stop the synchronization between the editor and the
- \uicontrol {File System} view, deselect the \inlineimage icons/linkicon.png
- (\uicontrol {Synchronize Root Directory with Editor}) button.
+ \uicontrol {File System} view, clear \inlineimage icons/linkicon.png
+ (\uicontrol {Synchronize Root Directory with Editor}).
The view displays the path to the active file as bread crumbs. You can move
to any directory along the path by clicking it.
@@ -96,16 +96,15 @@
(\uicontrol Options):
\list
- \li To hide the bread crumbs, deselect the
- \uicontrol {Show Bread Crumbs} check box.
+ \li To hide the bread crumbs, clear \uicontrol {Show Bread Crumbs}.
\li By default, the view separates folders from files and lists them
- first. To list all items in alphabetic order, deselect the
- \uicontrol {Show Folders on Top} check box.
+ first. To list all items in alphabetic order, clear
+ \uicontrol {Show Folders on Top}.
\li To also show hidden files, select \uicontrol {Show Hidden Files}.
\endlist
To stop the synchronization with the file currently open in the
- editor, deselect \inlineimage icons/linkicon.png
+ editor, clear \inlineimage icons/linkicon.png
(\uicontrol {Synchronize with Editor}).
\sa {View CMake project contents}, {Projects}
diff --git a/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc b/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc
index 230ce2adde6..106562ab55d 100644
--- a/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc
+++ b/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc
@@ -15,7 +15,7 @@
Select views in the sidebar menu (1):
- \image qtcreator-sidebar.png
+ \image qtcreator-sidebar.webp {Views open in the sidebar}
You can change the view of the sidebars in the following ways:
diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs
index bfc2cae516d..d51678e415b 100644
--- a/qbs/modules/qtc/qtc.qbs
+++ b/qbs/modules/qtc/qtc.qbs
@@ -4,10 +4,10 @@ import qbs.FileInfo
import qbs.Utilities
Module {
- property string qtcreator_display_version: '13.0.0'
+ property string qtcreator_display_version: '13.0.1'
property string ide_version_major: '13'
property string ide_version_minor: '0'
- property string ide_version_release: '0'
+ property string ide_version_release: '1'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
+ ide_version_release
diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts
index bcd42919e80..28c3e2c44ce 100644
--- a/share/qtcreator/translations/qtcreator_de.ts
+++ b/share/qtcreator/translations/qtcreator_de.ts
@@ -10612,23 +10612,23 @@ Locked components cannot be modified or selected.</source>
</message>
<message>
<source>The selected path does not exist or is not readable.</source>
- <translation type="unfinished"></translation>
+ <translation>Der ausgewählte Pfad existiert nicht oder ist nicht lesbar.</translation>
</message>
<message>
<source>Could not find &quot;%1&quot; in the selected path.</source>
- <translation type="unfinished"></translation>
+ <translation>&quot;%1&quot; konnte im ausgewählten Pfad nicht gefunden werden.</translation>
</message>
<message>
<source>The selected path does not contain a valid JDK. (%1 failed: %2)</source>
- <translation type="unfinished"></translation>
+ <translation>Der ausgewählte Pfad enthält kein gültiges JDK. (%1 ist fehlgeschlagen: %2)</translation>
</message>
<message>
<source>Unexpected output from &quot;%1&quot;: %2</source>
- <translation type="unfinished"></translation>
+ <translation>Unerwartete Ausgabe von &quot;%1&quot;: %2</translation>
</message>
<message>
<source>Unsupported JDK version (needs to be %1): %2 (parsed: %3)</source>
- <translation type="unfinished"></translation>
+ <translation>JDK-Version wird nicht unterstützt (muss %1 sein): %2 (erkannt: %3)</translation>
</message>
<message>
<source>OpenSSL path exists.</source>
@@ -13267,11 +13267,11 @@ Weitere Informationen über GTest-Filter finden Sie in der Dokumenation von Goog
</message>
<message>
<source>Find user-defined locations</source>
- <translation type="unfinished"></translation>
+ <translation>Benutzerdefinierte Positionen finden</translation>
</message>
<message>
<source>Parse messages for the following pattern and use it as location information:&lt;pre&gt;file://filepath:line&lt;/pre&gt;where &quot;:line&quot; is optional.&lt;p&gt;Warning: If the patterns are used in code, the location information for debug messages and other messages might improve,at the risk of some incorrect locations and lower performance.</source>
- <translation type="unfinished"></translation>
+ <translation>Wertet Nachrichten nach den folgenden Mustern aus und benutzt sie als Positionsinformation:&lt;pre&gt;file://dateipfad:zeile&lt;/pre&gt;wobei &quot;:zeile&quot; optional ist.&lt;p&gt;Achtung: Wenn diese Muster im Code benutzt werden, können sich die Positionsinformationen für Debug- und andere Nachrichten verbessern, es besteht aber die Gefahr falscher Positionen und verringerter Leistung.</translation>
</message>
<message>
<source>Callgrind</source>
@@ -13636,11 +13636,11 @@ Siehe auch die Einstellungen für Google Test.</translation>
</message>
<message>
<source>Locate Qt Test data tags</source>
- <translation type="unfinished"></translation>
+ <translation>Qt Test Data Tags finden</translation>
</message>
<message>
<source>Locates Qt Test data tags found inside the active project.</source>
- <translation type="unfinished"></translation>
+ <translation>Findet Qt Test Data Tags im aktiven Projekt.</translation>
</message>
</context>
<context>
@@ -15975,11 +15975,11 @@ Zum Beispiel bewirkt die Angabe &quot;Revision: 15&quot; dass der Branch auf Rev
</message>
<message>
<source>Use junctions for CMake configuration and build operations</source>
- <translation type="unfinished"></translation>
+ <translation>Junctions für die CMake-Konfiguration und das Erstellen benutzen</translation>
</message>
<message>
<source>Create and use junctions for the source and build directories to overcome issues with long paths on Windows.&lt;br&gt;&lt;br&gt;Junctions are stored under &lt;tt&gt;C:\ProgramData\QtCreator\Links&lt;/tt&gt; (overridable via the &lt;tt&gt;QTC_CMAKE_JUNCTIONS_DIR&lt;/tt&gt; environment variable).&lt;br&gt;&lt;br&gt;With &lt;tt&gt;QTC_CMAKE_JUNCTIONS_HASH_LENGTH&lt;/tt&gt;, you can shorten the MD5 hash key length to a value smaller than the default length value of 32.&lt;br&gt;&lt;br&gt;Junctions are used for CMake configure, build and install operations.</source>
- <translation type="unfinished"></translation>
+ <translation>Erstellt und benutzt Junctions für die Quell- und Build-Verzeichnisse, um Probleme mit langen Pfaden auf Windows zu umgehen.&lt;br&gt;&lt;br&gt;Junctions werden unter &lt;tt&gt;C:\ProgramData\QtCreator\Links&lt;/tt&gt; gespeichert (überschreibbar mit der Umgebungsvariable &lt;tt&gt;QTC_CMAKE_JUNCTIONS_DIR&lt;/tt&gt;).&lt;br&gt;&lt;br&gt;Sie können mit der Umgebungsvariable &lt;tt&gt;QTC_CMAKE_JUNCTIONS_HASH_LENGTH&lt;/tt&gt; die Länge des MD5-Hashschlüssels auf einen kleineren Wert als die Voreinstellung 32 verkürzen.&lt;br&gt;&lt;br&gt;Junctions werden für das Konfigurieren mit CMake, das Erstellen und die Installation benutzt.</translation>
</message>
<message>
<source>General</source>
@@ -39335,7 +39335,7 @@ Bitte versuchen Sie es erneut.</translation>
</message>
<message>
<source>Expand</source>
- <translation>Erweitern</translation>
+ <translation>Aufklappen</translation>
</message>
<message>
<source>Ctrl+T</source>
@@ -39463,11 +39463,11 @@ Bitte versuchen Sie es erneut.</translation>
</message>
<message>
<source>Debug Run Configuration</source>
- <translation type="unfinished"></translation>
+ <translation>Ausführungskonfiguration debuggen</translation>
</message>
<message>
<source>Starts debugging a run configuration of the active project.</source>
- <translation type="unfinished"></translation>
+ <translation>Startet das Debuggen einer Ausführungskonfiguration des aktiven Projekts.</translation>
</message>
<message>
<source>Switch Run Configuration</source>
@@ -40109,7 +40109,7 @@ The name of the build configuration created by default for a generic project.</e
</message>
<message>
<source>Remote process did not finish in time. Connectivity lost?</source>
- <translation type="unfinished"></translation>
+ <translation>Der entfernte Prozess wurde nicht rechtzeitig beendet. Verbindung verloren?</translation>
</message>
<message>
<source>Starting %1...</source>
@@ -41916,7 +41916,7 @@ Sie sollten nicht mehrere Test-Frameworks im selben Projekt mischen.</translatio
</message>
<message>
<source>Include QQuickItem</source>
- <translation type="unfinished"></translation>
+ <translation>QQuickItem einbinden</translation>
</message>
<message>
<source>Qt 6.2</source>
@@ -42144,23 +42144,23 @@ Sie sollten nicht mehrere Test-Frameworks im selben Projekt mischen.</translatio
</message>
<message>
<source>Creates a translation file that you can add to a Qt project.</source>
- <translation type="unfinished"></translation>
+ <translation>Erzeugt eine Übersetzungsdatei, die Sie zu einem Qt-Projekt hinzufügen können.</translation>
</message>
<message>
<source>Qt Translation File</source>
- <translation type="unfinished"></translation>
+ <translation>Qt Ãœbersetzungsdatei</translation>
</message>
<message>
<source>2.x</source>
- <translation type="unfinished"></translation>
+ <translation>2.x</translation>
</message>
<message>
<source>3.x</source>
- <translation type="unfinished"></translation>
+ <translation>3.x</translation>
</message>
<message>
<source>Catch2 version:</source>
- <translation type="unfinished"></translation>
+ <translation>Catch2-Version:</translation>
</message>
<message>
<source>Creates a CMake-based test project for which a code snippet can be entered.</source>
@@ -42689,7 +42689,8 @@ Sie sollten nicht mehrere Test-Frameworks im selben Projekt mischen.</translatio
<message>
<source>* Failed to create: %1
</source>
- <translation type="unfinished"></translation>
+ <translation>* Erstellen fehlgeschlagen: %1
+</translation>
</message>
<message>
<source>The platform selected for the wizard.</source>
@@ -42821,7 +42822,7 @@ Sie sollten nicht mehrere Test-Frameworks im selben Projekt mischen.</translatio
</message>
<message>
<source>Project &quot;%1&quot; was configured for kit &quot;%2&quot; with id %3, which does not exist anymore. You can create a new kit or copy the steps of the vanished kit to another kit in %4 mode.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Projekt &quot;%1&quot; wurde für das Kit &quot;%2&quot; mit ID %3 konfiguriert, das nicht mehr existiert. Sie können im %4-Modus ein neues Kit erstellen oder die Schritte des verschwundenen Kits in ein anderes Kit kopieren.</translation>
</message>
<message>
<source>Could not find any qml_*.qm file at &quot;%1&quot;</source>
@@ -43073,40 +43074,40 @@ Sie werden erhalten.</numerusform>
</message>
<message>
<source>The project was configured for kits that no longer exist. Select one of the following options in the context menu to restore the project&apos;s settings:</source>
- <translation type="unfinished"></translation>
+ <translation>Das Projekt wurde für Kits konfiguriert, die nicht mehr existieren. Wählen Sie eine der folgenden Optionen aus dem Kontextmenü, um die Projekteinstellungen wiederherzustellen:</translation>
</message>
<message>
<source>Create a new kit with the same name for the same device type, with the original build, deploy, and run steps. Other kit settings are not restored.</source>
- <translation type="unfinished"></translation>
+ <translation>Erstelle ein neues Kit mit demselben Namen und für denselben Gerätetyp mit den ursprünglichen Schritten zum Erstellen, Deployment und Ausführen. Andere Einstellungen des Kits werden nicht wiederhergestellt.</translation>
</message>
<message>
<source>Copy the build, deploy, and run steps to another kit.</source>
- <translation type="unfinished"></translation>
+ <translation>Kopiere die Schritte zum Erstellen, Deployment und Ausführen in ein anderes Kit.</translation>
</message>
<message>
<source>%1 (%2)</source>
<extracomment>vanished target display role: vanished target name (device type name)</extracomment>
- <translation type="unfinished">%1 (%2)</translation>
+ <translation>%1 (%2)</translation>
</message>
<message>
<source>Create a New Kit</source>
- <translation type="unfinished"></translation>
+ <translation>Ein neues Kit erstellen</translation>
</message>
<message>
<source>Copy Steps to Another Kit</source>
- <translation type="unfinished"></translation>
+ <translation>Schritte in ein anderes Kit kopieren</translation>
</message>
<message>
<source>Remove Vanished Target &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
+ <translation>Verschwundenes Ziel &quot;%1&quot; entfernen</translation>
</message>
<message>
<source>Remove All Vanished Targets</source>
- <translation type="unfinished"></translation>
+ <translation>Alle verschwundenen Ziele entfernen</translation>
</message>
<message>
<source>Vanished Targets</source>
- <translation type="unfinished"></translation>
+ <translation>Verschwundene Ziele</translation>
</message>
<message>
<source>Project Settings</source>
@@ -43443,15 +43444,15 @@ Was soll %1 tun?</translation>
</message>
<message>
<source>Overriding &lt;code&gt;MAKEFLAGS&lt;/code&gt; environment variable.</source>
- <translation type="unfinished"></translation>
+ <translation>Ãœberschreibe die &lt;code&gt;MAKEFLAGS&lt;/code&gt; Umgebungsvariable.</translation>
</message>
<message>
<source>&lt;code&gt;MAKEFLAGS&lt;/code&gt; specifies a conflicting job count.</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;code&gt;MAKEFLAGS&lt;/code&gt; gibt eine zu den Einstellungen widersprüchliche Anzahl Jobs an.</translation>
</message>
<message>
<source>No conflict with &lt;code&gt;MAKEFLAGS&lt;/code&gt; environment variable.</source>
- <translation type="unfinished"></translation>
+ <translation>Kein Konflikt mit der &lt;code&gt;MAKEFLAGS&lt;/code&gt; Umgebungsvariable.</translation>
</message>
<message>
<source>Enable connection sharing:</source>
@@ -43561,11 +43562,11 @@ Was soll %1 tun?</translation>
</message>
<message>
<source>Build directory contains potentially problematic character &quot;%1&quot;.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Build-Verzeichnis enthält das möglicherweise problematische Zeichen &quot;%1&quot;.</translation>
</message>
<message>
<source> This warning can be suppressed &lt;a href=&quot;dummy&quot;&gt;here&lt;/a&gt;.</source>
- <translation type="unfinished"></translation>
+ <translation> Diese Warnung kann &lt;a href=&quot;dummy&quot;&gt;hier&lt;/a&gt; unterdrückt werden.</translation>
</message>
<message>
<source>The project is currently being parsed.</source>
@@ -43878,11 +43879,11 @@ Was soll %1 tun?</translation>
</message>
<message>
<source>Warn against build directories with spaces or non-ASCII characters</source>
- <translation type="unfinished"></translation>
+ <translation>Warne vor Build-Verzeichnissen mit Leerzeichen oder nicht-ASCII-Zeichen</translation>
</message>
<message>
<source>Some legacy build tools do not deal well with paths that contain &quot;special&quot; characters such as spaces, potentially resulting in spurious build errors.&lt;p&gt;Uncheck this option if you do not work with such tools.</source>
- <translation type="unfinished"></translation>
+ <translation>Einige ältere Erstellwerkzeuge kommen nicht gut mit Verzeichnissen zurecht, die &quot;spezielle&quot; Zeichen wie Leerzeichen enthalten. Dies kann zu Fehlern beim Erstellen führen.&lt;p&gt;Wählen Sie diese Option ab, wenn Sie nicht mit solchen Werkzeugen arbeiten.</translation>
</message>
<message>
<source>Do Not Build Anything</source>
@@ -43930,11 +43931,11 @@ Was soll %1 tun?</translation>
</message>
<message>
<source>Environment changes to apply to run configurations, but not build configurations.</source>
- <translation type="unfinished"></translation>
+ <translation>Änderungen der Umgebung, die auf Ausführungskonfigurationen, aber nicht auf Build-Konfigurationen angewendet werden sollen.</translation>
</message>
<message>
<source>Application environment:</source>
- <translation type="unfinished"></translation>
+ <translation>Anwendungsumgebung:</translation>
</message>
<message>
<source>Projects Directory</source>
@@ -44976,7 +44977,7 @@ Die betroffenen Dateien sind:
</message>
<message>
<source>Qbs Editor</source>
- <translation type="unfinished"></translation>
+ <translation>Qbs-Editor</translation>
</message>
</context>
<context>
@@ -48822,7 +48823,7 @@ wirklich löschen?</translation>
</message>
<message>
<source> (on %1)</source>
- <translation type="unfinished"></translation>
+ <translation> (auf %1)</translation>
</message>
<message>
<source>Qt version is not properly installed, please run make install</source>
@@ -49334,11 +49335,11 @@ wirklich löschen?</translation>
</message>
<message>
<source>Select a language for which a corresponding translation (.ts) file will be generated for you.</source>
- <translation type="unfinished"></translation>
+ <translation>Wählen Sie eine Sprache, für die eine Übersetzungsdatei (.ts) erstellt werden soll.</translation>
</message>
<message>
<source>If you plan to provide translations for your project&apos;s user interface via the Qt Linguist tool, select a language here. A corresponding translation (.ts) file will be generated for you.</source>
- <translation type="unfinished"></translation>
+ <translation>Wenn Sie planen, mit Qt Linguist Übersetzungen der Benutzeroberfläche Ihres Projekts anzubieten, wählen Sie hier eine Sprache. Eine entsprechende Übersetzungsdatei (.ts) wird dann für Sie erstellt.</translation>
</message>
<message>
<source>&lt;none&gt;</source>
@@ -49574,16 +49575,17 @@ Zusätzlich wird die Verbindung zum Gerät getestet.</translation>
</message>
<message>
<source>Connecting to device...</source>
- <translation type="unfinished"></translation>
+ <translation>Verbinde zu Gerät...</translation>
</message>
<message>
<source>Connected. Now doing extended checks.
</source>
- <translation type="unfinished"></translation>
+ <translation>Verbunden. Führe erweiterte Überprüfungen aus.
+</translation>
</message>
<message>
<source>Basic connectivity test failed, device is considered unusable.</source>
- <translation type="unfinished"></translation>
+ <translation>Grundlegender Verbindungstest ist fehlgeschlagen, das Gerät wird als unbrauchbar eingestuft.</translation>
</message>
<message>
<source>Device replied to echo with unexpected contents: &quot;%1&quot;</source>
@@ -49887,7 +49889,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet.</translation>
<source>Cannot establish SSH connection.
Control process failed to start.</source>
<translation>SSH-Verbindung kann nicht hergestellt werden.
-Der Kontrollprozess konnte nicht gestartet werden.</translation>
+Der Steuerprozess konnte nicht gestartet werden.</translation>
</message>
<message>
<source>SSH connection failure.</source>
@@ -49899,11 +49901,11 @@ Der Kontrollprozess konnte nicht gestartet werden.</translation>
</message>
<message>
<source>Device is disconnected.</source>
- <translation type="unfinished"></translation>
+ <translation>Gerät ist nicht verbunden.</translation>
</message>
<message>
<source>Can&apos;t send control signal to the %1 device. The device might have been disconnected.</source>
- <translation type="unfinished"></translation>
+ <translation>Senden des Steuersignals zum Gerät %1 ist fehlgeschlagen. Das Gerät ist möglicherweise nicht verbunden.</translation>
</message>
<message>
<source>Remote Linux</source>
@@ -49915,15 +49917,15 @@ Der Kontrollprozess konnte nicht gestartet werden.</translation>
</message>
<message>
<source>Establishing initial connection to device &quot;%1&quot;. This might take a moment.</source>
- <translation type="unfinished"></translation>
+ <translation>Stelle die erste Verbindung zum Gerät &quot;%1&quot; her. Dies kann einen Moment dauern.</translation>
</message>
<message>
<source>Device &quot;%1&quot; is currently marked as disconnected.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Gerät &quot;%1&quot; ist zur Zeit als nicht verbunden markiert.</translation>
</message>
<message>
<source>The device was not available when trying to connect previously.&lt;br&gt;No further connection attempts will be made until the device is manually reset by running a successful connection test via the &lt;a href=&quot;dummy&quot;&gt;settings page&lt;/a&gt;.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Gerät war bei einem vorherigen Verbindungsversuch nicht erreichbar.&lt;br&gt;Es werden keine weiteren Verbindungsversuche unternommen, bis das Gerät manuell über einen erfolgreichen Verbindungstest in den &lt;a href=&quot;dummy&quot;&gt;Einstellungen&lt;/a&gt; zurückgesetzt wurde.</translation>
</message>
<message>
<source>Failed: %1</source>
@@ -49931,7 +49933,7 @@ Der Kontrollprozess konnte nicht gestartet werden.</translation>
</message>
<message>
<source>Device is considered unconnected. Re-run device test to reset state.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Gerät ist als nicht verbunden eingestuft. Führen Sie die Gerätetests erneut aus, um die Einstufung zurückzusetzen.</translation>
</message>
<message>
<source>Remote Linux Device</source>
@@ -50069,7 +50071,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e
</message>
<message>
<source>Use sftp if available. Otherwise use default transfer.</source>
- <translation>Benutze SFTP, sofern verfügbar. Sonst Standardmethode verwenden.</translation>
+ <translation>Benutze SFTP, sofern verfügbar. Sonst verwende Standardmethode.</translation>
</message>
<message>
<source>Use default transfer. This might be slow.</source>
@@ -50081,7 +50083,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e
</message>
<message>
<source>Transfer method was downgraded from &quot;%1&quot; to &quot;%2&quot;. If this is unexpected, please re-test device &quot;%3&quot;.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Übertragungsmethode wurde von &quot;%1&quot; auf &quot;%2&quot; zurückgestuft. Falls dies unerwartet auftritt, führen Sie bitte die Gerätetests für &quot;%3&quot; erneut aus.</translation>
</message>
<message>
<source>rsync failed to start: %1</source>
@@ -50105,7 +50107,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e
</message>
<message>
<source>Use rsync or sftp if available, but prefer rsync. Otherwise use default transfer.</source>
- <translation type="unfinished"></translation>
+ <translation>Benutze rsync oder sftp, sofern verfügbar, bevorzuge aber rsync. Sonst verwende Standardmethode.</translation>
</message>
<message>
<source>rsync is only supported for transfers between different devices.</source>
@@ -51696,19 +51698,19 @@ Testfall &quot;%2&quot; wird nicht aufgezeichnet.</translation>
</message>
<message>
<source>Do you really want to delete &quot;%1&quot; permanently?</source>
- <translation type="unfinished"></translation>
+ <translation>Möchten Sie &quot;%1&quot; wirklich endgültig löschen?</translation>
</message>
<message>
<source>Remove Shared File</source>
- <translation type="unfinished"></translation>
+ <translation>Gemeinsame Datei löschen</translation>
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">Abbrechen</translation>
+ <translation>Abbrechen</translation>
</message>
<message>
<source>Failed to remove &quot;%1&quot;.</source>
- <translation type="unfinished"></translation>
+ <translation>&quot;%1&quot; konnte nicht gelöscht werden.</translation>
</message>
<message>
<source>Remove &quot;%1&quot; from the list of shared folders?</source>
@@ -52674,7 +52676,7 @@ Die Datei &quot;%1&quot; konnte nicht geöffnet werden.</translation>
</message>
<message>
<source>Select All</source>
- <translation type="unfinished"></translation>
+ <translation>Alles auswählen</translation>
</message>
<message>
<source>Clear Selection</source>
diff --git a/src/libs/qlitehtml b/src/libs/qlitehtml
-Subproject 9c7b5d073bf4713250648cf7ea35580f489f7fd
+Subproject 4f737256c0a698ff3ba380cbaef1ba80a16fc3a
diff --git a/src/libs/utils/fsengine/diriterator.h b/src/libs/utils/fsengine/diriterator.h
index 54e9d5d2dd3..d6605b44264 100644
--- a/src/libs/utils/fsengine/diriterator.h
+++ b/src/libs/utils/fsengine/diriterator.h
@@ -8,6 +8,7 @@
#include <QFileInfo>
#include <QString>
+#include <QtGlobal>
#include <QtCore/private/qabstractfileengine_p.h>
@@ -17,14 +18,32 @@ namespace Internal {
class DirIterator : public QAbstractFileEngineIterator
{
public:
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ DirIterator(FilePaths paths,
+ const QString &path,
+ QDir::Filters filters,
+ const QStringList &filterNames)
+ : QAbstractFileEngineIterator(path, filters, filterNames)
+#else
DirIterator(FilePaths paths)
: QAbstractFileEngineIterator({}, {})
+#endif
, m_filePaths(std::move(paths))
, it(m_filePaths.begin())
{}
// QAbstractFileEngineIterator interface
public:
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ bool advance() override
+ {
+ if (!m_filePaths.empty() && m_filePaths.end() != it + 1) {
+ ++it;
+ return true;
+ }
+ return false;
+ }
+#else
QString next() override
{
if (it == m_filePaths.end())
@@ -35,6 +54,7 @@ public:
}
bool hasNext() const override { return !m_filePaths.empty() && m_filePaths.end() != it + 1; }
+#endif // QT_VERSION_CHECK(6, 8, 0)
QString currentFileName() const override
{
diff --git a/src/libs/utils/fsengine/fileiteratordevicesappender.h b/src/libs/utils/fsengine/fileiteratordevicesappender.h
index a28f1190806..ed87f7d5188 100644
--- a/src/libs/utils/fsengine/fileiteratordevicesappender.h
+++ b/src/libs/utils/fsengine/fileiteratordevicesappender.h
@@ -7,10 +7,12 @@
#include "../hostosinfo.h"
#include <QtCore/private/qabstractfileengine_p.h>
+#include <QtGlobal>
namespace Utils {
namespace Internal {
+#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
// Based on http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.htm
template<typename Tag, typename Tag::type M>
struct PrivateAccess
@@ -25,6 +27,7 @@ struct QAFEITag
};
template struct PrivateAccess<QAFEITag, &QAbstractFileEngineIterator::setPath>;
+#endif
class FileIteratorWrapper : public QAbstractFileEngineIterator
{
@@ -36,25 +39,47 @@ class FileIteratorWrapper : public QAbstractFileEngineIterator
};
public:
- FileIteratorWrapper(std::unique_ptr<QAbstractFileEngineIterator> &&baseIterator,
- QDir::Filters filters,
- const QStringList &filterNames)
- : QAbstractFileEngineIterator(filters, filterNames)
+ FileIteratorWrapper(std::unique_ptr<QAbstractFileEngineIterator> &&baseIterator)
+ : QAbstractFileEngineIterator(
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ baseIterator->path(),
+#endif
+ baseIterator->filters(), baseIterator->nameFilters())
, m_baseIterator(std::move(baseIterator))
- {}
+ {
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ // Can be called in the constructor since the iterator path
+ // has already been set
+ setStatus();
+#endif
+ }
public:
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ bool advance() override
+ {
+ if (m_status == State::Ended)
+ return false;
+
+ const bool res = m_baseIterator->advance();
+ if (m_status == State::IteratingRoot && !res) {
+ // m_baseIterator finished, but we need to advance one last time, so that
+ // currentFileName() returns FilePath::specialRootPath().
+ m_status = State::Ended;
+ return true;
+ }
+
+ return res;
+ }
+#else
QString next() override
{
if (m_status == State::Ended)
return QString();
- setPath();
- checkStatus();
-
if (m_status == State::BaseIteratorEnd) {
m_status = State::Ended;
- return "__qtc__devices__";
+ return FilePath::specialRootName();
}
return m_baseIterator->next();
@@ -65,62 +90,59 @@ public:
return false;
setPath();
- checkStatus();
- if (m_status == State::BaseIteratorEnd)
+ const bool res = m_baseIterator->hasNext();
+ if (m_status == State::IteratingRoot && !res) {
+ // m_baseIterator finished, but we need to advance one last time, so that
+ // e.g. next() and currentFileName() return FilePath::specialRootPath().
+ m_status = State::BaseIteratorEnd;
return true;
+ }
- return m_baseIterator->hasNext();
+ return res;
}
+#endif
QString currentFileName() const override
{
- if (m_status == State::Ended)
- return FilePath::specialRootPath();
-
- setPath();
- checkStatus();
- return m_baseIterator->currentFileName();
+ return m_status == State::Ended ? FilePath::specialRootPath()
+ : m_baseIterator->currentFileName();
}
QFileInfo currentFileInfo() const override
{
- if (m_status == State::Ended)
- return QFileInfo(FilePath::specialRootPath());
- setPath();
- checkStatus();
- return m_baseIterator->currentFileInfo();
+ return m_status == State::Ended ? QFileInfo(FilePath::specialRootPath())
+ : m_baseIterator->currentFileInfo();
}
private:
+ QString setStatus() const
+ {
+ // path() can be "/somedir/.." so we need to clean it first.
+ // We only need QDir::cleanPath here, as the path is always
+ // a fs engine path and will not contain scheme:// etc.
+ QString p = QDir::cleanPath(path());
+ if (p.compare(HostOsInfo::root().path(), Qt::CaseInsensitive) == 0)
+ m_status = State::IteratingRoot;
+ return p;
+ }
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
void setPath() const
{
if (!m_hasSetPath) {
- // path() can be "/somedir/.." so we need to clean it first.
- // We only need QDir::cleanPath here, as the path is always
- // a fs engine path and will not contain scheme:// etc.
- const QString p = QDir::cleanPath(path());
- if (p.compare(HostOsInfo::root().path(), Qt::CaseInsensitive) == 0)
- m_status = State::IteratingRoot;
-
+ const QString &p = setStatus();
((*m_baseIterator).*get(QAFEITag()))(p);
m_hasSetPath = true;
}
}
-
- void checkStatus() const
- {
- if (m_status == State::NotIteratingRoot) {
- return;
- }
- if (m_status == State::IteratingRoot) {
- if (m_baseIterator->hasNext() == false) {
- m_status = State::BaseIteratorEnd;
- }
- }
- }
+#endif
private:
std::unique_ptr<QAbstractFileEngineIterator> m_baseIterator;
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
mutable bool m_hasSetPath{false};
+#endif
+
mutable State m_status{State::NotIteratingRoot};
};
diff --git a/src/libs/utils/fsengine/fixedlistfsengine.h b/src/libs/utils/fsengine/fixedlistfsengine.h
index 3518b5d0b5a..b27d3bc978a 100644
--- a/src/libs/utils/fsengine/fixedlistfsengine.h
+++ b/src/libs/utils/fsengine/fixedlistfsengine.h
@@ -9,6 +9,7 @@
#include "../stringutils.h"
#include <QtCore/private/qabstractfileengine_p.h>
+#include <QtGlobal>
namespace Utils {
namespace Internal {
@@ -63,10 +64,20 @@ public:
return QAbstractFileEngine::fileName(file);
}
+
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ IteratorUniquePtr beginEntryList(const QString &path,
+ QDir::Filters filters,
+ const QStringList &filterNames) override
+ {
+ return std::make_unique<DirIterator>(m_children, path, filters, filterNames);
+ }
+#else
Iterator *beginEntryList(QDir::Filters /*filters*/, const QStringList & /*filterNames*/) override
{
return new DirIterator(m_children);
}
+#endif
};
} // namespace Internal
diff --git a/src/libs/utils/fsengine/fsengine_impl.cpp b/src/libs/utils/fsengine/fsengine_impl.cpp
index ade8236d5e1..44a53289d65 100644
--- a/src/libs/utils/fsengine/fsengine_impl.cpp
+++ b/src/libs/utils/fsengine/fsengine_impl.cpp
@@ -303,8 +303,14 @@ bool FSEngineImpl::cloneTo(QAbstractFileEngine *target)
return QAbstractFileEngine::cloneTo(target);
}
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+QAbstractFileEngine::IteratorUniquePtr FSEngineImpl::beginEntryList(const QString &path,
+ QDir::Filters filters,
+ const QStringList &filterNames)
+#else
QAbstractFileEngine::Iterator *FSEngineImpl::beginEntryList(QDir::Filters filters,
const QStringList &filterNames)
+#endif
{
FilePaths paths{m_filePath.pathAppended(".")};
m_filePath.iterateDirectory(
@@ -318,12 +324,11 @@ QAbstractFileEngine::Iterator *FSEngineImpl::beginEntryList(QDir::Filters filter
},
{filterNames, filters});
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ return std::make_unique<DirIterator>(std::move(paths), path, filters, filterNames);
+#else
return new DirIterator(std::move(paths));
-}
-
-QAbstractFileEngine::Iterator *FSEngineImpl::endEntryList()
-{
- return nullptr;
+#endif
}
qint64 FSEngineImpl::read(char *data, qint64 maxlen)
diff --git a/src/libs/utils/fsengine/fsengine_impl.h b/src/libs/utils/fsengine/fsengine_impl.h
index 17481c1a6ae..00a33f227ce 100644
--- a/src/libs/utils/fsengine/fsengine_impl.h
+++ b/src/libs/utils/fsengine/fsengine_impl.h
@@ -7,6 +7,7 @@
#include <QtCore/private/qabstractfileengine_p.h>
+#include <QtGlobal>
#include <QTemporaryFile>
namespace Utils {
@@ -51,13 +52,25 @@ public:
QString fileName(FileName file) const override;
uint ownerId(FileOwner) const override;
QString owner(FileOwner) const override;
+
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ using FileTime = QFile::FileTime;
+#endif
bool setFileTime(const QDateTime &newDate, FileTime time) override;
QDateTime fileTime(FileTime time) const override;
void setFileName(const QString &file) override;
int handle() const override;
bool cloneTo(QAbstractFileEngine *target) override;
+
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters,
+ const QStringList &filterNames) override;
+ IteratorUniquePtr endEntryList() override { return {}; }
+#else
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override;
- Iterator *endEntryList() override;
+ Iterator *endEntryList() override { return nullptr; }
+#endif
+
qint64 read(char *data, qint64 maxlen) override;
qint64 readLine(char *data, qint64 maxlen) override;
qint64 write(const char *data, qint64 len) override;
diff --git a/src/libs/utils/fsengine/fsenginehandler.cpp b/src/libs/utils/fsengine/fsenginehandler.cpp
index 2f828537d19..29fe759a861 100644
--- a/src/libs/utils/fsengine/fsenginehandler.cpp
+++ b/src/libs/utils/fsengine/fsenginehandler.cpp
@@ -46,10 +46,15 @@ static bool isRootPath(const QString &fileName)
return fileName.size() == 1 && fileName[0] == '/';
}
-QAbstractFileEngine *FSEngineHandler::create(const QString &fileName) const
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+std::unique_ptr<QAbstractFileEngine>
+#else
+QAbstractFileEngine *
+#endif
+FSEngineHandler::create(const QString &fileName) const
{
if (fileName.startsWith(':'))
- return nullptr;
+ return {};
static const QString rootPath = FilePath::specialRootPath();
static const FilePath rootFilePath = FilePath::fromString(rootPath);
@@ -62,7 +67,11 @@ QAbstractFileEngine *FSEngineHandler::create(const QString &fileName) const
return rootFilePath.pathAppended(scheme);
});
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ return std::make_unique<FixedListFSEngine>(removeDoubleSlash(fileName), paths);
+#else
return new FixedListFSEngine(removeDoubleSlash(fileName), paths);
+#endif
}
if (fixedFileName.startsWith(rootPath)) {
@@ -74,20 +83,35 @@ QAbstractFileEngine *FSEngineHandler::create(const QString &fileName) const
return root.scheme() == scheme;
});
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ return std::make_unique<FixedListFSEngine>(removeDoubleSlash(fileName),
+ filteredRoots);
+#else
return new FixedListFSEngine(removeDoubleSlash(fileName), filteredRoots);
+#endif
}
}
FilePath fixedPath = FilePath::fromString(fixedFileName);
- if (fixedPath.needsDevice())
+ if (fixedPath.needsDevice()) {
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ return std::make_unique<FSEngineImpl>(removeDoubleSlash(fileName));
+#else
return new FSEngineImpl(removeDoubleSlash(fileName));
+#endif
+ }
}
- if (isRootPath(fixedFileName))
+ if (isRootPath(fixedFileName)) {
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ return std::make_unique<RootInjectFSEngine>(fileName);
+#else
return new RootInjectFSEngine(fileName);
+#endif
+ }
- return nullptr;
+ return {};
}
} // Utils::Internal
diff --git a/src/libs/utils/fsengine/fsenginehandler.h b/src/libs/utils/fsengine/fsenginehandler.h
index 6fdb6a7ab9d..68421ddd92e 100644
--- a/src/libs/utils/fsengine/fsenginehandler.h
+++ b/src/libs/utils/fsengine/fsenginehandler.h
@@ -10,7 +10,11 @@ namespace Utils::Internal {
class FSEngineHandler : public QAbstractFileEngineHandler
{
public:
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ std::unique_ptr<QAbstractFileEngine> create(const QString &fileName) const override;
+#else
QAbstractFileEngine *create(const QString &fileName) const override;
+#endif
};
} // Utils::Internal
diff --git a/src/libs/utils/fsengine/rootinjectfsengine.h b/src/libs/utils/fsengine/rootinjectfsengine.h
index 6e40f5f742b..9eb6a8a8322 100644
--- a/src/libs/utils/fsengine/rootinjectfsengine.h
+++ b/src/libs/utils/fsengine/rootinjectfsengine.h
@@ -16,12 +16,22 @@ public:
using QFSFileEngine::QFSFileEngine;
public:
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ IteratorUniquePtr beginEntryList(const QString &path,
+ QDir::Filters filters,
+ const QStringList &filterNames) override
+ {
+ return std::make_unique<FileIteratorWrapper>(
+ QFSFileEngine::beginEntryList(path, filters, filterNames));
+ }
+#else
Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override
{
std::unique_ptr<QAbstractFileEngineIterator> baseIterator(
QFSFileEngine::beginEntryList(filters, filterNames));
- return new FileIteratorWrapper(std::move(baseIterator), filters, filterNames);
+ return new FileIteratorWrapper(std::move(baseIterator));
}
+#endif
};
} // namespace Internal
diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp
index 28edfdf7478..4108106a2ea 100644
--- a/src/plugins/android/androidconfigurations.cpp
+++ b/src/plugins/android/androidconfigurations.cpp
@@ -109,6 +109,11 @@ const QLatin1String X86ToolsPrefix("i686-linux-android");
const QLatin1String AArch64ToolsPrefix("aarch64-linux-android");
const QLatin1String X86_64ToolsPrefix("x86_64-linux-android");
+const QLatin1String ArmToolsDisplayName("arm");
+const QLatin1String X86ToolsDisplayName("i686");
+const QLatin1String AArch64ToolsDisplayName("aarch64");
+const QLatin1String X86_64ToolsDisplayName("x86_64");
+
const QLatin1String Unknown("unknown");
const QLatin1String keytoolName("keytool");
const Key changeTimeStamp("ChangeTimeStamp");
@@ -177,12 +182,12 @@ QLatin1String AndroidConfig::displayName(const Abi &abi)
switch (abi.architecture()) {
case Abi::ArmArchitecture:
if (abi.wordWidth() == 64)
- return QLatin1String(Constants::AArch64ToolsDisplayName);
- return QLatin1String(Constants::ArmToolsDisplayName);
+ return AArch64ToolsDisplayName;
+ return ArmToolsDisplayName;
case Abi::X86Architecture:
if (abi.wordWidth() == 64)
- return QLatin1String(Constants::X86_64ToolsDisplayName);
- return QLatin1String(Constants::X86ToolsDisplayName);
+ return X86_64ToolsDisplayName;
+ return X86ToolsDisplayName;
default:
return Unknown;
}
diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h
index 813b6a924c0..379310519ab 100644
--- a/src/plugins/android/androidconstants.h
+++ b/src/plugins/android/androidconstants.h
@@ -81,11 +81,4 @@ const char ndkPackageName[] = "ndk";
const char platformsPackageName[] = "platforms";
const char buildToolsPackageName[] = "build-tools";
-// For AndroidQtVersion
-const char ArmToolsDisplayName[] = "arm";
-const char ArmV7ToolsDisplayName[] = "armv7";
-const char X86ToolsDisplayName[] = "i686";
-const char AArch64ToolsDisplayName[] = "aarch64";
-const char X86_64ToolsDisplayName[] = "x86_64";
-
} // Android::Constants
diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp
index c3b0e3e1f82..eb9f1801380 100644
--- a/src/plugins/android/androidqtversion.cpp
+++ b/src/plugins/android/androidqtversion.cpp
@@ -109,24 +109,13 @@ QString AndroidQtVersion::description() const
const QStringList &AndroidQtVersion::androidAbis() const
{
- if (m_androidAbis.isEmpty()) {
- bool sanityCheckNotUsed;
- const BuiltWith bw = builtWith(&sanityCheckNotUsed);
- if (!bw.androidAbi.isEmpty()) {
- m_androidAbis << bw.androidAbi;
- m_minNdk = bw.apiVersion;
- } else {
- ensureMkSpecParsed();
- }
- }
-
+ ensureMkSpecParsed();
return m_androidAbis;
}
int AndroidQtVersion::minimumNDK() const
{
- if (m_minNdk == -1)
- ensureMkSpecParsed();
+ ensureMkSpecParsed();
return m_minNdk;
}
@@ -185,25 +174,6 @@ static int versionFromPlatformString(const QString &string, bool *ok = nullptr)
return match.hasMatch() ? match.captured(1).toInt(ok) : -1;
}
-static QString abiFromCompilerTarget(const QString &string)
-{
- const QStringList components = string.split("-");
- if (components.isEmpty())
- return {};
-
- QString qtAbi;
- const QString compilerAbi = components.first();
- if (compilerAbi == Constants::AArch64ToolsDisplayName)
- qtAbi = ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A;
- else if (compilerAbi == Constants::ArmV7ToolsDisplayName)
- qtAbi = ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A;
- else if (compilerAbi == Constants::X86_64ToolsDisplayName)
- qtAbi = ProjectExplorer::Constants::ANDROID_ABI_X86_64;
- else if (compilerAbi == Constants::X86ToolsDisplayName)
- qtAbi = ProjectExplorer::Constants::ANDROID_ABI_X86;
- return qtAbi;
-}
-
AndroidQtVersion::BuiltWith AndroidQtVersion::parseBuiltWith(const QByteArray &modulesCoreJsonData,
bool *ok)
{
@@ -223,10 +193,6 @@ AndroidQtVersion::BuiltWith AndroidQtVersion::parseBuiltWith(const QByteArray &m
result.ndkVersion = QVersionNumber::fromString(version.toString());
}
}
- if (const QJsonValue compilerTarget = builtWith["compiler_target"];
- !compilerTarget.isUndefined()) {
- result.androidAbi = abiFromCompilerTarget(compilerTarget.toString());
- }
}
if (ok)
diff --git a/src/plugins/android/androidqtversion.h b/src/plugins/android/androidqtversion.h
index cf52b63000b..fb592461c80 100644
--- a/src/plugins/android/androidqtversion.h
+++ b/src/plugins/android/androidqtversion.h
@@ -35,7 +35,6 @@ public:
struct BuiltWith {
int apiVersion = -1;
QVersionNumber ndkVersion;
- QString androidAbi;
};
static BuiltWith parseBuiltWith(const QByteArray &modulesCoreJsonData, bool *ok = nullptr);
BuiltWith builtWith(bool *ok = nullptr) const;
diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp
index 0f4686e403c..cd27cbbcb0c 100644
--- a/src/plugins/axivion/axivionplugin.cpp
+++ b/src/plugins/axivion/axivionplugin.cpp
@@ -238,6 +238,7 @@ public:
std::unordered_map<IDocument *, std::unique_ptr<TaskTree>> m_docMarksTrees;
TaskTreeRunner m_issueInfoRunner;
FileInProjectFinder m_fileFinder; // FIXME maybe obsolete when path mapping is implemented
+ QMetaObject::Connection m_fileFinderConnection;
};
static AxivionPluginPrivate *dd = nullptr;
@@ -332,7 +333,7 @@ void AxivionPluginPrivate::onStartupProjectChanged(Project *project)
return;
if (m_project)
- disconnect(m_project, &Project::fileListChanged, this, &AxivionPluginPrivate::handleOpenedDocs);
+ disconnect(m_fileFinderConnection);
m_project = project;
clearAllMarks();
@@ -346,7 +347,7 @@ void AxivionPluginPrivate::onStartupProjectChanged(Project *project)
}
m_fileFinder.setProjectDirectory(m_project->projectDirectory());
- connect(m_project, &Project::fileListChanged, this, [this]{
+ m_fileFinderConnection = connect(m_project, &Project::fileListChanged, this, [this] {
m_fileFinder.setProjectFiles(m_project->files(Project::AllFiles));
handleOpenedDocs();
});
diff --git a/src/plugins/clangtools/clangtoolsutils.cpp b/src/plugins/clangtools/clangtoolsutils.cpp
index 6a650e9c551..746e32754d6 100644
--- a/src/plugins/clangtools/clangtoolsutils.cpp
+++ b/src/plugins/clangtools/clangtoolsutils.cpp
@@ -310,7 +310,10 @@ QStringList extraClangToolsAppendOptions()
static QVersionNumber fixupVersion(const VersionAndSuffix &versionAndSuffix)
{
// llvm.org only does document releases for the first released version
- QVersionNumber version = QVersionNumber(versionAndSuffix.first.majorVersion(), 0, 0);
+ // Since LLVM 18, the releases start at minor version 1.
+ const int major = versionAndSuffix.first.majorVersion();
+ const int minor = major >= 18 ? 1 : 0;
+ QVersionNumber version = QVersionNumber(major, minor, 0);
if (version == QVersionNumber(0))
version = QVersionNumber(12);
diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
index a0bd4d426e3..a3795369f76 100644
--- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
+++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
@@ -209,7 +209,8 @@ static bool isChildOf(const FilePath &path, const FilePaths &prefixes)
static CMakeBuildTarget toBuildTarget(const TargetDetails &t,
const FilePath &sourceDirectory,
const FilePath &buildDirectory,
- bool relativeLibs)
+ bool relativeLibs,
+ const QSet<FilePath> &artifacts)
{
const FilePath currentBuildDir = buildDirectory.resolvePath(t.buildDir);
@@ -341,14 +342,17 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t,
librarySeachPaths.append(tmp);
if (buildDir.osType() == OsTypeWindows && dllName) {
- if (tmp.pathAppended(*dllName).exists())
+ const auto validPath = [&artifacts](const FilePath& path) {
+ return path.exists() || artifacts.contains(path);
+ };
+ if (validPath(tmp.pathAppended(*dllName)))
librarySeachPaths.append(tmp);
// Libraries often have their import libs in ../lib and the
// actual dll files in ../bin on windows. Qt is one example of that.
- if (tmp.fileName() == "lib" && buildDir.osType() == OsTypeWindows) {
+ if (tmp.fileName() == "lib") {
const FilePath path = tmp.parentDir().pathAppended("bin");
- if (path.isDir() && path.pathAppended(*dllName).exists())
+ if (path.isDir() && validPath(path.pathAppended(*dllName)))
librarySeachPaths.append(path);
}
}
@@ -367,12 +371,17 @@ static QList<CMakeBuildTarget> generateBuildTargets(const QFuture<void> &cancelF
const FilePath &buildDirectory,
bool relativeLibs)
{
+ QSet<FilePath> artifacts;
+ for (const TargetDetails &t : input.targetDetails)
+ for (const FilePath &p: t.artifacts)
+ artifacts.insert(buildDirectory.resolvePath(p));
+
QList<CMakeBuildTarget> result;
result.reserve(input.targetDetails.size());
for (const TargetDetails &t : input.targetDetails) {
if (cancelFuture.isCanceled())
return {};
- result.append(toBuildTarget(t, sourceDirectory, buildDirectory, relativeLibs));
+ result.append(toBuildTarget(t, sourceDirectory, buildDirectory, relativeLibs, artifacts));
}
return result;
}
diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp
index 1ed0987e5ab..8a727494c2d 100644
--- a/src/plugins/coreplugin/icore.cpp
+++ b/src/plugins/coreplugin/icore.cpp
@@ -1035,12 +1035,57 @@ void ICore::addPreCloseListener(const std::function<bool ()> &listener)
d->m_preCloseListeners.append(listener);
}
+QString uiConfigInformation()
+{
+ QString info("UI configuration:\n\n");
+ info.append(QString("Color: %1\n").arg(StyleHelper::requestedBaseColor().name()));
+ info.append(QString("Theme: %1 \"%2\"\n").arg(creatorTheme()->id())
+ .arg(creatorTheme()->displayName()));
+ const QString toolbarStyle =
+ StyleHelper::toolbarStyle() == StyleHelper::ToolbarStyleCompact ? "Compact" : "Relaxed";
+ info.append(QString("Toolbar style: Utils::StyleHelper::ToolbarStyle%1\n").arg(toolbarStyle));
+ const QString policy =
+ QVariant::fromValue(QApplication::highDpiScaleFactorRoundingPolicy()).toString();
+ QString userInterfaceLanguage = ICore::userInterfaceLanguage();
+ if (userInterfaceLanguage.isEmpty())
+ userInterfaceLanguage = QLocale::system().name() + " (System Language)";
+ info.append(QString("Language: %1\n").arg(userInterfaceLanguage));
+ info.append(QString("Device pixel ratio: %1, Qt::HighDpiScaleFactorRoundingPolicy::%2\n")
+ .arg(qApp->devicePixelRatio()).arg(policy));
+ info.append(QString("Font DPI: %1\n").arg(qApp->fontMetrics().fontDpi()));
+
+ info.append(QString("Utils::StyleHelper::UiElement:\n"));
+#define QTC_ADD_UIELEMENT_FONT(uiElement) ( \
+ info.append(QString(" %1: %2\n").arg(#uiElement) \
+ .arg(StyleHelper::uiFont(StyleHelper::UiElement##uiElement).toString())) \
+ );
+ QTC_ADD_UIELEMENT_FONT(H1);
+ QTC_ADD_UIELEMENT_FONT(H2);
+ QTC_ADD_UIELEMENT_FONT(H3);
+ QTC_ADD_UIELEMENT_FONT(H4);
+ QTC_ADD_UIELEMENT_FONT(H5);
+ QTC_ADD_UIELEMENT_FONT(H6);
+ QTC_ADD_UIELEMENT_FONT(H6Capital);
+ QTC_ADD_UIELEMENT_FONT(Body1);
+ QTC_ADD_UIELEMENT_FONT(Body2);
+ QTC_ADD_UIELEMENT_FONT(ButtonMedium);
+ QTC_ADD_UIELEMENT_FONT(ButtonSmall);
+ QTC_ADD_UIELEMENT_FONT(CaptionStrong);
+ QTC_ADD_UIELEMENT_FONT(Caption);
+ QTC_ADD_UIELEMENT_FONT(IconStandard);
+ QTC_ADD_UIELEMENT_FONT(IconActive);
+#undef QTC_ADD_UIELEMENT_FONT
+
+ return info;
+}
+
/*!
\internal
*/
QString ICore::systemInformation()
{
- return PluginManager::systemInformation() + '\n' + aboutInformationCompact() + '\n';
+ return PluginManager::systemInformation() + '\n' + uiConfigInformation() + '\n'
+ + aboutInformationCompact() + '\n';
}
static const QString &screenShotsPath()
diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp
index 4aa3c6464d5..37bdbc6ae78 100644
--- a/src/plugins/coreplugin/manhattanstyle.cpp
+++ b/src/plugins/coreplugin/manhattanstyle.cpp
@@ -22,6 +22,7 @@
#include <QFormLayout>
#include <QGroupBox>
#include <QLabel>
+#include <QLibraryInfo>
#include <QLineEdit>
#include <QMenuBar>
#include <QPainter>
@@ -488,21 +489,36 @@ static void drawPrimitiveTweakedForDarkTheme(QStyle::PrimitiveElement element,
break;
}
case QStyle::PE_FrameGroupBox: {
- // Snippet from QFusionStyle::drawPrimitive - BEGIN
- static const int groupBoxTopMargin = 3;
+ QRect groupBoxFrame = option->rect;
int topMargin = 0;
- auto control = dynamic_cast<const QGroupBox *>(widget);
- if (control && !control->isCheckable() && control->title().isEmpty()) {
- // Shrinking the topMargin if Not checkable AND title is empty
- topMargin = groupBoxTopMargin;
- } else {
- const int exclusiveIndicatorHeight = widget ? widget->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight) : 0;
- topMargin = qMax(exclusiveIndicatorHeight,
- option->fontMetrics.height()) + groupBoxTopMargin;
+ if (widget) {
+ // Before Qt 6.6.3, QStyle::subControlRect() returned wrong QRect for SC_GroupBoxFrame
+ static const bool validSCRect = QLibraryInfo::version() >= QVersionNumber(6, 6, 3);
+ if (validSCRect) {
+ QStyleOptionGroupBox opt;
+ opt.initFrom(widget);
+ const QStyle *style = widget->style();
+ groupBoxFrame = style->subControlRect(QStyle::CC_GroupBox, &opt,
+ QStyle::SC_GroupBoxFrame, widget);
+ topMargin = 1; // Tweak to resemble the pre-6.6.3 frame
+ } else {
+ // Snippet from pre-6.6.3 FusionStyle::drawPrimitive - BEGIN
+ static const int groupBoxTopMargin = 3;
+ auto control = dynamic_cast<const QGroupBox *>(widget);
+ if (!control->isCheckable() && control->title().isEmpty()) {
+ // Shrinking the topMargin if Not checkable AND title is empty
+ topMargin = groupBoxTopMargin;
+ } else {
+ const int exclusiveIndicatorHeight =
+ widget->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight);
+ topMargin = qMax(exclusiveIndicatorHeight,
+ option->fontMetrics.height()) + groupBoxTopMargin;
+ }
+ // Snippet from pre-6.6.3 QFusionStyle::drawPrimitive - END
+ }
}
- // Snippet from QFusionStyle::drawPrimitive - END
- const QRectF frameRectF = QRectF(option->rect).adjusted(0.5, topMargin + 0.5, -0.5, -0.5);
+ const QRectF frameRectF = QRectF(groupBoxFrame).adjusted(0.5, topMargin + 0.5, -0.5, -0.5);
painter->setPen(framePen);
if (isEnabled)
painter->setOpacity(0.5);
diff --git a/src/plugins/debugger/dap/pydapengine.cpp b/src/plugins/debugger/dap/pydapengine.cpp
index 68935581450..666750b3e66 100644
--- a/src/plugins/debugger/dap/pydapengine.cpp
+++ b/src/plugins/debugger/dap/pydapengine.cpp
@@ -234,7 +234,7 @@ void PyDapEngine::setupEngine()
info.addCustomButton(Tr::tr("Install debugpy"), [this] {
Core::ICore::infoBar()->removeInfo(installDebugPyInfoBarId);
Core::ICore::infoBar()->globallySuppressInfo(installDebugPyInfoBarId);
- const FilePath target = packageDir(runParameters().interpreter, "dubugpy");
+ const FilePath target = packageDir(runParameters().interpreter, "debugpy");
QTC_ASSERT(target.isSameDevice(runParameters().interpreter), return);
m_installProcess.reset(new Process);
m_installProcess->setCommand(
@@ -244,7 +244,8 @@ void PyDapEngine::setupEngine()
"install",
"-t",
target.needsDevice() ? target.path() : target.toUserOutput(),
- "debugpy"}});
+ "debugpy",
+ "--upgrade"}});
m_installProcess->setTerminalMode(TerminalMode::Run);
m_installProcess->start();
});
diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp
index 0fcdae1c918..7c621775b15 100644
--- a/src/plugins/projectexplorer/devicesupport/idevice.cpp
+++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp
@@ -194,10 +194,10 @@ DeviceSettings::DeviceSettings()
displayName.setValueAcceptor(
[validateDisplayName](const QString &old,
const QString &newValue) -> std::optional<QString> {
- if (validateDisplayName(old, newValue))
+ if (!validateDisplayName(old, newValue))
return std::nullopt;
- return old;
+ return newValue;
});
}
diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp
index 3f7d3a5c110..188d49fabb2 100644
--- a/src/plugins/qmljseditor/qmljshoverhandler.cpp
+++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp
@@ -293,7 +293,9 @@ bool QmlJSHoverHandler::matchColorItem(const ScopeChain &scopeChain,
if (auto binding = AST::cast<const AST::UiScriptBinding *>(member)) {
if (binding->qualifiedId && posIsInSource(pos, binding->statement)) {
value = scopeChain.evaluate(binding->qualifiedId);
- if (value && value->asColorValue()) {
+ if (value && (value->asColorValue()
+ || (value->asCppComponentValue()
+ && value->asCppComponentValue()->className() == "color"))) {
color = textAt(qmlDocument,
binding->statement->firstSourceLocation(),
binding->statement->lastSourceLocation());
diff --git a/src/plugins/qtsupport/examplesparser.cpp b/src/plugins/qtsupport/examplesparser.cpp
index 678a3a3139d..a335773b3ef 100644
--- a/src/plugins/qtsupport/examplesparser.cpp
+++ b/src/plugins/qtsupport/examplesparser.cpp
@@ -373,9 +373,9 @@ QList<std::pair<Core::Section, QList<ExampleItem *>>> getCategories(const QList<
// order "known" categories as wanted, others come afterwards
const int defaultIndex = defaultOrder.indexOf(it->first);
const int priority = defaultIndex >= 0 ? defaultIndex : (index + defaultOrderSize);
- const std::optional<int> maxRows = restrictRows
- ? std::make_optional<int>(index == 0 ? 2 : 1)
- : std::nullopt;
+ const std::optional<int> maxRows = restrictRows ? std::make_optional<int>(
+ defaultIndex == 0 ? 2 : 1)
+ : std::nullopt;
categories.append({{it->first, priority, maxRows}, it->second});
++index;
}
diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp
index 31195e8cfad..a715a3d51af 100644
--- a/src/plugins/remotelinux/linuxdevice.cpp
+++ b/src/plugins/remotelinux/linuxdevice.cpp
@@ -1615,7 +1615,7 @@ private:
}
// FIXME: Use asyncCopyFile instead
- nextFile();
+ QMetaObject::invokeMethod(this, &GenericTransferImpl::nextFile, Qt::QueuedConnection);
}
int m_currentIndex = 0;
diff --git a/src/plugins/texteditor/syntaxhighlighter.h b/src/plugins/texteditor/syntaxhighlighter.h
index 6b07d333f33..13d595d82f4 100644
--- a/src/plugins/texteditor/syntaxhighlighter.h
+++ b/src/plugins/texteditor/syntaxhighlighter.h
@@ -8,8 +8,6 @@
#include <texteditor/texteditorconstants.h>
#include <texteditor/textdocumentlayout.h>
-#include <KSyntaxHighlighting/Definition>
-
#include <QObject>
#include <QTextLayout>
diff --git a/src/plugins/texteditor/texteditorsettings.cpp b/src/plugins/texteditor/texteditorsettings.cpp
index 811852b8a84..356ae76fcd1 100644
--- a/src/plugins/texteditor/texteditorsettings.cpp
+++ b/src/plugins/texteditor/texteditorsettings.cpp
@@ -431,11 +431,13 @@ TextEditorSettings::TextEditorSettings()
connect(this, &TextEditorSettings::fontSettingsChanged,
this, updateGeneralMessagesFontSettings);
updateGeneralMessagesFontSettings();
- connect(this, &TextEditorSettings::behaviorSettingsChanged,
- this, [](const BehaviorSettings &bs) {
+ auto updateBehaviorSettings = [](const BehaviorSettings &bs) {
Core::MessageManager::setWheelZoomEnabled(bs.m_scrollWheelZooming);
FancyLineEdit::setCamelCaseNavigationEnabled(bs.m_camelCaseNavigation);
- });
+ };
+ connect(this, &TextEditorSettings::behaviorSettingsChanged,
+ this, updateBehaviorSettings);
+ updateBehaviorSettings(globalBehaviorSettings());
}
TextEditorSettings::~TextEditorSettings()
diff --git a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp
index 9d390714bb9..928f4bf2956 100644
--- a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp
+++ b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp
@@ -954,16 +954,25 @@ ComponentCompleteDisabler::~ComponentCompleteDisabler()
class QrcEngineHandler : public QAbstractFileEngineHandler
{
public:
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ std::unique_ptr<QAbstractFileEngine> create(const QString &fileName) const final;
+#else
QAbstractFileEngine *create(const QString &fileName) const final;
+#endif
};
-QAbstractFileEngine *QrcEngineHandler::create(const QString &fileName) const
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+std::unique_ptr<QAbstractFileEngine>
+#else
+QAbstractFileEngine *
+#endif
+QrcEngineHandler::create(const QString &fileName) const
{
if (fileName.startsWith(":/qt-project.org"))
- return nullptr;
+ return {};
if (fileName.startsWith(":/qtquickplugin"))
- return nullptr;
+ return {};
if (fileName.startsWith(":/")) {
const QStringList searchPaths = qmlDesignerRCPath().split(';');
@@ -974,18 +983,22 @@ QAbstractFileEngine *QrcEngineHandler::create(const QString &fileName) const
fixedPath.replace(":" + qrcDefintion.first(), qrcDefintion.last() + '/');
if (fileName == fixedPath)
- return nullptr;
+ return {};
if (QFileInfo::exists(fixedPath)) {
fixedPath.replace("//", "/");
fixedPath.replace('\\', '/');
+#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
+ return std::make_unique<QFSFileEngine>(fixedPath);
+#else
return new QFSFileEngine(fixedPath);
+#endif
}
}
}
}
- return nullptr;
+ return {};
}
static QrcEngineHandler* s_qrcEngineHandler = nullptr;
diff --git a/tests/system/shared/classes.py b/tests/system/shared/classes.py
index dcc702295b4..4611a0cefe1 100644
--- a/tests/system/shared/classes.py
+++ b/tests/system/shared/classes.py
@@ -1,10 +1,7 @@
# Copyright (C) 2016 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
-try:
- import __builtin__ # Python 2
-except ImportError:
- import builtins as __builtin__ # Python 3
+import builtins
# for easier re-usage (because Python hasn't an enum type)
class Targets:
@@ -128,7 +125,7 @@ class QtPath:
@staticmethod
def toVersionTuple(versionString):
- return tuple(map(__builtin__.int, versionString.split(".")))
+ return tuple(map(builtins.int, versionString.split(".")))
@staticmethod
def getQtVersion(target):
diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py
index 00641e465be..a45d78cfc4b 100644
--- a/tests/system/shared/project.py
+++ b/tests/system/shared/project.py
@@ -603,7 +603,7 @@ def __writeProjectTreeFile__(projectTree, filename):
def __getTestData__(record):
return [testData.field(record, "text"),
- __builtin__.int(testData.field(record, "nestinglevel"))]
+ builtins.int(testData.field(record, "nestinglevel"))]
def compareProjectTree(rootObject, dataset):
root = waitForObject(rootObject)
diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py
index e97c0b025ff..f1d4078fb52 100644
--- a/tests/system/shared/qtcreator.py
+++ b/tests/system/shared/qtcreator.py
@@ -12,11 +12,7 @@ import subprocess;
import sys
import errno;
from datetime import datetime,timedelta;
-if sys.version_info.major > 2:
- import builtins as __builtin__
-else:
- import __builtin__
-
+import builtins
srcPath = ''
SettingsPath = []
diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py
index 853c5f6fde0..7e6b91a961f 100644
--- a/tests/system/shared/utils.py
+++ b/tests/system/shared/utils.py
@@ -71,15 +71,15 @@ def verifyEnabled(objectSpec, expectedState = True):
# param itemName is the item to be selected in the combo box
# returns True if selection was changed or False if the wanted value was already selected
def selectFromCombo(objectSpec, itemName):
- object = verifyEnabled(objectSpec)
- if itemName == str(object.currentText):
+ comboObject = verifyEnabled(objectSpec)
+ if itemName == str(comboObject.currentText):
return False
else:
- mouseClick(object)
+ mouseClick(comboObject)
snooze(1)
# params required here
- mouseClick(waitForObjectItem(object, itemName.replace(".", "\\.")), 5, 5, 0, Qt.LeftButton)
- test.verify(waitFor("str(object.currentText)==itemName", 5000),
+ mouseClick(waitForObjectItem(comboObject, itemName.replace(".", "\\.")))
+ test.verify(waitFor("str(comboObject.currentText)==itemName", 5000),
"Switched combo item to '%s'" % itemName)
return True
@@ -110,7 +110,7 @@ def textUnderCursor(window, fromPos, toPos):
cursor.movePosition(toPos, QTextCursor.KeepAnchor)
returnValue = cursor.selectedText()
cursor.setPosition(oldposition)
- return returnValue
+ return str(returnValue)
def which(program):
# Don't use spawn.find_executable because it can't find .bat or
@@ -595,15 +595,12 @@ def getHelpTitle():
def isString(sth):
- if sys.version_info.major > 2:
- return isinstance(sth, str)
- else:
- return isinstance(sth, (str, unicode))
+ return isinstance(sth, str)
+
# helper function to ensure we get str, converts bytes if necessary
def stringify(obj):
- stringTypes = (str, unicode) if sys.version_info.major == 2 else (str)
- if isinstance(obj, stringTypes):
+ if isString(obj):
return obj
if isinstance(obj, bytes):
if not platform.system() in ('Microsoft', 'Windows'):
diff --git a/tests/system/suite_HELP/tst_HELP02/test.py b/tests/system/suite_HELP/tst_HELP02/test.py
index 9c5104087e0..31a3e7c2de4 100644
--- a/tests/system/suite_HELP/tst_HELP02/test.py
+++ b/tests/system/suite_HELP/tst_HELP02/test.py
@@ -4,11 +4,11 @@
source("../../shared/qtcreator.py")
if platform.system() == 'Darwin':
- keysToType = '<Command+Alt+a>'
- expectedKeys = 'Cmd+Opt+A'
+ keysToType = '<Command+Alt+v>'
+ expectedKeys = 'Cmd+Opt+V'
else:
- keysToType = '<Ctrl+Alt+a>'
- expectedKeys = 'Ctrl+Alt+A'
+ keysToType = '<Ctrl+Alt+v>'
+ expectedKeys = 'Ctrl+Alt+V'
# test Qt Creator version information from file and dialog
diff --git a/tests/system/suite_editors/tst_revert_changes/test.py b/tests/system/suite_editors/tst_revert_changes/test.py
index 6ad06b11243..7774faed4b4 100644
--- a/tests/system/suite_editors/tst_revert_changes/test.py
+++ b/tests/system/suite_editors/tst_revert_changes/test.py
@@ -33,7 +33,7 @@ def main():
__modifyFile__(fileName, modification)
test.log("Reverting all files...")
fileModifications = dict(zip(fileModifications.keys(),
- (__builtin__.bool(v) for v in fileModifications.values())))
+ (builtins.bool(v) for v in fileModifications.values())))
revertChanges(fileModifications)
invokeMenuItem("File", "Exit")
diff --git a/tests/system/suite_general/tst_cmake_speedcrunch/test.py b/tests/system/suite_general/tst_cmake_speedcrunch/test.py
index 4f75d43eb9d..4761daaed1b 100644
--- a/tests/system/suite_general/tst_cmake_speedcrunch/test.py
+++ b/tests/system/suite_general/tst_cmake_speedcrunch/test.py
@@ -12,8 +12,8 @@ def cmakeSupported():
versionLine = next(iter(versionLines))
test.log("Using " + versionLine)
matcher = re.match("cmake version (\d+)\.(\d+)\.\d+", versionLine)
- major = __builtin__.int(matcher.group(1))
- minor = __builtin__.int(matcher.group(2))
+ major = builtins.int(matcher.group(1))
+ minor = builtins.int(matcher.group(2))
except:
return False
diff --git a/tests/system/suite_general/tst_rename_file/test.py b/tests/system/suite_general/tst_rename_file/test.py
index 693303553a6..d2abe87ea2b 100644
--- a/tests/system/suite_general/tst_rename_file/test.py
+++ b/tests/system/suite_general/tst_rename_file/test.py
@@ -79,7 +79,12 @@ def renameFile(projectDir, proFile, branch, oldname, newname):
menu = ":Qt Creator.Project.Menu.Folder_QMenu"
else:
menu = ":Qt Creator.Project.Menu.File_QMenu"
- activateItem(waitForObjectItem(menu, "Rename..."))
+ try:
+ activateItem(waitForObjectItem(menu, "Rename...", 5000))
+ except:
+ # Try getting an enabled item by reopening the menu
+ openItemContextMenu(treeview, oldItemText, 5, 5, 0)
+ activateItem(waitForObjectItem(menu, "Rename...", 5000))
replaceEdit = waitForObject(":Qt Creator_Utils::NavigationTreeView::QExpandingLineEdit")
test.compare(replaceEdit.selectedText, oldname.rsplit(".", 1)[0],
"Only the filename without the extension is selected?")
diff --git a/tests/system/suite_qtquick/tst_qml_outline/test.py b/tests/system/suite_qtquick/tst_qml_outline/test.py
index fb3662b8057..5eb9ab3e33e 100644
--- a/tests/system/suite_qtquick/tst_qml_outline/test.py
+++ b/tests/system/suite_qtquick/tst_qml_outline/test.py
@@ -104,7 +104,7 @@ def __writeOutlineFile__(outlinePseudoTree, filename):
def retrieveData(record):
return (testData.field(record, "element"),
- __builtin__.int(testData.field(record, "nestinglevel")),
+ builtins.int(testData.field(record, "nestinglevel")),
testData.field(record, "value"))
def verifyOutline(outlinePseudoTree, datasetFileName):
diff --git a/tests/system/suite_tools/tst_codepasting/test.py b/tests/system/suite_tools/tst_codepasting/test.py
index ec0d9ee226e..2720b336dfd 100644
--- a/tests/system/suite_tools/tst_codepasting/test.py
+++ b/tests/system/suite_tools/tst_codepasting/test.py
@@ -243,7 +243,7 @@ def main():
# QString QTextCursor::selectedText () const:
# "Note: If the selection obtained from an editor spans a line break, the text will contain a
# Unicode U+2029 paragraph separator character instead of a newline \n character."
- newParagraph = chr(0x2029) if sys.version_info.major > 2 else unichr(0x2029)
+ newParagraph = chr(0x2029)
selectedText = str(editor.textCursor().selectedText()).replace(newParagraph, "\n")
invokeMenuItem("Tools", "Code Pasting", "Paste Snippet...")
test.compare(waitForObject(":stackedWidget.plainTextEdit_QPlainTextEdit").plainText,