Merge remote-tracking branch 'origin/12.0'

Change-Id: I35cb28b759fb200c45a1496299584132336fcd1c
This commit is contained in:
Eike Ziller
2023-11-08 09:03:59 +01:00
80 changed files with 539 additions and 277 deletions

View File

@@ -264,6 +264,8 @@ Projects
* Added parsing the dependencies from `vcpkg.json` manifest files * Added parsing the dependencies from `vcpkg.json` manifest files
* Improved the addition of dependencies to `vcpkg.json` * Improved the addition of dependencies to `vcpkg.json`
([Documentation](https://doc-snapshots.qt.io/qtcreator-12.0/creator-how-to-edit-vcpkg-manifest-files.html))
### Qt Safe Renderer ### Qt Safe Renderer
* Added a wizard for Qt Safe Renderer 2.1 and later * Added a wizard for Qt Safe Renderer 2.1 and later

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -59,8 +59,9 @@
\section1 Specifying Settings for Debug Server Providers \section1 Specifying Settings for Debug Server Providers
To create connections to bare metal devices using a debug server provider, To create connections to bare metal devices using a debug server provider,
select \preferences > \uicontrol Devices select \preferences > \uicontrol Devices > \uicontrol {Bare Metal} >
> \uicontrol {Bare Metal} > \uicontrol Add > \uicontrol Default. \uicontrol Add.
The available settings depend on the debug server provider. The available settings depend on the debug server provider.
\section2 EBlink \section2 EBlink
@@ -68,7 +69,7 @@
\l{https://github.com/EmBitz/EBlink}{EBlink} is an ARM Cortex-M debug tool \l{https://github.com/EmBitz/EBlink}{EBlink} is an ARM Cortex-M debug tool
that supports squirrel scripting, live variables, and hot-plugging. that supports squirrel scripting, live variables, and hot-plugging.
\image qtcreator-baremetal-eblink.png "Bare metal device preferences for EBlink" \image qtcreator-baremetal-eblink.webp {Bare metal device preferences for EBlink}
To specify settings for \EBlink: To specify settings for \EBlink:
@@ -105,7 +106,7 @@
\l{https://www.segger.com/products/debug-probes/j-link/}{J-Link} is a line \l{https://www.segger.com/products/debug-probes/j-link/}{J-Link} is a line
of debug probes by Segger. of debug probes by Segger.
\image qtcreator-baremetal-jlink.png "Bare metal device preferences for J-Link" \image qtcreator-baremetal-jlink.webp "Bare metal device preferences for J-Link"
To specify settings for J-Link debug probes: To specify settings for J-Link debug probes:
@@ -137,7 +138,7 @@
(JTAG) facility. It enables source level debugging with the GDB compiled (JTAG) facility. It enables source level debugging with the GDB compiled
for the ARM architecture. for the ARM architecture.
\image qtcreator-baremetal-openocd.png "Bare metal device preferences for OpenOCD" \image qtcreator-baremetal-openocd.webp "Bare metal device preferences for OpenOCD"
To specify settings for \OpenOCD: To specify settings for \OpenOCD:
@@ -163,7 +164,7 @@
\l{https://www.st.com/en/development-tools/stm32-programmers.html#products} \l{https://www.st.com/en/development-tools/stm32-programmers.html#products}
{ST-LINK Utility} is used for programming STM32 microcontrollers. {ST-LINK Utility} is used for programming STM32 microcontrollers.
\image qtcreator-baremetal-stlink.png "Bare metal device preferences for St-Link" \image qtcreator-baremetal-stlink.webp "Bare metal device preferences for St-Link"
To specify settings for St-Link: To specify settings for St-Link:
@@ -202,7 +203,7 @@
\image qtcreator-baremetal-uvision-simulator.png "Bare metal device preferences for uVision Simulator" \image qtcreator-baremetal-uvision-simulator.png "Bare metal device preferences for uVision Simulator"
To specify settings for uVision Simulator or uVision St-Link Debugger: To specify settings for uVision Simulator:
\list 1 \list 1
@@ -215,11 +216,11 @@
\endlist \endlist
\section3 uVision St-Link Debugger \section3 uVision St-Link or JLink Debugger
\image qtcreator-baremetal-uvision-st-link.png "Bare metal device preferences for uVision St-Link" \image qtcreator-baremetal-uvision-st-link.png "Bare metal device preferences for uVision St-Link"
To specify settings for uVision St-Link Debugger: To specify settings for uVision St-Link or JLink Debugger:
\list 1 \list 1

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2020 The Qt Company Ltd. // Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
//! [baremetal-common] //! [baremetal-common]
@@ -6,6 +6,8 @@
\li In the \uicontrol Name field, enter a name for the connection. \li In the \uicontrol Name field, enter a name for the connection.
\li In the \uicontrol {Startup mode} field, select the mode to start \li In the \uicontrol {Startup mode} field, select the mode to start
the debug server provider in. the debug server provider in.
\li In the \uicontrol {Peripheral description file} field, specify a path to
a file that describes the peripherals on the device.
\li In the \uicontrol Host field, select the host name and port number \li In the \uicontrol Host field, select the host name and port number
to connect to the debug server provider. to connect to the debug server provider.
\li In the \uicontrol {Executable file} field, enter the path to the \li In the \uicontrol {Executable file} field, enter the path to the

View File

@@ -53,7 +53,7 @@
To specify settings for managing the GDB process, select \preferences > To specify settings for managing the GDB process, select \preferences >
\uicontrol Debugger > \uicontrol GDB. \uicontrol Debugger > \uicontrol GDB.
\image qtcreator-gdb-options.png "GDB preferences" \image qtcreator-preferences-debugger-gdb.webp {GDB preferences}
To specify a timeout for terminating non-responsive GDB processes, set the To specify a timeout for terminating non-responsive GDB processes, set the
number of seconds to wait in the \uicontrol {GDB timeout} field. The default number of seconds to wait in the \uicontrol {GDB timeout} field. The default
@@ -111,6 +111,8 @@
To execute arbitrary Python scripts, use To execute arbitrary Python scripts, use
\c {python execfile('/path/to/script.py')}. \c {python execfile('/path/to/script.py')}.
\section2 Extended GDB Settings
The settings in the \uicontrol Extended group give access to advanced The settings in the \uicontrol Extended group give access to advanced
or experimental functions of GDB. or experimental functions of GDB.
Enabling them may negatively impact your debugging experience, so use Enabling them may negatively impact your debugging experience, so use

View File

@@ -1368,7 +1368,7 @@
\uicontrol Debugger > \uicontrol GDB > \uicontrol {Load system GDB pretty \uicontrol Debugger > \uicontrol GDB > \uicontrol {Load system GDB pretty
printers}. For more information, see \l{Specifying GDB Settings}. printers}. For more information, see \l{Specifying GDB Settings}.
\image qtcreator-gdb-options.png {GDB preferences} \image qtcreator-preferences-debugger-gdb.webp {GDB preferences}
\section2 Customizing Built-In Debugging Helpers \section2 Customizing Built-In Debugging Helpers
@@ -2036,7 +2036,7 @@
when loading the same binary in the future. Select \preferences > when loading the same binary in the future. Select \preferences >
\uicontrol Debugger > \uicontrol GDB > \uicontrol {Use automatic symbol cache}. \uicontrol Debugger > \uicontrol GDB > \uicontrol {Use automatic symbol cache}.
\image qtcreator-gdb-options.png {GDB preferences} \image qtcreator-preferences-debugger-gdb.webp {GDB preferences}
\section2 Minimizing Number of Breakpoints \section2 Minimizing Number of Breakpoints

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2021 The Qt Company Ltd. // Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
// ********************************************************************** // **********************************************************************
@@ -57,11 +57,11 @@
\li Select \preferences > \li Select \preferences >
\uicontrol Beautifier to specify settings for beautifying files. \uicontrol Beautifier to specify settings for beautifying files.
\li Select the \uicontrol {Enable auto format on file save} check box to \li Select the \uicontrol {Automatic formatting on file save} check box to
automatically beautify files when you save them using the tool you automatically beautify files when you save them using the tool you
select in the \uicontrol Tool field. select in the \uicontrol Tool field.
\image qt-creator-beautifier-options-general.png "General Beautifier preferences" \image qtcreator-preferences-beautifier-general.webp {General Beautifier preferences}
\li In the \uicontrol {Restrict to MIME types} field, define the MIME \li In the \uicontrol {Restrict to MIME types} field, define the MIME
types of the files to beautify, separated by semicolons. Leave the types of the files to beautify, separated by semicolons. Leave the

View File

@@ -482,6 +482,12 @@
To run disabled tests, select the \uicontrol {Run disabled tests} check box. To run disabled tests, select the \uicontrol {Run disabled tests} check box.
To turn assertion failures into C++ exceptions, select the
\uicontrol {Throw on failure} check box.
To turn failures into debugger breakpoints, select the
\uicontrol {Break on failure while debugging} check box.
To run several iterations of the tests, select the \uicontrol {Repeat tests} To run several iterations of the tests, select the \uicontrol {Repeat tests}
check box and enter the number of times to run the tests in the check box and enter the number of times to run the tests in the
\uicontrol Iterations field. To make sure that the tests are independent and \uicontrol Iterations field. To make sure that the tests are independent and
@@ -490,8 +496,6 @@
randomizer in the \uicontrol Seed field. The value 0 generates a seed randomizer in the \uicontrol Seed field. The value 0 generates a seed
based on the current timestamp. based on the current timestamp.
To turn failures into debugger breakpoints, select the
\uicontrol {Break on failure while debugging} check box.
To group Google tests by using a GTest filter, select To group Google tests by using a GTest filter, select
\uicontrol {GTest Filter} in the \uicontrol {Group mode} field, \uicontrol {GTest Filter} in the \uicontrol {Group mode} field,

View File

@@ -412,7 +412,7 @@
\list 1 \list 1
\li Select \preferences > \uicontrol Environment > \uicontrol System. \li Select \preferences > \uicontrol Environment > \uicontrol System.
\image qtcreator-options-environment-system.png {System preferences} \image qtcreator-preferences-environment-system.webp {System preferences}
\li In \uicontrol {Maximum number of entries in "Recent Files"}, set \li In \uicontrol {Maximum number of entries in "Recent Files"}, set
the number of files to show. the number of files to show.
\endlist \endlist

View File

@@ -7,7 +7,7 @@
\ingroup creator-reference-build-systems \ingroup creator-reference-build-systems
\title Managing Packages with vcpkg \title vcpkg Package Manager
\brief The experimental vcpkg plugin integrates the vcpkg C/C++ package \brief The experimental vcpkg plugin integrates the vcpkg C/C++ package
manager into \QC. manager into \QC.
@@ -36,16 +36,31 @@
Select \inlineimage icons/online.png Select \inlineimage icons/online.png
to download vcpkg if you have not installed it yet. to download vcpkg if you have not installed it yet.
\section1 Creating vcpkg Manifest Files \sa {Create vcpkg manifest files}, {Edit vcpkg manifest files},
{Enable and disable plugins}
*/
/*!
\page creator-how-to-create-vcpkg-manifest-files.html
\previouspage creator-how-tos.html
\ingroup creator-how-to-projects
\title Create vcpkg manifest files
To create a new vcpkg package manager manifest (vcpkg.json) file: To create a new vcpkg package manager manifest (vcpkg.json) file:
\list 1 \list 1
\li Select \uicontrol File > \uicontrol {New File} > \li Select \uicontrol File > \uicontrol {New File} >
\uicontrol Vcpkg. \uicontrol vcpkg > \uicontrol {vcpkg.json Manifest File} >
\image qtcreator-file-new-file-vcpkg-manifest-file.webp {vcpkg.json Manifest File wizard page} \uicontrol Choose to open the \uicontrol Location dialog.
\li In \uicontrol {File name}, enter a name for the manifest file.
\li In \uicontrol Path, enter the path for the manifest file.
\li Select \uicontrol Next to open the
\uicontrol {vcpkg.json Manifest File} dialog.
\image qtcreator-file-new-file-vcpkg-manifest-file.webp {vcpkg.json Manifest File dialog}
\li In \uicontrol Name, enter a name for the manifest file. \li In \uicontrol Name, enter a name for the manifest file.
\li In \uicontrol Version, enter a version number for the file. \li In \uicontrol {Version string}, enter a version number for the file.
\li In \uicontrol Dependencies, enter the packages to manage. \li In \uicontrol Dependencies, enter the packages to manage.
You can add packages later in a manifest editor. You can add packages later in a manifest editor.
@@ -57,27 +72,51 @@
The wizard automatically adds the vcpkg.json file to the CMakeLists.txt file The wizard automatically adds the vcpkg.json file to the CMakeLists.txt file
of the project. of the project.
\section1 Selecting Packages to Manage \sa {vcpkg Package Manager}, {Edit vcpkg manifest files}
*/
/*!
\page creator-how-to-edit-vcpkg-manifest-files.html
\previouspage creator-how-tos.html
\ingroup creator-how-to-build
\title Edit vcpkg manifest files
When you open a vcpkg.json file, it opens in the manifest file editor: When you open a vcpkg.json file, it opens in the manifest file editor:
\image qtcreator-vcpkg-manifest-file-editor.webp {vcpkg.json file in the manifest file editor} \image qtcreator-vcpkg-manifest-file-editor.webp {vcpkg.json file in the manifest file editor}
\section1 Add packages to manage
To add a package to your project: To add a package to your project:
\list 1 \list 1
\li Place the cursor on the line where you want to add a package. \li Select the \inlineimage icons/vcpkg.png
\li Select the \inlineimage icons/zoom.png (\uicontrol {Add vcpkg Package}) button on the manifest editor
(\uicontrol {Search Package}) button. toolbar.
\image qtcreator-vcpkg-package-selector.webp {Package selector dialog} \image qtcreator-vcpkg-package-selector.webp {Add vcpkg Package dialog}
\li Select the package to add to your project. \li Select the package to add to your project.
\li Select \uicontrol OK to return to the editor. \li Select \uicontrol OK to return to the editor.
\li Repeat to add more packages. \li Repeat to add more packages.
\endlist \endlist
To set the path to the directory where you installed vcpkg, select \section1 Generate code for CMake configuration files
\inlineimage icons/settings.png
(\uicontrol Configure) on the editor toolbar.
\sa {Enable and disable plugins} To generate sample CMake code to copy to the CMakeLists.text file:
\list 1
\li Select the \inlineimage icons/cmake.png (\uicontrol {CMake Code})
button on the manifest editor toolbar.
\image qtcreator-vcpkg-cmake-config.webp {CMake Code dialog}
\li Select the example code you need and copy-paste it to the
CMakeLists.txt file.
\endlist
\section1 Set the path to vcpkg
To set the path to the directory where you installed vcpkg, select
\inlineimage icons/settings.png (\uicontrol Configure) on the editor toolbar.
\sa {vcpkg Package Manager}, {Create vcpkg manifest files}
*/ */

View File

@@ -65,8 +65,7 @@
\li Class and script files for Python projects. \li Class and script files for Python projects.
\row \row
\li \uicontrol {vcpkg} (experimental) \li \uicontrol {vcpkg} (experimental)
\li \l {Managing Packages with vcpkg}{vcpkg package manager} manifest \li vcpkg package manager manifest files (vcpkg.json).
files (vcpkg.json).
\row \row
\li \uicontrol {Nim} (experimental) \li \uicontrol {Nim} (experimental)
\li Empty Nim source and script files. \li Empty Nim source and script files.
@@ -74,7 +73,7 @@
\sa {Create compiler explorer sessions}, {Create C++ classes}, \sa {Create compiler explorer sessions}, {Create C++ classes},
{Create OpenGL fragment and vertex shaders}, {Create resource files}, {Create OpenGL fragment and vertex shaders}, {Create resource files},
{Use project wizards} {Create vcpkg manifest files}, {Use project wizards}
*/ */
/*! /*!

View File

@@ -23,7 +23,7 @@
\uicontrol Environment > \uicontrol System, and then select \uicontrol Environment > \uicontrol System, and then select
\uicontrol Change in the \uicontrol Environment field. \uicontrol Change in the \uicontrol Environment field.
\image qtcreator-options-environment-system.png "Environment preferences System tab" \image qtcreator-preferences-environment-system.webp "Environment preferences System tab"
In addition, you can specify custom environment variables in the In addition, you can specify custom environment variables in the
\uicontrol {Project Settings} > \uicontrol Environment settings. \uicontrol {Project Settings} > \uicontrol Environment settings.

View File

@@ -38,7 +38,7 @@
To set preferences for opening files and handling open files, select To set preferences for opening files and handling open files, select
\preferences > \uicontrol Environment > \uicontrol System: \preferences > \uicontrol Environment > \uicontrol System:
\image qtcreator-options-environment-system.png {System tab in Environment preferences} \image qtcreator-preferences-environment-system.webp {System tab in Environment preferences}
\list \list
\li In the \uicontrol {When files are externally modified} field, \li In the \uicontrol {When files are externally modified} field,

View File

@@ -17857,27 +17857,27 @@ Trotzdem fortfahren?</translation>
</message> </message>
<message> <message>
<source>Round Up for .5 and Above</source> <source>Round Up for .5 and Above</source>
<translation type="unfinished"></translation> <translation>Ab 0,5 aufrunden</translation>
</message> </message>
<message> <message>
<source>Always Round Up</source> <source>Always Round Up</source>
<translation type="unfinished"></translation> <translation>Immer aufrunden</translation>
</message> </message>
<message> <message>
<source>Always Round Down</source> <source>Always Round Down</source>
<translation type="unfinished"></translation> <translation>Immer abrunden</translation>
</message> </message>
<message> <message>
<source>Round Up for .75 and Above</source> <source>Round Up for .75 and Above</source>
<translation type="unfinished"></translation> <translation>Ab 0,75 aufrunden</translation>
</message> </message>
<message> <message>
<source>Don&apos;t Round</source> <source>Don&apos;t Round</source>
<translation type="unfinished"></translation> <translation>Nicht runden</translation>
</message> </message>
<message> <message>
<source>DPI rounding policy:</source> <source>DPI rounding policy:</source>
<translation type="unfinished"></translation> <translation>DPI-Rundungsstrategie:</translation>
</message> </message>
<message> <message>
<source>Text codec for tools:</source> <source>Text codec for tools:</source>
@@ -17897,7 +17897,7 @@ Trotzdem fortfahren?</translation>
</message> </message>
<message> <message>
<source>The DPI rounding policy change will take effect after restart.</source> <source>The DPI rounding policy change will take effect after restart.</source>
<translation type="unfinished"></translation> <translation>Die Änderung der DPI-Rundungsstrategie wird nach einem Neustart wirksam.</translation>
</message> </message>
<message> <message>
<source>Interface</source> <source>Interface</source>
@@ -18071,19 +18071,19 @@ Trotzdem fortfahren?</translation>
</message> </message>
<message> <message>
<source>Show Menu Bar</source> <source>Show Menu Bar</source>
<translation type="unfinished"></translation> <translation>Menüleiste anzeigen</translation>
</message> </message>
<message> <message>
<source>Ctrl+Alt+M</source> <source>Ctrl+Alt+M</source>
<translation type="unfinished"></translation> <translation>Ctrl+Alt+M</translation>
</message> </message>
<message> <message>
<source>Hide Menu Bar</source> <source>Hide Menu Bar</source>
<translation type="unfinished"></translation> <translation>Menüleiste verbergen</translation>
</message> </message>
<message> <message>
<source>This will hide the menu bar completely. You can show it again by typing %1.</source> <source>This will hide the menu bar completely. You can show it again by typing %1.</source>
<translation type="unfinished"></translation> <translation>Dies verbirgt die Menüleiste. Sie können Sie durch Eingeben von %1 wieder anzeigen.</translation>
</message> </message>
<message> <message>
<source>Version:</source> <source>Version:</source>
@@ -18313,7 +18313,7 @@ Trotzdem fortfahren?</translation>
</message> </message>
<message> <message>
<source>Reset to Default</source> <source>Reset to Default</source>
<translation type="unfinished">Auf Vorgabe zurücksetzen</translation> <translation>Auf Vorgabe zurücksetzen</translation>
</message> </message>
<message> <message>
<source>Error Details</source> <source>Error Details</source>
@@ -18394,7 +18394,7 @@ Trotzdem fortfahren?</translation>
</message> </message>
<message> <message>
<source>Sort categories</source> <source>Sort categories</source>
<translation type="unfinished"></translation> <translation>Kategorien sortieren</translation>
</message> </message>
<message> <message>
<source>Preferences</source> <source>Preferences</source>
@@ -18735,11 +18735,11 @@ Trotzdem fortfahren?</translation>
</message> </message>
<message> <message>
<source>Remove the following files from the version control system (%1)?</source> <source>Remove the following files from the version control system (%1)?</source>
<translation type="unfinished"></translation> <translation>Möchten Sie die folgenden Dateien aus der Versionskontrolle (%1) entfernen?</translation>
</message> </message>
<message> <message>
<source>Note: This might remove the local file.</source> <source>Note: This might remove the local file.</source>
<translation type="unfinished"></translation> <translation>Hinweis: Unter Umständen werden die lokalen Dateien gelöscht.</translation>
</message> </message>
<message> <message>
<source>Add to Version Control</source> <source>Add to Version Control</source>
@@ -20549,7 +20549,7 @@ provided they were unmodified before the refactoring.</source>
</message> </message>
<message> <message>
<source>Sort results</source> <source>Sort results</source>
<translation type="unfinished"></translation> <translation>Ergebnisse sortieren</translation>
</message> </message>
<message> <message>
<source>Case sensitive:</source> <source>Case sensitive:</source>
@@ -21046,15 +21046,15 @@ Doppelklicken Sie einen Eintrag um ihn zu ändern.</translation>
</message> </message>
<message> <message>
<source>Entry is missing a logging category name.</source> <source>Entry is missing a logging category name.</source>
<translation type="unfinished"></translation> <translation>Der Name der Log-Kategorie fehlt im Eintrag.</translation>
</message> </message>
<message> <message>
<source>Entry is missing data.</source> <source>Entry is missing data.</source>
<translation type="unfinished"></translation> <translation>Im Eintrag fehlen Daten.</translation>
</message> </message>
<message> <message>
<source>Invalid level: %1</source> <source>Invalid level: %1</source>
<translation type="unfinished"></translation> <translation>Ungültige Stufe: %1</translation>
</message> </message>
<message> <message>
<source>Category</source> <source>Category</source>
@@ -21062,23 +21062,23 @@ Doppelklicken Sie einen Eintrag um ihn zu ändern.</translation>
</message> </message>
<message> <message>
<source>Debug</source> <source>Debug</source>
<translation type="unfinished">Debug</translation> <translation>Debug</translation>
</message> </message>
<message> <message>
<source>Warning</source> <source>Warning</source>
<translation type="unfinished">Warnung</translation> <translation>Warnung</translation>
</message> </message>
<message> <message>
<source>Critical</source> <source>Critical</source>
<translation type="unfinished"></translation> <translation>Kritisch</translation>
</message> </message>
<message> <message>
<source>Fatal</source> <source>Fatal</source>
<translation type="unfinished"></translation> <translation>Fatal</translation>
</message> </message>
<message> <message>
<source>Info</source> <source>Info</source>
<translation type="unfinished">Info</translation> <translation>Info</translation>
</message> </message>
<message> <message>
<source>Type</source> <source>Type</source>
@@ -21090,15 +21090,15 @@ Doppelklicken Sie einen Eintrag um ihn zu ändern.</translation>
</message> </message>
<message> <message>
<source>Filter Qt Internal Log Categories</source> <source>Filter Qt Internal Log Categories</source>
<translation type="unfinished"></translation> <translation>Qt-interne Log-Kategorien ausschließen</translation>
</message> </message>
<message> <message>
<source>Filter categories by regular expression</source> <source>Filter categories by regular expression</source>
<translation type="unfinished"></translation> <translation>Kategorien mit regulärem Ausdruck filtern</translation>
</message> </message>
<message> <message>
<source>Invalid regular expression: %1</source> <source>Invalid regular expression: %1</source>
<translation type="unfinished">Ungültiger regulärer Ausdruck: %1</translation> <translation>Ungültiger regulärer Ausdruck: %1</translation>
</message> </message>
<message> <message>
<source>Start Logging</source> <source>Start Logging</source>
@@ -21114,15 +21114,16 @@ Doppelklicken Sie einen Eintrag um ihn zu ändern.</translation>
</message> </message>
<message> <message>
<source>Uncheck All %1</source> <source>Uncheck All %1</source>
<translation type="unfinished"></translation> <translation>Alle vom Typ %1 abwählen</translation>
</message> </message>
<message> <message>
<source>Check All %1</source> <source>Check All %1</source>
<translation type="unfinished"></translation> <translation>Alle vom Typ %1 auswählen</translation>
</message> </message>
<message> <message>
<source>Reset All %1</source> <source>Reset All %1</source>
<translation type="unfinished"></translation> <translatorcomment>%1 is &quot;Info&quot;, &quot;Debug&quot;, etc</translatorcomment>
<translation>Alle vom Typ %1 zurücksetzen</translation>
</message> </message>
<message> <message>
<source>Save Enabled as Preset...</source> <source>Save Enabled as Preset...</source>
@@ -21457,19 +21458,19 @@ Doppelklicken Sie einen Eintrag um ihn zu ändern.</translation>
</message> </message>
<message> <message>
<source>Convert Comment to C-Style</source> <source>Convert Comment to C-Style</source>
<translation type="unfinished"></translation> <translation>Kommentar in C-Stil umwandeln</translation>
</message> </message>
<message> <message>
<source>Convert Comment to C++-Style</source> <source>Convert Comment to C++-Style</source>
<translation type="unfinished"></translation> <translation>Kommentar in C++-Stil umwandeln</translation>
</message> </message>
<message> <message>
<source>Move Function Documentation to Declaration</source> <source>Move Function Documentation to Declaration</source>
<translation type="unfinished"></translation> <translation>Funktionsdokumentation zur Deklaration verschieben</translation>
</message> </message>
<message> <message>
<source>Move Function Documentation to Definition</source> <source>Move Function Documentation to Definition</source>
<translation type="unfinished"></translation> <translation>Funktionsdokumentation zur Definition verschieben</translation>
</message> </message>
<message> <message>
<source>Insert Virtual Functions of Base Classes</source> <source>Insert Virtual Functions of Base Classes</source>
@@ -21513,15 +21514,15 @@ Doppelklicken Sie einen Eintrag um ihn zu ändern.</translation>
</message> </message>
<message> <message>
<source>Fold All Comment Blocks</source> <source>Fold All Comment Blocks</source>
<translation type="unfinished"></translation> <translation>Alle Kommentarblöcke einklappen</translation>
</message> </message>
<message> <message>
<source>Unfold All Comment Blocks</source> <source>Unfold All Comment Blocks</source>
<translation type="unfinished"></translation> <translation>Alle Kommentarblöcke ausklappen</translation>
</message> </message>
<message> <message>
<source>C++ File Naming</source> <source>C++ File Naming</source>
<translation type="unfinished"></translation> <translation>Namenskonvention für C++-Dateien</translation>
</message> </message>
<message> <message>
<source>The license template.</source> <source>The license template.</source>
@@ -22484,9 +22485,9 @@ z.B. name = &quot;m_test_foo_&quot;:
</message> </message>
<message numerus="yes"> <message numerus="yes">
<source>Checked %1 of %n function(s)</source> <source>Checked %1 of %n function(s)</source>
<translation type="unfinished"> <translation>
<numerusform></numerusform> <numerusform>%1 von einer Funktion geprüft</numerusform>
<numerusform></numerusform> <numerusform>%1 von %n Funktionen geprüft</numerusform>
</translation> </translation>
</message> </message>
<message> <message>
@@ -22535,11 +22536,11 @@ z.B. name = &quot;m_test_foo_&quot;:
</message> </message>
<message> <message>
<source>Decision Forest</source> <source>Decision Forest</source>
<translation type="unfinished"></translation> <translation>Decision Forest</translation>
</message> </message>
<message> <message>
<source>Heuristics</source> <source>Heuristics</source>
<translation type="unfinished"></translation> <translation>Heuristik</translation>
</message> </message>
<message> <message>
<source>Interpret ambiguous headers as C headers</source> <source>Interpret ambiguous headers as C headers</source>
@@ -22583,15 +22584,15 @@ z.B. name = &quot;m_test_foo_&quot;:
</message> </message>
<message> <message>
<source>&lt;p&gt;If background indexing is enabled, global symbol searches will yield more accurate results, at the cost of additional CPU load when the project is first opened. The indexing result is persisted in the project&apos;s build directory. If you disable background indexing, a faster, but less accurate, built-in indexer is used instead. The thread priority for building the background index can be adjusted since clangd 15.&lt;/p&gt;&lt;p&gt;Background Priority: Minimum priority, runs on idle CPUs. May leave &apos;performance&apos; cores unused.&lt;/p&gt;&lt;p&gt;Normal Priority: Reduced priority compared to interactive work.&lt;/p&gt;&lt;p&gt;Low Priority: Same priority as other clangd work.&lt;/p&gt;</source> <source>&lt;p&gt;If background indexing is enabled, global symbol searches will yield more accurate results, at the cost of additional CPU load when the project is first opened. The indexing result is persisted in the project&apos;s build directory. If you disable background indexing, a faster, but less accurate, built-in indexer is used instead. The thread priority for building the background index can be adjusted since clangd 15.&lt;/p&gt;&lt;p&gt;Background Priority: Minimum priority, runs on idle CPUs. May leave &apos;performance&apos; cores unused.&lt;/p&gt;&lt;p&gt;Normal Priority: Reduced priority compared to interactive work.&lt;/p&gt;&lt;p&gt;Low Priority: Same priority as other clangd work.&lt;/p&gt;</source>
<translation type="unfinished"></translation> <translation>&lt;p&gt;Wenn sie das globale Indizieren aktivieren, liefert die globale Symbolsuche genauere Resultate, es erhöht aber die CPU-Last beim ersten Öffnen von Projekten. Das Resultat der Indizierung wird im Build-Verzeichnis des Projekts gespeichert. Wenn sie das globale Indizieren deaktivieren, wird stattdessen ein schnellerer, aber weniger genauer, integrierter Indexer benutzt. Seit Clangd 15 können Sie die Priorität für die Indizierungs-Threads anpassen.&lt;/p&gt;&lt;p&gt;Hintergrund-Priorität: Niedrigste Priorität, läuft nur auf leerlaufenden CPUs. Kann &quot;Performance&quot;-Kerne ungenutzt lassen.&lt;/p&gt;&lt;p&gt;Normale Priorität: Geringere Priorität im Vergleich zu interaktiven Aktivitäten.&lt;/p&gt;&lt;p&gt;Niedrige Priorität: Dieselbe Priorität wie andere Clangd-Aktivitäten.&lt;/p&gt;</translation>
</message> </message>
<message> <message>
<source>&lt;p&gt;The C/C++ backend to use for switching between header and source files.&lt;/p&gt;&lt;p&gt;While the clangd implementation has more capabilities than the built-in code model, it tends to find false positives.&lt;/p&gt;&lt;p&gt;When &quot;Try Both&quot; is selected, clangd is used only if the built-in variant does not find anything.&lt;/p&gt;</source> <source>&lt;p&gt;The C/C++ backend to use for switching between header and source files.&lt;/p&gt;&lt;p&gt;While the clangd implementation has more capabilities than the built-in code model, it tends to find false positives.&lt;/p&gt;&lt;p&gt;When &quot;Try Both&quot; is selected, clangd is used only if the built-in variant does not find anything.&lt;/p&gt;</source>
<translation type="unfinished"></translation> <translation>&lt;p&gt;Bestimmt, welches C/C++-Backend zum Wechseln zwischen Header- und Quelldatei benutzt wird.&lt;/p&gt;&lt;p&gt;Die Clangd-Implementation hat mehr Fähigkeiten, aber auch einige Fehler, die nicht in der integrierten Variante vorhanden sind.&lt;/p&gt;&lt;p&gt;Wenn &quot;Beide versuchen&quot; ausgewählt ist, wird Clangd nur benutzt, wenn die integrierte Variant nichts findet.&lt;/p&gt;</translation>
</message> </message>
<message> <message>
<source>&lt;p&gt;Which model clangd should use to rank possible completions.&lt;/p&gt;&lt;p&gt;This determines the order of candidates in the combo box when doing code completion.&lt;/p&gt;&lt;p&gt;The &quot;%1&quot; model used by default results from (pre-trained) machine learning and provides superior results on average.&lt;/p&gt;&lt;p&gt;If you feel that its suggestions stray too much from your expectations for your code base, you can try switching to the hand-crafted &quot;%2&quot; model.&lt;/p&gt;</source> <source>&lt;p&gt;Which model clangd should use to rank possible completions.&lt;/p&gt;&lt;p&gt;This determines the order of candidates in the combo box when doing code completion.&lt;/p&gt;&lt;p&gt;The &quot;%1&quot; model used by default results from (pre-trained) machine learning and provides superior results on average.&lt;/p&gt;&lt;p&gt;If you feel that its suggestions stray too much from your expectations for your code base, you can try switching to the hand-crafted &quot;%2&quot; model.&lt;/p&gt;</source>
<translation type="unfinished"></translation> <translation>&lt;p&gt;Das Modell, das Clangd für die Rangfolge der möglichen Vervollständigungen benutzen soll.&lt;/p&gt;&lt;p&gt;Dies bestimmt die Reihenfolge der Kandidaten im Drop-Down-Menü der Code-Vervollständigung.&lt;/p&gt;&lt;p&gt;Das voreingestellte Modell &quot;%1&quot; wurde durch maschinelles Lernen trainiert und bietet im Schnitt die besten Ergebnisse.&lt;/p&gt;&lt;p&gt;Falls dies für Ihren Code zu sehr von Ihren Erwartungen abweicht, können Sie auf das manuell erstellte Modell &quot;%2&quot; umstellen.&lt;p&gt;</translation>
</message> </message>
<message> <message>
<source>Number of worker threads used by clangd. Background indexing also uses this many worker threads.</source> <source>Number of worker threads used by clangd. Background indexing also uses this many worker threads.</source>
@@ -22655,7 +22656,7 @@ Das integrierte Codemodell übernimmt Syntaxhervorhebung, Code-Vervollständigun
</message> </message>
<message> <message>
<source>Completion ranking model:</source> <source>Completion ranking model:</source>
<translation type="unfinished"></translation> <translation>Rangfolge-Modell für die Code-Vervollständigung:</translation>
</message> </message>
<message> <message>
<source>Document update threshold:</source> <source>Document update threshold:</source>
@@ -23007,7 +23008,7 @@ Flags: %3</translation>
</message> </message>
<message> <message>
<source>collecting overrides...</source> <source>collecting overrides...</source>
<translation type="unfinished"></translation> <translation>Suche überschriebene Methoden...</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -28336,11 +28337,11 @@ Versuchen Sie, das Projekt neu zu erstellen.</translation>
</message> </message>
<message> <message>
<source>Docker executable not found</source> <source>Docker executable not found</source>
<translation type="unfinished"></translation> <translation>Ausführbare Datei für Docker nicht gefunden</translation>
</message> </message>
<message> <message>
<source>Failed to retrieve docker networks. Exit code: %1. Error: %2</source> <source>Failed to retrieve docker networks. Exit code: %1. Error: %2</source>
<translation type="unfinished"></translation> <translation>Docker-Netzwerke konnten nicht abgerufen werden. Rückgabewert: %1. Fehler: %2</translation>
</message> </message>
<message> <message>
<source>Path &quot;%1&quot; is not a directory or does not exist.</source> <source>Path &quot;%1&quot; is not a directory or does not exist.</source>
@@ -28356,39 +28357,39 @@ Versuchen Sie, das Projekt neu zu erstellen.</translation>
</message> </message>
<message> <message>
<source>Run as outside user:</source> <source>Run as outside user:</source>
<translation type="unfinished"></translation> <translation>Als Benutzer von außerhalb ausführen:</translation>
</message> </message>
<message> <message>
<source>Do not modify entry point:</source> <source>Do not modify entry point:</source>
<translation type="unfinished"></translation> <translation>Einstiegspunkt nicht ändern:</translation>
</message> </message>
<message> <message>
<source>Enable flags needed for LLDB:</source> <source>Enable flags needed for LLDB:</source>
<translation type="unfinished"></translation> <translation>Aktiviert Optionen, die für LLDB benötigt werden:</translation>
</message> </message>
<message> <message>
<source>Extra arguments:</source> <source>Extra arguments:</source>
<translation type="unfinished">Zusätzliche Argumente:</translation> <translation>Zusätzliche Argumente:</translation>
</message> </message>
<message> <message>
<source>Extra arguments to pass to docker create.</source> <source>Extra arguments to pass to docker create.</source>
<translation type="unfinished"></translation> <translation>Zusätzliche Argumente für docker create.</translation>
</message> </message>
<message> <message>
<source>Network:</source> <source>Network:</source>
<translation type="unfinished"></translation> <translation>Netzwerk:</translation>
</message> </message>
<message> <message>
<source>Error</source> <source>Error</source>
<translation type="unfinished">Fehler</translation> <translation>Fehler</translation>
</message> </message>
<message> <message>
<source>The path &quot;%1&quot; does not exist.</source> <source>The path &quot;%1&quot; does not exist.</source>
<translation type="unfinished">Der Pfad &quot;%1&quot; existiert nicht.</translation> <translation>Der Pfad &quot;%1&quot; existiert nicht.</translation>
</message> </message>
<message> <message>
<source>stopped</source> <source>stopped</source>
<translation type="unfinished"></translation> <translation>angehalten</translation>
</message> </message>
<message> <message>
<source>Error starting remote shell. No container.</source> <source>Error starting remote shell. No container.</source>
@@ -28400,15 +28401,15 @@ Versuchen Sie, das Projekt neu zu erstellen.</translation>
</message> </message>
<message> <message>
<source>Image &quot;%1&quot; is not available.</source> <source>Image &quot;%1&quot; is not available.</source>
<translation type="unfinished"></translation> <translation>Image &quot;%1&quot; ist nicht verfügbar.</translation>
</message> </message>
<message> <message>
<source>Failed creating Docker container. Exit code: %1, output: %2</source> <source>Failed creating Docker container. Exit code: %1, output: %2</source>
<translation type="unfinished"></translation> <translation>Docker-Container konnte nicht erstellt werden. Rückgabewert: %1, Ausgabe: %2</translation>
</message> </message>
<message> <message>
<source>Failed creating Docker container. No container ID received.</source> <source>Failed creating Docker container. No container ID received.</source>
<translation type="unfinished"></translation> <translation>Docker-Container konnte nicht erstellt werden. Keine Container-ID erhalten.</translation>
</message> </message>
<message> <message>
<source>Docker daemon appears to be not running. Verify daemon is up and running and reset the Docker daemon in Docker device preferences or restart %1.</source> <source>Docker daemon appears to be not running. Verify daemon is up and running and reset the Docker daemon in Docker device preferences or restart %1.</source>
@@ -28417,23 +28418,23 @@ Versuchen Sie, das Projekt neu zu erstellen.</translation>
</message> </message>
<message> <message>
<source>Failed to create container shell (Out of memory).</source> <source>Failed to create container shell (Out of memory).</source>
<translation type="unfinished"></translation> <translation>Container-Shell konnte nicht erstellt werden (nicht genügend Speicherplatz).</translation>
</message> </message>
<message> <message>
<source>Cannot start docker device from non-main thread</source> <source>Cannot start docker device from non-main thread</source>
<translation type="unfinished"></translation> <translation>Docker-Gerät kann nur vom Haupt-Thread gestartet werden</translation>
</message> </message>
<message> <message>
<source>Device is shut down</source> <source>Device is shut down</source>
<translation type="unfinished"></translation> <translation>Das Gerät ist heruntergefahren</translation>
</message> </message>
<message> <message>
<source>Docker system is not reachable</source> <source>Docker system is not reachable</source>
<translation type="unfinished"></translation> <translation>Docker-System ist nicht erreichbar</translation>
</message> </message>
<message> <message>
<source>Running</source> <source>Running</source>
<translation type="unfinished">Läuft</translation> <translation>Läuft</translation>
</message> </message>
<message> <message>
<source>Docker Image Selection</source> <source>Docker Image Selection</source>
@@ -28505,7 +28506,7 @@ Versuchen Sie, das Projekt neu zu erstellen.</translation>
</message> </message>
<message> <message>
<source>Host directories to mount into the container.</source> <source>Host directories to mount into the container.</source>
<translation>Host-Verzeichnisse die in den Container eingehängt werden sollen.</translation> <translation>Host-Verzeichnisse, die in den Container eingehängt werden sollen.</translation>
</message> </message>
<message> <message>
<source>Maps paths in this list one-to-one to the docker container.</source> <source>Maps paths in this list one-to-one to the docker container.</source>
@@ -28545,7 +28546,7 @@ Versuchen Sie, das Projekt neu zu erstellen.</translation>
</message> </message>
<message> <message>
<source>Failed to start container.</source> <source>Failed to start container.</source>
<translation type="unfinished"></translation> <translation>Container konnte nicht gestartet werden.</translation>
</message> </message>
<message> <message>
<source>Docker daemon appears to be stopped.</source> <source>Docker daemon appears to be stopped.</source>
@@ -28569,11 +28570,11 @@ Versuchen Sie, das Projekt neu zu erstellen.</translation>
</message> </message>
<message> <message>
<source>Container state:</source> <source>Container state:</source>
<translation type="unfinished"></translation> <translation>Container-Status:</translation>
</message> </message>
<message> <message>
<source>Command line:</source> <source>Command line:</source>
<translation type="unfinished">Kommandozeile:</translation> <translation>Kommandozeile:</translation>
</message> </message>
<message> <message>
<source>Daemon state not evaluated.</source> <source>Daemon state not evaluated.</source>
@@ -34167,27 +34168,27 @@ Ablaufdatum: %3</translation>
</message> </message>
<message> <message>
<source>Symbols in Workspace</source> <source>Symbols in Workspace</source>
<translation>Symbole im Arbeitsbereich</translation> <translation>Symbole im Workspace</translation>
</message> </message>
<message> <message>
<source>Locates symbols in the language server workspace.</source> <source>Locates symbols in the language server workspace.</source>
<translation>Findet Symbole im Arbeitsbereich des Language Servers.</translation> <translation>Findet Symbole im Workspace des Language Servers.</translation>
</message> </message>
<message> <message>
<source>Classes and Structs in Workspace</source> <source>Classes and Structs in Workspace</source>
<translation>Klassen und Strukturen im Arbeitsbereich</translation> <translation>Klassen und Strukturen im Workspace</translation>
</message> </message>
<message> <message>
<source>Locates classes and structs in the language server workspace.</source> <source>Locates classes and structs in the language server workspace.</source>
<translation>Findet Klassen und Strukturen im Arbeitsbereich des Language Servers.</translation> <translation>Findet Klassen und Strukturen im Workspace des Language Servers.</translation>
</message> </message>
<message> <message>
<source>Functions and Methods in Workspace</source> <source>Functions and Methods in Workspace</source>
<translation>Funktionen und Methoden im Arbeitsbereich</translation> <translation>Funktionen und Methoden im Workspace</translation>
</message> </message>
<message> <message>
<source>Locates functions and methods in the language server workspace.</source> <source>Locates functions and methods in the language server workspace.</source>
<translation>Findet Funktionen und Methoden im Arbeitsbereich des Language Servers.</translation> <translation>Findet Funktionen und Methoden im Workspace des Language Servers.</translation>
</message> </message>
<message> <message>
<source>Unexpectedly finished. Restarting in %1 seconds.</source> <source>Unexpectedly finished. Restarting in %1 seconds.</source>
@@ -34265,12 +34266,13 @@ Beispiel: *.cpp%1*.h</translation>
</message> </message>
<message> <message>
<source>Workspace Configuration</source> <source>Workspace Configuration</source>
<translation type="unfinished"></translation> <translation>Workspace-Konfiguration</translation>
</message> </message>
<message> <message>
<source>Additional JSON configuration sent to all running language servers for this project. <source>Additional JSON configuration sent to all running language servers for this project.
See the documentation of the specific language server for valid settings.</source> See the documentation of the specific language server for valid settings.</source>
<translation type="unfinished"></translation> <translation>Zusätzliche JSON-Konfiguration, die an alle laufenden Language Server für dieses Projekt gesendet wird.
Für gültige Einstellungen schauen Sie in die Dokumentation des benutzten Language Servers.</translation>
</message> </message>
<message> <message>
<source>&amp;Add</source> <source>&amp;Add</source>
@@ -34310,7 +34312,7 @@ See the documentation of the specific language server for valid settings.</sourc
<message> <message>
<source>failed to initialize</source> <source>failed to initialize</source>
<extracomment>language client state</extracomment> <extracomment>language client state</extracomment>
<translation type="unfinished"></translation> <translation>Initialisierung fehlgeschlagen</translation>
</message> </message>
<message> <message>
<source>initialized</source> <source>initialized</source>
@@ -34380,7 +34382,7 @@ See the documentation of the specific language server for valid settings.</sourc
</message> </message>
<message> <message>
<source>Language Server</source> <source>Language Server</source>
<translation type="unfinished">Language Server</translation> <translation>Language Server</translation>
</message> </message>
<message> <message>
<source>Generic StdIO Language Server</source> <source>Generic StdIO Language Server</source>
@@ -34536,15 +34538,15 @@ See the documentation of the specific language server for valid settings.</sourc
</message> </message>
<message> <message>
<source>Create %1</source> <source>Create %1</source>
<translation type="unfinished"></translation> <translation>Erstelle %1</translation>
</message> </message>
<message> <message>
<source>Rename %1 to %2</source> <source>Rename %1 to %2</source>
<translation type="unfinished"></translation> <translation>%1 in %2 umbenennen</translation>
</message> </message>
<message> <message>
<source>Delete %1</source> <source>Delete %1</source>
<translation type="unfinished"></translation> <translation>%1 löschen</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -43036,19 +43038,19 @@ fails because Clang does not understand the target architecture.</source>
</message> </message>
<message> <message>
<source>Select PySide Version</source> <source>Select PySide Version</source>
<translation type="unfinished"></translation> <translation>PySide-Version auswählen</translation>
</message> </message>
<message> <message>
<source>Select which PySide version to install:</source> <source>Select which PySide version to install:</source>
<translation type="unfinished"></translation> <translation>Wählen Sie die zu installierende PySide-Version aus:</translation>
</message> </message>
<message> <message>
<source>Latest PySide from the Python Package Index</source> <source>Latest PySide from the Python Package Index</source>
<translation type="unfinished"></translation> <translation>Letzte PySide-Version aus dem Python-Paketindex</translation>
</message> </message>
<message> <message>
<source>PySide %1 Wheel (%2)</source> <source>PySide %1 Wheel (%2)</source>
<translation type="unfinished"></translation> <translation>PySide %1 Wheel (%2)</translation>
</message> </message>
<message> <message>
<source>%1 installation missing for %2 (%3)</source> <source>%1 installation missing for %2 (%3)</source>
@@ -43180,7 +43182,7 @@ fails because Clang does not understand the target architecture.</source>
</message> </message>
<message> <message>
<source>Issues parsed from Python runtime output.</source> <source>Issues parsed from Python runtime output.</source>
<translation type="unfinished"></translation> <translation>Probleme, die in der Laufzeitausgabe von Python gefunden wurden.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -43998,11 +44000,11 @@ Die betroffenen Dateien sind:
</message> </message>
<message> <message>
<source>File does not exist.</source> <source>File does not exist.</source>
<translation type="unfinished">Datei existiert nicht.</translation> <translation>Datei existiert nicht.</translation>
</message> </message>
<message> <message>
<source>File does not match filter.</source> <source>File does not match filter.</source>
<translation type="unfinished"></translation> <translation>Datei entspricht nicht dem Filter.</translation>
</message> </message>
<message> <message>
<source>Library Type</source> <source>Library Type</source>
@@ -44132,7 +44134,7 @@ Weder der Pfad zur Bibliothek noch der Pfad zu den Headerdateien wird zur .pro-D
</message> </message>
<message> <message>
<source>Could not load kits in a reasonable amount of time.</source> <source>Could not load kits in a reasonable amount of time.</source>
<translation type="unfinished"></translation> <translation>Kits konnten nicht in angemessener Zeit geladen werden.</translation>
</message> </message>
<message> <message>
<source>The application &quot;%1&quot; could not be found.</source> <source>The application &quot;%1&quot; could not be found.</source>
@@ -48453,7 +48455,7 @@ Der Kontrollprozess konnte nicht gestartet werden.</translation>
</message> </message>
<message> <message>
<source>Error</source> <source>Error</source>
<translation type="unfinished">Fehler</translation> <translation>Fehler</translation>
</message> </message>
<message> <message>
<source>Failed: %1</source> <source>Failed: %1</source>
@@ -48587,27 +48589,27 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e
</message> </message>
<message> <message>
<source>Flags for rsync:</source> <source>Flags for rsync:</source>
<translation type="unfinished"></translation> <translation>Optionen für rsync:</translation>
</message> </message>
<message> <message>
<source>Transfer method:</source> <source>Transfer method:</source>
<translation type="unfinished"></translation> <translation>Übertragungsmethode:</translation>
</message> </message>
<message> <message>
<source>Use rsync if available. Otherwise use default transfer.</source> <source>Use rsync if available. Otherwise use default transfer.</source>
<translation type="unfinished"></translation> <translation>Benutze rsync, sofern verfügbar. Sonst Standardmethode verwenden.</translation>
</message> </message>
<message> <message>
<source>Use sftp if available. Otherwise use default transfer.</source> <source>Use sftp if available. Otherwise use default transfer.</source>
<translation type="unfinished"></translation> <translation>Benutze SFTP, sofern verfügbar. Sonst Standardmethode verwenden.</translation>
</message> </message>
<message> <message>
<source>Use default transfer. This might be slow.</source> <source>Use default transfer. This might be slow.</source>
<translation type="unfinished"></translation> <translation>Benutze Standardmethode. Dies könnte langsam sein.</translation>
</message> </message>
<message> <message>
<source>Unknown error occurred while trying to create remote directories</source> <source>Unknown error occurred while trying to create remote directories</source>
<translation type="unfinished"></translation> <translation>Beim Erstellen von entfernten Verzeichnissen ist ein unbekannter Fehler aufgetreten</translation>
</message> </message>
<message> <message>
<source>rsync failed to start: %1</source> <source>rsync failed to start: %1</source>
@@ -48623,7 +48625,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e
</message> </message>
<message> <message>
<source>Deploy files</source> <source>Deploy files</source>
<translation type="unfinished"></translation> <translation>Datei-Deployment</translation>
</message> </message>
<message> <message>
<source>Ignore missing files:</source> <source>Ignore missing files:</source>
@@ -55633,19 +55635,19 @@ in &quot;%2&quot; aus.
</message> </message>
<message> <message>
<source>Parsing canceled.</source> <source>Parsing canceled.</source>
<translation type="unfinished"></translation> <translation>Die Auswertung wurde abgebrochen.</translation>
</message> </message>
<message> <message>
<source>Premature end of XML document.</source> <source>Premature end of XML document.</source>
<translation type="unfinished"></translation> <translation>Vorzeitiges Ende des XML-Dokuments.</translation>
</message> </message>
<message> <message>
<source>Could not parse hex number from &quot;%1&quot; (%2).</source> <source>Could not parse hex number from &quot;%1&quot; (%2).</source>
<translation type="unfinished"></translation> <translation>&quot;%1&quot; konnte nicht als Hexadezimalzahl ausgewertet werden (%2).</translation>
</message> </message>
<message> <message>
<source>Trying to read element text although current position is not start of element.</source> <source>Trying to read element text although current position is not start of element.</source>
<translation type="unfinished"></translation> <translation>Es wurde versucht, Elementtext zu lesen, obwohl die aktuelle Position nicht am Beginn eines Elements ist.</translation>
</message> </message>
<message> <message>
<source>Unexpected child element while reading element text</source> <source>Unexpected child element while reading element text</source>
@@ -55669,7 +55671,7 @@ in &quot;%2&quot; aus.
</message> </message>
<message> <message>
<source>Unknown %1 kind &quot;%2&quot;</source> <source>Unknown %1 kind &quot;%2&quot;</source>
<translation type="unfinished"></translation> <translation>Kein &quot;%2&quot; in Enum %1 gefunden</translation>
</message> </message>
<message> <message>
<source>Could not parse error kind, tool not yet set.</source> <source>Could not parse error kind, tool not yet set.</source>
@@ -55805,7 +55807,7 @@ in &quot;%2&quot; aus.
</message> </message>
<message> <message>
<source>Valgrind arguments:</source> <source>Valgrind arguments:</source>
<translation>Valgrind-Argumente</translation> <translation>Valgrind-Argumente:</translation>
</message> </message>
<message> <message>
<source>Enable cache simulation</source> <source>Enable cache simulation</source>

View File

@@ -2701,10 +2701,7 @@ TimeoutTaskAdapter::~TimeoutTaskAdapter()
void TimeoutTaskAdapter::start() void TimeoutTaskAdapter::start()
{ {
if (*task() == milliseconds::zero()) m_timerId = scheduleTimeout(*task(), this, [this] { m_timerId = {}; emit done(true); });
QTimer::singleShot(0, this, [this] { emit done(true); });
else
m_timerId = scheduleTimeout(*task(), this, [this] { m_timerId = {}; emit done(true); });
} }
} // namespace Tasking } // namespace Tasking

View File

@@ -84,6 +84,7 @@ public:
bool m_enabled = true; bool m_enabled = true;
bool m_readOnly = false; bool m_readOnly = false;
bool m_autoApply = true; bool m_autoApply = true;
bool m_hasEnabler = false;
int m_spanX = 1; int m_spanX = 1;
int m_spanY = 1; int m_spanY = 1;
BaseAspect::ConfigWidgetCreator m_configWidgetCreator; BaseAspect::ConfigWidgetCreator m_configWidgetCreator;
@@ -348,6 +349,8 @@ void BaseAspect::setEnabler(BoolAspect *checker)
{ {
QTC_ASSERT(checker, return); QTC_ASSERT(checker, return);
d->m_hasEnabler = true;
auto update = [this, checker] { auto update = [this, checker] {
BaseAspect::setEnabled(checker->isEnabled() && checker->volatileValue()); BaseAspect::setEnabled(checker->isEnabled() && checker->volatileValue());
}; };
@@ -647,6 +650,10 @@ void BaseAspect::readSettings()
if (settingsKey().isEmpty()) if (settingsKey().isEmpty())
return; return;
QTC_ASSERT(theSettings, return); QTC_ASSERT(theSettings, return);
// The enabler needs to be set up after reading the settings, otherwise
// changes from reading the settings will not update the enabled state
// because the updates are "quiet".
QTC_CHECK(!d->m_hasEnabler);
const QVariant val = theSettings->value(settingsKey()); const QVariant val = theSettings->value(settingsKey());
setVariantValue(val.isValid() ? fromSettingsValue(val) : defaultVariantValue(), BeQuiet); setVariantValue(val.isValid() ? fromSettingsValue(val) : defaultVariantValue(), BeQuiet);
} }
@@ -1795,8 +1802,6 @@ LayoutItem BoolAspect::adoptButton(QAbstractButton *button)
*/ */
void BoolAspect::addToLayout(Layouting::LayoutItem &parent) void BoolAspect::addToLayout(Layouting::LayoutItem &parent)
{ {
QTC_ASSERT(m_buffer == m_internal, m_buffer = m_internal);
QCheckBox *checkBox = createSubWidget<QCheckBox>(); QCheckBox *checkBox = createSubWidget<QCheckBox>();
addToLayoutHelper(parent, checkBox); addToLayoutHelper(parent, checkBox);
bufferToGui(); bufferToGui();
@@ -1904,7 +1909,6 @@ void SelectionAspect::addToLayout(Layouting::LayoutItem &parent)
QTC_CHECK(d->m_buttonGroup == nullptr); QTC_CHECK(d->m_buttonGroup == nullptr);
QTC_CHECK(!d->m_comboBox); QTC_CHECK(!d->m_comboBox);
QTC_ASSERT(d->m_buttons.isEmpty(), d->m_buttons.clear()); QTC_ASSERT(d->m_buttons.isEmpty(), d->m_buttons.clear());
QTC_ASSERT(m_buffer == m_internal, m_buffer = m_internal);
switch (d->m_displayStyle) { switch (d->m_displayStyle) {
case DisplayStyle::RadioButtons: case DisplayStyle::RadioButtons:

View File

@@ -60,9 +60,11 @@ static QMessageBox::StandardButton exec(
if (text.contains("<a ")) if (text.contains("<a "))
msgBox.setOptions(QMessageBox::Option::DontUseNativeDialog); msgBox.setOptions(QMessageBox::Option::DontUseNativeDialog);
// Workaround for QTBUG-118241 // Workaround for QTBUG-118241, fixed in Qt 6.6.1
#if QT_VERSION < QT_VERSION_CHECK(6, 6, 1)
if (!buttonTextOverrides.isEmpty()) if (!buttonTextOverrides.isEmpty())
msgBox.setOptions(QMessageBox::Option::DontUseNativeDialog); msgBox.setOptions(QMessageBox::Option::DontUseNativeDialog);
#endif // QT_VERSION < QT_VERSION_CHECK(6, 6, 1)
} }
#endif #endif

View File

@@ -1256,7 +1256,8 @@ bool UnixDeviceFileAccess::iterateWithFind(const FilePath &filePath,
void UnixDeviceFileAccess::findUsingLs(const QString &current, void UnixDeviceFileAccess::findUsingLs(const QString &current,
const FileFilter &filter, const FileFilter &filter,
QStringList *found) const QStringList *found,
const QString &start) const
{ {
const RunResult result = runInShell( const RunResult result = runInShell(
{"ls", {"-1", "-a", "-p", "--", current}, OsType::OsTypeLinux}); {"ls", {"-1", "-a", "-p", "--", current}, OsType::OsTypeLinux});
@@ -1265,10 +1266,11 @@ void UnixDeviceFileAccess::findUsingLs(const QString &current,
const QChar last = entry.back(); const QChar last = entry.back();
if (last == '/') { if (last == '/') {
entry.chop(1); entry.chop(1);
if (filter.iteratorFlags.testFlag(QDirIterator::Subdirectories)) if (filter.iteratorFlags.testFlag(QDirIterator::Subdirectories) && entry != "."
findUsingLs(current + '/' + entry, filter, found); && entry != "..")
findUsingLs(current + '/' + entry, filter, found, start + entry + "/");
} }
found->append(entry); found->append(start + entry);
} }
} }
@@ -1327,7 +1329,7 @@ void UnixDeviceFileAccess::iterateDirectory(const FilePath &filePath,
// if we do not have find - use ls as fallback // if we do not have find - use ls as fallback
QStringList entries; QStringList entries;
findUsingLs(filePath.path(), filter, &entries); findUsingLs(filePath.path(), filter, &entries, {});
iterateLsOutput(filePath, entries, filter, callBack); iterateLsOutput(filePath, entries, filter, callBack);
} }

View File

@@ -183,16 +183,15 @@ protected:
expected_str<FilePath> createTempFile(const FilePath &filePath) override; expected_str<FilePath> createTempFile(const FilePath &filePath) override;
void findUsingLs(const QString &current,
const FileFilter &filter,
QStringList *found,
const QString &start) const;
private: private:
bool iterateWithFind( bool iterateWithFind(const FilePath &filePath,
const FilePath &filePath, const FileFilter &filter,
const FileFilter &filter, const FilePath::IterateDirCallback &callBack) const;
const FilePath::IterateDirCallback &callBack) const;
void findUsingLs(
const QString &current,
const FileFilter &filter,
QStringList *found) const;
QStringList statArgs(const FilePath &filePath, QStringList statArgs(const FilePath &filePath,
const QString &linuxFormat, const QString &linuxFormat,

View File

@@ -8,7 +8,11 @@
#include "terminalcommand.h" #include "terminalcommand.h"
#include "utilstr.h" #include "utilstr.h"
#include <QLoggingCategory>
#include <QTemporaryFile> #include <QTemporaryFile>
#include <QVersionNumber>
Q_LOGGING_CATEGORY(log, "terminal.externalprocess", QtWarningMsg)
namespace Utils { namespace Utils {
@@ -17,22 +21,62 @@ ExternalTerminalProcessImpl::ExternalTerminalProcessImpl()
setStubCreator(new ProcessStubCreator(this)); setStubCreator(new ProcessStubCreator(this));
} }
QString ExternalTerminalProcessImpl::openTerminalScriptAttached()
{
static const QLatin1String script{R"(
tell application "Terminal"
activate
set windowId to 0
set newTab to do script "%1 && exit"
-- Try to get window id
try
-- We have seen this work on macOS 13, and 12.5.1, but not on 14.0 or 14.1
set windowId to (the id of window 1 where its tab 1 = newTab) as text
on error eMsg number eNum
-- If we get an error we try to generate a known error that will contain the window id in its message
try
set windowId to window of newTab
on error eMsg number eNum
if eNum = -1728 then
try
-- Search for "window id " in the error message, examples of error messages are:
-- Terminal hat einen Fehler erhalten: window of tab 1 of window id 4018 kann nicht gelesen werden.
-- Terminal got an error: Can't get window of tab 1 of window id 4707.
set windowIdPrefix to "window id "
set theOffset to (offset of windowIdPrefix in eMsg)
if theOffset = 0 then
log "Failed to parse window id from error message: " & eMsg
else
set windowIdPosition to theOffset + (length of windowIdPrefix)
set windowId to (first word of (text windowIdPosition thru -1 of eMsg)) as integer
end if
on error eMsg2 number eNum2
log "Failed to parse window id from error message: " & eMsg2 & " (" & eMsg & ") " & theOffset
end try
end if
end try
end try
repeat until ((count of processes of newTab) = 0)
delay 0.1
end repeat
if windowId is not equal to 0 then
close window id windowId
else
log "Cannot close window, sorry."
end if
end tell
)"};
return script;
}
ProcessStubCreator::ProcessStubCreator(TerminalInterface *interface) ProcessStubCreator::ProcessStubCreator(TerminalInterface *interface)
: m_interface(interface) : m_interface(interface)
{} {}
static const QLatin1String TerminalAppScriptAttached{R"(
tell application "Terminal"
activate
set newTab to do script "%1 && exit"
set win to (the id of window 1 where its tab 1 = newTab) as text
repeat until ((count of processes of newTab) = 0)
delay 0.1
end repeat
close window id win
end tell
)"};
static const QLatin1String TerminalAppScriptDetached{R"( static const QLatin1String TerminalAppScriptDetached{R"(
tell application "Terminal" tell application "Terminal"
activate activate
@@ -52,8 +96,15 @@ expected_str<qint64> ProcessStubCreator::startStubProcess(const ProcessSetupData
bool detached = setupData.m_terminalMode == TerminalMode::Detached; bool detached = setupData.m_terminalMode == TerminalMode::Detached;
if (HostOsInfo::isMacHost()) { if (HostOsInfo::isMacHost()) {
// There is a bug in macOS 14.0 where the script fails if it tries to find
// the window id. We will have to check in future versions of macOS if they fixed
// the issue.
static const QVersionNumber osVersionNumber = QVersionNumber::fromString(
QSysInfo::productVersion());
static const QMap<QString, AppScript> terminalMap = { static const QMap<QString, AppScript> terminalMap = {
{"Terminal.app", {TerminalAppScriptAttached, TerminalAppScriptDetached}}, {"Terminal.app",
{ExternalTerminalProcessImpl::openTerminalScriptAttached(), TerminalAppScriptDetached}},
}; };
if (terminalMap.contains(terminal.command.toString())) { if (terminalMap.contains(terminal.command.toString())) {
@@ -101,6 +152,17 @@ expected_str<qint64> ProcessStubCreator::startStubProcess(const ProcessSetupData
Tr::tr("Failed to start terminal process: \"%1\".").arg(process->errorString())); Tr::tr("Failed to start terminal process: \"%1\".").arg(process->errorString()));
} }
QObject::connect(process, &Process::readyReadStandardOutput, process, [process] {
const QString output = process->readAllStandardOutput();
if (!output.isEmpty())
qCWarning(log).noquote() << output;
});
QObject::connect(process, &Process::readyReadStandardError, process, [process] {
const QString output = process->readAllStandardError();
if (!output.isEmpty())
qCCritical(log).noquote() << output;
});
QObject::connect(process, &Process::done, m_interface, &TerminalInterface::onStubExited); QObject::connect(process, &Process::done, m_interface, &TerminalInterface::onStubExited);
return 0; return 0;

View File

@@ -13,6 +13,8 @@ class QTCREATOR_UTILS_EXPORT ExternalTerminalProcessImpl final : public Terminal
{ {
public: public:
ExternalTerminalProcessImpl(); ExternalTerminalProcessImpl();
static QString openTerminalScriptAttached();
}; };
class QTCREATOR_UTILS_EXPORT ProcessStubCreator : public StubCreator class QTCREATOR_UTILS_EXPORT ProcessStubCreator : public StubCreator

View File

@@ -92,6 +92,7 @@ public:
StubCreator *stubCreator{nullptr}; StubCreator *stubCreator{nullptr};
const bool waitOnExit; const bool waitOnExit;
bool didInferiorRun{false};
}; };
TerminalInterface::TerminalInterface(bool waitOnExit) TerminalInterface::TerminalInterface(bool waitOnExit)
@@ -156,6 +157,11 @@ void TerminalInterface::onStubExited()
if (d->inferiorProcessId) if (d->inferiorProcessId)
emitFinished(-1, QProcess::CrashExit); emitFinished(-1, QProcess::CrashExit);
else if (!d->didInferiorRun) {
emitError(QProcess::FailedToStart,
Tr::tr("Failed to start terminal process. The stub exited before the inferior "
"was started."));
}
} }
void TerminalInterface::onStubReadyRead() void TerminalInterface::onStubReadyRead()
@@ -176,6 +182,7 @@ void TerminalInterface::onStubReadyRead()
d->envListFile = nullptr; d->envListFile = nullptr;
} else if (out.startsWith("pid ")) { } else if (out.startsWith("pid ")) {
d->inferiorProcessId = out.mid(4).toInt(); d->inferiorProcessId = out.mid(4).toInt();
d->didInferiorRun = true;
emit started(d->inferiorProcessId, d->inferiorThreadId); emit started(d->inferiorProcessId, d->inferiorThreadId);
} else if (out.startsWith("thread ")) { // Windows only } else if (out.startsWith("thread ")) { // Windows only
d->inferiorThreadId = out.mid(7).toLongLong(); d->inferiorThreadId = out.mid(7).toLongLong();
@@ -349,8 +356,9 @@ void TerminalInterface::start()
return; return;
} }
QTextStream stream(d->envListFile.get()); QTextStream stream(d->envListFile.get());
finalEnv.forEachEntry([&stream](const QString &key, const QString &value, bool) { finalEnv.forEachEntry([&stream](const QString &key, const QString &value, bool enabled) {
stream << key << '=' << value << '\0'; if (enabled)
stream << key << '=' << value << '\0';
}); });
if (d->envListFile->error() != QFile::NoError) { if (d->envListFile->error() != QFile::NoError) {

View File

@@ -136,7 +136,6 @@ AutotestPluginPrivate::AutotestPluginPrivate()
TestFrameworkManager::registerTestFramework(&theCatchFramework()); TestFrameworkManager::registerTestFramework(&theCatchFramework());
TestFrameworkManager::registerTestTool(&theCTestTool()); TestFrameworkManager::registerTestTool(&theCTestTool());
TestFrameworkManager::synchronizeSettings();
m_resultsPane = TestResultsPane::instance(); m_resultsPane = TestResultsPane::instance();

View File

@@ -74,7 +74,6 @@ BoostTestFramework::BoostTestFramework()
seed.setLabelText(Tr::tr("Seed:")); seed.setLabelText(Tr::tr("Seed:"));
seed.setToolTip(Tr::tr("A seed of 0 means no randomization. A value of 1 uses the current " seed.setToolTip(Tr::tr("A seed of 0 means no randomization. A value of 1 uses the current "
"time, any other value is used as random seed generator.")); "time, any other value is used as random seed generator."));
seed.setEnabler(&randomize);
randomize.setSettingsKey("Randomize"); randomize.setSettingsKey("Randomize");
randomize.setLabelPlacement(BoolAspect::LabelPlacement::Compact); randomize.setLabelPlacement(BoolAspect::LabelPlacement::Compact);
@@ -96,6 +95,10 @@ BoostTestFramework::BoostTestFramework()
memLeaks.setDefaultValue(true); memLeaks.setDefaultValue(true);
memLeaks.setLabelText(Tr::tr("Detect memory leaks")); memLeaks.setLabelText(Tr::tr("Detect memory leaks"));
memLeaks.setToolTip(Tr::tr("Enable memory leak detection.")); memLeaks.setToolTip(Tr::tr("Enable memory leak detection."));
readSettings();
seed.setEnabler(&randomize);
} }
QString BoostTestFramework::logLevelToOption(const LogLevel logLevel) QString BoostTestFramework::logLevelToOption(const LogLevel logLevel)

View File

@@ -49,29 +49,24 @@ CatchFramework::CatchFramework()
abortAfter.setSettingsKey("AbortAfter"); abortAfter.setSettingsKey("AbortAfter");
abortAfter.setRange(1, 9999); abortAfter.setRange(1, 9999);
abortAfter.setEnabler(&abortAfterChecked);
benchmarkSamples.setSettingsKey("BenchSamples"); benchmarkSamples.setSettingsKey("BenchSamples");
benchmarkSamples.setRange(1, 999999); benchmarkSamples.setRange(1, 999999);
benchmarkSamples.setDefaultValue(100); benchmarkSamples.setDefaultValue(100);
benchmarkSamples.setEnabler(&samplesChecked);
benchmarkResamples.setSettingsKey("BenchResamples"); benchmarkResamples.setSettingsKey("BenchResamples");
benchmarkResamples.setRange(1, 9999999); benchmarkResamples.setRange(1, 9999999);
benchmarkResamples.setDefaultValue(100000); benchmarkResamples.setDefaultValue(100000);
benchmarkResamples.setToolTip(Tr::tr("Number of resamples for bootstrapping.")); benchmarkResamples.setToolTip(Tr::tr("Number of resamples for bootstrapping."));
benchmarkResamples.setEnabler(&resamplesChecked);
confidenceInterval.setSettingsKey("BenchConfInt"); confidenceInterval.setSettingsKey("BenchConfInt");
confidenceInterval.setRange(0., 1.); confidenceInterval.setRange(0., 1.);
confidenceInterval.setSingleStep(0.05); confidenceInterval.setSingleStep(0.05);
confidenceInterval.setDefaultValue(0.95); confidenceInterval.setDefaultValue(0.95);
confidenceInterval.setEnabler(&confidenceIntervalChecked);
benchmarkWarmupTime.setSettingsKey("BenchWarmup"); benchmarkWarmupTime.setSettingsKey("BenchWarmup");
benchmarkWarmupTime.setSuffix(Tr::tr(" ms")); benchmarkWarmupTime.setSuffix(Tr::tr(" ms"));
benchmarkWarmupTime.setRange(0, 10000); benchmarkWarmupTime.setRange(0, 10000);
benchmarkWarmupTime.setEnabler(&warmupChecked);
abortAfterChecked.setSettingsKey("AbortChecked"); abortAfterChecked.setSettingsKey("AbortChecked");
abortAfterChecked.setLabelText(Tr::tr("Abort after")); abortAfterChecked.setLabelText(Tr::tr("Abort after"));
@@ -117,6 +112,14 @@ CatchFramework::CatchFramework()
warnOnEmpty.setSettingsKey("WarnEmpty"); warnOnEmpty.setSettingsKey("WarnEmpty");
warnOnEmpty.setLabelText(Tr::tr("Warn on empty tests")); warnOnEmpty.setLabelText(Tr::tr("Warn on empty tests"));
warnOnEmpty.setToolTip(Tr::tr("Warns if a test section does not check any assertion.")); warnOnEmpty.setToolTip(Tr::tr("Warns if a test section does not check any assertion."));
readSettings();
benchmarkWarmupTime.setEnabler(&warmupChecked);
confidenceInterval.setEnabler(&confidenceIntervalChecked);
benchmarkResamples.setEnabler(&resamplesChecked);
benchmarkSamples.setEnabler(&samplesChecked);
abortAfter.setEnabler(&abortAfterChecked);
} }
ITestParser *CatchFramework::createTestParser() ITestParser *CatchFramework::createTestParser()

View File

@@ -108,6 +108,9 @@ CTestTool::CTestTool()
threshold.setLabelText(Tr::tr("Threshold")); threshold.setLabelText(Tr::tr("Threshold"));
threshold.setDefaultValue(1); threshold.setDefaultValue(1);
threshold.setRange(1, 128); threshold.setRange(1, 128);
readSettings();
threshold.setEnabler(&testLoad); threshold.setEnabler(&testLoad);
} }

View File

@@ -52,7 +52,6 @@ GTestFramework::GTestFramework()
iterations.setDefaultValue(1); iterations.setDefaultValue(1);
iterations.setEnabled(false); iterations.setEnabled(false);
iterations.setLabelText(Tr::tr("Iterations:")); iterations.setLabelText(Tr::tr("Iterations:"));
iterations.setEnabler(&repeat);
seed.setSettingsKey("Seed"); seed.setSettingsKey("Seed");
seed.setSpecialValueText({}); seed.setSpecialValueText({});
@@ -60,7 +59,6 @@ GTestFramework::GTestFramework()
seed.setEnabled(false); seed.setEnabled(false);
seed.setLabelText(Tr::tr("Seed:")); seed.setLabelText(Tr::tr("Seed:"));
seed.setToolTip(Tr::tr("A seed of 0 generates a seed based on the current timestamp.")); seed.setToolTip(Tr::tr("A seed of 0 generates a seed based on the current timestamp."));
seed.setEnabler(&shuffle);
runDisabled.setSettingsKey("RunDisabled"); runDisabled.setSettingsKey("RunDisabled");
runDisabled.setLabelText(Tr::tr("Run disabled tests")); runDisabled.setLabelText(Tr::tr("Run disabled tests"));
@@ -95,14 +93,14 @@ GTestFramework::GTestFramework()
// avoid problems if user messes around with the settings file // avoid problems if user messes around with the settings file
bool ok = false; bool ok = false;
const int tmp = savedValue.toInt(&ok); const int tmp = savedValue.toInt(&ok);
return ok ? groupMode.indexForItemValue(tmp) : GTest::Constants::Directory; return groupMode.indexForItemValue(ok ? tmp : GTest::Constants::Directory);
}); });
groupMode.setToSettingsTransformation([this](const QVariant &value) { groupMode.setToSettingsTransformation([this](const QVariant &value) {
return groupMode.itemValueForIndex(value.toInt()); return groupMode.itemValueForIndex(value.toInt());
}); });
groupMode.addOption({Tr::tr("Directory"), {}, GTest::Constants::Directory}); groupMode.addOption({Tr::tr("Directory"), {}, GTest::Constants::Directory});
groupMode.addOption({Tr::tr("GTest Filter"), {}, GTest::Constants::GTestFilter}); groupMode.addOption({Tr::tr("GTest Filter"), {}, GTest::Constants::GTestFilter});
groupMode.setDefaultValue(GTest::Constants::Directory); groupMode.setDefaultValue(groupMode.indexForItemValue(GTest::Constants::Directory));
groupMode.setLabelText(Tr::tr("Group mode:")); groupMode.setLabelText(Tr::tr("Group mode:"));
groupMode.setToolTip(Tr::tr("Select on what grouping the tests should be based.")); groupMode.setToolTip(Tr::tr("Select on what grouping the tests should be based."));
@@ -132,6 +130,11 @@ GTestFramework::GTestFramework()
connect(this, &AspectContainer::applied, this, [] { connect(this, &AspectContainer::applied, this, [] {
TestTreeModel::instance()->rebuild({GTest::Constants::FRAMEWORK_ID}); TestTreeModel::instance()->rebuild({GTest::Constants::FRAMEWORK_ID});
}); });
readSettings();
seed.setEnabler(&shuffle);
iterations.setEnabler(&repeat);
} }
ITestParser *GTestFramework::createTestParser() ITestParser *GTestFramework::createTestParser()
@@ -144,6 +147,12 @@ ITestTreeItem *GTestFramework::createRootNode()
return new GTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); return new GTestTreeItem(this, displayName(), {}, ITestTreeItem::Root);
} }
void GTestFramework::readSettings()
{
Utils::AspectContainer::readSettings();
gtestFilter.setEnabled(groupMode.itemValue() == GTest::Constants::GTestFilter);
}
QString GTestFramework::currentGTestFilter() QString GTestFramework::currentGTestFilter()
{ {
return theGTestFramework().gtestFilter(); return theGTestFramework().gtestFilter();

View File

@@ -32,6 +32,8 @@ public:
QString groupingToolTip() const override; QString groupingToolTip() const override;
ITestParser *createTestParser() override; ITestParser *createTestParser() override;
ITestTreeItem *createRootNode() override; ITestTreeItem *createRootNode() override;
void readSettings() final;
}; };
GTestFramework &theGTestFramework(); GTestFramework &theGTestFramework();

