Merge remote-tracking branch 'origin/4.14'

Change-Id: I9d1931b7862f4541ac7a064ff987128afd835cbe
This commit is contained in:
Eike Ziller
2020-12-07 12:29:44 +01:00
34 changed files with 499 additions and 265 deletions

View File

@@ -1,6 +1,6 @@
set(IDE_VERSION "4.13.84") # The IDE version.
set(IDE_VERSION_COMPAT "4.13.84") # The IDE Compatibility version.
set(IDE_VERSION_DISPLAY "4.14.0-rc1") # The IDE display version.
set(IDE_VERSION "4.14.0") # The IDE version.
set(IDE_VERSION_COMPAT "4.14.0") # The IDE Compatibility version.
set(IDE_VERSION_DISPLAY "4.14.0") # The IDE display version.
set(IDE_COPYRIGHT_YEAR "2020") # The IDE current copyright year.
set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation.

View File

@@ -33,7 +33,7 @@
\page creator-editor-external.html
\if defined(qtdesignstudio)
\previouspage creator-qml-performance-monitor.html
\nextpage studio-help.html
\nextpage creator-telemetry.html
\else
\previouspage creator-keyboard-shortcuts.html
\nextpage creator-task-lists.html

View File

@@ -24,9 +24,14 @@
****************************************************************************/
/*!
\previouspage creator-task-lists.html
\page creator-telemetry.html
\if defined(qtdesignstudio)
\previouspage creator-editor-external.html
\nextpage studio-help.html
\else
\previouspage creator-task-lists.html
\nextpage creator-help-overview.html
\endif
\title Managing Data Collection Settings
@@ -42,22 +47,28 @@
\section1 Principles of Data Collection
No personal data, such as names, IP addresses, MAC addresses, or project
and path names are collected. However, QUuid objects are used to identify
data records that belong to one user. The objects cannot be converted
back to the actual values from which they were generated.
For more information about Qt privacy policy, select
\l{https://www.qt.io/terms-conditions/#privacy}
{Legal Notice and Privacy Policy}.
\section1 Collecting Usage Statistics
The Telemetry plugin uses the
\l{https://api.kde.org/frameworks/kuserfeedback/html/index.html}
{KUserFeedback} framework to collect the usage data. The library
has been designed from the user data privacy point of view and
\QC respects the same privacy rules.
No personal data, such as names, IP addresses, MAC addresses, or project
and path names are collected. However, QUuid objects are used to identify
data records that belong to one user. The objects cannot be converted
back to the actual values from which they were generated.
The data is transmitted to the backend storage using an encrypted
connection. The storage is located in the same Heroku backend as the
Qt installer backend. Physically, data is stored in the Amazon cloud.
\section1 Specifying Telemetry Settings
\section2 Specifying Telemetry Settings
To determine what data is transmitted to the backend storage:
@@ -67,12 +78,31 @@
\image qtcreator-telemetry-settings.png
\li In the \uicontrol {Telemetry mode} list, select the mode that
determines what kind of data is collected.
\li In the \uicontrol {Data sources} list, select entries to view
\li In the \uicontrol {Data} list, select entries to view
exactly what data is collected. Deselect check boxes for data
that you do not want to transmit to the backend storage.
\endlist
For more information about Qt privacy policy, select
\l{https://www.qt.io/terms-conditions/#privacy}
{Legal Notice and Privacy Policy}.
\if defined(qtdesignstudio)
\section1 Reporting Crashes
You can enable \QDS to report crashes automatically. \QDS uses Google
Crashpad to collect crashes and report them to the Sentry backend storage
for processing. The purpose of Crashpad is to capture application state in
sufficient detail to allow developers to diagnose and, where possible, fix
the issue causing the crash. Crashpad may capture arbitrary contents from
the memory of a crashed process, including user sensitive information, URLs,
and other content provided by the users. The collected reports are used for
the sole purpose of fixing bugs. For more information on Crashpad, see the
\l {https://chromium.googlesource.com/crashpad/crashpad/+/master/doc/overview_design.md}
{documentation} by Google. For more information on processing and storing
of the collected data, see \l {https://sentry.io/security/}
{Security & Compliance} by Sentry.
To enable sending crash reports, select \uicontrol Tools > \uicontrol
Options > \uicontrol Environment > \uicontrol System
(\uicontrol {Qt Design Studio} > \uicontrol Preferences > \uicontrol
Environment > \uicontrol System on \macos), and then select
\uicontrol {Enable crash reporting}.
\endif
*/

View File

@@ -44,9 +44,11 @@
\row
\li Anchors
\li \l{Setting Anchors and Margins}
\if defined(qtdesignstudio)
\row
\li Group
\li \l Group
\endif
\row
\li Position
\li \l{Using Positioners}
@@ -59,9 +61,11 @@
\row
\li Timeline
\li \l{Creating Timelines}
\if defined(qtdesignstudio)
\row
\li Event List
\li \l{Simulating Events}
\endif
\row
\li Edit Color
\li \l{Editing Properties Inline}

View File

@@ -202,35 +202,6 @@
}
\endcode
\li You can use the Qt \c foreach loop in non-time-critical code with a Qt
container. It is a nice way to keep line noise down and to give the
loop variable a proper name:
\code
foreach (QWidget *widget, container)
doSomething(widget);
-NOT-
Container::iterator end = container.end();
for (Container::iterator it = container.begin(); it != end; ++it)
doSomething(*it);
\endcode
Make the loop variable const, if possible. This might prevent
unnecessary detaching of shared data:
\code
foreach (const QString &name, someListOfNames)
doSomething(name);
- NOT -
foreach (QString name, someListOfNames)
doSomething(name);
\endcode
\endlist
\section1 Formatting

View File

