forked from qt-creator/qt-creator
Merge "Merge remote-tracking branch 'origin/4.13' into master"
This commit is contained in:
95
README.md
95
README.md
@@ -659,3 +659,98 @@ SQLite (https://www.sqlite.org) is in the Public Domain.
|
|||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
The above copyright notice and this permission notice shall be included in
|
||||||
all copies or substantial portions of the Software.
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
### SourceCodePro fonts
|
||||||
|
|
||||||
|
Qt Creator ships with the following fonts licensed under OFL-1.1:
|
||||||
|
|
||||||
|
* SourceCodePro-Regular.ttf
|
||||||
|
* SourceCodePro-It.ttf
|
||||||
|
* SourceCodePro-Bold.ttf
|
||||||
|
|
||||||
|
SIL OPEN FONT LICENSE
|
||||||
|
|
||||||
|
Version 1.1 - 26 February 2007
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting - in part or in whole - any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
|
4
dist/changes-4.13.1.md
vendored
4
dist/changes-4.13.1.md
vendored
@@ -19,6 +19,7 @@ Editing
|
|||||||
### C++
|
### C++
|
||||||
|
|
||||||
* Fixed crash with adjacent raw string literals (QTCREATORBUG-24577)
|
* Fixed crash with adjacent raw string literals (QTCREATORBUG-24577)
|
||||||
|
* Fixed highlighting of template aliases (QTCREATORBUG-24552)
|
||||||
|
|
||||||
### QML
|
### QML
|
||||||
|
|
||||||
@@ -37,6 +38,8 @@ Projects
|
|||||||
### qmake
|
### qmake
|
||||||
|
|
||||||
* Fixed handling of unset environment variables (QTCREATORBUG-21729)
|
* Fixed handling of unset environment variables (QTCREATORBUG-21729)
|
||||||
|
* Fixed that changes to sub-projects triggered full re-parse
|
||||||
|
(QTCREATORBUG-24572)
|
||||||
|
|
||||||
### CMake
|
### CMake
|
||||||
|
|
||||||
@@ -80,6 +83,7 @@ Platforms
|
|||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
* Fixed Clazy (QTCREATORBUG-24567)
|
* Fixed Clazy (QTCREATORBUG-24567)
|
||||||
|
* Fixed debugger locals view for newest LLDB (QTCREATORBUG-24596)
|
||||||
|
|
||||||
Credits for these changes go to:
|
Credits for these changes go to:
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2018 The Qt Company Ltd.
|
** Copyright (C) 2020 The Qt Company Ltd.
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of the Qt Creator documentation.
|
** This file is part of the Qt Creator documentation.
|
||||||
@@ -30,9 +30,14 @@
|
|||||||
// **********************************************************************
|
// **********************************************************************
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\previouspage creator-sharing-project-settings.html
|
|
||||||
\page creator-project-managing-sessions.html
|
\page creator-project-managing-sessions.html
|
||||||
|
\if defined(qtdesignstudio)
|
||||||
|
\previouspage creator-project-managing-workspaces.html
|
||||||
|
\nextpage {Tutorials}
|
||||||
|
\else
|
||||||
|
\previouspage creator-sharing-project-settings.html
|
||||||
\nextpage creator-design-mode.html
|
\nextpage creator-design-mode.html
|
||||||
|
\endif
|
||||||
|
|
||||||
\title Managing Sessions
|
\title Managing Sessions
|
||||||
|
|
||||||
@@ -46,7 +51,10 @@
|
|||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
\li Projects with their dependencies (including SUBDIRS projects)
|
\li Projects
|
||||||
|
\if defined(qtcreator)
|
||||||
|
with their dependencies (including SUBDIRS projects)
|
||||||
|
\endif
|
||||||
|
|
||||||
\li Editors
|
\li Editors
|
||||||
|
|
||||||
@@ -91,6 +99,7 @@
|
|||||||
|
|
||||||
To switch between sessions, select \uicontrol {Switch To}.
|
To switch between sessions, select \uicontrol {Switch To}.
|
||||||
|
|
||||||
|
\if defined(qtcreator)
|
||||||
When you launch \QC, a list of existing sessions is displayed in the
|
When you launch \QC, a list of existing sessions is displayed in the
|
||||||
\uicontrol Welcome mode. To open a session, select it or press
|
\uicontrol Welcome mode. To open a session, select it or press
|
||||||
\key Ctrl+Alt+<number>, where \e <number> is the number of the session to
|
\key Ctrl+Alt+<number>, where \e <number> is the number of the session to
|
||||||
@@ -109,5 +118,6 @@
|
|||||||
a session as argument and \QC will start with this session.
|
a session as argument and \QC will start with this session.
|
||||||
|
|
||||||
For more information, see \l{Using Command Line Options}.
|
For more information, see \l{Using Command Line Options}.
|
||||||
|
\endif
|
||||||
|
|
||||||
*/
|
*/
|
@@ -27,7 +27,7 @@
|
|||||||
\page creator-project-managing-workspaces.html
|
\page creator-project-managing-workspaces.html
|
||||||
\if defined(qtdesignstudio)
|
\if defined(qtdesignstudio)
|
||||||
\previouspage creator-using-qt-quick-designer.html
|
\previouspage creator-using-qt-quick-designer.html
|
||||||
\nextpage {Tutorials}
|
\nextpage creator-project-managing-sessions.html
|
||||||
\else
|
\else
|
||||||
\previouspage creator-sidebars.html
|
\previouspage creator-sidebars.html
|
||||||
\nextpage creator-output-panes.html
|
\nextpage creator-output-panes.html
|
||||||
|
@@ -664,5 +664,103 @@
|
|||||||
all copies or substantial portions of the Software.
|
all copies or substantial portions of the Software.
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
|
\li \b {SourceCodePro fonts}
|
||||||
|
|
||||||
|
\QC ships with the following fonts licensed under OFL-1.1:
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li SourceCodePro-Regular.ttf
|
||||||
|
\li SourceCodePro-It.ttf
|
||||||
|
\li SourceCodePro-Bold.ttf
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
\badcode
|
||||||
|
SIL OPEN FONT LICENSE
|
||||||
|
|
||||||
|
Version 1.1 - 26 February 2007
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting - in part or in whole - any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
|
\endcode
|
||||||
\endlist
|
\endlist
|
||||||
*/
|
*/
|
||||||
|
@@ -32,13 +32,16 @@
|
|||||||
|
|
||||||
You can purchase a \QBSK license from the \l{https://marketplace.qt.io/}
|
You can purchase a \QBSK license from the \l{https://marketplace.qt.io/}
|
||||||
{Qt Marketplace}, and then use the Qt online installer to have the \QBSK
|
{Qt Marketplace}, and then use the Qt online installer to have the \QBSK
|
||||||
installation package copied to the following path in your Qt installation
|
plugin package copied to the following path in your Qt installation
|
||||||
folder: \c {QtDesignStudio\sketch_bridge}. You can use the installation
|
folder: \c {QtDesignStudio\sketch_bridge\io.qt.qtbridge.sketchplugin}.
|
||||||
package to install the \QBSK plugin to Sketch.
|
|
||||||
|
|
||||||
\note Install the Sketch app before installing the plugin.
|
\note Install the Sketch app before installing the plugin.
|
||||||
|
|
||||||
To install the \QBSK plugin to Sketch, double-click the executable file.
|
To install the \QBSK plugin to Sketch, double-click
|
||||||
|
\c io.qt.qtbridge.sketchplugin in the \c sketch_bridge
|
||||||
|
folder in the installation directory of \QDS. Sketch
|
||||||
|
will automatically install \QBSK.
|
||||||
|
|
||||||
The plugin is available at \uicontrol Plugins > \uicontrol {\QB}.
|
You can launch the Sketch plugin from \uicontrol Plugins >
|
||||||
|
\uicontrol {\QB} in Sketch.
|
||||||
*/
|
*/
|
||||||
|
@@ -55,6 +55,7 @@
|
|||||||
\li \l{Editing QML Files in Design Mode}
|
\li \l{Editing QML Files in Design Mode}
|
||||||
\list
|
\list
|
||||||
\li \l{Managing Workspaces}
|
\li \l{Managing Workspaces}
|
||||||
|
\li \l{Managing Sessions}
|
||||||
\endlist
|
\endlist
|
||||||
\li \l{Tutorials}
|
\li \l{Tutorials}
|
||||||
\endlist
|
\endlist
|
||||||
|
@@ -24,8 +24,8 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\previouspage creator-project-managing-workspaces.html
|
|
||||||
\group gstutorials
|
\group gstutorials
|
||||||
|
\previouspage creator-project-managing-sessions.html
|
||||||
\nextpage studio-projects-managing.html
|
\nextpage studio-projects-managing.html
|
||||||
|
|
||||||
\title Tutorials
|
\title Tutorials
|
||||||
|
@@ -64,18 +64,19 @@ Column {
|
|||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
caption: "Rectangle"
|
caption: "Rectangle"
|
||||||
visible: backendValues.border_color.isAvailable
|
|
||||||
|
|
||||||
SectionLayout {
|
SectionLayout {
|
||||||
rows: 2
|
rows: 2
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("Border")
|
text: qsTr("Border")
|
||||||
|
disabledState: !backendValues.border_width.isAvailable
|
||||||
}
|
}
|
||||||
SecondColumnLayout {
|
SecondColumnLayout {
|
||||||
SpinBox {
|
SpinBox {
|
||||||
backendValue: backendValues.border_width
|
backendValue: backendValues.border_width
|
||||||
hasSlider: true
|
hasSlider: true
|
||||||
Layout.preferredWidth: 120
|
Layout.preferredWidth: 120
|
||||||
|
enabled: backendValue.isAvailable
|
||||||
}
|
}
|
||||||
ExpandingSpacer {
|
ExpandingSpacer {
|
||||||
|
|
||||||
|
@@ -65,7 +65,7 @@ isEmpty(KSYNTAXHIGHLIGHTING_LIB_DIR) {
|
|||||||
|
|
||||||
win32:SUBDIRS += utils/process_ctrlc_stub.pro
|
win32:SUBDIRS += utils/process_ctrlc_stub.pro
|
||||||
|
|
||||||
win32: isEmpty(QTC_SKIP_CDBEXT) {
|
msvc: isEmpty(QTC_SKIP_CDBEXT) {
|
||||||
SUBDIRS += qtcreatorcdbext
|
SUBDIRS += qtcreatorcdbext
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "../testtreeitem.h"
|
#include "../testtreeitem.h"
|
||||||
|
|
||||||
|
#include <utils/fileutils.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
@@ -172,10 +173,12 @@ TestResultPtr CatchOutputReader::createDefaultResult() const
|
|||||||
result = new CatchResult(id(), m_testCaseInfo.first().name);
|
result = new CatchResult(id(), m_testCaseInfo.first().name);
|
||||||
result->setDescription(m_testCaseInfo.last().name);
|
result->setDescription(m_testCaseInfo.last().name);
|
||||||
result->setLine(m_testCaseInfo.last().line);
|
result->setLine(m_testCaseInfo.last().line);
|
||||||
const QString &relativePathFromBuildDir = m_testCaseInfo.last().filename;
|
const QFileInfo fileInfo(m_testCaseInfo.last().filename);
|
||||||
if (!relativePathFromBuildDir.isEmpty()) {
|
const Utils::FilePath filePath = Utils::FilePath::fromFileInfo(fileInfo);
|
||||||
const QFileInfo fileInfo(m_buildDir + '/' + relativePathFromBuildDir);
|
if (!filePath.isEmpty()) {
|
||||||
result->setFileName(fileInfo.canonicalFilePath());
|
result->setFileName(fileInfo.isAbsolute()
|
||||||
|
? filePath.toString()
|
||||||
|
: QFileInfo(m_buildDir + '/' + filePath.toString()).canonicalFilePath());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
result = new CatchResult(id(), QString());
|
result = new CatchResult(id(), QString());
|
||||||
|
@@ -2,11 +2,9 @@
|
|||||||
**
|
**
|
||||||
** Copyright (C) 2016 Denis Mingulov.
|
** Copyright (C) 2016 Denis Mingulov.
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
** Copyright (C) 2016 The Qt Company Ltd.
|
||||||
** Copyright (C) 2016 Denis Mingulov.
|
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of Qt Creator
|
** This file is part of Qt Creator.
|
||||||
**
|
**
|
||||||
** Commercial License Usage
|
** Commercial License Usage
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
@@ -16,35 +14,13 @@
|
|||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
**
|
**
|
||||||
** BSD License Usage
|
** GNU General Public License Usage
|
||||||
** Alternatively, you may use this file under the terms of the BSD license
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
** as follows:
|
** General Public License version 3 as published by the Free Software
|
||||||
**
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
** "Redistribution and use in source and binary forms, with or without
|
** included in the packaging of this file. Please review the following
|
||||||
** modification, are permitted provided that the following conditions are
|
** information to ensure the GNU General Public License requirements will
|
||||||
** met:
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
** * Redistributions of source code must retain the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer.
|
|
||||||
** * Redistributions in binary form must reproduce the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer in
|
|
||||||
** the documentation and/or other materials provided with the
|
|
||||||
** distribution.
|
|
||||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
|
||||||
** contributors may be used to endorse or promote products derived
|
|
||||||
** from this software without specific prior written permission.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
@@ -2,11 +2,9 @@
|
|||||||
**
|
**
|
||||||
** Copyright (C) 2016 Denis Mingulov.
|
** Copyright (C) 2016 Denis Mingulov.
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
** Copyright (C) 2016 The Qt Company Ltd.
|
||||||
** Copyright (C) 2016 Denis Mingulov.
|
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of Qt Creator
|
** This file is part of Qt Creator.
|
||||||
**
|
**
|
||||||
** Commercial License Usage
|
** Commercial License Usage
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
@@ -16,35 +14,13 @@
|
|||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
**
|
**
|
||||||
** BSD License Usage
|
** GNU General Public License Usage
|
||||||
** Alternatively, you may use this file under the terms of the BSD license
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
** as follows:
|
** General Public License version 3 as published by the Free Software
|
||||||
**
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
** "Redistribution and use in source and binary forms, with or without
|
** included in the packaging of this file. Please review the following
|
||||||
** modification, are permitted provided that the following conditions are
|
** information to ensure the GNU General Public License requirements will
|
||||||
** met:
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
** * Redistributions of source code must retain the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer.
|
|
||||||
** * Redistributions in binary form must reproduce the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer in
|
|
||||||
** the documentation and/or other materials provided with the
|
|
||||||
** distribution.
|
|
||||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
|
||||||
** contributors may be used to endorse or promote products derived
|
|
||||||
** from this software without specific prior written permission.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
@@ -64,7 +64,7 @@ using namespace Utils;
|
|||||||
namespace McuSupport {
|
namespace McuSupport {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
static const int KIT_VERSION = 6; // Bumps up whenever details in Kit creation change
|
static const int KIT_VERSION = 7; // Bumps up whenever details in Kit creation change
|
||||||
|
|
||||||
static QString packagePathFromSettings(const QString &settingsKey,
|
static QString packagePathFromSettings(const QString &settingsKey,
|
||||||
QSettings::Scope scope = QSettings::UserScope,
|
QSettings::Scope scope = QSettings::UserScope,
|
||||||
@@ -234,8 +234,10 @@ void McuPackage::updateStatus()
|
|||||||
m_fileChooser->lineEdit()->button(FancyLineEdit::Right)->setEnabled(m_path != m_defaultPath);
|
m_fileChooser->lineEdit()->button(FancyLineEdit::Right)->setEnabled(m_path != m_defaultPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
McuToolChainPackage::McuToolChainPackage(const QString &label, const QString &defaultPath,
|
McuToolChainPackage::McuToolChainPackage(const QString &label,
|
||||||
const QString &detectionPath, const QString &settingsKey,
|
const QString &defaultPath,
|
||||||
|
const QString &detectionPath,
|
||||||
|
const QString &settingsKey,
|
||||||
McuToolChainPackage::Type type)
|
McuToolChainPackage::Type type)
|
||||||
: McuPackage(label, defaultPath, detectionPath, settingsKey)
|
: McuPackage(label, defaultPath, detectionPath, settingsKey)
|
||||||
, m_type(type)
|
, m_type(type)
|
||||||
@@ -247,13 +249,28 @@ McuToolChainPackage::Type McuToolChainPackage::type() const
|
|||||||
return m_type;
|
return m_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ToolChain *desktopToolChain(Id language)
|
bool McuToolChainPackage::isDesktopToolchain() const
|
||||||
|
{
|
||||||
|
return m_type == TypeMSVC || m_type == TypeGCC;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ToolChain *msvcToolChain(Id language)
|
||||||
{
|
{
|
||||||
ToolChain *toolChain = ToolChainManager::toolChain([language](const ToolChain *t) {
|
ToolChain *toolChain = ToolChainManager::toolChain([language](const ToolChain *t) {
|
||||||
const Abi abi = t->targetAbi();
|
const Abi abi = t->targetAbi();
|
||||||
return (abi.os() != Abi::WindowsOS
|
return (abi.osFlavor() == Abi::WindowsMsvc2017Flavor || abi.osFlavor() == Abi::WindowsMsvc2019Flavor)
|
||||||
|| (abi.osFlavor() == Abi::WindowsMsvc2017Flavor
|
&& abi.architecture() == Abi::X86Architecture
|
||||||
|| abi.osFlavor() == Abi::WindowsMsvc2019Flavor))
|
&& abi.wordWidth() == 64
|
||||||
|
&& t->language() == language;
|
||||||
|
});
|
||||||
|
return toolChain;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ToolChain *gccToolChain(Id language)
|
||||||
|
{
|
||||||
|
ToolChain *toolChain = ToolChainManager::toolChain([language](const ToolChain *t) {
|
||||||
|
const Abi abi = t->targetAbi();
|
||||||
|
return abi.os() != Abi::WindowsOS
|
||||||
&& abi.architecture() == Abi::X86Architecture
|
&& abi.architecture() == Abi::X86Architecture
|
||||||
&& abi.wordWidth() == 64
|
&& abi.wordWidth() == 64
|
||||||
&& t->language() == language;
|
&& t->language() == language;
|
||||||
@@ -288,9 +305,11 @@ static ToolChain *armGccToolChain(const FilePath &path, Id language)
|
|||||||
ToolChain *McuToolChainPackage::toolChain(Id language) const
|
ToolChain *McuToolChainPackage::toolChain(Id language) const
|
||||||
{
|
{
|
||||||
ToolChain *tc = nullptr;
|
ToolChain *tc = nullptr;
|
||||||
if (m_type == TypeDesktop) {
|
if (m_type == TypeMSVC)
|
||||||
tc = desktopToolChain(language);
|
tc = msvcToolChain(language);
|
||||||
} else {
|
else if (m_type == TypeGCC)
|
||||||
|
tc = gccToolChain(language);
|
||||||
|
else {
|
||||||
const QLatin1String compilerName(
|
const QLatin1String compilerName(
|
||||||
language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++");
|
language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++");
|
||||||
const FilePath compiler = FilePath::fromUserInput(
|
const FilePath compiler = FilePath::fromUserInput(
|
||||||
@@ -339,24 +358,18 @@ QVariant McuToolChainPackage::debuggerId() const
|
|||||||
return debuggerId;
|
return debuggerId;
|
||||||
}
|
}
|
||||||
|
|
||||||
McuTarget::McuTarget(const QVersionNumber &qulVersion, const QString &vendor,
|
McuTarget::McuTarget(const QVersionNumber &qulVersion,
|
||||||
const QString &platform, OS os,
|
const Platform &platform, OS os,
|
||||||
const QVector<McuPackage *> &packages,
|
const QVector<McuPackage *> &packages,
|
||||||
const McuToolChainPackage *toolChainPackage)
|
const McuToolChainPackage *toolChainPackage)
|
||||||
: m_qulVersion(qulVersion)
|
: m_qulVersion(qulVersion)
|
||||||
, m_vendor(vendor)
|
, m_platform(platform)
|
||||||
, m_qulPlatform(platform)
|
|
||||||
, m_os(os)
|
, m_os(os)
|
||||||
, m_packages(packages)
|
, m_packages(packages)
|
||||||
, m_toolChainPackage(toolChainPackage)
|
, m_toolChainPackage(toolChainPackage)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
QString McuTarget::vendor() const
|
|
||||||
{
|
|
||||||
return m_vendor;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVector<McuPackage *> McuTarget::packages() const
|
QVector<McuPackage *> McuTarget::packages() const
|
||||||
{
|
{
|
||||||
return m_packages;
|
return m_packages;
|
||||||
@@ -372,9 +385,9 @@ McuTarget::OS McuTarget::os() const
|
|||||||
return m_os;
|
return m_os;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString McuTarget::qulPlatform() const
|
McuTarget::Platform McuTarget::platform() const
|
||||||
{
|
{
|
||||||
return m_qulPlatform;
|
return m_platform;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool McuTarget::isValid() const
|
bool McuTarget::isValid() const
|
||||||
@@ -499,15 +512,15 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc
|
|||||||
using namespace Constants;
|
using namespace Constants;
|
||||||
|
|
||||||
k->setUnexpandedDisplayName(kitName);
|
k->setUnexpandedDisplayName(kitName);
|
||||||
k->setValue(KIT_MCUTARGET_VENDOR_KEY, mcuTarget->vendor());
|
k->setValue(KIT_MCUTARGET_VENDOR_KEY, mcuTarget->platform().vendor);
|
||||||
k->setValue(KIT_MCUTARGET_MODEL_KEY, mcuTarget->qulPlatform());
|
k->setValue(KIT_MCUTARGET_MODEL_KEY, mcuTarget->platform().name);
|
||||||
k->setValue(KIT_MCUTARGET_COLORDEPTH_KEY, mcuTarget->colorDepth());
|
k->setValue(KIT_MCUTARGET_COLORDEPTH_KEY, mcuTarget->colorDepth());
|
||||||
k->setValue(KIT_MCUTARGET_SDKVERSION_KEY, mcuTarget->qulVersion().toString());
|
k->setValue(KIT_MCUTARGET_SDKVERSION_KEY, mcuTarget->qulVersion().toString());
|
||||||
k->setValue(KIT_MCUTARGET_KITVERSION_KEY, KIT_VERSION);
|
k->setValue(KIT_MCUTARGET_KITVERSION_KEY, KIT_VERSION);
|
||||||
k->setValue(KIT_MCUTARGET_OS_KEY, static_cast<int>(mcuTarget->os()));
|
k->setValue(KIT_MCUTARGET_OS_KEY, static_cast<int>(mcuTarget->os()));
|
||||||
k->setAutoDetected(true);
|
k->setAutoDetected(true);
|
||||||
k->makeSticky();
|
k->makeSticky();
|
||||||
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop)
|
if (mcuTarget->toolChainPackage()->isDesktopToolchain())
|
||||||
k->setDeviceTypeForIcon(DEVICE_TYPE);
|
k->setDeviceTypeForIcon(DEVICE_TYPE);
|
||||||
QSet<Id> irrelevant = { SysRootKitAspect::id() };
|
QSet<Id> irrelevant = { SysRootKitAspect::id() };
|
||||||
if (!kitNeedsQtVersion())
|
if (!kitNeedsQtVersion())
|
||||||
@@ -533,7 +546,7 @@ static void setKitDebugger(Kit *k, const McuToolChainPackage *tcPackage)
|
|||||||
{
|
{
|
||||||
// Qt Creator seems to be smart enough to deduce the right Kit debugger from the ToolChain
|
// Qt Creator seems to be smart enough to deduce the right Kit debugger from the ToolChain
|
||||||
// We rely on that at least in the Desktop case.
|
// We rely on that at least in the Desktop case.
|
||||||
if (tcPackage->type() == McuToolChainPackage::TypeDesktop
|
if (tcPackage->isDesktopToolchain()
|
||||||
// No Green Hills debugger, because support for it is missing.
|
// No Green Hills debugger, because support for it is missing.
|
||||||
|| tcPackage->type() == McuToolChainPackage::TypeGHS)
|
|| tcPackage->type() == McuToolChainPackage::TypeGHS)
|
||||||
return;
|
return;
|
||||||
@@ -544,7 +557,7 @@ static void setKitDebugger(Kit *k, const McuToolChainPackage *tcPackage)
|
|||||||
static void setKitDevice(Kit *k, const McuTarget* mcuTarget)
|
static void setKitDevice(Kit *k, const McuTarget* mcuTarget)
|
||||||
{
|
{
|
||||||
// "Device Type" Desktop is the default. We use that for the Qt for MCUs Desktop Kit
|
// "Device Type" Desktop is the default. We use that for the Qt for MCUs Desktop Kit
|
||||||
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop)
|
if (mcuTarget->toolChainPackage()->isDesktopToolchain())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE);
|
DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE);
|
||||||
@@ -559,7 +572,7 @@ static void setKitEnvironment(Kit *k, const McuTarget *mcuTarget,
|
|||||||
// The Desktop version depends on the Qt shared libs in Qul_DIR/bin.
|
// The Desktop version depends on the Qt shared libs in Qul_DIR/bin.
|
||||||
// If CMake's fileApi is avaialble, we can rely on the "Add library search path to PATH"
|
// If CMake's fileApi is avaialble, we can rely on the "Add library search path to PATH"
|
||||||
// feature of the run configuration. Otherwise, we just prepend the path, here.
|
// feature of the run configuration. Otherwise, we just prepend the path, here.
|
||||||
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop
|
if (mcuTarget->toolChainPackage()->isDesktopToolchain()
|
||||||
&& !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi())
|
&& !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi())
|
||||||
pathAdditions.append(QDir::toNativeSeparators(qtForMCUsSdkPackage->path() + "/bin"));
|
pathAdditions.append(QDir::toNativeSeparators(qtForMCUsSdkPackage->path() + "/bin"));
|
||||||
|
|
||||||
@@ -595,7 +608,7 @@ static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const QString
|
|||||||
config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}"));
|
config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}"));
|
||||||
config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}"));
|
config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}"));
|
||||||
}
|
}
|
||||||
if (mcuTarget->toolChainPackage()->type() != McuToolChainPackage::TypeDesktop)
|
if (!mcuTarget->toolChainPackage()->isDesktopToolchain())
|
||||||
config.append(CMakeConfigItem(
|
config.append(CMakeConfigItem(
|
||||||
"CMAKE_TOOLCHAIN_FILE",
|
"CMAKE_TOOLCHAIN_FILE",
|
||||||
(qulDir + "/lib/cmake/Qul/toolchain/"
|
(qulDir + "/lib/cmake/Qul/toolchain/"
|
||||||
@@ -603,7 +616,7 @@ static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const QString
|
|||||||
config.append(CMakeConfigItem("QUL_GENERATORS",
|
config.append(CMakeConfigItem("QUL_GENERATORS",
|
||||||
(qulDir + "/lib/cmake/Qul/QulGenerators.cmake").toUtf8()));
|
(qulDir + "/lib/cmake/Qul/QulGenerators.cmake").toUtf8()));
|
||||||
config.append(CMakeConfigItem("QUL_PLATFORM",
|
config.append(CMakeConfigItem("QUL_PLATFORM",
|
||||||
mcuTarget->qulPlatform().toUtf8()));
|
mcuTarget->platform().name.toUtf8()));
|
||||||
|
|
||||||
if (mcuTarget->qulVersion() <= QVersionNumber{1,3} // OS variable was removed in Qul 1.4
|
if (mcuTarget->qulVersion() <= QVersionNumber{1,3} // OS variable was removed in Qul 1.4
|
||||||
&& mcuTarget->os() == McuTarget::OS::FreeRTOS)
|
&& mcuTarget->os() == McuTarget::OS::FreeRTOS)
|
||||||
@@ -631,19 +644,16 @@ static void setKitQtVersionOptions(Kit *k)
|
|||||||
QString McuSupportOptions::kitName(const McuTarget *mcuTarget)
|
QString McuSupportOptions::kitName(const McuTarget *mcuTarget)
|
||||||
{
|
{
|
||||||
QString os;
|
QString os;
|
||||||
if (mcuTarget->qulVersion() <= QVersionNumber{1,3} && mcuTarget->os() == McuTarget::OS::FreeRTOS) {
|
if (mcuTarget->qulVersion() <= QVersionNumber{1,3} && mcuTarget->os() == McuTarget::OS::FreeRTOS)
|
||||||
// Starting from Qul 1.4 each OS is a separate platform
|
// Starting from Qul 1.4 each OS is a separate platform
|
||||||
os = QLatin1String(" FreeRTOS");
|
os = QLatin1String(" FreeRTOS");
|
||||||
}
|
|
||||||
|
|
||||||
const QString colorDepth = mcuTarget->colorDepth() > 0
|
const QString colorDepth = mcuTarget->colorDepth() > 0
|
||||||
? QString::fromLatin1(" %1bpp").arg(mcuTarget->colorDepth())
|
? QString::fromLatin1(" %1bpp").arg(mcuTarget->colorDepth())
|
||||||
: "";
|
: "";
|
||||||
// Hack: Use the platform name in the kit name. Exception for the "Qt" platform: use "Desktop"
|
const QString targetName = mcuTarget->platform().displayName.isEmpty()
|
||||||
const QString targetName =
|
? mcuTarget->platform().name
|
||||||
mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop
|
: mcuTarget->platform().displayName;
|
||||||
? "Desktop"
|
|
||||||
: mcuTarget->qulPlatform();
|
|
||||||
return QString::fromLatin1("Qt for MCUs %1.%2 - %3%4%5")
|
return QString::fromLatin1("Qt for MCUs %1.%2 - %3%4%5")
|
||||||
.arg(QString::number(mcuTarget->qulVersion().majorVersion()),
|
.arg(QString::number(mcuTarget->qulVersion().majorVersion()),
|
||||||
QString::number(mcuTarget->qulVersion().minorVersion()),
|
QString::number(mcuTarget->qulVersion().minorVersion()),
|
||||||
@@ -659,8 +669,8 @@ QList<Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget)
|
|||||||
return kit->isAutoDetected()
|
return kit->isAutoDetected()
|
||||||
&& kit->value(KIT_MCUTARGET_KITVERSION_KEY) == KIT_VERSION
|
&& kit->value(KIT_MCUTARGET_KITVERSION_KEY) == KIT_VERSION
|
||||||
&& (!mcuTarget || (
|
&& (!mcuTarget || (
|
||||||
kit->value(KIT_MCUTARGET_VENDOR_KEY) == mcuTarget->vendor()
|
kit->value(KIT_MCUTARGET_VENDOR_KEY) == mcuTarget->platform().vendor
|
||||||
&& kit->value(KIT_MCUTARGET_MODEL_KEY) == mcuTarget->qulPlatform()
|
&& kit->value(KIT_MCUTARGET_MODEL_KEY) == mcuTarget->platform().name
|
||||||
&& kit->value(KIT_MCUTARGET_COLORDEPTH_KEY) == mcuTarget->colorDepth()
|
&& kit->value(KIT_MCUTARGET_COLORDEPTH_KEY) == mcuTarget->colorDepth()
|
||||||
&& kit->value(KIT_MCUTARGET_OS_KEY).toInt()
|
&& kit->value(KIT_MCUTARGET_OS_KEY).toInt()
|
||||||
== static_cast<int>(mcuTarget->os())
|
== static_cast<int>(mcuTarget->os())
|
||||||
|
@@ -110,13 +110,18 @@ public:
|
|||||||
TypeIAR,
|
TypeIAR,
|
||||||
TypeKEIL,
|
TypeKEIL,
|
||||||
TypeGHS,
|
TypeGHS,
|
||||||
TypeDesktop
|
TypeMSVC,
|
||||||
|
TypeGCC
|
||||||
};
|
};
|
||||||
|
|
||||||
McuToolChainPackage(const QString &label, const QString &defaultPath,
|
McuToolChainPackage(const QString &label,
|
||||||
const QString &detectionPath, const QString &settingsKey, Type type);
|
const QString &defaultPath,
|
||||||
|
const QString &detectionPath,
|
||||||
|
const QString &settingsKey,
|
||||||
|
Type type);
|
||||||
|
|
||||||
Type type() const;
|
Type type() const;
|
||||||
|
bool isDesktopToolchain() const;
|
||||||
ProjectExplorer::ToolChain *toolChain(Utils::Id language) const;
|
ProjectExplorer::ToolChain *toolChain(Utils::Id language) const;
|
||||||
QString cmakeToolChainFileName() const;
|
QString cmakeToolChainFileName() const;
|
||||||
QVariant debuggerId() const;
|
QVariant debuggerId() const;
|
||||||
@@ -136,15 +141,20 @@ public:
|
|||||||
FreeRTOS
|
FreeRTOS
|
||||||
};
|
};
|
||||||
|
|
||||||
McuTarget(const QVersionNumber &qulVersion, const QString &vendor, const QString &platform,
|
struct Platform {
|
||||||
OS os, const QVector<McuPackage *> &packages,
|
QString name;
|
||||||
|
QString displayName;
|
||||||
|
QString vendor;
|
||||||
|
};
|
||||||
|
|
||||||
|
McuTarget(const QVersionNumber &qulVersion, const Platform &platform, OS os,
|
||||||
|
const QVector<McuPackage *> &packages,
|
||||||
const McuToolChainPackage *toolChainPackage);
|
const McuToolChainPackage *toolChainPackage);
|
||||||
|
|
||||||
QVersionNumber qulVersion() const;
|
QVersionNumber qulVersion() const;
|
||||||
QString vendor() const;
|
|
||||||
QVector<McuPackage *> packages() const;
|
QVector<McuPackage *> packages() const;
|
||||||
const McuToolChainPackage *toolChainPackage() const;
|
const McuToolChainPackage *toolChainPackage() const;
|
||||||
QString qulPlatform() const;
|
Platform platform() const;
|
||||||
OS os() const;
|
OS os() const;
|
||||||
void setColorDepth(int colorDepth);
|
void setColorDepth(int colorDepth);
|
||||||
int colorDepth() const;
|
int colorDepth() const;
|
||||||
@@ -152,8 +162,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
const QVersionNumber m_qulVersion;
|
const QVersionNumber m_qulVersion;
|
||||||
const QString m_vendor;
|
const Platform m_platform;
|
||||||
const QString m_qulPlatform;
|
|
||||||
const OS m_os = OS::BareMetal;
|
const OS m_os = OS::BareMetal;
|
||||||
const QVector<McuPackage*> m_packages;
|
const QVector<McuPackage*> m_packages;
|
||||||
const McuToolChainPackage *m_toolChainPackage;
|
const McuToolChainPackage *m_toolChainPackage;
|
||||||
|
@@ -68,9 +68,14 @@ McuPackage *createQtForMCUsPackage()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static McuToolChainPackage *createDesktopToolChainPackage()
|
static McuToolChainPackage *createMsvcToolChainPackage()
|
||||||
{
|
{
|
||||||
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::TypeDesktop);
|
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::TypeMSVC);
|
||||||
|
}
|
||||||
|
|
||||||
|
static McuToolChainPackage *createGccToolChainPackage()
|
||||||
|
{
|
||||||
|
return new McuToolChainPackage({}, {}, {}, {}, McuToolChainPackage::TypeGCC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static McuToolChainPackage *createArmGccPackage()
|
static McuToolChainPackage *createArmGccPackage()
|
||||||
@@ -203,8 +208,14 @@ static McuPackage *createMcuXpressoIdePackage()
|
|||||||
|
|
||||||
struct McuTargetDescription
|
struct McuTargetDescription
|
||||||
{
|
{
|
||||||
|
enum class TargetType {
|
||||||
|
MCU,
|
||||||
|
Desktop
|
||||||
|
};
|
||||||
|
|
||||||
QString qulVersion;
|
QString qulVersion;
|
||||||
QString platform;
|
QString platform;
|
||||||
|
QString platformName;
|
||||||
QString platformVendor;
|
QString platformVendor;
|
||||||
QVector<int> colorDepths;
|
QVector<int> colorDepths;
|
||||||
QString toolchainId;
|
QString toolchainId;
|
||||||
@@ -213,6 +224,7 @@ struct McuTargetDescription
|
|||||||
QString boardSdkDefaultPath;
|
QString boardSdkDefaultPath;
|
||||||
QString freeRTOSEnvVar;
|
QString freeRTOSEnvVar;
|
||||||
QString freeRTOSBoardSdkSubDir;
|
QString freeRTOSBoardSdkSubDir;
|
||||||
|
TargetType type;
|
||||||
};
|
};
|
||||||
|
|
||||||
static McuPackage *createBoardSdkPackage(const McuTargetDescription& desc)
|
static McuPackage *createBoardSdkPackage(const McuTargetDescription& desc)
|
||||||
@@ -253,7 +265,7 @@ static McuPackage *createBoardSdkPackage(const McuTargetDescription& desc)
|
|||||||
static McuPackage *createFreeRTOSSourcesPackage(const QString &envVar, const QString &boardSdkDir,
|
static McuPackage *createFreeRTOSSourcesPackage(const QString &envVar, const QString &boardSdkDir,
|
||||||
const QString &freeRTOSBoardSdkSubDir)
|
const QString &freeRTOSBoardSdkSubDir)
|
||||||
{
|
{
|
||||||
const QString envVarPrefix = envVar.chopped(strlen("_FREERTOS_DIR"));
|
const QString envVarPrefix = envVar.chopped(int(strlen("_FREERTOS_DIR")));
|
||||||
|
|
||||||
QString defaultPath;
|
QString defaultPath;
|
||||||
if (qEnvironmentVariableIsSet(envVar.toLatin1()))
|
if (qEnvironmentVariableIsSet(envVar.toLatin1()))
|
||||||
@@ -283,16 +295,16 @@ struct McuTargetFactory
|
|||||||
|
|
||||||
QVector<McuTarget *> createTargets(const McuTargetDescription& description)
|
QVector<McuTarget *> createTargets(const McuTargetDescription& description)
|
||||||
{
|
{
|
||||||
if (description.toolchainId == "desktop") {
|
|
||||||
return createDesktopTargets(description);
|
|
||||||
}
|
|
||||||
auto qulVersion = QVersionNumber::fromString(description.qulVersion);
|
auto qulVersion = QVersionNumber::fromString(description.qulVersion);
|
||||||
if (qulVersion <= QVersionNumber({1,3})) {
|
if (qulVersion <= QVersionNumber({1,3})) {
|
||||||
|
if (description.type == McuTargetDescription::TargetType::Desktop)
|
||||||
|
return createDesktopTargetsLegacy(description);
|
||||||
|
|
||||||
// There was a platform backends related refactoring in Qul 1.4
|
// There was a platform backends related refactoring in Qul 1.4
|
||||||
// This requires different processing of McuTargetDescriptions
|
// This requires different processing of McuTargetDescriptions
|
||||||
return createMcuTargetsLegacy(description);
|
return createMcuTargetsLegacy(description);
|
||||||
}
|
}
|
||||||
return createMcuTargets(description);
|
return createTargetsImpl(description);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<McuPackage *> getMcuPackages() const
|
QVector<McuPackage *> getMcuPackages() const
|
||||||
@@ -305,16 +317,16 @@ struct McuTargetFactory
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Implementation for Qul version <= 1.3
|
// Implementation for Qul version <= 1.3
|
||||||
QVector<McuTarget *> createMcuTargetsLegacy(const McuTargetDescription& desc)
|
QVector<McuTarget *> createMcuTargetsLegacy(const McuTargetDescription &desc)
|
||||||
{
|
{
|
||||||
QVector<McuTarget *> mcuTargets;
|
QVector<McuTarget *> mcuTargets;
|
||||||
auto tcPkg = tcPkgs.value(desc.toolchainId);
|
McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchainId);
|
||||||
for (auto os : {McuTarget::OS::BareMetal, McuTarget::OS::FreeRTOS}) {
|
for (auto os : {McuTarget::OS::BareMetal, McuTarget::OS::FreeRTOS}) {
|
||||||
for (int colorDepth : desc.colorDepths) {
|
for (int colorDepth : desc.colorDepths) {
|
||||||
QVector<McuPackage*> required3rdPartyPkgs = { tcPkg };
|
QVector<McuPackage*> required3rdPartyPkgs = { tcPkg };
|
||||||
if (vendorPkgs.contains(desc.platformVendor)) {
|
if (vendorPkgs.contains(desc.platformVendor))
|
||||||
required3rdPartyPkgs.push_back(vendorPkgs.value(desc.platformVendor));
|
required3rdPartyPkgs.push_back(vendorPkgs.value(desc.platformVendor));
|
||||||
}
|
|
||||||
QString boardSdkDefaultPath;
|
QString boardSdkDefaultPath;
|
||||||
if (!desc.boardSdkEnvVar.isEmpty()) {
|
if (!desc.boardSdkEnvVar.isEmpty()) {
|
||||||
if (!boardSdkPkgs.contains(desc.boardSdkEnvVar)) {
|
if (!boardSdkPkgs.contains(desc.boardSdkEnvVar)) {
|
||||||
@@ -340,9 +352,9 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto platform = McuTarget::Platform{ desc.platform, desc.platformName, desc.platformVendor };
|
||||||
auto mcuTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion),
|
auto mcuTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion),
|
||||||
desc.platformVendor, desc.platform, os,
|
platform, os, required3rdPartyPkgs, tcPkg);
|
||||||
required3rdPartyPkgs, tcPkg);
|
|
||||||
if (desc.colorDepths.count() > 1)
|
if (desc.colorDepths.count() > 1)
|
||||||
mcuTarget->setColorDepth(colorDepth);
|
mcuTarget->setColorDepth(colorDepth);
|
||||||
mcuTargets.append(mcuTarget);
|
mcuTargets.append(mcuTarget);
|
||||||
@@ -351,15 +363,39 @@ protected:
|
|||||||
return mcuTargets;
|
return mcuTargets;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<McuTarget *> createMcuTargets(const McuTargetDescription& desc)
|
QVector<McuTarget *> createDesktopTargetsLegacy(const McuTargetDescription& desc)
|
||||||
{
|
{
|
||||||
QVector<McuTarget *> mcuTargets;
|
McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchainId);
|
||||||
auto tcPkg = tcPkgs.value(desc.toolchainId);
|
const auto platform = McuTarget::Platform{ desc.platform, desc.platformName, desc.platformVendor };
|
||||||
for (int colorDepth : desc.colorDepths) {
|
auto desktopTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion),
|
||||||
QVector<McuPackage*> required3rdPartyPkgs = { tcPkg };
|
platform, McuTarget::OS::Desktop, {}, tcPkg);
|
||||||
if (vendorPkgs.contains(desc.platformVendor)) {
|
return { desktopTarget };
|
||||||
required3rdPartyPkgs.push_back(vendorPkgs.value(desc.platformVendor));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVector<McuTarget *> createTargetsImpl(const McuTargetDescription& desc)
|
||||||
|
{
|
||||||
|
// OS deduction
|
||||||
|
const auto os = [&] {
|
||||||
|
if (desc.type == McuTargetDescription::TargetType::Desktop)
|
||||||
|
return McuTarget::OS::Desktop;
|
||||||
|
else if (!desc.freeRTOSEnvVar.isEmpty())
|
||||||
|
return McuTarget::OS::FreeRTOS;
|
||||||
|
return McuTarget::OS::BareMetal;
|
||||||
|
}();
|
||||||
|
|
||||||
|
QVector<McuTarget *> mcuTargets;
|
||||||
|
McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchainId);
|
||||||
|
for (int colorDepth : desc.colorDepths) {
|
||||||
|
QVector<McuPackage*> required3rdPartyPkgs;
|
||||||
|
// Desktop toolchains don't need any additional settings
|
||||||
|
if (tcPkg && !tcPkg->isDesktopToolchain())
|
||||||
|
required3rdPartyPkgs.append(tcPkg);
|
||||||
|
|
||||||
|
// Add setting specific to platform IDE
|
||||||
|
if (vendorPkgs.contains(desc.platformVendor))
|
||||||
|
required3rdPartyPkgs.push_back(vendorPkgs.value(desc.platformVendor));
|
||||||
|
|
||||||
|
// Board SDK specific settings
|
||||||
QString boardSdkDefaultPath;
|
QString boardSdkDefaultPath;
|
||||||
if (!desc.boardSdkEnvVar.isEmpty()) {
|
if (!desc.boardSdkEnvVar.isEmpty()) {
|
||||||
if (!boardSdkPkgs.contains(desc.boardSdkEnvVar)) {
|
if (!boardSdkPkgs.contains(desc.boardSdkEnvVar)) {
|
||||||
@@ -371,9 +407,8 @@ protected:
|
|||||||
required3rdPartyPkgs.append(boardSdkPkg);
|
required3rdPartyPkgs.append(boardSdkPkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto os = McuTarget::OS::BareMetal;
|
// Free RTOS specific settings
|
||||||
if (!desc.freeRTOSEnvVar.isEmpty()) {
|
if (!desc.freeRTOSEnvVar.isEmpty()) {
|
||||||
os = McuTarget::OS::FreeRTOS;
|
|
||||||
if (!freeRTOSPkgs.contains(desc.freeRTOSEnvVar)) {
|
if (!freeRTOSPkgs.contains(desc.freeRTOSEnvVar)) {
|
||||||
freeRTOSPkgs.insert(desc.freeRTOSEnvVar, createFreeRTOSSourcesPackage(
|
freeRTOSPkgs.insert(desc.freeRTOSEnvVar, createFreeRTOSSourcesPackage(
|
||||||
desc.freeRTOSEnvVar, boardSdkDefaultPath,
|
desc.freeRTOSEnvVar, boardSdkDefaultPath,
|
||||||
@@ -382,24 +417,15 @@ protected:
|
|||||||
required3rdPartyPkgs.append(freeRTOSPkgs.value(desc.freeRTOSEnvVar));
|
required3rdPartyPkgs.append(freeRTOSPkgs.value(desc.freeRTOSEnvVar));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto platform = McuTarget::Platform{ desc.platform, desc.platformName, desc.platformVendor };
|
||||||
auto mcuTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion),
|
auto mcuTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion),
|
||||||
desc.platformVendor, desc.platform, os,
|
platform, os, required3rdPartyPkgs, tcPkg);
|
||||||
required3rdPartyPkgs, tcPkg);
|
|
||||||
mcuTarget->setColorDepth(colorDepth);
|
mcuTarget->setColorDepth(colorDepth);
|
||||||
mcuTargets.append(mcuTarget);
|
mcuTargets.append(mcuTarget);
|
||||||
}
|
}
|
||||||
return mcuTargets;
|
return mcuTargets;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<McuTarget *> createDesktopTargets(const McuTargetDescription& desc)
|
|
||||||
{
|
|
||||||
auto tcPkg = tcPkgs.value(desc.toolchainId);
|
|
||||||
auto desktopTarget = new McuTarget(QVersionNumber::fromString(desc.qulVersion),
|
|
||||||
desc.platformVendor, desc.platform,
|
|
||||||
McuTarget::OS::Desktop, {}, tcPkg);
|
|
||||||
return { desktopTarget };
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const QHash<QString, McuToolChainPackage *> &tcPkgs;
|
const QHash<QString, McuToolChainPackage *> &tcPkgs;
|
||||||
const QHash<QString, McuPackage *> &vendorPkgs;
|
const QHash<QString, McuPackage *> &vendorPkgs;
|
||||||
@@ -414,7 +440,8 @@ static QVector<McuTarget *> targetsFromDescriptions(const QList<McuTargetDescrip
|
|||||||
const QHash<QString, McuToolChainPackage *> tcPkgs = {
|
const QHash<QString, McuToolChainPackage *> tcPkgs = {
|
||||||
{{"armgcc"}, createArmGccPackage()},
|
{{"armgcc"}, createArmGccPackage()},
|
||||||
{{"greenhills"}, createGhsToolchainPackage()},
|
{{"greenhills"}, createGhsToolchainPackage()},
|
||||||
{{"desktop"}, createDesktopToolChainPackage()},
|
{{"msvc"}, createMsvcToolChainPackage()},
|
||||||
|
{{"gcc"}, createGccToolChainPackage()},
|
||||||
};
|
};
|
||||||
|
|
||||||
const QHash<QString, McuPackage *> vendorPkgs = {
|
const QHash<QString, McuPackage *> vendorPkgs = {
|
||||||
@@ -452,15 +479,14 @@ static McuTargetDescription parseDescriptionJson(const QByteArray &data)
|
|||||||
const QJsonObject boardSdk = target.value("boardSdk").toObject();
|
const QJsonObject boardSdk = target.value("boardSdk").toObject();
|
||||||
const QJsonObject freeRTOS = target.value("freeRTOS").toObject();
|
const QJsonObject freeRTOS = target.value("freeRTOS").toObject();
|
||||||
|
|
||||||
const QString platform = target.value("platform").toString();
|
|
||||||
|
|
||||||
const QVariantList colorDepths = target.value("colorDepths").toArray().toVariantList();
|
const QVariantList colorDepths = target.value("colorDepths").toArray().toVariantList();
|
||||||
const auto colorDepthsVector = Utils::transform<QVector<int> >(
|
const auto colorDepthsVector = Utils::transform<QVector<int> >(
|
||||||
colorDepths, [&](const QVariant &colorDepth) { return colorDepth.toInt(); });
|
colorDepths, [&](const QVariant &colorDepth) { return colorDepth.toInt(); });
|
||||||
|
|
||||||
return {
|
return {
|
||||||
target.value("qulVersion").toString(),
|
target.value("qulVersion").toString(),
|
||||||
platform,
|
target.value("platform").toString(),
|
||||||
|
target.value("platformName").toString(),
|
||||||
target.value("platformVendor").toString(),
|
target.value("platformVendor").toString(),
|
||||||
colorDepthsVector,
|
colorDepthsVector,
|
||||||
toolchain.value("id").toString(),
|
toolchain.value("id").toString(),
|
||||||
@@ -468,7 +494,8 @@ static McuTargetDescription parseDescriptionJson(const QByteArray &data)
|
|||||||
boardSdk.value("name").toString(),
|
boardSdk.value("name").toString(),
|
||||||
boardSdk.value("defaultPath").toString(),
|
boardSdk.value("defaultPath").toString(),
|
||||||
freeRTOS.value("envVar").toString(),
|
freeRTOS.value("envVar").toString(),
|
||||||
freeRTOS.value("boardSdkSubDir").toString()
|
freeRTOS.value("boardSdkSubDir").toString(),
|
||||||
|
boardSdk.empty() ? McuTargetDescription::TargetType::Desktop : McuTargetDescription::TargetType::MCU
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,7 +514,15 @@ void targetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage *> *packa
|
|||||||
descriptions.append(desc);
|
descriptions.append(desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Workaround for missing JSON file for Desktop target:
|
// Workaround for missing JSON file for Desktop target.
|
||||||
|
// Desktop JSON file is shipped starting from Qul 1.5.
|
||||||
|
// This whole section could be removed when minimalQulVersion will reach 1.5 or above
|
||||||
|
{
|
||||||
|
const bool hasDesktopDescription = Utils::contains(descriptions, [](const McuTargetDescription &desc) {
|
||||||
|
return desc.type == McuTargetDescription::TargetType::Desktop;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!hasDesktopDescription) {
|
||||||
Utils::FilePath desktopLib;
|
Utils::FilePath desktopLib;
|
||||||
if (Utils::HostOsInfo::isWindowsHost())
|
if (Utils::HostOsInfo::isWindowsHost())
|
||||||
desktopLib = dir / "lib/QulQuickUltralite_QT_32bpp_Windows_Release.lib";
|
desktopLib = dir / "lib/QulQuickUltralite_QT_32bpp_Windows_Release.lib";
|
||||||
@@ -499,13 +534,23 @@ void targetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage *> *packa
|
|||||||
desktopDescription.qulVersion = descriptions.empty() ?
|
desktopDescription.qulVersion = descriptions.empty() ?
|
||||||
McuSupportOptions::minimalQulVersion().toString()
|
McuSupportOptions::minimalQulVersion().toString()
|
||||||
: descriptions.first().qulVersion;
|
: descriptions.first().qulVersion;
|
||||||
desktopDescription.platform = desktopDescription.platformVendor = "Qt";
|
desktopDescription.platform = "Qt";
|
||||||
|
desktopDescription.platformName = "Desktop";
|
||||||
|
desktopDescription.platformVendor = "Qt";
|
||||||
desktopDescription.colorDepths = {32};
|
desktopDescription.colorDepths = {32};
|
||||||
desktopDescription.toolchainId = "desktop";
|
desktopDescription.toolchainId = Utils::HostOsInfo::isWindowsHost() ? QString("msvc") : QString("gcc");
|
||||||
|
desktopDescription.type = McuTargetDescription::TargetType::Desktop;
|
||||||
descriptions.prepend(desktopDescription);
|
descriptions.prepend(desktopDescription);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mcuTargets->append(targetsFromDescriptions(descriptions, packages));
|
mcuTargets->append(targetsFromDescriptions(descriptions, packages));
|
||||||
|
|
||||||
|
// Keep targets sorted lexicographically
|
||||||
|
std::sort(mcuTargets->begin(), mcuTargets->end(), [] (const McuTarget* lhs, const McuTarget* rhs) {
|
||||||
|
return McuSupportOptions::kitName(lhs) < McuSupportOptions::kitName(rhs);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Sdk
|
} // namespace Sdk
|
||||||
|
@@ -736,4 +736,17 @@ void Kit::kitUpdated()
|
|||||||
d->m_mustNotify = false;
|
d->m_mustNotify = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Id replacementKey() { return "IsReplacementKit"; }
|
||||||
|
|
||||||
|
void ProjectExplorer::Kit::makeReplacementKit()
|
||||||
|
{
|
||||||
|
setValueSilently(replacementKey(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Kit::isReplacementKit() const
|
||||||
|
{
|
||||||
|
return value(replacementKey()).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
@@ -132,6 +132,9 @@ public:
|
|||||||
void setMutable(Utils::Id id, bool b);
|
void setMutable(Utils::Id id, bool b);
|
||||||
bool isMutable(Utils::Id id) const;
|
bool isMutable(Utils::Id id) const;
|
||||||
|
|
||||||
|
void makeReplacementKit();
|
||||||
|
bool isReplacementKit() const;
|
||||||
|
|
||||||
void setIrrelevantAspects(const QSet<Utils::Id> &irrelevant);
|
void setIrrelevantAspects(const QSet<Utils::Id> &irrelevant);
|
||||||
QSet<Utils::Id> irrelevantAspects() const;
|
QSet<Utils::Id> irrelevantAspects() const;
|
||||||
|
|
||||||
|
@@ -235,6 +235,13 @@ void KitManager::restoreKits()
|
|||||||
// Delete all loaded autodetected kits that were not rediscovered:
|
// Delete all loaded autodetected kits that were not rediscovered:
|
||||||
kitsToCheck.clear();
|
kitsToCheck.clear();
|
||||||
|
|
||||||
|
// Remove replacement kits for which the original kit has turned up again.
|
||||||
|
erase(resultList, [&resultList](const std::unique_ptr<Kit> &k) {
|
||||||
|
return k->isReplacementKit() && contains(resultList, [&k](const std::unique_ptr<Kit> &other) {
|
||||||
|
return other->id() == k->id() && other != k;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
static const auto kitMatchesAbiList = [](const Kit *kit, const Abis &abis) {
|
static const auto kitMatchesAbiList = [](const Kit *kit, const Abis &abis) {
|
||||||
const QList<ToolChain *> toolchains = ToolChainKitAspect::toolChains(kit);
|
const QList<ToolChain *> toolchains = ToolChainKitAspect::toolChains(kit);
|
||||||
for (const ToolChain * const tc : toolchains) {
|
for (const ToolChain * const tc : toolchains) {
|
||||||
|
@@ -776,6 +776,7 @@ void Project::createTargetFromMap(const QVariantMap &map, int index)
|
|||||||
Utils::transform(KitManager::kits(), &Kit::unexpandedDisplayName));
|
Utils::transform(KitManager::kits(), &Kit::unexpandedDisplayName));
|
||||||
kit->setUnexpandedDisplayName(tempKitName);
|
kit->setUnexpandedDisplayName(tempKitName);
|
||||||
DeviceTypeKitAspect::setDeviceTypeId(kit, deviceTypeId);
|
DeviceTypeKitAspect::setDeviceTypeId(kit, deviceTypeId);
|
||||||
|
kit->makeReplacementKit();
|
||||||
kit->setup();
|
kit->setup();
|
||||||
}, id);
|
}, id);
|
||||||
TaskHub::addTask(BuildSystemTask(Task::Warning, tr("Project \"%1\" was configured for "
|
TaskHub::addTask(BuildSystemTask(Task::Warning, tr("Project \"%1\" was configured for "
|
||||||
|
@@ -405,8 +405,10 @@ public:
|
|||||||
static bool isListViewInBaseState(const SelectionContext &selectionState)
|
static bool isListViewInBaseState(const SelectionContext &selectionState)
|
||||||
{
|
{
|
||||||
return selectionState.isInBaseState() && selectionState.singleNodeIsSelected()
|
return selectionState.isInBaseState() && selectionState.singleNodeIsSelected()
|
||||||
&& selectionState.currentSingleSelectedNode().metaInfo().isSubclassOf(
|
&& (selectionState.currentSingleSelectedNode().metaInfo().isSubclassOf(
|
||||||
"QtQuick.ListView");
|
"QtQuick.ListView")
|
||||||
|
|| selectionState.currentSingleSelectedNode().metaInfo().isSubclassOf(
|
||||||
|
"QtQuick.GridView"));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isEnabled(const SelectionContext &) const override { return true; }
|
bool isEnabled(const SelectionContext &) const override { return true; }
|
||||||
|
@@ -303,7 +303,7 @@ void ConnectionModel::addConnection()
|
|||||||
ModelNode newNode = connectionView()->createModelNode("QtQuick.Connections",
|
ModelNode newNode = connectionView()->createModelNode("QtQuick.Connections",
|
||||||
nodeMetaInfo.majorVersion(),
|
nodeMetaInfo.majorVersion(),
|
||||||
nodeMetaInfo.minorVersion());
|
nodeMetaInfo.minorVersion());
|
||||||
QString source = "print(\"clicked\")";
|
QString source = "console.log(\"clicked\")";
|
||||||
|
|
||||||
if (connectionView()->selectedModelNodes().count() == 1) {
|
if (connectionView()->selectedModelNodes().count() == 1) {
|
||||||
ModelNode selectedNode = connectionView()->selectedModelNodes().constFirst();
|
ModelNode selectedNode = connectionView()->selectedModelNodes().constFirst();
|
||||||
|
@@ -132,7 +132,7 @@ void StatesEditorWidget::toggleStatesViewExpanded()
|
|||||||
|
|
||||||
void StatesEditorWidget::showEvent(QShowEvent *event)
|
void StatesEditorWidget::showEvent(QShowEvent *event)
|
||||||
{
|
{
|
||||||
Q_UNUSED(event)
|
QQuickWidget::showEvent(event);
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -95,6 +95,13 @@ TimelineEditorDelegate::TimelineEditorDelegate(QWidget *parent)
|
|||||||
setItemEditorFactory(factory);
|
setItemEditorFactory(factory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSpinBox *createSpinBox(QWidget *parent)
|
||||||
|
{
|
||||||
|
auto spinBox = new QSpinBox(parent);
|
||||||
|
spinBox->setRange(-10000, 10000);
|
||||||
|
return spinBox;
|
||||||
|
}
|
||||||
|
|
||||||
QWidget *TimelineEditorDelegate::createEditor(QWidget *parent,
|
QWidget *TimelineEditorDelegate::createEditor(QWidget *parent,
|
||||||
const QStyleOptionViewItem &option,
|
const QStyleOptionViewItem &option,
|
||||||
const QModelIndex &index) const
|
const QModelIndex &index) const
|
||||||
@@ -102,7 +109,7 @@ QWidget *TimelineEditorDelegate::createEditor(QWidget *parent,
|
|||||||
QWidget *widget = nullptr;
|
QWidget *widget = nullptr;
|
||||||
|
|
||||||
if (index.column() == TimelineSettingsModel::FixedFrameRow)
|
if (index.column() == TimelineSettingsModel::FixedFrameRow)
|
||||||
widget = new QSpinBox(parent);
|
widget = createSpinBox(parent);
|
||||||
else
|
else
|
||||||
widget = QStyledItemDelegate::createEditor(parent, option, index);
|
widget = QStyledItemDelegate::createEditor(parent, option, index);
|
||||||
|
|
||||||
|
@@ -66,12 +66,12 @@ private:
|
|||||||
void printProcessOutput(QProcess *process, const QString &connectionName);
|
void printProcessOutput(QProcess *process, const QString &connectionName);
|
||||||
void closeSocketsAndKillProcesses();
|
void closeSocketsAndKillProcesses();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<QLocalServer> m_localServer;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::vector<Connection> m_connections;
|
std::vector<Connection> m_connections;
|
||||||
quint32 m_writeCommandCounter = 0;
|
quint32 m_writeCommandCounter = 0;
|
||||||
|
|
||||||
private:
|
|
||||||
std::unique_ptr<QLocalServer> m_localServer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QmlDesigner
|
} // namespace QmlDesigner
|
||||||
|
@@ -125,8 +125,11 @@ ProjectFileSelectionsWidget::ProjectFileSelectionsWidget(const QString &projectS
|
|||||||
const auto settingsDisabledFiles = project->namedSettings(m_projectSettingsKey).toStringList();
|
const auto settingsDisabledFiles = project->namedSettings(m_projectSettingsKey).toStringList();
|
||||||
|
|
||||||
if (auto rootProjectNode = project->rootProjectNode()) {
|
if (auto rootProjectNode = project->rootProjectNode()) {
|
||||||
rootProjectNode->forEachNode([this, settingsDisabledFiles, model](ProjectExplorer::FileNode *fileNode) {
|
auto rootPath = rootProjectNode->filePath();
|
||||||
if (fileNode->fileType() == m_fileType) {
|
|
||||||
|
rootProjectNode->forEachNode([this, settingsDisabledFiles, model, rootPath](ProjectExplorer::FileNode *fileNode) {
|
||||||
|
if (fileNode->fileType() == m_fileType
|
||||||
|
&& !fileNode->filePath().relativeChildPath(rootPath).startsWith("imports/")) {
|
||||||
bool isDisabled = settingsDisabledFiles.contains(fileNode->filePath().toString());
|
bool isDisabled = settingsDisabledFiles.contains(fileNode->filePath().toString());
|
||||||
model->rootItem()->appendChild(new ProjectFileItem(fileNode->filePath(), isDisabled));
|
model->rootItem()->appendChild(new ProjectFileItem(fileNode->filePath(), isDisabled));
|
||||||
}
|
}
|
||||||
|
@@ -104,21 +104,17 @@ QmlDebugTranslationWidget::QmlDebugTranslationWidget(QWidget *parent)
|
|||||||
|
|
||||||
const QString projectSettingsKey = "QmlPreview.DisabledDebugTranslationFiles";
|
const QString projectSettingsKey = "QmlPreview.DisabledDebugTranslationFiles";
|
||||||
const ProjectExplorer::FileType filterFileType = ProjectExplorer::FileType::QML;
|
const ProjectExplorer::FileType filterFileType = ProjectExplorer::FileType::QML;
|
||||||
auto checkableProjectFileView = new ProjectFileSelectionsWidget(projectSettingsKey, filterFileType);
|
m_checkableProjectFileView = new ProjectFileSelectionsWidget(projectSettingsKey, filterFileType);
|
||||||
checkableProjectFileView->setVisible(false);
|
m_checkableProjectFileView->setVisible(false);
|
||||||
connect(checkableProjectFileView, &ProjectFileSelectionsWidget::selectionChanged, this, &QmlDebugTranslationWidget::setFiles);
|
connect(m_checkableProjectFileView, &ProjectFileSelectionsWidget::selectionChanged, this, &QmlDebugTranslationWidget::setFiles);
|
||||||
m_multipleFileButton = new QRadioButton(tr("multiple files"));
|
m_multipleFileButton = new QRadioButton(tr("multiple files"));
|
||||||
// TODO: fix multiple files issues, because it have some issues disable it for now
|
|
||||||
m_multipleFileButton->setDisabled(true);
|
|
||||||
buttonGroup->addButton(m_multipleFileButton);
|
buttonGroup->addButton(m_multipleFileButton);
|
||||||
connect(m_multipleFileButton, &QAbstractButton::toggled, [checkableProjectFileView, this](bool checked) {
|
connect(m_multipleFileButton, &QAbstractButton::toggled, m_checkableProjectFileView, &QWidget::setVisible);
|
||||||
checkableProjectFileView->setVisible(checked);
|
connect(m_multipleFileButton, &QAbstractButton::toggled, this, &QmlDebugTranslationWidget::updateFiles);
|
||||||
setFiles(checkableProjectFileView->checkedFiles());
|
|
||||||
});
|
|
||||||
|
|
||||||
mainLayout->addWidget(m_singleFileButton);
|
mainLayout->addWidget(m_singleFileButton);
|
||||||
mainLayout->addWidget(m_multipleFileButton);
|
mainLayout->addWidget(m_multipleFileButton);
|
||||||
mainLayout->addWidget(checkableProjectFileView);
|
mainLayout->addWidget(m_checkableProjectFileView);
|
||||||
|
|
||||||
// language checkboxes are add in updateAvailableTranslations method
|
// language checkboxes are add in updateAvailableTranslations method
|
||||||
m_selectLanguageLayout = new QHBoxLayout;
|
m_selectLanguageLayout = new QHBoxLayout;
|
||||||
@@ -226,7 +222,7 @@ void QmlDebugTranslationWidget::updateCurrentEditor(const Core::IEditor *editor)
|
|||||||
else
|
else
|
||||||
m_currentFilePath.clear();
|
m_currentFilePath.clear();
|
||||||
m_singleFileButton->setText(singleFileButtonText(m_currentFilePath.toString()));
|
m_singleFileButton->setText(singleFileButtonText(m_currentFilePath.toString()));
|
||||||
|
updateFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlDebugTranslationWidget::updateStartupProjectTranslations()
|
void QmlDebugTranslationWidget::updateStartupProjectTranslations()
|
||||||
@@ -253,6 +249,7 @@ void QmlDebugTranslationWidget::updateCurrentTranslations(ProjectExplorer::Proje
|
|||||||
tr("Current language is \'<b>%1</b>\' can be changed in the 'Translation' tab.")
|
tr("Current language is \'<b>%1</b>\' can be changed in the 'Translation' tab.")
|
||||||
.arg(multiLanguageAspect->currentLocale())));
|
.arg(multiLanguageAspect->currentLocale())));
|
||||||
m_testLanguages.clear();
|
m_testLanguages.clear();
|
||||||
|
m_testLanguages.append(multiLanguageAspect->currentLocale());
|
||||||
} else {
|
} else {
|
||||||
m_selectLanguageLayout->addWidget(new QLabel(tr("Select which language should be tested:")));
|
m_selectLanguageLayout->addWidget(new QLabel(tr("Select which language should be tested:")));
|
||||||
QString errorMessage;
|
QString errorMessage;
|
||||||
@@ -272,6 +269,14 @@ void QmlDebugTranslationWidget::updateCurrentTranslations(ProjectExplorer::Proje
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QmlDebugTranslationWidget::updateFiles()
|
||||||
|
{
|
||||||
|
if (m_multipleFileButton->isChecked())
|
||||||
|
setFiles(m_checkableProjectFileView->checkedFiles());
|
||||||
|
else
|
||||||
|
setFiles({m_currentFilePath});
|
||||||
|
}
|
||||||
|
|
||||||
void QmlDebugTranslationWidget::setFiles(const Utils::FilePaths &filePathes)
|
void QmlDebugTranslationWidget::setFiles(const Utils::FilePaths &filePathes)
|
||||||
{
|
{
|
||||||
m_selectedFilePaths = filePathes;
|
m_selectedFilePaths = filePathes;
|
||||||
@@ -305,14 +310,9 @@ void QmlDebugTranslationWidget::runTest()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (m_multipleFileButton->isChecked()) {
|
|
||||||
for (auto filePath : m_selectedFilePaths) {
|
for (auto filePath : m_selectedFilePaths) {
|
||||||
testLanguages(timerCounter++, filePath.toString());
|
testLanguages(timerCounter++, filePath.toString());
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
testLanguages(timerCounter, QString());
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
});
|
||||||
connect(runControl, &ProjectExplorer::RunControl::stopped, [this]() {
|
connect(runControl, &ProjectExplorer::RunControl::stopped, [this]() {
|
||||||
m_runTestButton->setChecked(false);
|
m_runTestButton->setChecked(false);
|
||||||
|
@@ -49,6 +49,8 @@ class RunControl;
|
|||||||
|
|
||||||
namespace QmlPreview {
|
namespace QmlPreview {
|
||||||
|
|
||||||
|
class ProjectFileSelectionsWidget;
|
||||||
|
|
||||||
class QMLPREVIEW_EXPORT QmlDebugTranslationWidget : public QWidget
|
class QMLPREVIEW_EXPORT QmlDebugTranslationWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -62,6 +64,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void updateCurrentEditor(const Core::IEditor *editor);
|
void updateCurrentEditor(const Core::IEditor *editor);
|
||||||
void updateCurrentTranslations(ProjectExplorer::Project *project);
|
void updateCurrentTranslations(ProjectExplorer::Project *project);
|
||||||
|
void updateFiles();
|
||||||
void runTest();
|
void runTest();
|
||||||
void appendMessage(const QString &message, Utils::OutputFormat format);
|
void appendMessage(const QString &message, Utils::OutputFormat format);
|
||||||
void clear();
|
void clear();
|
||||||
@@ -81,6 +84,7 @@ private:
|
|||||||
|
|
||||||
QRadioButton *m_singleFileButton = nullptr;
|
QRadioButton *m_singleFileButton = nullptr;
|
||||||
QRadioButton *m_multipleFileButton = nullptr;
|
QRadioButton *m_multipleFileButton = nullptr;
|
||||||
|
ProjectFileSelectionsWidget *m_checkableProjectFileView = nullptr;
|
||||||
QPushButton *m_runTestButton = nullptr;
|
QPushButton *m_runTestButton = nullptr;
|
||||||
|
|
||||||
Utils::FilePath m_currentFilePath;
|
Utils::FilePath m_currentFilePath;
|
||||||
|
@@ -1164,6 +1164,10 @@ void TextEditorWidgetPrivate::print(QPrinter *printer)
|
|||||||
if (!p.isActive())
|
if (!p.isActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
QRectF pageRect(printer->pageRect());
|
||||||
|
if (pageRect.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
doc = doc->clone(doc);
|
doc = doc->clone(doc);
|
||||||
Utils::ExecuteOnDestruction docDeleter([doc]() { delete doc; });
|
Utils::ExecuteOnDestruction docDeleter([doc]() { delete doc; });
|
||||||
|
|
||||||
@@ -1217,7 +1221,6 @@ void TextEditorWidgetPrivate::print(QPrinter *printer)
|
|||||||
fmt.setMargin(margin);
|
fmt.setMargin(margin);
|
||||||
doc->rootFrame()->setFrameFormat(fmt);
|
doc->rootFrame()->setFrameFormat(fmt);
|
||||||
|
|
||||||
QRectF pageRect(printer->pageRect());
|
|
||||||
QRectF body = QRectF(0, 0, pageRect.width(), pageRect.height());
|
QRectF body = QRectF(0, 0, pageRect.width(), pageRect.height());
|
||||||
QFontMetrics fontMetrics(doc->defaultFont(), p.device());
|
QFontMetrics fontMetrics(doc->defaultFont(), p.device());
|
||||||
|
|
||||||
@@ -4724,7 +4727,6 @@ void TextEditorWidgetPrivate::setupSelections(const PaintEventData &data,
|
|||||||
const QTextCharFormat selectionFormat = data.fontSettings.toTextCharFormat(C_SELECTION);
|
const QTextCharFormat selectionFormat = data.fontSettings.toTextCharFormat(C_SELECTION);
|
||||||
if (selectionFormat.background().style() != Qt::NoBrush)
|
if (selectionFormat.background().style() != Qt::NoBrush)
|
||||||
o.format.setBackground(selectionFormat.background());
|
o.format.setBackground(selectionFormat.background());
|
||||||
if (selectionFormat.foreground().style() != Qt::NoBrush)
|
|
||||||
o.format.setForeground(selectionFormat.foreground());
|
o.format.setForeground(selectionFormat.foreground());
|
||||||
}
|
}
|
||||||
if ((data.textCursor.hasSelection() && i == data.context.selections.size() - 1)
|
if ((data.textCursor.hasSelection() && i == data.context.selections.size() - 1)
|
||||||
|
@@ -240,7 +240,8 @@ void TextEditorActionHandlerPrivate::createActions()
|
|||||||
m_deleteEndOfWordCamelCaseAction = registerAction(DELETE_END_OF_WORD_CAMEL_CASE,
|
m_deleteEndOfWordCamelCaseAction = registerAction(DELETE_END_OF_WORD_CAMEL_CASE,
|
||||||
[] (TextEditorWidget *w) { w->deleteEndOfWordCamelCase(); }, true, tr("Delete Word Camel Case from Cursor On"));
|
[] (TextEditorWidget *w) { w->deleteEndOfWordCamelCase(); }, true, tr("Delete Word Camel Case from Cursor On"));
|
||||||
m_deleteStartOfLineAction = registerAction(DELETE_START_OF_LINE,
|
m_deleteStartOfLineAction = registerAction(DELETE_START_OF_LINE,
|
||||||
[] (TextEditorWidget *w) { w->deleteStartOfLine(); }, true, tr("Delete Line up to Cursor"));
|
[] (TextEditorWidget *w) { w->deleteStartOfLine(); }, true, tr("Delete Line up to Cursor"),
|
||||||
|
Core::useMacShortcuts ? QKeySequence(tr("Ctrl+Backspace")) : QKeySequence());
|
||||||
m_deleteStartOfWordAction = registerAction(DELETE_START_OF_WORD,
|
m_deleteStartOfWordAction = registerAction(DELETE_START_OF_WORD,
|
||||||
[] (TextEditorWidget *w) { w->deleteStartOfWord(); }, true, tr("Delete Word up to Cursor"));
|
[] (TextEditorWidget *w) { w->deleteStartOfWord(); }, true, tr("Delete Word up to Cursor"));
|
||||||
m_deleteStartOfWordCamelCaseAction = registerAction(DELETE_START_OF_WORD_CAMEL_CASE,
|
m_deleteStartOfWordCamelCaseAction = registerAction(DELETE_START_OF_WORD_CAMEL_CASE,
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2016 Denis Mingulov, The Qt Company Ltd.
|
** Copyright (C) 2016 The Qt Company Ltd.
|
||||||
** Copyright (C) 2016 Denis Mingulov, The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of Qt Creator.
|
** This file is part of Qt Creator.
|
||||||
@@ -14,35 +13,13 @@
|
|||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
**
|
**
|
||||||
** BSD License Usage
|
** GNU General Public License Usage
|
||||||
** Alternatively, you may use this file under the terms of the BSD license
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
** as follows:
|
** General Public License version 3 as published by the Free Software
|
||||||
**
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
** "Redistribution and use in source and binary forms, with or without
|
** included in the packaging of this file. Please review the following
|
||||||
** modification, are permitted provided that the following conditions are
|
** information to ensure the GNU General Public License requirements will
|
||||||
** met:
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
** * Redistributions of source code must retain the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer.
|
|
||||||
** * Redistributions in binary form must reproduce the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer in
|
|
||||||
** the documentation and/or other materials provided with the
|
|
||||||
** distribution.
|
|
||||||
** * Neither the name of The Qt Company Ltd nor the names of its
|
|
||||||
** contributors may be used to endorse or promote products derived
|
|
||||||
** from this software without specific prior written permission.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user