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 "4.14.0") # The IDE version.
set(IDE_VERSION_COMPAT "4.13.84") # The IDE Compatibility version. set(IDE_VERSION_COMPAT "4.14.0") # The IDE Compatibility version.
set(IDE_VERSION_DISPLAY "4.14.0-rc1") # The IDE display version. set(IDE_VERSION_DISPLAY "4.14.0") # The IDE display version.
set(IDE_COPYRIGHT_YEAR "2020") # The IDE current copyright year. set(IDE_COPYRIGHT_YEAR "2020") # The IDE current copyright year.
set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation.

View File

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

View File

@@ -24,9 +24,14 @@
****************************************************************************/ ****************************************************************************/
/*! /*!
\previouspage creator-task-lists.html
\page creator-telemetry.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 \nextpage creator-help-overview.html
\endif
\title Managing Data Collection Settings \title Managing Data Collection Settings
@@ -42,22 +47,28 @@
\section1 Principles of Data Collection \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 The Telemetry plugin uses the
\l{https://api.kde.org/frameworks/kuserfeedback/html/index.html} \l{https://api.kde.org/frameworks/kuserfeedback/html/index.html}
{KUserFeedback} framework to collect the usage data. The library {KUserFeedback} framework to collect the usage data. The library
has been designed from the user data privacy point of view and has been designed from the user data privacy point of view and
\QC respects the same privacy rules. \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 The data is transmitted to the backend storage using an encrypted
connection. The storage is located in the same Heroku backend as the connection. The storage is located in the same Heroku backend as the
Qt installer backend. Physically, data is stored in the Amazon cloud. 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: To determine what data is transmitted to the backend storage:
@@ -67,12 +78,31 @@
\image qtcreator-telemetry-settings.png \image qtcreator-telemetry-settings.png
\li In the \uicontrol {Telemetry mode} list, select the mode that \li In the \uicontrol {Telemetry mode} list, select the mode that
determines what kind of data is collected. 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 exactly what data is collected. Deselect check boxes for data
that you do not want to transmit to the backend storage. that you do not want to transmit to the backend storage.
\endlist \endlist
For more information about Qt privacy policy, select \if defined(qtdesignstudio)
\l{https://www.qt.io/terms-conditions/#privacy} \section1 Reporting Crashes
{Legal Notice and Privacy Policy}.
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 \row
\li Anchors \li Anchors
\li \l{Setting Anchors and Margins} \li \l{Setting Anchors and Margins}
\if defined(qtdesignstudio)
\row \row
\li Group \li Group
\li \l Group \li \l Group
\endif
\row \row
\li Position \li Position
\li \l{Using Positioners} \li \l{Using Positioners}
@@ -59,9 +61,11 @@
\row \row
\li Timeline \li Timeline
\li \l{Creating Timelines} \li \l{Creating Timelines}
\if defined(qtdesignstudio)
\row \row
\li Event List \li Event List
\li \l{Simulating Events} \li \l{Simulating Events}
\endif
\row \row
\li Edit Color \li Edit Color
\li \l{Editing Properties Inline} \li \l{Editing Properties Inline}

View File

@@ -202,35 +202,6 @@
} }
\endcode \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 \endlist
\section1 Formatting \section1 Formatting

View File

@@ -473,7 +473,7 @@
\section2 Setting Up Documentation Builds \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 \note Since \QC version 4.12, only Qt 5.14.0 or later is supported
for building documentation. for building documentation.
@@ -500,67 +500,145 @@
for publishing on the web for publishing on the web
\endlist \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, \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 you might be using the QTextBrowser as the help engine backend instead of
browser. This happens if you do not have Qt WebEngine installed. 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 \section3 Using CMake
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):
\list When using CMake, the docs are built in the \QC \e {build folder} or a
\li \c {nmake docs} (on Windows) 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 \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 \list
\li \c doc/html/qtcreator \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/qtdesignstudio
\li \c doc/html/qtcreator-online
\li \c doc/html/qtcreator-dev-online
\li \c doc/html/qtdesignstudio-online
\endlist \endlist
The help files (\c {.qch}) are generated in the The help files (\c {.qch}) are generated in the \c {share/doc/qtcreator}
\c {share/doc/qtcreator} directory in the \QC build directory on Windows and folder or in the \c {<application_name>.app/Contents/Resources/doc\} folder
Linux, and in the \c {bin/Qt Creator.app/Contents/Resources/app} directory
on \macos. on \macos.
You can view the HTML files in a browser and the help files in 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 the \QC \uicontrol Help mode. For more information about adding
files to \QC, see the help files to \QC, see
\l{http://doc.qt.io/qtcreator/creator-help.html#adding-external-documentation} \l{http://doc.qt.io/qtcreator/creator-help.html#adding-external-documentation}
{Adding External Documentation}. {Adding External Documentation}.
Besides \c docs, you have the following options for building a particular \section3 Using qmake
document in a particular format:
\list To build offline documentation using qmake:
\li \c html_docs_qtcreator - build \QC Manual in help format, but do not
generate a help file
\li \c html_docs_qtcreator-dev - build Extending \QC Manual in help \list 1
format, but do not generate a help file \li In the project folder, run \c qmake from an installed Qt.
For example:
\li \c qch_docs_qtcreator - build \QC Manual in help format and generate \badcode
a help file (.qch) C:\dev\qtc-super\qtcreator>..\..\..\Qt\5.15.1\msvc2019_64\bin\qmake.exe
\endcode
\li \c qch_docs_qtcreator-dev - build Extending \QC Manual in help format \li Enter the following doc build command:
and generate a help file (.qch) \list
\li On Windows: \c {nmake docs}
\li On Linux and \macos: \c {make docs}
\endlist
\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 \list 1
\c {qtcreator.pro} with the \c IDE_BRANDING_PRI option set to the absolute \li In the project folder, run \c qmake from an installed Qt with the
path of \c {ide_branding.pri} in the \QDS (private) repository. 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): 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 IDE_BRANDING_PRI=C:\dev\tqtc-plugin-qtquickdesigner\studiodata\branding\ide_branding.pri
\endcode \endcode
To build the \QDS Manual: To use the offline style to build the \QDS help with qmake:
\list 1 \list 1
\li Run \c qmake from Qt 5.14.0, or later with the path to the branding \li In the \c {doc/qtdesignstudio} folder, run \c qmake from Qt 5.14.0,
information as an option (all on one line): or later with the path to the branding information as an option
(all on one line):
\c {<relative_path_to>/qmake.exe \badcode
qtcreator.pro -r <relative_path_to>/qmake.exe qtcreator.pro -r
IDE_BRANDING_PRI=<absolute_path_to>ide_branding.pri} IDE_BRANDING_PRI=<absolute_path_to>/ide_branding.pri
\endcode
\li Run \c {make docs} on Linux and macOS or \c {nmake docs} \li Run \c {make docs} on Linux and macOS or \c {nmake docs}
on Windows. on Windows.
\endlist \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 editor for your system, and the \c sort tool are preconfigured for
use. You can change their default configurations and configure new use. You can change their default configurations and configure new
tools. 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 \endlist
*/ */

