diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index 8fcd5862e7d..9ae08876d36 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -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. diff --git a/doc/qtcreator/src/howto/creator-external-tools.qdoc b/doc/qtcreator/src/howto/creator-external-tools.qdoc index c06ef08d7fc..986f371005a 100644 --- a/doc/qtcreator/src/howto/creator-external-tools.qdoc +++ b/doc/qtcreator/src/howto/creator-external-tools.qdoc @@ -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 diff --git a/doc/qtcreator/src/howto/creator-only/creator-telemetry.qdoc b/doc/qtcreator/src/howto/creator-telemetry.qdoc similarity index 68% rename from doc/qtcreator/src/howto/creator-only/creator-telemetry.qdoc rename to doc/qtcreator/src/howto/creator-telemetry.qdoc index de1a9d66798..a8ebb892758 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-telemetry.qdoc +++ b/doc/qtcreator/src/howto/creator-telemetry.qdoc @@ -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 */ diff --git a/doc/qtcreator/src/qtquick/qtquick-component-context-menu.qdocinc b/doc/qtcreator/src/qtquick/qtquick-component-context-menu.qdocinc index 5c73bcf1562..1dc19f288d3 100644 --- a/doc/qtcreator/src/qtquick/qtquick-component-context-menu.qdocinc +++ b/doc/qtcreator/src/qtquick/qtquick-component-context-menu.qdocinc @@ -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} diff --git a/doc/qtcreatordev/src/coding-style.qdoc b/doc/qtcreatordev/src/coding-style.qdoc index 5e8dc6e1367..d429ea917ca 100644 --- a/doc/qtcreatordev/src/coding-style.qdoc +++ b/doc/qtcreatordev/src/coding-style.qdoc @@ -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 diff --git a/doc/qtcreatordev/src/qtcreator-documentation.qdoc b/doc/qtcreatordev/src/qtcreator-documentation.qdoc index 09d17bf0f32..c0be954940c 100644 --- a/doc/qtcreatordev/src/qtcreator-documentation.qdoc +++ b/doc/qtcreatordev/src/qtcreator-documentation.qdoc @@ -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=" + \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=/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 {.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 {/qmake.exe - qtcreator.pro -r - IDE_BRANDING_PRI=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 + /qmake.exe qtcreator.pro -r + IDE_BRANDING_PRI=/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 + /qmake.exe qtcreator.pro -r + IDE_BRANDING_PRI=/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_ - build the document (qtcreator/ + qtcreator-dev/qtdesignstudio) in help format, but do not generate a + help file (.qch) + + \li \c html_docs_-online - build the document + (qtcreator/qtcreator-dev/qtdesignstudio) in online format + + \li \c qch_docs_ - build the document (qtcreator/ + qtcreator-dev/qtdesignstudio) in help format and generate a + help file + \endlist */ diff --git a/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc index ab77f1386c6..f0c0b8b42fd 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc @@ -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 */ diff --git a/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc index 19551df97f9..e08929263d6 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc @@ -25,7 +25,7 @@ /*! \page studio-help.html - \previouspage creator-editor-external.html + \previouspage creator-telemetry.html \nextpage {Examples and Tutorials} \title Help diff --git a/doc/qtdesignstudio/src/qtdesignstudio-platforms.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-platforms.qdoc index ac9da974358..f22c988c771 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-platforms.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-platforms.qdoc @@ -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 diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 450332556ba..a123301b5b7 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -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 diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index 395258316aa..57b00a53cae 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -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 diff --git a/qtcreator_ide_branding.pri b/qtcreator_ide_branding.pri index adcd8adf219..99c5f152382 100644 --- a/qtcreator_ide_branding.pri +++ b/qtcreator_ide_branding.pri @@ -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 diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index 8f2dbada3b6..0f070682213 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -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 diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index b2d6e78755f..c7b1362a819 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -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 diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index cfc9bd4178e..df9913c4f87 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -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: diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml index 3c512543379..1ec22c0c397 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml @@ -220,7 +220,7 @@ RowLayout { iconColor: urlChooser.textColor onClicked: { fileModel.openFileDialog() - if (fileModel.path !== "") + if (fileModel.fileName !== "") urlChooser.backendValue.value = fileModel.fileName } } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp index 0d667daade9..35e0f9852d1 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp @@ -115,8 +115,9 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) ++row; auto qmlDebugAspect = bc->aspect(); - 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 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(); + 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() diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h index da1d6facd6a..f999d3c6afa 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h @@ -25,6 +25,8 @@ #pragma once +#include "cmakeconfigitem.h" + #include #include @@ -66,7 +68,7 @@ private: void updateButtonState(); void updateAdvancedCheckBox(); void updateFromKit(); - void handleQmlDebugCxxFlags(); + CMakeProjectManager::CMakeConfig getQmlDebugCxxFlags(); void updateSelection(); void setVariableUnsetFlag(bool unsetFlag); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 4a3461ec81b..122bb1aa92d 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -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, diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 2e773de3782..6609e5396b9 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -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(qchFiles, [](const QFileInfo &fi){ + return fi.absoluteFilePath(); + })); } void McuSupportOptions::registerExamples() diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 08671c7c6c1..b91632e9b87 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -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"; diff --git a/src/plugins/python/pythonproject.cpp b/src/plugins/python/pythonproject.cpp index 319fe245d68..9b568713844 100644 --- a/src/plugins/python/pythonproject.cpp +++ b/src/plugins/python/pythonproject.cpp @@ -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); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp index 10eff821136..77d35ea6578 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp @@ -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 *) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 63c7e05d603..cf7a5759e25 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -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(); } }; diff --git a/src/plugins/qmldesigner/components/formeditor/rotationindicator.cpp b/src/plugins/qmldesigner/components/formeditor/rotationindicator.cpp index a47aa0ec907..0a0f223bf42 100644 --- a/src/plugins/qmldesigner/components/formeditor/rotationindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/rotationindicator.cpp @@ -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 &itemList) diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp b/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp index b4fdb707944..7e0114bd8e2 100644 --- a/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp +++ b/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp @@ -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()} {} 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 diff --git a/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp index cd9b5fc5cfa..57b66a7f800 100644 --- a/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp @@ -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() diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 17b1d61eb2f..d2edc4e64cb 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -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); diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 69f1f3c1ee8..a5f3c6dfcad 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -38,6 +38,8 @@ #include "internalnodeproperty.h" #include "internalnodeabstractproperty.h" +#include + 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 diff --git a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp index 95440ae077f..0975acfde30 100644 --- a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp +++ b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp @@ -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); } diff --git a/src/plugins/remotelinux/makeinstallstep.cpp b/src/plugins/remotelinux/makeinstallstep.cpp index 91a2d5e8d89..d919d885a20 100644 --- a/src/plugins/remotelinux/makeinstallstep.cpp +++ b/src/plugins/remotelinux/makeinstallstep.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include 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>(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) { diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp index aa077410a15..9ff8a0b9977 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.cpp +++ b/src/plugins/vcsbase/vcsbaseplugin.cpp @@ -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 { diff --git a/src/shared/qbs b/src/shared/qbs index f89169ccb86..80cb55a1fb4 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit f89169ccb8651613e5c97bd7db62a0d10e969e97 +Subproject commit 80cb55a1fb4d8d762003f1fc766365196cc6a450 diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 5a08803e264..a969a79046f 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -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") - + 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 &p) { return (quintptr)p.data(); }\n" "QT_END_NAMESPACE\n", + "QSet s0;\n" + "QSet 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") + + Check("s1", "<2 items>", "@QSet") - + 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|@QMap>|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|@QMap>|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") + 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")