Merge remote-tracking branch 'origin/9.0'

Conflicts:
	cmake/QtCreatorIDEBranding.cmake
	qbs/modules/qtc/qtc.qbs
	qtcreator_ide_branding.pri
	src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp

Change-Id: I154a9ababa9e166cb06e98652d481fe6234f6399
This commit is contained in:
Eike Ziller
2022-11-03 13:44:37 +01:00
206 changed files with 2160 additions and 1321 deletions

View File

@@ -96,6 +96,13 @@ function(_create_ts_custom_target name)
COMMENT "Generate .ts files" COMMENT "Generate .ts files"
DEPENDS ${_sources} DEPENDS ${_sources}
VERBATIM) VERBATIM)
add_custom_target("${_arg_TS_TARGET_PREFIX}${name}_cleaned"
COMMAND Qt5::lupdate -locations relative -no-ui-lines -no-sort -no-obsolete -locations none "@${ts_file_list}" -ts ${ts_files}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Generate .ts files, remove obsolete and vanished translations, and do not add files and line number"
DEPENDS ${_sources}
VERBATIM)
endfunction() endfunction()
function(add_translation_targets file_prefix) function(add_translation_targets file_prefix)

View File

@@ -34,6 +34,7 @@ Editing
* Added option for `Tint whole margin area` * Added option for `Tint whole margin area`
* Added option for line spacing (QTCREATORBUG-13727) * Added option for line spacing (QTCREATORBUG-13727)
* Added `Create Cursors at Selected Line Ends` * Added `Create Cursors at Selected Line Ends`
* Added support for character encoding in binary/memory editor
* Improved UI for multiple markers on the same line (QTCREATORBUG-27415) * Improved UI for multiple markers on the same line (QTCREATORBUG-27415)
* Fixed performance issue with large selections * Fixed performance issue with large selections
* Fixed saving files with non-breaking spaces (QTCREATORBUG-17875) * Fixed saving files with non-breaking spaces (QTCREATORBUG-17875)
@@ -76,10 +77,6 @@ Editing
* Fixed that server was not restarted after 5 times, even if a long time passed * Fixed that server was not restarted after 5 times, even if a long time passed
after the last time after the last time
### Binaries
* Added support for character encoding
### Image Viewer ### Image Viewer
* Made `Fit to Screen` sticky and added option for the default * Made `Fit to Screen` sticky and added option for the default
@@ -88,6 +85,7 @@ Editing
### Diff Viewer ### Diff Viewer
* Fixed that calculating differences blocked Qt Creator * Fixed that calculating differences blocked Qt Creator
* Fixed that description widget height was not persistent (QTCREATORBUG-24286)
Projects Projects
-------- --------
@@ -105,6 +103,7 @@ Projects
toolchain files (QTCREATORBUG-24555) toolchain files (QTCREATORBUG-24555)
* Added option for changing environment for configure step * Added option for changing environment for configure step
* Added option for hiding subfolders in source groups (QTCREATORBUG-27432) * Added option for hiding subfolders in source groups (QTCREATORBUG-27432)
* Added support for `Build File` also from header files (QTCREATORBUG-26164)
* Fixed that `PATH` environment variable was not completely set up during first * Fixed that `PATH` environment variable was not completely set up during first
CMake run CMake run
* Fixed issues with importing builds using Visual C++ generator * Fixed issues with importing builds using Visual C++ generator
@@ -132,6 +131,9 @@ Version Control Systems
### Git ### Git
* Added support for user-configured comment character (QTCREATORBUG-28042) * Added support for user-configured comment character (QTCREATORBUG-28042)
* Improved matching of commit hashes (QTCREATORBUG-24768, QTCREATORBUG-28268)
* Fixed adding or deleting files in nested directories (QTCREATORBUG-27644, QTCREATORBUG-27405)
* Fixed that text encoding in project settings was not respected on diff
Test Integration Test Integration
---------------- ----------------

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -4,11 +4,7 @@
/*! /*!
\page creator-developing-android.html \page creator-developing-android.html
\previouspage creator-connecting-mobile.html \previouspage creator-connecting-mobile.html
\if defined(qtdesignstudio)
\nextpage creator-developing-generic-linux.html
\else
\nextpage creator-developing-baremetal.html \nextpage creator-developing-baremetal.html
\endif
\title Connecting Android Devices \title Connecting Android Devices

View File

@@ -34,10 +34,8 @@
packages, select \uicontrol Projects > \uicontrol Build > packages, select \uicontrol Projects > \uicontrol Build >
\uicontrol {Build Android APK} > \uicontrol Details. \uicontrol {Build Android APK} > \uicontrol Details.
\if defined(qtcreator)
For more information about options that you have for running applications, For more information about options that you have for running applications,
see \l {Specifying Run Settings for Android Devices}. see \l {Specifying Run Settings for Android Devices}.
\endif
\section1 Packaging Applications \section1 Packaging Applications

View File

@@ -14,6 +14,7 @@
\QC creates an initial configuration for you based on the kit \QC creates an initial configuration for you based on the kit
settings and displays it in \uicontrol {Initial Configuration} in settings and displays it in \uicontrol {Initial Configuration} in
the \l{Specifying Build Settings}{Build Settings} of the project. the \l{Specifying Build Settings}{Build Settings} of the project.
Alternatively, you can use CMake presets to configure CMake.
The \uicontrol Configuration field displays the effective CMake call that The \uicontrol Configuration field displays the effective CMake call that
is constructed by using the values of the \uicontrol {Build directory} and is constructed by using the values of the \uicontrol {Build directory} and
@@ -40,7 +41,7 @@
variables, see \l{CMake Variable Reference}. variables, see \l{CMake Variable Reference}.
You can specify additional CMake options, such as \c {--find-debug}, You can specify additional CMake options, such as \c {--find-debug},
\c {--preset}, \c {--trace-expand}, or \c {--warn-uninitialized}, in \c {--trace-expand}, or \c {--warn-uninitialized}, in
\uicontrol {Additional CMake options}. For more information about \uicontrol {Additional CMake options}. For more information about
the available options, click the link in the field name or see the available options, click the link in the field name or see
\l{CMake: cmake(1)}. \l{CMake: cmake(1)}.
@@ -60,9 +61,173 @@
Create the presets files in the format described in Create the presets files in the format described in
\l{https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html} \l{https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html}
{cmake-presets(7)} and store the in project's root directory. {cmake-presets(7)} and store them in project's root directory.
To use the preset files, specify the \c {--preset} option for your project. \QC supports presets up to version 3 (introduced in CMake 3.21), but version
checking is not enforced. All the fields from version 3 are read and used if
present. Test presets are not supported.
You can import the presets the first time you \l {Opening Projects}
{open a project}, when no \c CMakeLists.txt.user file exists or you have
disabled all kits in the project. To update changes to the
\c CMakePresets.json file, delete the \c CMakeLists.txt.user file.
\image qtcreator-cmake-presets-configure.webp "Opening a project that contains Cmake presets"
You can view the presets in the \uicontrol {Initial Configuration} field and
in the environment configuration field below it.
\image qtcreator-cmake-presets-environment.webp "CMake environment configuration"
\section2 Configure Presets
The following configure presets instruct CMake to use the default generator
on the platform and specify the build directory for all build types.
\c NOT_COMMON_VALUE is displayed in \uicontrol {Initial Parameters}
and \c AN_ENVIRONMENT_FLAG in the environment configuration field.
\badcode
{
"version": 1,
"configurePresets": [
{
"name": "preset",
"displayName": "preset",
"binaryDir": "${sourceDir}/build/preset",
"cacheVariables": {
"NOT_COMMON_VALUE": "NOT_COMMON_VALUE"
},
"environment": {
"AN_ENVIRONMENT_FLAG": "1"
}
}
]
}
\endcode
\section2 MinGW Example
The following example configures a Qt project with:
\list
\li MinGW compiler
\li build directory \c <sourceDir>/build-release
\li build type \c CMAKE_BUILD_TYPE as \c Release
\li generator MinGW Makefiles
\li path to a CMake executable
\li path to the Qt installation via \c CMAKE_PREFIX_PATH
\endlist
\badcode
{
"version": 1,
"configurePresets": [
{
"name": "mingw",
"displayName": "MinGW 11.2.0",
"generator": "MinGW Makefiles",
"binaryDir": "${sourceDir}/build-release",
"cmakeExecutable": "C:/Qt/Tools/CMake_64/bin/cmake.exe",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_PREFIX_PATH": "C:/Qt/6.4.0/mingw_64"
},
"environment": {
"PATH": "C:/Qt/Tools/mingw1120_64/bin;$penv{PATH}"
}
}
]
}
\endcode
To speed up the process on Windows, specify the \c CMAKE_C_COMPILER and
\c CMAKE_CXX_COMPILER in the \c cacheVariables section.
\section2 Ninja Generator Example
The following configure and build presets set Ninja Multi-Config as the
generator, add \c Debug and \c Release build steps, and specify the path
to \c ninja.exe as a value of the \c CMAKE_MAKE_PROGRAM variable:
\badcode
{
"version": 2,
"configurePresets": [
{
"name": "ninja-nmc",
"displayName": "Ninja Multi-Config MinGW",
"generator": "Ninja Multi-Config",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug;Release",
"CMAKE_PREFIX_PATH": "C:/Qt/6.4.0/mingw_64"
"CMAKE_MAKE_PROGRAM": "C:/Qt/Tools/Ninja/ninja.exe"
},
"environment": {
"PATH": "c:/Qt/Tools/mingw1120_64/bin;$penv{PATH}"
}
}
],
"buildPresets": [
{
"name": "release",
"displayName": "Ninja Release",
"configurePreset": "ninja-nmc",
"configuration": "Release"
},
{
"name": "debug",
"displayName": "Ninja Debug",
"configurePreset": "ninja-nmc",
"configuration": "Debug"
}
]
}
\endcode
This example assumes that the CMake executable path is set in
\uicontrol Edit > \uicontrol Preferences > \uicontrol CMake >
\uicontrol Tools.
\section2 Using Conditions
The following configure presets are used if they match \c condition. That is,
if the \c hostSystemName equals \c Linux, the \c linux presets are used and
if it equals \c Windows, the \c windows presets are used.
\badcode
{
"version": 3,
"configurePresets": [
{
"name": "linux",
"displayName": "Linux GCC",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_PREFIX_PATH": "$env{HOME}/Qt/6.4.0/gcc_64"
},
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
},
{
"name": "windows",
"displayName": "Windows MSVC",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_PREFIX_PATH": "$env{SYSTEMDRIVE}/Qt/6.4.0/msvc2019_64"
},
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
}
}
]
}
\endcode
\section1 Multi-Config Support \section1 Multi-Config Support

View File

@@ -45,6 +45,14 @@
\uicontrol {Clear CMake Configuration}, and then select \uicontrol Build \uicontrol {Clear CMake Configuration}, and then select \uicontrol Build
> \uicontrol {Run CMake} to reconfigure the project. > \uicontrol {Run CMake} to reconfigure the project.
The \uicontrol Projects view shows the names of the subfolders where the
source files are located. To hide the subfolder names and arrange the files
only according to their source group, select \uicontrol Edit >
\uicontrol Preferences > \uicontrol CMake > \uicontrol General, and then
deselect the \uicontrol {Show subfolders inside source group folders} check
box. The change takes effect after you select \uicontrol Build >
\uicontrol {Run CMake}.
\section1 Adding CMake Tools \section1 Adding CMake Tools
\QC requires CMake's \l{https://cmake.org/cmake/help/latest/manual/cmake-file-api.7.html} \QC requires CMake's \l{https://cmake.org/cmake/help/latest/manual/cmake-file-api.7.html}

View File

@@ -3,11 +3,7 @@
/*! /*!
\page creator-logging-viewer.html \page creator-logging-viewer.html
\if defined(qtdesignstudio)
\previouspage creator-quick-ui-forms.html
\else
\previouspage creator-task-lists.html \previouspage creator-task-lists.html
\endif
\nextpage creator-telemetry.html \nextpage creator-telemetry.html
\title Inspecting Internal Logs \title Inspecting Internal Logs

View File

@@ -25,44 +25,44 @@
\li \l Windows \li \l Windows
\row \row
\li \l Android \li \l Android
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\row \row
\li \l{Bare Metal} \li \l{Bare Metal}
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\row \row
\li \l Boot2Qt \li \l Boot2Qt
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\row \row
\li \l{Generic Remote Linux} \li \l{Remote Linux}
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\row \row
\li \l iOS \li \l iOS
\li \li
\li \image ok \li \image ok.png
\li \li
\row \row
\li \l{Microcontroller Units (MCU)}{MCUs} \li \l{Microcontroller Units (MCU)}{MCUs}
\li \li
\li \li
\li \image ok \li \image ok.png
\row \row
\li \l QNX \li \l QNX
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\li \inlineimage ok \li \inlineimage ok.png
\row \row
\li \l{Building Applications for the Web}{WebAssembly} \li \l{Building Applications for the Web}{WebAssembly}
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\li \image ok \li \image ok.png
\endtable \endtable
\note UWP support was removed from \QC 8.0. \note UWP support was removed from \QC 8.0.

View File

@@ -9,13 +9,8 @@
/*! /*!
\page creator-build-process-customizing.html \page creator-build-process-customizing.html
\if defined(qtdesignstudio)
\previouspage creator-developing-generic-linux.html
\nextpage studio-advanced.html
\else
\previouspage creator-setup-webassembly.html \previouspage creator-setup-webassembly.html
\nextpage creator-testing.html \nextpage creator-testing.html
\endif
\title Customizing the Build Process \title Customizing the Build Process

View File

@@ -22,10 +22,16 @@
\QC automatically detects the compilers that are registered by your \QC automatically detects the compilers that are registered by your
system or by the Qt Installer and lists them in \uicontrol Edit > system or by the Qt Installer and lists them in \uicontrol Edit >
\uicontrol Preferences > \uicontrol Kits > \uicontrol Compilers: \uicontrol Preferences > \uicontrol Kits > \uicontrol Compilers.
\image qtcreator-toolchains.png \image qtcreator-toolchains.png
\note On \macos, the \c ccache C/C++ compiler cache is detected
automatically only if you installed it using Homebrew or MacPorts.
When using MacPorts, you also need to create symlinks, as instructed in
\l{https://trac.macports.org/wiki/howto/ccache}{How to enable ccache}
in the MacPorts wiki.
You can add the following compilers to build applications by using other You can add the following compilers to build applications by using other
compilers or by using additional versions of the automatically detected compilers or by using additional versions of the automatically detected
compilers: compilers:
@@ -68,16 +74,16 @@
\li \l{https://www.iar.com/iar-embedded-workbench/}{IAREW} is a group of \li \l{https://www.iar.com/iar-embedded-workbench/}{IAREW} is a group of
C and C++ bare-metal compilers from the various IAR Embedded Workbench C and C++ bare-metal compilers from the various IAR Embedded Workbench
development environments. development environments.
\note Currently supported architectures are \c 8051, \c AVR, \c ARM, Currently supported architectures are \c 8051, \c AVR, \c ARM,
\c STM8, and \c MSP430. \c STM8, and \c MSP430.
\li \l{https://www.keil.com}{KEIL} is a group of C and C++ bare-metal \li \l{https://www.keil.com}{KEIL} is a group of C and C++ bare-metal
compilers from the various KEIL development environments. compilers from the various KEIL development environments.
\note Currently supported architectures are \c 8051 and \c ARM. Currently supported architectures are \c 8051 and \c ARM.
\li \l{http://sdcc.sourceforge.net}{SDCC} is a retargetable, optimizing \li \l{http://sdcc.sourceforge.net}{SDCC} is a retargetable, optimizing
C bare-metal compiler for various architectures. C bare-metal compiler for various architectures.
\note Currently supported architectures are \c 8051 and \c STM8. Currently supported architectures are \c 8051 and \c STM8.
\endlist \endlist

View File

@@ -10,11 +10,7 @@
/*! /*!
\page creator-build-dependencies.html \page creator-build-dependencies.html
\previouspage creator-code-style-settings.html \previouspage creator-code-style-settings.html
\if defined(qtdesignstudio)
\nextpage studio-designing.html
\else
\nextpage creator-project-settings-environment.html \nextpage creator-project-settings-environment.html
\endif
\title Specifying Dependencies \title Specifying Dependencies

View File

@@ -3,13 +3,8 @@
/*! /*!
\page qt-design-viewer.html \page qt-design-viewer.html
\if defined(qtdesignstudio)
\previouspage creator-live-preview-android.html
\nextpage studio-exporting-and-importing.html
\else
\previouspage creator-live-preview-devices.html \previouspage creator-live-preview-devices.html
\nextpage creator-building-targets.html \nextpage creator-building-targets.html
\endif
\title Previewing in Browsers \title Previewing in Browsers
@@ -24,24 +19,17 @@
However, the actual performance of the application once started is However, the actual performance of the application once started is
indistinguishable from the same application running on the desktop. indistinguishable from the same application running on the desktop.
\if defined(qtdesignstudio)
To create a resource file out of your project, select \uicontrol Build >
\uicontrol {Generate Resource File} in \QC. Then upload the package into
\QDV.
\else
You can run \l{Creating Qt Quick UI Projects}{Qt Quick UI projects}, which You can run \l{Creating Qt Quick UI Projects}{Qt Quick UI projects}, which
have a .qmlproject file that define the main QML file and the import paths. have a .qmlproject file that define the main QML file and the import paths.
Compress the project folder into a ZIP file that you upload to \QDV. Compress the project folder into a ZIP file that you upload to \QDV.
\endif
The loaded applications remain locally in your browser. No data is uploaded The loaded applications remain locally in your browser. No data is uploaded
into the cloud. into the cloud.
To preview an application in a web browser: To preview an application in a web browser:
\list \list 1
\li In the browser, open \l{http://qt-webassembly.io/designviewer/} \li In the browser, open \l{ https://designviewer.qt.io/}{\QDV}.
{\QDV}.
\li Drag and drop your application package to \QDV, or click the load \li Drag and drop your application package to \QDV, or click the load
icon to browse for your file. icon to browse for your file.
\endlist \endlist

View File

@@ -57,10 +57,15 @@
You can preview Android applications live using an Android You can preview Android applications live using an Android
emulator. emulator.
\endif \li \l{Sharing Applications Online}
You can share applications online and view them in a web browser.
\else
\li \l{Previewing in Browsers} \li \l{Previewing in Browsers}
You can open \l{https://qt-webassembly.io/designviewer/}{\QDV} You can open \l{https://designviewer.qt.io/}{\QDV}
in a browser and load applications to it. in a browser and load applications to it.
\endif
\endlist \endlist
*/ */

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@@ -0,0 +1,43 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page qt-design-viewer.html
\previouspage creator-live-preview-android.html
\nextpage studio-exporting-and-importing.html
\title Sharing Applications Online
\image qt-design-viewer.webp
In \QDS, you can share your applications in most widely-used web browsers,
such as Apple Safari, Google Chrome, Microsoft Edge, and Mozilla Firefox,
on the desktop and on mobile devices.
The application shared online runs in Qt Design Viewer, which is a QML
viewer that runs in your web browser.
The startup and compilation time depend on your browser and configuration.
However, the actual performance of the application once started is
indistinguishable from the same application running on the desktop.
The loaded applications remain locally in your browser. No data is uploaded
into the cloud.
\section1 Sharing your Application Online
To share your \QDS application online:
\list 1
\li Open the application in \QDS.
\li Select \uicontrol File > \uicontrol {Share Application Online}.
\li In the dialog, select \uicontrol Share.
\image share-online.webp
\endlist
In the dialog, you can now open the application in a web
browser, copy the link to share with others, or manage your shared
applications.
\image share-online-manage.webp
*/

