Merge remote-tracking branch 'origin/9.0'

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

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

View File

@@ -96,6 +96,13 @@ function(_create_ts_custom_target name)
COMMENT "Generate .ts files"
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)

View File

@@ -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
----------------

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -4,11 +4,7 @@
/*!
\page creator-developing-android.html
\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

View File

@@ -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

View File

@@ -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

View File

@@ -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}

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
*/

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

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

View File

@@ -131,7 +131,7 @@
\li \l{Previewing on Desktop}
\li \l{Previewing on 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

View File

@@ -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
*/

View File

@@ -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
*/

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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) => {

View File

@@ -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

View File

@@ -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,

View File

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

View File

@@ -1,6 +1,6 @@
cmake_minimum_required (VERSION 3.15)
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)

View File

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

View File

@@ -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}"

View File

@@ -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");
}

View File

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

View File

@@ -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'
})"
}
]
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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>

View File

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

View File

@@ -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>

View File

@@ -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 &amp;numbers</source>
<translation>Показывать &amp;номера строк</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>

View File

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

View File

@@ -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());
});

View File

@@ -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
}

View File

@@ -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());

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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 > "

View File

@@ -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 {

View File

@@ -155,16 +155,9 @@ void TestResultDelegate::currentChanged(const QModelIndex &current, 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

View File

@@ -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();

View File

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

View File

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

View File

@@ -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()

View File

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

View File

@@ -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");

View File

@@ -99,22 +99,17 @@ static QString expandMacroEnv(const QString &macroPrefix,
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 &macroName) {
@@ -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 &macroName) {
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 &macroName) {
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;
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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);
});

View File

@@ -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();

View File

@@ -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)

View File

@@ -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)

View File

@@ -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);

View File

@@ -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();

View File

@@ -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()

View File

@@ -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);

View File

@@ -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"));

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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" }

View File

@@ -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 &macros;
}
void McuSdkRepository::expandVariablesAndWildcards()
{
for (const auto &target : std::as_const(mcuTargets)) {
auto macroExpander = getMacroExpander(*target);
for (const auto &package : target->packages()) {
package->setPath(expandWildcards(macroExpander->expand(package->path())));
}
}
}
MacroExpanderPtr McuSdkRepository::getMacroExpander(const McuTarget &target)
{
auto macroExpander = std::make_shared<Utils::MacroExpander>();
//register the macros
for (const auto &package : target.packages()) {
macroExpander->registerVariable(package->cmakeVariableName().toLocal8Bit(),
package->label(),
[package] { return package->path().toString(); });
}
for (auto [key, macro] : asKeyValueRange(*globalMacros()))
macroExpander->registerVariable(key.toLocal8Bit(), "QtMCUs Macro", macro);
return macroExpander;
}
McuSupportOptions::McuSupportOptions(const SettingsHandler::Ptr &settingsHandler, QObject *parent)
: 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);

View File

@@ -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

View File

@@ -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) {

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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(

View File

@@ -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;

View File

@@ -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,

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

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