View File

@@ -92,7 +92,6 @@ QtTestFramework::QtTestFramework()
maxWarnings.setRange(0, 10000); maxWarnings.setRange(0, 10000);
maxWarnings.setDefaultValue(2000); maxWarnings.setDefaultValue(2000);
maxWarnings.setSpecialValueText(Tr::tr("Unlimited")); maxWarnings.setSpecialValueText(Tr::tr("Unlimited"));
maxWarnings.setEnabler(&limitWarnings);
quickCheckForDerivedTests.setSettingsKey("QuickCheckForDerivedTests"); quickCheckForDerivedTests.setSettingsKey("QuickCheckForDerivedTests");
quickCheckForDerivedTests.setDefaultValue(false); quickCheckForDerivedTests.setDefaultValue(false);
@@ -100,6 +99,10 @@ QtTestFramework::QtTestFramework()
quickCheckForDerivedTests.setToolTip( quickCheckForDerivedTests.setToolTip(
Tr::tr("Search for Qt Quick tests that are derived from TestCase.\nWarning: Enabling this " Tr::tr("Search for Qt Quick tests that are derived from TestCase.\nWarning: Enabling this "
"feature significantly increases scan time.")); "feature significantly increases scan time."));
readSettings();
maxWarnings.setEnabler(&limitWarnings);
} }
QString QtTestFramework::metricsTypeToOption(const MetricsType type) QString QtTestFramework::metricsTypeToOption(const MetricsType type)