View File

@@ -131,7 +131,7 @@
\li \l{Previewing on Desktop} \li \l{Previewing on Desktop}
\li \l{Previewing on Devices} \li \l{Previewing on Devices}
\li \l{Previewing Android Applications} \li \l{Previewing Android Applications}
\li \l{Previewing in Browsers} \li \l{Sharing Applications Online}
\endlist \endlist
\li \l {Asset Creation with Other Tools} \li \l {Asset Creation with Other Tools}
\list \list

View File

@@ -5,6 +5,7 @@
\page qtquick-states-view.html \page qtquick-states-view.html
\previouspage qtquick-connection-view.html \previouspage qtquick-connection-view.html
\nextpage studio-translations.html \nextpage studio-translations.html
\sa {Working with States}
\title States \title States
@@ -25,48 +26,4 @@
\youtube FzmLuRHQXaw \youtube FzmLuRHQXaw
\section1 Summary of States View Actions
To open the \uicontrol Actions menu, select
\inlineimage icons/action-icon.png
. The actions available in the menu depend on the current context. For
example, the option for editing an annotation becomes available after
you add an annotation.
\table
\header
\li Action
\li Purpose
\li Read More
\row
\li \uicontrol {Set when Condition}
\li Determines when a state should be applied.
\li \l{Applying States}
\row
\li \uicontrol {Reset when Condition}
\li Removes \c when condition for the state.
\li \l{Applying States}
\row
\li \uicontrol {Set as Default}
\li Sets the current state as the startup state of the application.
\li \l{Setting the Default State}
\row
\li\uicontrol {Reset Default}
\li Resets the current state as the default state.
\li \l{Setting the Default State}
\row
\li \uicontrol {Add Annotation}
\li Opens the \uicontrol {Annotation Editor} when you can add an
annotation for the states that you create.
\li \l{Annotating Designs}
\row
\li \uicontrol {Edit Annotation}
\li Opens the \uicontrol {Annotation Editor} where you can edit the
annotation for the state.
\li \l{Annotating Designs}
\row
\li \uicontrol {Add Annotation}
\li Removes the annotation for the state.
\li \l{Annotating Designs}
\endtable
*/ */

View File

@@ -19,9 +19,9 @@
\image qmldesigner-transitions.png "States view" \image qmldesigner-transitions.png "States view"
Click the new state to switch to it in the \l {2D} view, and then modify the Click the new state to switch to it in the \l {2D} and \l{3D} views, and
values of the properties of components or component instances in then modify the values of the properties of components or component
\l Properties. instances in \l Properties.
For example, to change the appearance of a button, you can define states in For example, to change the appearance of a button, you can define states in
the button component to hide the button image and show another image in its the button component to hide the button image and show another image in its
@@ -60,21 +60,17 @@
\section1 Setting the Default State \section1 Setting the Default State
To determine the startup state of the application, The default state determines the startup state of the application.
select \inlineimage icons/action-icon.png
to open the \uicontrol Actions menu, and then select
\uicontrol {Set as Default}.
To reset the state later, select \uicontrol Actions > To set a state to the default state, select \uicontrol Default.
\uicontrol {Reset Default}.
\section1 Applying States \section1 Applying States
To determine when a state should be applied, select \uicontrol Actions > To determine when a state is applied, select \inlineimage icons/edit.png
\uicontrol {Set when Condition}. In \uicontrol {Binding Editor}, specify in the \uicontrol {When Condition} field. In \uicontrol {Binding Editor},
a \l [QtQuick]{State::when}{when} property for the state. Set the value of specify a \l [QtQuick]{State::when}{when} property for the state. Set the
the property to a boolean expression that evaluates to \c true when you want value of the property to a boolean expression that evaluates to \c true when
the state to be applied. you want the state to be applied.
This enables you to evaluate the truthfulness of several components' This enables you to evaluate the truthfulness of several components'
properties and move the UI to the state in which these conditions apply. properties and move the UI to the state in which these conditions apply.
@@ -170,10 +166,40 @@
\li Create additional states for each view and set the visibility \li Create additional states for each view and set the visibility
or opacity of the components in the view. or opacity of the components in the view.
\li To determine which state is applied when the application starts, \li To determine which state is applied when the application starts,
select \uicontrol Actions > \uicontrol {Set as Default}. select \uicontrol Default.
\endlist \endlist
\if defined(qtcreator) \if defined(qtcreator)
\include qtquick-states-scxml.qdocinc scxml state machines \include qtquick-states-scxml.qdocinc scxml state machines
\endif \endif
\section1 State Groups
With state groups, you can change the state of certain components
independently of other components and their states in the same view.
Each state group has its own property changes and transitions.
By default, there is one root state group.
\section1 Extending States
When a state extends another state, it inherits all the changes of that
state. The state being extended is treated as the base state in regards to
the changes specified by the extending state.
Using extended states can make the user interface and your QML code
cleaner.
Below is an example where the only change between \e State1 and \e State2
is the brightness of \e directionalLight.
Here, extended states are not used:
\image no-extended-state.webp
Here, \e State2 is extended from \e State1:
\image extended-state.webp
*/ */

View File

@@ -162,6 +162,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
readonly property string suffix: fileName.substr(-4) readonly property string suffix: fileName.substr(-4)
readonly property bool isFont: suffix === ".ttf" || suffix === ".otf" readonly property bool isFont: suffix === ".ttf" || suffix === ".otf"
readonly property bool isEffect: suffix === ".qep"
property bool currFileSelected: false property bool currFileSelected: false
MouseArea { MouseArea {
@@ -180,7 +181,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
allowTooltip = true allowTooltip = true
} }
onPositionChanged: tooltipBackend.reposition() onPositionChanged: tooltipBackend.reposition()
onPressed: (mouse)=> { onPressed: (mouse) => {
forceActiveFocus() forceActiveFocus()
allowTooltip = false allowTooltip = false
tooltipBackend.hideTooltip() tooltipBackend.hideTooltip()
@@ -212,7 +213,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
} }
} }
onReleased: (mouse)=> { onReleased: (mouse) => {
allowTooltip = true allowTooltip = true
if (mouse.button === Qt.LeftButton) { if (mouse.button === Qt.LeftButton) {
if (!(mouse.modifiers & Qt.ControlModifier)) if (!(mouse.modifiers & Qt.ControlModifier))
@@ -222,6 +223,14 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
} }
} }
onDoubleClicked: (mouse) => {
forceActiveFocus()
allowTooltip = false
tooltipBackend.hideTooltip()
if (mouse.button === Qt.LeftButton && isEffect)
rootView.openEffectMaker(filePath)
}
ToolTip { ToolTip {
visible: !isFont && mouseArea.containsMouse && !contextMenu.visible visible: !isFont && mouseArea.containsMouse && !contextMenu.visible
text: filePath text: filePath

View File

@@ -241,10 +241,15 @@ Item {
delegate: Section { delegate: Section {
width: root.width width: root.width
caption: bundleCategory caption: bundleCategoryName
addTopPadding: false addTopPadding: false
sectionBackgroundColor: "transparent" sectionBackgroundColor: "transparent"
visible: bundleCategoryVisible visible: bundleCategoryVisible
expanded: bundleCategoryExpanded
expandOnClick: false
onToggleExpand: bundleCategoryExpanded = !bundleCategoryExpanded
onExpand: bundleCategoryExpanded = true
onCollapse: bundleCategoryExpanded = false
Grid { Grid {
width: scrollView.width width: scrollView.width
@@ -254,7 +259,7 @@ Item {
columns: root.width / root.cellWidth columns: root.width / root.cellWidth
Repeater { Repeater {
model: bundleMaterialsModel model: bundleCategoryMaterials
delegate: BundleMaterialItem { delegate: BundleMaterialItem {
width: root.cellWidth width: root.cellWidth

View File

@@ -80,6 +80,10 @@ StudioControls.Menu {
root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.principledMaterialSections); root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.principledMaterialSections);
break; break;
case "SpecularGlossyMaterial":
root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.specularGlossyMaterialSections);
break;
case "CustomMaterial": case "CustomMaterial":
root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.customMaterialSections); root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.customMaterialSections);
break; break;

View File

@@ -401,6 +401,7 @@ Item {
ListElement { name: "Qt 5.15" } ListElement { name: "Qt 5.15" }
ListElement { name: "Qt 6.2" } ListElement { name: "Qt 6.2" }
ListElement { name: "Qt 6.3" } ListElement { name: "Qt 6.3" }
ListElement { name: "Qt 6.4" }
} }
onActivated: (index) => { onActivated: (index) => {

View File

@@ -50,10 +50,19 @@ Item {
Connections { Connections {
target: Controller target: Controller
function onCollapseAll() { function onCollapseAll() {
if (collapsible) if (collapsible) {
section.expanded = false if (section.expandOnClick)
section.expanded = false
else
section.collapse()
}
}
function onExpandAll() {
if (section.expandOnClick)
section.expanded = true
else
section.expand()
} }
function onExpandAll() { section.expanded = true }
} }
signal drop(var drag) signal drop(var drag)
@@ -61,6 +70,8 @@ Item {
signal dropExit() signal dropExit()
signal showContextMenu() signal showContextMenu()
signal toggleExpand() signal toggleExpand()
signal expand()
signal collapse()
DropArea { DropArea {
id: dropArea id: dropArea

View File

@@ -49,126 +49,128 @@ QtObject {
readonly property string centerHorizontal: "\u0042" readonly property string centerHorizontal: "\u0042"
readonly property string centerVertical: "\u0043" readonly property string centerVertical: "\u0043"
readonly property string closeCross: "\u0044" readonly property string closeCross: "\u0044"
readonly property string colorPopupClose: "\u0045" readonly property string closeLink: "\u0045"
readonly property string columnsAndRows: "\u0046" readonly property string colorPopupClose: "\u0046"
readonly property string copyStyle: "\u0047" readonly property string columnsAndRows: "\u0047"
readonly property string cornerA: "\u0048" readonly property string copyLink: "\u0048"
readonly property string cornerB: "\u0049" readonly property string copyStyle: "\u0049"
readonly property string cornersAll: "\u004A" readonly property string cornerA: "\u004A"
readonly property string curveDesigner: "\u004B" readonly property string cornerB: "\u004B"
readonly property string curveEditor: "\u004C" readonly property string cornersAll: "\u004C"
readonly property string customMaterialEditor: "\u004D" readonly property string curveDesigner: "\u004D"
readonly property string decisionNode: "\u004E" readonly property string curveEditor: "\u004E"
readonly property string deleteColumn: "\u004F" readonly property string customMaterialEditor: "\u004F"
readonly property string deleteMaterial: "\u0050" readonly property string decisionNode: "\u0050"
readonly property string deleteRow: "\u0051" readonly property string deleteColumn: "\u0051"
readonly property string deleteTable: "\u0052" readonly property string deleteMaterial: "\u0052"
readonly property string detach: "\u0053" readonly property string deleteRow: "\u0053"
readonly property string distributeBottom: "\u0054" readonly property string deleteTable: "\u0054"
readonly property string distributeCenterHorizontal: "\u0055" readonly property string detach: "\u0055"
readonly property string distributeCenterVertical: "\u0056" readonly property string distributeBottom: "\u0056"
readonly property string distributeLeft: "\u0057" readonly property string distributeCenterHorizontal: "\u0057"
readonly property string distributeOriginBottomRight: "\u0058" readonly property string distributeCenterVertical: "\u0058"
readonly property string distributeOriginCenter: "\u0059" readonly property string distributeLeft: "\u0059"
readonly property string distributeOriginNone: "\u005A" readonly property string distributeOriginBottomRight: "\u005A"
readonly property string distributeOriginTopLeft: "\u005B" readonly property string distributeOriginCenter: "\u005B"
readonly property string distributeRight: "\u005C" readonly property string distributeOriginNone: "\u005C"
readonly property string distributeSpacingHorizontal: "\u005D" readonly property string distributeOriginTopLeft: "\u005D"
readonly property string distributeSpacingVertical: "\u005E" readonly property string distributeRight: "\u005E"
readonly property string distributeTop: "\u005F" readonly property string distributeSpacingHorizontal: "\u005F"
readonly property string download: "\u0060" readonly property string distributeSpacingVertical: "\u0060"
readonly property string downloadUnavailable: "\u0061" readonly property string distributeTop: "\u0061"
readonly property string downloadUpdate: "\u0062" readonly property string download: "\u0062"
readonly property string downloaded: "\u0063" readonly property string downloadUnavailable: "\u0063"
readonly property string edit: "\u0064" readonly property string downloadUpdate: "\u0064"
readonly property string eyeDropper: "\u0065" readonly property string downloaded: "\u0065"
readonly property string favorite: "\u0066" readonly property string edit: "\u0066"
readonly property string flowAction: "\u0067" readonly property string eyeDropper: "\u0067"
readonly property string flowTransition: "\u0068" readonly property string favorite: "\u0068"
readonly property string fontStyleBold: "\u0069" readonly property string flowAction: "\u0069"
readonly property string fontStyleItalic: "\u006A" readonly property string flowTransition: "\u006A"
readonly property string fontStyleStrikethrough: "\u006B" readonly property string fontStyleBold: "\u006B"
readonly property string fontStyleUnderline: "\u006C" readonly property string fontStyleItalic: "\u006C"
readonly property string gradient: "\u006D" readonly property string fontStyleStrikethrough: "\u006D"
readonly property string gridView: "\u006E" readonly property string fontStyleUnderline: "\u006E"
readonly property string idAliasOff: "\u006F" readonly property string gradient: "\u006F"
readonly property string idAliasOn: "\u0070" readonly property string gridView: "\u0070"
readonly property string imported: "\u0071" readonly property string idAliasOff: "\u0071"
readonly property string infinity: "\u0072" readonly property string idAliasOn: "\u0072"
readonly property string keyframe: "\u0073" readonly property string infinity: "\u0073"
readonly property string linkTriangle: "\u0074" readonly property string keyframe: "\u0074"
readonly property string linked: "\u0075" readonly property string linkTriangle: "\u0075"
readonly property string listView: "\u0076" readonly property string linked: "\u0076"
readonly property string lockOff: "\u0077" readonly property string listView: "\u0077"
readonly property string lockOn: "\u0078" readonly property string lockOff: "\u0078"
readonly property string materialPreviewEnvironment: "\u0079" readonly property string lockOn: "\u0079"
readonly property string materialPreviewModel: "\u007A" readonly property string materialPreviewEnvironment: "\u007A"
readonly property string mergeCells: "\u007B" readonly property string materialPreviewModel: "\u007B"
readonly property string minus: "\u007C" readonly property string mergeCells: "\u007C"
readonly property string mirror: "\u007D" readonly property string minus: "\u007D"
readonly property string newMaterial: "\u007E" readonly property string mirror: "\u007E"
readonly property string openMaterialBrowser: "\u007F" readonly property string newMaterial: "\u007F"
readonly property string orientation: "\u0080" readonly property string openLink: "\u0080"
readonly property string paddingEdge: "\u0081" readonly property string openMaterialBrowser: "\u0081"
readonly property string paddingFrame: "\u0082" readonly property string orientation: "\u0082"
readonly property string pasteStyle: "\u0083" readonly property string paddingEdge: "\u0083"
readonly property string pause: "\u0084" readonly property string paddingFrame: "\u0084"
readonly property string pin: "\u0085" readonly property string pasteStyle: "\u0085"
readonly property string play: "\u0086" readonly property string pause: "\u0086"
readonly property string plus: "\u0087" readonly property string pin: "\u0087"
readonly property string promote: "\u0088" readonly property string play: "\u0088"
readonly property string readOnly: "\u0089" readonly property string plus: "\u0089"
readonly property string redo: "\u008A" readonly property string promote: "\u008A"
readonly property string rotationFill: "\u008B" readonly property string readOnly: "\u008B"
readonly property string rotationOutline: "\u008C" readonly property string redo: "\u008C"
readonly property string search: "\u008D" readonly property string rotationFill: "\u008D"
readonly property string sectionToggle: "\u008E" readonly property string rotationOutline: "\u008E"
readonly property string splitColumns: "\u008F" readonly property string search: "\u008F"
readonly property string splitRows: "\u0090" readonly property string sectionToggle: "\u0090"
readonly property string startNode: "\u0091" readonly property string splitColumns: "\u0091"
readonly property string testIcon: "\u0092" readonly property string splitRows: "\u0092"
readonly property string textAlignBottom: "\u0093" readonly property string startNode: "\u0093"
readonly property string textAlignCenter: "\u0094" readonly property string testIcon: "\u0094"
readonly property string textAlignJustified: "\u0095" readonly property string textAlignBottom: "\u0095"
readonly property string textAlignLeft: "\u0096" readonly property string textAlignCenter: "\u0096"
readonly property string textAlignMiddle: "\u0097" readonly property string textAlignJustified: "\u0097"
readonly property string textAlignRight: "\u0098" readonly property string textAlignLeft: "\u0098"
readonly property string textAlignTop: "\u0099" readonly property string textAlignMiddle: "\u0099"
readonly property string textBulletList: "\u009A" readonly property string textAlignRight: "\u009A"
readonly property string textFullJustification: "\u009B" readonly property string textAlignTop: "\u009B"
readonly property string textNumberedList: "\u009D" readonly property string textBulletList: "\u009D"
readonly property string tickIcon: "\u009E" readonly property string textFullJustification: "\u009E"
readonly property string translationCreateFiles: "\u009F" readonly property string textNumberedList: "\u009F"
readonly property string translationCreateReport: "\u00A0" readonly property string tickIcon: "\u00A0"
readonly property string translationExport: "\u00A1" readonly property string translationCreateFiles: "\u00A1"
readonly property string translationImport: "\u00A2" readonly property string translationCreateReport: "\u00A2"
readonly property string translationSelectLanguages: "\u00A3" readonly property string translationExport: "\u00A3"
readonly property string translationTest: "\u00A4" readonly property string translationImport: "\u00A4"
readonly property string transparent: "\u00A5" readonly property string translationSelectLanguages: "\u00A5"
readonly property string triState: "\u00A6" readonly property string translationTest: "\u00A6"
readonly property string triangleArcA: "\u00A7" readonly property string transparent: "\u00A7"
readonly property string triangleArcB: "\u00A8" readonly property string triState: "\u00A8"
readonly property string triangleCornerA: "\u00A9" readonly property string triangleArcA: "\u00A9"
readonly property string triangleCornerB: "\u00AA" readonly property string triangleArcB: "\u00AA"
readonly property string unLinked: "\u00AB" readonly property string triangleCornerA: "\u00AB"
readonly property string undo: "\u00AC" readonly property string triangleCornerB: "\u00AC"
readonly property string unpin: "\u00AE" readonly property string unLinked: "\u00AE"
readonly property string upDownIcon: "\u00AF" readonly property string undo: "\u00AF"
readonly property string upDownSquare2: "\u00B0" readonly property string unpin: "\u00B0"
readonly property string visibilityOff: "\u00B1" readonly property string upDownIcon: "\u00B1"
readonly property string visibilityOn: "\u00B2" readonly property string upDownSquare2: "\u00B2"
readonly property string wildcard: "\u00B3" readonly property string visibilityOff: "\u00B3"
readonly property string wizardsAutomotive: "\u00B4" readonly property string visibilityOn: "\u00B4"
readonly property string wizardsDesktop: "\u00B5" readonly property string wildcard: "\u00B5"
readonly property string wizardsGeneric: "\u00B6" readonly property string wizardsAutomotive: "\u00B6"
readonly property string wizardsMcuEmpty: "\u00B7" readonly property string wizardsDesktop: "\u00B7"
readonly property string wizardsMcuGraph: "\u00B8" readonly property string wizardsGeneric: "\u00B8"
readonly property string wizardsMobile: "\u00B9" readonly property string wizardsMcuEmpty: "\u00B9"
readonly property string wizardsUnknown: "\u00BA" readonly property string wizardsMcuGraph: "\u00BA"
readonly property string zoomAll: "\u00BB" readonly property string wizardsMobile: "\u00BB"
readonly property string zoomIn: "\u00BC" readonly property string wizardsUnknown: "\u00BC"
readonly property string zoomOut: "\u00BD" readonly property string zoomAll: "\u00BD"
readonly property string zoomSelection: "\u00BE" readonly property string zoomIn: "\u00BE"
readonly property string zoomOut: "\u00BF"
readonly property string zoomSelection: "\u00C0"
readonly property font iconFont: Qt.font({ readonly property font iconFont: Qt.font({
"family": controlIcons.name, "family": controlIcons.name,

View File

@@ -264,6 +264,14 @@
'TargetQuickVersion': '6.3', 'TargetQuickVersion': '6.3',
'TargetQuick3DVersion': '6.3' 'TargetQuick3DVersion': '6.3'
})" })"
},
{
"trKey": "Qt 6.4",
"value":
"({
'TargetQuickVersion': '6.4',
'TargetQuick3DVersion': '6.4'
})"
} }
] ]
} }

View File

@@ -1,6 +1,6 @@
cmake_minimum_required (VERSION 3.15) cmake_minimum_required (VERSION 3.15)
project(%{ProjectName} VERSION 0.0.1 LANGUAGES C CXX ASM ASM_MASM) project(%{ProjectName} VERSION 0.0.1 LANGUAGES C CXX ASM)
if (NOT TARGET Qul::Core) if (NOT TARGET Qul::Core)
find_package(Qul) find_package(Qul)

View File

@@ -261,6 +261,13 @@
"({ "({
'TargetQuickVersion': '6.3' 'TargetQuickVersion': '6.3'
})" })"
},
{
"trKey": "Qt 6.4",
"value":
"({
'TargetQuickVersion': '6.4'
})"
} }
] ]
} }

