From 4c36e157af974a046de408e65183eefc1fa49ab4 Mon Sep 17 00:00:00 2001 From: Samuel Ghinet Date: Fri, 19 Nov 2021 14:25:54 +0200 Subject: [PATCH 01/26] QDS New Project dialog: capitalize the first letter of the Project Name Capitalize the first letter of the project name When the user finished editing. Change-Id: I7222bbd9a13d275fa13028cdc24cfd781c7a791f Reviewed-by: Miikka Heikkinen Reviewed-by: Qt CI Bot Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../newprojectdialog/imports/NewProjectDialog/Details.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml index 7399db69149..9c4f2596484 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml @@ -73,6 +73,10 @@ Item { color: DialogValues.textColor selectByMouse: true + onEditingFinished: { + text = text.charAt(0).toUpperCase() + text.slice(1) + } + font.pixelSize: DialogValues.paneTitlePixelSize } From 8f611286f73d2a9f9d6fadfe8be62fb27bfa415c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 22 Nov 2021 12:28:41 +0100 Subject: [PATCH 02/26] Fix some compiler warnings Change-Id: I9128afcf56bd47cb6627012bb6b0d13395b432ac Reviewed-by: Christian Stenger --- .../instances/qt5informationnodeinstanceserver.cpp | 6 ------ src/libs/qmljs/qmljscheck.cpp | 2 ++ src/plugins/android/avddialog.cpp | 4 ++-- .../designercore/projectstorage/projectstoragetypes.h | 4 ++-- src/plugins/studiowelcome/newprojectdialogimageprovider.cpp | 2 ++ src/plugins/studiowelcome/newprojectmodel.cpp | 2 ++ 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 545457ccbec..5daf582e431 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -147,12 +147,6 @@ static bool imageHasContent(const QImage &image) return false; } -static bool isQuick3DMode() -{ - static bool mode3D = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_MODE"); - return mode3D; -} - static QObjectList toObjectList(const QVariant &variantList) { QObjectList objList; diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 1bfd9e9701d..f280b53c01a 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -810,6 +810,8 @@ bool Check::visit(UiObjectInitializer *) void Check::endVisit(UiObjectInitializer *uiObjectInitializer) { + Q_UNUSED(uiObjectInitializer) + m_propertyStack.pop(); const QString type = m_typeStack.pop(); diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index 795537e1db7..0f9f25e2295 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -51,9 +51,9 @@ static Q_LOGGING_CATEGORY(avdDialogLog, "qtc.android.avdDialog", QtWarningMsg) AvdDialog::AvdDialog(const AndroidConfig &config, QWidget *parent) : QDialog(parent), + m_allowedNameChars(QLatin1String("[a-z|A-Z|0-9|._-]*")), m_androidConfig(config), - m_sdkManager(m_androidConfig), - m_allowedNameChars(QLatin1String("[a-z|A-Z|0-9|._-]*")) + m_sdkManager(m_androidConfig) { m_avdDialog.setupUi(this); m_hideTipTimer.setInterval(2000); diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h index ef055390767..366da00407a 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h @@ -148,8 +148,8 @@ public: {} explicit Import(int moduleId, int majorVersion, int minorVersion, int sourceId) - : moduleId{moduleId} - , version{majorVersion, minorVersion} + : version{majorVersion, minorVersion} + , moduleId{moduleId} , sourceId{sourceId} {} diff --git a/src/plugins/studiowelcome/newprojectdialogimageprovider.cpp b/src/plugins/studiowelcome/newprojectdialogimageprovider.cpp index 2c7e454f5b0..bdb3e4af8be 100644 --- a/src/plugins/studiowelcome/newprojectdialogimageprovider.cpp +++ b/src/plugins/studiowelcome/newprojectdialogimageprovider.cpp @@ -46,6 +46,8 @@ QPixmap NewProjectDialogImageProvider::invalidStyleIcon() QPixmap NewProjectDialogImageProvider::requestStatusPixmap(const QString &id, QSize *size, const QSize &requestedSize) { + Q_UNUSED(size) + QPixmap pixmap; if (id == "status-warning") { diff --git a/src/plugins/studiowelcome/newprojectmodel.cpp b/src/plugins/studiowelcome/newprojectmodel.cpp index 07589a4c041..3d5d9246d27 100644 --- a/src/plugins/studiowelcome/newprojectmodel.cpp +++ b/src/plugins/studiowelcome/newprojectmodel.cpp @@ -65,6 +65,7 @@ int NewProjectCategoryModel::rowCount(const QModelIndex &) const QVariant NewProjectCategoryModel::data(const QModelIndex &index, int role) const { + Q_UNUSED(role) return categories().at(index.row()); } @@ -84,6 +85,7 @@ int NewProjectModel::rowCount(const QModelIndex &) const QVariant NewProjectModel::data(const QModelIndex &index, int role) const { + Q_UNUSED(role) return projectsOfCurrentCategory().at(index.row()).name; } From 89e6e99957b43a5a6895346cbb6b2e57e52d00a0 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 22 Nov 2021 13:05:39 +0100 Subject: [PATCH 03/26] Doc: Update keyboard shortcuts for recording text editing macros Task-number: QTCREATORBUG-26278 Change-Id: I4bbb52859671b4f1840bb1803695fd3f106b05ad Reviewed-by: hjk --- .../editors/creator-only/creator-text-editing-macros.qdoc | 6 +++--- doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc b/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc index 99f5f00e379..17b15106276 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -32,9 +32,9 @@ To record a text editing macro, select \uicontrol Tools > \uicontrol {Text Editing Macros} > \uicontrol {Record Macro} - or press \key {Alt+(}. To stop recording, select \uicontrol Tools > + or press \key {Alt+[}. To stop recording, select \uicontrol Tools > \uicontrol {Text Editing Macros} > \uicontrol {Stop Recording Macro} or - press \key {Alt+)}. + press \key {Alt+]}. \note The macro recorder does not support code completion. diff --git a/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc b/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc index 56d78ffcd3b..8ac3aff9aa1 100644 --- a/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc +++ b/doc/qtcreator/src/howto/creator-keyboard-shortcuts.qdoc @@ -505,10 +505,10 @@ \if defined(qtcreator) \row \li Record a text-editing macro - \li Alt+( + \li Alt+[ \row \li Stop recording a macro - \li Alt+) + \li Alt+] \row \li Play last macro \li Alt+R From 53bae17b96f7c718069d719801a73a927049239a Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 22 Nov 2021 10:29:16 +0100 Subject: [PATCH 04/26] CDB: always set stop reason when handling exceptions Otherwise we get an unknown stop reason which might get handled differently in the cdbengine. Fixes: QTCREATORBUG-26506 Change-Id: Ia1622977631190d43a6b599b58410953cd2add6e Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/eventcallback.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/qtcreatorcdbext/eventcallback.cpp b/src/libs/qtcreatorcdbext/eventcallback.cpp index caafd9c3e2f..2e887f5de92 100644 --- a/src/libs/qtcreatorcdbext/eventcallback.cpp +++ b/src/libs/qtcreatorcdbext/eventcallback.cpp @@ -173,14 +173,14 @@ STDMETHODIMP EventCallback::Exception( __in ULONG FirstChance ) { + const ExtensionContext::StopReasonMap parameters = exceptionParameters(*Ex, FirstChance); + ExtensionContext::instance().setStopReason(parameters, "exception"); if ((FirstChance && ExtensionContext::instance().parameters().firstChanceException != 0) || (!FirstChance && ExtensionContext::instance().parameters().secondChanceException != 0)) { // Report the exception as GBMI and set potential stop reason - const ExtensionContext::StopReasonMap parameters = exceptionParameters(*Ex, FirstChance); std::ostringstream str; formatGdbmiHash(str, parameters); - ExtensionContext::instance().setStopReason(parameters, "exception"); ExtensionContext::instance().report('E', 0, 0, "exception", "%s", str.str().c_str()); } return m_wrapped ? m_wrapped->Exception(Ex, FirstChance) : S_OK; From 46c3540961c3075444990a5d0a6f31d20960beb0 Mon Sep 17 00:00:00 2001 From: Tapani Mattila Date: Fri, 19 Nov 2021 13:46:03 +0200 Subject: [PATCH 05/26] CMake generator: Add translation contexts Change-Id: Icdd2ce4626588e6bdcd870cae915ef2f48a85666 Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/generatecmakelists.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/generatecmakelists.cpp b/src/plugins/qmldesigner/generatecmakelists.cpp index 25fadb23940..52b84d7796d 100644 --- a/src/plugins/qmldesigner/generatecmakelists.cpp +++ b/src/plugins/qmldesigner/generatecmakelists.cpp @@ -76,7 +76,7 @@ void generateMenuEntry() { Core::ActionContainer *buildMenu = Core::ActionManager::actionContainer(ProjectExplorer::Constants::M_BUILDPROJECT); - auto action = new QAction(QCoreApplication::tr("Generate CMakeLists.txt Files")); + auto action = new QAction(QCoreApplication::translate("QmlDesigner::GenerateCmake", "Generate CMakeLists.txt Files")); QObject::connect(action, &QAction::triggered, GenerateCmake::onGenerateCmakeLists); Core::Command *cmd = Core::ActionManager::registerAction(action, "QmlProject.CreateCMakeLists"); buildMenu->addAction(cmd, ProjectExplorer::Constants::G_BUILD_RUN); @@ -165,13 +165,13 @@ void removeUnconfirmedQueuedFiles(const Utils::FilePaths confirmedFiles) }); } -const QString WARNING_MISSING_STRUCTURE_FATAL = QCoreApplication::tr( +const QString WARNING_MISSING_STRUCTURE_FATAL = QCoreApplication::translate("QmlDesigner::GenerateCmake", "The project is not properly structured for automatically generating CMake files.\n\nAborting process.\n\nThe following files or directories are missing:\n\n%1"); -const QString WARNING_MISSING_STRUCTURE_NONFATAL = QCoreApplication::tr( +const QString WARNING_MISSING_STRUCTURE_NONFATAL = QCoreApplication::translate("QmlDesigner::GenerateCmake", "The project is not properly structured for automatically generating CMake files.\n\nThe following files will be created:\n\n%1"); -const QString WARNING_TITLE_FATAL = QCoreApplication::tr( +const QString WARNING_TITLE_FATAL = QCoreApplication::translate("QmlDesigner::GenerateCmake", "Cannot Generate CMake Files"); -const QString WARNING_TITLE_NONFATAL = QCoreApplication::tr( +const QString WARNING_TITLE_NONFATAL = QCoreApplication::translate("QmlDesigner::GenerateCmake", "Problems with Generating CMake Files"); void showProjectDirErrorDialog(int error) From 590e19acb70c85ed4daadf3e118f300ccec8eea2 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Fri, 19 Nov 2021 16:54:42 +0100 Subject: [PATCH 06/26] QmlDesigner: Enable environment variable usage Change-Id: I91ada6d7dfa5e8376333c5ef27fbd72a5484e4f4 Reviewed-by: Assam Boudjelthia Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- src/plugins/android/androidqmlpreviewworker.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/plugins/android/androidqmlpreviewworker.cpp b/src/plugins/android/androidqmlpreviewworker.cpp index ced1c06f5fa..007562823a7 100644 --- a/src/plugins/android/androidqmlpreviewworker.cpp +++ b/src/plugins/android/androidqmlpreviewworker.cpp @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -424,9 +425,14 @@ bool AndroidQmlPreviewWorker::startPreviewApp() const QDir destDir(apkInfo()->uploadDir); const QString qmlrcPath = destDir.filePath(m_uploadInfo.uploadPackage.baseName() + packageSuffix); - const QStringList command{"am", "start", - "-n", apkInfo()->activityId, - "-e", "extraappparams", QLatin1String(qmlrcPath.toUtf8().toBase64())}; + const QStringList envVars = m_rc->aspect()->environment().toStringList(); + + const QStringList command { + "am", "start", + "-n", apkInfo()->activityId, + "-e", "extraappparams", QLatin1String(qmlrcPath.toUtf8().toBase64()), + "-e", "extraenvvars", QLatin1String(envVars.join('\t').toUtf8().toBase64()) + }; const SdkToolResult result = runAdbShellCommand(command); if (result.success()) appendMessage(tr("%1 is running.").arg(apkInfo()->name), NormalMessageFormat); From f8f7f47ec3bdc649bfda5d811b2e993078417f2d Mon Sep 17 00:00:00 2001 From: Tapani Mattila Date: Mon, 22 Nov 2021 13:41:20 +0200 Subject: [PATCH 07/26] CMake generator: Make only some files selected by default Task-number: QDS-5561 Change-Id: I1a76385f55681ba60bdb43eafdede6697893598f Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/CMakeLists.txt | 2 + .../qmldesigner/checkablefilelistmodel.cpp | 111 ++++++++++++++++++ .../qmldesigner/checkablefilelistmodel.h | 65 ++++++++++ .../qmldesigner/cmakegeneratordialog.cpp | 95 ++++----------- .../qmldesigner/cmakegeneratordialog.h | 30 ++--- .../qmldesigner/generatecmakelists.cpp | 33 ++---- .../qmldesigner/generatecmakelistsconstants.h | 51 ++++++++ src/plugins/qmldesigner/qmldesignerplugin.pri | 3 + src/plugins/qmldesigner/qmldesignerplugin.qbs | 3 + 9 files changed, 277 insertions(+), 116 deletions(-) create mode 100644 src/plugins/qmldesigner/checkablefilelistmodel.cpp create mode 100644 src/plugins/qmldesigner/checkablefilelistmodel.h create mode 100644 src/plugins/qmldesigner/generatecmakelistsconstants.h diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 901a631a421..7bc91483f9e 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -30,6 +30,8 @@ add_qtc_plugin(QmlDesigner cmakegeneratordialog.h cmakegeneratordialog.cpp generateresource.cpp generateresource.h generatecmakelists.cpp generatecmakelists.h + generatecmakelistsconstants.h + checkablefilelistmodel.cpp checkablefilelistmodel.h openuiqmlfiledialog.cpp openuiqmlfiledialog.h openuiqmlfiledialog.ui qmldesignerconstants.h qmldesignericons.h diff --git a/src/plugins/qmldesigner/checkablefilelistmodel.cpp b/src/plugins/qmldesigner/checkablefilelistmodel.cpp new file mode 100644 index 00000000000..eb8336e9c34 --- /dev/null +++ b/src/plugins/qmldesigner/checkablefilelistmodel.cpp @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Tooling +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "checkablefilelistmodel.h" + +using namespace Utils; + +namespace QmlDesigner { + +CheckableFileListModel::CheckableFileListModel(const FilePath &rootDir, const FilePaths &files, bool checkedByDefault, QObject *parent) + :QStandardItemModel(parent), + rootDir(rootDir) +{ + for (const FilePath &file: files) { + appendRow(new CheckableStandardItem(file.toString(), checkedByDefault)); + } +} + +QList CheckableFileListModel::checkedItems() const +{ +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QList allItems = findItems("*", Qt::MatchWildcard); +#else + QList allItems = findItems(".*", Qt::MatchRegularExpression); +#endif + QList checkedItems; + for (QStandardItem *standardItem : allItems) { + CheckableStandardItem *item = static_cast(standardItem); + if (item->isChecked()) + checkedItems.append(item); + } + + return checkedItems; +} + +QVariant CheckableFileListModel::data(const QModelIndex &index, int role) const +{ + if (index.isValid()) { + if (role == Qt::CheckStateRole) { + CheckableStandardItem *item = static_cast(QStandardItemModel::item(index.row())); + return item->isChecked() ? Qt::Checked : Qt::Unchecked; + } + else if (role == Qt::DisplayRole) { + QVariant data = QStandardItemModel::data(index, role); + FilePath fullPath = FilePath::fromString(data.toString()); + FilePath relativePath = fullPath.relativeChildPath(rootDir); + return QVariant(relativePath.toString()); + } + } + + return QStandardItemModel::data(index, role); +} + +bool CheckableFileListModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (index.isValid() && role == Qt::CheckStateRole) + { + CheckableStandardItem *item = static_cast(QStandardItemModel::item(index.row())); + item->setChecked(value.value()); + + return true; + } + + return QStandardItemModel::setData(index, value, role); +} + +CheckableStandardItem::CheckableStandardItem(const QString &text, bool checked) + :QStandardItem(text), + checked(checked) +{ + setFlags(flags() |= Qt::ItemIsUserCheckable); +} + +void CheckableStandardItem::setChecked(bool checked) +{ + this->checked = checked; +} + +bool CheckableStandardItem::isChecked() const +{ + return this->checked; +} + +int CheckableStandardItem::type() const +{ + return QStandardItem::UserType + 0x74d4f1; +} + +} //QmlDesigner diff --git a/src/plugins/qmldesigner/checkablefilelistmodel.h b/src/plugins/qmldesigner/checkablefilelistmodel.h new file mode 100644 index 00000000000..6721596b635 --- /dev/null +++ b/src/plugins/qmldesigner/checkablefilelistmodel.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Tooling +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#ifndef CHECKABLEFILELISTMODEL_H +#define CHECKABLEFILELISTMODEL_H + +#include +#include + +namespace QmlDesigner { + +class CheckableStandardItem : public QStandardItem +{ +public: + explicit CheckableStandardItem(const QString &text = QString(), bool checked = false); + bool isChecked() const; + void setChecked(bool checked); + int type() const; + +private: + bool checked; +}; + +class CheckableFileListModel : public QStandardItemModel +{ +public: + CheckableFileListModel(const Utils::FilePath &rootDir, + const Utils::FilePaths &files, + bool checkedByDefault = false, + QObject *parent = nullptr); + QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex &index, const QVariant &value, int role); + QList checkedItems() const; + +protected: + Utils::FilePath rootDir; +}; + +} //QmlDesigner + +Q_DECLARE_METATYPE(QmlDesigner::CheckableStandardItem) + +#endif // CHECKABLEFILELISTMODEL_H diff --git a/src/plugins/qmldesigner/cmakegeneratordialog.cpp b/src/plugins/qmldesigner/cmakegeneratordialog.cpp index 59625c6035f..2f910cf0eb5 100644 --- a/src/plugins/qmldesigner/cmakegeneratordialog.cpp +++ b/src/plugins/qmldesigner/cmakegeneratordialog.cpp @@ -23,8 +23,8 @@ ** ****************************************************************************/ - #include "cmakegeneratordialog.h" +#include "generatecmakelistsconstants.h" #include #include @@ -51,7 +51,7 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); - model = new CheckableFileListModel(rootDir, files, this); + model = new CMakeGeneratorDialogModel(rootDir, files, this); QListView *list = new QListView(this); list->setModel(model); @@ -72,82 +72,35 @@ FilePaths CmakeGeneratorDialog::getFilePaths() return paths; } -CheckableFileListModel::CheckableFileListModel(const FilePath &rootDir, const FilePaths &files, QObject *parent) - :QStandardItemModel(parent), - rootDir(rootDir) +CMakeGeneratorDialogModel::CMakeGeneratorDialogModel(const Utils::FilePath &rootDir, const Utils::FilePaths &files, QObject *parent) + :CheckableFileListModel(rootDir, files, parent) { - for (const FilePath &file: files) { - appendRow(new CheckableStandardItem(file.toString(), true)); + for (int i=0; i(QStandardItemModel::item(i)); + item->setChecked(CMakeGeneratorDialogModel::checkedByDefault(FilePath::fromString(item->text()))); } } -QList CheckableFileListModel::checkedItems() const +bool CMakeGeneratorDialogModel::checkedByDefault(const FilePath &path) const { -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) - QList allItems = findItems("*", Qt::MatchWildcard); -#else - QList allItems = findItems(".*", Qt::MatchRegularExpression); -#endif - QList checkedItems; - for (QStandardItem *standardItem : allItems) { - CheckableStandardItem *item = static_cast(standardItem); - if (item->isChecked()) - checkedItems.append(item); + if (path.exists()) { + QString relativePath = path.relativeChildPath(rootDir).toString(); + if (relativePath.compare(QmlDesigner::GenerateCmake::Constants::FILENAME_CMAKELISTS) == 0) + return false; + if (relativePath.endsWith(QmlDesigner::GenerateCmake::Constants::FILENAME_CMAKELISTS) + && relativePath.length() > QString(QmlDesigner::GenerateCmake::Constants::FILENAME_CMAKELISTS).length()) + return true; + if (relativePath.compare(QmlDesigner::GenerateCmake::Constants::FILENAME_MODULES) == 0) + return true; + if (relativePath.compare( + FilePath::fromString(QmlDesigner::GenerateCmake::Constants::DIRNAME_CPP) + .pathAppended(QmlDesigner::GenerateCmake::Constants::FILENAME_MAINCPP_HEADER) + .toString()) + == 0) + return true; } - return checkedItems; -} - -CheckableStandardItem::CheckableStandardItem(const QString &text, bool checked) - :QStandardItem(text), - checked(checked) -{ - setFlags(flags() |= Qt::ItemIsUserCheckable); -} - -void CheckableStandardItem::setChecked(bool checked) -{ - this->checked = checked; -} - -bool CheckableStandardItem::isChecked() const -{ - return this->checked; -} - -int CheckableStandardItem::type() const -{ - return QStandardItem::UserType + 0x74d4f1; -} - -QVariant CheckableFileListModel::data(const QModelIndex &index, int role) const -{ - if (index.isValid()) { - if (role == Qt::CheckStateRole) { - CheckableStandardItem *item = static_cast(QStandardItemModel::item(index.row())); - return item->isChecked() ? Qt::Checked : Qt::Unchecked; - } - else if (role == Qt::DisplayRole) { - QVariant data = QStandardItemModel::data(index, role); - QString relativePath = data.toString().remove(rootDir.toString()); - return QVariant(relativePath); - } - } - - return QStandardItemModel::data(index, role); -} - -bool CheckableFileListModel::setData(const QModelIndex &index, const QVariant &value, int role) -{ - if (index.isValid() && role == Qt::CheckStateRole) - { - CheckableStandardItem *item = static_cast(QStandardItemModel::item(index.row())); - item->setChecked(value.value()); - - return true; - } - - return QStandardItemModel::setData(index, value, role); + return !path.exists(); } } diff --git a/src/plugins/qmldesigner/cmakegeneratordialog.h b/src/plugins/qmldesigner/cmakegeneratordialog.h index 34201365100..8a11666ccb7 100644 --- a/src/plugins/qmldesigner/cmakegeneratordialog.h +++ b/src/plugins/qmldesigner/cmakegeneratordialog.h @@ -27,36 +27,22 @@ #ifndef CMAKEGENERATORDIALOG_H #define CMAKEGENERATORDIALOG_H +#include "checkablefilelistmodel.h" + #include #include -#include + namespace QmlDesigner { namespace GenerateCmake { -class CheckableStandardItem : public QStandardItem +class CMakeGeneratorDialogModel : public CheckableFileListModel { public: - explicit CheckableStandardItem(const QString &text = QString(), bool checked = false); - bool isChecked() const; - void setChecked(bool checked); - int type() const; - -private: - bool checked; -}; - -class CheckableFileListModel : public QStandardItemModel -{ -public: - CheckableFileListModel(const Utils::FilePath &rootDir, const Utils::FilePaths &files, QObject *parent = nullptr); - QVariant data(const QModelIndex &index, int role) const; - bool setData(const QModelIndex &index, const QVariant &value, int role); - QList checkedItems() const; - -private: - Utils::FilePath rootDir; + CMakeGeneratorDialogModel(const Utils::FilePath &rootDir, const Utils::FilePaths &files, QObject *parent = nullptr); +protected: + virtual bool checkedByDefault(const Utils::FilePath &file) const; }; class CmakeGeneratorDialog : public QDialog @@ -72,6 +58,4 @@ private: } } -Q_DECLARE_METATYPE(QmlDesigner::GenerateCmake::CheckableStandardItem) - #endif // CMAKEGENERATORDIALOG_H diff --git a/src/plugins/qmldesigner/generatecmakelists.cpp b/src/plugins/qmldesigner/generatecmakelists.cpp index 52b84d7796d..51c199d5855 100644 --- a/src/plugins/qmldesigner/generatecmakelists.cpp +++ b/src/plugins/qmldesigner/generatecmakelists.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "generatecmakelists.h" +#include "generatecmakelistsconstants.h" #include "cmakegeneratordialog.h" #include @@ -47,6 +48,7 @@ #include using namespace Utils; +using namespace QmlDesigner::GenerateCmake::Constants; namespace QmlDesigner { @@ -118,17 +120,6 @@ bool isErrorFatal(int error) return false; } -const char DIRNAME_CONTENT[] = "content"; -const char DIRNAME_IMPORT[] = "imports"; -const char DIRNAME_CPP[] = "src"; - -const char FILENAME_CMAKELISTS[] = "CMakeLists.txt"; -const char FILENAME_APPMAINQML[] = "App.qml"; -const char FILENAME_MAINQML[] = "main.qml"; -const char FILENAME_MAINCPP[] = "main.cpp"; -const char FILENAME_MAINCPP_HEADER[] = "import_qml_plugins.h"; -const char FILENAME_MODULES[] = "qmlmodules"; - int isProjectCorrectlyFormed(const FilePath &rootDir) { int errors = NoError; @@ -292,8 +283,6 @@ QStringList moduleNames; const QDir::Filters FILES_ONLY = QDir::Files; const QDir::Filters DIRS_ONLY = QDir::Dirs|QDir::Readable|QDir::NoDotAndDotDot; -const char QMLDIRFILENAME[] = "qmldir"; - const char MAIN_CMAKEFILE_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectmaincmakelists.tpl"; const char QMLMODULES_FILE_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectmodules.tpl"; @@ -325,7 +314,7 @@ void generateMainCmake(const FilePath &rootDir) modulesAsPlugins.append(" " + moduleName + "plugin\n"); QString moduleFileContent = GenerateCmake::readTemplate(QMLMODULES_FILE_TEMPLATE_PATH).arg(appName).arg(modulesAsPlugins); - GenerateCmake::queueFile(rootDir.pathAppended(GenerateCmake::FILENAME_MODULES), moduleFileContent); + GenerateCmake::queueFile(rootDir.pathAppended(FILENAME_MODULES), moduleFileContent); } const char DO_NOT_EDIT_FILE_COMMENT[] = "### This file is automatically generated by Qt Design Studio.\n### Do not change\n\n"; @@ -353,7 +342,7 @@ const char MODULEFILE_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectmodule void generateModuleCmake(const FilePath &dir) { QString fileTemplate = GenerateCmake::readTemplate(MODULEFILE_TEMPLATE_PATH); - const QStringList qmldirFilesOnly(QMLDIRFILENAME); + const QStringList qmldirFilesOnly(FILENAME_QMLDIR); QString singletonContent; FilePaths qmldirFileList = dir.dirEntries(qmldirFilesOnly, FILES_ONLY); @@ -467,14 +456,14 @@ QStringList getDirectoryTreeResources(const FilePath &dir) void queueCmakeFile(const FilePath &dir, const QString &content) { - FilePath filePath = dir.pathAppended(GenerateCmake::FILENAME_CMAKELISTS); + FilePath filePath = dir.pathAppended(FILENAME_CMAKELISTS); GenerateCmake::queueFile(filePath, content); } bool isFileBlacklisted(const QString &fileName) { - return (!fileName.compare(QMLDIRFILENAME) || - !fileName.compare(GenerateCmake::FILENAME_CMAKELISTS)); + return (!fileName.compare(FILENAME_QMLDIR) || + !fileName.compare(FILENAME_CMAKELISTS)); } } @@ -494,10 +483,10 @@ const char MAIN_CPPFILE_HEADER_PLUGIN_LINE[] = "Q_IMPORT_QML_PLUGIN(%1)\n"; bool generateMainCpp(const FilePath &dir) { - FilePath srcDir = dir.pathAppended(GenerateCmake::DIRNAME_CPP); + FilePath srcDir = dir.pathAppended(DIRNAME_CPP); QString cppContent = GenerateCmake::readTemplate(MAIN_CPPFILE_TEMPLATE_PATH); - FilePath cppFilePath = srcDir.pathAppended(GenerateCmake::FILENAME_MAINCPP); + FilePath cppFilePath = srcDir.pathAppended(FILENAME_MAINCPP); bool cppOk = GenerateCmake::queueFile(cppFilePath, cppContent); QString modulesAsPlugins; @@ -507,7 +496,7 @@ bool generateMainCpp(const FilePath &dir) QString headerContent = GenerateCmake::readTemplate(MAIN_CPPFILE_HEADER_TEMPLATE_PATH) .arg(modulesAsPlugins); - FilePath headerFilePath = srcDir.pathAppended(GenerateCmake::FILENAME_MAINCPP_HEADER); + FilePath headerFilePath = srcDir.pathAppended(FILENAME_MAINCPP_HEADER); bool headerOk = GenerateCmake::queueFile(headerFilePath, headerContent); return cppOk && headerOk; @@ -518,7 +507,7 @@ const char MAIN_QMLFILE_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectmain bool generateMainQml(const FilePath &dir) { QString content = GenerateCmake::readTemplate(MAIN_QMLFILE_TEMPLATE_PATH); - FilePath filePath = dir.pathAppended(GenerateCmake::FILENAME_MAINQML); + FilePath filePath = dir.pathAppended(FILENAME_MAINQML); return GenerateCmake::queueFile(filePath, content); } diff --git a/src/plugins/qmldesigner/generatecmakelistsconstants.h b/src/plugins/qmldesigner/generatecmakelistsconstants.h new file mode 100644 index 00000000000..59b11723e4c --- /dev/null +++ b/src/plugins/qmldesigner/generatecmakelistsconstants.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Tooling +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#ifndef GENERATECMAKELISTSCONSTANTS_H +#define GENERATECMAKELISTSCONSTANTS_H + +#pragma once + +namespace QmlDesigner { +namespace GenerateCmake { +namespace Constants { + +const char DIRNAME_CONTENT[] = "content"; +const char DIRNAME_IMPORT[] = "imports"; +const char DIRNAME_CPP[] = "src"; + +const char FILENAME_CMAKELISTS[] = "CMakeLists.txt"; +const char FILENAME_APPMAINQML[] = "App.qml"; +const char FILENAME_MAINQML[] = "main.qml"; +const char FILENAME_MAINCPP[] = "main.cpp"; +const char FILENAME_MAINCPP_HEADER[] = "import_qml_plugins.h"; +const char FILENAME_MODULES[] = "qmlmodules"; +const char FILENAME_QMLDIR[] = "qmldir"; + +} //Constants +} //GenerateCmake +} //QmlDesigner + +#endif // GENERATECMAKELISTSCONSTANTS_H diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pri b/src/plugins/qmldesigner/qmldesignerplugin.pri index cc249ece07a..f994bba8a28 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pri +++ b/src/plugins/qmldesigner/qmldesignerplugin.pri @@ -6,6 +6,8 @@ HEADERS += $$PWD/qmldesignerconstants.h \ $$PWD/editorproxy.h \ $$PWD/generateresource.h \ $$PWD/generatecmakelists.h \ + $$PWD/generatecmakelistsconstants.h \ + $$PWD/checkablefilelistmodel.h \ $$PWD/cmakegeneratordialog.h \ $$PWD/settingspage.h \ $$PWD/designmodecontext.h \ @@ -23,6 +25,7 @@ SOURCES += $$PWD/qmldesignerplugin.cpp \ $$PWD/editorproxy.cpp \ $$PWD/generateresource.cpp \ $$PWD/generatecmakelists.cpp \ + $$PWD/checkablefilelistmodel.cpp \ $$PWD/cmakegeneratordialog.cpp \ $$PWD/settingspage.cpp \ $$PWD/designmodecontext.cpp \ diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 4e20e2b52ed..df80c0d0665 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -1011,6 +1011,9 @@ Project { "generateresource.h", "generatecmakelists.cpp", "generatecmakelists.h", + "generatecmakelistsconstants.h", + "checkablefilelistmodel.cpp", + "checkablefilelistmodel.h", "cmakegeneratordialog.cpp", "cmakegeneratordialog.h", "designersettings.cpp", From 6124bd41247622acf692da3a9c5335c9df14a499 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 18 Nov 2021 15:25:02 +0100 Subject: [PATCH 08/26] Doc: Document the designer-developer workflow Fixes: QDS-4506 Change-Id: Iff581a36c699764b91788e166af82faee282f2d4 Reviewed-by: Thomas Hartmann --- doc/qtcreator/src/editors/creator-coding.qdoc | 2 +- .../qtquick-from-qmlproject-to-pro.qdoc | 27 ++++++-- .../images/studio-project-structure.png | Bin 0 -> 51475 bytes .../studio-designer-developer-workflow.qdoc | 64 ++++++++++++++++++ ...esignstudio-implementing-applications.qdoc | 16 +++-- .../src/qtdesignstudio-toc.qdoc | 13 +--- doc/qtdesignstudio/src/qtdesignstudio.qdoc | 1 + 7 files changed, 98 insertions(+), 25 deletions(-) create mode 100644 doc/qtdesignstudio/images/studio-project-structure.png create mode 100644 doc/qtdesignstudio/src/developers/studio-designer-developer-workflow.qdoc diff --git a/doc/qtcreator/src/editors/creator-coding.qdoc b/doc/qtcreator/src/editors/creator-coding.qdoc index 3638a431fb0..1824e720639 100644 --- a/doc/qtcreator/src/editors/creator-coding.qdoc +++ b/doc/qtcreator/src/editors/creator-coding.qdoc @@ -32,7 +32,7 @@ /*! \page creator-coding.html \if defined(qtdesignstudio) - \previouspage studio-implementing-applications.html + \previouspage studio-designer-developer-workflow.html \else \previouspage creator-usability.html \endif diff --git a/doc/qtcreator/src/qtquick/qtquick-from-qmlproject-to-pro.qdoc b/doc/qtcreator/src/qtquick/qtquick-from-qmlproject-to-pro.qdoc index 9a6a39645c7..b1c7c4d3ce9 100644 --- a/doc/qtcreator/src/qtquick/qtquick-from-qmlproject-to-pro.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-from-qmlproject-to-pro.qdoc @@ -29,7 +29,7 @@ \previouspage studio-porting-projects.html \nextpage creator-editor-external.html \else - \previouspage quick-projects.html + \previouspage creator-qtquickdesigner-plugin.html \nextpage creator-quick-ui-forms.html \endif @@ -39,9 +39,9 @@ use them for application development in Qt Creator you have to add: \list - \li Project configuration file (.pro) + \li Project configuration file (CMakeLists.txt or .pro) \li C++ code (.cpp) - \li Resource files (.qrc) + \li Resource files \li Code needed for deploying applications to \l{glossary-device} {devices} \endlist @@ -49,9 +49,22 @@ For more information about integrating QML and C++, see \l{Overview - QML and C++ Integration}. - You can use a Qt Creator wizard template to create a Qt Quick application - that is built using the qmake build system and then copy the source files - from the Qt UI Quick project to the application project. + \note Since \QDS 2.3.0, \QDS project wizard templates generate projects that + can be built with CMake. You can open the \e CMakeLists.txt project file in + Qt Creator to continue developing the project. + + \if defined(qtdesignstudio) + For more information, see \l{Designer-Developer Workflow}. + \else + For more information about using \QDS to create projects, see + \l{Qt Design Studio Manual}. + \endif + + + If you want to use qmake as the build system, you can use a Qt Creator + wizard template to create a Qt Quick application that is built using the + qmake build system and then copy the source files from the Qt UI Quick + project to the application project. You can use the \c RESOURCES option in the project configuration file to automatically add all the QML files and related assets to a @@ -80,7 +93,7 @@ your Qt to be able to build your project. For more information, see \l{Adding Qt Quick Timeline Module to Qt Installations}. - \section1 Converting Projects + \section1 Converting into qmake Projects To convert a project that has a .qmlproject file to one that has a .pro file: diff --git a/doc/qtdesignstudio/images/studio-project-structure.png b/doc/qtdesignstudio/images/studio-project-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..347b74b0a365b08db385741512484b55a3118582 GIT binary patch literal 51475 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 U?~7D+lmPKPUHx3vIVCg!0KrPJF#rGn literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/src/developers/studio-designer-developer-workflow.qdoc b/doc/qtdesignstudio/src/developers/studio-designer-developer-workflow.qdoc new file mode 100644 index 00000000000..45314db2106 --- /dev/null +++ b/doc/qtdesignstudio/src/developers/studio-designer-developer-workflow.qdoc @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Studio documentation. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** +****************************************************************************/ + +/*! + \page studio-designer-developer-workflow.html + \previouspage studio-implementing-applications.html + \nextpage creator-coding.html + + \title Designer-Developer Workflow + + \QDS enables designers and developers to work together on common + projects to develop applications. Designers use the \l{Design Views}{views} + in the \uicontrol Design mode to modify \l{UI Files}{UI files} (\e .ui.qml), + whereas developers use Qt Creator to work on the Qt Quick (\e .qml) and + other files that are needed to implement the application logic and to + prepare the application for production. + + Use the \l{Using Git}{Git} version control system to ensure that changes + are not lost when files are passed back and forth between designers and + developers. + + \QDS \l{Creating Projects}{projects} come with boilerplate code for a + working Qt 6 application that you can build and run in Qt Creator using + CMake. Therefore, you can open, build, and run the projects with Qt Creator. + + \QDS continues to use the \e .qmlproject file format, while \QC uses a + \e CMakeLists.txt file as the project file. This enables you to share + your project as a fully working C++ application with developers. + + If you add or remove QML files in \QDS, you have to regenerate the + \e CMakeLists.txt project configuration file by selecting \uicontrol Build + > \uicontrol Run > \uicontrol {Generate CMakeLists.txt Files}. + + If you use Git, you can clone an example project + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/playground/AuroraCluster0} + {here}. + + The following image shows the example project structure and contents in the + \l Projects and \l {File System} views in \QDS and Qt Creator: + + \image studio-project-structure.png "\QDS project in \QDS and Qt Creator views" +*/ diff --git a/doc/qtdesignstudio/src/qtdesignstudio-implementing-applications.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-implementing-applications.qdoc index ccb3d2999f4..e1f617ada30 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-implementing-applications.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-implementing-applications.qdoc @@ -26,7 +26,7 @@ /*! \previouspage studio-optimized-3d-scenes.html \page studio-implementing-applications.html - \nextpage creator-coding.html + \nextpage studio-designer-developer-workflow.html \title Implementing Applications @@ -38,13 +38,19 @@ the default configuration allows you to start wireframing, prototyping, and validating UIs with very little effort. - However, you might want to use the \l{Text Editor} view - sometimes to edit your component files (.qml). If you use - JavaScript, you might also want to debug and profile you - UIs to find and fix problems in them. + You can use the \l{Text Editor} view to edit your component + files (.qml). If you use JavaScript, you can debug and profile + your UIs to find and fix problems in them. \endtable \list + + \li \l{Designer-Developer Workflow} + + In \QDS projects, you work on \l{UI Files}{UI files} (.ui.qml), + while developers work on the .qml and C++ source files in + Qt Creator to create an application that you can build and + run on target hardware. \li \l{Coding} You can use the code editor in the \uicontrol {Text Editor} view or diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index dc8dea8f13f..52ba3915318 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -207,9 +207,7 @@ \endlist \li \l{Implementing Applications} \list - \omit - \li Using Flows in Production - \endomit + \li \l{Designer-Developer Workflow} \li \l{Coding}{Cross-Platform Development} \list \li \l{Writing Code} @@ -245,15 +243,6 @@ \li \l{Debugging a Qt Quick Example Application} \li \l{Profiling QML Applications} \endlist - \omit - \li \l{Designer-Developer Workflow} - \list - \li \l{Reusable Prototypes and Full UI Implementation} - \li \l{Optimizing Specification and Implementation} - \li \l{Parallel Development} - \li \l{One Toolchain} - \endlist - \endomit \endlist \li \l{Advanced Designer Topics} \list diff --git a/doc/qtdesignstudio/src/qtdesignstudio.qdoc b/doc/qtdesignstudio/src/qtdesignstudio.qdoc index 3a1306300dc..22057fb4105 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio.qdoc @@ -87,6 +87,7 @@ \row \li \b {\l{Implementing Applications}} \list + \li \l{Designer-Developer Workflow} \li \l{Coding}{Cross-Platform Development} \li \l{Debugging and Profiling} \endlist From 6eec40264fe5dc3935bc9b3b1d85ba4e9916c4b3 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 22 Nov 2021 12:50:45 +0100 Subject: [PATCH 09/26] QmlDesigner: Fix SVG paste action Fix an issue with the SVG paste action where the SVG uses multiple classes in one class attribute. Change-Id: I332ae217cff6b2215c3f63b1d2433a54933f404a Reviewed-by: Christian Kandeler Reviewed-by: Thomas Hartmann Reviewed-by: Qt CI Bot Reviewed-by: --- .../qmldesigner/components/componentcore/svgpasteaction.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/componentcore/svgpasteaction.cpp b/src/plugins/qmldesigner/components/componentcore/svgpasteaction.cpp index 7c29fcd6429..ea841a42da9 100644 --- a/src/plugins/qmldesigner/components/componentcore/svgpasteaction.cpp +++ b/src/plugins/qmldesigner/components/componentcore/svgpasteaction.cpp @@ -951,7 +951,7 @@ void flattenTransformsAndStyles(const QDomElement &element, const QStringList classes = classStr.split(" ", Qt::SkipEmptyParts); for (const auto &c : classes) - applyCSSRules(cssRules["." + e.attribute("class")], properties); + applyCSSRules(cssRules["." + c], properties); } if (e.hasAttribute("id")) { From 60f2b8177379abf4549f0028e14ccaba4e7c258f Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 23 Nov 2021 10:44:37 +0100 Subject: [PATCH 10/26] Doc: Fix method to ignore Boot2Qt for auto-linking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removed the backslash from \Boot2Qt, and added Boot2Qt in ignorewords in .qdocconf file. Created explicit links to the Boot2Qt topic in this manual where needed. Task-number: QTCREATORBUG-26278 Change-Id: Ieac851f711d7a2cd4d7ae034c3b81ab47c5fbc11 Reviewed-by: Topi Reiniö --- .../config/qtcreator-project.qdocconf | 1 + .../src/analyze/cpu-usage-analyzer.qdoc | 2 +- doc/qtcreator/src/linux-mobile/b2qtdev.qdoc | 22 +++++++++---------- ...creator-projects-settings-run-b2qt.qdocinc | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/doc/qtcreator/config/qtcreator-project.qdocconf b/doc/qtcreator/config/qtcreator-project.qdocconf index ed35b4e41ee..b190e87ea12 100644 --- a/doc/qtcreator/config/qtcreator-project.qdocconf +++ b/doc/qtcreator/config/qtcreator-project.qdocconf @@ -4,6 +4,7 @@ url = http://doc.qt.io/$IDE_ID #Words to ignore for auto-linking ignorewords += \ + Boot2Qt \ macOS \ WebChannel \ WebSocket \ diff --git a/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc b/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc index 2e931ee0499..5c668c1163e 100644 --- a/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc +++ b/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc @@ -460,7 +460,7 @@ \list 1 \li Perf events may be globally disabled on your system. The - preconfigured Boot2Qt images come with perf events enabled. For + preconfigured \l Boot2Qt images come with perf events enabled. For a custom configuration you need to make sure that the file \c {/proc/sys/kernel/perf_event_paranoid} contains a value smaller than \c {2}. For maximum flexibility in recording traces you can diff --git a/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc b/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc index 5a4943030ee..e9d4e470f9f 100644 --- a/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc +++ b/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc @@ -33,22 +33,22 @@ You can connect \l{Boot2Qt} devices to the development PC to run, debug, and analyze applications built for them from \QC. - If you have a tool chain for building applications for \Boot2Qt devices + If you have a tool chain for building applications for Boot2Qt devices installed on the development PC, you can add it to \QC. You can then - select a \l{glossary-buildandrun-kit}{kit} with the \uicontrol \Boot2Qt + select a \l{glossary-buildandrun-kit}{kit} with the \uicontrol Boot2Qt device type to build applications for and run them on the devices. - To be able to run and debug applications on \Boot2Qt devices, + To be able to run and debug applications on Boot2Qt devices, you must add devices and select them in the \QC \l{glossary-buildandrun-kit}{kit}. \section1 Enabling the Boot2Qt Plugin - To enable the \Boot2Qt plugin: + To enable the Boot2Qt plugin: \list 1 \li Select \uicontrol Help > \uicontrol {About Plugins} > - \uicontrol {Device Support} > \uicontrol \Boot2Qt to + \uicontrol {Device Support} > \uicontrol Boot2Qt to enable the plugin. \li Select \uicontrol {Restart Now} to restart \QC and load the plugin. \endlist @@ -93,7 +93,7 @@ \section1 Flashing Boot2Qt Devices - To flash the \Boot2Qt image to an SD card with Flashing Wizard, select + To flash the Boot2Qt image to an SD card with Flashing Wizard, select \uicontrol Tools > \uicontrol {Flash Boot to Qt Device} and follow the instructions of the wizard. @@ -101,7 +101,7 @@ \section1 Configuring Connections - To configure connections between \QC and a \Boot2Qt device and to + To configure connections between \QC and a Boot2Qt device and to specify build and run settings for the device: \list 1 @@ -109,19 +109,19 @@ connect it with a USB connection. \li Select \uicontrol Tools > \uicontrol Options > \uicontrol Kits > \uicontrol {Qt Versions} > \uicontrol Add to add the Qt version - for \Boot2Qt. + for Boot2Qt. \li Select \uicontrol Tools > \uicontrol Options > \uicontrol Kits > \uicontrol Compilers > \uicontrol Add to add the compiler for building the applications. \li Select \uicontrol Tools > \uicontrol {Flash Boot to Qt Device} - to flash the \Boot2Qt image to an SD card with Flashing Wizard. + to flash the Boot2Qt image to an SD card with Flashing Wizard. \li To deploy applications and run them remotely on devices, specify parameters for connecting to the devices over the network (\QC automatically detects devices connected with USB): \list 1 \li Select \uicontrol Tools > \uicontrol Options > \uicontrol Devices > \uicontrol Devices > \uicontrol Add > - \uicontrol \Boot2Qt > \uicontrol {Finish}. + \uicontrol Boot2Qt > \uicontrol {Finish}. \image qtcreator-devices-boot2qt.png "Boot2Qt Network Device Setup wizard" \li In the \uicontrol {Device name} field, enter a name for the connection. @@ -139,7 +139,7 @@ \li Select \uicontrol Tools > \uicontrol Options > \uicontrol Kits > \uicontrol Add to add a kit for building applications for the device. Select the Qt version, compiler, and device that you - added above, and choose \uicontrol \Boot2Qt as the device type. + added above, and choose \uicontrol Boot2Qt as the device type. \li To specify build settings: \list 1 \li Open a project for an application you want to develop for the diff --git a/doc/qtcreator/src/linux-mobile/creator-projects-settings-run-b2qt.qdocinc b/doc/qtcreator/src/linux-mobile/creator-projects-settings-run-b2qt.qdocinc index 167de0044ce..864a449bcc6 100644 --- a/doc/qtcreator/src/linux-mobile/creator-projects-settings-run-b2qt.qdocinc +++ b/doc/qtcreator/src/linux-mobile/creator-projects-settings-run-b2qt.qdocinc @@ -28,7 +28,7 @@ \section1 Specifying Run Settings for Boot2Qt Devices - To run and debug an application on a Boot2Qt device (commercial only), you + To run and debug an application on a \l Boot2Qt device (commercial only), you must create connections from the development host to the device and add the device configurations to \l{glossary-buildandrun-kit}{kits}. Select \uicontrol {Manage Kits} to add devices to kits. For more information, see From 37a10f4a2ba1805f90bdfbea5b805f2d4f2d9270 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 23 Nov 2021 10:26:36 +0100 Subject: [PATCH 11/26] SdkTool: Fix path handling and adjust expectation Amends 1a6e6825e6e253. Change-Id: I0e0c1bf46951a05d360032e01c15ff8adb31ac33 Reviewed-by: hjk Reviewed-by: Christian Kandeler --- src/tools/sdktool/addkitoperation.cpp | 6 ++++-- src/tools/sdktool/addqtoperation.cpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/tools/sdktool/addkitoperation.cpp b/src/tools/sdktool/addkitoperation.cpp index d73dcc9c5db..d5de0562bfa 100644 --- a/src/tools/sdktool/addkitoperation.cpp +++ b/src/tools/sdktool/addkitoperation.cpp @@ -446,7 +446,7 @@ bool AddKitOperation::test() const // Profile 1: Make sure name is unique: map = addKit(map, tcMap, qtMap, devMap, QVariantMap(), "testId2", "Test Kit2", "/tmp/icon2.png", QString(), 1, - "/usr/bin/gdb-test2", "Desktop", "{dev-id}", "/sys/root\\\\", tcs, + "/usr/bin/gdb-test2", "Desktop", "{dev-id}", "/sys/root//", tcs, "{qt-id}", "unsupported/mkspec", QString(), QString(), QString(), QString(), QString(), QStringList(), env, KeyValuePairList({KeyValuePair("PE.Profile.Data/extraData", QVariant("extraValue"))})); @@ -456,6 +456,7 @@ bool AddKitOperation::test() const || !map.contains(DEFAULT) || map.value(DEFAULT).toInt() != 0 || !map.contains("Profile.0") || !map.contains("Profile.1")) + return false; if (map.value("Profile.0") != profile0) return false; @@ -475,7 +476,7 @@ bool AddKitOperation::test() const || !data.contains(DEBUGGER) || data.value(DEBUGGER).type() != QVariant::Map || !data.contains(DEVICE_TYPE) || data.value(DEVICE_TYPE).toString() != "Desktop" || !data.contains(DEVICE_ID) || data.value(DEVICE_ID).toString() != "{dev-id}" - || !data.contains(SYSROOT) || data.value(SYSROOT).toString() != "/sys/root\\\\" + || !data.contains(SYSROOT) || data.value(SYSROOT).toString() != "/sys/root//" || !data.contains(TOOLCHAIN) || !data.contains(QT) || data.value(QT).toString() != "SDK.{qt-id}" || !data.contains(MKSPEC) || data.value(MKSPEC).toString() != "unsupported/mkspec" @@ -501,6 +502,7 @@ bool AddKitOperation::test() const || !map.contains("Profile.0") || !map.contains("Profile.1") || !map.contains("Profile.2")) + return false; if (map.value("Profile.0") != profile0) return false; diff --git a/src/tools/sdktool/addqtoperation.cpp b/src/tools/sdktool/addqtoperation.cpp index 7f256bf3279..7af41db1218 100644 --- a/src/tools/sdktool/addqtoperation.cpp +++ b/src/tools/sdktool/addqtoperation.cpp @@ -299,7 +299,7 @@ QVariantMap AddQtOperation::addQt(const QVariantMap &map, const QString qt = QString::fromLatin1(PREFIX) + QString::number(versionCount); // Sanitize qmake path: - FilePath saneQmake = FilePath::fromUserInput(qmake); + FilePath saneQmake = FilePath::fromUserInput(qmake).cleanPath(); // insert data: KeyValuePairList data; From 965fd595bbf047aed833388fa17a5d3bee03af04 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 23 Nov 2021 13:16:58 +0100 Subject: [PATCH 12/26] Doc: Use HTTPS for a link to remove message about broken link Even though the link with HTTP automatically works on at least some browsers, the doc snapshot server prints an error about a broken link. Task-number: QTCREATORBUG-26278 Change-Id: I5fa030b4b6148dbebeeca9c7dccc0d77dc929243 Reviewed-by: hjk --- doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc b/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc index c039d22c379..0493b0dc278 100644 --- a/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc +++ b/doc/qtcreator/src/howto/creator-only/qtcreator-faq.qdoc @@ -282,8 +282,8 @@ \uicontrol{Application Output} pane. However, only one output pane tab may be open at a time or the output is not displayed correctly. You can use an external debug output viewer, such as the - \l{http://technet.microsoft.com/en-us/sysinternals/bb896647}{DebugView for Windows} - to display output from GUI applications. + \l{https://technet.microsoft.com/en-us/sysinternals/bb896647} + {DebugView for Windows} to display output from GUI applications. \section1 Questions about New Features From e56847f200aaaf9bec059968915fd2815934cd87 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 22 Nov 2021 16:54:45 +0100 Subject: [PATCH 13/26] Doc: Update info on Beautifier Options Use the file names for each tool and update screenshots. Also, some small text edits. Change-Id: Id8678a7d482f1c33fb1ad779e3d660b88090bd9f Reviewed-by: Reviewed-by: hjk --- doc/qtcreator/images/beautifier_editor.png | Bin 9882 -> 9282 bytes doc/qtcreator/images/beautifier_options.png | Bin 31375 -> 10500 bytes .../qt-creator-beautifier-options-general.png | Bin 6397 -> 4636 bytes ...creator-beautifier-options-clangformat.png | Bin 0 -> 8949 bytes .../creator-only/creator-beautifier.qdoc | 37 +++++++++--------- 5 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-beautifier-options-clangformat.png diff --git a/doc/qtcreator/images/beautifier_editor.png b/doc/qtcreator/images/beautifier_editor.png index 52d0ded29f032665497aef83a3c157cdab7608b7..cddae8b5412ea027196293ed3161a4d031dccac0 100644 GIT binary patch literal 9282 zcmeAS@N?(olHy`uVBq!ia0y~yV2Wj6VBEsN#K6GN?##NHfkB1S)5S5Q;?~={Z~JAh zC*CjIr+KTs@dUSb)j~DhoRj=(Wjm`jop@TLy7u~%ty99ZZ%xYaTH-OGMe=q@uDI%! znue>h3R4_SvktykRkdMBTPgD~Gmc<>-&+dXp0+z|49|R|;@5r1bdH6`m%TePXXftb=FiXEv5fBXG3e(xY0J&c-e~$@;nAHlcOGqj z!!f^+^VXiN@lRHKdpJ#ie?JQY!~Q?1C!%(8FgUc&{Q3K-5(9(myX*a23=ZdgnzKzOH@s#lY}SR_M-(zt`XGc=`Q#S^fKe>;HYpuK)JE{-5~& z50mYG%ziKP=c2kZOWlLt{B@t7|9^Y_|3Cfahps<1`s>ZRzdiNzzRzFx?|JuTwyzr7 zJ)7#g)A&x_|E_+!@0#@HqcMkm&ofZW(v;FnFa>fJCRG!?o|8@NT5_PG`!tLjd zZnydVO?zJT@yYd{p1%M0s9&z)@rg6#;`@GGUSI!O{C@TS?{;6_*ME|~|7Z9A$_MT8 z{DnJS@8-6SzaKoidtuSOy!-oJztVbkZ0C(tPr5BCKEJv7+4=2?eJ}S!y=tn-b>4X6 z&k6(6)p2j%MJ+F4JYeOLd^jLyO85S6m%iTrabJA?kBhC77T6p!!dfsBg)z8AGXDP3JImvW2J`KsiWodc7L_5|NFQ8^WF1p*AL!ZZ@b~s_WZhE{(kX)e!k!PrM_LY{mWDY%%|-m!^wdxx6`Q_inGH9cJq@s;^C7z0Kk+>n~-N4Tg(1 zR%*m~>7A?j`%eDv+u82>{;tgbww>;`%`Rf;t4#ll@ z%J6tlzV~Uhmk~;=rBLv)<;Noju2517pa% zd%0m(&3;s=FAKN&@OJ9A^t*><=S6RQ8?BeKYOjTY`0LxH78G)QN_IgZL&D+K zN4LH&PWyg$P0i2S_W$plTYvul=IQI|za8KI_kR7iwdHfF-_Mk<`NzJ$BKi9D?=io3 zZ$DSF{N29UE0p!t)#@vXzs~w~dQx|1OZ?&(nMDUHGOvqg7v~l1e4^CgE75gQK74BT z!ScDc|Gk<2_qqMwdi#H;>wm0%u+jd{^~6W^^_jOn&977S;kkeL$G`i3F7C6p`S$O9 z%?f|jn01lu@7@2Vu4LY1d->+4MT@$27wRnwmr`}O=o|5>v?nd+UjME1+ibz_*7xL_ zt&Q|}`%dd?_q2PKJ7WHJGc!mVinMnfbK5zi`fdLH@8AEum;ZAvzV`9;xIO!xhaar} z-K@@bB+0)tYVT1s%Z=avPSt-RDm=OJvb{Ka&dF)Dzk~A6zrU)vul`b{``cRczuVUe zKJ7anWNrSp_t=qlTI&txDOOkiFXGkVW60qM`@Hwx(Va6Diwu9*Zb^D^A0u#C!7*4n{FwFXN;n5tZ zrUtI>+mEYmQ)XZ|ajP4t+=3Yb(zAx?{$&ORg)IGFarO)h((&CdT%jw*3IRboguR9qM?({}W9n0$7(U-2gCMRzlI zTj?)WIIBL@I-QZ>hR@C!RTJl=Fa5RY>#n&?ODnFvVqwU+7n8I1%%!z9sj7Jb$0p9K ziZv12D#6Gw+g3b!opGHkes;X_clefZgSY zvXg-!Cu>&9%orAi6QELh0w`=0#6hYtj9_E{1yatom_0?`J6FH^%j7xfb^eJ3ywkfA zH?RA*e81PEC%_-FcR!8`HaDR6PCi^s@9PsXSd2qvCn$Xo}vm;3$1R+r5__Jz9BN>+|;b z`(>Y!zHk3MpKtxS)2@@A%y{-ln`B9)+59azUu(X5(|WsI@7q*% zb`}@D1(|Znb*BeJtERZ;q$%Aho~K+VsT{WxUw@}oDMt+MaR!E*lqX6I3^>9Hln9~H z4QHoy7Z(?oGcs(L$r-sVZ6^oA0TocX28Ag|-LK8*=jFh)Y`a{QhaMBdg@*?knV|+d z7>U1+jM$*e!0_Tp(vD*p?hN2Ov13Who&9@?K0aA@>HO*6?B`e+4$Rmle%f(HA1E$o zOo_Qu`YB1U)pVnVI3vU4N!^78Wyywr_B(&=wul(F&tA6zumcGzjU|j@vJ+O-pmIl zOuL;oGC!3H>7U=1ljScnP2Wvye`z!yL&D+bk9ObxJ8#)$alwkxi-uK&l|PdnaV2fv zUt(E$zqc-g;eZ4vaFXYD&tql>HzHt}G2(R0oY}K?b2BuY^*OQ0^z_jU7V3fw4ZgmU zbtZQ+Fzk#FFbdRTVtA6&UM(i}M2W#cFH4_^;mIOUDn81%a|a|OCv?w^sd+Nd9jxG# zD?>xf6p&_6SQHh;7Jt03(Ak@TA%@S1Eq6x@&+M<;ve&747X9UwR6&aKr%IlaiYBUf z?(~?nBu2%vXj4()uMd-#i?7>RcKo9L+=!AV9+QOUbq62!lbL(&QsK)ReC~ZJmM3>g z-0C>Lw_sgC=6YrKNpoI&dvqx1TIa8AM=x6idQK`TeBT)+y>W6MINkfnRx7=8slD{o zb<&e1@$ojb6nSH^pxwQ zB{6TFJesKN{sfx8mc)P(>`o1F&q+mrdVN<6TEc#3+Qpxei!ZR;mYBHmv&BNw+COjZ z3C~?Fa<%@WN&SqAS@T)%C&aEcv)TWz)AwIWXTgH&uQ?CjRer=6I;Hzq{FxY=xvLza ze};251ca8R&%0M>S!5`^ZprRY>t)M6E3MI6zWGpDe@NguorcFkm(IL>S?H{o6{~vh-tLt@+4f9$p?S7if3e*egY*#D^xkdzRz}){*hUq7TQ|?| zXqoQ)+gq=0-ugC3MELY?%UN}6@~4UKR=u?$DQW2o-bZ)?Z z%~zIscXKmjXB}Ctv2)!q%Zc)9f;=bBzwu*ppvlC=|JriAe?85MNVsP>;qAkB@4V`| zZW))Guiw4Szv~d+0K2Khq}N@2IfZ#w z?zuiZ!Iv|4dB6AHXDqv^d*6?Eo5nJ7G?J9>Mcp7?A#E1Q3tbyi*9ap~m$Pp_-C2>EW= zv9CLOe%Or=;YCqPzrA!`?f1q{@&@})MXnrWFEd999T-O^iW+4>PD$Hmj#%Mxvr?zfI4@y-@ox3X4;OuW{QoI_;j}lu8=%+s=~vR> zkK*0-Kdwa<{4ULpUjBmhtoF(k)nWaA^{w=7;XdEq77OV)jI(J!hm zn&0f|)qgG5$7R75pS>{V&W4>9M}Bl){Qlw7u4T{jS}#pK^e3(H-FM+hqE%n+?%0#X zJ)LK9Th7+B_4iUIf8TlaYa4I;!XxE1PwxA#xc4}?xOPkY`M6iF8|Kd1?pVEUUEjI) zhMo1d=SJMptrYBg7b{U0`*WhM`Kq>^>`T7iTdFpHQ8IV;Wna5FE2WzrIfrdtm+`*z z{KiLq7e9p_W?Xyq$D^v6-w_&4Z`C(Hf4BKk>z{Y~toH0EKYpv;a_W?B;eUH(AGBTZ zdcSA2_%gOFZJt4T>z>z|3ny-O-1#u?;q8qTZ;njn-KXL_sVJ}-)S%c3F5$q;r|_~b z##c{nVz-Lt&K-3-cdR@X530H!gIX4ks-8R&0I@7N-yUs)Fm_rTS$x=Y(w;XvcjTU* z*lX}l$#ar$VeQ6;Ke|;s`|9;xxu}9`esHs7*Lyd;Nh(|6?HF)5dy@0iQFpn@l+)MN zMuQzu26Y^m11_DBOJi6I2h_d*)hD2q(oVUZKd#M`+zD!N%#Hc;;S9u}XMa~zBZ~Aj zJ^NS4PgT(r?~WPfwn2cH`WJ+;qRQ z>)uwmZ}fTQCtvr;yM4LYJ25?-xz+DlAKc1I(I~CnxLo{NLH6=K+mBA!8@;Q|Zyrzh z_~qEWXM5GJee-yF{PoFX>nD#~o%O{|N0Jsx{pnnM*?0Bthgv)Ks_U)I;wbgHELzG{ooStQ{EC*@ zrvFLp8cv66jrK0SXt?*ui2v1cbA=MUEZfJzH`Ul zE5Yee-WHqhaL%}Ld$;{FJ^2^&9d7fN2`!p?aOGPc{mq-dy<2wfd*;lg=9y)6KWi4b zESIy5+wQ!{l0PT@bKB!q#i$R?>R!L^{NK5(HqX~;;vt*Pf5*aD1K%2-Sw6>lW5^Z9 zqiv#7V^=?V{Zj7CEai*ezGu&R5`EP$KKvd-R>*x-rZo{o=JQThYuD=zM60cpHJT@8MOXZ|37S4}#a$oKkx3 z^V?NZPAhX_mj1Hq_crX6@Vfr;z?pmV#6Ne7%blG*ll{ZYyj}VB6$$&|wKs?y=$$oh zaYpp?^Xbv`>$;cEzIHk=cShgUF#fowfA+>!J{65z?!@`kdwY@2Ev1h;iv=a#-deKv z%)7KVGiK%8GL5>tenx1)+$@bOp096Rbsp*tTfH%OcbL8>G}DIVPRkb;;UH zHa2j@`c0aWx%KBc-M4SJxp3v14`u(JJ~x@m?^AeBVCw3!__UZmU3W9{aqqjGy+ww5za9Iy`ENpoRN3sFR3=U(-lTM~2l-M)L4kGU4jPI=n3`}g$t%Nx4IBVL`6S;V|{ zd(lhJzJp6&pM7x4%yHj}q?ucJueG^qTtD=4+LE%I*uqbLx1Gwny)57V&ALS#cUz~N zx_bA}EZOL&gc_6CraNxupZ|8_;TvZAjB-`Komu7!64zJn+;3uEwv^vtqjS{rrpLGT zTgB~^_@p_ryYp3b>CPKbX&%dhBkR*D3YUrGD4#$2=56HV0yDlJ_fn7L&zw8={H}=K zch!tjstvUtYvg}_`%*J2!1VhSyV_le)vs5kOq!atXix0~zRr}XRw<(KkwrhF0{>tB z|3oNj^<%%v$3I^mUVqW_^sH?Oe>I)5Ztps{q03rpb93CSTP4+okxxPe411_)A@PQ&$p5H zGk?Eb`|gpA`2HI^uUSa@zPYD-dFI0dQ8jsdGW!jFy+6>xxAbuE&$Z^+mHsa0=PbSa zWX07_F?Z~zg@4g^nLEM#dzg0jj$JE5F8@8xd`dLZpa0&0Ei1nGh|RvcQ-5Vhv;L8* zNxNd4@0_}L`T3mZ?!LxWvY#LBm=oc}>acm1`K>nZ9qucq9KY-D@iT7Tif*Hg$==qh zYR+AJ5tTVDMLjB3Sy9|yCv<&%_&dS3);>RZsul$|2EBxy()!=FJ%=sal`I*~&H(#jQDn8-1~mndtN)|()nh)tTXpo1y;Xzl!#$}>U%OPJ~CwL z^88(zcVml6-aF+_y;baFdt@(XXLL@NwcV_eV`_Q%ozp6F5({_T_x;~lG_~6xL3+{M ztur|G->a5dy?y(Y)PkCu>rdXx-gW$wbMRZUe!h%f%VrXWL=Djw-9IeF9PtKG^M%Vyim*z93fwd?z2NxcHG?NfViA3b_@TDQvaYq#XC1lC-h zIHh~_E8`mF!rSN4;skeIlvBFA{AS==1C^&rCr|eJEcAeNgODrUDc!H_&t3Vo+e|qs z=SNZz$LIWcYu}plO4uM7{?3)1ULx6k_gP{Hg5N5}M=*O;qr@z0qZFZY%C;Vk}x zI|_6EeEG1f|BBSv4R2J;{q@Y`>kTd0677V7zwG*X_)M5R)1wD!*T4Nr+9qc){l>Xh z9g|+)j^pXSJUe%9MQzJYiz@;>FPGTB^Ysfg!L zh~Bzgdv8>*9Jw_u_3efZ)5qqm6P5Kv7-M7ui>C4!&vW~(xaIYSfO&1s2H$M%?l771 zAgD5+`-?zNq>gLzw^BLjy~_12DQ6{^jyh{zX8s!cdt2M#xz~9PO4wKK(FoUGVO7jm zA(VFK@htJ3%VL5rUN-H1o;1IYx#-fd+~qMc&ClD^k1NP{>hT#eCB<&J!rMLL)X|*G zN@f$=MNf9sW^CF#;oIf&hvg#bO6sP(&ie7?!zqa`fzy^GFJ9jDUb1_^6@x4zg}|x> z`(FKN_G4P*d*hOY`_CIEmX`9$&9>XgXu5az-p5>Xv+t#-KYiqO{^&c2mc=KIE_8SB z(KoZyNhjSqA9T?Bdn)O&qQvQ&0dm5NFD_p3yQd@MC97}W zzgcoC@@GV6204aCmEQZLeZS;#hRlkxJ)y^J*X`M8WDxebSN-XuV`q=Pl4x<&e|_-N zjDWLkQ9kEx*03CzRd>biu+p?-eQA$P<;s(lz1AgH8{Yq{c>R2RVafI-W^zr2Qjhe! zFK3;9xL{i3>hw>Yi>q&+UHt0mky$+Fl9g=(?iYMN@kO@Da96p>t53S3We$J7mt6|8 zat(egF826Cs}}ZNlY*FTI#uT z$H{%m4K?pic_4NF?&claw_S7#((}vH>q}yBS*(@U_FlYA?WF|2onO(UV#G)asO5_o zTmv_LQAP=u#N_N*Ovbg!%ZOja2QF_lh zFP%E^^sjVU{*l{eZ}J%#iVC;xypdOtJ11dEH-mz>e!kwZgERKN5pYd4+-kaU`Ocel zcdIt;H%^|RTkpSd*}S7$?iUqV&eDDL;O#oiUmKrqznG?CwtH6rLqm*=p7`bmolKi- z{l8kp#pWuV^sd#^ZhY~!XZiH} z`c8Enee+!XxY&1IYu~!R)!ThLEI0S`r%y*;K!c3X z0pshs;{38!TUZzlJXJ`!Fzad3k9^;0qGqpiug7>#dh$!!$U|?E3L?5Esi2Lkp{54* zHrN;!-VPMnxH7mu=83JqhxN1wI)HGejrw+i#+T7jKCT`kF_xo-B!Pg&mhG@vepK+u zqlM1x(-;_b$h7d>DgcdMySbrFw}5gTbi5igBMchM-5^->@oJAq)&^s^a}JH1zt4n7P3UGY@Vry=;bg3O{OsSK z;`=u)Y%rJm;dEDS$E#JV*X?-J6)&0X#JGOXC$F6x49(6Tx1FCedv9^#`C9&ad%qt} z&eVv~cyK2D-)Y}|n~6L}KfM3;_I7%D`hD|dEsI*2p0!TxW(e@k@VHy}-1hzb;`_SR z>Bnyb90)iQaO0I62k*)Wl9w-EelM5p#OQ43ocL6U;fwMY!*@Hs|BGJsPNEtlwz^v3 zi{ZV(NtsNWpcWr;k^7?1m+Uw{34fy@l{oKB7n?4;%ciYapa7O9Qir;Uy@6YD_aUgkp z3HQ%a$?_G~ZxwyH8LDq060FDM&>XYpd9(RFD`Thr_JEqVZ`g0!r~Ul?>bd=;s=KF- zUi;F&cY?pn)P*yY&m0X?v#Z|n3Ve!=Iu4VvnxBL&VuFP=i`et<^LR7 zt*u|HQ~mel^UX1LO5Z<^kFI=pdGVdLGXZCI#q4>z?e@K$TJLJ!Je``}zo&SLOl8^A zr^nyLTvc*1e5%A?a^mRj@Ap33dl~ri;PLp_%8$uQJNf6;njT54__$I>-2VTgQ>**$ zTkqn1A=PEMDrQap(Ftj?R{Qgh-cFvoGVnrbx5n8U){c5i2dbVvnp^!XZ+B`{$h+D< zSHtDwHGFG66t7=r^S|?h(vu{&*I!TY9$j<#=**cj%h$BsonQO&>G^l>%#S}z54%;| zBCf4{Ugn+8>pfiW<2Cga=G#}_tP=Iz83J+S$)mrw-Q83i^6u=d?)`zYejIonSNpcO zx_n#F$F1jUmCjuFSGc7usn0;%nsYkW5xz>jXCJTC#@1GwsVe&b{CI|7(4jyYJI%{*w6im@~`nf1dqN@9OdQl26lGlCC{{v@Uk{ zy?tI*e;41CFR%Z$xjkCgdD_;xnw_7u=70J2Wc}l#q06SI^Z0|4;K7|g{{5_8zdQ4I z#@`>^mCGM|mOsBdedmw&V%GL@zrDWQJ+|9@8!tEo`0a9?yX@nV>GLa}J+<3;Em8{pZMWgW zJn3!ydqGKbNAdG>*=h{|K07%Wc#A%s+kL{jjb)%o8iR(HOT)MMpZB}J@Auu? z_pFb#F{K@isam>={obc(+jDMjdpj*UPx5^L4=WEOw_WI${`UXcm5<_1X=mQu6OIaj z-PldF&$vYv-!|^VZy1r z1CsI1jFT7MP+Q`f;qmuWgfQ0)6%jm>p`eL7w<+Dx+w-=9=H|AE+uMN4uC1W5Olaqh z^xM~RtNU8o9!E$2pD!aPIjLGqtdD`=*sTBjv%V})G2bl~!@$76;OXk;vd$@?2>@&d BI&1&{ literal 9882 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 diff --git a/doc/qtcreator/images/beautifier_options.png b/doc/qtcreator/images/beautifier_options.png index 00b65a9fd9e35850a354432712f099161be69f78..9fe23ef7df93e75ae6651b61ea2998af34197fb8 100644 GIT binary patch literal 10500 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≪in1|CZ{o6Hp<+#VZ(>R{PusMK0G+syzBj0 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 I&MBb@0B^N}Y5)KL literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/editors/creator-only/creator-beautifier.qdoc b/doc/qtcreator/src/editors/creator-only/creator-beautifier.qdoc index f8699d0da24..3debec6131b 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-beautifier.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-beautifier.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -82,7 +82,7 @@ automatically beautify files when you save them using the tool you select in the \uicontrol Tool field. - \image qt-creator-beautifier-options-general.png + \image qt-creator-beautifier-options-general.png "General Beautifier options" \li In the \uicontrol {Restrict to MIME types} field, define the MIME types of the files to beautify, separated by semicolons. Leave the @@ -101,7 +101,7 @@ \uicontrol Uncrustify to specify settings for the tool you want to use. - \image beautifier_options.png + \image beautifier_options.png "Uncrustify Beautifier options" \li In the \uicontrol Configuration group, specify the path to the tool executable in the \uicontrol {Artistic Style command}, @@ -119,27 +119,28 @@ \list - \li Select the \uicontrol {Use file defined in project files} - option to use the configuration file defined in the qmake - DISTFILES variable as the configuration file for the - selected tool. This option is available for Artistic Style - and Uncrustify. + \li Select \uicontrol {Use file *.astylerc defined in project files} + or \uicontrol {Use file uncrustify.cfg defined in project files}, + to use the configuration file defined in the qmake DISTFILES + variable as the configuration file for the selected tool. - \li Select the \uicontrol {Use specific config file} option to + \li Select \uicontrol {Use specific config file} or + \uicontrol {Use file specific uncrustify.cfg} to use the specified file as the configuration file for the - selected tool. This option is available for Artistic Style - and Uncrustify. + selected tool. - \li Select the \uicontrol {Use file in $HOME} option to use the - specified file in the user's home directory as the - configuration file for the selected tool. This option is - available for Artistic Style and Uncrustify. + \li Select \uicontrol {Use file uncrustify.cfg in <$HOME>} or + \uicontrol {Use file .astylerc or acstylerc in <$HOME>} to + use the specified file in the user's home directory as the + configuration file for the selected tool. \li For Clang Format, you can use a predefined style, by selecting the \uicontrol {Use predefined style} radio button, and then selecting the style to use from the list of available styles. + \image qtcreator-beautifier-options-clangformat.png "Clang Format Beautifier options" + Select \uicontrol File to load the style configuration from the \c .clang-format or \c _clang-format file located in the same directory as the source file or in one of its parent @@ -158,7 +159,7 @@ highlighting, auto-completion, and context-sensitive help. For these features, you must have the tool installed. - \image beautifier_editor.png + \image beautifier_editor.png "Add Configuration dialog" \endlist @@ -172,13 +173,13 @@ \endlist - In addition to the \uicontrol {Format Current File} command, ClangFormat - and Uncrustify provide additional commands. + In addition, ClangFormat provides the \uicontrol {Format at Cursor} command. If you select it when no text is selected, the syntactic entity under the cursor is formatted. The \uicontrol {Disable Formatting for Selected Text} command wraps selected lines within \c {// clang-format off} and \c {// clang-format on}. + Uncrustify provides the \uicontrol {Format Selected Text} command. If you select it when no text is selected, the whole file is formatted by default. To disable this behavior, deselect the From 5841a159c0521d9e3db4e635d30be232d84c0dce Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 23 Nov 2021 11:39:01 +0200 Subject: [PATCH 14/26] QmlDesigner: Fix capitalization of rotBlocked@Internal aux property The "@Internal" part of aux property must have the "I" capitalized for it to avoid affecting document modified state. Fixes: QDS-4802 Change-Id: Ibbf0006ba6c24bad3ad017a72196dac1d366fe94 Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann Reviewed-by: --- .../qml2puppet/instances/qt5informationnodeinstanceserver.cpp | 2 +- .../qmldesigner/designercore/instances/nodeinstanceview.cpp | 4 ++-- src/plugins/qmldesigner/designercore/model/qml3dnode.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 5daf582e431..b4c8513dc50 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -319,7 +319,7 @@ void Qt5InformationNodeInstanceServer::updateRotationBlocks(const QVector blockedNodes; QSet unblockedNodes; - const PropertyName propName = "rotBlocked@internal"; + const PropertyName propName = "rotBlocked@Internal"; for (const auto &container : valueChanges) { if (container.name() == propName) { ServerNodeInstance instance = instanceForId(container.instanceId()); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 3032ac12d94..f922a955171 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -602,7 +602,7 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, const QVariant &value) { QTC_ASSERT(m_nodeInstanceServer, return); - const bool forceAuxChange = name == "invisible" || name == "locked" || name == "rotBlocked@internal"; + const bool forceAuxChange = name == "invisible" || name == "locked" || name == "rotBlocked@Internal"; if (((node.isRootNode() && (name == "width" || name == "height")) || forceAuxChange) || name.endsWith(PropertyName("@NodeInstance"))) { if (hasInstanceForModelNode(node)) { @@ -1900,7 +1900,7 @@ void NodeInstanceView::updateRotationBlocks() } } if (!qml3DNodes.isEmpty()) { - const PropertyName auxDataProp {"rotBlocked@internal"}; + const PropertyName auxDataProp {"rotBlocked@Internal"}; for (const auto &node : qAsConst(qml3DNodes)) { if (rotationKeyframeTargets.contains(node)) node.setAuxiliaryData(auxDataProp, true); diff --git a/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp b/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp index cb9e2b8bb16..7f6f07b0018 100644 --- a/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp @@ -83,7 +83,7 @@ void Qml3DNode::setBindingProperty(const PropertyName &name, const QString &expr bool Qml3DNode::isBlocked(const PropertyName &propName) const { if (modelNode().isValid() && propName.startsWith("eulerRotation")) - return modelNode().auxiliaryData("rotBlocked@internal").toBool(); + return modelNode().auxiliaryData("rotBlocked@Internal").toBool(); return false; } From a4791debf0851c31c5e4a4bfcb226e21e02c1309 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 23 Nov 2021 14:47:39 +0100 Subject: [PATCH 15/26] GitHub Actions: Use actions/cache v1 Update to latest v1 actions/cache, instead of using a fixed version. For example v1.1.1 increased the cache version from 2GB to 5GB! Change-Id: Ib312016f5e0e07771451049cf2d4cd3ce0225837 Reviewed-by: Alessandro Portale --- .github/workflows/build_cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index 6d2ff5c545a..d037726a259 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -372,7 +372,7 @@ jobs: - name: ccache cache files - uses: actions/cache@v1.1.0 + uses: actions/cache@v1 with: path: .ccache key: ${{ matrix.config.name }}-ccache-${{ steps.ccache_cache_timestamp.outputs.ide_major_version }}-${{ steps.ccache_cache_timestamp.outputs.timestamp }} From 6f27359f15449442d829f69468b114d89144226f Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 22 Nov 2021 16:42:48 +0100 Subject: [PATCH 16/26] QmlDesigner: Make live preview work with AVD Make the live preview work with Android Virtual Device. This allows to start the emulator with the currently active project via the live preview toolbar button. Task-number: QDS-5383 Change-Id: I3f44ea8fcb6f23d938d9775d78314b23c69768ec Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../qmlpreviewplugin/qmlpreviewactions.cpp | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp index bcdd87b749a..09375ba69ff 100644 --- a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp +++ b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp @@ -30,9 +30,13 @@ #include #include +#include #include #include #include +#include + +#include #include #include @@ -44,18 +48,37 @@ using namespace ProjectExplorer; const Utils::Icon previewIcon({ {":/qmlpreviewplugin/images/live_preview.png", Utils::Theme::IconsBaseColor}}); +const QByteArray livePreviewId = "LivePreview"; static void handleAction(const SelectionContext &context) { if (context.view()->isAttached()) { - if (context.toggled()) - ProjectExplorerPlugin::runStartupProject(Constants::QML_PREVIEW_RUN_MODE); - else + if (context.toggled()) { + bool skipDeploy = false; + if (const Target *startupTarget = SessionManager::startupTarget()) { + const Kit *kit = startupTarget->kit(); + if (kit + && (kit->supportedPlatforms().contains(Android::Constants::ANDROID_DEVICE_TYPE) + || DeviceTypeKitAspect::deviceTypeId(kit) + == Android::Constants::ANDROID_DEVICE_TYPE)) { + skipDeploy = true; + // In case of an android kit we don't want the live preview button to be toggled + // when the emulator is started as we don't have control over its run status. + DesignerActionManager &designerActionManager = QmlDesignerPlugin::instance() + ->designerActionManager(); + if (const ActionInterface *interface = designerActionManager.actionByMenuId( + livePreviewId)) + interface->action()->setChecked(false); + } + } + ProjectExplorerPlugin::runStartupProject(Constants::QML_PREVIEW_RUN_MODE, skipDeploy); + } else { QmlPreviewPlugin::stopAllRunControls(); + } } } -QmlPreviewAction::QmlPreviewAction() : ModelNodeAction("LivePreview", +QmlPreviewAction::QmlPreviewAction() : ModelNodeAction(livePreviewId, "Live Preview", previewIcon.icon(), QmlPreviewPlugin::tr("Show Live Preview"), From a6e3b39d4081e261d35c183642ececf4fdd84bc1 Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Tue, 23 Nov 2021 11:51:36 +0100 Subject: [PATCH 17/26] Retain zoom factor when showing after hiding The timeline and transition editor where resetting their zoom factors to 0 in the showevent. This is now fixed. Fixes: QDS-5337 Change-Id: Ic4d9b2af7613b4c5c2fd5e9c646df51978fd05f6 Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../timelineeditor/timelinegraphicsscene.cpp | 3 +-- .../components/timelineeditor/timelinewidget.cpp | 10 ++++++---- .../components/timelineeditor/timelinewidget.h | 2 +- .../transitioneditor/transitioneditorgraphicsscene.cpp | 2 +- .../transitioneditor/transitioneditorwidget.cpp | 10 +++++----- .../transitioneditor/transitioneditorwidget.h | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index ad2dfd88f68..2acf6601ab7 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -136,8 +136,7 @@ void TimelineGraphicsScene::onShow() int cf = std::round(timeline.currentKeyframe()); setCurrentFrame(cf); } - - emit m_layout->zoomChanged(0); + emit m_layout->zoomChanged(zoom()); } } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp index f4ff114bf62..ee93b4cf575 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp @@ -482,7 +482,7 @@ void TimelineWidget::contextHelp(const Core::IContext::HelpCallback &callback) c callback({}); } -void TimelineWidget::init() +void TimelineWidget::init(int zoom) { QmlTimeline currentTimeline = m_timelineView->timelineForState(m_timelineView->currentState()); if (currentTimeline.isValid()) { @@ -499,8 +499,8 @@ void TimelineWidget::init() m_graphicsScene->setWidth(m_graphicsView->viewport()->width()); // setScaleFactor uses QSignalBlocker. - m_toolbar->setScaleFactor(0); - m_graphicsScene->setZoom(0); + m_toolbar->setScaleFactor(zoom); + m_graphicsScene->setZoom(zoom); } void TimelineWidget::reset() @@ -611,6 +611,8 @@ void TimelineWidget::showEvent(QShowEvent *event) { Q_UNUSED(event) + int zoom = m_toolbar->scaleFactor(); + m_timelineView->setEnabled(true); graphicsScene()->setWidth(m_graphicsView->viewport()->width()); @@ -622,7 +624,7 @@ void TimelineWidget::showEvent(QShowEvent *event) //All the events have to be fully processed before we call init() if (m_timelineView->model()) - QTimer::singleShot(0, [this]() { init(); }); + QTimer::singleShot(0, [this, zoom]() { init(zoom); }); } void TimelineWidget::resizeEvent(QResizeEvent *event) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.h b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.h index ebaf00104dc..5edc018b60a 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.h @@ -62,7 +62,7 @@ public: TimelineView *timelineView() const; TimelineToolBar *toolBar() const; - void init(); + void init(int zoom = 0); void reset(); void invalidateTimelineDuration(const QmlTimeline &timeline); diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp index e2b95783569..a78ad3c7502 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp @@ -119,7 +119,7 @@ void TransitionEditorGraphicsScene::invalidateScrollbar() void TransitionEditorGraphicsScene::onShow() { - emit m_layout->zoomChanged(0); + emit m_layout->zoomChanged(zoom()); } void TransitionEditorGraphicsScene::setTransition(const ModelNode &transition) diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp index 6077c9de28c..b75f9d7f874 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp @@ -326,7 +326,7 @@ void TransitionEditorWidget::contextHelp(const Core::IContext::HelpCallback &cal callback({}); } -void TransitionEditorWidget::init() +void TransitionEditorWidget::init(int zoom) { ModelNode root = transitionEditorView()->rootModelNode(); ModelNode transition; @@ -345,7 +345,7 @@ void TransitionEditorWidget::init() m_graphicsScene->setWidth(m_graphicsView->viewport()->width()); - m_toolbar->setScaleFactor(40); + m_toolbar->setScaleFactor(zoom); m_toolbar->setCurrentTransition(transition); @@ -355,13 +355,13 @@ void TransitionEditorWidget::init() m_toolbar->setDuration(duration); - m_graphicsScene->setZoom(40); + m_graphicsScene->setZoom(zoom); } void TransitionEditorWidget::updateData(const ModelNode &transition) { if (!transition.isValid()) { - init(); + init(m_toolbar->scaleFactor()); return; } @@ -409,7 +409,7 @@ void TransitionEditorWidget::showEvent(QShowEvent *event) m_transitionEditorView->setEnabled(true); if (m_transitionEditorView->model()) - init(); + init(m_toolbar->scaleFactor()); graphicsScene()->setWidth(m_graphicsView->viewport()->width()); graphicsScene()->invalidateLayout(); diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.h b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.h index ea4b2a6affa..698c4b76aeb 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.h +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.h @@ -61,7 +61,7 @@ public: TransitionEditorView *transitionEditorView() const; TransitionEditorToolBar *toolBar() const; - void init(); + void init(int zoom = 0); void reset(); void setupScrollbar(int min, int max, int current); From c53e3f489337bd8b82335e75de68ebe6989e575d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 22 Nov 2021 13:53:59 +0100 Subject: [PATCH 18/26] ClangCodeModel: Treat function-like macros like functions ... when completing with clangd. Change-Id: I8ffc0ff7a4a0f819f2ae48aabbb16609eb178178 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 5d4e7acbbd6..46e80e750a3 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -2938,8 +2938,12 @@ void ClangdCompletionItem::apply(TextDocumentManipulatorInterface &manipulator, const auto kind = static_cast( item.kind().value_or(CompletionItemKind::Text)); + const bool isMacroCall = kind == CompletionItemKind::Text && item.label().contains('(') + && item.label().contains(')'); // Heuristic const bool isFunctionLike = kind == CompletionItemKind::Function - || kind == CompletionItemKind::Method || kind == CompletionItemKind::Constructor; + || kind == CompletionItemKind::Method || kind == CompletionItemKind::Constructor + || isMacroCall; + QString rawInsertText = edit->newText(); // Some preparation for our magic involving (non-)insertion of parentheses and @@ -2981,8 +2985,8 @@ void ClangdCompletionItem::apply(TextDocumentManipulatorInterface &manipulator, } if (!abandonParen) abandonParen = isAtUsingDeclaration(manipulator, rangeStart); - if (!abandonParen && matchPreviousWord(manipulator, cursor, detail)) // function definition? - abandonParen = true; + if (!abandonParen && !isMacroCall && matchPreviousWord(manipulator, cursor, detail)) + abandonParen = true; // function definition if (!abandonParen) { if (completionSettings.m_spaceAfterFunctionName) extraCharacters += ' '; From 7498b5523ad841e5ea8466f9bcd103c48bf82af0 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 22 Nov 2021 14:33:51 +0100 Subject: [PATCH 19/26] ClangCodeModel: Fix another mis-highlighting with clangd Output parameter marking strikes again. Change-Id: Id98e07e87824a9db435d09482235d56c6808d42e Reviewed-by: Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 6 ++++-- src/plugins/clangcodemodel/test/clangdtests.cpp | 2 ++ .../clangcodemodel/test/data/highlighting/highlighting.cpp | 6 ++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 46e80e750a3..7ca82cf1a8d 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -2489,8 +2489,10 @@ static void semanticHighlighter(QFutureInterface &future, while (!firstChildTree.isEmpty()) { const AstNode n = firstChildTree.takeFirst(); const QString detail = n.detail().value_or(QString()); - if (detail.startsWith("operator")) - return !detail.contains('='); + if (detail.startsWith("operator")) { + return !detail.contains('=') && !detail.contains("++") + && !detail.contains("--"); + } firstChildTree << n.children().value_or(QList()); } return true; diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 1face3639c9..47c2ec330e1 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1256,6 +1256,8 @@ void ClangdTestHighlighting::test_data() << QList{C_STRING} << 0; QTest::newRow("string literal passed to macro from header file") << 854 << 32 << 854 << 38 << QList{C_STRING} << 0; + QTest::newRow("user-defined operator call") << 860 << 7 << 860 << 8 + << QList{C_LOCAL} << 0; } void ClangdTestHighlighting::test() diff --git a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp index 5d57a235bc6..54716d79a3f 100644 --- a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp +++ b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp @@ -853,3 +853,9 @@ void useString() const char *s = USE_STRING("TEXT"); s = USE_STRING_FROM_HEADER("TEXT"); } + +void useOperator() +{ + struct S { S& operator++(); } s; + ++s; +} From 0c53c2daefdef4f7a6ccdfd394ab1f5b78b52a56 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 22 Nov 2021 13:26:59 +0100 Subject: [PATCH 20/26] CppEditor: Do not overwrite extra selections from language client The broken libclang-based implementation used to remove the correct results we got from clangd. Task-number: QTCREATORBUG-26339 Task-number: QTCREATORBUG-26596 Change-Id: I9b7c1214c376b616fe204986ed37c287e2307f81 Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangmodelmanagersupport.cpp | 5 +++++ src/plugins/clangcodemodel/clangmodelmanagersupport.h | 1 + src/plugins/cppeditor/cppmodelmanager.cpp | 5 +++++ src/plugins/cppeditor/cppmodelmanager.h | 1 + src/plugins/cppeditor/cppmodelmanagersupport.h | 1 + src/plugins/cppeditor/cppuseselectionsupdater.cpp | 4 ++++ 6 files changed, 17 insertions(+) diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 371fb224524..1d8a3f8af2e 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -209,6 +209,11 @@ bool ClangModelManagerSupport::supportsOutline(const TextEditor::TextDocument *d return !clientForFile(document->filePath()); } +bool ClangModelManagerSupport::supportsLocalUses(const TextEditor::TextDocument *document) const +{ + return !clientForFile(document->filePath()); +} + CppEditor::BaseEditorDocumentProcessor *ClangModelManagerSupport::createEditorDocumentProcessor( TextEditor::TextDocument *baseTextDocument) { diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h index 5d591d6925f..8307ece252f 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h @@ -75,6 +75,7 @@ public: CppEditor::RefactoringEngineInterface &refactoringEngineInterface() override; std::unique_ptr createOverviewModel() override; bool supportsOutline(const TextEditor::TextDocument *document) const override; + bool supportsLocalUses(const TextEditor::TextDocument *document) const override; BackendCommunicator &communicator(); QString dummyUiHeaderOnDiskDirPath() const; diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index b87e1098da1..097dcf15f98 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -1321,6 +1321,11 @@ bool CppModelManager::supportsOutline(const TextEditor::TextDocument *document) return instance()->d->m_activeModelManagerSupport->supportsOutline(document); } +bool CppModelManager::supportsLocalUses(const TextEditor::TextDocument *document) +{ + return instance()->d->m_activeModelManagerSupport->supportsLocalUses(document); +} + bool CppModelManager::isClangCodeModelActive() const { return d->m_activeModelManagerSupport != d->m_builtinModelManagerSupport; diff --git a/src/plugins/cppeditor/cppmodelmanager.h b/src/plugins/cppeditor/cppmodelmanager.h index e6dc746a1f1..fadb00657d9 100644 --- a/src/plugins/cppeditor/cppmodelmanager.h +++ b/src/plugins/cppeditor/cppmodelmanager.h @@ -140,6 +140,7 @@ public: static bool isCppEditor(Core::IEditor *editor); static bool supportsOutline(const TextEditor::TextDocument *document); + static bool supportsLocalUses(const TextEditor::TextDocument *document); bool isClangCodeModelActive() const; QSet abstractEditorSupports() const; diff --git a/src/plugins/cppeditor/cppmodelmanagersupport.h b/src/plugins/cppeditor/cppmodelmanagersupport.h index 70da6fedc70..ca287d8baf7 100644 --- a/src/plugins/cppeditor/cppmodelmanagersupport.h +++ b/src/plugins/cppeditor/cppmodelmanagersupport.h @@ -62,6 +62,7 @@ public: virtual RefactoringEngineInterface &refactoringEngineInterface() = 0; virtual std::unique_ptr createOverviewModel() = 0; virtual bool supportsOutline(const TextEditor::TextDocument *) const { return true; } + virtual bool supportsLocalUses(const TextEditor::TextDocument *) const { return true; } }; class CPPEDITOR_EXPORT ModelManagerSupportProvider diff --git a/src/plugins/cppeditor/cppuseselectionsupdater.cpp b/src/plugins/cppeditor/cppuseselectionsupdater.cpp index 70b0cba81f8..99e0f8befc5 100644 --- a/src/plugins/cppeditor/cppuseselectionsupdater.cpp +++ b/src/plugins/cppeditor/cppuseselectionsupdater.cpp @@ -27,6 +27,7 @@ #include "cppeditorwidget.h" #include "cppeditordocument.h" +#include "cppmodelmanager.h" #include "cpptoolsreuse.h" #include @@ -73,6 +74,9 @@ CppUseSelectionsUpdater::RunnerInfo CppUseSelectionsUpdater::update(CallType cal auto *cppEditorDocument = qobject_cast(cppEditorWidget->textDocument()); QTC_ASSERT(cppEditorDocument, return RunnerInfo::FailedToStart); + if (!CppModelManager::instance()->supportsLocalUses(cppEditorDocument)) + return RunnerInfo::AlreadyUpToDate; + CursorInfoParams params; params.semanticInfo = cppEditorWidget->semanticInfo(); params.textCursor = Utils::Text::wordStartCursor(cppEditorWidget->textCursor()); From 478f68042beef8d94f7c4353a27e599e7d8bfdcd Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 23 Nov 2021 18:15:58 +0100 Subject: [PATCH 21/26] GitHub Actions: Fix failures when commit message had certain characters The variable was not quoted and in certain cases the CMake code checking for ccache clearing messages would error and the job would fail. See 28a20b75bab8908e43ebf553a2ae2ef52775861b Change-Id: I7703a547129b3294b6d8094035a272e5d35c5c60 Reviewed-by: Alessandro Portale --- .github/workflows/build_cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index d037726a259..92ce88f52cc 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -432,7 +432,7 @@ jobs: COMMAND git log --format=%B -n 1 ${{ github.event.after }} OUTPUT_VARIABLE git_commit_msg ) - if (${git_commit_msg} MATCHES "ccache:[ ]*clea[r|n]") + if ("${git_commit_msg}" MATCHES "ccache:[ ]*clea[r|n]") execute_process(COMMAND ccache --clear COMMAND_ECHO STDOUT) endif() From bf6f41322c76b340e1db9dcc1f5eaffcd5fa8efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Mon, 22 Nov 2021 13:27:22 +0200 Subject: [PATCH 22/26] Handle particle system animation when selecting child object Do not stop particle system animation when user selects particle system child object. Instead continue particle system animation and if the child parent particle system is another particle system, enable that animation. Task-number: QDS-5562 Change-Id: I334f522536b53e7fb5cbebf8f7e9914f6394d165 Reviewed-by: Miikka Heikkinen Reviewed-by: Reviewed-by: Thomas Hartmann --- .../qt5informationnodeinstanceserver.cpp | 66 ++++++++++++++++--- .../qt5informationnodeinstanceserver.h | 2 +- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index b4c8513dc50..6eb7a7146e0 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -104,6 +104,12 @@ #endif #endif +#ifdef QUICK3D_PARTICLES_MODULE +#include +#include +#include +#endif + #ifdef IMPORT_QUICK3D_ASSETS #include #endif @@ -412,7 +418,7 @@ void Qt5InformationNodeInstanceServer::resetParticleSystem() void Qt5InformationNodeInstanceServer::handleParticleSystemSelected(QQuick3DParticleSystem* targetParticleSystem) { - if (!m_particleAnimationDriver) + if (!m_particleAnimationDriver || targetParticleSystem == m_targetParticleSystem) return; m_particleAnimationDriver->reset(); @@ -453,7 +459,46 @@ static QString baseProperty(const QString &property) return property; } -void Qt5InformationNodeInstanceServer::handleParticleSystemDeselected() +template +static QQuick3DParticleSystem *systemProperty(QObject *object) +{ + return qobject_cast(object) ? qobject_cast(object)->system() : nullptr; +} + +static QQuick3DParticleSystem *getSystemOrSystemProperty(QObject *selectedObject) +{ + QQuick3DParticleSystem *system = nullptr; + system = qobject_cast(selectedObject); + if (system) + return system; + system = systemProperty(selectedObject); + if (system) + return system; + system = systemProperty(selectedObject); + if (system) + return system; + system = systemProperty(selectedObject); + if (system) + return system; + return nullptr; +} + +static QQuick3DParticleSystem *parentParticleSystem(QObject *selectedObject) +{ + auto *ps = getSystemOrSystemProperty(selectedObject); + if (ps) + return ps; + QObject *parent = selectedObject->parent(); + while (parent) { + ps = getSystemOrSystemProperty(parent); + if (ps) + return ps; + parent = parent->parent(); + } + return nullptr; +} + +void Qt5InformationNodeInstanceServer::handleParticleSystemDeselected(QObject *selectedObject) { m_targetParticleSystem = nullptr; const auto anim = animations(); @@ -1824,9 +1869,7 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm { if (!m_editView3DSetupDone) return; -#ifdef QUICK3D_PARTICLES_MODULE - resetParticleSystem(); -#endif + m_lastSelectionChangeCommand = command; if (m_selectionChangeTimer.isActive()) { // If selection was recently changed by puppet, hold updating the selection for a bit to @@ -1855,10 +1898,17 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm #ifdef QUICK3D_PARTICLES_MODULE auto particlesystem = qobject_cast(instance.internalObject()); - if (particlesystem) + if (particlesystem) { handleParticleSystemSelected(particlesystem); - else - handleParticleSystemDeselected(); + } else { + particlesystem = parentParticleSystem(instance.internalObject()); + if (particlesystem) { + if (particlesystem != m_targetParticleSystem) + handleParticleSystemSelected(particlesystem); + } else { + handleParticleSystemDeselected(instance.internalObject()); + } + } #endif auto isSelectableAsRoot = [&]() -> bool { #ifdef QUICK3D_MODULE diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index 25a4b900ce8..ef6f576dac9 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -149,7 +149,7 @@ private: #ifdef QUICK3D_PARTICLES_MODULE void handleParticleSystemSelected(QQuick3DParticleSystem* targetParticleSystem); void resetParticleSystem(); - void handleParticleSystemDeselected(); + void handleParticleSystemDeselected(QObject *selectedObject); #endif RenderViewData m_editView3DData; From d0de8b18dd167b92cd1e3c3e4c0f339234fa8d9a Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 23 Nov 2021 18:35:13 +0100 Subject: [PATCH 23/26] QmlDesigner/Android: Rename designviewer -> qtdesignviewer "Qt Design Viewer" is the name of the component. Change-Id: I37228ca32badc4107bb0faa088af5f6afeb9a8ac Reviewed-by: Reviewed-by: Piotr Mikolajczyk Reviewed-by: Thomas Hartmann --- src/plugins/android/androidqmlpreviewworker.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/android/androidqmlpreviewworker.cpp b/src/plugins/android/androidqmlpreviewworker.cpp index 007562823a7..60372f33dce 100644 --- a/src/plugins/android/androidqmlpreviewworker.cpp +++ b/src/plugins/android/androidqmlpreviewworker.cpp @@ -57,7 +57,7 @@ namespace Internal { using namespace Utils; -#define APP_ID "io.qt.designviewer" +#define APP_ID "io.qt.qtdesignviewer" class ApkInfo { public: @@ -92,7 +92,7 @@ FilePath AndroidQmlPreviewWorker::designViewerApkPath(const QString &abi) const return {}; if (apkInfo()->abis.contains(abi)) { - return Core::ICore::resourcePath(QString("android/qtdesignviewer/designviewer_%1.apk") + return Core::ICore::resourcePath(QString("android/qtdesignviewer/qtdesignviewer_%1.apk") .arg(abi)); } return {}; From a9fc431bd925e62fb2327244175c451b7eabbe54 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 24 Nov 2021 09:45:46 +0100 Subject: [PATCH 24/26] QmlProject: Do not allow supression of info bar for qmlproject MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTCREATORBUG-26604 Change-Id: I0bde278322150906780dccda734214182fe5100d Reviewed-by: Alessandro Portale Reviewed-by: Thomas Hartmann Reviewed-by: Kimmo Leppälä Reviewed-by: hjk --- src/plugins/qmlprojectmanager/qmlproject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 0dc6f5c5a18..c17f7f158bc 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -112,7 +112,7 @@ QmlProject::QmlProject(const Utils::FilePath &fileName) Utils::InfoBarEntry info(openInQDSAppSetting, tr("Would you like to open the project in Qt Design Studio?"), - Utils::InfoBarEntry::GlobalSuppression::Enabled); + Utils::InfoBarEntry::GlobalSuppression::Disabled); info.setCustomButtonInfo(tr("Open in Qt Design Studio"), [&, fileName] { Core::ICore::infoBar()->removeInfo(openInQDSAppSetting); QmlProjectPlugin::openQDS(fileName); From a95a77bcfc2e7011a32549d4e6eea9d54294496b Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 24 Nov 2021 09:51:21 +0100 Subject: [PATCH 25/26] InfoBar: Do not suppress info bar if it is closed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before the patch, any closed infobar was suppressed until Qt Creator was restarted. With this patch the infobar will just be closed, as naively expected. To suppress any infobar you have to click "Do not show again". Task-number: QTCREATORBUG-26605 Change-Id: I29645e853119286f507cba82c228f372dd80fa64 Reviewed-by: Alessandro Portale Reviewed-by: Kimmo Leppälä Reviewed-by: hjk --- src/libs/utils/infobar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/utils/infobar.cpp b/src/libs/utils/infobar.cpp index 230473b31bb..f481113b4eb 100644 --- a/src/libs/utils/infobar.cpp +++ b/src/libs/utils/infobar.cpp @@ -344,7 +344,7 @@ void InfoBarDisplay::update() if (info.m_cancelButtonCallBack) connect(infoWidgetCloseButton, &QAbstractButton::clicked, info.m_cancelButtonCallBack); connect(infoWidgetCloseButton, &QAbstractButton::clicked, this, [this, id] { - m_infoBar->suppressInfo(id); + m_infoBar->removeInfo(id); }); } From 153dd2fe0bf5be124b7bd70e45186691920c3e94 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 23 Nov 2021 18:02:41 +0100 Subject: [PATCH 26/26] ClangCodeModel: Fix overly simplistic check ... when doing function call completion with clangd. We did not take default arguments into account. E.g. the following declaration: void func(int i, int j = int()); was mis-detected as taking no arguments, causing to the cursor to be at the wrong location afterwards. Change-Id: I522921721b0cb347ed593c43ed285ca6d02ccfee Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 7ca82cf1a8d..68a94b1fea9 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -2938,10 +2938,12 @@ void ClangdCompletionItem::apply(TextDocumentManipulatorInterface &manipulator, if (!edit) return; + const int labelOpenParenOffset = item.label().indexOf('('); + const int labelClosingParenOffset = item.label().indexOf(')'); const auto kind = static_cast( item.kind().value_or(CompletionItemKind::Text)); - const bool isMacroCall = kind == CompletionItemKind::Text && item.label().contains('(') - && item.label().contains(')'); // Heuristic + const bool isMacroCall = kind == CompletionItemKind::Text && labelOpenParenOffset != -1 + && labelClosingParenOffset > labelOpenParenOffset; // Heuristic const bool isFunctionLike = kind == CompletionItemKind::Function || kind == CompletionItemKind::Method || kind == CompletionItemKind::Constructor || isMacroCall; @@ -2951,10 +2953,12 @@ void ClangdCompletionItem::apply(TextDocumentManipulatorInterface &manipulator, // Some preparation for our magic involving (non-)insertion of parentheses and // cursor placement. if (isFunctionLike && !rawInsertText.contains('(')) { - if (item.label().contains("()")) // function takes no arguments - rawInsertText += "()"; - else if (item.label().contains('(')) // function takes arguments - rawInsertText += "( )"; + if (labelOpenParenOffset != -1) { + if (labelClosingParenOffset == labelOpenParenOffset + 1) // function takes no arguments + rawInsertText += "()"; + else // function takes arguments + rawInsertText += "( )"; + } } const int firstParenOffset = rawInsertText.indexOf('(');