@@ -473,7 +473,7 @@
\section2 Setting Up Documentation Builds
You can run \c qmake from an installed Qt to build documentation.
You can configure documentation builds using CMake or qmake.
\note Since \QC version 4.12, only Qt 5.14.0 or later is supported
for building documentation.
@@ -500,67 +500,145 @@
for publishing on the web
\endlist
\note To have the correct fonts loaded for the online version, you must be
running it on a web server.
\note If the styles look wrong to you when reading help files in \QC or \QA,
you might be looking at them in the QTextBrowser instead of the Qt WebEngine
browser. This happens if you do not have Qt WebEngine installed.
you might be using the QTextBrowser as the help engine backend instead of
litehtml. For more information, see
\l {https://doc.qt.io/qtcreator/creator-help.html#selecting-the-help-viewer-backend}
{Selecting the Help Viewer Backend}.
\section2 Documentation Build Commands
To build documentation for the sources from the \c qtcreator master branch,
use build scripts defined in the doc.pri file. You can build the docs
using either the offline or online style. The offline style is used for
generating HTML files included in help files (.qch), whereas the online
style is used at \l{https://doc.qt.io/qtcreator/index.html}{doc.qt.io}.
To build documentation for the sources from the qtcreator master branch, use
build scripts defined in the doc.pri file. To build the docs in the
HTML format and to create help files (.qch), enter the following build
commands from the project folder (after running qmake):
\section3 Using CMake
\list
\li \c {nmake docs} (on Windows)
When using CMake, the docs are built in the \QC \e {build folder} or a
separate doc build folder, not in the project folder.
\li \c {make docs} (on Linux and \macos)
To get the correct product name and version when building \QDS Manual, you
must run CMake with the branding option. The branding data is located in
the \QDS (private) repository, \c tqtc-plugin-qtquickdesigner.
To build docs with CMake in a separate doc build folder:
\list 1
\li Create a folder for the built docs and switch to it. For example,
\c {C:\dev\qtc-doc-build}.
\li In the doc build folder, enter the following command:
\badcode
cmake -DWITH_DOCS=ON "-DCMAKE_PREFIX_PATH=<path_to_qt>" <path_to_qtcreator_src>
\endcode
For example (all on one line):
\badcode
C:\dev\qtc-doc-build>cmake -DWITH_DOCS=ON
"-DCMAKE_PREFIX_PATH=C:\Qt\5.15.1\msvc2019_64"
C:\dev\qtc-super\qtcreator
\endcode
\li To also build Extending \QC Manual, add the following option:
\c {-DBUILD_DEVELOPER_DOCS=ON}
\li To also build the \QDS Manual, add the following option:
\c {"-DCMAKE_MODULE_PATH=<absolute_path_to_qtquickdesignerrepo>/studiodata/branding/"}
For example:
\badcode
C:\dev\qtc-doc-build>cmake -DWITH_DOCS=ON -DBUILD_DEVELOPER_DOCS=ON
"-DCMAKE_MODULE_PATH=C:\dev\tqtc-plugin-qtquickdesigner\studiodata\branding"
"-DCMAKE_PREFIX_PATH=C:\Qt\5.15.1\msvc2019_64"
C:\dev\qtc-super\qtcreator
\endcode
\li To build the docs using the online style, use the following option
instead of \c {-DWITH_DOCS=ON}:
\c {-DWITH_ONLINE_DOCS=ON}
For example:
\badcode
C:\dev\qtc-doc-build>cmake -DWITH_ONLINE_DOCS=ON
-DBUILD_DEVELOPER_DOCS=ON
"-DCMAKE_MODULE_PATH=C:\dev\tqtc-plugin-qtquickdesigner\studiodata\branding"
"-DCMAKE_PREFIX_PATH=C:\Qt\5.15.1\msvc2019_64"
C:\dev\qtc-super\qtcreator
\endcode
\note If you already ran CMake \c {-DWITH_DOCS=ON} in a folder and
want to switch to only online docs in that folder, you need to turn
the offline docs off again:
\badcode
cmake -DWITH_DOCS=OFF -DWITH_ONLINE_DOCS=ON
\endcode
\li Enter the following doc build command to build both HTML docs and
the help files (.qch):
\badcode
cmake --build . --target docs
\endcode
\li Alternatively, to build only the HTML docs, enter:
\badcode
cmake --build . --target html_docs
\endcode
\endlist
The HTML documentation is generated in the following folders:
\note You can enter \c cmake-gui to open the graphical CMake configuration
tool, where you can select build options.
The HTML files for the documentation are generated in the following
folders:
\list
\li \c doc/html/qtcreator
\li \c doc/html/qtcreatordev
\li \c doc/html/qtcreator-dev
\li \c doc/html/qtdesignstudio
\li \c doc/html/qtcreator-online
\li \c doc/html/qtcreator-dev-online
\li \c doc/html/qtdesignstudio-online
\endlist
The help files (\c {.qch}) are generated in the
\c {share/doc/qtcreator} directory in the \QC build directory on Windows and
Linux, and in the \c {bin/Qt Creator.app/Contents/Resources/app} directory
The help files (\c {.qch}) are generated in the \c {share/doc/qtcreator}
folder or in the \c {<application_name>.app/Contents/Resources/doc\} folder
on \macos.
You can view the HTML files in a browser and the help files in
the \QC \uicontrol Help mode. For more information about adding the help
files to \QC, see
the \QC \uicontrol Help mode. For more information about adding
the help files to \QC, see
\l{http://doc.qt.io/qtcreator/creator-help.html#adding-external-documentation}
{Adding External Documentation}.
Besides \c docs, you have the following options for building a particular
document in a particular format:
\section3 Using qmake
\list
\li \c html_docs_qtcreator - build \QC Manual in help format, but do not
generate a help file
To build offline documentation using qmake:
\li \c html_docs_qtcreator-dev - build Extending \QC Manual in help
format, but do not generate a help file
\li \c qch_docs_qtcreator - build \QC Manual in help format and generate
a help file (.qch)
\li \c qch_docs_qtcreator-dev - build Extending \QC Manual in help format
and generate a help file (.qch)
\list 1
\li In the project folder, run \c qmake from an installed Qt.
For example:
\badcode
C:\dev\qtc-super\qtcreator>..\..\..\Qt\5.15.1\msvc2019_64\bin\qmake.exe
\endcode
\li Enter the following doc build command:
\list
\li On Windows: \c {nmake docs}
\li On Linux and \macos: \c {make docs}
\endlist
\endlist
\section3 Building the \QDS Manual
To build online documentation using qmake:
To get the correct product name and version, you must run \c {qmake -r} on
\c {qtcreator.pro} with the \c IDE_BRANDING_PRI option set to the absolute
path of \c {ide_branding.pri} in the \QDS (private) repository.
\list 1
\li In the project folder, run \c qmake from an installed Qt with the
online configuration option. For example:
\badcode
C:\dev\qtc-super\qtcreator>..\..\..\Qt\5.15.1\msvc2019_64\bin\qmake.exe
"CONFIG+=build_online_docs"
\endcode
\li Enter the following doc build command:
\list
\li On Windows: \c {nmake html_docs}
\li On Linux and \macos: \c {make html_docs}
\endlist
\endlist
To get the correct product name and version when building the \QDS
Manual, you must run \c {qmake -r} on \c {qtcreator.pro} with the
\c IDE_BRANDING_PRI option set to the absolute path of
\c {ide_branding.pri} in the \QDS (private) repository.
For example, on Windows enter (all on one line):
@@ -570,16 +648,71 @@
IDE_BRANDING_PRI=C:\dev\tqtc-plugin-qtquickdesigner\studiodata\branding\ide_branding.pri
\endcode
To build the \QDS Manual:
To use the offline style to build the \QDS help with qmake:
\list 1
\li Run \c qmake from Qt 5.14.0, or later with the path to the branding
information as an option (all on one line):
\c {<relative_path_to>/qmake.exe
qtcreator.pro -r
IDE_BRANDING_PRI=<absolute_path_to>ide_branding.pri}
\li In the \c {doc/qtdesignstudio} folder, run \c qmake from Qt 5.14.0,
or later with the path to the branding information as an option
(all on one line):
\badcode
<relative_path_to>/qmake.exe qtcreator.pro -r
IDE_BRANDING_PRI=<absolute_path_to>/ide_branding.pri
\endcode
\li Run \c {make docs} on Linux and macOS or \c {nmake docs}
on Windows.
\endlist
To use the online style to build the \QDS Manual with qmake:
\list 1
\li In the \c {doc/qtdesignstudio} folder, run \c qmake from Qt 5.14.0,
or later with the path to the branding information as an option
(all on one line):
\badcode
<relative_path_to>/qmake.exe qtcreator.pro -r
IDE_BRANDING_PRI=<absolute_path_to>/ide_branding.pri
\endcode
\li Run \c {make html_docs} on Linux and macOS or \c {nmake html_docs}
on Windows.
\endlist
The HTML files for the offline documentation are generated in the following
folders:
\list
\li \c doc/html/qtcreator
\li \c doc/html/qtcreator-dev
\li \c doc/qtdesignstudio/doc/html/qtdesignstudio
\endlist
The help files (\c {.qch}) are generated in the
\c {share/doc/qtcreator} directory in the \QC build directory on Windows and
Linux, and in the \c {bin/Qt Creator.app/Contents/Resources/app} directory
on \macos.
The HTML files for the online documentation are generated in the following
folders:
\list
\li \c doc/html/qtcreator-online
\li \c doc/html/qtcreator-dev-online
\li \c doc/qtdesignstudio/doc/html/qtdesignstudio-online
\endlist
\section2 Additional Build Commands
Besides \c docs and \c html_docs, you can use the following build targets:
\list
\li \c html_docs_<doc_config_file_name> - build the document (qtcreator/
qtcreator-dev/qtdesignstudio) in help format, but do not generate a
help file (.qch)
\li \c html_docs_<doc_config_file_name>-online - build the document
(qtcreator/qtcreator-dev/qtdesignstudio) in online format
\li \c qch_docs_<doc_config_file_name> - build the document (qtcreator/
qtcreator-dev/qtdesignstudio) in help format and generate a
help file
\endlist
*/

View File

@@ -87,5 +87,11 @@
editor for your system, and the \c sort tool are preconfigured for
use. You can change their default configurations and configure new
tools.
\li \l{Managing Data Collection Settings}
You can enable \QC to report crashes automatically. If you agreed to
pseudonymous user statistics collection during the \QC installation,
you can turn it on and determine what type of data is collected and
transmitted to the backend storage.
\endlist
*/

View File

@@ -25,7 +25,7 @@
/*!
\page studio-help.html
\previouspage creator-editor-external.html
\previouspage creator-telemetry.html
\nextpage {Examples and Tutorials}
\title Help

View File

@@ -38,9 +38,15 @@
\QDS is available in binary packages for the following operating systems:
\list
\li \macOS 10.13 and 10.14.x
\li Ubuntu Linux 18.04
\li Windows 10
\li \macOS 10.15
\li Linux:
\list
\li CentOS 8.1
\li openSUSE Leap 15.1
\li SUSE Linux Enterprise Server 15 (SLES 15)
\li Ubuntu 20.04
\endlist
\li Windows 10, version 2004
\endlist
\note For a good user experience on Windows 10, we recommend the following

View File

@@ -180,6 +180,7 @@
\li \l{Profiling QML Applications}
\endlist
\li \l{Using External Tools}
\li \l{Managing Data Collection Settings}
\endlist
\li \l{Help}
\list

View File

@@ -4,16 +4,16 @@ import qbs.FileInfo
import "qtc.js" as HelperFunctions
Module {
property string qtcreator_display_version: '4.14.0-rc1'
property string qtcreator_display_version: '4.14.0'
property string ide_version_major: '4'
property string ide_version_minor: '13'
property string ide_version_release: '84'
property string ide_version_minor: '14'
property string ide_version_release: '0'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
+ ide_version_release
property string ide_compat_version_major: '4'
property string ide_compat_version_minor: '13'
property string ide_compat_version_release: '84'
property string ide_compat_version_minor: '14'
property string ide_compat_version_release: '0'
property string qtcreator_compat_version: ide_compat_version_major + '.'
+ ide_compat_version_minor + '.' + ide_compat_version_release

View File

@@ -1,6 +1,6 @@
QTCREATOR_VERSION = 4.13.84
QTCREATOR_COMPAT_VERSION = 4.13.84
QTCREATOR_DISPLAY_VERSION = 4.14.0-rc1
QTCREATOR_VERSION = 4.14.0
QTCREATOR_COMPAT_VERSION = 4.14.0
QTCREATOR_DISPLAY_VERSION = 4.14.0
QTCREATOR_COPYRIGHT_YEAR = 2020
IDE_DISPLAY_NAME = Qt Creator

View File

@@ -259,12 +259,12 @@ class Dumper(DumperBase):
def qtCoreModuleName(self):
modules = cdbext.listOfModules()
# first check for an exact module name match
for coreName in ['Qt5Cored', 'Qt5Core', 'QtCored4', 'QtCore4']:
for coreName in ['Qt6Core', 'Qt6Cored', 'Qt5Cored', 'Qt5Core', 'QtCored4', 'QtCore4']:
if coreName in modules:
self.qtCoreModuleName = lambda: coreName
return coreName
# maybe we have a libinfix build.
for pattern in ['Qt5Core.*', 'QtCore.*']:
for pattern in ['Qt6Core.*', 'Qt5Core.*', 'QtCore.*']:
matches = [module for module in modules if re.match(pattern, module)]
if matches:
coreName = matches[0]
@@ -274,11 +274,11 @@ class Dumper(DumperBase):
def qtDeclarativeModuleName(self):
modules = cdbext.listOfModules()
for declarativeModuleName in ['Qt5Qmld', 'Qt5Qml']:
for declarativeModuleName in ['Qt6Qmld', 'Qt6Qml', 'Qt5Qmld', 'Qt5Qml']:
if declarativeModuleName in modules:
self.qtDeclarativeModuleName = lambda: declarativeModuleName
return declarativeModuleName
matches = [module for module in modules if re.match('Qt5Qml.*', module)]
matches = [module for module in modules if re.match('Qt[56]Qml.*', module)]
if matches:
declarativeModuleName = matches[0]
self.qtDeclarativeModuleName = lambda: declarativeModuleName

View File

@@ -1068,7 +1068,7 @@ class DumperBase():
if isinstance(typish, ReportItem):
self.currentType.value = typish.value
elif isinstance(typish, str):
self.currentType.value = typish
self.currentType.value = typish.replace('@', self.qtNamespace())
else:
self.currentType.value = typish.name
self.currentType.priority += 1
@@ -3852,6 +3852,7 @@ class DumperBase():
tdata = self.TypeData(self)
tdata.name = typish
tdata.typeId = typish
tdata.templateArguments = self.listTemplateParameters(typish)
if size is not None:
tdata.lbitsize = 8 * size

View File

@@ -1284,7 +1284,7 @@ def qdumpHelper_Qt6_QMap(d, value, keyType, valueType):
return
m = value['d']['d']['m']
d.putItem(m)
d.putBetterType('QMap<%s, %s>' % (keyType.name, valueType.name))
d.putBetterType('@QMap<%s, %s>' % (keyType.name, valueType.name))
def qform__QMap():
@@ -1315,7 +1315,7 @@ def qdumpHelper_Qt6_QMultiMap(d, value, keyType, valueType):
return
m = value['d']['d']['m']
d.putItem(m)
d.putBetterType('QMultiMap<%s, %s>' % (keyType.name, valueType.name))
d.putBetterType('@QMultiMap<%s, %s>' % (keyType.name, valueType.name))
def qdump__QMultiMap(d, value):
if d.qtVersion() >= 0x60000:
@@ -1330,6 +1330,7 @@ def qform__QVariantMap():
def qdump__QVariantMap(d, value):
qdumpHelper_QMap(d, value, d.createType('@QString'), d.createType('@QVariant'))
d.putBetterType('@QVariantMap')
def qdump__QMetaMethod(d, value):
@@ -1494,12 +1495,47 @@ def qdump__QScopedPointer(d, value):
d.putValue(d.currentValue.value, d.currentValue.encoding)
typeName = value.type.name
if value.type[1].name == d.qtNamespace() + 'QScopedPointerDeleter<%s>' % value.type[0].name:
typeName = d.qtNamespace() + 'QScopedPointer<%s>' % value.type[0].name
typeName = '@QScopedPointer<%s>' % value.type[0].name
d.putBetterType(typeName)
def qdump__QSet(d, value):
if d.qtVersion() >= 0x060000:
qdumpHelper_QSet6(d, value)
else:
qdumpHelper_QSet45(d, value)
def qdumpHelper_QSet6(d, value):
dptr = d.extractPointer(value)
if dptr == 0:
d.putItemCount(0)
return
ref, _, size, buckets, seed, spans = d.split('i@qqqp', dptr)
d.check(0 <= size and size <= 100 * 1000 * 1000)
d.check(-1 <= ref and ref < 100000)
d.putItemCount(size)
if d.isExpanded():
value_type = value.type[0]
value_size = value_type.size()
with Children(d, size):
span_size = 128 + 2 * d.ptrSize() # Including tail padding.
nspans = int((buckets + 127) / 128)
count = 0
for b in range(nspans):
span = spans + b * span_size
offsets, entries, allocated, next_free = d.split('128spbb', span)
for i in range(128):
offset = offsets[i]
if offset != 255: # Entry is used
entry = entries + offset * value_size
d.putSubItem(count, d.createValue(entry, value_type))
count += 1
def qdumpHelper_QSet45(d, value):
def hashDataFirstNode():
b = buckets
n = numBuckets
@@ -1827,43 +1863,43 @@ def qdump__QUuid(d, value):
def qdumpHelper_QVariant_0(d, value):
# QVariant::Invalid
d.putBetterType('%sQVariant (invalid)' % d.qtNamespace())
d.putBetterType('@QVariant (invalid)')
d.putValue('(invalid)')
def qdumpHelper_QVariant_1(d, value):
# QVariant::Bool
d.putBetterType('%sQVariant (bool)' % d.qtNamespace())
d.putBetterType('@QVariant (bool)')
d.putValue('true' if value.to('b') else 'false')
def qdumpHelper_QVariant_2(d, value):
# QVariant::Int
d.putBetterType('%sQVariant (int)' % d.qtNamespace())
d.putBetterType('@QVariant (int)')
d.putValue(value.to('i'))
def qdumpHelper_QVariant_3(d, value):
# uint
d.putBetterType('%sQVariant (uint)' % d.qtNamespace())
d.putBetterType('@QVariant (uint)')
d.putValue(value.to('I'))
def qdumpHelper_QVariant_4(d, value):
# qlonglong
d.putBetterType('%sQVariant (qlonglong)' % d.qtNamespace())
d.putBetterType('@QVariant (qlonglong)')
d.putValue(value.to('q'))
def qdumpHelper_QVariant_5(d, value):
# qulonglong
d.putBetterType('%sQVariant (qulonglong)' % d.qtNamespace())
d.putBetterType('@QVariant (qulonglong)')
d.putValue(value.to('Q'))
def qdumpHelper_QVariant_6(d, value):
# QVariant::Double
d.putBetterType('%sQVariant (double)' % d.qtNamespace())
d.putBetterType('@QVariant (double)')
d.putValue(value.to('d'))
@@ -1906,13 +1942,13 @@ qdumpHelper_QVariants_B = [
def qdumpHelper_QVariant_31(d, value):
# QVariant::VoidStar
d.putBetterType('%sQVariant (void *)' % d.qtNamespace())
d.putBetterType('@QVariant (void *)')
d.putValue('0x%x' % d.extractPointer(value))
def qdumpHelper_QVariant_32(d, value):
# QVariant::Long
d.putBetterType('%sQVariant (long)' % d.qtNamespace())
d.putBetterType('@QVariant (long)')
if d.ptrSize() == 4:
d.putValue('%s' % d.extractInt(value))
else:
@@ -1921,19 +1957,19 @@ def qdumpHelper_QVariant_32(d, value):
def qdumpHelper_QVariant_33(d, value):
# QVariant::Short
d.putBetterType('%sQVariant (short)' % d.qtNamespace())
d.putBetterType('@QVariant (short)')
d.putValue('%s' % d.extractShort(value))
def qdumpHelper_QVariant_34(d, value):
# QVariant::Char
d.putBetterType('%sQVariant (char)' % d.qtNamespace())
d.putBetterType('@QVariant (char)')
d.putValue('%s' % d.extractByte(value))
def qdumpHelper_QVariant_35(d, value):
# QVariant::ULong
d.putBetterType('%sQVariant (unsigned long)' % d.qtNamespace())
d.putBetterType('@QVariant (unsigned long)')
if d.ptrSize() == 4:
d.putValue('%s' % d.extractUInt(value))
else:
@@ -1942,19 +1978,19 @@ def qdumpHelper_QVariant_35(d, value):
def qdumpHelper_QVariant_36(d, value):
# QVariant::UShort
d.putBetterType('%sQVariant (unsigned short)' % d.qtNamespace())
d.putBetterType('@QVariant (unsigned short)')
d.putValue('%s' % d.extractUShort(value))
def qdumpHelper_QVariant_37(d, value):
# QVariant::UChar
d.putBetterType('%sQVariant (unsigned char)' % d.qtNamespace())
d.putBetterType('@QVariant (unsigned char)')
d.putValue('%s' % d.extractByte(value))
def qdumpHelper_QVariant_38(d, value):
# QVariant::Float
d.putBetterType('%sQVariant (float)' % d.qtNamespace())
d.putBetterType('@QVariant (float)')
d.putValue(value.to('f'))
@@ -2039,7 +2075,7 @@ def qdumpHelper__QVariant6(d, value):
else:
d.putItem(d.createValue(data, typeName))
d.putBetterType('%sQVariant (%s)' % (d.qtNamespace(), typeName))
d.putBetterType('@QVariant (%s)' % typeName)
def qdumpHelper__QVariant45(d, value):
@@ -2060,7 +2096,7 @@ def qdumpHelper__QVariant45(d, value):
# Extended Core type (Qt 4)
if variantType >= 128 and variantType <= 135 and d.qtVersion() < 0x050000:
if variantType == 128:
d.putBetterType('%sQVariant (void *)' % d.qtNamespace())
d.putBetterType('@QVariant (void *)')
d.putValue('0x%x' % value.extractPointer())
else:
if variantType == 135: # Float
@@ -2101,7 +2137,7 @@ def qdumpHelper__QVariant45(d, value):
d.putEmptyValue(-99)
d.putItem(val)
d.putBetterType('%sQVariant (%s)' % (d.qtNamespace(), innert))
d.putBetterType('@QVariant (%s)' % innert)
return innert
@@ -2245,8 +2281,7 @@ def qdump__QXmlAttributes__Attribute(d, value):
def qdump__QXmlAttributes(d, value):
vptr, atts = value.split('p{@QList<@QXmlAttributes::Attribute>}')
_, att_size, _ = d.describeStruct('{@QString}' * 4)
innerType = d.createType(d.qtNamespace() + 'QXmlAttributes::Attribute',
att_size)
innerType = d.createType('@QXmlAttributes::Attribute', att_size)
qdumpHelper_QList(d, atts, innerType)
@@ -2385,21 +2420,20 @@ def qdump__QV4__PropertyHash(d, value):
data = value.extractPointer()
(ref, alloc, size, numBits, entries) = d.split('iiiip', data)
n = 0
innerType = d.qtNamespace() + 'QV4::Identifier'
with Children(d):
for i in range(alloc):
(identifier, index) = d.split('pI', entries + i * 2 * d.ptrSize())
if identifier != 0:
n += 1
with SubItem(d):
d.putItem(d, d.createValue(identifier, innerType))
d.putItem(d, d.createValue(identifier, '@QV4::Identifier'))
d.put('keysuffix', ' %d' % index)
d.putItemCount(n)
d.putPlainChildren(value)
def qdump__QV4__InternalClass__Transition(d, value):
identifier = d.createValue(value.extractPointer(), d.qtNamespace() + 'QV4::Identifier')
identifier = d.createValue(value.extractPointer(), '@QV4::Identifier')
d.putStringValue(identifier)
d.putPlainChildren(value)
@@ -2424,14 +2458,13 @@ def qdump__QV4__SharedInternalClassData(d, value):
def qdump__QV4__IdentifierTable(d, value):
(engine, alloc, size, numBits, pad, entries) = value.split('piiiip')
n = 0
innerType = d.qtNamespace() + 'QV4::Heap::String'
with Children(d):
for i in range(alloc):
identifierPtr = d.extractPointer(entries + i * d.ptrSize())
if identifierPtr != 0:
n += 1
with SubItem(d, None):
d.putItem(d.createValue(identifierPtr, innerType))
d.putItem(d.createValue(identifierPtr, '@QV4::Heap::String'))
d.putItemCount(n)
d.putPlainChildren(value)
@@ -2533,20 +2566,20 @@ def qdump_32__QV4__Value(d, value):
val = v & 0xffffffff
if (tag & 0x7fff2000) == 0x7fff2000: # Int
d.putValue(val)
d.putBetterType('%sQV4::Value (int32)' % ns)
d.putBetterType('@QV4::Value (int32)')
elif (tag & 0x7fff4000) == 0x7fff4000: # Bool
d.putValue(val)
d.putBetterType('%sQV4::Value (bool)' % ns)
d.putBetterType('@QV4::Value (bool)')
elif (tag & 0x7fff0000) == 0x7fff0000: # Null
d.putValue(val)
d.putBetterType('%sQV4::Value (null)' % ns)
d.putBetterType('@QV4::Value (null)')
elif (tag & 0x7ffa0000) != 0x7ffa0000: # Double
d.putValue(value.split('d')[0])
d.putBetterType('%sQV4::Value (double)' % ns)
d.putBetterType('@QV4::Value (double)')
elif tag == 0x7ffa0000:
if val == 0:
d.putValue('(undefined)')
d.putBetterType('%sQV4::Value (undefined)' % ns)
d.putBetterType('@QV4::Value (undefined)')
else:
managed = d.createValue(val, ns + 'QV4::Heap::Base')
qdump__QV4__Heap__Base(d, managed)
@@ -2625,45 +2658,45 @@ def qdump_64__QV4__Value(d, value):
vtable = v & QV4_PointerMask
ns = d.qtNamespace()
if (v >> QV4_IsNumber_Shift) == 1:
d.putBetterType('%sQV4::Value (int32)' % ns)
d.putBetterType('@QV4::Value (int32)')
vv = v & 0xffffffff
vv = vv if vv < 0x80000000 else -(0x100000000 - vv)
d.putBetterType('%sQV4::Value (int32)' % ns)
d.putBetterType('@QV4::Value (int32)')
d.putValue('%d' % vv)
elif (v >> QV4_IsDouble_Shift):
d.putBetterType('%sQV4::Value (double)' % ns)
d.putBetterType('@QV4::Value (double)')
d.putValue('%0.16x' % (v ^ QV4_NaNEncodeMask), 'float:8')
elif tag == QV4_ValueType_Undefined_Type and not new:
d.putBetterType('%sQV4::Value (undefined)' % ns)
d.putBetterType('@QV4::Value (undefined)')
d.putValue('(undefined)')
elif tag == QV4_ValueTypeInternal_Null_Type_Internal:
d.putBetterType('%sQV4::Value (null?)' % ns)
d.putBetterType('@QV4::Value (null?)')
d.putValue('(null?)')
elif v == 0:
if new:
d.putBetterType('%sQV4::Value (undefined)' % ns)
d.putBetterType('@QV4::Value (undefined)')
d.putValue('(undefined)')
else:
d.putBetterType('%sQV4::Value (null)' % ns)
d.putBetterType('@QV4::Value (null)')
d.putValue('(null)')
#elif ((v >> QV4_IsManaged_Shift) & ~1) == 1:
# d.putBetterType('%sQV4::Value (null/undef)' % ns)
# d.putBetterType('@QV4::Value (null/undef)')
# d.putValue('(null/undef)')
#elif v & QV4_IsNullOrBooleanMask:
# d.putBetterType('%sQV4::Value (null/bool)' % ns)
# d.putBetterType('@QV4::Value (null/bool)')
# d.putValue('(null/bool)')
# d.putValue(v & 1)
else:
(parentv, flags, pad, className) = d.split('pIIp', vtable)
#vtable = value['m']['vtable']
if flags & 2: # isString'
d.putBetterType('%sQV4::Value (string)' % ns)
d.putBetterType('@QV4::Value (string)')
qdump__QV4__Heap__String(d, d.createValue(v, ns + 'QV4::Heap::String'))
#d.putStringValue(d.extractPointer(value) + 2 * d.ptrSize())
#d.putValue('ptr: 0x%x' % d.extractPointer(value))
return
elif flags & 4: # isObject
d.putBetterType('%sQV4::Value (object)' % ns)
d.putBetterType('@QV4::Value (object)')
#QV4_putObjectValue(d, d.extractPointer(value) + 2 * d.ptrSize())
arrayVTable = d.symbolAddress(ns + 'QV4::ArrayObject::static_vtbl')
#DumperBase.warn('ARRAY VTABLE: 0x%x' % arrayVTable)
@@ -2671,10 +2704,10 @@ def qdump_64__QV4__Value(d, value):
d.putItem(d.createValue(d.extractPointer(value) + 2 * d.ptrSize(), ns + 'QV4::Object'))
return
elif flags & 8: # isFunction
d.putBetterType('%sQV4::Value (function)' % ns)
d.putBetterType('@QV4::Value (function)')
d.putEmptyValue()
else:
d.putBetterType('%sQV4::Value (unknown)' % ns)
d.putBetterType('@QV4::Value (unknown)')
#d.putValue('[0x%x]' % v)
d.putValue('[0x%x : flag 0x%x : tag 0x%x]' % (v, flags, tag))
if d.isExpanded():
@@ -2911,7 +2944,7 @@ def qdump__QScriptValue(d, value):
#d.putSubItem('variant', variant)
t = qdump__QVariant(d, variant)
# Override the 'QVariant (foo)' output
d.putBetterType('%sQScriptValue (%s)' % (ns, t))
d.putBetterType('@QScriptValue (%s)' % t)
if t != 'JSCoreValue':
return
except:

View File

@@ -220,7 +220,7 @@ RowLayout {
iconColor: urlChooser.textColor
onClicked: {
fileModel.openFileDialog()
if (fileModel.path !== "")
if (fileModel.fileName !== "")
urlChooser.backendValue.value = fileModel.fileName
}
}

View File

@@ -115,8 +115,9 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
++row;
auto qmlDebugAspect = bc->aspect<QtSupport::QmlDebuggingAspect>();
connect(qmlDebugAspect, &QtSupport::QmlDebuggingAspect::changed,
this, [this]() { handleQmlDebugCxxFlags(); });
connect(qmlDebugAspect, &QtSupport::QmlDebuggingAspect::changed, this, [this]() {
updateButtonState();
});
auto widget = new QWidget;
LayoutBuilder builder(widget);
qmlDebugAspect->addToLayout(builder);
@@ -259,7 +260,6 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
m_configView->setEnabled(true);
stretcher->stretch();
updateButtonState();
handleQmlDebugCxxFlags();
m_showProgressTimer.stop();
m_progressIndicator->hide();
});
@@ -360,43 +360,44 @@ void CMakeBuildSettingsWidget::setWarning(const QString &message)
void CMakeBuildSettingsWidget::updateButtonState()
{
const bool isParsing = m_buildConfiguration->buildSystem()->isParsing();
const bool hasChanges = m_configModel->hasChanges();
m_resetButton->setEnabled(hasChanges && !isParsing);
m_reconfigureButton->setEnabled((hasChanges || m_configModel->hasCMakeChanges()) && !isParsing);
// Update extra data in buildconfiguration
const QList<ConfigModel::DataItem> changes = m_configModel->configurationForCMake();
const CMakeConfig configChanges = Utils::transform(changes, [](const ConfigModel::DataItem &i) {
CMakeConfigItem ni;
ni.key = i.key.toUtf8();
ni.value = i.value.toUtf8();
ni.documentation = i.description.toUtf8();
ni.isAdvanced = i.isAdvanced;
ni.isUnset = i.isUnset;
ni.inCMakeCache = i.inCMakeCache;
ni.values = i.values;
switch (i.type) {
case CMakeProjectManager::ConfigModel::DataItem::BOOLEAN:
ni.type = CMakeConfigItem::BOOL;
break;
case CMakeProjectManager::ConfigModel::DataItem::FILE:
ni.type = CMakeConfigItem::FILEPATH;
break;
case CMakeProjectManager::ConfigModel::DataItem::DIRECTORY:
ni.type = CMakeConfigItem::PATH;
break;
case CMakeProjectManager::ConfigModel::DataItem::STRING:
ni.type = CMakeConfigItem::STRING;
break;
case CMakeProjectManager::ConfigModel::DataItem::UNKNOWN:
default:
ni.type = CMakeConfigItem::INTERNAL;
break;
}
return ni;
});
const CMakeConfig configChanges
= getQmlDebugCxxFlags() + Utils::transform(changes, [](const ConfigModel::DataItem &i) {
CMakeConfigItem ni;
ni.key = i.key.toUtf8();
ni.value = i.value.toUtf8();
ni.documentation = i.description.toUtf8();
ni.isAdvanced = i.isAdvanced;
ni.isUnset = i.isUnset;
ni.inCMakeCache = i.inCMakeCache;
ni.values = i.values;
switch (i.type) {
case CMakeProjectManager::ConfigModel::DataItem::BOOLEAN:
ni.type = CMakeConfigItem::BOOL;
break;
case CMakeProjectManager::ConfigModel::DataItem::FILE:
ni.type = CMakeConfigItem::FILEPATH;
break;
case CMakeProjectManager::ConfigModel::DataItem::DIRECTORY:
ni.type = CMakeConfigItem::PATH;
break;
case CMakeProjectManager::ConfigModel::DataItem::STRING:
ni.type = CMakeConfigItem::STRING;
break;
case CMakeProjectManager::ConfigModel::DataItem::UNKNOWN:
default:
ni.type = CMakeConfigItem::INTERNAL;
break;
}
return ni;
});
m_resetButton->setEnabled(m_configModel->hasChanges() && !isParsing);
m_reconfigureButton->setEnabled((!configChanges.isEmpty() || m_configModel->hasCMakeChanges())
&& !isParsing);
m_buildConfiguration->setExtraCMakeArguments(
Utils::transform(configChanges, [](const CMakeConfigItem &i) { return i.toArgument(); }));
}
@@ -426,10 +427,12 @@ void CMakeBuildSettingsWidget::updateFromKit()
m_configModel->setConfigurationFromKit(configHash);
}
void CMakeBuildSettingsWidget::handleQmlDebugCxxFlags()
CMakeConfig CMakeBuildSettingsWidget::getQmlDebugCxxFlags()
{
bool changed = false;
const auto aspect = m_buildConfiguration->aspect<QtSupport::QmlDebuggingAspect>();
const TriState qmlDebuggingState = aspect->setting();
if (qmlDebuggingState == TriState::Default) // don't touch anything
return {};
const bool enable = aspect->setting() == TriState::Enabled;
const CMakeConfig configList = m_buildConfiguration->configurationFromCMake();
@@ -446,25 +449,19 @@ void CMakeBuildSettingsWidget::handleQmlDebugCxxFlags()
CMakeConfigItem it(item);
if (enable) {
if (!it.value.contains(qmlDebug)) {
it.value = it.value.append(' ').append(qmlDebug);
changed = true;
it.value = it.value.append(' ').append(qmlDebug).trimmed();
changedConfig.append(it);
}
} else {
int index = it.value.indexOf(qmlDebug);
if (index != -1) {
it.value.remove(index, qmlDebug.length());
changed = true;
it.value = it.value.trimmed();
changedConfig.append(it);
}
}
it.value = it.value.trimmed();
changedConfig.append(it);
}
if (changed) {
m_buildConfiguration->setExtraCMakeArguments(
Utils::transform(changedConfig,
[](const CMakeConfigItem &i) { return i.toArgument(); }));
}
return changedConfig;
}
void CMakeBuildSettingsWidget::updateSelection()

View File

@@ -25,6 +25,8 @@
#pragma once
#include "cmakeconfigitem.h"
#include <projectexplorer/namedwidget.h>
#include <QTimer>
@@ -66,7 +68,7 @@ private:
void updateButtonState();
void updateAdvancedCheckBox();
void updateFromKit();
void handleQmlDebugCxxFlags();
CMakeProjectManager::CMakeConfig getQmlDebugCxxFlags();
void updateSelection();
void setVariableUnsetFlag(bool unsetFlag);

View File

@@ -287,10 +287,6 @@ void CMakeBuildSystem::triggerParsing()
reparseParameters |= REPARSE_FORCE_CMAKE_RUN | REPARSE_FORCE_EXTRA_CONFIGURATION;
}
// Do not add extra args when doing initial configuration
if (0 != (reparseParameters & REPARSE_FORCE_INITIAL_CONFIGURATION))
reparseParameters = reparseParameters ^ REPARSE_FORCE_EXTRA_CONFIGURATION;
qCDebug(cmakeBuildSystemLog) << "Asking reader to parse";
m_reader.parse(reparseParameters & REPARSE_FORCE_CMAKE_RUN,
reparseParameters & REPARSE_FORCE_INITIAL_CONFIGURATION,

View File

@@ -506,12 +506,11 @@ void McuSupportOptions::registerQchFiles()
if (docsDir.isEmpty())
return;
const QStringList qchFiles = {
docsDir + "/quickultralite.qch",
docsDir + "/quickultralitecmake.qch"
};
const QFileInfoList qchFiles = QDir(docsDir, "*.qch").entryInfoList();
Core::HelpManager::registerDocumentation(
Utils::filtered(qchFiles, [](const QString &f) { return QFileInfo::exists(f); } ));
Utils::transform<QStringList>(qchFiles, [](const QFileInfo &fi){
return fi.absoluteFilePath();
}));
}
void McuSupportOptions::registerExamples()

View File

@@ -159,6 +159,7 @@ const char BUILDSTEPS_DEPLOY[] = "ProjectExplorer.BuildSteps.Deploy";
const char C_LANGUAGE_ID[] = "C";
const char CXX_LANGUAGE_ID[] = "Cxx";
const char QMLJS_LANGUAGE_ID[] = "QMLJS";
const char PYTHON_LANGUAGE_ID[] = "Python";
// ToolChain TypeIds
const char CLANG_TOOLCHAIN_TYPEID[] = "ProjectExplorer.ToolChain.Clang";

View File

@@ -214,7 +214,7 @@ PythonProject::PythonProject(const FilePath &fileName)
: Project(Constants::C_PY_MIMETYPE, fileName)
{
setId(PythonProjectId);
setProjectLanguages(Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID));
setProjectLanguages(Context(ProjectExplorer::Constants::PYTHON_LANGUAGE_ID));
setDisplayName(fileName.toFileInfo().completeBaseName());
setNeedsBuildConfigurations(false);

View File

@@ -656,8 +656,23 @@ void FormEditorFlowActionItem::setDataModelPositionInBaseState(const QPointF &po
void FormEditorFlowActionItem::updateGeometry()
{
FormEditorItem::updateGeometry();
//const QPointF pos = qmlItemNode().flowPosition();
//setTransform(QTransform::fromTranslate(pos.x(), pos.y()));
const QPointF pos = qmlItemNode().instancePosition();
if (pos == m_oldPos)
return;
m_oldPos = pos;
// Call updateGeometry() on all related transitions
QmlFlowItemNode flowItem = QmlFlowActionAreaNode(qmlItemNode()).flowItemParent();
if (flowItem.isValid() && flowItem.flowView().isValid()) {
const auto nodes = flowItem.flowView().transitions();
for (const ModelNode &node : nodes) {
if (FormEditorItem *item = scene()->itemForQmlItemNode(node))
item->updateGeometry();
}
}
}
void FormEditorFlowActionItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)

View File

@@ -26,6 +26,7 @@
#include "formeditorwidget.h"
#include "designeractionmanager.h"
#include "designersettings.h"
#include "formeditoritem.h"
#include "formeditorscene.h"
#include "qmldesignerconstants.h"
#include "qmldesignericons.h"
@@ -208,7 +209,19 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view)
auto frameAll = [this, zoomOut]() {
if (m_graphicsView) {
m_graphicsView->frame(m_graphicsView->rootItemRect());
QRectF bounds;
if (QmlItemNode(m_formEditorView->rootModelNode()).isFlowView()) {
for (QGraphicsItem *item : m_formEditorView->scene()->items()) {
if (auto *fitem = FormEditorItem::fromQGraphicsItem(item)) {
if (!fitem->qmlItemNode().modelNode().isRootNode()
&& !fitem->sceneBoundingRect().isNull())
bounds |= fitem->sceneBoundingRect();
}
}
} else {
bounds = m_graphicsView->rootItemRect();
}
m_graphicsView->frame(bounds);
zoomOut();
}
};

View File

@@ -63,7 +63,8 @@ static bool itemIsRotatable(const QmlItemNode &qmlItemNode)
&& qmlItemNode.instanceIsResizable()
&& qmlItemNode.modelIsMovable()
&& qmlItemNode.modelIsRotatable()
&& !qmlItemNode.instanceIsInLayoutable();
&& !qmlItemNode.instanceIsInLayoutable()
&& !qmlItemNode.isFlowItem();
}
void RotationIndicator::setItems(const QList<FormEditorItem*> &itemList)

View File

@@ -38,7 +38,6 @@ ConnectionManagerInterface::Connection::~Connection() = default;
ConnectionManagerInterface::Connection::Connection(const QString &name, const QString &mode)
: name{name}
, mode{mode}
, timer{std::make_unique<QTimer>()}
{}
ConnectionManagerInterface::Connection::Connection(Connection &&connection) = default;
@@ -49,7 +48,7 @@ void ConnectionManagerInterface::Connection::clear()
socket.reset();
blockSize = 0;
lastReadCommandCounter = 0;
timer->stop();
timer.reset();
}
} // namespace QmlDesigner

View File

@@ -52,8 +52,10 @@ void InteractiveConnectionManager::setUp(NodeInstanceServerInterface *nodeInstan
DesignerSettings settings = QmlDesignerPlugin::instance()->settings();
int timeOutTime = settings.value(DesignerSettingsKey::PUPPET_KILL_TIMEOUT).toInt();
for (Connection &connection : connections())
for (Connection &connection : connections()) {
connection.timer.reset(new QTimer);
connection.timer->setInterval(timeOutTime);
}
if (QmlDesignerPlugin::instance()
->settings()

View File

@@ -159,7 +159,7 @@ bool InternalNode::hasId() const
}
uint qHash(const InternalNodePointer& node)
Utils::QHashValueType qHash(const InternalNodePointer& node)
{
if (node.isNull())
return ::qHash(-1);

View File

@@ -38,6 +38,8 @@
#include "internalnodeproperty.h"
#include "internalnodeabstractproperty.h"
#include <utils/porting.h>
namespace QmlDesigner {
namespace Internal {
@@ -150,7 +152,7 @@ private:
int m_nodeSourceType = 0;
};
uint qHash(const InternalNodePointer& node);
Utils::QHashValueType qHash(const InternalNodePointer& node);
bool operator <(const InternalNodePointer &firstNode, const InternalNodePointer &secondNode);
} // Internal
} // QtQmlDesigner

View File

@@ -150,7 +150,7 @@ float QmlPreviewPlugin::zoomFactor()
void QmlPreviewPlugin::setZoomFactor(float zoomFactor)
{
if (s_previewPlugin) {
if (auto s_previewPlugin = getPreviewPlugin()) {
bool hasZoomFactor = s_previewPlugin->setProperty("zoomFactor", zoomFactor);
QTC_CHECK(hasZoomFactor);
}

View File

@@ -42,6 +42,7 @@
#include <QDirIterator>
#include <QFileInfo>
#include <QFormLayout>
#include <QSet>
#include <QTemporaryDir>
using namespace ProjectExplorer;
@@ -182,11 +183,16 @@ void MakeInstallStep::finish(bool success)
m_deploymentData.setLocalInstallRoot(installRoot());
QDirIterator dit(installRoot().toString(), QDir::Files | QDir::Hidden,
QDirIterator::Subdirectories);
const auto appFileNames = transform<QSet<QString>>(buildSystem()->applicationTargets(),
[](const BuildTargetInfo &appTarget) { return appTarget.targetFilePath.fileName(); });
while (dit.hasNext()) {
dit.next();
const QFileInfo fi = dit.fileInfo();
const DeployableFile::Type type = appFileNames.contains(fi.fileName())
? DeployableFile::TypeExecutable
: DeployableFile::TypeNormal;
m_deploymentData.addFile(fi.filePath(),
fi.dir().path().mid(installRoot().toString().length()));
fi.dir().path().mid(installRoot().toString().length()), type);
}
buildSystem()->setDeploymentData(m_deploymentData);
} else if (m_noInstallTarget && m_isCmakeProject) {

View File

@@ -640,7 +640,7 @@ void VcsBasePluginPrivate::createRepository()
// Find current starting directory
QString directory;
if (const Project *currentProject = ProjectTree::currentProject())
directory = currentProject->projectFilePath().toString();
directory = currentProject->projectFilePath().absolutePath().toString();
// Prompt for a directory that is not under version control yet
QWidget *mw = ICore::dialogParent();
do {

View File

@@ -396,6 +396,11 @@ struct Value5 : Value
Value5(const QString &value) : Value(value) { qtVersion = 5; }
};
struct Value6 : Value
{
Value6(const QString &value) : Value(value) { qtVersion = 6; }
};
struct UnsubstitutedValue : Value
{
UnsubstitutedValue(const QString &value) : Value(value) { substituteNamespace = false; }
@@ -2006,6 +2011,8 @@ void tst_Dumpers::dumper()
}
if (!setok) {
qDebug() << "NO CHECK IN SET PASSED";
for (const Check &check : checkset.checks)
qDebug() << check;
ok = false;
}
}
@@ -2966,26 +2973,26 @@ void tst_Dumpers::dumper_data()
+ Check("m1.5", "[5] 22", FloatValue("22"), "")
+ Check("m2", "<1 items>", "@QMultiMap<@QString, float>")
+ Check("m2.0.key", "\"22.0\"", "@QString")
+ Check("m2.0.value", FloatValue("22"), "float")
+ CheckPairish("m2.0.key", "\"22.0\"", "@QString")
+ CheckPairish("m2.0.value", FloatValue("22"), "float")
+ CoreProfile()
+ Check("m3", "<1 items>", "@QMultiMap<int, @QString>")
+ Check("m3.0.key", "22", "int")
+ Check("m3.0.value", "\"22.0\"", "@QString")
+ CheckPairish("m3.0.key", "22", "int")
+ CheckPairish("m3.0.value", "\"22.0\"", "@QString")
+ CoreProfile()
+ Check("m4", "<3 items>", "@QMultiMap<@QString, Foo>")
+ Check("m4.0.key", "\"22.0\"", "@QString")
+ Check("m4.0.value", "", "Foo")
+ Check("m4.0.value.a", "22", "int")
+ CheckPairish("m4.0.key", "\"22.0\"", "@QString")
+ CheckPairish("m4.0.value", "", "Foo")
+ CheckPairish("m4.0.value.a", "22", "int")
+ Check("m5", "<4 items>", "@QMultiMap<@QString, @QPointer<@QObject>>")
+ Check("m5.0.key", "\".\"", "@QString")
+ Check("m5.0.value", "", "@QPointer<@QObject>")
+ Check("m5.1.key", "\".\"", "@QString")
+ Check("m5.2.key", "\"Hallo\"", "@QString")
+ Check("m5.3.key", "\"Welt\"", "@QString");
+ CheckPairish("m5.0.key", "\".\"", "@QString")
+ CheckPairish("m5.0.value", "", "@QPointer<@QObject>")
+ CheckPairish("m5.1.key", "\".\"", "@QString")
+ CheckPairish("m5.2.key", "\"Hallo\"", "@QString")
+ CheckPairish("m5.3.key", "\"Welt\"", "@QString");
QTest::newRow("QObject1")
@@ -3388,6 +3395,8 @@ void tst_Dumpers::dumper_data()
"uint qHash(const QPointer<QObject> &p) { return (quintptr)p.data(); }\n"
"QT_END_NAMESPACE\n",
"QSet<double> s0;\n"
"QSet<int> s1;\n"
"s1.insert(11);\n"
"s1.insert(22);\n\n"
@@ -3403,19 +3412,23 @@ void tst_Dumpers::dumper_data()
"s3.insert(ptr);\n"
"s3.insert(ptr);\n",
"&s1, &s2, &s3")
"&s0, &s1, &s2, &s3")
+ CoreProfile()
+ Check("s0", "<0 items>", "@QSet<double>")
+ Check("s1", "<2 items>", "@QSet<int>")
+ Check("s1.0", "[0]", "22", "int")
+ Check("s1.1", "[1]", "11", "int")
+ CheckSet({{"s1.0", "[0]", "22", "int"},
{"s1.0", "[0]", "11", "int"}})
+ CheckSet({{"s1.1", "[1]", "22", "int"},
{"s1.1", "[1]", "11", "int"}})
+ Check("s2", "<2 items>", "@QSet<@QString>")
+ Check("s2.0", "[0]", Value4("\"11.0\""), "@QString")
+ Check("s2.0", "[0]", Value5("\"22.0\""), "@QString")
+ Check("s2.1", "[1]", Value4("\"22.0\""), "@QString")
+ Check("s2.1", "[1]", Value5("\"11.0\""), "@QString")
+ CheckSet({{"s2.0", "[0]", "\"11.0\"", "@QString"},
{"s2.0", "[0]", "\"22.0\"", "@QString"}})
+ CheckSet({{"s2.1", "[1]", "\"11.0\"", "@QString"},
{"s2.1", "[1]", "\"22.0\"", "@QString"}})
+ Check("s3", "<1 items>", "@QSet<@QPointer<@QObject>>")
+ Check("s3.0", "[0]", "", "@QPointer<@QObject>");
@@ -4040,20 +4053,20 @@ void tst_Dumpers::dumper_data()
//+ Check("v1", "\"Some string\"", "@QVariant (QString)")
+ CheckType("v1", "@QVariant (QString)")
+ Check("my", "<2 items>", TypePattern("@QMap<unsigned int,@QStringList>|@QMap<unsigned int,@List<@QString>>|MyType"))
+ Check("my.0.key", "1", "unsigned int")
+ Check("my.0.value", "<1 items>", TypePattern("@QList<@QString>|@QStringList"))
+ Check("my.0.value.0", "[0]", "\"Hello\"", "@QString")
+ Check("my.1.key", "3", "unsigned int")
+ Check("my.1.value", "<1 items>", TypePattern("@QList<@QString>|@QStringList"))
+ Check("my.1.value.0", "[0]", "\"World\"", "@QString")
+ Check("my", "<2 items>", TypePattern("@QMap<unsigned int,@QStringList>|@QMap<unsigned int,@QList<@QString>>|MyType"))
+ CheckPairish("my.0.key", "1", "unsigned int")
+ CheckPairish("my.0.value", "<1 items>", TypePattern("@QList<@QString>|@QStringList"))
+ CheckPairish("my.0.value.0", "[0]", "\"Hello\"", "@QString")
+ CheckPairish("my.1.key", "3", "unsigned int")
+ CheckPairish("my.1.value", "<1 items>", TypePattern("@QList<@QString>|@QStringList"))
+ CheckPairish("my.1.value.0", "[0]", "\"World\"", "@QString")
//+ CheckType("v2", "@QVariant (MyType)")
+ Check("v2.data.0.key", "1", "unsigned int") % NeedsInferiorCall
+ Check("v2.data.0.value", "<1 items>", "@QStringList") % NeedsInferiorCall
+ Check("v2.data.0.value.0", "[0]", "\"Hello\"", "@QString") % NeedsInferiorCall
+ Check("v2.data.1.key", "3", "unsigned int") % NeedsInferiorCall
+ Check("v2.data.1.value", "<1 items>", "@QStringList") % NeedsInferiorCall
+ Check("v2.data.1.value.0", "[0]", "\"World\"", "@QString") % NeedsInferiorCall
+ CheckPairish("v2.data.0.key", "1", "unsigned int") % NeedsInferiorCall
+ CheckPairish("v2.data.0.value", "<1 items>", "@QStringList") % NeedsInferiorCall
+ CheckPairish("v2.data.0.value.0", "[0]", "\"Hello\"", "@QString") % NeedsInferiorCall
+ CheckPairish("v2.data.1.key", "3", "unsigned int") % NeedsInferiorCall
+ CheckPairish("v2.data.1.value", "<1 items>", "@QStringList") % NeedsInferiorCall
+ CheckPairish("v2.data.1.value.0", "[0]", "\"World\"", "@QString") % NeedsInferiorCall
+ Check("list", "<3 items>", "@QList<int>")
+ Check("list.0", "[0]", "1", "int")
@@ -4277,8 +4290,11 @@ void tst_Dumpers::dumper_data()
//+ Check("ha1.protocol", "IPv4Protocol",
// "@QAbstractSocket::NetworkLayerProtocol") % LldbEngine
+ Check("ha1.scopeId", "\"\"", "@QString")
+ Check("var", "", "@QVariant (@QHostAddress)") % NeedsInferiorCall
+ Check("var.data", ValuePattern(".*127.0.0.1.*"), "@QHostAddress") % NeedsInferiorCall;
+ Check5("var", "", "@QVariant (@QHostAddress)") % NeedsInferiorCall
+ Check5("var.data", ValuePattern(".*127.0.0.1.*"),
"@QHostAddress") % NeedsInferiorCall
+ Check6("var", ValuePattern(".*127.0.0.1.*"),
"@QVariant(@QHostAddress)") % NeedsInferiorCall;
QTest::newRow("QVariantList")
@@ -4334,13 +4350,13 @@ void tst_Dumpers::dumper_data()
+ Check("vm0", "<0 items>", TypeDef("@QMap<@QString,@QVariant>", "@QVariantMap"))
+ Check("vm1", "<6 items>", TypeDef("@QMap<@QString,@QVariant>", "@QVariantMap"))
+ Check("vm1.0.key", "\"a\"", "@QString")
+ Check("vm1.0.value", "1", "@QVariant (int)")
+ Check("vm1.5.key", "\"f\"", "@QString")
+ Check("vm1.5.value", "\"2Some String\"", "@QVariant (QString)")
+ CheckPairish("vm1.0.key", "\"a\"", "@QString")
+ CheckPairish("vm1.0.value", "1", "@QVariant (int)")
+ CheckPairish("vm1.5.key", "\"f\"", "@QString")
+ CheckPairish("vm1.5.value", "\"2Some String\"", "@QVariant (QString)")
+ Check("v", "<6 items>", "@QVariant (QVariantMap)")
+ Check("v.0.key", "\"a\"", "@QString");
+ CheckPairish("v.0.key", "\"a\"", "@QString");
QTest::newRow("QVariantHash")