View File

@@ -71,6 +71,7 @@ Project {
Environment { Environment {
QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf"
QT_AUTO_SCREEN_SCALE_FACTOR: "1" QT_AUTO_SCREEN_SCALE_FACTOR: "1"
QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT: "1"
@if %{IsQt6Project} @if %{IsQt6Project}
@else @else
QMLSCENE_CORE_PROFILE: "true" // Required for macOS, but can create issues on embedded Linux QMLSCENE_CORE_PROFILE: "true" // Required for macOS, but can create issues on embedded Linux
@@ -99,7 +100,7 @@ Project {
/* Required for deployment */ /* Required for deployment */
targetDirectory: "/opt/%{ProjectName}" targetDirectory: "/opt/%{ProjectName}"
qdsVersion: "3.7" qdsVersion: "3.8"
quickVersion: "%{QtQuickVersion}" quickVersion: "%{QtQuickVersion}"

View File

@@ -15,4 +15,5 @@ void set_qt_environment()
qputenv("QT_ENABLE_HIGHDPI_SCALING", "0"); qputenv("QT_ENABLE_HIGHDPI_SCALING", "0");
qputenv("QT_LOGGING_RULES", "qt.qml.connections=false"); qputenv("QT_LOGGING_RULES", "qt.qml.connections=false");
qputenv("QT_QUICK_CONTROLS_CONF", ":/qtquickcontrols2.conf"); qputenv("QT_QUICK_CONTROLS_CONF", ":/qtquickcontrols2.conf");
qputenv("QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT", "1");
} }

View File

@@ -259,6 +259,13 @@
"({ "({
'TargetQuickVersion': '6.3' 'TargetQuickVersion': '6.3'
})" })"
},
{
"trKey": "Qt 6.4",
"value":
"({
'TargetQuickVersion': '6.4'
})"
} }
] ]
} }

View File

@@ -18,6 +18,8 @@
{ "key": "ProjectPluginClassName", "value": "%{ProjectName}Plugin" }, { "key": "ProjectPluginClassName", "value": "%{ProjectName}Plugin" },
{ "key": "QmlProjectFileName", "value": "%{JS: Util.fileName('%{ProjectName}', 'qmlproject')}" }, { "key": "QmlProjectFileName", "value": "%{JS: Util.fileName('%{ProjectName}', 'qmlproject')}" },
{ "key": "ImportModuleName", "value": "%{ProjectName}" }, { "key": "ImportModuleName", "value": "%{ProjectName}" },
{ "key": "UIClassName", "value": "Screen01" },
{ "key": "UIClassFileName", "value": "%{JS: Util.fileName('%{UIClassName}', 'ui.qml')}" },
{ "key": "IsQt6Project", "value": "%{JS: value('QtQuickVersion') !== '2.15' }" }, { "key": "IsQt6Project", "value": "%{JS: value('QtQuickVersion') !== '2.15' }" },
{ "key": "QtQuickVersion", "value": "%{JS: %{TargetQtVersion}.TargetQuickVersion}" }, { "key": "QtQuickVersion", "value": "%{JS: %{TargetQtVersion}.TargetQuickVersion}" },
{ "key": "QtQuickFeature", "value": "QtSupport.Wizards.FeatureQtQuick.%{QtQuickVersion}" }, { "key": "QtQuickFeature", "value": "QtSupport.Wizards.FeatureQtQuick.%{QtQuickVersion}" },
@@ -216,6 +218,13 @@
"({ "({
'TargetQuickVersion': '6.3' 'TargetQuickVersion': '6.3'
})" })"
},
{
"trKey": "Qt 6.4",
"value":
"({
'TargetQuickVersion': '6.4'
})"
} }
] ]
} }

View File

@@ -216,6 +216,13 @@
"({ "({
'TargetQuickVersion': '6.3' 'TargetQuickVersion': '6.3'
})" })"
},
{
"trKey": "Qt 6.4",
"value":
"({
'TargetQuickVersion': '6.4'
})"
} }
] ]
} }

View File

@@ -216,6 +216,13 @@
"({ "({
'TargetQuickVersion': '6.3' 'TargetQuickVersion': '6.3'
})" })"
},
{
"trKey": "Qt 6.4",
"value":
"({
'TargetQuickVersion': '6.4'
})"
} }
] ]
} }

View File

@@ -0,0 +1,40 @@
{
"version": 1,
"supportedProjectTypes": [ ],
"id": "J.QEP",
"category": "U.QEP",
"trDescription": "Creates an Effect Maker file.",
"trDisplayName": "Effect File (Effect Maker)",
"trDisplayCategory": "Effects",
"iconText": "qep",
"platformIndependent": true,
"enabled": true,
"options": { "key": "DefaultSuffix", "value": "qep" },
"pages" :
[
{
"trDisplayName": "Location",
"trShortTitle": "Location",
"typeId": "File"
},
{
"trDisplayName": "Project Management",
"trShortTitle": "Summary",
"typeId": "Summary"
}
],
"generators" :
[
{
"typeId": "File",
"data":
{
"source": "file.qep",
"target": "%{JS: Util.fileName(value('TargetPath'), value('DefaultSuffix'))}",
"openInEditor": false
}
}
]
}

View File

