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
@@ -96,6 +96,13 @@ function(_create_ts_custom_target name)
|
||||
COMMENT "Generate .ts files"
|
||||
DEPENDS ${_sources}
|
||||
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()
|
||||
|
||||
function(add_translation_targets file_prefix)
|
||||
|
||||
10
dist/changelog/changes-9.0.0.md
vendored
@@ -34,6 +34,7 @@ Editing
|
||||
* Added option for `Tint whole margin area`
|
||||
* Added option for line spacing (QTCREATORBUG-13727)
|
||||
* 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)
|
||||
* Fixed performance issue with large selections
|
||||
* 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
|
||||
after the last time
|
||||
|
||||
### Binaries
|
||||
|
||||
* Added support for character encoding
|
||||
|
||||
### Image Viewer
|
||||
|
||||
* Made `Fit to Screen` sticky and added option for the default
|
||||
@@ -88,6 +85,7 @@ Editing
|
||||
### Diff Viewer
|
||||
|
||||
* Fixed that calculating differences blocked Qt Creator
|
||||
* Fixed that description widget height was not persistent (QTCREATORBUG-24286)
|
||||
|
||||
Projects
|
||||
--------
|
||||
@@ -105,6 +103,7 @@ Projects
|
||||
toolchain files (QTCREATORBUG-24555)
|
||||
* Added option for changing environment for configure step
|
||||
* 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
|
||||
CMake run
|
||||
* Fixed issues with importing builds using Visual C++ generator
|
||||
@@ -132,6 +131,9 @@ Version Control Systems
|
||||
### Git
|
||||
|
||||
* 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
|
||||
----------------
|
||||
|
||||
BIN
doc/qtcreator/images/qtcreator-cmake-presets-configure.webp
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
doc/qtcreator/images/qtcreator-cmake-presets-environment.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 31 KiB |
@@ -4,11 +4,7 @@
|
||||
/*!
|
||||
\page creator-developing-android.html
|
||||
\previouspage creator-connecting-mobile.html
|
||||
\if defined(qtdesignstudio)
|
||||
\nextpage creator-developing-generic-linux.html
|
||||
\else
|
||||
\nextpage creator-developing-baremetal.html
|
||||
\endif
|
||||
|
||||
\title Connecting Android Devices
|
||||
|
||||
|
||||
@@ -34,10 +34,8 @@
|
||||
packages, select \uicontrol Projects > \uicontrol Build >
|
||||
\uicontrol {Build Android APK} > \uicontrol Details.
|
||||
|
||||
\if defined(qtcreator)
|
||||
For more information about options that you have for running applications,
|
||||
see \l {Specifying Run Settings for Android Devices}.
|
||||
\endif
|
||||
|
||||
\section1 Packaging Applications
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
\QC creates an initial configuration for you based on the kit
|
||||
settings and displays it in \uicontrol {Initial Configuration} in
|
||||
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
|
||||
is constructed by using the values of the \uicontrol {Build directory} and
|
||||
@@ -40,7 +41,7 @@
|
||||
variables, see \l{CMake Variable Reference}.
|
||||
|
||||
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
|
||||
the available options, click the link in the field name or see
|
||||
\l{CMake: cmake(1)}.
|
||||
@@ -60,9 +61,173 @@
|
||||
|
||||
Create the presets files in the format described in
|
||||
\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
|
||||
|
||||
|
||||
@@ -45,6 +45,14 @@
|
||||
\uicontrol {Clear CMake Configuration}, and then select \uicontrol Build
|
||||
> \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
|
||||
|
||||
\QC requires CMake's \l{https://cmake.org/cmake/help/latest/manual/cmake-file-api.7.html}
|
||||
|
||||
@@ -3,11 +3,7 @@
|
||||
|
||||
/*!
|
||||
\page creator-logging-viewer.html
|
||||
\if defined(qtdesignstudio)
|
||||
\previouspage creator-quick-ui-forms.html
|
||||
\else
|
||||
\previouspage creator-task-lists.html
|
||||
\endif
|
||||
\nextpage creator-telemetry.html
|
||||
|
||||
\title Inspecting Internal Logs
|
||||
|
||||
@@ -25,44 +25,44 @@
|
||||
\li \l Windows
|
||||
\row
|
||||
\li \l Android
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\row
|
||||
\li \l{Bare Metal}
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\row
|
||||
\li \l Boot2Qt
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\row
|
||||
\li \l{Generic Remote Linux}
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \l{Remote Linux}
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\row
|
||||
\li \l iOS
|
||||
\li
|
||||
\li \image ok
|
||||
\li \image ok.png
|
||||
\li
|
||||
\row
|
||||
\li \l{Microcontroller Units (MCU)}{MCUs}
|
||||
\li
|
||||
\li
|
||||
\li \image ok
|
||||
\li \image ok.png
|
||||
\row
|
||||
\li \l QNX
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \inlineimage ok
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\li \inlineimage ok.png
|
||||
\row
|
||||
\li \l{Building Applications for the Web}{WebAssembly}
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\li \image ok.png
|
||||
\endtable
|
||||
|
||||
\note UWP support was removed from \QC 8.0.
|
||||
|
||||
@@ -9,13 +9,8 @@
|
||||
|
||||
/*!
|
||||
\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
|
||||
\nextpage creator-testing.html
|
||||
\endif
|
||||
|
||||
\title Customizing the Build Process
|
||||
|
||||
|
||||
@@ -22,10 +22,16 @@
|
||||
|
||||
\QC automatically detects the compilers that are registered by your
|
||||
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
|
||||
|
||||
\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
|
||||
compilers or by using additional versions of the automatically detected
|
||||
compilers:
|
||||
@@ -68,16 +74,16 @@
|
||||
\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
|
||||
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.
|
||||
|
||||
\li \l{https://www.keil.com}{KEIL} is a group of C and C++ bare-metal
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
@@ -10,11 +10,7 @@
|
||||
/*!
|
||||
\page creator-build-dependencies.html
|
||||
\previouspage creator-code-style-settings.html
|
||||
\if defined(qtdesignstudio)
|
||||
\nextpage studio-designing.html
|
||||
\else
|
||||
\nextpage creator-project-settings-environment.html
|
||||
\endif
|
||||
|
||||
\title Specifying Dependencies
|
||||
|
||||
|
||||
@@ -3,13 +3,8 @@
|
||||
|
||||
/*!
|
||||
\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
|
||||
\nextpage creator-building-targets.html
|
||||
\endif
|
||||
|
||||
\title Previewing in Browsers
|
||||
|
||||
@@ -24,24 +19,17 @@
|
||||
However, the actual performance of the application once started is
|
||||
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
|
||||
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.
|
||||
\endif
|
||||
|
||||
The loaded applications remain locally in your browser. No data is uploaded
|
||||
into the cloud.
|
||||
|
||||
To preview an application in a web browser:
|
||||
|
||||
\list
|
||||
\li In the browser, open \l{http://qt-webassembly.io/designviewer/}
|
||||
{\QDV}.
|
||||
\list 1
|
||||
\li In the browser, open \l{ https://designviewer.qt.io/}{\QDV}.
|
||||
\li Drag and drop your application package to \QDV, or click the load
|
||||
icon to browse for your file.
|
||||
\endlist
|
||||
@@ -57,10 +57,15 @@
|
||||
You can preview Android applications live using an Android
|
||||
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}
|
||||
|
||||
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.
|
||||
\endif
|
||||
\endlist
|
||||
*/
|
||||
|
||||
BIN
doc/qtdesignstudio/images/extended-state.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
doc/qtdesignstudio/images/no-extended-state.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 10 KiB |
BIN
doc/qtdesignstudio/images/qt-design-viewer.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
doc/qtdesignstudio/images/share-online-manage.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
doc/qtdesignstudio/images/share-online.webp
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
doc/qtdesignstudio/images/states-view-menu.png
Normal file
|
After Width: | Height: | Size: 94 B |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 9.1 KiB |
43
doc/qtdesignstudio/src/overviews/qt-design-viewer.qdoc
Normal 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
|
||||
*/
|
||||
@@ -131,7 +131,7 @@
|
||||
\li \l{Previewing on Desktop}
|
||||
\li \l{Previewing on Devices}
|
||||
\li \l{Previewing Android Applications}
|
||||
\li \l{Previewing in Browsers}
|
||||
\li \l{Sharing Applications Online}
|
||||
\endlist
|
||||
\li \l {Asset Creation with Other Tools}
|
||||
\list
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
\page qtquick-states-view.html
|
||||
\previouspage qtquick-connection-view.html
|
||||
\nextpage studio-translations.html
|
||||
\sa {Working with States}
|
||||
|
||||
\title States
|
||||
|
||||
@@ -25,48 +26,4 @@
|
||||
|
||||
\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
|
||||
*/
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
|
||||
\image qmldesigner-transitions.png "States view"
|
||||
|
||||
Click the new state to switch to it in the \l {2D} view, and then modify the
|
||||
values of the properties of components or component instances in
|
||||
\l Properties.
|
||||
Click the new state to switch to it in the \l {2D} and \l{3D} views, and
|
||||
then modify the values of the properties of components or component
|
||||
instances in \l Properties.
|
||||
|
||||
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
|
||||
@@ -60,21 +60,17 @@
|
||||
|
||||
\section1 Setting the Default State
|
||||
|
||||
To determine 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}.
|
||||
The default state determines the startup state of the application.
|
||||
|
||||
To reset the state later, select \uicontrol Actions >
|
||||
\uicontrol {Reset Default}.
|
||||
To set a state to the default state, select \uicontrol Default.
|
||||
|
||||
\section1 Applying States
|
||||
|
||||
To determine when a state should be applied, select \uicontrol Actions >
|
||||
\uicontrol {Set when Condition}. In \uicontrol {Binding Editor}, specify
|
||||
a \l [QtQuick]{State::when}{when} property for the state. Set the value of
|
||||
the property to a boolean expression that evaluates to \c true when you want
|
||||
the state to be applied.
|
||||
To determine when a state is applied, select \inlineimage icons/edit.png
|
||||
in the \uicontrol {When Condition} field. In \uicontrol {Binding Editor},
|
||||
specify a \l [QtQuick]{State::when}{when} property for the state. Set the
|
||||
value of the property to a boolean expression that evaluates to \c true when
|
||||
you want the state to be applied.
|
||||
|
||||
This enables you to evaluate the truthfulness of several components'
|
||||
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
|
||||
or opacity of the components in the view.
|
||||
\li To determine which state is applied when the application starts,
|
||||
select \uicontrol Actions > \uicontrol {Set as Default}.
|
||||
select \uicontrol Default.
|
||||
\endlist
|
||||
|
||||
\if defined(qtcreator)
|
||||
\include qtquick-states-scxml.qdocinc scxml state machines
|
||||
\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
|
||||
|
||||
*/
|
||||
|
||||
@@ -162,6 +162,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
|
||||
|
||||
readonly property string suffix: fileName.substr(-4)
|
||||
readonly property bool isFont: suffix === ".ttf" || suffix === ".otf"
|
||||
readonly property bool isEffect: suffix === ".qep"
|
||||
property bool currFileSelected: false
|
||||
|
||||
MouseArea {
|
||||
@@ -180,7 +181,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
|
||||
allowTooltip = true
|
||||
}
|
||||
onPositionChanged: tooltipBackend.reposition()
|
||||
onPressed: (mouse)=> {
|
||||
onPressed: (mouse) => {
|
||||
forceActiveFocus()
|
||||
allowTooltip = false
|
||||
tooltipBackend.hideTooltip()
|
||||
@@ -212,7 +213,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
|
||||
}
|
||||
}
|
||||
|
||||
onReleased: (mouse)=> {
|
||||
onReleased: (mouse) => {
|
||||
allowTooltip = true
|
||||
if (mouse.button === Qt.LeftButton) {
|
||||
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 {
|
||||
visible: !isFont && mouseArea.containsMouse && !contextMenu.visible
|
||||
text: filePath
|
||||
|
||||
@@ -241,10 +241,15 @@ Item {
|
||||
|
||||
delegate: Section {
|
||||
width: root.width
|
||||
caption: bundleCategory
|
||||
caption: bundleCategoryName
|
||||
addTopPadding: false
|
||||
sectionBackgroundColor: "transparent"
|
||||
visible: bundleCategoryVisible
|
||||
expanded: bundleCategoryExpanded
|
||||
expandOnClick: false
|
||||
onToggleExpand: bundleCategoryExpanded = !bundleCategoryExpanded
|
||||
onExpand: bundleCategoryExpanded = true
|
||||
onCollapse: bundleCategoryExpanded = false
|
||||
|
||||
Grid {
|
||||
width: scrollView.width
|
||||
@@ -254,7 +259,7 @@ Item {
|
||||
columns: root.width / root.cellWidth
|
||||
|
||||
Repeater {
|
||||
model: bundleMaterialsModel
|
||||
model: bundleCategoryMaterials
|
||||
|
||||
delegate: BundleMaterialItem {
|
||||
width: root.cellWidth
|
||||
|
||||
@@ -80,6 +80,10 @@ StudioControls.Menu {
|
||||
root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.principledMaterialSections);
|
||||
break;
|
||||
|
||||
case "SpecularGlossyMaterial":
|
||||
root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.specularGlossyMaterialSections);
|
||||
break;
|
||||
|
||||
case "CustomMaterial":
|
||||
root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.customMaterialSections);
|
||||
break;
|
||||
|
||||
@@ -401,6 +401,7 @@ Item {
|
||||
ListElement { name: "Qt 5.15" }
|
||||
ListElement { name: "Qt 6.2" }
|
||||
ListElement { name: "Qt 6.3" }
|
||||
ListElement { name: "Qt 6.4" }
|
||||
}
|
||||
|
||||
onActivated: (index) => {
|
||||
|
||||
@@ -50,10 +50,19 @@ Item {
|
||||
Connections {
|
||||
target: Controller
|
||||
function onCollapseAll() {
|
||||
if (collapsible)
|
||||
section.expanded = false
|
||||
if (collapsible) {
|
||||
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)
|
||||
@@ -61,6 +70,8 @@ Item {
|
||||
signal dropExit()
|
||||
signal showContextMenu()
|
||||
signal toggleExpand()
|
||||
signal expand()
|
||||
signal collapse()
|
||||
|
||||
DropArea {
|
||||
id: dropArea
|
||||
|
||||
@@ -49,126 +49,128 @@ QtObject {
|
||||
readonly property string centerHorizontal: "\u0042"
|
||||
readonly property string centerVertical: "\u0043"
|
||||
readonly property string closeCross: "\u0044"
|
||||
readonly property string colorPopupClose: "\u0045"
|
||||
readonly property string columnsAndRows: "\u0046"
|
||||
readonly property string copyStyle: "\u0047"
|
||||
readonly property string cornerA: "\u0048"
|
||||
readonly property string cornerB: "\u0049"
|
||||
readonly property string cornersAll: "\u004A"
|
||||
readonly property string curveDesigner: "\u004B"
|
||||
readonly property string curveEditor: "\u004C"
|
||||
readonly property string customMaterialEditor: "\u004D"
|
||||
readonly property string decisionNode: "\u004E"
|
||||
readonly property string deleteColumn: "\u004F"
|
||||
readonly property string deleteMaterial: "\u0050"
|
||||
readonly property string deleteRow: "\u0051"
|
||||
readonly property string deleteTable: "\u0052"
|
||||
readonly property string detach: "\u0053"
|
||||
readonly property string distributeBottom: "\u0054"
|
||||
readonly property string distributeCenterHorizontal: "\u0055"
|
||||
readonly property string distributeCenterVertical: "\u0056"
|
||||
readonly property string distributeLeft: "\u0057"
|
||||
readonly property string distributeOriginBottomRight: "\u0058"
|
||||
readonly property string distributeOriginCenter: "\u0059"
|
||||
readonly property string distributeOriginNone: "\u005A"
|
||||
readonly property string distributeOriginTopLeft: "\u005B"
|
||||
readonly property string distributeRight: "\u005C"
|
||||
readonly property string distributeSpacingHorizontal: "\u005D"
|
||||
readonly property string distributeSpacingVertical: "\u005E"
|
||||
readonly property string distributeTop: "\u005F"
|
||||
readonly property string download: "\u0060"
|
||||
readonly property string downloadUnavailable: "\u0061"
|
||||
readonly property string downloadUpdate: "\u0062"
|
||||
readonly property string downloaded: "\u0063"
|
||||
readonly property string edit: "\u0064"
|
||||
readonly property string eyeDropper: "\u0065"
|
||||
readonly property string favorite: "\u0066"
|
||||
readonly property string flowAction: "\u0067"
|
||||
readonly property string flowTransition: "\u0068"
|
||||
readonly property string fontStyleBold: "\u0069"
|
||||
readonly property string fontStyleItalic: "\u006A"
|
||||
readonly property string fontStyleStrikethrough: "\u006B"
|
||||
readonly property string fontStyleUnderline: "\u006C"
|
||||
readonly property string gradient: "\u006D"
|
||||
readonly property string gridView: "\u006E"
|
||||
readonly property string idAliasOff: "\u006F"
|
||||
readonly property string idAliasOn: "\u0070"
|
||||
readonly property string imported: "\u0071"
|
||||
readonly property string infinity: "\u0072"
|
||||
readonly property string keyframe: "\u0073"
|
||||
readonly property string linkTriangle: "\u0074"
|
||||
readonly property string linked: "\u0075"
|
||||
readonly property string listView: "\u0076"
|
||||
readonly property string lockOff: "\u0077"
|
||||
readonly property string lockOn: "\u0078"
|
||||
readonly property string materialPreviewEnvironment: "\u0079"
|
||||
readonly property string materialPreviewModel: "\u007A"
|
||||
readonly property string mergeCells: "\u007B"
|
||||
readonly property string minus: "\u007C"
|
||||
readonly property string mirror: "\u007D"
|
||||
readonly property string newMaterial: "\u007E"
|
||||
readonly property string openMaterialBrowser: "\u007F"
|
||||
readonly property string orientation: "\u0080"
|
||||
readonly property string paddingEdge: "\u0081"
|
||||
readonly property string paddingFrame: "\u0082"
|
||||
readonly property string pasteStyle: "\u0083"
|
||||
readonly property string pause: "\u0084"
|
||||
readonly property string pin: "\u0085"
|
||||
readonly property string play: "\u0086"
|
||||
readonly property string plus: "\u0087"
|
||||
readonly property string promote: "\u0088"
|
||||
readonly property string readOnly: "\u0089"
|
||||
readonly property string redo: "\u008A"
|
||||
readonly property string rotationFill: "\u008B"
|
||||
readonly property string rotationOutline: "\u008C"
|
||||
readonly property string search: "\u008D"
|
||||
readonly property string sectionToggle: "\u008E"
|
||||
readonly property string splitColumns: "\u008F"
|
||||
readonly property string splitRows: "\u0090"
|
||||
readonly property string startNode: "\u0091"
|
||||
readonly property string testIcon: "\u0092"
|
||||
readonly property string textAlignBottom: "\u0093"
|
||||
readonly property string textAlignCenter: "\u0094"
|
||||
readonly property string textAlignJustified: "\u0095"
|
||||
readonly property string textAlignLeft: "\u0096"
|
||||
readonly property string textAlignMiddle: "\u0097"
|
||||
readonly property string textAlignRight: "\u0098"
|
||||
readonly property string textAlignTop: "\u0099"
|
||||
readonly property string textBulletList: "\u009A"
|
||||
readonly property string textFullJustification: "\u009B"
|
||||
readonly property string textNumberedList: "\u009D"
|
||||
readonly property string tickIcon: "\u009E"
|
||||
readonly property string translationCreateFiles: "\u009F"
|
||||
readonly property string translationCreateReport: "\u00A0"
|
||||
readonly property string translationExport: "\u00A1"
|
||||
readonly property string translationImport: "\u00A2"
|
||||
readonly property string translationSelectLanguages: "\u00A3"
|
||||
readonly property string translationTest: "\u00A4"
|
||||
readonly property string transparent: "\u00A5"
|
||||
readonly property string triState: "\u00A6"
|
||||
readonly property string triangleArcA: "\u00A7"
|
||||
readonly property string triangleArcB: "\u00A8"
|
||||
readonly property string triangleCornerA: "\u00A9"
|
||||
readonly property string triangleCornerB: "\u00AA"
|
||||
readonly property string unLinked: "\u00AB"
|
||||
readonly property string undo: "\u00AC"
|
||||
readonly property string unpin: "\u00AE"
|
||||
readonly property string upDownIcon: "\u00AF"
|
||||
readonly property string upDownSquare2: "\u00B0"
|
||||
readonly property string visibilityOff: "\u00B1"
|
||||
readonly property string visibilityOn: "\u00B2"
|
||||
readonly property string wildcard: "\u00B3"
|
||||
readonly property string wizardsAutomotive: "\u00B4"
|
||||
readonly property string wizardsDesktop: "\u00B5"
|
||||
readonly property string wizardsGeneric: "\u00B6"
|
||||
readonly property string wizardsMcuEmpty: "\u00B7"
|
||||
readonly property string wizardsMcuGraph: "\u00B8"
|
||||
readonly property string wizardsMobile: "\u00B9"
|
||||
readonly property string wizardsUnknown: "\u00BA"
|
||||
readonly property string zoomAll: "\u00BB"
|
||||
readonly property string zoomIn: "\u00BC"
|
||||
readonly property string zoomOut: "\u00BD"
|
||||
readonly property string zoomSelection: "\u00BE"
|
||||
readonly property string closeLink: "\u0045"
|
||||
readonly property string colorPopupClose: "\u0046"
|
||||
readonly property string columnsAndRows: "\u0047"
|
||||
readonly property string copyLink: "\u0048"
|
||||
readonly property string copyStyle: "\u0049"
|
||||
readonly property string cornerA: "\u004A"
|
||||
readonly property string cornerB: "\u004B"
|
||||
readonly property string cornersAll: "\u004C"
|
||||
readonly property string curveDesigner: "\u004D"
|
||||
readonly property string curveEditor: "\u004E"
|
||||
readonly property string customMaterialEditor: "\u004F"
|
||||
readonly property string decisionNode: "\u0050"
|
||||
readonly property string deleteColumn: "\u0051"
|
||||
readonly property string deleteMaterial: "\u0052"
|
||||
readonly property string deleteRow: "\u0053"
|
||||
readonly property string deleteTable: "\u0054"
|
||||
readonly property string detach: "\u0055"
|
||||
readonly property string distributeBottom: "\u0056"
|
||||
readonly property string distributeCenterHorizontal: "\u0057"
|
||||
readonly property string distributeCenterVertical: "\u0058"
|
||||
readonly property string distributeLeft: "\u0059"
|
||||
readonly property string distributeOriginBottomRight: "\u005A"
|
||||
readonly property string distributeOriginCenter: "\u005B"
|
||||
readonly property string distributeOriginNone: "\u005C"
|
||||
readonly property string distributeOriginTopLeft: "\u005D"
|
||||
readonly property string distributeRight: "\u005E"
|
||||
readonly property string distributeSpacingHorizontal: "\u005F"
|
||||
readonly property string distributeSpacingVertical: "\u0060"
|
||||
readonly property string distributeTop: "\u0061"
|
||||
readonly property string download: "\u0062"
|
||||
readonly property string downloadUnavailable: "\u0063"
|
||||
readonly property string downloadUpdate: "\u0064"
|
||||
readonly property string downloaded: "\u0065"
|
||||
readonly property string edit: "\u0066"
|
||||
readonly property string eyeDropper: "\u0067"
|
||||
readonly property string favorite: "\u0068"
|
||||
readonly property string flowAction: "\u0069"
|
||||
readonly property string flowTransition: "\u006A"
|
||||
readonly property string fontStyleBold: "\u006B"
|
||||
readonly property string fontStyleItalic: "\u006C"
|
||||
readonly property string fontStyleStrikethrough: "\u006D"
|
||||
readonly property string fontStyleUnderline: "\u006E"
|
||||
readonly property string gradient: "\u006F"
|
||||
readonly property string gridView: "\u0070"
|
||||
readonly property string idAliasOff: "\u0071"
|
||||
readonly property string idAliasOn: "\u0072"
|
||||
readonly property string infinity: "\u0073"
|
||||
readonly property string keyframe: "\u0074"
|
||||
readonly property string linkTriangle: "\u0075"
|
||||
readonly property string linked: "\u0076"
|
||||
readonly property string listView: "\u0077"
|
||||
readonly property string lockOff: "\u0078"
|
||||
readonly property string lockOn: "\u0079"
|
||||
readonly property string materialPreviewEnvironment: "\u007A"
|
||||
readonly property string materialPreviewModel: "\u007B"
|
||||
readonly property string mergeCells: "\u007C"
|
||||
readonly property string minus: "\u007D"
|
||||
readonly property string mirror: "\u007E"
|
||||
readonly property string newMaterial: "\u007F"
|
||||
readonly property string openLink: "\u0080"
|
||||
readonly property string openMaterialBrowser: "\u0081"
|
||||
readonly property string orientation: "\u0082"
|
||||
readonly property string paddingEdge: "\u0083"
|
||||
readonly property string paddingFrame: "\u0084"
|
||||
readonly property string pasteStyle: "\u0085"
|
||||
readonly property string pause: "\u0086"
|
||||
readonly property string pin: "\u0087"
|
||||
readonly property string play: "\u0088"
|
||||
readonly property string plus: "\u0089"
|
||||
readonly property string promote: "\u008A"
|
||||
readonly property string readOnly: "\u008B"
|
||||
readonly property string redo: "\u008C"
|
||||
readonly property string rotationFill: "\u008D"
|
||||
readonly property string rotationOutline: "\u008E"
|
||||
readonly property string search: "\u008F"
|
||||
readonly property string sectionToggle: "\u0090"
|
||||
readonly property string splitColumns: "\u0091"
|
||||
readonly property string splitRows: "\u0092"
|
||||
readonly property string startNode: "\u0093"
|
||||
readonly property string testIcon: "\u0094"
|
||||
readonly property string textAlignBottom: "\u0095"
|
||||
readonly property string textAlignCenter: "\u0096"
|
||||
readonly property string textAlignJustified: "\u0097"
|
||||
readonly property string textAlignLeft: "\u0098"
|
||||
readonly property string textAlignMiddle: "\u0099"
|
||||
readonly property string textAlignRight: "\u009A"
|
||||
readonly property string textAlignTop: "\u009B"
|
||||
readonly property string textBulletList: "\u009D"
|
||||
readonly property string textFullJustification: "\u009E"
|
||||
readonly property string textNumberedList: "\u009F"
|
||||
readonly property string tickIcon: "\u00A0"
|
||||
readonly property string translationCreateFiles: "\u00A1"
|
||||
readonly property string translationCreateReport: "\u00A2"
|
||||
readonly property string translationExport: "\u00A3"
|
||||
readonly property string translationImport: "\u00A4"
|
||||
readonly property string translationSelectLanguages: "\u00A5"
|
||||
readonly property string translationTest: "\u00A6"
|
||||
readonly property string transparent: "\u00A7"
|
||||
readonly property string triState: "\u00A8"
|
||||
readonly property string triangleArcA: "\u00A9"
|
||||
readonly property string triangleArcB: "\u00AA"
|
||||
readonly property string triangleCornerA: "\u00AB"
|
||||
readonly property string triangleCornerB: "\u00AC"
|
||||
readonly property string unLinked: "\u00AE"
|
||||
readonly property string undo: "\u00AF"
|
||||
readonly property string unpin: "\u00B0"
|
||||
readonly property string upDownIcon: "\u00B1"
|
||||
readonly property string upDownSquare2: "\u00B2"
|
||||
readonly property string visibilityOff: "\u00B3"
|
||||
readonly property string visibilityOn: "\u00B4"
|
||||
readonly property string wildcard: "\u00B5"
|
||||
readonly property string wizardsAutomotive: "\u00B6"
|
||||
readonly property string wizardsDesktop: "\u00B7"
|
||||
readonly property string wizardsGeneric: "\u00B8"
|
||||
readonly property string wizardsMcuEmpty: "\u00B9"
|
||||
readonly property string wizardsMcuGraph: "\u00BA"
|
||||
readonly property string wizardsMobile: "\u00BB"
|
||||
readonly property string wizardsUnknown: "\u00BC"
|
||||
readonly property string zoomAll: "\u00BD"
|
||||
readonly property string zoomIn: "\u00BE"
|
||||
readonly property string zoomOut: "\u00BF"
|
||||
readonly property string zoomSelection: "\u00C0"
|
||||
|
||||
readonly property font iconFont: Qt.font({
|
||||
"family": controlIcons.name,
|
||||
|
||||
@@ -264,6 +264,14 @@
|
||||
'TargetQuickVersion': '6.3',
|
||||
'TargetQuick3DVersion': '6.3'
|
||||
})"
|
||||
},
|
||||
{
|
||||
"trKey": "Qt 6.4",
|
||||
"value":
|
||||
"({
|
||||
'TargetQuickVersion': '6.4',
|
||||
'TargetQuick3DVersion': '6.4'
|
||||
})"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
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)
|
||||
find_package(Qul)
|
||||
|
||||
@@ -261,6 +261,13 @@
|
||||
"({
|
||||
'TargetQuickVersion': '6.3'
|
||||
})"
|
||||
},
|
||||
{
|
||||
"trKey": "Qt 6.4",
|
||||
"value":
|
||||
"({
|
||||
'TargetQuickVersion': '6.4'
|
||||
})"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -71,6 +71,7 @@ Project {
|
||||
Environment {
|
||||
QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf"
|
||||
QT_AUTO_SCREEN_SCALE_FACTOR: "1"
|
||||
QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT: "1"
|
||||
@if %{IsQt6Project}
|
||||
@else
|
||||
QMLSCENE_CORE_PROFILE: "true" // Required for macOS, but can create issues on embedded Linux
|
||||
@@ -99,7 +100,7 @@ Project {
|
||||
/* Required for deployment */
|
||||
targetDirectory: "/opt/%{ProjectName}"
|
||||
|
||||
qdsVersion: "3.7"
|
||||
qdsVersion: "3.8"
|
||||
|
||||
quickVersion: "%{QtQuickVersion}"
|
||||
|
||||
|
||||
@@ -15,4 +15,5 @@ void set_qt_environment()
|
||||
qputenv("QT_ENABLE_HIGHDPI_SCALING", "0");
|
||||
qputenv("QT_LOGGING_RULES", "qt.qml.connections=false");
|
||||
qputenv("QT_QUICK_CONTROLS_CONF", ":/qtquickcontrols2.conf");
|
||||
qputenv("QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT", "1");
|
||||
}
|
||||
|
||||
@@ -259,6 +259,13 @@
|
||||
"({
|
||||
'TargetQuickVersion': '6.3'
|
||||
})"
|
||||
},
|
||||
{
|
||||
"trKey": "Qt 6.4",
|
||||
"value":
|
||||
"({
|
||||
'TargetQuickVersion': '6.4'
|
||||
})"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
{ "key": "ProjectPluginClassName", "value": "%{ProjectName}Plugin" },
|
||||
{ "key": "QmlProjectFileName", "value": "%{JS: Util.fileName('%{ProjectName}', 'qmlproject')}" },
|
||||
{ "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": "QtQuickVersion", "value": "%{JS: %{TargetQtVersion}.TargetQuickVersion}" },
|
||||
{ "key": "QtQuickFeature", "value": "QtSupport.Wizards.FeatureQtQuick.%{QtQuickVersion}" },
|
||||
@@ -216,6 +218,13 @@
|
||||
"({
|
||||
'TargetQuickVersion': '6.3'
|
||||
})"
|
||||
},
|
||||
{
|
||||
"trKey": "Qt 6.4",
|
||||
"value":
|
||||
"({
|
||||
'TargetQuickVersion': '6.4'
|
||||
})"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -216,6 +216,13 @@
|
||||
"({
|
||||
'TargetQuickVersion': '6.3'
|
||||
})"
|
||||
},
|
||||
{
|
||||
"trKey": "Qt 6.4",
|
||||
"value":
|
||||
"({
|
||||
'TargetQuickVersion': '6.4'
|
||||
})"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -216,6 +216,13 @@
|
||||
"({
|
||||
'TargetQuickVersion': '6.3'
|
||||
})"
|
||||
},
|
||||
{
|
||||
"trKey": "Qt 6.4",
|
||||
"value":
|
||||
"({
|
||||
'TargetQuickVersion': '6.4'
|
||||
})"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
40
share/qtcreator/templates/wizards/files/effect/wizard.json
Normal 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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -14619,46 +14619,6 @@ Další podrobnosti hledejte v /etc/sysctl.d/10-ptrace.conf
|
||||
</context>
|
||||
<context>
|
||||
<name>TextEditor::DisplaySettingsPage</name>
|
||||
<message>
|
||||
<source>Display</source>
|
||||
<translation type="obsolete">Zobrazení</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display line &numbers</source>
|
||||
<translation type="obsolete">&Zobrazit čísla řádků</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display &folding markers</source>
|
||||
<translation type="obsolete">Zobrazit znaky s&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>&Visualize whitespace</source>
|
||||
<translation type="obsolete">&Zviditelnit prázdné znaky</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight current &line</source>
|
||||
<translation type="obsolete">Zvýraznit nynější řá&dek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Text Wrapping</source>
|
||||
<translation type="obsolete">Zalomení textu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable text &wrapping</source>
|
||||
<translation type="obsolete">Povolit &zalomení textu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display right &margin at column:</source>
|
||||
<translation type="obsolete">Zobrazit pravý &okraj sloupce:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight &blocks</source>
|
||||
<translation type="obsolete">Zvýraznit &bloky</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Animate matching parentheses</source>
|
||||
<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>
|
||||
<translation type="obsolete">Vyznačit textové změny</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mark &text changes</source>
|
||||
<translation type="obsolete">Vyznačit &textové změny</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Animate matching parentheses</source>
|
||||
<translation type="obsolete">&Rozhýbat odpovídající závorky</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-fold first &comment</source>
|
||||
<translation type="obsolete">Automaticky složit první po&známku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Center &cursor on scroll</source>
|
||||
<translation type="obsolete">Při projíždění držet &ukazovátko vprostřed</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<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>
|
||||
<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>
|
||||
<source>Insert &spaces instead of tabs</source>
|
||||
<translation type="obsolete">Vložit místo zarážek prázdné &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>
|
||||
<translation type="obsolete">Založeno na okolních řádcích</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ta&b size:</source>
|
||||
<translation type="obsolete">Šířka &zarážky:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Indent size:</source>
|
||||
<translation type="obsolete">&Velikost odsazení:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable automatic &indentation</source>
|
||||
<translation type="obsolete">Povolit automatické &odsazení</translation>
|
||||
@@ -30835,74 +30763,6 @@ Určuje, jak se chová zpětná klávesa (backspace) co se týče odsazování.
|
||||
<source>&Backspace follows indentation</source>
|
||||
<translation type="obsolete">&Zpětná klávesa sleduje hloubku odsazení</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Align continuation lines:</source>
|
||||
<translation type="obsolete">Zarovnání navazujících řádků:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body>
|
||||
Influences the indentation of continuation lines.
|
||||
|
||||
<ul>
|
||||
<li>Not At All: Do not align at all. Lines will only be indented to the current logical indentation depth.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>With Spaces: Always use spaces for alignment, regardless of the other indentation settings.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>With Regular Indent: Use tabs and/or spaces for alignment, as configured above.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)(tab)(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
</ul></body></html></source>
|
||||
<translation type="obsolete"><html><head/><body>
|
||||
Určuje chování odsazení se zřetelem k navazujícím řádkům.
|
||||
|
||||
<ul>
|
||||
<li>Žádné odsazení: Žádné odsazení dodatečně k logickému odsazení.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>Prázdné znaky: Dodatečné odsazení pomocí prázdných znaků.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>Normální odsazení: Používají se zarážky nebo prázdné znaky odpovídající hořejšímu nastavení.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)(tab)(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
</ul></body></html></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>
|
||||
<source>Tab key performs auto-indent:</source>
|
||||
<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>
|
||||
<translation type="obsolete">Pouze v prázdném místu na začátku řádku</translation>
|
||||
</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>
|
||||
<name>Valgrind</name>
|
||||
|
||||
@@ -47228,10 +47228,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e
|
||||
</context>
|
||||
<context>
|
||||
<name>TextEditor::DisplaySettingsPage</name>
|
||||
<message>
|
||||
<source>Display</source>
|
||||
<translation>Anzeige</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<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>
|
||||
<translation>Möchten Sie das Farbschema löschen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete</source>
|
||||
<translation>Löschen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Scheme Changed</source>
|
||||
<translation>Farbschema geändert</translation>
|
||||
|
||||
@@ -15872,50 +15872,10 @@ Influence l'indentation des lignes de continuation.
|
||||
</context>
|
||||
<context>
|
||||
<name>TextEditor::DisplaySettingsPage</name>
|
||||
<message>
|
||||
<source>Display</source>
|
||||
<translation type="obsolete">Affichage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display line &numbers</source>
|
||||
<translation type="obsolete">Afficher les &numéros de ligne</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display &folding markers</source>
|
||||
<translation type="obsolete">Affiche les marqueurs de &pliage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show tabs and spaces.</source>
|
||||
<translation type="obsolete">Afficher les tabulations et espaces.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Visualize whitespace</source>
|
||||
<translation type="obsolete">&Visualiser les espaces</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight current &line</source>
|
||||
<translation type="obsolete">Surligner la &ligne courante</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight &blocks</source>
|
||||
<translation type="obsolete">Surligner les &blocs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Animate matching parentheses</source>
|
||||
<translation type="obsolete">Animer les parenthèses correspondantes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Text Wrapping</source>
|
||||
<translation type="obsolete">Retour à la ligne dynamique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable text &wrapping</source>
|
||||
<translation type="obsolete">Activer le &retour à la ligne automatique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display right &margin at column:</source>
|
||||
<translation type="obsolete">Afficher une &marge à la colonne :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Navigation</source>
|
||||
<translation type="obsolete">Navigation</translation>
|
||||
@@ -15929,24 +15889,6 @@ Influence l'indentation des lignes de continuation.
|
||||
<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>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mark &text changes</source>
|
||||
<translation type="obsolete">Marquer les modifications de &texte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Animate matching parentheses</source>
|
||||
<translation type="obsolete">&Animer les parenthèses correspondantes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-fold first &comment</source>
|
||||
<translatorcomment>reformulation à l'infinitif
|
||||
francis : en effet, une erreur de ma part --> validé.</translatorcomment>
|
||||
<translation type="obsolete">Replier automatiquement le premier &commentaire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Center &cursor on scroll</source>
|
||||
<translation type="obsolete">Centrer le &curseur sur le barre de défilement</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TextEditor::FontSettingsPage</name>
|
||||
@@ -37242,14 +37184,6 @@ Ils requièrent Qt 4.7.4 ou supérieur et l'ensemble de composants install
|
||||
</context>
|
||||
<context>
|
||||
<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>
|
||||
<source>Insert &spaces instead of tabs</source>
|
||||
<translation type="obsolete">Insérer des e&spaces au lieu de tabulations</translation>
|
||||
@@ -37262,14 +37196,6 @@ Ils requièrent Qt 4.7.4 ou supérieur et l'ensemble de composants install
|
||||
<source>Based on the surrounding lines</source>
|
||||
<translation type="obsolete">Basé sur les lignes environnantes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ta&b size:</source>
|
||||
<translation type="obsolete">Taille de ta&bulation : </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Indent size:</source>
|
||||
<translation type="obsolete">Taille de l'&indentation : </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable automatic &indentation</source>
|
||||
<translation type="obsolete">Activer l'&indentation automatique</translation>
|
||||
@@ -37282,71 +37208,6 @@ Ils requièrent Qt 4.7.4 ou supérieur et l'ensemble de composants install
|
||||
<source>&Backspace follows indentation</source>
|
||||
<translation type="obsolete">La touche &retour arrière suit l'indentation</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Align continuation lines:</source>
|
||||
<translation type="obsolete">Aligner les lignes de continuation : </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body>
|
||||
Influences the indentation of continuation lines.
|
||||
|
||||
<ul>
|
||||
<li>Not At All: Do not align at all. Lines will only be indented to the current logical indentation depth.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>With Spaces: Always use spaces for alignment, regardless of the other indentation settings.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>With Regular Indent: Use tabs and/or spaces for alignment, as configured above.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)(tab)(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
</ul></body></html></source>
|
||||
<translation type="obsolete"><html><head/><body>
|
||||
Influence l'indentation des lignes de continuation.
|
||||
<ul>
|
||||
<li>Pas du tout : ne pas aligner. Les lignes ne seront indentées jusqu'à la profondeur d'indentation logique.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)c, d);
|
||||
</pre>
|
||||
</li>
|
||||
<li>Avec espaces : toujours utiliser des espaces pour l'alignement, sans tenir compte des autres paramètres d'indentation.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
<li>Avec indentation régulière : utiliser des tabulations et/ou des espaces pour l'alignement, en fonction de la configuration.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)(tab)(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
</ul></body></html></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>
|
||||
<source>Tab key performs auto-indent:</source>
|
||||
<translation type="obsolete">La touche tabulation active l'identation automatique : </translation>
|
||||
@@ -37363,22 +37224,6 @@ Influence l'indentation des lignes de continuation.
|
||||
<source>In Leading White Space</source>
|
||||
<translation type="obsolete">En début de ligne uniquement</translation>
|
||||
</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>
|
||||
<name>Valgrind</name>
|
||||
@@ -43644,6 +43489,8 @@ Specifie comment retour arrière se comporte avec l'indentation.
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-fold first &comment</source>
|
||||
<translatorcomment>reformulation à l'infinitif
|
||||
francis : en effet, une erreur de ma part --> validé.</translatorcomment>
|
||||
<translation>Replier automatiquement le premier &commentaire</translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -52042,10 +52042,6 @@ Row: %4, Column: %5
|
||||
</context>
|
||||
<context>
|
||||
<name>TextEditor::DisplaySettingsPage</name>
|
||||
<message>
|
||||
<source>Display</source>
|
||||
<translation>表示</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TextEditor::FontSettingsPageWidget</name>
|
||||
|
||||
@@ -46346,10 +46346,6 @@ In addition, Shift+Enter inserts an escape character at the cursor position and
|
||||
</context>
|
||||
<context>
|
||||
<name>TextEditor::DisplaySettingsPage</name>
|
||||
<message>
|
||||
<source>Display</source>
|
||||
<translation>Отображение</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display line &numbers</source>
|
||||
<translation>Показывать &номера строк</translation>
|
||||
@@ -46499,10 +46495,6 @@ In addition, Shift+Enter inserts an escape character at the cursor position and
|
||||
<source>Color Scheme</source>
|
||||
<translation>Цветовая схема</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete</source>
|
||||
<translation>Удалить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy...</source>
|
||||
<translation>Копировать...</translation>
|
||||
|
||||
@@ -14944,46 +14944,6 @@ Influences the indentation of continuation lines.
|
||||
</context>
|
||||
<context>
|
||||
<name>TextEditor::DisplaySettingsPage</name>
|
||||
<message>
|
||||
<source>Display</source>
|
||||
<translation type="obsolete">显示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display line &numbers</source>
|
||||
<translation type="obsolete">显示行号(&N)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display &folding markers</source>
|
||||
<translation type="obsolete">显示折叠标记(&F)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show tabs and spaces.</source>
|
||||
<translation type="obsolete">显示制表符和空白.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Visualize whitespace</source>
|
||||
<translation type="obsolete">标示空白</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight current &line</source>
|
||||
<translation type="obsolete">高亮显示当前行(&L)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Text Wrapping</source>
|
||||
<translation type="obsolete">文字折行</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable text &wrapping</source>
|
||||
<translation type="obsolete">开启文字折行</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display right &margin at column:</source>
|
||||
<translation type="obsolete">显示右边分界(&M)在列:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight &blocks</source>
|
||||
<translation type="obsolete">高亮显示段落(&B)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Animate matching parentheses</source>
|
||||
<translation type="obsolete">动画显示对应的括号</translation>
|
||||
@@ -15000,22 +14960,6 @@ Influences the indentation of continuation lines.
|
||||
<source>Mark text changes</source>
|
||||
<translation type="obsolete">标记文本改变</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mark &text changes</source>
|
||||
<translation type="obsolete">标记文本改变(&T)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Animate matching parentheses</source>
|
||||
<translation type="obsolete">动画显示对应的括号(&A)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-fold first &comment</source>
|
||||
<translation type="obsolete">自动折叠开头的注释(&C)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Center &cursor on scroll</source>
|
||||
<translation type="obsolete">滚动时居中光标(&C)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<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>
|
||||
<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>
|
||||
<source>Insert &spaces instead of tabs</source>
|
||||
<translation type="obsolete">插入空格代替制表符(&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>
|
||||
<translation type="obsolete">依据周围行的情况</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ta&b size:</source>
|
||||
<translation type="obsolete">制表符尺寸(&B):</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Indent size:</source>
|
||||
<translation type="obsolete">缩进尺寸(&i):</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable automatic &indentation</source>
|
||||
<translation type="obsolete">开启自动缩进(&i)</translation>
|
||||
@@ -35281,74 +35209,6 @@ Requires Qt 4.7.4 or newer, and the component set installed for your Qt version.
|
||||
<source>&Backspace follows indentation</source>
|
||||
<translation type="obsolete">退格键跟随缩进(&B)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Align continuation lines:</source>
|
||||
<translation type="obsolete">对齐连续行:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body>
|
||||
Influences the indentation of continuation lines.
|
||||
|
||||
<ul>
|
||||
<li>Not At All: Do not align at all. Lines will only be indented to the current logical indentation depth.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>With Spaces: Always use spaces for alignment, regardless of the other indentation settings.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>With Regular Indent: Use tabs and/or spaces for alignment, as configured above.
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)(tab)(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
</ul></body></html></source>
|
||||
<translation type="obsolete"><html><head/><body>
|
||||
改变连续行的缩进
|
||||
|
||||
<ul>
|
||||
<li>不对齐: 不进行对齐。代码行只根据当前逻辑缩进深度进行缩进。
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>伴随空格: 允许使用空格进行对齐,忽略其他缩进设置。
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li>伴随规则缩进: 在原设置上使用 tab 或 空格进行对齐。
|
||||
<pre>
|
||||
(tab)int i = foo(a, b
|
||||
(tab)(tab)(tab) c, d);
|
||||
</pre>
|
||||
</li>
|
||||
</ul></body></html></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>
|
||||
<source>Never</source>
|
||||
<translation type="obsolete">从不</translation>
|
||||
@@ -35361,22 +35221,6 @@ Influences the indentation of continuation lines.
|
||||
<source>In Leading White Space</source>
|
||||
<translation type="obsolete">仅用于行首空白</translation>
|
||||
</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>
|
||||
<name>Valgrind</name>
|
||||
|
||||
@@ -74,10 +74,18 @@ QStringList DeviceShell::missingFeatures() const { return m_missingFeatures; }
|
||||
|
||||
RunResult DeviceShell::run(const CommandLine &cmd, const QByteArray &stdInData)
|
||||
{
|
||||
if (m_shellScriptState == State::NoScript) {
|
||||
// Fallback ...
|
||||
// If the script failed to install, use QtcProcess directly instead.
|
||||
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;
|
||||
proc.setCommand(createFallbackCommand(cmd));
|
||||
const CommandLine fallbackCmd = createFallbackCommand(cmd);
|
||||
qCDebug(deviceShellLog) << "Running fallback:" << fallbackCmd;
|
||||
proc.setCommand(fallbackCmd);
|
||||
proc.setWriteData(stdInData);
|
||||
|
||||
proc.start();
|
||||
@@ -105,7 +113,7 @@ RunResult DeviceShell::run(const CommandLine &cmd, const QByteArray &stdInData)
|
||||
.arg(id)
|
||||
.arg(QString::fromLatin1(stdInData.toBase64()))
|
||||
.arg(cmd.toUserOutput());
|
||||
qCDebug(deviceShellLog) << "Running:" << command;
|
||||
qCDebug(deviceShellLog) << "Running via shell:" << command;
|
||||
m_shellProcess->writeRaw(command.toUtf8());
|
||||
});
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include "qtcassert.h"
|
||||
#include "qtcprocess.h"
|
||||
#include "terminalcommand.h"
|
||||
#include "winutils.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QLocalServer>
|
||||
@@ -22,17 +21,19 @@
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
|
||||
# include <windows.h>
|
||||
# include <stdlib.h>
|
||||
# include <cstring>
|
||||
#include "winutils.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
|
||||
#else
|
||||
|
||||
# include <sys/stat.h>
|
||||
# include <sys/types.h>
|
||||
# include <errno.h>
|
||||
# include <string.h>
|
||||
# include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#endif
|
||||
|
||||
@@ -423,7 +424,9 @@ void TerminalImpl::sendControlSignal(ControlSignal controlSignal)
|
||||
switch (controlSignal) {
|
||||
case ControlSignal::Terminate:
|
||||
case ControlSignal::Kill:
|
||||
stopProcess();
|
||||
killProcess();
|
||||
if (HostOsInfo::isWindowsHost())
|
||||
killStub();
|
||||
break;
|
||||
case ControlSignal::Interrupt:
|
||||
sendCommand('i');
|
||||
@@ -468,13 +471,13 @@ void TerminalImpl::killStub()
|
||||
TerminateProcess(d->m_pid->hProcess, (unsigned)-1);
|
||||
WaitForSingleObject(d->m_pid->hProcess, INFINITE);
|
||||
cleanupStub();
|
||||
emitFinished(-1, QProcess::CrashExit);
|
||||
#else
|
||||
sendCommand('s');
|
||||
stubServerShutdown();
|
||||
d->m_process.stop();
|
||||
d->m_process.waitForFinished();
|
||||
#endif
|
||||
|
||||
emitFinished(-1, QProcess::CrashExit);
|
||||
}
|
||||
|
||||
void TerminalImpl::stopProcess()
|
||||
@@ -519,13 +522,13 @@ QString TerminalImpl::stubServerListen()
|
||||
if (errno != EEXIST)
|
||||
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)) {
|
||||
::rmdir(d->m_stubServerDir.constData());
|
||||
return QtcProcess::tr("Cannot create socket \"%1\": %2")
|
||||
.arg(stubServer, d->m_stubServer.errorString());
|
||||
}
|
||||
return QString();
|
||||
return {};
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -253,6 +253,13 @@ void Theme::setInitialPalette(Theme *initTheme)
|
||||
initialPalette();
|
||||
}
|
||||
|
||||
void Theme::setHelpMenu(QMenu *menu)
|
||||
{
|
||||
#ifdef Q_OS_MACOS
|
||||
Internal::setMacOSHelpMenu(menu);
|
||||
#endif
|
||||
}
|
||||
|
||||
QPalette Theme::initialPalette()
|
||||
{
|
||||
static QPalette palette = copyPalette(QApplication::palette());
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <QObject>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QMenu;
|
||||
class QPalette;
|
||||
class QSettings;
|
||||
QT_END_NAMESPACE
|
||||
@@ -473,6 +474,8 @@ public:
|
||||
|
||||
static void setInitialPalette(Theme *initTheme);
|
||||
|
||||
static void setHelpMenu(QMenu *menu);
|
||||
|
||||
protected:
|
||||
Theme(Theme *originTheme, QObject *parent = nullptr);
|
||||
ThemePrivate *d;
|
||||
|
||||
@@ -3,11 +3,18 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <qglobal.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QMenu;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
namespace Utils {
|
||||
namespace Internal {
|
||||
|
||||
void forceMacAppearance(bool dark);
|
||||
bool currentAppearanceIsDark();
|
||||
void setMacOSHelpMenu(QMenu *menu);
|
||||
|
||||
} // Internal
|
||||
} // Utils
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
#include "theme_mac.h"
|
||||
|
||||
#include <qglobal.h>
|
||||
#include <QMenu>
|
||||
#include <QOperatingSystemVersion>
|
||||
|
||||
#include <AppKit/AppKit.h>
|
||||
@@ -47,5 +47,10 @@ bool currentAppearanceIsDark()
|
||||
return !currentAppearanceMatches(false /*==light*/);
|
||||
}
|
||||
|
||||
void setMacOSHelpMenu(QMenu *menu)
|
||||
{
|
||||
NSApp.helpMenu = menu->toNSMenu();
|
||||
}
|
||||
|
||||
} // Internal
|
||||
} // Utils
|
||||
|
||||
@@ -181,7 +181,8 @@ bool AndroidDeployQtStep::init()
|
||||
}
|
||||
|
||||
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,
|
||||
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 > "
|
||||
|
||||
@@ -293,7 +293,11 @@ void TestCodeParser::scanForTests(const Utils::FilePaths &fileList,
|
||||
qCDebug(LOG) << "File list empty (FullParse) - trying again in a sec";
|
||||
emitUpdateTestTree();
|
||||
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)";
|
||||
m_parserState = FullParse;
|
||||
} else {
|
||||
|
||||
@@ -155,16 +155,9 @@ void TestResultDelegate::currentChanged(const QModelIndex ¤t, const QModel
|
||||
|
||||
void TestResultDelegate::clearCache()
|
||||
{
|
||||
const QModelIndex current = m_lastProcessedIndex;
|
||||
m_lastProcessedIndex = QModelIndex();
|
||||
m_lastProcessedFont = QFont();
|
||||
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
|
||||
|
||||
@@ -250,7 +250,7 @@ QByteArray dummyTextForContext(CharacterContext context, bool closingBraceBlock)
|
||||
case CharacterContext::IfOrElseWithoutScope:
|
||||
return ";";
|
||||
case CharacterContext::NewStatementOrContinuation:
|
||||
return "/**/";
|
||||
return "/*//*/";
|
||||
case CharacterContext::Unknown:
|
||||
default:
|
||||
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.
|
||||
if (dummyText == "/**/" || dummyText.isEmpty()) {
|
||||
if (dummyText == "/*//*/" || dummyText.isEmpty()) {
|
||||
if (block.previous().isValid()) {
|
||||
const int prevEndOffset = Utils::Text::utf8NthLineOffset(block.document(), buffer,
|
||||
block.blockNumber()) + block.previous().text().length();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -90,6 +90,7 @@ private slots:
|
||||
void testClassIndentStructure();
|
||||
void testIndentInitializeVector();
|
||||
void testIndentFunctionArgumentOnNewLine();
|
||||
void testIndentCommentOnNewLine();
|
||||
|
||||
private:
|
||||
void insertLines(const std::vector<QString> &lines);
|
||||
|
||||
@@ -197,19 +197,27 @@ static CMakeConfig configurationFromPresetProbe(
|
||||
const CMakeConfig cache = configurePreset.cacheVariables
|
||||
? configurePreset.cacheVariables.value()
|
||||
: CMakeConfig();
|
||||
const FilePath cmakeMakeProgram = cache.filePathValueOf(QByteArray("CMAKE_MAKE_PROGRAM"));
|
||||
const FilePath toolchainFile = cache.filePathValueOf(QByteArray("CMAKE_TOOLCHAIN_FILE"));
|
||||
const QString prefixPath = cache.stringValueOf(QByteArray("CMAKE_PREFIX_PATH"));
|
||||
const QString findRootPath = cache.stringValueOf(QByteArray("CMAKE_FIND_ROOT_PATH"));
|
||||
const QString qtHostPath = cache.stringValueOf(QByteArray("QT_HOST_PATH"));
|
||||
|
||||
auto expandCacheValue =
|
||||
[configurePreset, env, importPath, cache](const QString &key) -> QString {
|
||||
QString result = cache.stringValueOf(key.toUtf8());
|
||||
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()) {
|
||||
args.emplace_back(
|
||||
QStringLiteral("-DCMAKE_MAKE_PROGRAM=%1").arg(cmakeMakeProgram.toString()));
|
||||
QStringLiteral("-DCMAKE_MAKE_PROGRAM=%1").arg(cmakeMakeProgram));
|
||||
}
|
||||
if (!toolchainFile.isEmpty()) {
|
||||
args.emplace_back(
|
||||
QStringLiteral("-DCMAKE_TOOLCHAIN_FILE=%1").arg(toolchainFile.toString()));
|
||||
QStringLiteral("-DCMAKE_TOOLCHAIN_FILE=%1").arg(toolchainFile));
|
||||
}
|
||||
if (!prefixPath.isEmpty()) {
|
||||
args.emplace_back(QStringLiteral("-DCMAKE_PREFIX_PATH=%1").arg(prefixPath));
|
||||
@@ -412,6 +420,27 @@ static QVector<ToolChainDescription> extractToolChainsFromCache(const CMakeConfi
|
||||
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,
|
||||
QString *warningMessage) const
|
||||
{
|
||||
@@ -476,6 +505,17 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
config = configurationFromPresetProbe(importPath, configurePreset);
|
||||
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 {
|
||||
config = cache;
|
||||
config << CMakeConfigItem("CMAKE_COMMAND",
|
||||
@@ -566,6 +606,8 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
|
||||
data->generator = config.stringValueOf("CMAKE_GENERATOR");
|
||||
data->extraGenerator = config.stringValueOf("CMAKE_EXTRA_GENERATOR");
|
||||
data->platform = config.stringValueOf("CMAKE_GENERATOR_PLATFORM");
|
||||
if (data->platform.isEmpty())
|
||||
data->platform = extractVisualStudioPlatformFromConfig(config);
|
||||
data->toolset = config.stringValueOf("CMAKE_GENERATOR_TOOLSET");
|
||||
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())
|
||||
return false;
|
||||
|
||||
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)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool haveCMakePreset = false;
|
||||
if (!data->cmakePreset.isEmpty()) {
|
||||
auto presetConfigItem = CMakeConfigurationKitAspect::cmakePresetConfigItem(k);
|
||||
if (data->cmakePreset != presetConfigItem.expandedValue(k))
|
||||
return false;
|
||||
|
||||
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()
|
||||
|
||||
@@ -462,6 +462,7 @@ void CMakeToolItemConfigWidget::onBinaryPathEditingFinished()
|
||||
{
|
||||
updateQchFilePath();
|
||||
store();
|
||||
load(m_model->cmakeToolItem(m_id));
|
||||
}
|
||||
|
||||
void CMakeToolItemConfigWidget::updateQchFilePath()
|
||||
|
||||
@@ -295,6 +295,9 @@ CMakeTool::Version CMakeTool::version() const
|
||||
|
||||
QString CMakeTool::versionDisplay() const
|
||||
{
|
||||
if (m_executable.isEmpty())
|
||||
return {};
|
||||
|
||||
if (!isValid())
|
||||
return Tr::tr("Version not parseable");
|
||||
|
||||
|
||||
@@ -99,22 +99,17 @@ static QString expandMacroEnv(const QString ¯oPrefix,
|
||||
return result;
|
||||
}
|
||||
|
||||
static QHash<QString, QString> getEnvCombined(
|
||||
const std::optional<QHash<QString, QString>> &optPresetEnv, const Utils::Environment &env)
|
||||
static Utils::Environment getEnvCombined(const std::optional<Utils::Environment> &optPresetEnv,
|
||||
const Utils::Environment &env)
|
||||
{
|
||||
QHash<QString, QString> result;
|
||||
|
||||
for (auto it = env.constBegin(); it != env.constEnd(); ++it) {
|
||||
if (it.value().second)
|
||||
result.insert(it.key().name, it.value().first);
|
||||
}
|
||||
Utils::Environment result = env;
|
||||
|
||||
if (!optPresetEnv)
|
||||
return result;
|
||||
|
||||
QHash<QString, QString> presetEnv = optPresetEnv.value();
|
||||
for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) {
|
||||
result[it->first] = it->second;
|
||||
Utils::Environment presetEnv = optPresetEnv.value();
|
||||
for (auto it = presetEnv.constBegin(); it != presetEnv.constEnd(); ++it) {
|
||||
result.set(it.key().name, it.value().first);
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -125,10 +120,10 @@ void expand(const PresetType &preset,
|
||||
Utils::Environment &env,
|
||||
const Utils::FilePath &sourceDirectory)
|
||||
{
|
||||
const QHash<QString, QString> presetEnv = getEnvCombined(preset.environment, env);
|
||||
for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) {
|
||||
const QString key = it->first;
|
||||
QString value = it->second;
|
||||
const Utils::Environment presetEnv = getEnvCombined(preset.environment, env);
|
||||
for (auto it = presetEnv.constBegin(); it != presetEnv.constEnd(); ++it) {
|
||||
const QString key = it.key().name;
|
||||
QString value = it.value().first;
|
||||
|
||||
expandAllButEnv(preset, sourceDirectory, value);
|
||||
value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) {
|
||||
@@ -161,15 +156,15 @@ void expand(const PresetType &preset,
|
||||
Utils::EnvironmentItems &envItems,
|
||||
const Utils::FilePath &sourceDirectory)
|
||||
{
|
||||
const QHash<QString, QString> presetEnv = preset.environment ? preset.environment.value()
|
||||
: QHash<QString, QString>();
|
||||
for (auto it = presetEnv.constKeyValueBegin(); it != presetEnv.constKeyValueEnd(); ++it) {
|
||||
const QString key = it->first;
|
||||
QString value = it->second;
|
||||
const Utils::Environment presetEnv = preset.environment ? preset.environment.value()
|
||||
: Utils::Environment();
|
||||
for (auto it = presetEnv.constBegin(); it != presetEnv.constEnd(); ++it) {
|
||||
const QString key = it.key().name;
|
||||
QString value = it.value().first;
|
||||
|
||||
expandAllButEnv(preset, sourceDirectory, value);
|
||||
value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) {
|
||||
if (presetEnv.contains(macroName))
|
||||
if (presetEnv.hasKey(macroName))
|
||||
return presetEnv.value(macroName);
|
||||
return QString("${%1}").arg(macroName);
|
||||
});
|
||||
@@ -199,7 +194,7 @@ void expand(const PresetType &preset,
|
||||
{
|
||||
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 ¯oName) {
|
||||
return presetEnv.value(macroName);
|
||||
});
|
||||
@@ -225,7 +220,7 @@ void updateToolchainFile(
|
||||
Utils::FilePath toolchainFile = Utils::FilePath::fromString(toolchainFileName);
|
||||
if (toolchainFile.isRelativePath()) {
|
||||
for (const auto &path : {sourceDirectory, buildDirectory}) {
|
||||
Utils::FilePath probePath = toolchainFile.resolvePath(path);
|
||||
Utils::FilePath probePath = path.resolvePath(toolchainFile);
|
||||
if (probePath.exists() && probePath != path) {
|
||||
toolchainFile = probePath;
|
||||
break;
|
||||
@@ -236,6 +231,8 @@ void updateToolchainFile(
|
||||
if (!toolchainFile.exists())
|
||||
return;
|
||||
|
||||
const QString toolchainFileString = toolchainFile.cleanPath().toString();
|
||||
|
||||
// toolchainFile takes precedence to CMAKE_TOOLCHAIN_FILE
|
||||
CMakeConfig cache = configurePreset.cacheVariables ? configurePreset.cacheVariables.value()
|
||||
: CMakeConfig();
|
||||
@@ -244,11 +241,11 @@ void updateToolchainFile(
|
||||
return item.key == "CMAKE_TOOLCHAIN_FILE";
|
||||
});
|
||||
if (it != cache.end())
|
||||
it->value = toolchainFile.toString().toUtf8();
|
||||
it->value = toolchainFileString.toUtf8();
|
||||
else
|
||||
cache << CMakeConfigItem("CMAKE_TOOLCHAIN_FILE",
|
||||
CMakeConfigItem::FILEPATH,
|
||||
toolchainFile.toString().toUtf8());
|
||||
toolchainFileString.toUtf8());
|
||||
|
||||
configurePreset.cacheVariables = cache;
|
||||
}
|
||||
|
||||
@@ -208,10 +208,10 @@ bool parseConfigurePresets(const QJsonValue &jsonValue,
|
||||
const QJsonObject environmentObj = object.value("environment").toObject();
|
||||
for (const QString &envKey : environmentObj.keys()) {
|
||||
if (!preset.environment)
|
||||
preset.environment = QHash<QString, QString>();
|
||||
preset.environment = Utils::Environment();
|
||||
|
||||
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();
|
||||
@@ -335,10 +335,10 @@ bool parseBuildPresets(const QJsonValue &jsonValue,
|
||||
const QJsonObject environmentObj = object.value("environment").toObject();
|
||||
for (const QString &envKey : environmentObj.keys()) {
|
||||
if (!preset.environment)
|
||||
preset.environment = QHash<QString, QString>();
|
||||
preset.environment = Utils::Environment();
|
||||
|
||||
QJsonValue envValue = environmentObj.value(envKey);
|
||||
preset.environment.value().insert(envKey, envValue.toString());
|
||||
preset.environment.value().set(envKey, envValue.toString());
|
||||
}
|
||||
|
||||
if (object.contains("configurePreset"))
|
||||
@@ -441,6 +441,44 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage
|
||||
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)
|
||||
{
|
||||
if (!condition && other.condition && !other.condition.value().isNull())
|
||||
@@ -449,6 +487,9 @@ void PresetsDetails::ConfigurePreset::inheritFrom(const ConfigurePreset &other)
|
||||
if (!vendor && other.vendor)
|
||||
vendor = other.vendor;
|
||||
|
||||
if (vendor && other.vendor)
|
||||
vendor = merge(other.vendor.value(), vendor.value());
|
||||
|
||||
if (!generator && other.generator)
|
||||
generator = other.generator;
|
||||
|
||||
@@ -472,9 +513,13 @@ void PresetsDetails::ConfigurePreset::inheritFrom(const ConfigurePreset &other)
|
||||
|
||||
if (!cacheVariables && other.cacheVariables)
|
||||
cacheVariables = other.cacheVariables;
|
||||
else if (cacheVariables && other.cacheVariables)
|
||||
cacheVariables = merge(other.cacheVariables.value(), cacheVariables.value());
|
||||
|
||||
if (!environment && other.environment)
|
||||
environment = other.environment;
|
||||
else if (environment && other.environment)
|
||||
environment = merge(other.environment.value(), environment.value());
|
||||
|
||||
if (!warnings && other.warnings)
|
||||
warnings = other.warnings;
|
||||
@@ -494,8 +539,13 @@ void PresetsDetails::BuildPreset::inheritFrom(const BuildPreset &other)
|
||||
if (!vendor && other.vendor)
|
||||
vendor = other.vendor;
|
||||
|
||||
if (vendor && other.vendor)
|
||||
vendor = merge(other.vendor.value(), vendor.value());
|
||||
|
||||
if (!environment && other.environment)
|
||||
environment = other.environment;
|
||||
else if (environment && other.environment)
|
||||
environment = merge(other.environment.value(), environment.value());
|
||||
|
||||
if (!configurePreset && other.configurePreset)
|
||||
configurePreset = other.configurePreset;
|
||||
@@ -508,6 +558,8 @@ void PresetsDetails::BuildPreset::inheritFrom(const BuildPreset &other)
|
||||
|
||||
if (!targets && other.targets)
|
||||
targets = other.targets;
|
||||
else if (targets && other.targets)
|
||||
targets = merge(other.targets.value(), targets.value());
|
||||
|
||||
if (!configuration && other.configuration)
|
||||
configuration = other.configuration;
|
||||
@@ -520,6 +572,8 @@ void PresetsDetails::BuildPreset::inheritFrom(const BuildPreset &other)
|
||||
|
||||
if (!nativeToolOptions && other.nativeToolOptions)
|
||||
nativeToolOptions = other.nativeToolOptions;
|
||||
else if (nativeToolOptions && other.nativeToolOptions)
|
||||
nativeToolOptions = merge(other.nativeToolOptions.value(), nativeToolOptions.value());
|
||||
}
|
||||
|
||||
bool PresetsDetails::Condition::evaluate() const
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "cmakeconfigitem.h"
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/filepath.h>
|
||||
|
||||
#include <QHash>
|
||||
@@ -103,7 +104,7 @@ public:
|
||||
std::optional<QString> installDir;
|
||||
std::optional<QString> cmakeExecutable;
|
||||
std::optional<CMakeConfig> cacheVariables;
|
||||
std::optional<QHash<QString, QString>> environment;
|
||||
std::optional<Utils::Environment> environment;
|
||||
std::optional<Warnings> warnings;
|
||||
std::optional<Errors> errors;
|
||||
std::optional<Debug> debug;
|
||||
@@ -120,7 +121,7 @@ public:
|
||||
std::optional<QHash<QString, QString>> vendor;
|
||||
std::optional<QString> displayName;
|
||||
std::optional<QString> description;
|
||||
std::optional<QHash<QString, QString>> environment;
|
||||
std::optional<Utils::Environment> environment;
|
||||
std::optional<QString> configurePreset;
|
||||
std::optional<bool> inheritConfigureEnvironment = true;
|
||||
std::optional<int> jobs;
|
||||
|
||||
@@ -258,12 +258,12 @@ static void registerActionsForOptions()
|
||||
categoryDisplay[page->category()] = page->displayCategory();
|
||||
}
|
||||
for (IOptionsPage *page : IOptionsPage::allOptionsPages()) {
|
||||
Id commandId = generateOpenPageCommandId(page);
|
||||
const Id commandId = generateOpenPageCommandId(page);
|
||||
if (!commandId.isValid())
|
||||
continue;
|
||||
const QString actionTitle = Tr::tr("%1 > %2 Preferences...")
|
||||
.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()]() {
|
||||
ICore::showOptionsDialog(id);
|
||||
});
|
||||
|
||||
@@ -1376,6 +1376,21 @@ void DocumentManager::saveSettings()
|
||||
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()
|
||||
{
|
||||
QSettings *s = ICore::settings();
|
||||
@@ -1384,23 +1399,14 @@ void readSettings()
|
||||
const QVariantList recentFiles = s->value(QLatin1String(filesKeyC)).toList();
|
||||
const QStringList recentEditorIds = s->value(QLatin1String(editorsKeyC)).toStringList();
|
||||
s->endGroup();
|
||||
// clean non-existing files
|
||||
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));
|
||||
if (filePath.exists() && !filePath.isDir())
|
||||
d->m_recentFiles.append({filePath, Id::fromString(editorId)});
|
||||
}
|
||||
|
||||
restoreRecentFiles(recentFiles, recentEditorIds);
|
||||
|
||||
s->beginGroup(QLatin1String(directoryGroupC));
|
||||
const FilePath settingsProjectDir = FilePath::fromString(s->value(QLatin1String(projectDirectoryKeyC),
|
||||
QString()).toString());
|
||||
if (!settingsProjectDir.isEmpty() && settingsProjectDir.isDir())
|
||||
d->m_projectsDirectory = settingsProjectDir;
|
||||
else
|
||||
d->m_projectsDirectory = PathChooser::homePath();
|
||||
|
||||
d->m_projectsDirectory = FilePath::fromVariant(
|
||||
s->value(QLatin1String(projectDirectoryKeyC), PathChooser::homePath().toVariant()));
|
||||
|
||||
d->m_useProjectsDirectory
|
||||
= s->value(QLatin1String(useProjectDirectoryKeyC), kUseProjectsDirectoryDefault).toBool();
|
||||
|
||||
|
||||
@@ -232,6 +232,12 @@ bool HighlightScrollBarOverlay::eventFilter(QObject *object, QEvent *event)
|
||||
case QEvent::ZOrderChange:
|
||||
raise();
|
||||
break;
|
||||
case QEvent::Show:
|
||||
show();
|
||||
break;
|
||||
case QEvent::Hide:
|
||||
hide();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -360,7 +366,7 @@ void HighlightScrollBarController::setScrollArea(QAbstractScrollArea *scrollArea
|
||||
|
||||
double HighlightScrollBarController::lineHeight() const
|
||||
{
|
||||
return m_lineHeight;
|
||||
return ceil(m_lineHeight);
|
||||
}
|
||||
|
||||
void HighlightScrollBarController::setLineHeight(double lineHeight)
|
||||
|
||||
@@ -561,7 +561,7 @@ bool CompletionList::eventFilter(QObject *watched, QEvent *event)
|
||||
LocatorWidget::LocatorWidget(Locator *locator)
|
||||
: m_locatorModel(new LocatorModel(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_configureAction(new QAction(ICore::msgShowOptionsDialog(), this))
|
||||
, m_fileLineEdit(new Utils::FancyLineEdit)
|
||||
|
||||
@@ -514,6 +514,7 @@ void MainWindow::registerDefaultContainers()
|
||||
ac = ActionManager::createMenu(Constants::M_HELP);
|
||||
menubar->addMenu(ac, Constants::G_HELP);
|
||||
ac->menu()->setTitle(tr("&Help"));
|
||||
Theme::setHelpMenu(ac->menu());
|
||||
ac->appendGroup(Constants::G_HELP_HELP);
|
||||
ac->appendGroup(Constants::G_HELP_SUPPORT);
|
||||
ac->appendGroup(Constants::G_HELP_ABOUT);
|
||||
|
||||
@@ -110,7 +110,7 @@ QString CppcheckRunner::currentCommand() const
|
||||
|
||||
void CppcheckRunner::checkQueued()
|
||||
{
|
||||
if (m_queue.isEmpty() || m_binary.isEmpty())
|
||||
if (m_queue.isEmpty() || !m_binary.isExecutableFile())
|
||||
return;
|
||||
|
||||
FilePaths files = m_queue.begin().value();
|
||||
|
||||
@@ -193,11 +193,8 @@ void TerminalRunner::start()
|
||||
|
||||
void TerminalRunner::stop()
|
||||
{
|
||||
if (m_stubProc && m_stubProc->isRunning()) {
|
||||
if (m_stubProc && m_stubProc->isRunning())
|
||||
m_stubProc->stop();
|
||||
m_stubProc->waitForFinished();
|
||||
}
|
||||
reportStopped();
|
||||
}
|
||||
|
||||
void TerminalRunner::stubStarted()
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <QPainter>
|
||||
#include <QPushButton>
|
||||
#include <QStandardItemModel>
|
||||
#include <QTimer>
|
||||
#include <QTreeView>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
@@ -75,7 +76,7 @@ LogChangeWidget::LogChangeWidget(QWidget *parent)
|
||||
setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||
setActivationMode(Utils::DoubleClickActivation);
|
||||
connect(this, &LogChangeWidget::activated, this, &LogChangeWidget::emitCommitActivated);
|
||||
setFocus();
|
||||
QTimer::singleShot(0, [this] { setFocus(); });
|
||||
}
|
||||
|
||||
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) :
|
||||
QDialog(parent)
|
||||
, m_widget(new LogChangeWidget)
|
||||
|
||||
, m_dialogButtonBox(new QDialogButtonBox(this))
|
||||
, m_dialogButtonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this))
|
||||
{
|
||||
auto layout = new QVBoxLayout(this);
|
||||
layout->addWidget(new QLabel(isReset ? Tr::tr("Reset to:") : Tr::tr("Select change:"), this));
|
||||
layout->addWidget(m_widget);
|
||||
auto popUpLayout = new QHBoxLayout;
|
||||
if (isReset) {
|
||||
popUpLayout->addWidget(new QLabel(Tr::tr("Reset type:"), this));
|
||||
m_resetTypeComboBox = new QComboBox(this);
|
||||
popUpLayout->addWidget(new QLabel(Tr::tr("Reset type:")));
|
||||
m_resetTypeComboBox = new QComboBox;
|
||||
m_resetTypeComboBox->addItem(Tr::tr("Hard"), "--hard");
|
||||
m_resetTypeComboBox->addItem(Tr::tr("Mixed"), "--mixed");
|
||||
m_resetTypeComboBox->addItem(Tr::tr("Soft"), "--soft");
|
||||
@@ -230,8 +230,7 @@ LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) :
|
||||
}
|
||||
|
||||
popUpLayout->addWidget(m_dialogButtonBox);
|
||||
m_dialogButtonBox->addButton(QDialogButtonBox::Cancel);
|
||||
QPushButton *okButton = m_dialogButtonBox->addButton(QDialogButtonBox::Ok);
|
||||
QPushButton *okButton = m_dialogButtonBox->button(QDialogButtonBox::Ok);
|
||||
layout->addLayout(popUpLayout);
|
||||
|
||||
connect(m_dialogButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
|
||||
@@ -114,8 +114,10 @@ GeneralSettingsPageWidget::GeneralSettingsPageWidget()
|
||||
|
||||
// startup group box
|
||||
auto startupGroupBox = new QGroupBox(Tr::tr("Startup"));
|
||||
startupGroupBox->setObjectName("startupGroupBox");
|
||||
|
||||
contextHelpComboBox = new QComboBox(startupGroupBox);
|
||||
contextHelpComboBox->setObjectName("contextHelpComboBox");
|
||||
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 in Help Mode"));
|
||||
|
||||
@@ -68,7 +68,7 @@ void DocumentLocatorFilter::updateSymbols(const DocumentUri &uri,
|
||||
return;
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_currentSymbols = symbols;
|
||||
emit symbolsUpToDate({});
|
||||
emit symbolsUpToDate(QPrivateSignal());
|
||||
}
|
||||
|
||||
void DocumentLocatorFilter::resetSymbols()
|
||||
|
||||
@@ -14,4 +14,18 @@ struct McuTargetDescription;
|
||||
McuTarget::OS deduceOperatingSystem(const McuTargetDescription &);
|
||||
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
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "mcusupportconstants.h"
|
||||
#include "mcusupportplugin.h"
|
||||
#include "mcusupportsdk.h"
|
||||
#include "mcusupporttr.h"
|
||||
#include "mcutarget.h"
|
||||
|
||||
#include <cmakeprojectmanager/cmakekitinformation.h>
|
||||
@@ -247,10 +248,19 @@ public:
|
||||
auto cxxToolchain = toolchainPackage->toolChain(
|
||||
ProjectExplorer::Constants::CXX_LANGUAGE_ID);
|
||||
|
||||
configMap.insert("CMAKE_CXX_COMPILER",
|
||||
cxxToolchain->compilerCommand().toString().toLatin1());
|
||||
configMap.insert("CMAKE_C_COMPILER",
|
||||
cToolchain->compilerCommand().toString().toLatin1());
|
||||
if (cToolchain && cxxToolchain) {
|
||||
configMap.insert("CMAKE_CXX_COMPILER",
|
||||
cxxToolchain->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 {
|
||||
const FilePath cMakeToolchainFile = mcuTarget->toolChainFilePackage()->path();
|
||||
|
||||
@@ -335,7 +345,15 @@ Kit *newKit(const McuTarget *mcuTarget, const McuPackagePtr &qtForMCUsSdk)
|
||||
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
|
||||
|
||||
@@ -38,7 +38,8 @@ McuPackage::McuPackage(const SettingsHandler::Ptr &settingsHandler,
|
||||
const QStringList &versions,
|
||||
const QString &downloadUrl,
|
||||
const McuPackageVersionDetector *versionDetector,
|
||||
const bool addToSystemPath)
|
||||
const bool addToSystemPath,
|
||||
const Utils::PathChooser::Kind &valueType)
|
||||
: settingsHandler(settingsHandler)
|
||||
, m_label(label)
|
||||
, m_defaultPath(settingsHandler->getPath(settingsKey, QSettings::SystemScope, defaultPath))
|
||||
@@ -50,6 +51,7 @@ McuPackage::McuPackage(const SettingsHandler::Ptr &settingsHandler,
|
||||
, m_environmentVariableName(envVarName)
|
||||
, m_downloadUrl(downloadUrl)
|
||||
, m_addToSystemPath(addToSystemPath)
|
||||
, m_valueType(valueType)
|
||||
{
|
||||
m_path = FilePath::fromUserInput(qtcEnvironmentVariable(m_environmentVariableName));
|
||||
if (!m_path.exists()) {
|
||||
@@ -141,7 +143,7 @@ void McuPackage::updateStatus()
|
||||
m_status = Status::ValidPathInvalidPackage;
|
||||
} else if (m_versionDetector && m_detectedVersion.isEmpty()) {
|
||||
m_status = Status::ValidPackageVersionNotDetected;
|
||||
} else if (!validVersion) {
|
||||
} else if (m_versionDetector && !validVersion) {
|
||||
m_status = Status::ValidPackageMismatchedVersion;
|
||||
} else {
|
||||
m_status = Status::ValidPackage;
|
||||
@@ -157,7 +159,8 @@ McuPackage::Status McuPackage::status() 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()
|
||||
@@ -223,7 +226,8 @@ QString McuPackage::statusText() const
|
||||
: tr("Path is empty, %1 not found.").arg(displayRequiredPath);
|
||||
break;
|
||||
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;
|
||||
}
|
||||
return response;
|
||||
@@ -244,6 +248,7 @@ QWidget *McuPackage::widget()
|
||||
{
|
||||
auto *widget = new QWidget;
|
||||
m_fileChooser = new PathChooser(widget);
|
||||
m_fileChooser->setExpectedKind(m_valueType);
|
||||
m_fileChooser->lineEdit()->setButtonIcon(FancyLineEdit::Right, Icons::RESET.icon());
|
||||
m_fileChooser->lineEdit()->setButtonVisible(FancyLineEdit::Right, true);
|
||||
connect(m_fileChooser->lineEdit(), &FancyLineEdit::rightButtonClicked, this, [&] {
|
||||
@@ -359,10 +364,9 @@ ToolChain *McuToolChainPackage::msvcToolChain(Id language)
|
||||
{
|
||||
ToolChain *toolChain = ToolChainManager::toolChain([language](const ToolChain *t) {
|
||||
const Abi abi = t->targetAbi();
|
||||
// TODO: Should Abi::WindowsMsvc2022Flavor be added too?
|
||||
return (abi.osFlavor() == Abi::WindowsMsvc2017Flavor
|
||||
|| abi.osFlavor() == Abi::WindowsMsvc2019Flavor)
|
||||
return abi.osFlavor() == Abi::WindowsMsvc2019Flavor
|
||||
&& abi.architecture() == Abi::X86Architecture && abi.wordWidth() == 64
|
||||
&& t->typeId() == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID
|
||||
&& t->language() == language;
|
||||
});
|
||||
return toolChain;
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "settingshandler.h"
|
||||
|
||||
#include <utils/filepath.h>
|
||||
#include <utils/pathchooser.h>
|
||||
|
||||
#include <QObject>
|
||||
|
||||
@@ -18,7 +19,6 @@ class ToolChain;
|
||||
}
|
||||
|
||||
namespace Utils {
|
||||
class PathChooser;
|
||||
class InfoLabel;
|
||||
class Id;
|
||||
} // namespace Utils
|
||||
@@ -30,17 +30,19 @@ class McuPackage : public McuAbstractPackage
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
McuPackage(const SettingsHandler::Ptr &settingsHandler,
|
||||
const QString &label,
|
||||
const Utils::FilePath &defaultPath,
|
||||
const Utils::FilePath &detectionPath,
|
||||
const QString &settingsKey,
|
||||
const QString &cmakeVarName,
|
||||
const QString &envVarName,
|
||||
const QStringList &versions = {},
|
||||
const QString &downloadUrl = {},
|
||||
const McuPackageVersionDetector *versionDetector = nullptr,
|
||||
const bool addToPath = false);
|
||||
McuPackage(
|
||||
const SettingsHandler::Ptr &settingsHandler,
|
||||
const QString &label,
|
||||
const Utils::FilePath &defaultPath,
|
||||
const Utils::FilePath &detectionPath,
|
||||
const QString &settingsKey,
|
||||
const QString &cmakeVarName,
|
||||
const QString &envVarName,
|
||||
const QStringList &versions = {},
|
||||
const QString &downloadUrl = {},
|
||||
const McuPackageVersionDetector *versionDetector = nullptr,
|
||||
const bool addToPath = false,
|
||||
const Utils::PathChooser::Kind &valueType = Utils::PathChooser::Kind::ExistingDirectory);
|
||||
|
||||
~McuPackage() override = default;
|
||||
|
||||
@@ -92,6 +94,7 @@ private:
|
||||
const QString m_environmentVariableName;
|
||||
const QString m_downloadUrl;
|
||||
const bool m_addToSystemPath;
|
||||
const Utils::PathChooser::Kind m_valueType;
|
||||
|
||||
Status m_status = Status::InvalidPath;
|
||||
}; // class McuPackage
|
||||
|
||||
@@ -7,6 +7,7 @@ QtcPlugin {
|
||||
Depends { name: "Qt.widgets" }
|
||||
Depends { name: "Qt.testlib"; condition: qtc.testsEnabled }
|
||||
Depends { name: "Utils" }
|
||||
Depends { name: "app_version_header" }
|
||||
|
||||
Depends { name: "Core" }
|
||||
Depends { name: "BareMetal" }
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "mcusupportoptions.h"
|
||||
|
||||
#include "mcuhelpers.h"
|
||||
#include "mcukitmanager.h"
|
||||
#include "mcupackage.h"
|
||||
#include "mcusupportconstants.h"
|
||||
@@ -16,16 +17,71 @@
|
||||
#include <coreplugin/icore.h>
|
||||
#include <debugger/debuggerkitinformation.h>
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/filepath.h>
|
||||
#include <qtsupport/qtkitinformation.h>
|
||||
#include <qtsupport/qtversionmanager.h>
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QPushButton>
|
||||
|
||||
#include <utility>
|
||||
|
||||
using namespace Utils;
|
||||
|
||||
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 ¯os;
|
||||
}
|
||||
|
||||
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)
|
||||
: QObject(parent)
|
||||
, qtForMCUsSdkPackage(createQtForMCUsPackage(settingsHandler))
|
||||
@@ -93,8 +149,15 @@ bool McuSupportOptions::isLegacyVersion(const QVersionNumber &version)
|
||||
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();
|
||||
if (qtForMCUsSdkPackage->isValidStatus())
|
||||
sdkRepository = targetsAndPackages(qtForMCUsSdkPackage, settingsHandler);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "settingshandler.h"
|
||||
|
||||
#include <utils/environmentfwd.h>
|
||||
#include <utils/macroexpander.h>
|
||||
|
||||
#include <QObject>
|
||||
#include <QVersionNumber>
|
||||
@@ -30,11 +31,19 @@ namespace Internal {
|
||||
|
||||
class McuAbstractPackage;
|
||||
|
||||
using MacroExpanderPtr = std::shared_ptr<Utils::MacroExpander>;
|
||||
using Macros = QHash<QString, Utils::MacroExpander::StringFunction>;
|
||||
|
||||
class McuSdkRepository final
|
||||
{
|
||||
public:
|
||||
Targets mcuTargets;
|
||||
Packages packages;
|
||||
|
||||
void expandVariablesAndWildcards();
|
||||
MacroExpanderPtr getMacroExpander(const McuTarget &target);
|
||||
|
||||
static Macros *globalMacros();
|
||||
};
|
||||
|
||||
class McuSupportOptions final : public QObject
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "mcusupportconstants.h"
|
||||
#include "mcusupportoptions.h"
|
||||
#include "mcusupportsdk.h"
|
||||
#include "mcusupporttr.h"
|
||||
#include "mcutarget.h"
|
||||
#include "mcutargetfactory.h"
|
||||
#include "settingshandler.h"
|
||||
@@ -28,6 +29,7 @@
|
||||
#include <QGroupBox>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QMessageBox>
|
||||
#include <QPushButton>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
@@ -287,9 +289,30 @@ void McuSupportOptionsWidget::apply()
|
||||
bool pathsChanged = false;
|
||||
|
||||
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();
|
||||
for (const auto &package : std::as_const(m_options.sdkRepository.packages))
|
||||
for (const auto &package : target->packages())
|
||||
pathsChanged |= package->writeToSettings();
|
||||
|
||||
if (pathsChanged) {
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "mcusupportconstants.h"
|
||||
#include "mcusupportoptions.h"
|
||||
#include "mcusupportplugin.h"
|
||||
#include "mcusupporttr.h"
|
||||
#include "mcusupportversiondetection.h"
|
||||
#include "mcutarget.h"
|
||||
#include "mcutargetdescription.h"
|
||||
@@ -190,7 +191,7 @@ McuToolChainPackagePtr createMsvcToolChainPackage(const SettingsHandler::Ptr &se
|
||||
const FilePath defaultPath = toolChain ? toolChain->compilerCommand().parentDir() : FilePath();
|
||||
|
||||
const auto *versionDetector = new McuPackageExecutableVersionDetector(detectionPath,
|
||||
{"--version"},
|
||||
{"/?"},
|
||||
R"(\b(\d+\.\d+)\.\d+\b)");
|
||||
|
||||
return McuToolChainPackagePtr{new McuToolChainPackage(settingsHandler,
|
||||
@@ -276,8 +277,8 @@ McuToolChainPackagePtr createGhsToolchainPackage(const SettingsHandler::Ptr &set
|
||||
const FilePath defaultPath = FilePath::fromUserInput(qtcEnvironmentVariable(envVar));
|
||||
|
||||
const auto *versionDetector
|
||||
= new McuPackageExecutableVersionDetector(FilePath("as850").withExecutableSuffix(),
|
||||
{"-V"},
|
||||
= new McuPackageExecutableVersionDetector(FilePath("gversion").withExecutableSuffix(),
|
||||
{"-help"},
|
||||
R"(\bv(\d+\.\d+\.\d+)\b)");
|
||||
|
||||
return McuToolChainPackagePtr{
|
||||
@@ -301,8 +302,8 @@ McuToolChainPackagePtr createGhsArmToolchainPackage(const SettingsHandler::Ptr &
|
||||
const FilePath defaultPath = FilePath::fromUserInput(qtcEnvironmentVariable(envVar));
|
||||
|
||||
const auto *versionDetector
|
||||
= new McuPackageExecutableVersionDetector(FilePath("asarm").withExecutableSuffix(),
|
||||
{"-V"},
|
||||
= new McuPackageExecutableVersionDetector(FilePath("gversion").withExecutableSuffix(),
|
||||
{"-help"},
|
||||
R"(\bv(\d+\.\d+\.\d+)\b)");
|
||||
|
||||
return McuToolChainPackagePtr{
|
||||
@@ -368,8 +369,8 @@ McuPackagePtr createStm32CubeProgrammerPackage(const SettingsHandler::Ptr &setti
|
||||
FilePath defaultPath = {};
|
||||
|
||||
const FilePath detectionPath = FilePath::fromUserInput(
|
||||
QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "bin/STM32_Programmer_CLI.exe"
|
||||
: "bin/STM32_Programmer.sh"));
|
||||
QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "STM32_Programmer_CLI.exe"
|
||||
: "STM32_Programmer.sh"));
|
||||
|
||||
return McuPackagePtr{
|
||||
new McuPackage(settingsHandler,
|
||||
@@ -591,7 +592,11 @@ McuSdkRepository targetsFromDescriptions(const QList<McuTargetDescription> &desc
|
||||
mcuPackages.insert(package);
|
||||
}
|
||||
}
|
||||
return McuSdkRepository{mcuTargets, mcuPackages};
|
||||
|
||||
McuSdkRepository repo{mcuTargets, mcuPackages};
|
||||
repo.expandVariablesAndWildcards();
|
||||
|
||||
return repo;
|
||||
}
|
||||
|
||||
FilePath kitsPath(const FilePath &qtMcuSdkPath)
|
||||
@@ -604,19 +609,7 @@ static FilePaths targetDescriptionFiles(const FilePath &dir)
|
||||
return kitsPath(dir).dirEntries(Utils::FileFilter({"*.json"}, QDir::Files));
|
||||
}
|
||||
|
||||
VersionDetection parseVersionDetection(const QJsonObject &packageEntry)
|
||||
{
|
||||
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)
|
||||
static QString getOsSpecificValue(const QJsonValue &entry)
|
||||
{
|
||||
if (entry.isObject()) {
|
||||
//The json entry has os-specific values
|
||||
@@ -626,6 +619,52 @@ QString getOsSpecificValue(const QJsonValue &entry)
|
||||
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)
|
||||
{
|
||||
const QVariantList versionsVariantList = cmakeEntry["versions"].toArray().toVariantList();
|
||||
@@ -652,7 +691,8 @@ static PackageDescription parsePackage(const QJsonObject &cmakeEntry)
|
||||
FilePath::fromUserInput(detectionPathString),
|
||||
versions,
|
||||
parseVersionDetection(cmakeEntry),
|
||||
cmakeEntry["addToSystemPath"].toBool()};
|
||||
cmakeEntry["addToSystemPath"].toBool(),
|
||||
parseLineEditType(cmakeEntry["type"])};
|
||||
}
|
||||
|
||||
static QList<PackageDescription> parsePackages(const QJsonArray &cmakeEntries)
|
||||
@@ -820,11 +860,6 @@ McuSdkRepository targetsAndPackages(const McuPackagePtr &qtForMCUsPackage,
|
||||
< 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <utils/filepath.h>
|
||||
#include <utils/pathchooser.h>
|
||||
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QVector>
|
||||
@@ -32,6 +34,7 @@ struct PackageDescription
|
||||
QStringList versions;
|
||||
VersionDetection versionDetection;
|
||||
bool shouldAddToSystemPath;
|
||||
Utils::PathChooser::Kind type;
|
||||
}; //struct PackageDescription
|
||||
|
||||
struct McuTargetDescription
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
#include "mcutargetfactory.h"
|
||||
#include "mcuhelpers.h"
|
||||
#include "mcupackage.h"
|
||||
#include "mcusupport_global.h"
|
||||
#include "mcusupportplugin.h"
|
||||
#include "mcusupportversiondetection.h"
|
||||
#include "mcutarget.h"
|
||||
#include "mcutargetdescription.h"
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/macroexpander.h>
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
#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)
|
||||
: settingsHandler{settingsHandler}
|
||||
{}
|
||||
@@ -94,7 +82,6 @@ QPair<Targets, Packages> McuTargetFactory::createTargets(const McuTargetDescript
|
||||
targetPackages.unite({toolchainFile});
|
||||
|
||||
removeEmptyPackages(targetPackages);
|
||||
expandVariables(targetPackages);
|
||||
|
||||
packages.unite(targetPackages);
|
||||
|
||||
@@ -144,7 +131,8 @@ McuPackagePtr McuTargetFactory::createPackage(const PackageDescription &pkgDesc)
|
||||
pkgDesc.versions,
|
||||
{},
|
||||
createVersionDetection(pkgDesc.versionDetection),
|
||||
pkgDesc.shouldAddToSystemPath}};
|
||||
pkgDesc.shouldAddToSystemPath,
|
||||
pkgDesc.type}};
|
||||
}
|
||||
|
||||
McuToolChainPackage *McuTargetFactory::createToolchain(
|
||||
|
||||
@@ -22,7 +22,6 @@ public:
|
||||
Packages createPackages(const McuTargetDescription &);
|
||||
McuToolChainPackage *createToolchain(const McuTargetDescription::Toolchain &, const Utils::FilePath &sourceFile = Utils::FilePath());
|
||||
McuPackagePtr createPackage(const PackageDescription &);
|
||||
static void expandVariables(Packages &packages);
|
||||
|
||||
private:
|
||||
SettingsHandler::Ptr settingsHandler;
|
||||
|
||||
@@ -24,6 +24,10 @@ constexpr auto armgcc_ek_ra6m3g_baremetal_json = R"(
|
||||
"windows": "%{Env:PROGRAMFILES}/SEGGER/JLink",
|
||||
"linux": "/opt/SEGGER/JLink"
|
||||
},
|
||||
"detectionPath": {
|
||||
"windows": "JLink.exe",
|
||||
"linux": "JLinkExe"
|
||||
},
|
||||
"optional": true,
|
||||
"addToSystemPath": true
|
||||
}
|
||||
@@ -43,9 +47,12 @@ constexpr auto armgcc_ek_ra6m3g_baremetal_json = R"(
|
||||
"type": "path",
|
||||
"optional": false,
|
||||
"versionDetection": {
|
||||
"filePattern": "bin/arm-none-eabi-g++",
|
||||
"filePattern": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
"linux": "bin/arm-none-eabi-g++"
|
||||
},
|
||||
"executableArgs": "--version",
|
||||
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
"regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
},
|
||||
"detectionPath": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
@@ -64,6 +71,7 @@ constexpr auto armgcc_ek_ra6m3g_baremetal_json = R"(
|
||||
"boardSdk": {
|
||||
"cmakeVar": "QUL_BOARD_SDK_DIR",
|
||||
"envVar": "EK_RA6M3G_FSP_PATH",
|
||||
"setting": "EK_RA6M3G_FSP_PATH",
|
||||
"id": "EK_RA6M3G_FSP_PATH",
|
||||
"label": "Flexible Software Package for Renesas RA MCU Family",
|
||||
"optional": false,
|
||||
|
||||
@@ -24,6 +24,10 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"(
|
||||
"windows": "%{Env:PROGRAMFILES}/SEGGER/JLink",
|
||||
"linux": "/opt/SEGGER/JLink"
|
||||
},
|
||||
"detectionPath": {
|
||||
"windows": "JLink.exe",
|
||||
"linux": "JLinkExe"
|
||||
},
|
||||
"optional": true,
|
||||
"addToSystemPath": true
|
||||
}
|
||||
@@ -43,9 +47,12 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"(
|
||||
"type": "path",
|
||||
"optional": false,
|
||||
"versionDetection": {
|
||||
"filePattern": "bin/arm-none-eabi-g++",
|
||||
"filePattern": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
"linux": "bin/arm-none-eabi-g++"
|
||||
},
|
||||
"executableArgs": "--version",
|
||||
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
"regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
},
|
||||
"detectionPath": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
@@ -64,6 +71,7 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"(
|
||||
"boardSdk": {
|
||||
"cmakeVar": "QUL_BOARD_SDK_DIR",
|
||||
"envVar": "EK_RA6M3G_FSP_PATH",
|
||||
"setting": "EK_RA6M3G_FSP_PATH",
|
||||
"id": "EK_RA6M3G_FSP_PATH",
|
||||
"label": "Flexible Software Package for Renesas RA MCU Family",
|
||||
"optional": false,
|
||||
@@ -76,6 +84,7 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"(
|
||||
"envVar": "EK_RA6M3G_FREERTOS_DIR",
|
||||
"id": "EK_RA6M3G_FREERTOS_DIR",
|
||||
"label": "FreeRTOS SDK for EK-RA6M3G",
|
||||
"setting": "FreeRTOSSourcePackage_EK_RA6M3G",
|
||||
"cmakeVar": "FREERTOS_DIR",
|
||||
"defaultValue": "%{Qul_ROOT}/platform/boards/renesas/ek-ra6m3g-common/3rdparty/freertos",
|
||||
"detectionPath": "tasks.c",
|
||||
|
||||
@@ -28,9 +28,12 @@ constexpr auto armgcc_example_baremetal_json = R"(
|
||||
"type": "path",
|
||||
"optional": false,
|
||||
"versionDetection": {
|
||||
"filePattern": "bin/arm-none-eabi-g++",
|
||||
"filePattern": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
"linux": "bin/arm-none-eabi-g++"
|
||||
},
|
||||
"executableArgs": "--version",
|
||||
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
"regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
},
|
||||
"detectionPath": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
|
||||
@@ -47,9 +47,12 @@ constexpr auto armgcc_mimxrt1050_evk_baremetal_json = R"(
|
||||
"type": "path",
|
||||
"optional": false,
|
||||
"versionDetection": {
|
||||
"filePattern": "bin/arm-none-eabi-g++",
|
||||
"filePattern": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
"linux": "bin/arm-none-eabi-g++"
|
||||
},
|
||||
"executableArgs": "--version",
|
||||
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
"regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
},
|
||||
"detectionPath": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
|
||||
@@ -47,9 +47,12 @@ constexpr auto armgcc_mimxrt1050_evk_freertos_json = R"(
|
||||
"type": "path",
|
||||
"optional": false,
|
||||
"versionDetection": {
|
||||
"filePattern": "bin/arm-none-eabi-g++",
|
||||
"filePattern": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
"linux": "bin/arm-none-eabi-g++"
|
||||
},
|
||||
"executableArgs": "--version",
|
||||
"regex": "\\bv(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
"regex": "\\b(\\d+\\.\\d+\\.\\d+)\\b"
|
||||
},
|
||||
"detectionPath": {
|
||||
"windows": "bin/arm-none-eabi-g++.exe",
|
||||
|
||||