View File

@@ -86,14 +86,4 @@ ITestTool *testToolForBuildSystemId(Id buildSystemId)
}); });
} }
void synchronizeSettings()
{
Internal::testSettings().fromSettings();
for (ITestFramework *framework : std::as_const(testFrameworks()))
framework->readSettings();
for (ITestTool *testTool : std::as_const(testTools()))
testTool->readSettings();
}
} // Autotest::TestframeworkManager } // Autotest::TestframeworkManager

View File

@@ -9,7 +9,6 @@ namespace Autotest::TestFrameworkManager {
void registerTestFramework(ITestFramework *framework); void registerTestFramework(ITestFramework *framework);
void registerTestTool(ITestTool *testTool); void registerTestTool(ITestTool *testTool);
void synchronizeSettings();
ITestFramework *frameworkForId(Utils::Id frameworkId); ITestFramework *frameworkForId(Utils::Id frameworkId);
ITestTool *testToolForId(Utils::Id testToolId); ITestTool *testToolForId(Utils::Id testToolId);

View File

@@ -64,7 +64,6 @@ TestSettings::TestSettings()
resultDescriptionMaxSize.setSettingsKey("ResultDescriptionMaxSize"); resultDescriptionMaxSize.setSettingsKey("ResultDescriptionMaxSize");
resultDescriptionMaxSize.setDefaultValue(10); resultDescriptionMaxSize.setDefaultValue(10);
resultDescriptionMaxSize.setRange(1, 100000); resultDescriptionMaxSize.setRange(1, 100000);
resultDescriptionMaxSize.setEnabler(&limitResultDescription);
autoScroll.setSettingsKey("AutoScrollResults"); autoScroll.setSettingsKey("AutoScrollResults");
autoScroll.setDefaultValue(true); autoScroll.setDefaultValue(true);
@@ -95,7 +94,6 @@ TestSettings::TestSettings()
popupOnFail.setSettingsKey("PopupOnFail"); popupOnFail.setSettingsKey("PopupOnFail");
popupOnFail.setLabelText(Tr::tr("Only for unsuccessful test runs")); popupOnFail.setLabelText(Tr::tr("Only for unsuccessful test runs"));
popupOnFail.setEnabler(&popupOnFinish);
popupOnFail.setToolTip(Tr::tr("Displays test results only if the test run contains " popupOnFail.setToolTip(Tr::tr("Displays test results only if the test run contains "
"failed, fatal or unexpectedly passed tests.")); "failed, fatal or unexpectedly passed tests."));
@@ -105,6 +103,11 @@ TestSettings::TestSettings()
runAfterBuild.addOption(Tr::tr("None")); runAfterBuild.addOption(Tr::tr("None"));
runAfterBuild.addOption(Tr::tr("All")); runAfterBuild.addOption(Tr::tr("All"));
runAfterBuild.addOption(Tr::tr("Selected")); runAfterBuild.addOption(Tr::tr("Selected"));
fromSettings();
resultDescriptionMaxSize.setEnabler(&limitResultDescription);
popupOnFail.setEnabler(&popupOnFinish);
} }
void TestSettings::toSettings() const void TestSettings::toSettings() const