@@ -14619,46 +14619,6 @@ Další podrobnosti hledejte v /etc/sysctl.d/10-ptrace.conf
</context> </context>
<context> <context>
<name>TextEditor::DisplaySettingsPage</name> <name>TextEditor::DisplaySettingsPage</name>
<message>
<source>Display</source>
<translation type="obsolete">Zobrazení</translation>
</message>
<message>
<source>Display line &amp;numbers</source>
<translation type="obsolete">&amp;Zobrazit čísla řádků</translation>
</message>
<message>
<source>Display &amp;folding markers</source>
<translation type="obsolete">Zobrazit znaky s&amp;kládání kódu</translation>
</message>
<message>
<source>Show tabs and spaces.</source>
<translation type="obsolete">Ukázat zarážky a prázdné znaky (mezery).</translation>
</message>
<message>
<source>&amp;Visualize whitespace</source>
<translation type="obsolete">&amp;Zviditelnit prázdné znaky</translation>
</message>
<message>
<source>Highlight current &amp;line</source>
<translation type="obsolete">Zvýraznit nynější řá&amp;dek</translation>
</message>
<message>
<source>Text Wrapping</source>
<translation type="obsolete">Zalomení textu</translation>
</message>
<message>
<source>Enable text &amp;wrapping</source>
<translation type="obsolete">Povolit &amp;zalomení textu</translation>
</message>
<message>
<source>Display right &amp;margin at column:</source>
<translation type="obsolete">Zobrazit pravý &amp;okraj sloupce:</translation>
</message>
<message>
<source>Highlight &amp;blocks</source>
<translation type="obsolete">Zvýraznit &amp;bloky</translation>
</message>
<message> <message>
<source>Animate matching parentheses</source> <source>Animate matching parentheses</source>
<translation type="obsolete">Rozhýbat odpovídající závorky</translation> <translation type="obsolete">Rozhýbat odpovídající závorky</translation>
@@ -14675,22 +14635,6 @@ Další podrobnosti hledejte v /etc/sysctl.d/10-ptrace.conf
<source>Mark text changes</source> <source>Mark text changes</source>
<translation type="obsolete">Vyznačit textové změny</translation> <translation type="obsolete">Vyznačit textové změny</translation>
</message> </message>
<message>
<source>Mark &amp;text changes</source>
<translation type="obsolete">Vyznačit &amp;textové změny</translation>
</message>
<message>
<source>&amp;Animate matching parentheses</source>
<translation type="obsolete">&amp;Rozhýbat odpovídající závorky</translation>
</message>
<message>
<source>Auto-fold first &amp;comment</source>
<translation type="obsolete">Automaticky složit první po&amp;známku</translation>
</message>
<message>
<source>Center &amp;cursor on scroll</source>
<translation type="obsolete">Při projíždění držet &amp;ukazovátko vprostřed</translation>
</message>
</context> </context>
<context> <context>
<name>TextEditor::FontSettingsPage</name> <name>TextEditor::FontSettingsPage</name>
@@ -30795,14 +30739,6 @@ Určuje, jak se chová zpětná klávesa (backspace) co se týče odsazování.
</context> </context>
<context> <context>
<name>TextEditor::TabSettingsWidget</name> <name>TextEditor::TabSettingsWidget</name>
<message>
<source>Form</source>
<translation type="obsolete">Formulář</translation>
</message>
<message>
<source>Tabs And Indentation</source>
<translation type="obsolete">Zarážky a odsazení</translation>
</message>
<message> <message>
<source>Insert &amp;spaces instead of tabs</source> <source>Insert &amp;spaces instead of tabs</source>
<translation type="obsolete">Vložit místo zarážek prázdné &amp;znaky (mezery)</translation> <translation type="obsolete">Vložit místo zarážek prázdné &amp;znaky (mezery)</translation>
@@ -30815,14 +30751,6 @@ Určuje, jak se chová zpětná klávesa (backspace) co se týče odsazování.
<source>Based on the surrounding lines</source> <source>Based on the surrounding lines</source>
<translation type="obsolete">Založeno na okolních řádcích</translation> <translation type="obsolete">Založeno na okolních řádcích</translation>
</message> </message>
<message>
<source>Ta&amp;b size:</source>
<translation type="obsolete">Šířka &amp;zarážky:</translation>
</message>
<message>
<source>&amp;Indent size:</source>
<translation type="obsolete">&amp;Velikost odsazení:</translation>
</message>
<message> <message>
<source>Enable automatic &amp;indentation</source> <source>Enable automatic &amp;indentation</source>
<translation type="obsolete">Povolit automatické &amp;odsazení</translation> <translation type="obsolete">Povolit automatické &amp;odsazení</translation>
@@ -30835,74 +30763,6 @@ Určuje, jak se chová zpětná klávesa (backspace) co se týče odsazování.
<source>&amp;Backspace follows indentation</source> <source>&amp;Backspace follows indentation</source>
<translation type="obsolete">&amp;Zpětná klávesa sleduje hloubku odsazení</translation> <translation type="obsolete">&amp;Zpětná klávesa sleduje hloubku odsazení</translation>
</message> </message>
<message>
<source>Align continuation lines:</source>
<translation type="obsolete">Zarovnání navazujících řádků:</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;
Influences the indentation of continuation lines.
&lt;ul&gt;
&lt;li&gt;Not At All: Do not align at all. Lines will only be indented to the current logical indentation depth.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;With Spaces: Always use spaces for alignment, regardless of the other indentation settings.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;With Regular Indent: Use tabs and/or spaces for alignment, as configured above.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)(tab)(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="obsolete">&lt;html&gt;&lt;head/&gt;&lt;body&gt;
Určuje chování odsazení se zřetelem k navazujícím řádkům.
&lt;ul&gt;
&lt;li&gt;Žádné odsazení: Žádné odsazení dodatečně k logickému odsazení.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Prázdné znaky: Dodatečné odsazení pomocí prázdných znaků.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Normální odsazení: Používají se zarážky nebo prázdné znaky odpovídající hořejšímu nastavení.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)(tab)(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Not At All</source>
<translation type="obsolete">Žádné odsazení</translation>
</message>
<message>
<source>With Spaces</source>
<translation type="obsolete">Prázdné znaky</translation>
</message>
<message>
<source>With Regular Indent</source>
<translation type="obsolete">Normální odsazení</translation>
</message>
<message> <message>
<source>Tab key performs auto-indent:</source> <source>Tab key performs auto-indent:</source>
<translation type="obsolete">Klávesa pro zarážku provede automatické odsazení:</translation> <translation type="obsolete">Klávesa pro zarážku provede automatické odsazení:</translation>
@@ -30919,22 +30779,6 @@ Určuje chování odsazení se zřetelem k navazujícím řádkům.
<source>In Leading White Space</source> <source>In Leading White Space</source>
<translation type="obsolete">Pouze v prázdném místu na začátku řádku</translation> <translation type="obsolete">Pouze v prázdném místu na začátku řádku</translation>
</message> </message>
<message>
<source>Tab policy:</source>
<translation type="obsolete">Chování zarážek:</translation>
</message>
<message>
<source>Spaces Only</source>
<translation type="obsolete">Pouze mezery</translation>
</message>
<message>
<source>Tabs Only</source>
<translation type="obsolete">Pouze zarážky</translation>
</message>
<message>
<source>Mixed</source>
<translation type="obsolete">Smíchaně</translation>
</message>
</context> </context>
<context> <context>
<name>Valgrind</name> <name>Valgrind</name>

View File

@@ -47228,10 +47228,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e
</context> </context>
<context> <context>
<name>TextEditor::DisplaySettingsPage</name> <name>TextEditor::DisplaySettingsPage</name>
<message>
<source>Display</source>
<translation>Anzeige</translation>
</message>
</context> </context>
<context> <context>
<name>Todo</name> <name>Todo</name>
@@ -47474,10 +47470,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e
<source>Are you sure you want to delete this color scheme permanently?</source> <source>Are you sure you want to delete this color scheme permanently?</source>
<translation>Möchten Sie das Farbschema löschen?</translation> <translation>Möchten Sie das Farbschema löschen?</translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Löschen</translation>
</message>
<message> <message>
<source>Color Scheme Changed</source> <source>Color Scheme Changed</source>
<translation>Farbschema geändert</translation> <translation>Farbschema geändert</translation>

View File

@@ -15872,50 +15872,10 @@ Influence l&apos;indentation des lignes de continuation.
</context> </context>
<context> <context>
<name>TextEditor::DisplaySettingsPage</name> <name>TextEditor::DisplaySettingsPage</name>
<message>
<source>Display</source>
<translation type="obsolete">Affichage</translation>
</message>
<message>
<source>Display line &amp;numbers</source>
<translation type="obsolete">Afficher les &amp;numéros de ligne</translation>
</message>
<message>
<source>Display &amp;folding markers</source>
<translation type="obsolete">Affiche les marqueurs de &amp;pliage</translation>
</message>
<message>
<source>Show tabs and spaces.</source>
<translation type="obsolete">Afficher les tabulations et espaces.</translation>
</message>
<message>
<source>&amp;Visualize whitespace</source>
<translation type="obsolete">&amp;Visualiser les espaces</translation>
</message>
<message>
<source>Highlight current &amp;line</source>
<translation type="obsolete">Surligner la &amp;ligne courante</translation>
</message>
<message>
<source>Highlight &amp;blocks</source>
<translation type="obsolete">Surligner les &amp;blocs</translation>
</message>
<message> <message>
<source>Animate matching parentheses</source> <source>Animate matching parentheses</source>
<translation type="obsolete">Animer les parenthèses correspondantes</translation> <translation type="obsolete">Animer les parenthèses correspondantes</translation>
</message> </message>
<message>
<source>Text Wrapping</source>
<translation type="obsolete">Retour à la ligne dynamique</translation>
</message>
<message>
<source>Enable text &amp;wrapping</source>
<translation type="obsolete">Activer le &amp;retour à la ligne automatique</translation>
</message>
<message>
<source>Display right &amp;margin at column:</source>
<translation type="obsolete">Afficher une &amp;marge à la colonne :</translation>
</message>
<message> <message>
<source>Navigation</source> <source>Navigation</source>
<translation type="obsolete">Navigation</translation> <translation type="obsolete">Navigation</translation>
@@ -15929,24 +15889,6 @@ Influence l&apos;indentation des lignes de continuation.
<translatorcomment>Put a red mark next to the text that has been modified since the last save</translatorcomment> <translatorcomment>Put a red mark next to the text that has been modified since the last save</translatorcomment>
<translation type="obsolete">Marquer le texte modifié</translation> <translation type="obsolete">Marquer le texte modifié</translation>
</message> </message>
<message>
<source>Mark &amp;text changes</source>
<translation type="obsolete">Marquer les modifications de &amp;texte</translation>
</message>
<message>
<source>&amp;Animate matching parentheses</source>
<translation type="obsolete">&amp;Animer les parenthèses correspondantes</translation>
</message>
<message>
<source>Auto-fold first &amp;comment</source>
<translatorcomment>reformulation à l&apos;infinitif
francis : en effet, une erreur de ma part --&gt; validé.</translatorcomment>
<translation type="obsolete">Replier automatiquement le premier &amp;commentaire</translation>
</message>
<message>
<source>Center &amp;cursor on scroll</source>
<translation type="obsolete">Centrer le &amp;curseur sur le barre de défilement</translation>
</message>
</context> </context>
<context> <context>
<name>TextEditor::FontSettingsPage</name> <name>TextEditor::FontSettingsPage</name>
@@ -37242,14 +37184,6 @@ Ils requièrent Qt 4.7.4 ou supérieur et l&apos;ensemble de composants install
</context> </context>
<context> <context>
<name>TextEditor::TabSettingsWidget</name> <name>TextEditor::TabSettingsWidget</name>
<message>
<source>Form</source>
<translation type="obsolete">Formulaire</translation>
</message>
<message>
<source>Tabs And Indentation</source>
<translation type="obsolete">Tabulation et indentation</translation>
</message>
<message> <message>
<source>Insert &amp;spaces instead of tabs</source> <source>Insert &amp;spaces instead of tabs</source>
<translation type="obsolete">Insérer des e&amp;spaces au lieu de tabulations</translation> <translation type="obsolete">Insérer des e&amp;spaces au lieu de tabulations</translation>
@@ -37262,14 +37196,6 @@ Ils requièrent Qt 4.7.4 ou supérieur et l&apos;ensemble de composants install
<source>Based on the surrounding lines</source> <source>Based on the surrounding lines</source>
<translation type="obsolete">Basé sur les lignes environnantes</translation> <translation type="obsolete">Basé sur les lignes environnantes</translation>
</message> </message>
<message>
<source>Ta&amp;b size:</source>
<translation type="obsolete">Taille de ta&amp;bulation : </translation>
</message>
<message>
<source>&amp;Indent size:</source>
<translation type="obsolete">Taille de l&apos;&amp;indentation : </translation>
</message>
<message> <message>
<source>Enable automatic &amp;indentation</source> <source>Enable automatic &amp;indentation</source>
<translation type="obsolete">Activer l&apos;&amp;indentation automatique</translation> <translation type="obsolete">Activer l&apos;&amp;indentation automatique</translation>
@@ -37282,71 +37208,6 @@ Ils requièrent Qt 4.7.4 ou supérieur et l&apos;ensemble de composants install
<source>&amp;Backspace follows indentation</source> <source>&amp;Backspace follows indentation</source>
<translation type="obsolete">La touche &amp;retour arrière suit l&apos;indentation</translation> <translation type="obsolete">La touche &amp;retour arrière suit l&apos;indentation</translation>
</message> </message>
<message>
<source>Align continuation lines:</source>
<translation type="obsolete">Aligner les lignes de continuation : </translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;
Influences the indentation of continuation lines.
&lt;ul&gt;
&lt;li&gt;Not At All: Do not align at all. Lines will only be indented to the current logical indentation depth.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;With Spaces: Always use spaces for alignment, regardless of the other indentation settings.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;With Regular Indent: Use tabs and/or spaces for alignment, as configured above.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)(tab)(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="obsolete">&lt;html&gt;&lt;head/&gt;&lt;body&gt;
Influence l&apos;indentation des lignes de continuation.
&lt;ul&gt;
&lt;li&gt;Pas du tout : ne pas aligner. Les lignes ne seront indentées jusqu&apos;à la profondeur d&apos;indentation logique.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Avec espaces : toujours utiliser des espaces pour l&apos;alignement, sans tenir compte des autres paramètres d&apos;indentation.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Avec indentation régulière : utiliser des tabulations et/ou des espaces pour l&apos;alignement, en fonction de la configuration.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)(tab)(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Not At All</source>
<translation type="obsolete">Pas du tout</translation>
</message>
<message>
<source>With Spaces</source>
<translation type="obsolete">Avec espaces</translation>
</message>
<message>
<source>With Regular Indent</source>
<translation type="obsolete">Avec indentation régulière</translation>
</message>
<message> <message>
<source>Tab key performs auto-indent:</source> <source>Tab key performs auto-indent:</source>
<translation type="obsolete">La touche tabulation active l&apos;identation automatique : </translation> <translation type="obsolete">La touche tabulation active l&apos;identation automatique : </translation>
@@ -37363,22 +37224,6 @@ Influence l&apos;indentation des lignes de continuation.
<source>In Leading White Space</source> <source>In Leading White Space</source>
<translation type="obsolete">En début de ligne uniquement</translation> <translation type="obsolete">En début de ligne uniquement</translation>
</message> </message>
<message>
<source>Tab policy:</source>
<translation type="obsolete">Politique de tabulation :</translation>
</message>
<message>
<source>Spaces Only</source>
<translation type="obsolete">Espaces seulement</translation>
</message>
<message>
<source>Tabs Only</source>
<translation type="obsolete">Tabulation seulement</translation>
</message>
<message>
<source>Mixed</source>
<translation type="obsolete">Mixte</translation>
</message>
</context> </context>
<context> <context>
<name>Valgrind</name> <name>Valgrind</name>
@@ -43644,6 +43489,8 @@ Specifie comment retour arrière se comporte avec l&apos;indentation.
</message> </message>
<message> <message>
<source>Auto-fold first &amp;comment</source> <source>Auto-fold first &amp;comment</source>
<translatorcomment>reformulation à l&apos;infinitif
francis : en effet, une erreur de ma part --&gt; validé.</translatorcomment>
<translation>Replier automatiquement le premier &amp;commentaire</translation> <translation>Replier automatiquement le premier &amp;commentaire</translation>
</message> </message>
<message> <message>

View File

@@ -52042,10 +52042,6 @@ Row: %4, Column: %5
</context> </context>
<context> <context>
<name>TextEditor::DisplaySettingsPage</name> <name>TextEditor::DisplaySettingsPage</name>
<message>
<source>Display</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>TextEditor::FontSettingsPageWidget</name> <name>TextEditor::FontSettingsPageWidget</name>

View File

@@ -46346,10 +46346,6 @@ In addition, Shift+Enter inserts an escape character at the cursor position and
</context> </context>
<context> <context>
<name>TextEditor::DisplaySettingsPage</name> <name>TextEditor::DisplaySettingsPage</name>
<message>
<source>Display</source>
<translation>Отображение</translation>
</message>
<message> <message>
<source>Display line &amp;numbers</source> <source>Display line &amp;numbers</source>
<translation>Показывать &amp;номера строк</translation> <translation>Показывать &amp;номера строк</translation>
@@ -46499,10 +46495,6 @@ In addition, Shift+Enter inserts an escape character at the cursor position and
<source>Color Scheme</source> <source>Color Scheme</source>
<translation>Цветовая схема</translation> <translation>Цветовая схема</translation>
</message> </message>
<message>
<source>Delete</source>
<translation>Удалить</translation>
</message>
<message> <message>
<source>Copy...</source> <source>Copy...</source>
<translation>Копировать...</translation> <translation>Копировать...</translation>

View File

@@ -14944,46 +14944,6 @@ Influences the indentation of continuation lines.
</context> </context>
<context> <context>
<name>TextEditor::DisplaySettingsPage</name> <name>TextEditor::DisplaySettingsPage</name>
<message>
<source>Display</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>Display line &amp;numbers</source>
<translation type="obsolete">(&amp;N)</translation>
</message>
<message>
<source>Display &amp;folding markers</source>
<translation type="obsolete">(&amp;F)</translation>
</message>
<message>
<source>Show tabs and spaces.</source>
<translation type="obsolete">.</translation>
</message>
<message>
<source>&amp;Visualize whitespace</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>Highlight current &amp;line</source>
<translation type="obsolete">(&amp;L)</translation>
</message>
<message>
<source>Text Wrapping</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>Enable text &amp;wrapping</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>Display right &amp;margin at column:</source>
<translation type="obsolete">(&amp;M):</translation>
</message>
<message>
<source>Highlight &amp;blocks</source>
<translation type="obsolete">(&amp;B)</translation>
</message>
<message> <message>
<source>Animate matching parentheses</source> <source>Animate matching parentheses</source>
<translation type="obsolete"></translation> <translation type="obsolete"></translation>
@@ -15000,22 +14960,6 @@ Influences the indentation of continuation lines.
<source>Mark text changes</source> <source>Mark text changes</source>
<translation type="obsolete"></translation> <translation type="obsolete"></translation>
</message> </message>
<message>
<source>Mark &amp;text changes</source>
<translation type="obsolete">(&amp;T)</translation>
</message>
<message>
<source>&amp;Animate matching parentheses</source>
<translation type="obsolete">(&amp;A)</translation>
</message>
<message>
<source>Auto-fold first &amp;comment</source>
<translation type="obsolete">(&amp;C)</translation>
</message>
<message>
<source>Center &amp;cursor on scroll</source>
<translation type="obsolete">(&amp;C)</translation>
</message>
</context> </context>
<context> <context>
<name>TextEditor::FontSettingsPage</name> <name>TextEditor::FontSettingsPage</name>
@@ -35241,14 +35185,6 @@ Requires Qt 4.7.4 or newer, and the component set installed for your Qt version.
</context> </context>
<context> <context>
<name>TextEditor::TabSettingsWidget</name> <name>TextEditor::TabSettingsWidget</name>
<message>
<source>Form</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>Tabs And Indentation</source>
<translation type="obsolete"></translation>
</message>
<message> <message>
<source>Insert &amp;spaces instead of tabs</source> <source>Insert &amp;spaces instead of tabs</source>
<translation type="obsolete">(&amp;S)</translation> <translation type="obsolete">(&amp;S)</translation>
@@ -35261,14 +35197,6 @@ Requires Qt 4.7.4 or newer, and the component set installed for your Qt version.
<source>Based on the surrounding lines</source> <source>Based on the surrounding lines</source>
<translation type="obsolete"></translation> <translation type="obsolete"></translation>
</message> </message>
<message>
<source>Ta&amp;b size:</source>
<translation type="obsolete">(&amp;B):</translation>
</message>
<message>
<source>&amp;Indent size:</source>
<translation type="obsolete">(&amp;i):</translation>
</message>
<message> <message>
<source>Enable automatic &amp;indentation</source> <source>Enable automatic &amp;indentation</source>
<translation type="obsolete">(&amp;i)</translation> <translation type="obsolete">(&amp;i)</translation>
@@ -35281,74 +35209,6 @@ Requires Qt 4.7.4 or newer, and the component set installed for your Qt version.
<source>&amp;Backspace follows indentation</source> <source>&amp;Backspace follows indentation</source>
<translation type="obsolete">退(&amp;B)</translation> <translation type="obsolete">退(&amp;B)</translation>
</message> </message>
<message>
<source>Align continuation lines:</source>
<translation type="obsolete">:</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;
Influences the indentation of continuation lines.
&lt;ul&gt;
&lt;li&gt;Not At All: Do not align at all. Lines will only be indented to the current logical indentation depth.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;With Spaces: Always use spaces for alignment, regardless of the other indentation settings.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;With Regular Indent: Use tabs and/or spaces for alignment, as configured above.
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)(tab)(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="obsolete">&lt;html&gt;&lt;head/&gt;&lt;body&gt;
&lt;ul&gt;
&lt;li&gt;不对齐: 不进行对齐
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;伴随空格: 允许使用空格进行对齐
&lt;pre&gt;
(tab)int i = foo(a, b
(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;伴随规则缩进: 在原设置上使用 tab
&lt;pre&gt;
(tab)int i = foo(a, b
(tab)(tab)(tab) c, d);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Not At All</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>With Spaces</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>With Regular Indent</source>
<translation type="obsolete"></translation>
</message>
<message> <message>
<source>Never</source> <source>Never</source>
<translation type="obsolete"></translation> <translation type="obsolete"></translation>
@@ -35361,22 +35221,6 @@ Influences the indentation of continuation lines.
<source>In Leading White Space</source> <source>In Leading White Space</source>
<translation type="obsolete"></translation> <translation type="obsolete"></translation>
</message> </message>
<message>
<source>Tab policy:</source>
<translation type="obsolete">:</translation>
</message>
<message>
<source>Spaces Only</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>Tabs Only</source>
<translation type="obsolete"></translation>
</message>
<message>
<source>Mixed</source>
<translation type="obsolete"></translation>
</message>
</context> </context>
<context> <context>
<name>Valgrind</name> <name>Valgrind</name>

View File

@@ -74,10 +74,18 @@ QStringList DeviceShell::missingFeatures() const { return m_missingFeatures; }
RunResult DeviceShell::run(const CommandLine &cmd, const QByteArray &stdInData) RunResult DeviceShell::run(const CommandLine &cmd, const QByteArray &stdInData)
{ {
if (m_shellScriptState == State::NoScript) { // If the script failed to install, use QtcProcess directly instead.
// Fallback ... bool useProcess = m_shellScriptState == State::NoScript;
// Transferring large amounts of stdInData is slow via the shell script.
// Use QtcProcess directly if the size exceeds 100kb.
useProcess |= stdInData.size() > (1024 * 100);
if (useProcess) {
QtcProcess proc; QtcProcess proc;
proc.setCommand(createFallbackCommand(cmd)); const CommandLine fallbackCmd = createFallbackCommand(cmd);
qCDebug(deviceShellLog) << "Running fallback:" << fallbackCmd;
proc.setCommand(fallbackCmd);
proc.setWriteData(stdInData); proc.setWriteData(stdInData);
proc.start(); proc.start();
@@ -105,7 +113,7 @@ RunResult DeviceShell::run(const CommandLine &cmd, const QByteArray &stdInData)
.arg(id) .arg(id)
.arg(QString::fromLatin1(stdInData.toBase64())) .arg(QString::fromLatin1(stdInData.toBase64()))
.arg(cmd.toUserOutput()); .arg(cmd.toUserOutput());
qCDebug(deviceShellLog) << "Running:" << command; qCDebug(deviceShellLog) << "Running via shell:" << command;
m_shellProcess->writeRaw(command.toUtf8()); m_shellProcess->writeRaw(command.toUtf8());
}); });

View File

@@ -9,7 +9,6 @@
#include "qtcassert.h" #include "qtcassert.h"
#include "qtcprocess.h" #include "qtcprocess.h"
#include "terminalcommand.h" #include "terminalcommand.h"
#include "winutils.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QLocalServer> #include <QLocalServer>
@@ -22,17 +21,19 @@
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
# include <windows.h> #include "winutils.h"
# include <stdlib.h>
# include <cstring> #include <cstring>
#include <stdlib.h>
#include <windows.h>
#else #else
# include <sys/stat.h> #include <sys/stat.h>
# include <sys/types.h> #include <sys/types.h>
# include <errno.h> #include <errno.h>
# include <string.h> #include <string.h>
# include <unistd.h> #include <unistd.h>
#endif #endif
@@ -423,7 +424,9 @@ void TerminalImpl::sendControlSignal(ControlSignal controlSignal)
switch (controlSignal) { switch (controlSignal) {
case ControlSignal::Terminate: case ControlSignal::Terminate:
case ControlSignal::Kill: case ControlSignal::Kill:
stopProcess(); killProcess();
if (HostOsInfo::isWindowsHost())
killStub();
break; break;
case ControlSignal::Interrupt: case ControlSignal::Interrupt:
sendCommand('i'); sendCommand('i');
@@ -468,13 +471,13 @@ void TerminalImpl::killStub()
TerminateProcess(d->m_pid->hProcess, (unsigned)-1); TerminateProcess(d->m_pid->hProcess, (unsigned)-1);
WaitForSingleObject(d->m_pid->hProcess, INFINITE); WaitForSingleObject(d->m_pid->hProcess, INFINITE);
cleanupStub(); cleanupStub();
emitFinished(-1, QProcess::CrashExit);
#else #else
sendCommand('s'); sendCommand('s');
stubServerShutdown(); stubServerShutdown();
d->m_process.stop();
d->m_process.waitForFinished(); d->m_process.waitForFinished();
#endif #endif
emitFinished(-1, QProcess::CrashExit);
} }
void TerminalImpl::stopProcess() void TerminalImpl::stopProcess()
@@ -519,13 +522,13 @@ QString TerminalImpl::stubServerListen()
if (errno != EEXIST) if (errno != EEXIST)
return msgCannotCreateTempDir(stubFifoDir, QString::fromLocal8Bit(strerror(errno))); return msgCannotCreateTempDir(stubFifoDir, QString::fromLocal8Bit(strerror(errno)));
} }
const QString stubServer = stubFifoDir + QLatin1String("/stub-socket"); const QString stubServer = stubFifoDir + QLatin1String("/stub-socket");
if (!d->m_stubServer.listen(stubServer)) { if (!d->m_stubServer.listen(stubServer)) {
::rmdir(d->m_stubServerDir.constData()); ::rmdir(d->m_stubServerDir.constData());
return QtcProcess::tr("Cannot create socket \"%1\": %2") return QtcProcess::tr("Cannot create socket \"%1\": %2")
.arg(stubServer, d->m_stubServer.errorString()); .arg(stubServer, d->m_stubServer.errorString());
} }
return QString(); return {};
#endif #endif
} }

View File