View File

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

View File

@@ -38,9 +38,15 @@
\QDS is available in binary packages for the following operating systems: \QDS is available in binary packages for the following operating systems:
\list \list
\li \macOS 10.13 and 10.14.x \li \macOS 10.15
\li Ubuntu Linux 18.04 \li Linux:
\li Windows 10 \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 \endlist
\note For a good user experience on Windows 10, we recommend the following \note For a good user experience on Windows 10, we recommend the following

View File

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

View File

@@ -4,16 +4,16 @@ import qbs.FileInfo
import "qtc.js" as HelperFunctions import "qtc.js" as HelperFunctions
Module { 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_major: '4'
property string ide_version_minor: '13' property string ide_version_minor: '14'
property string ide_version_release: '84' property string ide_version_release: '0'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
+ ide_version_release + ide_version_release
property string ide_compat_version_major: '4' property string ide_compat_version_major: '4'
property string ide_compat_version_minor: '13' property string ide_compat_version_minor: '14'
property string ide_compat_version_release: '84' property string ide_compat_version_release: '0'
property string qtcreator_compat_version: ide_compat_version_major + '.' property string qtcreator_compat_version: ide_compat_version_major + '.'
+ ide_compat_version_minor + '.' + ide_compat_version_release + ide_compat_version_minor + '.' + ide_compat_version_release

View File

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

View File

@@ -259,12 +259,12 @@ class Dumper(DumperBase):
def qtCoreModuleName(self): def qtCoreModuleName(self):
modules = cdbext.listOfModules() modules = cdbext.listOfModules()
# first check for an exact module name match # 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: if coreName in modules:
self.qtCoreModuleName = lambda: coreName self.qtCoreModuleName = lambda: coreName
return coreName return coreName
# maybe we have a libinfix build. # 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)] matches = [module for module in modules if re.match(pattern, module)]
if matches: if matches:
coreName = matches[0] coreName = matches[0]
@@ -274,11 +274,11 @@ class Dumper(DumperBase):
def qtDeclarativeModuleName(self): def qtDeclarativeModuleName(self):
modules = cdbext.listOfModules() modules = cdbext.listOfModules()
for declarativeModuleName in ['Qt5Qmld', 'Qt5Qml']: for declarativeModuleName in ['Qt6Qmld', 'Qt6Qml', 'Qt5Qmld', 'Qt5Qml']:
if declarativeModuleName in modules: if declarativeModuleName in modules:
self.qtDeclarativeModuleName = lambda: declarativeModuleName self.qtDeclarativeModuleName = lambda: declarativeModuleName
return 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: if matches:
declarativeModuleName = matches[0] declarativeModuleName = matches[0]
self.qtDeclarativeModuleName = lambda: declarativeModuleName self.qtDeclarativeModuleName = lambda: declarativeModuleName

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -287,10 +287,6 @@ void CMakeBuildSystem::triggerParsing()
reparseParameters |= REPARSE_FORCE_CMAKE_RUN | REPARSE_FORCE_EXTRA_CONFIGURATION; 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"; qCDebug(cmakeBuildSystemLog) << "Asking reader to parse";
m_reader.parse(reparseParameters & REPARSE_FORCE_CMAKE_RUN, m_reader.parse(reparseParameters & REPARSE_FORCE_CMAKE_RUN,
reparseParameters & REPARSE_FORCE_INITIAL_CONFIGURATION, reparseParameters & REPARSE_FORCE_INITIAL_CONFIGURATION,

View File

@@ -506,12 +506,11 @@ void McuSupportOptions::registerQchFiles()
if (docsDir.isEmpty()) if (docsDir.isEmpty())
return; return;
const QStringList qchFiles = { const QFileInfoList qchFiles = QDir(docsDir, "*.qch").entryInfoList();
docsDir + "/quickultralite.qch",
docsDir + "/quickultralitecmake.qch"
};
Core::HelpManager::registerDocumentation( 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() void McuSupportOptions::registerExamples()

View File

@@ -159,6 +159,7 @@ const char BUILDSTEPS_DEPLOY[] = "ProjectExplorer.BuildSteps.Deploy";
const char C_LANGUAGE_ID[] = "C"; const char C_LANGUAGE_ID[] = "C";
const char CXX_LANGUAGE_ID[] = "Cxx"; const char CXX_LANGUAGE_ID[] = "Cxx";
const char QMLJS_LANGUAGE_ID[] = "QMLJS"; const char QMLJS_LANGUAGE_ID[] = "QMLJS";
const char PYTHON_LANGUAGE_ID[] = "Python";
// ToolChain TypeIds // ToolChain TypeIds
const char CLANG_TOOLCHAIN_TYPEID[] = "ProjectExplorer.ToolChain.Clang"; 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) : Project(Constants::C_PY_MIMETYPE, fileName)
{ {
setId(PythonProjectId); setId(PythonProjectId);
setProjectLanguages(Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID)); setProjectLanguages(Context(ProjectExplorer::Constants::PYTHON_LANGUAGE_ID));
setDisplayName(fileName.toFileInfo().completeBaseName()); setDisplayName(fileName.toFileInfo().completeBaseName());
setNeedsBuildConfigurations(false); setNeedsBuildConfigurations(false);

View File

@@ -656,8 +656,23 @@ void FormEditorFlowActionItem::setDataModelPositionInBaseState(const QPointF &po
void FormEditorFlowActionItem::updateGeometry() void FormEditorFlowActionItem::updateGeometry()
{ {
FormEditorItem::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 *) void FormEditorFlowActionItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)

View File

@@ -26,6 +26,7 @@
#include "formeditorwidget.h" #include "formeditorwidget.h"
#include "designeractionmanager.h" #include "designeractionmanager.h"
#include "designersettings.h" #include "designersettings.h"
#include "formeditoritem.h"
#include "formeditorscene.h" #include "formeditorscene.h"
#include "qmldesignerconstants.h" #include "qmldesignerconstants.h"
#include "qmldesignericons.h" #include "qmldesignericons.h"
@@ -208,7 +209,19 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view)
auto frameAll = [this, zoomOut]() { auto frameAll = [this, zoomOut]() {
if (m_graphicsView) { 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(); zoomOut();
} }
}; };

View File

@@ -63,7 +63,8 @@ static bool itemIsRotatable(const QmlItemNode &qmlItemNode)
&& qmlItemNode.instanceIsResizable() && qmlItemNode.instanceIsResizable()
&& qmlItemNode.modelIsMovable() && qmlItemNode.modelIsMovable()
&& qmlItemNode.modelIsRotatable() && qmlItemNode.modelIsRotatable()
&& !qmlItemNode.instanceIsInLayoutable(); && !qmlItemNode.instanceIsInLayoutable()
&& !qmlItemNode.isFlowItem();
} }
void RotationIndicator::setItems(const QList<FormEditorItem*> &itemList) 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) ConnectionManagerInterface::Connection::Connection(const QString &name, const QString &mode)
: name{name} : name{name}
, mode{mode} , mode{mode}
, timer{std::make_unique<QTimer>()}
{} {}
ConnectionManagerInterface::Connection::Connection(Connection &&connection) = default; ConnectionManagerInterface::Connection::Connection(Connection &&connection) = default;
@@ -49,7 +48,7 @@ void ConnectionManagerInterface::Connection::clear()
socket.reset(); socket.reset();
blockSize = 0; blockSize = 0;
lastReadCommandCounter = 0; lastReadCommandCounter = 0;
timer->stop(); timer.reset();
} }
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -52,8 +52,10 @@ void InteractiveConnectionManager::setUp(NodeInstanceServerInterface *nodeInstan
DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); DesignerSettings settings = QmlDesignerPlugin::instance()->settings();
int timeOutTime = settings.value(DesignerSettingsKey::PUPPET_KILL_TIMEOUT).toInt(); 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); connection.timer->setInterval(timeOutTime);
}
if (QmlDesignerPlugin::instance() if (QmlDesignerPlugin::instance()
->settings() ->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()) if (node.isNull())
return ::qHash(-1); return ::qHash(-1);

View File

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

View File

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

View File

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

View File

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

View File

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