View File

@@ -773,6 +773,9 @@ void CMakeBuildStep::updateDeploymentData()
IDeviceConstPtr runDevice = DeviceKitAspect::device(buildSystem()->kit()); IDeviceConstPtr runDevice = DeviceKitAspect::device(buildSystem()->kit());
if (!runDevice)
return;
const auto appFileNames = transform<QSet<QString>>(buildSystem()->applicationTargets(), const auto appFileNames = transform<QSet<QString>>(buildSystem()->applicationTargets(),
[](const BuildTargetInfo &appTarget) { return appTarget.targetFilePath.fileName(); }); [](const BuildTargetInfo &appTarget) { return appTarget.targetFilePath.fileName(); });

View File

@@ -1004,6 +1004,30 @@ void CMakeBuildSystem::updateProjectData()
QtSupport::CppKitInfo kitInfo(kit()); QtSupport::CppKitInfo kitInfo(kit());
QTC_ASSERT(kitInfo.isValid(), return ); QTC_ASSERT(kitInfo.isValid(), return );
struct QtMajorToPkgNames
{
QtMajorVersion major = QtMajorVersion::None;
QStringList pkgNames;
};
auto qtVersionFromCMake = [this](const QList<QtMajorToPkgNames> &mapping) {
for (const QtMajorToPkgNames &m : mapping) {
for (const QString &pkgName : m.pkgNames) {
auto qt = m_findPackagesFilesHash.value(pkgName);
if (qt.hasValidTarget())
return m.major;
}
}
return QtMajorVersion::None;
};
QtMajorVersion qtVersion = kitInfo.projectPartQtVersion;
if (qtVersion == QtMajorVersion::None)
qtVersion = qtVersionFromCMake({{QtMajorVersion::Qt6, {"Qt6", "Qt6Core"}},
{QtMajorVersion::Qt5, {"Qt5", "Qt5Core"}},
{QtMajorVersion::Qt4, {"Qt4", "Qt4Core"}}
});
QString errorMessage; QString errorMessage;
RawProjectParts rpps = m_reader.createRawProjectParts(errorMessage); RawProjectParts rpps = m_reader.createRawProjectParts(errorMessage);
if (!errorMessage.isEmpty()) if (!errorMessage.isEmpty())
@@ -1011,8 +1035,7 @@ void CMakeBuildSystem::updateProjectData()
qCDebug(cmakeBuildSystemLog) << "Raw project parts created." << errorMessage; qCDebug(cmakeBuildSystemLog) << "Raw project parts created." << errorMessage;
for (RawProjectPart &rpp : rpps) { for (RawProjectPart &rpp : rpps) {
rpp.setQtVersion( rpp.setQtVersion(qtVersion); // TODO: Check if project actually uses Qt.
kitInfo.projectPartQtVersion); // TODO: Check if project actually uses Qt.
const FilePath includeFileBaseDir = buildConfiguration()->buildDirectory(); const FilePath includeFileBaseDir = buildConfiguration()->buildDirectory();
QStringList cxxFlags = rpp.flagsForCxx.commandLineFlags; QStringList cxxFlags = rpp.flagsForCxx.commandLineFlags;
QStringList cFlags = rpp.flagsForC.commandLineFlags; QStringList cFlags = rpp.flagsForC.commandLineFlags;

View File

@@ -116,8 +116,10 @@ static Environment getEnvCombined(const std::optional<Environment> &optPresetEnv
Environment result = env; Environment result = env;
if (optPresetEnv) { if (optPresetEnv) {
optPresetEnv->forEachEntry([&result](const QString &key, const QString &value, bool) { optPresetEnv->forEachEntry([&result](const QString &key, const QString &value,
result.set(key, value); bool enabled) {
if (enabled)
result.set(key, value);
}); });
} }
@@ -128,7 +130,9 @@ template<class PresetType>
void expand(const PresetType &preset, Environment &env, const FilePath &sourceDirectory) void expand(const PresetType &preset, Environment &env, const FilePath &sourceDirectory)
{ {
const Environment presetEnv = getEnvCombined(preset.environment, env); const Environment presetEnv = getEnvCombined(preset.environment, env);
presetEnv.forEachEntry([&](const QString &key, const QString &value_, bool) { presetEnv.forEachEntry([&](const QString &key, const QString &value_, bool enabled) {
if (!enabled)
return;
QString value = value_; QString value = value_;
expandAllButEnv(preset, sourceDirectory, value); expandAllButEnv(preset, sourceDirectory, value);
value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) { value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) {
@@ -163,7 +167,9 @@ template<class PresetType>
void expand(const PresetType &preset, EnvironmentItems &envItems, const FilePath &sourceDirectory) void expand(const PresetType &preset, EnvironmentItems &envItems, const FilePath &sourceDirectory)
{ {
const Environment presetEnv = preset.environment ? *preset.environment : Environment(); const Environment presetEnv = preset.environment ? *preset.environment : Environment();
presetEnv.forEachEntry([&](const QString &key, const QString &value_, bool) { presetEnv.forEachEntry([&](const QString &key, const QString &value_, bool enabled) {
if (!enabled)
return;
QString value = value_; QString value = value_;
expandAllButEnv(preset, sourceDirectory, value); expandAllButEnv(preset, sourceDirectory, value);
value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) { value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) {

View File

@@ -85,7 +85,6 @@ SystemSettings::SystemSettings()
autoSaveInterval.setSuffix(Tr::tr("min")); autoSaveInterval.setSuffix(Tr::tr("min"));
autoSaveInterval.setRange(1, 1000000); autoSaveInterval.setRange(1, 1000000);
autoSaveInterval.setDefaultValue(5); autoSaveInterval.setDefaultValue(5);
autoSaveInterval.setEnabler(&autoSaveModifiedFiles);
autoSaveInterval.setLabelText(Tr::tr("Interval:")); autoSaveInterval.setLabelText(Tr::tr("Interval:"));
autoSaveAfterRefactoring.setSettingsKey("EditorManager/AutoSaveAfterRefactoring"); autoSaveAfterRefactoring.setSettingsKey("EditorManager/AutoSaveAfterRefactoring");
@@ -107,7 +106,6 @@ SystemSettings::SystemSettings()
autoSuspendMinDocumentCount.setSettingsKey("EditorManager/AutoSuspendMinDocuments"); autoSuspendMinDocumentCount.setSettingsKey("EditorManager/AutoSuspendMinDocuments");
autoSuspendMinDocumentCount.setRange(1, 500); autoSuspendMinDocumentCount.setRange(1, 500);
autoSuspendMinDocumentCount.setDefaultValue(30); autoSuspendMinDocumentCount.setDefaultValue(30);
autoSuspendMinDocumentCount.setEnabler(&autoSuspendEnabled);
autoSuspendMinDocumentCount.setLabelText(Tr::tr("Files to keep open:")); autoSuspendMinDocumentCount.setLabelText(Tr::tr("Files to keep open:"));
autoSuspendMinDocumentCount.setToolTip( autoSuspendMinDocumentCount.setToolTip(
Tr::tr("Minimum number of open documents that should be kept in memory. Increasing this " Tr::tr("Minimum number of open documents that should be kept in memory. Increasing this "
@@ -122,7 +120,6 @@ SystemSettings::SystemSettings()
bigFileSizeLimitInMB.setSuffix(Tr::tr("MB")); bigFileSizeLimitInMB.setSuffix(Tr::tr("MB"));
bigFileSizeLimitInMB.setRange(1, 500); bigFileSizeLimitInMB.setRange(1, 500);
bigFileSizeLimitInMB.setDefaultValue(5); bigFileSizeLimitInMB.setDefaultValue(5);
bigFileSizeLimitInMB.setEnabler(&warnBeforeOpeningBigFiles);
maxRecentFiles.setSettingsKey("EditorManager/MaxRecentFiles"); maxRecentFiles.setSettingsKey("EditorManager/MaxRecentFiles");
maxRecentFiles.setRange(1, 99); maxRecentFiles.setRange(1, 99);
@@ -151,6 +148,11 @@ SystemSettings::SystemSettings()
showCrashButton.setSettingsKey("ShowCrashButton"); showCrashButton.setSettingsKey("ShowCrashButton");
#endif #endif
readSettings(); readSettings();
autoSaveInterval.setEnabler(&autoSaveModifiedFiles);
autoSuspendMinDocumentCount.setEnabler(&autoSuspendEnabled);
bigFileSizeLimitInMB.setEnabler(&warnBeforeOpeningBigFiles);
connect(&autoSaveModifiedFiles, &BaseAspect::changed, connect(&autoSaveModifiedFiles, &BaseAspect::changed,
this, &EditorManagerPrivate::updateAutoSave); this, &EditorManagerPrivate::updateAutoSave);
connect(&autoSaveInterval, &BaseAspect::changed, this, &EditorManagerPrivate::updateAutoSave); connect(&autoSaveInterval, &BaseAspect::changed, this, &EditorManagerPrivate::updateAutoSave);

View File

@@ -1647,8 +1647,8 @@ QList<ProjectPart::ConstPtr> CppModelManager::projectPart(const FilePath &fileNa
{ {
{ {
QReadLocker locker(&d->m_projectLock); QReadLocker locker(&d->m_projectLock);
auto it = d->m_fileToProjectParts.find(fileName); auto it = d->m_fileToProjectParts.constFind(fileName);
if (it != d->m_fileToProjectParts.end()) if (it != d->m_fileToProjectParts.constEnd())
return it.value(); return it.value();
} }
const FilePath canonicalPath = fileName.canonicalPath(); const FilePath canonicalPath = fileName.canonicalPath();

View File

@@ -58,10 +58,13 @@ void DapClient::sendInitialize()
postRequest("initialize", QJsonObject{{"clientID", "QtCreator"}, {"clientName", "QtCreator"}}); postRequest("initialize", QJsonObject{{"clientID", "QtCreator"}, {"clientName", "QtCreator"}});
} }
void DapClient::sendLaunch(const Utils::FilePath &executable) void DapClient::sendLaunch(const Utils::CommandLine &command)
{ {
postRequest("launch", postRequest("launch",
QJsonObject{{"noDebug", false}, {"program", executable.path()}, {"__restart", ""}}); QJsonObject{{"noDebug", false},
{"program", command.executable().path()},
{"args", command.arguments()},
{"__restart", ""}});
} }
void DapClient::sendAttach() void DapClient::sendAttach()

View File

@@ -81,7 +81,7 @@ public:
virtual void sendInitialize(); virtual void sendInitialize();
void sendLaunch(const Utils::FilePath &executable); void sendLaunch(const Utils::CommandLine &command);
void sendAttach(); void sendAttach();
void sendConfigurationDone(); void sendConfigurationDone();

View File

@@ -195,7 +195,7 @@ void DapEngine::handleDapInitialize()
{ {
QTC_ASSERT(state() == EngineRunRequested, qCDebug(logCategory()) << state()); QTC_ASSERT(state() == EngineRunRequested, qCDebug(logCategory()) << state());
m_dapClient->sendLaunch(runParameters().inferior.command.executable()); m_dapClient->sendLaunch(runParameters().inferior.command);
qCDebug(logCategory()) << "handleDapLaunch"; qCDebug(logCategory()) << "handleDapLaunch";
} }
@@ -532,6 +532,9 @@ QString DapEngine::errorMessage(QProcess::ProcessError error) const
void DapEngine::handleDapDone() void DapEngine::handleDapDone()
{ {
if (state() == DebuggerFinished)
return;
if (m_dapClient->dataProvider()->result() == ProcessResult::StartFailed) { if (m_dapClient->dataProvider()->result() == ProcessResult::StartFailed) {
notifyEngineSetupFailed(); notifyEngineSetupFailed();
showMessage("ADAPTER START FAILED"); showMessage("ADAPTER START FAILED");
@@ -864,7 +867,7 @@ void DapEngine::refreshLocals(const QJsonArray &variables)
if (currentItem && currentItem->iname.startsWith("watch")) if (currentItem && currentItem->iname.startsWith("watch"))
currentItem->removeChildren(); currentItem->removeChildren();
for (auto variable : variables) { for (const QJsonValueConstRef &variable : variables) {
WatchItem *item = new WatchItem; WatchItem *item = new WatchItem;
const QString name = variable.toObject().value("name").toString(); const QString name = variable.toObject().value("name").toString();

View File

@@ -63,6 +63,8 @@ public:
void start() override void start() override
{ {
m_proc.setProcessMode(ProcessMode::Writer); m_proc.setProcessMode(ProcessMode::Writer);
if (m_runParameters.debugger.workingDirectory.isDir())
m_proc.setWorkingDirectory(m_runParameters.debugger.workingDirectory);
m_proc.setEnvironment(m_runParameters.debugger.environment); m_proc.setEnvironment(m_runParameters.debugger.environment);
m_proc.setCommand(m_cmd); m_proc.setCommand(m_cmd);
m_proc.start(); m_proc.start();

View File

@@ -662,9 +662,11 @@ CommandLine DockerDevicePrivate::withDockerExecCmd(const CommandLine &cmd,
dockerCmd.addArg("-t"); dockerCmd.addArg("-t");
if (env) { if (env) {
env->forEachEntry([&](const QString &key, const QString &value, bool) { env->forEachEntry([&](const QString &key, const QString &value, bool enabled) {
dockerCmd.addArg("-e"); if (enabled) {
dockerCmd.addArg(key + "=" + env->expandVariables(value)); dockerCmd.addArg("-e");
dockerCmd.addArg(key + "=" + env->expandVariables(value));
}
}); });
} }

View File

@@ -156,8 +156,6 @@ FakeVimSettings::FakeVimSettings()
Row ints { shiftWidth, tabStop, scrollOff, st }; Row ints { shiftWidth, tabStop, scrollOff, st };
vimRcPath.setEnabler(&readVimRc);
Column strings { Column strings {
backspace, backspace,
isKeyword, isKeyword,
@@ -239,6 +237,8 @@ FakeVimSettings::FakeVimSettings()
readSettings(); readSettings();
vimRcPath.setEnabler(&readVimRc);
#endif #endif
} }

View File

@@ -867,8 +867,9 @@ QtSupport::ProFileReader *QmakeBuildSystem::createProFileReader(const QmakeProFi
rootProFileName, rootProFileName,
deviceRoot()); deviceRoot());
env.forEachEntry([&](const QString &key, const QString &value, bool) { env.forEachEntry([&](const QString &key, const QString &value, bool enabled) {
m_qmakeGlobals->environment.insert(key, env.expandVariables(value)); if (enabled)
m_qmakeGlobals->environment.insert(key, env.expandVariables(value));
}); });
m_qmakeGlobals->setCommandLineArguments(rootProFileName, qmakeArgs); m_qmakeGlobals->setCommandLineArguments(rootProFileName, qmakeArgs);

View File

@@ -44,9 +44,13 @@ bool QmlJSOutlineFilterModel::filterAcceptsRow(int sourceRow,
{ {
if (m_filterBindings) { if (m_filterBindings) {
QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0, sourceParent); QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0, sourceParent);
QVariant itemType = sourceIndex.data(QmlOutlineModel::ItemTypeRole); while (sourceIndex.isValid()) {
if (itemType == QmlOutlineModel::NonElementBindingType) if (sourceIndex.data(QmlOutlineModel::ItemTypeRole)
return false; == QmlOutlineModel::NonElementBindingType) {
return false;
}
sourceIndex = sourceIndex.parent();
}
} }
return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent);
} }

View File

@@ -40,7 +40,6 @@ QmlProfilerSettings::QmlProfilerSettings()
flushInterval.setRange(1, 10000000); flushInterval.setRange(1, 10000000);
flushInterval.setDefaultValue(1000); flushInterval.setDefaultValue(1000);
flushInterval.setLabelText(Tr::tr("Flush interval (ms):")); flushInterval.setLabelText(Tr::tr("Flush interval (ms):"));
flushInterval.setEnabler(&flushEnabled);
lastTraceFile.setSettingsKey("Analyzer.QmlProfiler.LastTraceFile"); lastTraceFile.setSettingsKey("Analyzer.QmlProfiler.LastTraceFile");
@@ -63,6 +62,8 @@ QmlProfilerSettings::QmlProfilerSettings()
}); });
readSettings(); readSettings();
flushInterval.setEnabler(&flushEnabled);
} }
// QmlProfilerSettingsPage // QmlProfilerSettingsPage

View File

@@ -768,8 +768,9 @@ CommandLine SshProcessInterfacePrivate::fullLocalCommandLine() const
inner.addArgs(QString("echo ") + s_pidMarker + "$$" + s_pidMarker + " && ", CommandLine::Raw); inner.addArgs(QString("echo ") + s_pidMarker + "$$" + s_pidMarker + " && ", CommandLine::Raw);
const Environment &env = q->m_setup.m_environment; const Environment &env = q->m_setup.m_environment;
env.forEachEntry([&](const QString &key, const QString &value, bool) { env.forEachEntry([&](const QString &key, const QString &value, bool enabled) {
inner.addArgs(key + "='" + env.expandVariables(value) + '\'', CommandLine::Raw); if (enabled)
inner.addArgs(key + "='" + env.expandVariables(value) + '\'', CommandLine::Raw);
}); });
if (!useTerminal && !commandLine.isEmpty()) if (!useTerminal && !commandLine.isEmpty())

View File

@@ -113,7 +113,6 @@ ScreenRecorderSettings::ScreenRecorderSettings()
fileSizeLimit.setDefaultValue(1024); fileSizeLimit.setDefaultValue(1024);
fileSizeLimit.setRange(100, 1024 * 1024 * 2); // Up to 2GB fileSizeLimit.setRange(100, 1024 * 1024 * 2); // Up to 2GB
fileSizeLimit.setSuffix("MB"); fileSizeLimit.setSuffix("MB");
fileSizeLimit.setEnabler(&enableFileSizeLimit);
enableRtBuffer.setSettingsKey("EnableRealTimeBuffer"); enableRtBuffer.setSettingsKey("EnableRealTimeBuffer");
enableRtBuffer.setDefaultValue(true); enableRtBuffer.setDefaultValue(true);
@@ -124,7 +123,6 @@ ScreenRecorderSettings::ScreenRecorderSettings()
rtBufferSize.setDefaultValue(1024); rtBufferSize.setDefaultValue(1024);
rtBufferSize.setRange(100, 1024 * 1024 * 2); // Up to 2GB rtBufferSize.setRange(100, 1024 * 1024 * 2); // Up to 2GB
rtBufferSize.setSuffix("MB"); rtBufferSize.setSuffix("MB");
rtBufferSize.setEnabler(&enableRtBuffer);
logFfmpegCommandline.setSettingsKey("LogFFMpegCommandLine"); logFfmpegCommandline.setSettingsKey("LogFFMpegCommandLine");
logFfmpegCommandline.setDefaultValue(false); logFfmpegCommandline.setDefaultValue(false);
@@ -206,6 +204,9 @@ ScreenRecorderSettings::ScreenRecorderSettings()
readSettings(); readSettings();
rtBufferSize.setEnabler(&enableRtBuffer);
fileSizeLimit.setEnabler(&enableFileSizeLimit);
setCaptureMouseClicksVisible(); setCaptureMouseClicksVisible();
connect(&screenCaptureType, &SelectionAspect::volatileValueChanged, this, connect(&screenCaptureType, &SelectionAspect::volatileValueChanged, this,
setCaptureMouseClicksVisible); setCaptureMouseClicksVisible);

View File

@@ -103,7 +103,6 @@ add_qtc_plugin(TextEditor
texteditor.qrc texteditor.qrc
texteditor_global.h texteditor_global.h
texteditortr.h texteditortr.h
texteditor_p.h
texteditoractionhandler.cpp texteditoractionhandler.h texteditoractionhandler.cpp texteditoractionhandler.h
texteditorconstants.cpp texteditorconstants.h texteditorconstants.cpp texteditorconstants.h
texteditoroverlay.cpp texteditoroverlay.h texteditoroverlay.cpp texteditoroverlay.h

View File

@@ -120,8 +120,10 @@ OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) :
m_toggleSort->setToolTip(Tr::tr("Sort Alphabetically")); m_toggleSort->setToolTip(Tr::tr("Sort Alphabetically"));
connect(m_toggleSort, &QAbstractButton::clicked, this, &OutlineWidgetStack::toggleSort); connect(m_toggleSort, &QAbstractButton::clicked, this, &OutlineWidgetStack::toggleSort);
connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged, connect(Core::EditorManager::instance(),
this, &OutlineWidgetStack::updateEditor); &Core::EditorManager::currentEditorChanged,
this,
&OutlineWidgetStack::updateCurrentEditor);
connect(factory, &OutlineFactory::updateOutline, connect(factory, &OutlineFactory::updateOutline,
this, &OutlineWidgetStack::updateCurrentEditor); this, &OutlineWidgetStack::updateCurrentEditor);
updateCurrentEditor(); updateCurrentEditor();

View File

@@ -27,7 +27,6 @@
#include "tabsettings.h" #include "tabsettings.h"
#include "textdocument.h" #include "textdocument.h"
#include "textdocumentlayout.h" #include "textdocumentlayout.h"
#include "texteditor_p.h"
#include "texteditoractionhandler.h" #include "texteditoractionhandler.h"
#include "texteditorconstants.h" #include "texteditorconstants.h"
#include "texteditoroverlay.h" #include "texteditoroverlay.h"
@@ -563,6 +562,19 @@ struct PaintEventBlockData
struct ExtraAreaPaintEventData; struct ExtraAreaPaintEventData;
struct TextEditorPrivateHighlightBlocks
{
QList<int> open;
QList<int> close;
QList<int> visualIndent;
inline int count() const { return visualIndent.size(); }
inline bool isEmpty() const { return open.isEmpty() || close.isEmpty() || visualIndent.isEmpty(); }
inline bool operator==(const TextEditorPrivateHighlightBlocks &o) const {
return (open == o.open && close == o.close && visualIndent == o.visualIndent);
}
inline bool operator!=(const TextEditorPrivateHighlightBlocks &o) const { return !(*this == o); }
};
class TextEditorWidgetPrivate : public QObject class TextEditorWidgetPrivate : public QObject
{ {
public: public:

View File

@@ -134,7 +134,6 @@ QtcPlugin {
"texteditor.h", "texteditor.h",
"texteditor.qrc", "texteditor.qrc",
"texteditor_global.h", "texteditortr.h", "texteditor_global.h", "texteditortr.h",
"texteditor_p.h",
"texteditoractionhandler.cpp", "texteditoractionhandler.cpp",
"texteditoractionhandler.h", "texteditoractionhandler.h",
"texteditorconstants.cpp", "texteditorconstants.cpp",

View File

@@ -1,36 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "texteditor_global.h"
#include <QList>
#include <QTextCursor>
namespace TextEditor {
class TextDocument;
namespace Internal {
//
// TextEditorPrivate
//
struct TextEditorPrivateHighlightBlocks
{
QList<int> open;
QList<int> close;
QList<int> visualIndent;
inline int count() const { return visualIndent.size(); }
inline bool isEmpty() const { return open.isEmpty() || close.isEmpty() || visualIndent.isEmpty(); }
inline bool operator==(const TextEditorPrivateHighlightBlocks &o) const {
return (open == o.open && close == o.close && visualIndent == o.visualIndent);
}
inline bool operator!=(const TextEditorPrivateHighlightBlocks &o) const { return !(*this == o); }
};
} // namespace Internal
} // namespace TextEditor

View File

@@ -2676,7 +2676,7 @@ void tst_Tasking::testInThread()
QFETCH(TestData, testData); QFETCH(TestData, testData);
const auto onSetup = [testData](ConcurrentCall<TestResult> &task) { const auto onSetup = [testData](ConcurrentCall<TestResult> &task) {
task.setConcurrentCallData(runInThread, testData); task.setConcurrentCallData(&runInThread, testData);
}; };
const auto onDone = [testData](const ConcurrentCall<TestResult> &task) { const auto onDone = [testData](const ConcurrentCall<TestResult> &task) {
QVERIFY(task.future().resultCount()); QVERIFY(task.future().resultCount());

View File

@@ -48,6 +48,11 @@ public:
p.waitForFinished(); p.waitForFinished();
return {p.exitCode(), p.readAllStandardOutput(), p.readAllStandardError()}; return {p.exitCode(), p.readAllStandardOutput(), p.readAllStandardError()};
} }
void findUsingLs(const QString &current, const FileFilter &filter, QStringList *found)
{
UnixDeviceFileAccess::findUsingLs(current, filter, found, {});
}
}; };
class tst_unixdevicefileaccess : public QObject class tst_unixdevicefileaccess : public QObject
@@ -69,6 +74,27 @@ private slots:
QCOMPARE(size, 1024); QCOMPARE(size, 1024);
} }
void findUsingLs()
{
QStringList result;
m_dfa.findUsingLs(m_tempDir.path(),
{{}, QDir::NoFilter, QDirIterator::Subdirectories},
&result);
QCOMPARE(result, QStringList({".", "..", "size-test"}));
QDir tDir(m_tempDir.path());
tDir.mkdir("lsfindsubdir");
result.clear();
m_dfa.findUsingLs(m_tempDir.path(),
{{}, QDir::NoFilter, QDirIterator::Subdirectories},
&result);
QCOMPARE(result,
QStringList(
{".", "..", "lsfindsubdir/.", "lsfindsubdir/..", "lsfindsubdir", "size-test"}));
}
private: private:
TestDFA m_dfa; TestDFA m_dfa;
DeviceFileAccess *m_dfaPtr = &m_dfa; DeviceFileAccess *m_dfaPtr = &m_dfa;

View File

@@ -12,6 +12,7 @@ add_subdirectory(fakevim)
# add_subdirectory(genericproject) # add_subdirectory(genericproject)
add_subdirectory(pluginview) add_subdirectory(pluginview)
add_subdirectory(proparser) add_subdirectory(proparser)
add_subdirectory(terminal)
# add_subdirectory(qml) # add_subdirectory(qml)
# add_subdirectory(qt4projectmanager) # add_subdirectory(qt4projectmanager)
# add_subdirectory(search) # add_subdirectory(search)

View File

@@ -15,6 +15,7 @@ Project {
"subdirfilecontainer/subdirfilecontainer.qbs", "subdirfilecontainer/subdirfilecontainer.qbs",
"tasking/demo/demo.qbs", "tasking/demo/demo.qbs",
"tasking/imagescaling/imagescaling.qbs", "tasking/imagescaling/imagescaling.qbs",
"terminal/terminal.qbs",
"widgets/widgets.qbs", "widgets/widgets.qbs",
] ]
} }

View File

@@ -0,0 +1,4 @@
add_qtc_test(tst_terminal
DEPENDS Utils
SOURCES tst_terminal.cpp
)

View File

@@ -0,0 +1,7 @@
import qbs
QtcAutotest {
name: "Terminal autotest"
Depends { name: "Utils" }
files: "tst_terminal.cpp"
}

View File

@@ -0,0 +1,54 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include <utils/externalterminalprocessimpl.h>
#include <QRandomGenerator>
#include <QtTest>
//TESTED_COMPONENT=src/utils/changeset
class tst_Terminal : public QObject
{
Q_OBJECT
private slots:
void terminalApp()
{
if (!Utils::HostOsInfo::isMacHost())
QSKIP("This test is only for macOS");
int rnd = QRandomGenerator::global()->generate();
QString testCode = R"(
set theFile to POSIX file "/tmp/testoutput.txt"
set theFile to theFile as string
set theOpenedFile to open for access file theFile with write permission
set eof of theOpenedFile to 0
write "%1" to theOpenedFile starting at eof
close access theOpenedFile
)";
QString terminalScript = Utils::ExternalTerminalProcessImpl::openTerminalScriptAttached();
terminalScript = terminalScript.arg("sleep 1") + "\n" + testCode.arg(rnd);
QProcess process;
process.setProcessChannelMode(QProcess::ProcessChannelMode::MergedChannels);
process.setProgram("osascript");
process.setArguments({"-e", terminalScript});
process.start();
QTRY_VERIFY(process.state() == QProcess::NotRunning);
const auto output = process.readAll();
if (!output.isEmpty())
qDebug() << "Output:" << output;
QVERIFY(process.exitCode() == 0);
QFile testOutputFile("/tmp/testoutput.txt");
QVERIFY(testOutputFile.open(QIODevice::ReadOnly));
QVERIFY(testOutputFile.readAll() == QByteArray::number(rnd));
}
};
QTEST_GUILESS_MAIN(tst_Terminal)
#include "tst_terminal.moc"