@@ -253,6 +253,13 @@ void Theme::setInitialPalette(Theme *initTheme)
initialPalette(); initialPalette();
} }
void Theme::setHelpMenu(QMenu *menu)
{
#ifdef Q_OS_MACOS
Internal::setMacOSHelpMenu(menu);
#endif
}
QPalette Theme::initialPalette() QPalette Theme::initialPalette()
{ {
static QPalette palette = copyPalette(QApplication::palette()); static QPalette palette = copyPalette(QApplication::palette());

View File

@@ -9,6 +9,7 @@
#include <QObject> #include <QObject>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QMenu;
class QPalette; class QPalette;
class QSettings; class QSettings;
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -473,6 +474,8 @@ public:
static void setInitialPalette(Theme *initTheme); static void setInitialPalette(Theme *initTheme);
static void setHelpMenu(QMenu *menu);
protected: protected:
Theme(Theme *originTheme, QObject *parent = nullptr); Theme(Theme *originTheme, QObject *parent = nullptr);
ThemePrivate *d; ThemePrivate *d;

View File

@@ -3,11 +3,18 @@
#pragma once #pragma once
#include <qglobal.h>
QT_BEGIN_NAMESPACE
class QMenu;
QT_END_NAMESPACE
namespace Utils { namespace Utils {
namespace Internal { namespace Internal {
void forceMacAppearance(bool dark); void forceMacAppearance(bool dark);
bool currentAppearanceIsDark(); bool currentAppearanceIsDark();
void setMacOSHelpMenu(QMenu *menu);
} // Internal } // Internal
} // Utils } // Utils

View File

@@ -3,7 +3,7 @@
#include "theme_mac.h" #include "theme_mac.h"
#include <qglobal.h> #include <QMenu>
#include <QOperatingSystemVersion> #include <QOperatingSystemVersion>
#include <AppKit/AppKit.h> #include <AppKit/AppKit.h>
@@ -47,5 +47,10 @@ bool currentAppearanceIsDark()
return !currentAppearanceMatches(false /*==light*/); return !currentAppearanceMatches(false /*==light*/);
} }
void setMacOSHelpMenu(QMenu *menu)
{
NSApp.helpMenu = menu->toNSMenu();
}
} // Internal } // Internal
} // Utils } // Utils

View File

@@ -181,7 +181,8 @@ bool AndroidDeployQtStep::init()
} }
const QtSupport::QtVersion * const qt = QtSupport::QtKitAspect::qtVersion(kit()); const QtSupport::QtVersion * const qt = QtSupport::QtKitAspect::qtVersion(kit());
if (qt && qt->supportsMultipleQtAbis() && !selectedAbis.contains(info.cpuAbi.first())) { if (qt && qt->supportsMultipleQtAbis() && !info.cpuAbi.isEmpty() &&
!selectedAbis.contains(info.cpuAbi.first())) {
TaskHub::addTask(DeploymentTask(Task::Warning, TaskHub::addTask(DeploymentTask(Task::Warning,
Tr::tr("Android: The main ABI of the deployment device (%1) is not selected. The app " Tr::tr("Android: The main ABI of the deployment device (%1) is not selected. The app "
"execution or debugging might not work properly. Add it from Projects > Build > " "execution or debugging might not work properly. Add it from Projects > Build > "

View File

@@ -293,7 +293,11 @@ void TestCodeParser::scanForTests(const Utils::FilePaths &fileList,
qCDebug(LOG) << "File list empty (FullParse) - trying again in a sec"; qCDebug(LOG) << "File list empty (FullParse) - trying again in a sec";
emitUpdateTestTree(); emitUpdateTestTree();
return; return;
} else if (list.size() == 1 && list.first() == project->projectFilePath()) {
qCDebug(LOG) << "File list contains only the project file.";
return;
} }
qCDebug(LOG) << "setting state to FullParse (scanForTests)"; qCDebug(LOG) << "setting state to FullParse (scanForTests)";
m_parserState = FullParse; m_parserState = FullParse;
} else { } else {

View File

@@ -155,16 +155,9 @@ void TestResultDelegate::currentChanged(const QModelIndex &current, const QModel
void TestResultDelegate::clearCache() void TestResultDelegate::clearCache()
{ {
const QModelIndex current = m_lastProcessedIndex;
m_lastProcessedIndex = QModelIndex(); m_lastProcessedIndex = QModelIndex();
m_lastProcessedFont = QFont(); m_lastProcessedFont = QFont();
m_lastWidth = -1; m_lastWidth = -1;
if (current.isValid()) {
if (auto model = current.model()) {
if (model->index(current.row(), current.column(), current.parent()) == current)
emit sizeHintChanged(current);
}
}
} }
void TestResultDelegate::limitTextOutput(QString &output) const void TestResultDelegate::limitTextOutput(QString &output) const

View File

@@ -250,7 +250,7 @@ QByteArray dummyTextForContext(CharacterContext context, bool closingBraceBlock)
case CharacterContext::IfOrElseWithoutScope: case CharacterContext::IfOrElseWithoutScope:
return ";"; return ";";
case CharacterContext::NewStatementOrContinuation: case CharacterContext::NewStatementOrContinuation:
return "/**/"; return "/*//*/";
case CharacterContext::Unknown: case CharacterContext::Unknown:
default: default:
QTC_ASSERT(false, return "";); QTC_ASSERT(false, return "";);
@@ -302,7 +302,7 @@ int forceIndentWithExtraText(QByteArray &buffer,
} }
// A comment at the end of the line appears to prevent clang-format from removing line breaks. // A comment at the end of the line appears to prevent clang-format from removing line breaks.
if (dummyText == "/**/" || dummyText.isEmpty()) { if (dummyText == "/*//*/" || dummyText.isEmpty()) {
if (block.previous().isValid()) { if (block.previous().isValid()) {
const int prevEndOffset = Utils::Text::utf8NthLineOffset(block.document(), buffer, const int prevEndOffset = Utils::Text::utf8NthLineOffset(block.document(), buffer,
block.blockNumber()) + block.previous().text().length(); block.blockNumber()) + block.previous().text().length();

View File

@@ -704,4 +704,24 @@ void ClangFormatTest::testIndentFunctionArgumentOnNewLine()
})); }));
} }
void ClangFormatTest::testIndentCommentOnNewLine()
{
insertLines(
{"/*!",
" \\qmlproperty double Type::property",
" ",
" \\brief The property of Type.",
"*/"
});
m_indenter->indent(*m_cursor, QChar::Null, TextEditor::TabSettings());
QCOMPARE(documentLines(),
(std::vector<QString>{
"/*!",
" \\qmlproperty double Type::property",
" ",
" \\brief The property of Type.",
"*/"
}));
}
} // namespace ClangFormat::Internal } // namespace ClangFormat::Internal

View File

@@ -90,6 +90,7 @@ private slots:
void testClassIndentStructure(); void testClassIndentStructure();
void testIndentInitializeVector(); void testIndentInitializeVector();
void testIndentFunctionArgumentOnNewLine(); void testIndentFunctionArgumentOnNewLine();
void testIndentCommentOnNewLine();
private: private:
void insertLines(const std::vector<QString> &lines); void insertLines(const std::vector<QString> &lines);

View File

@@ -197,19 +197,27 @@ static CMakeConfig configurationFromPresetProbe(
const CMakeConfig cache = configurePreset.cacheVariables const CMakeConfig cache = configurePreset.cacheVariables
? configurePreset.cacheVariables.value() ? configurePreset.cacheVariables.value()
: CMakeConfig(); : CMakeConfig();
const FilePath cmakeMakeProgram = cache.filePathValueOf(QByteArray("CMAKE_MAKE_PROGRAM"));
const FilePath toolchainFile = cache.filePathValueOf(QByteArray("CMAKE_TOOLCHAIN_FILE")); auto expandCacheValue =
const QString prefixPath = cache.stringValueOf(QByteArray("CMAKE_PREFIX_PATH")); [configurePreset, env, importPath, cache](const QString &key) -> QString {
const QString findRootPath = cache.stringValueOf(QByteArray("CMAKE_FIND_ROOT_PATH")); QString result = cache.stringValueOf(key.toUtf8());
const QString qtHostPath = cache.stringValueOf(QByteArray("QT_HOST_PATH")); CMakePresets::Macros::expand(configurePreset, env, importPath, result);
return result;
};
const QString cmakeMakeProgram = expandCacheValue("CMAKE_MAKE_PROGRAM");
const QString toolchainFile = expandCacheValue("CMAKE_TOOLCHAIN_FILE");
const QString prefixPath = expandCacheValue("CMAKE_PREFIX_PATH");
const QString findRootPath = expandCacheValue("CMAKE_FIND_ROOT_PATH");
const QString qtHostPath = expandCacheValue("QT_HOST_PATH");
if (!cmakeMakeProgram.isEmpty()) { if (!cmakeMakeProgram.isEmpty()) {
args.emplace_back( args.emplace_back(
QStringLiteral("-DCMAKE_MAKE_PROGRAM=%1").arg(cmakeMakeProgram.toString())); QStringLiteral("-DCMAKE_MAKE_PROGRAM=%1").arg(cmakeMakeProgram));
} }
if (!toolchainFile.isEmpty()) { if (!toolchainFile.isEmpty()) {
args.emplace_back( args.emplace_back(
QStringLiteral("-DCMAKE_TOOLCHAIN_FILE=%1").arg(toolchainFile.toString())); QStringLiteral("-DCMAKE_TOOLCHAIN_FILE=%1").arg(toolchainFile));
} }
if (!prefixPath.isEmpty()) { if (!prefixPath.isEmpty()) {
args.emplace_back(QStringLiteral("-DCMAKE_PREFIX_PATH=%1").arg(prefixPath)); args.emplace_back(QStringLiteral("-DCMAKE_PREFIX_PATH=%1").arg(prefixPath));
@@ -412,6 +420,27 @@ static QVector<ToolChainDescription> extractToolChainsFromCache(const CMakeConfi
return result; return result;
} }
static QString extractVisualStudioPlatformFromConfig(const CMakeConfig &config)
{
const QString cmakeGenerator = config.stringValueOf(QByteArray("CMAKE_GENERATOR"));
QString platform;
if (cmakeGenerator.contains("Visual Studio")) {
const FilePath linker = config.filePathValueOf("CMAKE_LINKER");
const QString toolsDir = linker.parentDir().fileName();
if (toolsDir.compare("x64", Qt::CaseInsensitive) == 0) {
platform = "x64";
} else if (toolsDir.compare("x86", Qt::CaseInsensitive) == 0) {
platform = "Win32";
} else if (toolsDir.compare("arm64", Qt::CaseInsensitive) == 0) {
platform = "ARM64";
} else if (toolsDir.compare("arm", Qt::CaseInsensitive) == 0) {
platform = "ARM";
}
}
return platform;
}
QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath, QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
QString *warningMessage) const QString *warningMessage) const
{ {
@@ -476,6 +505,17 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
config = configurationFromPresetProbe(importPath, configurePreset); config = configurationFromPresetProbe(importPath, configurePreset);
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
if (!configurePreset.generator) {
QString cmakeGenerator = config.stringValueOf(QByteArray("CMAKE_GENERATOR"));
configurePreset.generator = cmakeGenerator;
data->generator = cmakeGenerator;
data->platform = extractVisualStudioPlatformFromConfig(config);
if (!data->platform.isEmpty()) {
configurePreset.architecture = PresetsDetails::ValueStrategyPair();
configurePreset.architecture->value = data->platform;
}
}
} else { } else {
config = cache; config = cache;
config << CMakeConfigItem("CMAKE_COMMAND", config << CMakeConfigItem("CMAKE_COMMAND",
@@ -566,6 +606,8 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
data->generator = config.stringValueOf("CMAKE_GENERATOR"); data->generator = config.stringValueOf("CMAKE_GENERATOR");
data->extraGenerator = config.stringValueOf("CMAKE_EXTRA_GENERATOR"); data->extraGenerator = config.stringValueOf("CMAKE_EXTRA_GENERATOR");
data->platform = config.stringValueOf("CMAKE_GENERATOR_PLATFORM"); data->platform = config.stringValueOf("CMAKE_GENERATOR_PLATFORM");
if (data->platform.isEmpty())
data->platform = extractVisualStudioPlatformFromConfig(config);
data->toolset = config.stringValueOf("CMAKE_GENERATOR_TOOLSET"); data->toolset = config.stringValueOf("CMAKE_GENERATOR_TOOLSET");
data->sysroot = config.filePathValueOf("CMAKE_SYSROOT"); data->sysroot = config.filePathValueOf("CMAKE_SYSROOT");
@@ -618,22 +660,24 @@ bool CMakeProjectImporter::matchKit(void *directoryData, const Kit *k) const
if (data->qt.qt && QtSupport::QtKitAspect::qtVersionId(k) != data->qt.qt->uniqueId()) if (data->qt.qt && QtSupport::QtKitAspect::qtVersionId(k) != data->qt.qt->uniqueId())
return false; return false;
const QList<Id> allLanguages = ToolChainManager::allLanguages(); bool haveCMakePreset = false;
for (const ToolChainDescription &tcd : data->toolChains) {
if (!Utils::contains(allLanguages, [&tcd](const Id& language) {return language == tcd.language;}))
continue;
ToolChain *tc = ToolChainKitAspect::toolChain(k, tcd.language);
if (!tc || !tc->matchesCompilerCommand(tcd.compilerPath)) {
return false;
}
}
if (!data->cmakePreset.isEmpty()) { if (!data->cmakePreset.isEmpty()) {
auto presetConfigItem = CMakeConfigurationKitAspect::cmakePresetConfigItem(k); auto presetConfigItem = CMakeConfigurationKitAspect::cmakePresetConfigItem(k);
if (data->cmakePreset != presetConfigItem.expandedValue(k)) if (data->cmakePreset != presetConfigItem.expandedValue(k))
return false; return false;
ensureBuildDirectory(*data, k); ensureBuildDirectory(*data, k);
haveCMakePreset = true;
}
const QList<Id> allLanguages = ToolChainManager::allLanguages();
for (const ToolChainDescription &tcd : data->toolChains) {
if (!Utils::contains(allLanguages, [&tcd](const Id& language) {return language == tcd.language;}))
continue;
ToolChain *tc = ToolChainKitAspect::toolChain(k, tcd.language);
if ((!tc || !tc->matchesCompilerCommand(tcd.compilerPath)) && !haveCMakePreset) {
return false;
}
} }
qCDebug(cmInputLog) << k->displayName() qCDebug(cmInputLog) << k->displayName()

View File

@@ -462,6 +462,7 @@ void CMakeToolItemConfigWidget::onBinaryPathEditingFinished()
{ {
updateQchFilePath(); updateQchFilePath();
store(); store();
load(m_model->cmakeToolItem(m_id));
} }
void CMakeToolItemConfigWidget::updateQchFilePath() void CMakeToolItemConfigWidget::updateQchFilePath()

View File

@@ -295,6 +295,9 @@ CMakeTool::Version CMakeTool::version() const
QString CMakeTool::versionDisplay() const QString CMakeTool::versionDisplay() const
{ {
if (m_executable.isEmpty())
return {};
if (!isValid()) if (!isValid())
return Tr::tr("Version not parseable"); return Tr::tr("Version not parseable");

View File

@@ -99,22 +99,17 @@ static QString expandMacroEnv(const QString &macroPrefix,
return result; return result;
} }
static QHash<QString, QString> getEnvCombined( static Utils::Environment getEnvCombined(const std::optional<Utils::Environment> &optPresetEnv,
const std::optional<QHash<QString, QString>> &optPresetEnv, const Utils::Environment &env) const Utils::Environment &env)
{ {
QHash<QString, QString> result; Utils::Environment result = env;
for (auto it = env.constBegin(); it != env.constEnd(); ++it) {
if (it.value().second)
result.insert(it.key().name, it.value().first);
}
if (!optPresetEnv) if (!optPresetEnv)
return result; return result;
QHash<QString, QString> presetEnv = optPresetEnv.value(); Utils::Environment presetEnv = optPresetEnv.value();
for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) { for (auto it = presetEnv.constBegin(); it != presetEnv.constEnd(); ++it) {
result[it->first] = it->second; result.set(it.key().name, it.value().first);
} }
return result; return result;
@@ -125,10 +120,10 @@ void expand(const PresetType &preset,
Utils::Environment &env, Utils::Environment &env,
const Utils::FilePath &sourceDirectory) const Utils::FilePath &sourceDirectory)
{ {
const QHash<QString, QString> presetEnv = getEnvCombined(preset.environment, env); const Utils::Environment presetEnv = getEnvCombined(preset.environment, env);
for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) { for (auto it = presetEnv.constBegin(); it != presetEnv.constEnd(); ++it) {
const QString key = it->first; const QString key = it.key().name;
QString value = it->second; QString value = it.value().first;
expandAllButEnv(preset, sourceDirectory, value); expandAllButEnv(preset, sourceDirectory, value);
value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) { value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) {
@@ -161,15 +156,15 @@ void expand(const PresetType &preset,
Utils::EnvironmentItems &envItems, Utils::EnvironmentItems &envItems,
const Utils::FilePath &sourceDirectory) const Utils::FilePath &sourceDirectory)
{ {
const QHash<QString, QString> presetEnv = preset.environment ? preset.environment.value() const Utils::Environment presetEnv = preset.environment ? preset.environment.value()
: QHash<QString, QString>(); : Utils::Environment();
for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) { for (auto it = presetEnv.constBegin(); it != presetEnv.constEnd(); ++it) {
const QString key = it->first; const QString key = it.key().name;
QString value = it->second; QString value = it.value().first;
expandAllButEnv(preset, sourceDirectory, value); expandAllButEnv(preset, sourceDirectory, value);
value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) { value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) {
if (presetEnv.contains(macroName)) if (presetEnv.hasKey(macroName))
return presetEnv.value(macroName); return presetEnv.value(macroName);
return QString("${%1}").arg(macroName); return QString("${%1}").arg(macroName);
}); });
@@ -199,7 +194,7 @@ void expand(const PresetType &preset,
{ {
expandAllButEnv(preset, sourceDirectory, value); expandAllButEnv(preset, sourceDirectory, value);
const QHash<QString, QString> presetEnv = getEnvCombined(preset.environment, env); const Utils::Environment presetEnv = getEnvCombined(preset.environment, env);
value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) { value = expandMacroEnv("env", value, [presetEnv](const QString &macroName) {
return presetEnv.value(macroName); return presetEnv.value(macroName);
}); });
@@ -225,7 +220,7 @@ void updateToolchainFile(
Utils::FilePath toolchainFile = Utils::FilePath::fromString(toolchainFileName); Utils::FilePath toolchainFile = Utils::FilePath::fromString(toolchainFileName);
if (toolchainFile.isRelativePath()) { if (toolchainFile.isRelativePath()) {
for (const auto &path : {sourceDirectory, buildDirectory}) { for (const auto &path : {sourceDirectory, buildDirectory}) {
Utils::FilePath probePath = toolchainFile.resolvePath(path); Utils::FilePath probePath = path.resolvePath(toolchainFile);
if (probePath.exists() && probePath != path) { if (probePath.exists() && probePath != path) {
toolchainFile = probePath; toolchainFile = probePath;
break; break;
@@ -236,6 +231,8 @@ void updateToolchainFile(
if (!toolchainFile.exists()) if (!toolchainFile.exists())
return; return;
const QString toolchainFileString = toolchainFile.cleanPath().toString();
// toolchainFile takes precedence to CMAKE_TOOLCHAIN_FILE // toolchainFile takes precedence to CMAKE_TOOLCHAIN_FILE
CMakeConfig cache = configurePreset.cacheVariables ? configurePreset.cacheVariables.value() CMakeConfig cache = configurePreset.cacheVariables ? configurePreset.cacheVariables.value()
: CMakeConfig(); : CMakeConfig();
@@ -244,11 +241,11 @@ void updateToolchainFile(
return item.key == "CMAKE_TOOLCHAIN_FILE"; return item.key == "CMAKE_TOOLCHAIN_FILE";
}); });
if (it != cache.end()) if (it != cache.end())
it->value = toolchainFile.toString().toUtf8(); it->value = toolchainFileString.toUtf8();
else else
cache << CMakeConfigItem("CMAKE_TOOLCHAIN_FILE", cache << CMakeConfigItem("CMAKE_TOOLCHAIN_FILE",
CMakeConfigItem::FILEPATH, CMakeConfigItem::FILEPATH,
toolchainFile.toString().toUtf8()); toolchainFileString.toUtf8());
configurePreset.cacheVariables = cache; configurePreset.cacheVariables = cache;
} }

View File

@@ -208,10 +208,10 @@ bool parseConfigurePresets(const QJsonValue &jsonValue,
const QJsonObject environmentObj = object.value("environment").toObject(); const QJsonObject environmentObj = object.value("environment").toObject();
for (const QString &envKey : environmentObj.keys()) { for (const QString &envKey : environmentObj.keys()) {
if (!preset.environment) if (!preset.environment)
preset.environment = QHash<QString, QString>(); preset.environment = Utils::Environment();
QJsonValue envValue = environmentObj.value(envKey); QJsonValue envValue = environmentObj.value(envKey);
preset.environment.value().insert(envKey, envValue.toString()); preset.environment.value().set(envKey, envValue.toString());
} }
const QJsonObject warningsObj = object.value("warnings").toObject(); const QJsonObject warningsObj = object.value("warnings").toObject();
@@ -335,10 +335,10 @@ bool parseBuildPresets(const QJsonValue &jsonValue,
const QJsonObject environmentObj = object.value("environment").toObject(); const QJsonObject environmentObj = object.value("environment").toObject();
for (const QString &envKey : environmentObj.keys()) { for (const QString &envKey : environmentObj.keys()) {
if (!preset.environment) if (!preset.environment)
preset.environment = QHash<QString, QString>(); preset.environment = Utils::Environment();
QJsonValue envValue = environmentObj.value(envKey); QJsonValue envValue = environmentObj.value(envKey);
preset.environment.value().insert(envKey, envValue.toString()); preset.environment.value().set(envKey, envValue.toString());
} }
if (object.contains("configurePreset")) if (object.contains("configurePreset"))
@@ -441,6 +441,44 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage
return true; return true;
} }
static QHash<QString, QString> merge(const QHash<QString, QString> &first,
const QHash<QString, QString> &second)
{
QHash<QString, QString> result = first;
for (auto it = second.constKeyValueBegin(); it != second.constKeyValueEnd(); ++it) {
result[it->first] = it->second;
}
return result;
}
static Utils::Environment merge(const Utils::Environment &first, const Utils::Environment &second)
{
Utils::Environment result = first;
for (auto it = second.constBegin(); it != second.constEnd(); ++it) {
result.set(it.key().name, it.value().first);
}
return result;
}
static CMakeConfig merge(const CMakeConfig &first, const CMakeConfig &second)
{
return Utils::setUnionMerge<CMakeConfig>(
first,
second,
[](const auto & /*left*/, const auto &right) { return right; },
&CMakeConfigItem::less);
}
static QStringList merge(const QStringList &first, const QStringList &second)
{
return Utils::setUnionMerge<QStringList>(
first,
second,
[](const auto & /*left*/, const auto &right) { return right; });
}
void PresetsDetails::ConfigurePreset::inheritFrom(const ConfigurePreset &other) void PresetsDetails::ConfigurePreset::inheritFrom(const ConfigurePreset &other)
{ {
if (!condition && other.condition && !other.condition.value().isNull()) if (!condition && other.condition && !other.condition.value().isNull())
@@ -449,6 +487,9 @@ void PresetsDetails::ConfigurePreset::inheritFrom(const ConfigurePreset &other)
if (!vendor && other.vendor) if (!vendor && other.vendor)
vendor = other.vendor; vendor = other.vendor;
if (vendor && other.vendor)
vendor = merge(other.vendor.value(), vendor.value());
if (!generator && other.generator) if (!generator && other.generator)
generator = other.generator; generator = other.generator;
@@ -472,9 +513,13 @@ void PresetsDetails::ConfigurePreset::inheritFrom(const ConfigurePreset &other)
if (!cacheVariables && other.cacheVariables) if (!cacheVariables && other.cacheVariables)
cacheVariables = other.cacheVariables; cacheVariables = other.cacheVariables;
else if (cacheVariables && other.cacheVariables)
cacheVariables = merge(other.cacheVariables.value(), cacheVariables.value());
if (!environment && other.environment) if (!environment && other.environment)
environment = other.environment; environment = other.environment;
else if (environment && other.environment)
environment = merge(other.environment.value(), environment.value());
if (!warnings && other.warnings) if (!warnings && other.warnings)
warnings = other.warnings; warnings = other.warnings;
@@ -494,8 +539,13 @@ void PresetsDetails::BuildPreset::inheritFrom(const BuildPreset &other)
if (!vendor && other.vendor) if (!vendor && other.vendor)
vendor = other.vendor; vendor = other.vendor;
if (vendor && other.vendor)
vendor = merge(other.vendor.value(), vendor.value());
if (!environment && other.environment) if (!environment && other.environment)
environment = other.environment; environment = other.environment;
else if (environment && other.environment)
environment = merge(other.environment.value(), environment.value());
if (!configurePreset && other.configurePreset) if (!configurePreset && other.configurePreset)
configurePreset = other.configurePreset; configurePreset = other.configurePreset;
@@ -508,6 +558,8 @@ void PresetsDetails::BuildPreset::inheritFrom(const BuildPreset &other)
if (!targets && other.targets) if (!targets && other.targets)
targets = other.targets; targets = other.targets;
else if (targets && other.targets)
targets = merge(other.targets.value(), targets.value());
if (!configuration && other.configuration) if (!configuration && other.configuration)
configuration = other.configuration; configuration = other.configuration;
@@ -520,6 +572,8 @@ void PresetsDetails::BuildPreset::inheritFrom(const BuildPreset &other)
if (!nativeToolOptions && other.nativeToolOptions) if (!nativeToolOptions && other.nativeToolOptions)
nativeToolOptions = other.nativeToolOptions; nativeToolOptions = other.nativeToolOptions;
else if (nativeToolOptions && other.nativeToolOptions)
nativeToolOptions = merge(other.nativeToolOptions.value(), nativeToolOptions.value());
} }
bool PresetsDetails::Condition::evaluate() const bool PresetsDetails::Condition::evaluate() const

View File

@@ -5,6 +5,7 @@
#include "cmakeconfigitem.h" #include "cmakeconfigitem.h"
#include <utils/environment.h>
#include <utils/filepath.h> #include <utils/filepath.h>
#include <QHash> #include <QHash>
@@ -103,7 +104,7 @@ public:
std::optional<QString> installDir; std::optional<QString> installDir;
std::optional<QString> cmakeExecutable; std::optional<QString> cmakeExecutable;
std::optional<CMakeConfig> cacheVariables; std::optional<CMakeConfig> cacheVariables;
std::optional<QHash<QString, QString>> environment; std::optional<Utils::Environment> environment;
std::optional<Warnings> warnings; std::optional<Warnings> warnings;
std::optional<Errors> errors; std::optional<Errors> errors;
std::optional<Debug> debug; std::optional<Debug> debug;
@@ -120,7 +121,7 @@ public:
std::optional<QHash<QString, QString>> vendor; std::optional<QHash<QString, QString>> vendor;
std::optional<QString> displayName; std::optional<QString> displayName;
std::optional<QString> description; std::optional<QString> description;
std::optional<QHash<QString, QString>> environment; std::optional<Utils::Environment> environment;
std::optional<QString> configurePreset; std::optional<QString> configurePreset;
std::optional<bool> inheritConfigureEnvironment = true; std::optional<bool> inheritConfigureEnvironment = true;
std::optional<int> jobs; std::optional<int> jobs;

View File

@@ -258,12 +258,12 @@ static void registerActionsForOptions()
categoryDisplay[page->category()] = page->displayCategory(); categoryDisplay[page->category()] = page->displayCategory();
} }
for (IOptionsPage *page : IOptionsPage::allOptionsPages()) { for (IOptionsPage *page : IOptionsPage::allOptionsPages()) {
Id commandId = generateOpenPageCommandId(page); const Id commandId = generateOpenPageCommandId(page);
if (!commandId.isValid()) if (!commandId.isValid())
continue; continue;
const QString actionTitle = Tr::tr("%1 > %2 Preferences...") const QString actionTitle = Tr::tr("%1 > %2 Preferences...")
.arg(categoryDisplay.value(page->category()), page->displayName()); .arg(categoryDisplay.value(page->category()), page->displayName());
auto action = new QAction(actionTitle); auto action = new QAction(actionTitle, m_instance);
QObject::connect(action, &QAction::triggered, m_instance, [id = page->id()]() { QObject::connect(action, &QAction::triggered, m_instance, [id = page->id()]() {
ICore::showOptionsDialog(id); ICore::showOptionsDialog(id);
}); });

View File

@@ -1376,6 +1376,21 @@ void DocumentManager::saveSettings()
s->endGroup(); s->endGroup();
} }
void restoreRecentFiles(const QVariantList &recentFiles, const QStringList &recentEditorIds)
{
QList<DocumentManager::RecentFile> result;
for (int i = 0, n = recentFiles.size(); i < n; ++i) {
QString editorId;
if (i < recentEditorIds.size()) // guard against old or weird settings
editorId = recentEditorIds.at(i);
const Utils::FilePath &filePath = FilePath::fromVariant(recentFiles.at(i));
result.append({filePath, Id::fromString(editorId)});
}
d->m_recentFiles = result;
}
void readSettings() void readSettings()
{ {
QSettings *s = ICore::settings(); QSettings *s = ICore::settings();
@@ -1384,23 +1399,14 @@ void readSettings()
const QVariantList recentFiles = s->value(QLatin1String(filesKeyC)).toList(); const QVariantList recentFiles = s->value(QLatin1String(filesKeyC)).toList();
const QStringList recentEditorIds = s->value(QLatin1String(editorsKeyC)).toStringList(); const QStringList recentEditorIds = s->value(QLatin1String(editorsKeyC)).toStringList();
s->endGroup(); s->endGroup();
// clean non-existing files
for (int i = 0, n = recentFiles.size(); i < n; ++i) { restoreRecentFiles(recentFiles, recentEditorIds);
QString editorId;
if (i < recentEditorIds.size()) // guard against old or weird settings
editorId = recentEditorIds.at(i);
const Utils::FilePath &filePath = FilePath::fromVariant(recentFiles.at(i));
if (filePath.exists() && !filePath.isDir())
d->m_recentFiles.append({filePath, Id::fromString(editorId)});
}
s->beginGroup(QLatin1String(directoryGroupC)); s->beginGroup(QLatin1String(directoryGroupC));
const FilePath settingsProjectDir = FilePath::fromString(s->value(QLatin1String(projectDirectoryKeyC),
QString()).toString()); d->m_projectsDirectory = FilePath::fromVariant(
if (!settingsProjectDir.isEmpty() && settingsProjectDir.isDir()) s->value(QLatin1String(projectDirectoryKeyC), PathChooser::homePath().toVariant()));
d->m_projectsDirectory = settingsProjectDir;
else
d->m_projectsDirectory = PathChooser::homePath();
d->m_useProjectsDirectory d->m_useProjectsDirectory
= s->value(QLatin1String(useProjectDirectoryKeyC), kUseProjectsDirectoryDefault).toBool(); = s->value(QLatin1String(useProjectDirectoryKeyC), kUseProjectsDirectoryDefault).toBool();

View File

@@ -232,6 +232,12 @@ bool HighlightScrollBarOverlay::eventFilter(QObject *object, QEvent *event)
case QEvent::ZOrderChange: case QEvent::ZOrderChange:
raise(); raise();
break; break;
case QEvent::Show:
show();
break;
case QEvent::Hide:
hide();
break;
default: default:
break; break;
} }
@@ -360,7 +366,7 @@ void HighlightScrollBarController::setScrollArea(QAbstractScrollArea *scrollArea
double HighlightScrollBarController::lineHeight() const double HighlightScrollBarController::lineHeight() const
{ {
return m_lineHeight; return ceil(m_lineHeight);
} }
void HighlightScrollBarController::setLineHeight(double lineHeight) void HighlightScrollBarController::setLineHeight(double lineHeight)

View File

@@ -561,7 +561,7 @@ bool CompletionList::eventFilter(QObject *watched, QEvent *event)
LocatorWidget::LocatorWidget(Locator *locator) LocatorWidget::LocatorWidget(Locator *locator)
: m_locatorModel(new LocatorModel(this)) : m_locatorModel(new LocatorModel(this))
, m_filterMenu(new QMenu(this)) , m_filterMenu(new QMenu(this))
, m_centeredPopupAction(new QAction(tr("Open as Centered Popup"))) , m_centeredPopupAction(new QAction(tr("Open as Centered Popup"), this))
, m_refreshAction(new QAction(tr("Refresh"), this)) , m_refreshAction(new QAction(tr("Refresh"), this))
, m_configureAction(new QAction(ICore::msgShowOptionsDialog(), this)) , m_configureAction(new QAction(ICore::msgShowOptionsDialog(), this))
, m_fileLineEdit(new Utils::FancyLineEdit) , m_fileLineEdit(new Utils::FancyLineEdit)

View File

@@ -514,6 +514,7 @@ void MainWindow::registerDefaultContainers()
ac = ActionManager::createMenu(Constants::M_HELP); ac = ActionManager::createMenu(Constants::M_HELP);
menubar->addMenu(ac, Constants::G_HELP); menubar->addMenu(ac, Constants::G_HELP);
ac->menu()->setTitle(tr("&Help")); ac->menu()->setTitle(tr("&Help"));
Theme::setHelpMenu(ac->menu());
ac->appendGroup(Constants::G_HELP_HELP); ac->appendGroup(Constants::G_HELP_HELP);
ac->appendGroup(Constants::G_HELP_SUPPORT); ac->appendGroup(Constants::G_HELP_SUPPORT);
ac->appendGroup(Constants::G_HELP_ABOUT); ac->appendGroup(Constants::G_HELP_ABOUT);

View File

@@ -110,7 +110,7 @@ QString CppcheckRunner::currentCommand() const
void CppcheckRunner::checkQueued() void CppcheckRunner::checkQueued()
{ {
if (m_queue.isEmpty() || m_binary.isEmpty()) if (m_queue.isEmpty() || !m_binary.isExecutableFile())
return; return;
FilePaths files = m_queue.begin().value(); FilePaths files = m_queue.begin().value();

View File

@@ -193,11 +193,8 @@ void TerminalRunner::start()
void TerminalRunner::stop() void TerminalRunner::stop()
{ {
if (m_stubProc && m_stubProc->isRunning()) { if (m_stubProc && m_stubProc->isRunning())
m_stubProc->stop(); m_stubProc->stop();
m_stubProc->waitForFinished();
}
reportStopped();
} }
void TerminalRunner::stubStarted() void TerminalRunner::stubStarted()

View File

@@ -19,6 +19,7 @@
#include <QPainter> #include <QPainter>
#include <QPushButton> #include <QPushButton>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QTimer>
#include <QTreeView> #include <QTreeView>
#include <QVBoxLayout> #include <QVBoxLayout>
@@ -75,7 +76,7 @@ LogChangeWidget::LogChangeWidget(QWidget *parent)
setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionBehavior(QAbstractItemView::SelectRows);
setActivationMode(Utils::DoubleClickActivation); setActivationMode(Utils::DoubleClickActivation);
connect(this, &LogChangeWidget::activated, this, &LogChangeWidget::emitCommitActivated); connect(this, &LogChangeWidget::activated, this, &LogChangeWidget::emitCommitActivated);
setFocus(); QTimer::singleShot(0, [this] { setFocus(); });
} }
bool LogChangeWidget::init(const FilePath &repository, const QString &commit, LogFlags flags) bool LogChangeWidget::init(const FilePath &repository, const QString &commit, LogFlags flags)
@@ -211,16 +212,15 @@ const QStandardItem *LogChangeWidget::currentItem(int column) const
LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) : LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) :
QDialog(parent) QDialog(parent)
, m_widget(new LogChangeWidget) , m_widget(new LogChangeWidget)
, m_dialogButtonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this))
, m_dialogButtonBox(new QDialogButtonBox(this))
{ {
auto layout = new QVBoxLayout(this); auto layout = new QVBoxLayout(this);
layout->addWidget(new QLabel(isReset ? Tr::tr("Reset to:") : Tr::tr("Select change:"), this)); layout->addWidget(new QLabel(isReset ? Tr::tr("Reset to:") : Tr::tr("Select change:"), this));
layout->addWidget(m_widget); layout->addWidget(m_widget);
auto popUpLayout = new QHBoxLayout; auto popUpLayout = new QHBoxLayout;
if (isReset) { if (isReset) {
popUpLayout->addWidget(new QLabel(Tr::tr("Reset type:"), this)); popUpLayout->addWidget(new QLabel(Tr::tr("Reset type:")));
m_resetTypeComboBox = new QComboBox(this); m_resetTypeComboBox = new QComboBox;
m_resetTypeComboBox->addItem(Tr::tr("Hard"), "--hard"); m_resetTypeComboBox->addItem(Tr::tr("Hard"), "--hard");
m_resetTypeComboBox->addItem(Tr::tr("Mixed"), "--mixed"); m_resetTypeComboBox->addItem(Tr::tr("Mixed"), "--mixed");
m_resetTypeComboBox->addItem(Tr::tr("Soft"), "--soft"); m_resetTypeComboBox->addItem(Tr::tr("Soft"), "--soft");
@@ -230,8 +230,7 @@ LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) :
} }
popUpLayout->addWidget(m_dialogButtonBox); popUpLayout->addWidget(m_dialogButtonBox);
m_dialogButtonBox->addButton(QDialogButtonBox::Cancel); QPushButton *okButton = m_dialogButtonBox->button(QDialogButtonBox::Ok);
QPushButton *okButton = m_dialogButtonBox->addButton(QDialogButtonBox::Ok);
layout->addLayout(popUpLayout); layout->addLayout(popUpLayout);
connect(m_dialogButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(m_dialogButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);

View File

@@ -114,8 +114,10 @@ GeneralSettingsPageWidget::GeneralSettingsPageWidget()
// startup group box // startup group box
auto startupGroupBox = new QGroupBox(Tr::tr("Startup")); auto startupGroupBox = new QGroupBox(Tr::tr("Startup"));
startupGroupBox->setObjectName("startupGroupBox");
contextHelpComboBox = new QComboBox(startupGroupBox); contextHelpComboBox = new QComboBox(startupGroupBox);
contextHelpComboBox->setObjectName("contextHelpComboBox");
contextHelpComboBox->addItem(Tr::tr("Show Side-by-Side if Possible")); contextHelpComboBox->addItem(Tr::tr("Show Side-by-Side if Possible"));
contextHelpComboBox->addItem(Tr::tr("Always Show Side-by-Side")); contextHelpComboBox->addItem(Tr::tr("Always Show Side-by-Side"));
contextHelpComboBox->addItem(Tr::tr("Always Show in Help Mode")); contextHelpComboBox->addItem(Tr::tr("Always Show in Help Mode"));

View File

@@ -68,7 +68,7 @@ void DocumentLocatorFilter::updateSymbols(const DocumentUri &uri,
return; return;
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
m_currentSymbols = symbols; m_currentSymbols = symbols;
emit symbolsUpToDate({}); emit symbolsUpToDate(QPrivateSignal());
} }
void DocumentLocatorFilter::resetSymbols() void DocumentLocatorFilter::resetSymbols()

View File

@@ -14,4 +14,18 @@ struct McuTargetDescription;
McuTarget::OS deduceOperatingSystem(const McuTargetDescription &); McuTarget::OS deduceOperatingSystem(const McuTargetDescription &);
QString removeRtosSuffix(const QString &environmentVariable); QString removeRtosSuffix(const QString &environmentVariable);
template<typename T>
class asKeyValueRange
{
public:
asKeyValueRange(T &data)
: m_data{data}
{}
auto begin() { return m_data.keyValueBegin(); }
auto end() { return m_data.keyValueEnd(); }
private:
T &m_data;
};
} // namespace McuSupport::Internal } // namespace McuSupport::Internal

View File

@@ -10,6 +10,7 @@
#include "mcusupportconstants.h" #include "mcusupportconstants.h"
#include "mcusupportplugin.h" #include "mcusupportplugin.h"
#include "mcusupportsdk.h" #include "mcusupportsdk.h"
#include "mcusupporttr.h"
#include "mcutarget.h" #include "mcutarget.h"
#include <cmakeprojectmanager/cmakekitinformation.h> #include <cmakeprojectmanager/cmakekitinformation.h>
@@ -247,10 +248,19 @@ public:
auto cxxToolchain = toolchainPackage->toolChain( auto cxxToolchain = toolchainPackage->toolChain(
ProjectExplorer::Constants::CXX_LANGUAGE_ID); ProjectExplorer::Constants::CXX_LANGUAGE_ID);
configMap.insert("CMAKE_CXX_COMPILER", if (cToolchain && cxxToolchain) {
cxxToolchain->compilerCommand().toString().toLatin1()); configMap.insert("CMAKE_CXX_COMPILER",
configMap.insert("CMAKE_C_COMPILER", cxxToolchain->compilerCommand().toString().toLatin1());
cToolchain->compilerCommand().toString().toLatin1()); configMap.insert("CMAKE_C_COMPILER",
cToolchain->compilerCommand().toString().toLatin1());
} else {
printMessage(Tr::tr("Warning for target %1: invalid toolchain path (%2). "
"Update the toolchain in Edit > Preferences > Kits.")
.arg(generateKitNameFromTarget(mcuTarget),
toolchainPackage->path().toUserOutput()),
true);
}
} else { } else {
const FilePath cMakeToolchainFile = mcuTarget->toolChainFilePackage()->path(); const FilePath cMakeToolchainFile = mcuTarget->toolChainFilePackage()->path();
@@ -335,7 +345,15 @@ Kit *newKit(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdk)
k->fix(); k->fix();
}; };
return KitManager::registerKit(init); Kit *kit = KitManager::registerKit(init);
if (kit) {
printMessage(Tr::tr("Kit for %1 created.").arg(generateKitNameFromTarget(mcuTarget)), false);
} else {
printMessage(Tr::tr("Error registering Kit for %1.")
.arg(generateKitNameFromTarget(mcuTarget)),
true);
}
return kit;
} }
// Kit Information // Kit Information

View File

@@ -38,7 +38,8 @@ McuPackage::McuPackage(const SettingsHandler::Ptr &settingsHandler,
const QStringList &versions, const QStringList &versions,
const QString &downloadUrl, const QString &downloadUrl,
const McuPackageVersionDetector *versionDetector, const McuPackageVersionDetector *versionDetector,
const bool addToSystemPath) const bool addToSystemPath,
const Utils::PathChooser::Kind &valueType)
: settingsHandler(settingsHandler) : settingsHandler(settingsHandler)
, m_label(label) , m_label(label)
, m_defaultPath(settingsHandler->getPath(settingsKey, QSettings::SystemScope, defaultPath)) , m_defaultPath(settingsHandler->getPath(settingsKey, QSettings::SystemScope, defaultPath))
@@ -50,6 +51,7 @@ McuPackage::McuPackage(const SettingsHandler::Ptr &settingsHandler,
, m_environmentVariableName(envVarName) , m_environmentVariableName(envVarName)
, m_downloadUrl(downloadUrl) , m_downloadUrl(downloadUrl)
, m_addToSystemPath(addToSystemPath) , m_addToSystemPath(addToSystemPath)
, m_valueType(valueType)
{ {
m_path = FilePath::fromUserInput(qtcEnvironmentVariable(m_environmentVariableName)); m_path = FilePath::fromUserInput(qtcEnvironmentVariable(m_environmentVariableName));
if (!m_path.exists()) { if (!m_path.exists()) {
@@ -141,7 +143,7 @@ void McuPackage::updateStatus()
m_status = Status::ValidPathInvalidPackage; m_status = Status::ValidPathInvalidPackage;
} else if (m_versionDetector && m_detectedVersion.isEmpty()) { } else if (m_versionDetector && m_detectedVersion.isEmpty()) {
m_status = Status::ValidPackageVersionNotDetected; m_status = Status::ValidPackageVersionNotDetected;
} else if (!validVersion) { } else if (m_versionDetector && !validVersion) {
m_status = Status::ValidPackageMismatchedVersion; m_status = Status::ValidPackageMismatchedVersion;
} else { } else {
m_status = Status::ValidPackage; m_status = Status::ValidPackage;
@@ -157,7 +159,8 @@ McuPackage::Status McuPackage::status() const
bool McuPackage::isValidStatus() const bool McuPackage::isValidStatus() const
{ {
return m_status == Status::ValidPackage || m_status == Status::ValidPackageMismatchedVersion; return m_status == Status::ValidPackage || m_status == Status::ValidPackageMismatchedVersion
|| m_status == Status::ValidPackageVersionNotDetected;
} }
void McuPackage::updateStatusUi() void McuPackage::updateStatusUi()
@@ -223,7 +226,8 @@ QString McuPackage::statusText() const
: tr("Path is empty, %1 not found.").arg(displayRequiredPath); : tr("Path is empty, %1 not found.").arg(displayRequiredPath);
break; break;
case Status::ValidPackageVersionNotDetected: case Status::ValidPackageVersionNotDetected:
response = tr("Path %1 exists, but version could not be detected.").arg(displayPackagePath); response = tr("Path %1 exists, but version %2 could not be detected.")
.arg(displayPackagePath, displayVersions);
break; break;
} }
return response; return response;
@@ -244,6 +248,7 @@ QWidget *McuPackage::widget()
{ {
auto *widget = new QWidget; auto *widget = new QWidget;
m_fileChooser = new PathChooser(widget); m_fileChooser = new PathChooser(widget);
m_fileChooser->setExpectedKind(m_valueType);
m_fileChooser->lineEdit()->setButtonIcon(FancyLineEdit::Right, Icons::RESET.icon()); m_fileChooser->lineEdit()->setButtonIcon(FancyLineEdit::Right, Icons::RESET.icon());
m_fileChooser->lineEdit()->setButtonVisible(FancyLineEdit::Right, true); m_fileChooser->lineEdit()->setButtonVisible(FancyLineEdit::Right, true);
connect(m_fileChooser->lineEdit(), &FancyLineEdit::rightButtonClicked, this, [&] { connect(m_fileChooser->lineEdit(), &FancyLineEdit::rightButtonClicked, this, [&] {
@@ -359,10 +364,9 @@ ToolChain *McuToolChainPackage::msvcToolChain(Id language)
{ {
ToolChain *toolChain = ToolChainManager::toolChain([language](const ToolChain *t) { ToolChain *toolChain = ToolChainManager::toolChain([language](const ToolChain *t) {
const Abi abi = t->targetAbi(); const Abi abi = t->targetAbi();
// TODO: Should Abi::WindowsMsvc2022Flavor be added too? return abi.osFlavor() == Abi::WindowsMsvc2019Flavor
return (abi.osFlavor() == Abi::WindowsMsvc2017Flavor
|| abi.osFlavor() == Abi::WindowsMsvc2019Flavor)
&& abi.architecture() == Abi::X86Architecture && abi.wordWidth() == 64 && abi.architecture() == Abi::X86Architecture && abi.wordWidth() == 64
&& t->typeId() == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID
&& t->language() == language; && t->language() == language;
}); });
return toolChain; return toolChain;

View File

@@ -8,6 +8,7 @@
#include "settingshandler.h" #include "settingshandler.h"
#include <utils/filepath.h> #include <utils/filepath.h>
#include <utils/pathchooser.h>
#include <QObject> #include <QObject>
@@ -18,7 +19,6 @@ class ToolChain;
} }
namespace Utils { namespace Utils {
class PathChooser;
class InfoLabel; class InfoLabel;
class Id; class Id;
} // namespace Utils } // namespace Utils
@@ -30,17 +30,19 @@ class McuPackage : public McuAbstractPackage
Q_OBJECT Q_OBJECT
public: public:
McuPackage(const SettingsHandler::Ptr &settingsHandler, McuPackage(
const QString &label, const SettingsHandler::Ptr &settingsHandler,
const Utils::FilePath &defaultPath, const QString &label,
const Utils::FilePath &detectionPath, const Utils::FilePath &defaultPath,
const QString &settingsKey, const Utils::FilePath &detectionPath,
const QString &cmakeVarName, const QString &settingsKey,
const QString &envVarName, const QString &cmakeVarName,
const QStringList &versions = {}, const QString &envVarName,
const QString &downloadUrl = {}, const QStringList &versions = {},
const McuPackageVersionDetector *versionDetector = nullptr, const QString &downloadUrl = {},
const bool addToPath = false); const McuPackageVersionDetector *versionDetector = nullptr,
const bool addToPath = false,
const Utils::PathChooser::Kind &valueType = Utils::PathChooser::Kind::ExistingDirectory);
~McuPackage() override = default; ~McuPackage() override = default;
@@ -92,6 +94,7 @@ private:
const QString m_environmentVariableName; const QString m_environmentVariableName;
const QString m_downloadUrl; const QString m_downloadUrl;
const bool m_addToSystemPath; const bool m_addToSystemPath;
const Utils::PathChooser::Kind m_valueType;
Status m_status = Status::InvalidPath; Status m_status = Status::InvalidPath;
}; // class McuPackage }; // class McuPackage

View File

@@ -7,6 +7,7 @@ QtcPlugin {
Depends { name: "Qt.widgets" } Depends { name: "Qt.widgets" }
Depends { name: "Qt.testlib"; condition: qtc.testsEnabled } Depends { name: "Qt.testlib"; condition: qtc.testsEnabled }
Depends { name: "Utils" } Depends { name: "Utils" }
Depends { name: "app_version_header" }
Depends { name: "Core" } Depends { name: "Core" }
Depends { name: "BareMetal" } Depends { name: "BareMetal" }

View File

@@ -3,6 +3,7 @@
#include "mcusupportoptions.h" #include "mcusupportoptions.h"
#include "mcuhelpers.h"
#include "mcukitmanager.h" #include "mcukitmanager.h"
#include "mcupackage.h" #include "mcupackage.h"
#include "mcusupportconstants.h" #include "mcusupportconstants.h"
@@ -16,16 +17,71 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <debugger/debuggerkitinformation.h> #include <debugger/debuggerkitinformation.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/filepath.h>
#include <qtsupport/qtkitinformation.h> #include <qtsupport/qtkitinformation.h>
#include <qtsupport/qtversionmanager.h> #include <qtsupport/qtversionmanager.h>
#include <QMessageBox> #include <QMessageBox>
#include <QPushButton> #include <QPushButton>
#include <utility>
using namespace Utils; using namespace Utils;
namespace McuSupport::Internal { namespace McuSupport::Internal {
static const Utils::FilePath expandWildcards(const Utils::FilePath& path)
{
if (!path.fileName().contains("*") && !path.fileName().contains("?"))
return path;
const FilePath p = path.parentDir();
auto entries = p.dirEntries(
Utils::FileFilter({path.fileName()}, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot));
if (entries.isEmpty())
return path;
// Return the last match (can correspond to the latest version)
sort(entries, [](const FilePath &a, const FilePath &b) { return a.fileName() < b.fileName(); });
return entries.last();
}
Macros *McuSdkRepository::globalMacros()
{
static Macros macros;
return &macros;
}
void McuSdkRepository::expandVariablesAndWildcards()
{
for (const auto &target : std::as_const(mcuTargets)) {
auto macroExpander = getMacroExpander(*target);
for (const auto &package : target->packages()) {
package->setPath(expandWildcards(macroExpander->expand(package->path())));
}
}
}
MacroExpanderPtr McuSdkRepository::getMacroExpander(const McuTarget &target)
{
auto macroExpander = std::make_shared<Utils::MacroExpander>();
//register the macros
for (const auto &package : target.packages()) {
macroExpander->registerVariable(package->cmakeVariableName().toLocal8Bit(),
package->label(),
[package] { return package->path().toString(); });
}
for (auto [key, macro] : asKeyValueRange(*globalMacros()))
macroExpander->registerVariable(key.toLocal8Bit(), "QtMCUs Macro", macro);
return macroExpander;
}
McuSupportOptions::McuSupportOptions(const SettingsHandler::Ptr &settingsHandler, QObject *parent) McuSupportOptions::McuSupportOptions(const SettingsHandler::Ptr &settingsHandler, QObject *parent)
: QObject(parent) : QObject(parent)
, qtForMCUsSdkPackage(createQtForMCUsPackage(settingsHandler)) , qtForMCUsSdkPackage(createQtForMCUsPackage(settingsHandler))
@@ -93,8 +149,15 @@ bool McuSupportOptions::isLegacyVersion(const QVersionNumber &version)
return version < newVersion; return version < newVersion;
} }
void McuSupportOptions::setQulDir(const FilePath &) void McuSupportOptions::setQulDir(const FilePath &path)
{ {
//register the Qt installation directory containing Qul dir
auto qtPath = (path / "../..").cleanPath();
if (qtPath.exists()) {
McuSdkRepository::globalMacros()->insert("QtDir", [qtPathString = qtPath.path()] {
return qtPathString;
});
}
qtForMCUsSdkPackage->updateStatus(); qtForMCUsSdkPackage->updateStatus();
if (qtForMCUsSdkPackage->isValidStatus()) if (qtForMCUsSdkPackage->isValidStatus())
sdkRepository = targetsAndPackages(qtForMCUsSdkPackage, settingsHandler); sdkRepository = targetsAndPackages(qtForMCUsSdkPackage, settingsHandler);

View File

@@ -8,6 +8,7 @@
#include "settingshandler.h" #include "settingshandler.h"
#include <utils/environmentfwd.h> #include <utils/environmentfwd.h>
#include <utils/macroexpander.h>
#include <QObject> #include <QObject>
#include <QVersionNumber> #include <QVersionNumber>
@@ -30,11 +31,19 @@ namespace Internal {
class McuAbstractPackage; class McuAbstractPackage;
using MacroExpanderPtr = std::shared_ptr<Utils::MacroExpander>;
using Macros = QHash<QString, Utils::MacroExpander::StringFunction>;
class McuSdkRepository final class McuSdkRepository final
{ {
public: public:
Targets mcuTargets; Targets mcuTargets;
Packages packages; Packages packages;
void expandVariablesAndWildcards();
MacroExpanderPtr getMacroExpander(const McuTarget &target);
static Macros *globalMacros();
}; };
class McuSupportOptions final : public QObject class McuSupportOptions final : public QObject

View File

@@ -7,6 +7,7 @@
#include "mcusupportconstants.h" #include "mcusupportconstants.h"
#include "mcusupportoptions.h" #include "mcusupportoptions.h"
#include "mcusupportsdk.h" #include "mcusupportsdk.h"
#include "mcusupporttr.h"
#include "mcutarget.h" #include "mcutarget.h"
#include "mcutargetfactory.h" #include "mcutargetfactory.h"
#include "settingshandler.h" #include "settingshandler.h"
@@ -28,6 +29,7 @@
#include <QGroupBox> #include <QGroupBox>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QMessageBox>
#include <QPushButton> #include <QPushButton>
#include <QVBoxLayout> #include <QVBoxLayout>
@@ -287,9 +289,30 @@ void McuSupportOptionsWidget::apply()
bool pathsChanged = false; bool pathsChanged = false;
m_settingsHandler->setAutomaticKitCreation(m_options.automaticKitCreationEnabled()); m_settingsHandler->setAutomaticKitCreation(m_options.automaticKitCreationEnabled());
McuTargetFactory::expandVariables(m_options.sdkRepository.packages); m_options.sdkRepository.expandVariablesAndWildcards();
QMessageBox warningPopup(QMessageBox::Icon::Warning,
Tr::tr("Warning"),
Tr::tr("Unable to apply changes in Devices > MCU."),
QMessageBox::Ok,
this);
auto target = currentMcuTarget();
if (!target) {
warningPopup.setInformativeText(Tr::tr("No target selected."));
warningPopup.exec();
return;
}
if (!target->isValid()) {
warningPopup.setInformativeText(
Tr::tr("Invalid paths present for target\n%1")
.arg(McuKitManager::generateKitNameFromTarget(target.get())));
warningPopup.exec();
return;
}
pathsChanged |= m_options.qtForMCUsSdkPackage->writeToSettings(); pathsChanged |= m_options.qtForMCUsSdkPackage->writeToSettings();
for (const auto &package : std::as_const(m_options.sdkRepository.packages)) for (const auto &package : target->packages())
pathsChanged |= package->writeToSettings(); pathsChanged |= package->writeToSettings();
if (pathsChanged) { if (pathsChanged) {

View File

@@ -9,6 +9,7 @@
#include "mcusupportconstants.h" #include "mcusupportconstants.h"
#include "mcusupportoptions.h" #include "mcusupportoptions.h"
#include "mcusupportplugin.h" #include "mcusupportplugin.h"
#include "mcusupporttr.h"
#include "mcusupportversiondetection.h" #include "mcusupportversiondetection.h"
#include "mcutarget.h" #include "mcutarget.h"
#include "mcutargetdescription.h" #include "mcutargetdescription.h"
@@ -190,7 +191,7 @@ McuToolChainPackagePtr createMsvcToolChainPackage(const SettingsHandler::Ptr &se
const FilePath defaultPath = toolChain ? toolChain->compilerCommand().parentDir() : FilePath(); const FilePath defaultPath = toolChain ? toolChain->compilerCommand().parentDir() : FilePath();
const auto *versionDetector = new McuPackageExecutableVersionDetector(detectionPath, const auto *versionDetector = new McuPackageExecutableVersionDetector(detectionPath,
{"--version"}, {"/?"},
R"(\b(\d+\.\d+)\.\d+\b)"); R"(\b(\d+\.\d+)\.\d+\b)");
return McuToolChainPackagePtr{new McuToolChainPackage(settingsHandler, return McuToolChainPackagePtr{new McuToolChainPackage(settingsHandler,
@@ -276,8 +277,8 @@ McuToolChainPackagePtr createGhsToolchainPackage(const SettingsHandler::Ptr &set
const FilePath defaultPath = FilePath::fromUserInput(qtcEnvironmentVariable(envVar)); const FilePath defaultPath = FilePath::fromUserInput(qtcEnvironmentVariable(envVar));
const auto *versionDetector const auto *versionDetector
= new McuPackageExecutableVersionDetector(FilePath("as850").withExecutableSuffix(), = new McuPackageExecutableVersionDetector(FilePath("gversion").withExecutableSuffix(),
{"-V"}, {"-help"},
R"(\bv(\d+\.\d+\.\d+)\b)"); R"(\bv(\d+\.\d+\.\d+)\b)");
return McuToolChainPackagePtr{ return McuToolChainPackagePtr{
@@ -301,8 +302,8 @@ McuToolChainPackagePtr createGhsArmToolchainPackage(const SettingsHandler::Ptr &
const FilePath defaultPath = FilePath::fromUserInput(qtcEnvironmentVariable(envVar)); const FilePath defaultPath = FilePath::fromUserInput(qtcEnvironmentVariable(envVar));
const auto *versionDetector const auto *versionDetector
= new McuPackageExecutableVersionDetector(FilePath("asarm").withExecutableSuffix(), = new McuPackageExecutableVersionDetector(FilePath("gversion").withExecutableSuffix(),
{"-V"}, {"-help"},
R"(\bv(\d+\.\d+\.\d+)\b)"); R"(\bv(\d+\.\d+\.\d+)\b)");
return McuToolChainPackagePtr{ return McuToolChainPackagePtr{
@@ -368,8 +369,8 @@ McuPackagePtr createStm32CubeProgrammerPackage(const SettingsHandler::Ptr &setti
FilePath defaultPath = {}; FilePath defaultPath = {};
const FilePath detectionPath = FilePath::fromUserInput( const FilePath detectionPath = FilePath::fromUserInput(
QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "bin/STM32_Programmer_CLI.exe" QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "STM32_Programmer_CLI.exe"
: "bin/STM32_Programmer.sh")); : "STM32_Programmer.sh"));
return McuPackagePtr{ return McuPackagePtr{
new McuPackage(settingsHandler, new McuPackage(settingsHandler,
@@ -591,7 +592,11 @@ McuSdkRepository targetsFromDescriptions(const QList<McuTargetDescription> &desc
mcuPackages.insert(package); mcuPackages.insert(package);
} }
} }
return McuSdkRepository{mcuTargets, mcuPackages};
McuSdkRepository repo{mcuTargets, mcuPackages};
repo.expandVariablesAndWildcards();
return repo;
} }
FilePath kitsPath(const FilePath &qtMcuSdkPath) FilePath kitsPath(const FilePath &qtMcuSdkPath)
@@ -604,19 +609,7 @@ static FilePaths targetDescriptionFiles(const FilePath &dir)
return kitsPath(dir).dirEntries(Utils::FileFilter({"*.json"}, QDir::Files)); return kitsPath(dir).dirEntries(Utils::FileFilter({"*.json"}, QDir::Files));
} }
VersionDetection parseVersionDetection(const QJsonObject &packageEntry) static QString getOsSpecificValue(const QJsonValue &entry)
{
const QJsonObject versioning = packageEntry.value("versionDetection").toObject();
return {
versioning["regex"].toString(),
versioning["filePattern"].toString(),
versioning["executableArgs"].toString(),
versioning["xmlElement"].toString(),
versioning["xmlAttribute"].toString(),
};
}
QString getOsSpecificValue(const QJsonValue &entry)
{ {
if (entry.isObject()) { if (entry.isObject()) {
//The json entry has os-specific values //The json entry has os-specific values
@@ -626,6 +619,52 @@ QString getOsSpecificValue(const QJsonValue &entry)
return entry.toString(); return entry.toString();
} }
static VersionDetection parseVersionDetection(const QJsonObject &packageEntry)
{
const QJsonObject versioning = packageEntry.value("versionDetection").toObject();
return {
versioning["regex"].toString(),
getOsSpecificValue(versioning["filePattern"]),
versioning["executableArgs"].toString(),
versioning["xmlElement"].toString(),
versioning["xmlAttribute"].toString(),
};
}
static Utils::PathChooser::Kind parseLineEditType(const QJsonValue &type)
{
//Utility function to handle the different kinds of PathChooser
//Default is ExistingDirectory, see pathchooser.h for more options
const auto defaultValue = Utils::PathChooser::Kind::ExistingDirectory;
if (type.isUndefined()) {
//No "type" entry in the json file, this is not an error
return defaultValue;
}
const QString typeString = type.toString();
if (typeString.isNull()) {
printMessage(Tr::tr("Parsing error: the type entry in JSON kit files must be a string, "
"defaulting to \"path\"")
.arg(typeString),
true);
return defaultValue;
} else if (typeString.compare("file", Qt::CaseInsensitive) == 0) {
return Utils::PathChooser::File;
} else if (typeString.compare("path", Qt::CaseInsensitive) == 0) {
return Utils::PathChooser::ExistingDirectory;
} else {
printMessage(Tr::tr(
"Parsing error: the type entry \"%2\" in JSON kit files is not supported, "
"defaulting to \"path\"")
.arg(typeString),
true);
return defaultValue;
}
}
static PackageDescription parsePackage(const QJsonObject &cmakeEntry) static PackageDescription parsePackage(const QJsonObject &cmakeEntry)
{ {
const QVariantList versionsVariantList = cmakeEntry["versions"].toArray().toVariantList(); const QVariantList versionsVariantList = cmakeEntry["versions"].toArray().toVariantList();
@@ -652,7 +691,8 @@ static PackageDescription parsePackage(const QJsonObject &cmakeEntry)
FilePath::fromUserInput(detectionPathString), FilePath::fromUserInput(detectionPathString),
versions, versions,
parseVersionDetection(cmakeEntry), parseVersionDetection(cmakeEntry),
cmakeEntry["addToSystemPath"].toBool()}; cmakeEntry["addToSystemPath"].toBool(),
parseLineEditType(cmakeEntry["type"])};
} }
static QList<PackageDescription> parsePackages(const QJsonArray &cmakeEntries) static QList<PackageDescription> parsePackages(const QJsonArray &cmakeEntries)
@@ -820,11 +860,6 @@ McuSdkRepository targetsAndPackages(const McuPackagePtr &qtForMCUsPackage,
< McuKitManager::generateKitNameFromTarget(rhs.get()); < McuKitManager::generateKitNameFromTarget(rhs.get());
}); });
for (const auto &target : repo.mcuTargets) {
printMessage(McuTarget::tr("Kit for %1 created.")
.arg(McuKitManager::generateKitNameFromTarget(target.get())),
false);
}
return repo; return repo;
} }

View File

@@ -4,6 +4,8 @@
#pragma once #pragma once
#include <utils/filepath.h> #include <utils/filepath.h>
#include <utils/pathchooser.h>
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
#include <QVector> #include <QVector>
@@ -32,6 +34,7 @@ struct PackageDescription
QStringList versions; QStringList versions;
VersionDetection versionDetection; VersionDetection versionDetection;
bool shouldAddToSystemPath; bool shouldAddToSystemPath;
Utils::PathChooser::Kind type;
}; //struct PackageDescription }; //struct PackageDescription
struct McuTargetDescription struct McuTargetDescription

View File

@@ -4,13 +4,13 @@
#include "mcutargetfactory.h" #include "mcutargetfactory.h"
#include "mcuhelpers.h" #include "mcuhelpers.h"
#include "mcupackage.h" #include "mcupackage.h"
#include "mcusupport_global.h"
#include "mcusupportplugin.h" #include "mcusupportplugin.h"
#include "mcusupportversiondetection.h" #include "mcusupportversiondetection.h"
#include "mcutarget.h" #include "mcutarget.h"
#include "mcutargetdescription.h" #include "mcutargetdescription.h"
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/macroexpander.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QVersionNumber> #include <QVersionNumber>
@@ -56,18 +56,6 @@ static void removeEmptyPackages(Packages &packages)
} }
} }
void McuTargetFactory::expandVariables(Packages &packages)
{
Utils::MacroExpander macroExpander;
for (const auto &package : packages) {
macroExpander.registerVariable(package->cmakeVariableName().toLocal8Bit(),
package->label(),
[package] { return package->path().toString(); });
}
for (const auto &package : packages)
package->setPath(macroExpander.expand(package->path()));
}
McuTargetFactory::McuTargetFactory(const SettingsHandler::Ptr &settingsHandler) McuTargetFactory::McuTargetFactory(const SettingsHandler::Ptr &settingsHandler)
: settingsHandler{settingsHandler} : settingsHandler{settingsHandler}
{} {}
@@ -94,7 +82,6 @@ QPair<Targets, Packages> McuTargetFactory::createTargets(const McuTargetDescript
targetPackages.unite({toolchainFile}); targetPackages.unite({toolchainFile});
removeEmptyPackages(targetPackages); removeEmptyPackages(targetPackages);
expandVariables(targetPackages);
packages.unite(targetPackages); packages.unite(targetPackages);
@@ -144,7 +131,8 @@ McuPackagePtr McuTargetFactory::createPackage(const PackageDescription &pkgDesc)
pkgDesc.versions, pkgDesc.versions,
{}, {},
createVersionDetection(pkgDesc.versionDetection), createVersionDetection(pkgDesc.versionDetection),
pkgDesc.shouldAddToSystemPath}}; pkgDesc.shouldAddToSystemPath,
pkgDesc.type}};
} }
McuToolChainPackage *McuTargetFactory::createToolchain( McuToolChainPackage *McuTargetFactory::createToolchain(

View File

@@ -22,7 +22,6 @@ public:
Packages createPackages(const McuTargetDescription &); Packages createPackages(const McuTargetDescription &);
McuToolChainPackage *createToolchain(const McuTargetDescription::Toolchain &, const Utils::FilePath &sourceFile = Utils::FilePath()); McuToolChainPackage *createToolchain(const McuTargetDescription::Toolchain &, const Utils::FilePath &sourceFile = Utils::FilePath());
McuPackagePtr createPackage(const PackageDescription &); McuPackagePtr createPackage(const PackageDescription &);
static void expandVariables(Packages &packages);
private: private:
SettingsHandler::Ptr settingsHandler; SettingsHandler::Ptr settingsHandler;

View File

@@ -24,6 +24,10 @@ constexpr auto armgcc_ek_ra6m3g_baremetal_json = R"(
"windows": "%{Env:PROGRAMFILES}/SEGGER/JLink", "windows": "%{Env:PROGRAMFILES}/SEGGER/JLink",
"linux": "/opt/SEGGER/JLink" "linux": "/opt/SEGGER/JLink"
}, },
"detectionPath": {
"windows": "JLink.exe",
"linux": "JLinkExe"
},
"optional": true, "optional": true,
"addToSystemPath": true "addToSystemPath": true
} }
@@ -43,9 +47,12 @@ constexpr auto armgcc_ek_ra6m3g_baremetal_json = R"(
"type": "path", "type": "path",
"optional": false, "optional": false,
"versionDetection": { "versionDetection": {
"filePattern": "bin/arm-none-eabi-g++", "filePattern": {
"windows": "bin/arm-none-eabi-g++.exe",
"linux": "bin/arm-none-eabi-g++"
},
"executableArgs": "--version", "executableArgs": "--version",
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b" "regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
}, },
"detectionPath": { "detectionPath": {
"windows": "bin/arm-none-eabi-g++.exe", "windows": "bin/arm-none-eabi-g++.exe",
@@ -64,6 +71,7 @@ constexpr auto armgcc_ek_ra6m3g_baremetal_json = R"(
"boardSdk": { "boardSdk": {
"cmakeVar": "QUL_BOARD_SDK_DIR", "cmakeVar": "QUL_BOARD_SDK_DIR",
"envVar": "EK_RA6M3G_FSP_PATH", "envVar": "EK_RA6M3G_FSP_PATH",
"setting": "EK_RA6M3G_FSP_PATH",
"id": "EK_RA6M3G_FSP_PATH", "id": "EK_RA6M3G_FSP_PATH",
"label": "Flexible Software Package for Renesas RA MCU Family", "label": "Flexible Software Package for Renesas RA MCU Family",
"optional": false, "optional": false,

View File

@@ -24,6 +24,10 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"(
"windows": "%{Env:PROGRAMFILES}/SEGGER/JLink", "windows": "%{Env:PROGRAMFILES}/SEGGER/JLink",
"linux": "/opt/SEGGER/JLink" "linux": "/opt/SEGGER/JLink"
}, },
"detectionPath": {
"windows": "JLink.exe",
"linux": "JLinkExe"
},
"optional": true, "optional": true,
"addToSystemPath": true "addToSystemPath": true
} }
@@ -43,9 +47,12 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"(
"type": "path", "type": "path",
"optional": false, "optional": false,
"versionDetection": { "versionDetection": {
"filePattern": "bin/arm-none-eabi-g++", "filePattern": {
"windows": "bin/arm-none-eabi-g++.exe",
"linux": "bin/arm-none-eabi-g++"
},
"executableArgs": "--version", "executableArgs": "--version",
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b" "regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
}, },
"detectionPath": { "detectionPath": {
"windows": "bin/arm-none-eabi-g++.exe", "windows": "bin/arm-none-eabi-g++.exe",
@@ -64,6 +71,7 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"(
"boardSdk": { "boardSdk": {
"cmakeVar": "QUL_BOARD_SDK_DIR", "cmakeVar": "QUL_BOARD_SDK_DIR",
"envVar": "EK_RA6M3G_FSP_PATH", "envVar": "EK_RA6M3G_FSP_PATH",
"setting": "EK_RA6M3G_FSP_PATH",
"id": "EK_RA6M3G_FSP_PATH", "id": "EK_RA6M3G_FSP_PATH",
"label": "Flexible Software Package for Renesas RA MCU Family", "label": "Flexible Software Package for Renesas RA MCU Family",
"optional": false, "optional": false,
@@ -76,6 +84,7 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"(
"envVar": "EK_RA6M3G_FREERTOS_DIR", "envVar": "EK_RA6M3G_FREERTOS_DIR",
"id": "EK_RA6M3G_FREERTOS_DIR", "id": "EK_RA6M3G_FREERTOS_DIR",
"label": "FreeRTOS SDK for EK-RA6M3G", "label": "FreeRTOS SDK for EK-RA6M3G",
"setting": "FreeRTOSSourcePackage_EK_RA6M3G",
"cmakeVar": "FREERTOS_DIR", "cmakeVar": "FREERTOS_DIR",
"defaultValue": "%{Qul_ROOT}/platform/boards/renesas/ek-ra6m3g-common/3rdparty/freertos", "defaultValue": "%{Qul_ROOT}/platform/boards/renesas/ek-ra6m3g-common/3rdparty/freertos",
"detectionPath": "tasks.c", "detectionPath": "tasks.c",

View File

@@ -28,9 +28,12 @@ constexpr auto armgcc_example_baremetal_json = R"(
"type": "path", "type": "path",
"optional": false, "optional": false,
"versionDetection": { "versionDetection": {
"filePattern": "bin/arm-none-eabi-g++", "filePattern": {
"windows": "bin/arm-none-eabi-g++.exe",
"linux": "bin/arm-none-eabi-g++"
},
"executableArgs": "--version", "executableArgs": "--version",
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b" "regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
}, },
"detectionPath": { "detectionPath": {
"windows": "bin/arm-none-eabi-g++.exe", "windows": "bin/arm-none-eabi-g++.exe",

View File

@@ -47,9 +47,12 @@ constexpr auto armgcc_mimxrt1050_evk_baremetal_json = R"(
"type": "path", "type": "path",
"optional": false, "optional": false,
"versionDetection": { "versionDetection": {
"filePattern": "bin/arm-none-eabi-g++", "filePattern": {
"windows": "bin/arm-none-eabi-g++.exe",
"linux": "bin/arm-none-eabi-g++"
},
"executableArgs": "--version", "executableArgs": "--version",
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b" "regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
}, },
"detectionPath": { "detectionPath": {
"windows": "bin/arm-none-eabi-g++.exe", "windows": "bin/arm-none-eabi-g++.exe",

View File

@@ -47,9 +47,12 @@ constexpr auto armgcc_mimxrt1050_evk_freertos_json = R"(
"type": "path", "type": "path",
"optional": false, "optional": false,
"versionDetection": { "versionDetection": {
"filePattern": "bin/arm-none-eabi-g++", "filePattern": {
"windows": "bin/arm-none-eabi-g++.exe",
"linux": "bin/arm-none-eabi-g++"
},
"executableArgs": "--version", "executableArgs": "--version",
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b" "regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
}, },
"detectionPath": { "detectionPath": {
"windows": "bin/arm-none-eabi-g++.exe", "windows": "bin/arm-none-eabi-g++.exe",

Some files were not shown because too many files have changed in this diff Show More