From 175acdf29c6fe937f1df3b2137435ebfc0e69069 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Mon, 4 Oct 2021 18:04:34 +0300 Subject: [PATCH 01/67] QmlDesigner: Add externally dropped assets to form editor When dropping external assets to the form editor, add image assets to the form editor after importing the assets. Change-Id: Ia97f4a2ad2af1c57608516db1e1728642f4c3ea2 Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../components/componentcore/designeractionmanager.cpp | 10 ++++++++-- .../components/componentcore/designeractionmanager.h | 2 +- .../components/componentcore/modelnodeoperations.cpp | 3 +-- .../components/formeditor/formeditorwidget.cpp | 9 ++++++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index d4528893637..8ca977e7428 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -262,7 +262,7 @@ bool DesignerActionManager::externalDragHasSupportedAssets(const QMimeData *mime return false; } -void DesignerActionManager::handleExternalAssetsDrop(const QMimeData *mimeData) const +QHash DesignerActionManager::handleExternalAssetsDrop(const QMimeData *mimeData) const { const QList handlers = addResourceHandler(); // create suffix to categry and category to operation hashes @@ -283,13 +283,19 @@ void DesignerActionManager::handleExternalAssetsDrop(const QMimeData *mimeData) categoryFiles[category].append(url.toLocalFile()); } + QHash addedCategoryFiles; + // run operations const QStringList categories = categoryFiles.keys(); for (const QString &category : categories) { AddResourceOperation operation = categoryOperation.value(category); QStringList files = categoryFiles.value(category); - operation(files, {}); + bool success = operation(files, {}); + if (success) + addedCategoryFiles.insert(category, files); } + + return addedCategoryFiles; } class VisiblityModelNodeAction : public ModelNodeContextMenuAction diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h index e0fe93f601d..60e2c7562f9 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h @@ -137,7 +137,7 @@ public: bool hasModelNodePreviewHandler(const ModelNode &node) const; ModelNodePreviewImageOperation modelNodePreviewOperation(const ModelNode &node) const; bool externalDragHasSupportedAssets(const QMimeData *data) const; - void handleExternalAssetsDrop(const QMimeData *data) const; + QHash handleExternalAssetsDrop(const QMimeData *data) const; private: void addTransitionEffectAction(const TypeName &typeName); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 81066504de9..ab2853354c8 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -995,9 +995,8 @@ Utils::FilePath projectFilePath() static bool addFilesToProject(const QStringList &fileNames, const QString &defaultDirectory) { QString directory = AddImagesDialog::getDirectory(fileNames, defaultDirectory); - if (directory.isEmpty()) - return true; + return false; bool allSuccessful = true; QList> copyList; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 1f9fc4487b6..6b81d1f92e2 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -597,7 +597,14 @@ void FormEditorWidget::dropEvent(QDropEvent *dropEvent) { const DesignerActionManager &actionManager = QmlDesignerPlugin::instance() ->viewManager().designerActionManager(); - actionManager.handleExternalAssetsDrop(dropEvent->mimeData()); + QHash addedAssets = actionManager.handleExternalAssetsDrop(dropEvent->mimeData()); + + // add image assets to Form Editor + const QStringList addedImages = addedAssets.value(ComponentCoreConstants::addImagesDisplayString); + for (const QString &imgPath : addedImages) { + QmlItemNode::createQmlItemNodeFromImage(m_formEditorView, imgPath, {}, + m_formEditorView->scene()->rootFormEditorItem()->qmlItemNode()); + } } } // namespace QmlDesigner From bc7f52c475eed7c5c9e4974c0c0cb4d02b754ce9 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 1 Oct 2021 17:00:17 +0200 Subject: [PATCH 02/67] QmlDesigner: Remove x,y when setting center anchors Change-Id: Id6cde717f8a6fe66ac78c65e2e1ac387ec6d3c1d Reviewed-by: Aleksei German Reviewed-by: Qt CI Bot --- .../components/propertyeditor/qmlanchorbindingproxy.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp index aecab7c42ce..2664f2c7a90 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp @@ -861,6 +861,7 @@ void QmlAnchorBindingProxy::anchorVertical() m_qmlItemNode.anchors().setAnchor(AnchorLineVerticalCenter, m_verticalTarget, AnchorLineVerticalCenter); } + backupPropertyAndRemove(modelNode(), "y"); m_locked = false; } @@ -874,6 +875,7 @@ void QmlAnchorBindingProxy::anchorHorizontal() } else if (m_relativeVerticalTarget == Center) { m_qmlItemNode.anchors().setAnchor(AnchorLineHorizontalCenter, m_horizontalTarget, AnchorLineHorizontalCenter); } + backupPropertyAndRemove(modelNode(), "x"); m_locked = false; } @@ -993,6 +995,7 @@ void QmlAnchorBindingProxy::setVerticalCentered(bool centered) if (!centered) { m_qmlItemNode.anchors().removeAnchor(AnchorLineVerticalCenter); m_qmlItemNode.anchors().removeMargin(AnchorLineVerticalCenter); + restoreProperty(m_qmlItemNode, "y"); } else { m_relativeVerticalTarget = Center; @@ -1020,6 +1023,7 @@ void QmlAnchorBindingProxy::setHorizontalCentered(bool centered) if (!centered) { m_qmlItemNode.anchors().removeAnchor(AnchorLineHorizontalCenter); m_qmlItemNode.anchors().removeMargin(AnchorLineHorizontalCenter); + restoreProperty(m_qmlItemNode, "x"); } else { m_relativeHorizontalTarget = Center; From 2bb6bb633f2beccde7fe3726135ba5be4eadc15b Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2021 18:32:52 +0200 Subject: [PATCH 03/67] Valgrind: Use FilePath in HeobDialog Change-Id: I1efa5442791f7655c4c887ea639a7a928d769a28 Reviewed-by: Christian Stenger Reviewed-by: Hannes Domani --- src/plugins/valgrind/memchecktool.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index 95bfb7e7567..22b0bd4a762 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -1425,13 +1425,13 @@ void HeobDialog::updateProfile() int leakRecording = settings->value(heobLeakRecordingC, 2).toInt(); bool attach = settings->value(heobAttachC, false).toBool(); const QString extraArgs = settings->value(heobExtraArgsC).toString(); - QString path = settings->value(heobPathC).toString(); + FilePath path = FilePath::fromVariant(settings->value(heobPathC)); settings->endGroup(); if (path.isEmpty()) { const QString heobPath = QStandardPaths::findExecutable("heob32.exe"); if (!heobPath.isEmpty()) - path = QFileInfo(heobPath).path(); + path = FilePath::fromUserInput(heobPath); } m_xmlEdit->setText(xml); @@ -1444,7 +1444,7 @@ void HeobDialog::updateProfile() m_leakRecordingCombo->setCurrentIndex(leakRecording); m_attachCheck->setChecked(attach); m_extraArgsEdit->setText(extraArgs); - m_pathChooser->setPath(path); + m_pathChooser->setFilePath(path); } void HeobDialog::updateEnabled() From 8d68e05d056bcdcb36345a60528c6df4d75b2e40 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2021 17:12:10 +0200 Subject: [PATCH 04/67] Valgrind: Use FilePath for some suppression files Change-Id: I48490a77d569d752ada1883554cf307148f2c0cb Reviewed-by: Christian Stenger --- src/plugins/valgrind/memcheckerrorview.cpp | 13 ++++---- src/plugins/valgrind/memcheckerrorview.h | 8 +++-- src/plugins/valgrind/memchecktool.cpp | 20 ++++++------- src/plugins/valgrind/suppressiondialog.cpp | 35 ++++++++++------------ src/plugins/valgrind/valgrindsettings.cpp | 14 ++++----- src/plugins/valgrind/valgrindsettings.h | 6 ++-- 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/plugins/valgrind/memcheckerrorview.cpp b/src/plugins/valgrind/memcheckerrorview.cpp index 0e45b76d43b..19e3199b72b 100644 --- a/src/plugins/valgrind/memcheckerrorview.cpp +++ b/src/plugins/valgrind/memcheckerrorview.cpp @@ -46,6 +46,7 @@ #include +using namespace Utils; using namespace Valgrind::XmlProtocol; namespace Valgrind { @@ -56,10 +57,10 @@ MemcheckErrorView::MemcheckErrorView(QWidget *parent) { m_suppressAction = new QAction(this); m_suppressAction->setText(tr("Suppress Error")); - const QIcon icon = Utils::Icon({ - {":/utils/images/eye_open.png", Utils::Theme::TextColorNormal}, - {":/valgrind/images/suppressoverlay.png", Utils::Theme::IconsErrorColor}}, - Utils::Icon::Tint | Utils::Icon::PunchEdges).icon(); + const QIcon icon = Icon({ + {":/utils/images/eye_open.png", Theme::TextColorNormal}, + {":/valgrind/images/suppressoverlay.png", Theme::IconsErrorColor}}, + Icon::Tint | Icon::PunchEdges).icon(); m_suppressAction->setIcon(icon); m_suppressAction->setShortcuts({QKeySequence::Delete, QKeySequence::Backspace}); m_suppressAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); @@ -69,12 +70,12 @@ MemcheckErrorView::MemcheckErrorView(QWidget *parent) MemcheckErrorView::~MemcheckErrorView() = default; -void MemcheckErrorView::setDefaultSuppressionFile(const QString &suppFile) +void MemcheckErrorView::setDefaultSuppressionFile(const FilePath &suppFile) { m_defaultSuppFile = suppFile; } -QString MemcheckErrorView::defaultSuppressionFile() const +FilePath MemcheckErrorView::defaultSuppressionFile() const { return m_defaultSuppFile; } diff --git a/src/plugins/valgrind/memcheckerrorview.h b/src/plugins/valgrind/memcheckerrorview.h index 6a22dbf907d..888140fc45e 100644 --- a/src/plugins/valgrind/memcheckerrorview.h +++ b/src/plugins/valgrind/memcheckerrorview.h @@ -28,6 +28,8 @@ #include +#include + #include namespace Valgrind { @@ -43,8 +45,8 @@ public: MemcheckErrorView(QWidget *parent = nullptr); ~MemcheckErrorView() override; - void setDefaultSuppressionFile(const QString &suppFile); - QString defaultSuppressionFile() const; + void setDefaultSuppressionFile(const Utils::FilePath &suppFile); + Utils::FilePath defaultSuppressionFile() const; ValgrindBaseSettings *settings() const { return m_settings; } void settingsChanged(ValgrindBaseSettings *settings); @@ -53,7 +55,7 @@ private: QList customActions() const override; QAction *m_suppressAction; - QString m_defaultSuppFile; + Utils::FilePath m_defaultSuppFile; ValgrindBaseSettings *m_settings = nullptr; }; diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index 22b0bd4a762..ff97b153b6f 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -128,7 +128,7 @@ public: void start() override; void stop() override; - const QStringList suppressionFiles() const; + const Utils::FilePaths suppressionFiles() const; signals: void internalParserError(const QString &errorString); @@ -212,8 +212,8 @@ QStringList MemcheckToolRunner::toolArguments() const } arguments << "--leak-check=" + leakCheckValue; - for (const QString &file : m_settings.suppressions.value()) - arguments << QString("--suppressions=%1").arg(file); + for (const FilePath &file : m_settings.suppressions.value()) + arguments << QString("--suppressions=%1").arg(file.path()); arguments << QString("--num-callers=%1").arg(m_settings.numCallers.value()); @@ -225,7 +225,7 @@ QStringList MemcheckToolRunner::toolArguments() const return arguments; } -const QStringList MemcheckToolRunner::suppressionFiles() const +const FilePaths MemcheckToolRunner::suppressionFiles() const { return m_settings.suppressions.value(); } @@ -991,15 +991,15 @@ void MemcheckToolPrivate::setupRunner(MemcheckToolRunner *runTool) clearErrorView(); m_loadExternalLogFile->setDisabled(true); - QString dir = runControl->project()->projectDirectory().toString() + '/'; + const FilePath dir = runControl->project()->projectDirectory(); const QString name = runTool->executable().fileName(); - m_errorView->setDefaultSuppressionFile(dir + name + ".supp"); + m_errorView->setDefaultSuppressionFile(dir.pathAppended(name + ".supp")); - const QStringList suppressionFiles = runTool->suppressionFiles(); - for (const QString &file : suppressionFiles) { - QAction *action = m_filterMenu->addAction(FilePath::fromString(file).fileName()); - action->setToolTip(file); + const FilePaths suppressionFiles = runTool->suppressionFiles(); + for (const FilePath &file : suppressionFiles) { + QAction *action = m_filterMenu->addAction(file.fileName()); + action->setToolTip(file.toUserOutput()); connect(action, &QAction::triggered, this, [file] { EditorManager::openEditorAt(file, 0); }); diff --git a/src/plugins/valgrind/suppressiondialog.cpp b/src/plugins/valgrind/suppressiondialog.cpp index 4f5b427f099..bde173edccd 100644 --- a/src/plugins/valgrind/suppressiondialog.cpp +++ b/src/plugins/valgrind/suppressiondialog.cpp @@ -51,6 +51,7 @@ #include #include +using namespace Utils; using namespace Valgrind::XmlProtocol; namespace Valgrind { @@ -63,7 +64,7 @@ static QString suppressionText(const Error &error) // workaround: https://bugs.kde.org/show_bug.cgi?id=255822 if (sup.frames().size() >= 24) sup.setFrames(sup.frames().mid(0, 23)); - QTC_ASSERT(sup.frames().size() < 24, /**/); + QTC_CHECK(sup.frames().size() < 24); // try to set some useful name automatically, instead of "insert_name_here" // we take the last stack frame and append the suppression kind, e.g.: @@ -117,7 +118,7 @@ SuppressionDialog::SuppressionDialog(MemcheckErrorView *view, const QList m_settings(view->settings()), m_cleanupIfCanceled(false), m_errors(errors), - m_fileChooser(new Utils::PathChooser(this)), + m_fileChooser(new PathChooser(this)), m_suppressionEdit(new QPlainTextEdit(this)) { setWindowTitle(tr("Save Suppression")); @@ -140,27 +141,23 @@ SuppressionDialog::SuppressionDialog(MemcheckErrorView *view, const QList formLayout->addRow(m_suppressionEdit); formLayout->addRow(m_buttonBox); - QFile defaultSuppFile(view->defaultSuppressionFile()); - if (!defaultSuppFile.exists()) { - if (defaultSuppFile.open(QIODevice::WriteOnly)) { - defaultSuppFile.close(); - m_cleanupIfCanceled = true; - } - } + const FilePath defaultSuppFile = view->defaultSuppressionFile(); + if (!defaultSuppFile.exists() && defaultSuppFile.ensureExistingFile()) + m_cleanupIfCanceled = true; - m_fileChooser->setExpectedKind(Utils::PathChooser::File); + m_fileChooser->setExpectedKind(PathChooser::File); m_fileChooser->setHistoryCompleter("Valgrind.Suppression.History"); m_fileChooser->setPath(defaultSuppFile.fileName()); m_fileChooser->setPromptDialogFilter("*.supp"); m_fileChooser->setPromptDialogTitle(tr("Select Suppression File")); QString suppressions; - foreach (const Error &error, m_errors) + for (const Error &error : qAsConst(m_errors)) suppressions += suppressionText(error); m_suppressionEdit->setPlainText(suppressions); - connect(m_fileChooser, &Utils::PathChooser::validChanged, + connect(m_fileChooser, &PathChooser::validChanged, this, &SuppressionDialog::validate); connect(m_suppressionEdit->document(), &QTextDocument::contentsChanged, this, &SuppressionDialog::validate); @@ -178,7 +175,7 @@ void SuppressionDialog::maybeShow(MemcheckErrorView *view) indices.append(view->selectionModel()->currentIndex()); QList errors; - foreach (const QModelIndex &index, indices) { + for (const QModelIndex &index : qAsConst(indices)) { Error error = view->model()->data(index, ErrorListModel::ErrorRole).value(); if (!error.suppression().isNull()) errors.append(error); @@ -193,11 +190,11 @@ void SuppressionDialog::maybeShow(MemcheckErrorView *view) void SuppressionDialog::accept() { - const Utils::FilePath path = m_fileChooser->filePath(); + const FilePath path = m_fileChooser->filePath(); QTC_ASSERT(!path.isEmpty(), return); QTC_ASSERT(!m_suppressionEdit->toPlainText().trimmed().isEmpty(), return); - Utils::FileSaver saver(path, QIODevice::Append); + FileSaver saver(path, QIODevice::Append); if (!saver.hasError()) { QTextStream stream(saver.file()); stream << m_suppressionEdit->toPlainText(); @@ -216,14 +213,14 @@ void SuppressionDialog::accept() } } - m_settings->suppressions.addSuppressionFile(path.toString()); + m_settings->suppressions.addSuppressionFile(path); QModelIndexList indices = m_view->selectionModel()->selectedRows(); Utils::sort(indices, [](const QModelIndex &l, const QModelIndex &r) { return l.row() > r.row(); }); QAbstractItemModel *model = m_view->model(); - foreach (const QModelIndex &index, indices) { + for (const QModelIndex &index : qAsConst(indices)) { bool removed = model->removeRow(index.row()); QTC_ASSERT(removed, qt_noop()); Q_UNUSED(removed) @@ -234,7 +231,7 @@ void SuppressionDialog::accept() const Error rowError = model->data( model->index(row, 0), ErrorListModel::ErrorRole).value(); - foreach (const Error &error, m_errors) { + for (const Error &error : qAsConst(m_errors)) { if (equalSuppression(rowError, error)) { bool removed = model->removeRow(row); QTC_CHECK(removed); @@ -254,7 +251,7 @@ void SuppressionDialog::accept() void SuppressionDialog::reject() { if (m_cleanupIfCanceled) - QFile::remove(m_view->defaultSuppressionFile()); + m_view->defaultSuppressionFile().removeFile(); QDialog::reject(); } diff --git a/src/plugins/valgrind/valgrindsettings.cpp b/src/plugins/valgrind/valgrindsettings.cpp index 352ad060ef4..21d056e3fd0 100644 --- a/src/plugins/valgrind/valgrindsettings.cpp +++ b/src/plugins/valgrind/valgrindsettings.cpp @@ -73,9 +73,9 @@ public: QStandardItemModel m_model; // The volatile value of this aspect. }; -void SuppressionAspect::addSuppressionFile(const QString &suppression) +void SuppressionAspect::addSuppressionFile(const FilePath &suppression) { - QStringList val = value(); + FilePaths val = value(); val.append(suppression); setValue(val); } @@ -141,14 +141,14 @@ SuppressionAspect::~SuppressionAspect() delete d; } -QStringList SuppressionAspect::value() const +FilePaths SuppressionAspect::value() const { - return BaseAspect::value().toStringList(); + return Utils::transform(BaseAspect::value().toStringList(), &FilePath::fromString); } -void SuppressionAspect::setValue(const QStringList &val) +void SuppressionAspect::setValue(const FilePaths &val) { - BaseAspect::setValue(val); + BaseAspect::setValue(Utils::transform(val, &FilePath::toString)); } void SuppressionAspect::addToLayout(LayoutBuilder &builder) @@ -180,7 +180,7 @@ void SuppressionAspect::addToLayout(LayoutBuilder &builder) }; builder.addItem(Span { 2, group }); - setVolatileValue(value()); + setVolatileValue(BaseAspect::value()); } void SuppressionAspect::fromMap(const QVariantMap &map) diff --git a/src/plugins/valgrind/valgrindsettings.h b/src/plugins/valgrind/valgrindsettings.h index 79fc68136eb..7d4f01f79ea 100644 --- a/src/plugins/valgrind/valgrindsettings.h +++ b/src/plugins/valgrind/valgrindsettings.h @@ -46,8 +46,8 @@ public: explicit SuppressionAspect(bool global); ~SuppressionAspect() final; - QStringList value() const; - void setValue(const QStringList &val); + Utils::FilePaths value() const; + void setValue(const Utils::FilePaths &val); void addToLayout(Utils::LayoutBuilder &builder) final; @@ -57,7 +57,7 @@ public: QVariant volatileValue() const final; void setVolatileValue(const QVariant &val) final; - void addSuppressionFile(const QString &suppressionFile); + void addSuppressionFile(const Utils::FilePath &suppressionFile); private: friend class ValgrindBaseSettings; From 93a07e1c6ed31420c19f73c7e1ca4bacf1134a2a Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2021 18:30:02 +0200 Subject: [PATCH 05/67] Mcu: Proliferate FilePath use in McuSupport Change-Id: I0ae8bf1454d1715f251d88065b52e3bb6a242402 Reviewed-by: Christiaan Janssen Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportoptions.cpp | 104 +++++++------- src/plugins/mcusupport/mcusupportoptions.h | 14 +- .../mcusupport/mcusupportoptionspage.cpp | 2 +- src/plugins/mcusupport/mcusupportsdk.cpp | 129 +++++++++--------- 4 files changed, 120 insertions(+), 129 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 6fa37d5a83b..ba6107d6fc6 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -72,15 +72,15 @@ namespace Internal { static const int KIT_VERSION = 8; // Bumps up whenever details in Kit creation change -static QString packagePathFromSettings(const QString &settingsKey, - QSettings::Scope scope = QSettings::UserScope, - const QString &defaultPath = {}) +static FilePath packagePathFromSettings(const QString &settingsKey, + QSettings::Scope scope = QSettings::UserScope, + const FilePath &defaultPath = {}) { QSettings *settings = Core::ICore::settings(scope); const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' + QLatin1String(Constants::SETTINGS_KEY_PACKAGE_PREFIX) + settingsKey; - const QString path = settings->value(key, defaultPath).toString(); - return FilePath::fromUserInput(path).toString(); + const QString path = settings->value(key, defaultPath.toString()).toString(); + return FilePath::fromUserInput(path); } static bool automaticKitCreationFromSettings(QSettings::Scope scope = QSettings::UserScope) @@ -99,7 +99,7 @@ static bool kitNeedsQtVersion() return !HostOsInfo::isWindowsHost(); } -McuPackage::McuPackage(const QString &label, const QString &defaultPath, +McuPackage::McuPackage(const QString &label, const FilePath &defaultPath, const QString &detectionPath, const QString &settingsKey, const McuPackageVersionDetector *versionDetector) : m_label(label) @@ -112,14 +112,14 @@ McuPackage::McuPackage(const QString &label, const QString &defaultPath, m_automaticKitCreation = automaticKitCreationFromSettings(QSettings::UserScope); } -QString McuPackage::basePath() const +FilePath McuPackage::basePath() const { - return m_fileChooser != nullptr ? m_fileChooser->filePath().toString() : m_path; + return m_fileChooser != nullptr ? m_fileChooser->filePath() : m_path; } -QString McuPackage::path() const +FilePath McuPackage::path() const { - return QFileInfo(basePath() + m_relativePathModifier).absoluteFilePath(); + return basePath().resolvePath(m_relativePathModifier).absoluteFilePath(); } QString McuPackage::label() const @@ -127,7 +127,7 @@ QString McuPackage::label() const return m_label; } -QString McuPackage::defaultPath() const +FilePath McuPackage::defaultPath() const { return m_defaultPath; } @@ -148,7 +148,7 @@ QWidget *McuPackage::widget() Icons::RESET.icon()); m_fileChooser->lineEdit()->setButtonVisible(FancyLineEdit::Right, true); connect(m_fileChooser->lineEdit(), &FancyLineEdit::rightButtonClicked, this, [&] { - m_fileChooser->setPath(m_defaultPath); + m_fileChooser->setFilePath(m_defaultPath); }); auto layout = new QGridLayout(m_widget); @@ -168,7 +168,7 @@ QWidget *McuPackage::widget() layout->addWidget(m_fileChooser, 0, 0, 1, 2); layout->addWidget(m_infoLabel, 1, 0, 1, -1); - m_fileChooser->setPath(m_path); + m_fileChooser->setFilePath(m_path); QObject::connect(this, &McuPackage::statusChanged, this, [this] { updateStatusUi(); @@ -228,7 +228,7 @@ void McuPackage::writeGeneralSettings() const bool McuPackage::writeToSettings() const { - const QString savedPath = packagePathFromSettings(m_settingsKey, QSettings::UserScope, m_defaultPath); + const FilePath savedPath = packagePathFromSettings(m_settingsKey, QSettings::UserScope, m_defaultPath); const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' + QLatin1String(Constants::SETTINGS_KEY_PACKAGE_PREFIX) + m_settingsKey; Core::ICore::settings()->setValueWithDefault(key, m_path, m_defaultPath); @@ -258,17 +258,18 @@ void McuPackage::setAutomaticKitCreationEnabled(const bool enabled) void McuPackage::updatePath() { - m_path = m_fileChooser->rawPath(); + m_path = m_fileChooser->rawFilePath(); m_fileChooser->lineEdit()->button(FancyLineEdit::Right)->setEnabled(m_path != m_defaultPath); updateStatus(); } void McuPackage::updateStatus() { - bool validPath = !m_path.isEmpty() && FilePath::fromString(m_path).exists(); - const FilePath detectionPath = FilePath::fromString(basePath() + "/" + m_detectionPath); + bool validPath = !m_path.isEmpty() && m_path.exists(); + const FilePath detectionPath = basePath() / m_detectionPath; const bool validPackage = m_detectionPath.isEmpty() || detectionPath.exists(); - m_detectedVersion = validPath && validPackage && m_versionDetector ? m_versionDetector->parseVersion(basePath()) : QString(); + m_detectedVersion = validPath && validPackage && m_versionDetector + ? m_versionDetector->parseVersion(basePath().toString()) : QString(); const bool validVersion = m_detectedVersion.isEmpty() || m_versions.isEmpty() || m_versions.contains(m_detectedVersion); @@ -293,7 +294,7 @@ void McuPackage::updateStatusUi() QString McuPackage::statusText() const { - const QString displayPackagePath = FilePath::fromString(m_path).toUserOutput(); + const QString displayPackagePath = m_path.toUserOutput(); const QString displayVersions = QStringList(m_versions.toList()).join(" or "); const QString displayRequiredPath = QString("%1 %2").arg( FilePath::fromString(m_detectionPath).toUserOutput(), @@ -339,7 +340,7 @@ QString McuPackage::statusText() const } McuToolChainPackage::McuToolChainPackage(const QString &label, - const QString &defaultPath, + const FilePath &defaultPath, const QString &detectionPath, const QString &settingsKey, McuToolChainPackage::Type type, @@ -447,11 +448,9 @@ ToolChain *McuToolChainPackage::toolChain(Id language) const else { const QLatin1String compilerName( language == ProjectExplorer::Constants::C_LANGUAGE_ID ? "gcc" : "g++"); - const FilePath compiler = FilePath::fromUserInput( - HostOsInfo::withExecutableSuffix( - path() + ( - m_type == TypeArmGcc - ? "/bin/arm-none-eabi-%1" : "/bar/foo-keil-%1")).arg(compilerName)); + const QString comp = QLatin1String(m_type == TypeArmGcc ? "/bin/arm-none-eabi-%1" : "/bar/foo-keil-%1") + .arg(compilerName); + const FilePath compiler = path().pathAppended(comp).withExecutableSuffix(); tc = armGccToolChain(compiler, language); } @@ -479,11 +478,10 @@ QVariant McuToolChainPackage::debuggerId() const { using namespace Debugger; - const FilePath command = FilePath::fromUserInput( - HostOsInfo::withExecutableSuffix(path() + ( - m_type == TypeArmGcc - ? "/bin/arm-none-eabi-gdb-py" : m_type == TypeIAR - ? "../common/bin/CSpyBat" : "/bar/foo-keil-gdb"))); + QString sub = QString::fromLatin1(m_type == TypeArmGcc ? "bin/arm-none-eabi-gdb-py" + : m_type == TypeIAR ? "../common/bin/CSpyBat" : "bar/foo-keil-gdb"); + + const FilePath command = path().pathAppended(sub).withExecutableSuffix(); const DebuggerItem *debugger = DebuggerItemManager::findByCommand(command); QVariant debuggerId; if (!debugger) { @@ -591,7 +589,7 @@ McuSupportOptions::~McuSupportOptions() void McuSupportOptions::populatePackagesAndTargets() { - setQulDir(FilePath::fromUserInput(qtForMCUsSdkPackage->path())); + setQulDir(qtForMCUsSdkPackage->path()); } static FilePath qulDocsDir() @@ -665,13 +663,12 @@ void McuSupportOptions::setQulDir(const FilePath &dir) FilePath McuSupportOptions::qulDirFromSettings() { - return FilePath::fromUserInput( - packagePathFromSettings(Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK, - QSettings::UserScope)); + return packagePathFromSettings(Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK, + QSettings::UserScope); } static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mcuTarget, - const QString &sdkPath) + const FilePath &sdkPath) { using namespace Constants; @@ -688,7 +685,7 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc if (mcuTarget->toolChainPackage()->isDesktopToolchain()) k->setDeviceTypeForIcon(DEVICE_TYPE); k->setValue(QtSupport::SuppliesQtQuickImportPath::id(), true); - k->setValue(QtSupport::KitQmlImportPath::id(), QVariant(sdkPath + "/include/qul")); + k->setValue(QtSupport::KitQmlImportPath::id(), sdkPath.pathAppended("include/qul").toVariant()); k->setValue(QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(), true); QSet irrelevant = { SysRootKitAspect::id(), @@ -750,14 +747,13 @@ static void setKitEnvironment(Kit *k, const McuTarget *mcuTarget, // feature of the run configuration. Otherwise, we just prepend the path, here. if (mcuTarget->toolChainPackage()->isDesktopToolchain() && !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi()) - pathAdditions.append(QDir::toNativeSeparators(qtForMCUsSdkPackage->path() + "/bin")); + pathAdditions.append(qtForMCUsSdkPackage->path().pathAppended("bin").toUserOutput()); auto processPackage = [&pathAdditions, &changes](const McuPackage *package) { if (package->addToPath()) - pathAdditions.append(QDir::toNativeSeparators(package->path())); + pathAdditions.append(package->path().toUserOutput()); if (!package->environmentVariableName().isEmpty()) - changes.append({package->environmentVariableName(), - QDir::toNativeSeparators(package->path())}); + changes.append({package->environmentVariableName(), package->path().toUserOutput()}); }; for (auto package : mcuTarget->packages()) processPackage(package); @@ -808,7 +804,7 @@ static void updateKitEnvironment(Kit *k, const McuTarget *mcuTarget) return item.name == varName; }); const EnvironmentItem item = {package->environmentVariableName(), - QDir::toNativeSeparators(package->path())}; + package->path().toUserOutput()}; if (index != -1) changes.replace(index, item); else @@ -819,7 +815,7 @@ static void updateKitEnvironment(Kit *k, const McuTarget *mcuTarget) EnvironmentKitAspect::setEnvironmentChanges(k, changes); } -static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const QString &qulDir) +static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const FilePath &qulDir) { using namespace CMakeProjectManager; @@ -832,7 +828,7 @@ static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const QString } if (!mcuTarget->toolChainPackage()->isDesktopToolchain()) { - const FilePath cMakeToolchainFile = FilePath::fromString(qulDir + "/lib/cmake/Qul/toolchain/" + const FilePath cMakeToolchainFile = qulDir.pathAppended("lib/cmake/Qul/toolchain/" + mcuTarget->toolChainPackage()->cmakeToolChainFileName()); config.append(CMakeConfigItem( @@ -844,7 +840,7 @@ static void setKitCMakeOptions(Kit *k, const McuTarget* mcuTarget, const QString } } - const FilePath generatorsPath = FilePath::fromString(qulDir + "/lib/cmake/Qul/QulGenerators.cmake"); + const FilePath generatorsPath = qulDir.pathAppended("/lib/cmake/Qul/QulGenerators.cmake"); config.append(CMakeConfigItem("QUL_GENERATORS", generatorsPath.toString().toUtf8())); if (!generatorsPath.exists()) { @@ -947,7 +943,7 @@ QList McuSupportOptions::kitsWithMismatchedDependencies(const McuTarget * EnvironmentKitAspect::environmentChanges(kit))); return Utils::anyOf(mcuTarget->packages(), [&environment](const McuPackage *package) { return !package->environmentVariableName().isEmpty() && - environment.value(package->environmentVariableName()) != QDir::toNativeSeparators(package->path()); + environment.value(package->environmentVariableName()) != package->path().toUserOutput(); }); }); } @@ -1003,13 +999,13 @@ QVersionNumber McuSupportOptions::kitQulVersion(const Kit *kit) .toString()); } -QString kitDependencyPath(const Kit *kit, const QString &variableName) +static FilePath kitDependencyPath(const Kit *kit, const QString &variableName) { for (const NameValueItem &nameValueItem : EnvironmentKitAspect::environmentChanges(kit)) { if (nameValueItem.name == variableName) - return nameValueItem.value; + return FilePath::fromUserInput(nameValueItem.value); } - return QString(); + return FilePath(); } bool McuSupportOptions::kitUpToDate(const Kit *kit, const McuTarget *mcuTarget, @@ -1052,13 +1048,13 @@ void McuSupportOptions::createAutomaticKits() const QString displayPath = FilePath::fromString(qtForMCUsPackage->detectionPath()) .toUserOutput(); printMessage(tr("Path %1 exists, but does not contain %2.") - .arg(qtForMCUsPackage->path(), displayPath), + .arg(qtForMCUsPackage->path().toUserOutput(), displayPath), true); break; } case McuPackage::InvalidPath: { printMessage(tr("Path %1 does not exist. Add the path in Tools > Options > Devices > MCU.") - .arg(qtForMCUsPackage->path()), + .arg(qtForMCUsPackage->path().toUserOutput()), true); break; } @@ -1079,7 +1075,7 @@ void McuSupportOptions::createAutomaticKits() return; } - auto dir = FilePath::fromUserInput(qtForMCUsPackage->path()); + FilePath dir = qtForMCUsPackage->path(); QVector packages; QVector mcuTargets; Sdk::targetsAndPackages(dir, &packages, &mcuTargets); @@ -1131,7 +1127,7 @@ void McuSupportOptions::upgradeKits(UpgradeOption upgradeOption) auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); - auto dir = FilePath::fromUserInput(qtForMCUsPackage->path()); + auto dir = qtForMCUsPackage->path(); QVector packages; QVector mcuTargets; Sdk::targetsAndPackages(dir, &packages, &mcuTargets); @@ -1169,7 +1165,7 @@ void McuSupportOptions::fixKitsDependencies() { auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); - auto dir = FilePath::fromUserInput(qtForMCUsPackage->path()); + FilePath dir = qtForMCUsPackage->path(); QVector packages; QVector mcuTargets; Sdk::targetsAndPackages(dir, &packages, &mcuTargets); @@ -1245,7 +1241,7 @@ void McuSupportOptions::fixExistingKits() auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); qtForMCUsPackage->updateStatus(); if (qtForMCUsPackage->validStatus()) { - auto dir = FilePath::fromUserInput(qtForMCUsPackage->path()); + FilePath dir = qtForMCUsPackage->path(); QVector packages; QVector mcuTargets; Sdk::targetsAndPackages(dir, &packages, &mcuTargets); diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index f70722412d7..346c2b9de50 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -66,15 +66,15 @@ public: ValidPackage }; - McuPackage(const QString &label, const QString &defaultPath, + McuPackage(const QString &label, const Utils::FilePath &defaultPath, const QString &detectionPath, const QString &settingsKey, const McuPackageVersionDetector *versionDetector = nullptr); virtual ~McuPackage() = default; - QString basePath() const; - QString path() const; + Utils::FilePath basePath() const; + Utils::FilePath path() const; QString label() const; - QString defaultPath() const; + Utils::FilePath defaultPath() const; QString detectionPath() const; QString statusText() const; void updateStatus(); @@ -110,12 +110,12 @@ private: Utils::InfoLabel *m_infoLabel = nullptr; const QString m_label; - const QString m_defaultPath; + const Utils::FilePath m_defaultPath; const QString m_detectionPath; const QString m_settingsKey; const McuPackageVersionDetector *m_versionDetector; - QString m_path; + Utils::FilePath m_path; QString m_relativePathModifier; // relative path to m_path to be returned by path() QString m_detectedVersion; QVector m_versions; @@ -142,7 +142,7 @@ public: }; McuToolChainPackage(const QString &label, - const QString &defaultPath, + const Utils::FilePath &defaultPath, const QString &detectionPath, const QString &settingsKey, Type type, diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 9ccffd63e01..71eff41c246 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -193,7 +193,7 @@ void McuSupportOptionsWidget::updateStatus() m_mcuTargetsInfoLabel->setVisible(valid && m_options.mcuTargets.isEmpty()); if (m_mcuTargetsInfoLabel->isVisible()) { m_mcuTargetsInfoLabel->setType(Utils::InfoLabel::NotOk); - const auto sdkPath = Utils::FilePath::fromString(m_options.qtForMCUsSdkPackage->basePath()); + const Utils::FilePath sdkPath = m_options.qtForMCUsSdkPackage->basePath(); QString deprecationMessage; if (Sdk::checkDeprecatedSdkError(sdkPath, deprecationMessage)) m_mcuTargetsInfoLabel->setText(deprecationMessage); diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index b805b4a91ae..291f0647b29 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -49,15 +49,14 @@ namespace McuSupport { namespace Internal { namespace Sdk { -static QString findInProgramFiles(const QString &folder) +static FilePath findInProgramFiles(const QString &folder) { for (auto envVar : {"ProgramFiles", "ProgramFiles(x86)", "ProgramW6432"}) { if (!qEnvironmentVariableIsSet(envVar)) continue; - const Utils::FilePath dir = - Utils::FilePath::fromUserInput(qEnvironmentVariable(envVar) + "/" + folder); + const FilePath dir = FilePath::fromUserInput(qEnvironmentVariable(envVar)) / folder; if (dir.exists()) - return dir.toString(); + return dir; } return {}; } @@ -66,7 +65,7 @@ McuPackage *createQtForMCUsPackage() { auto result = new McuPackage( McuPackage::tr("Qt for MCUs SDK"), - QDir::homePath(), + FileUtils::homePath(), FilePath("bin/qmltocpp").withExecutableSuffix().toString(), Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK); result->setEnvironmentVariableName("Qul_DIR"); @@ -92,22 +91,21 @@ static McuToolChainPackage *createArmGccPackage() { const char envVar[] = "ARMGCC_DIR"; - QString defaultPath; + FilePath defaultPath; if (qEnvironmentVariableIsSet(envVar)) - defaultPath = qEnvironmentVariable(envVar); - if (defaultPath.isEmpty() && Utils::HostOsInfo::isWindowsHost()) { - const QDir installDir(findInProgramFiles("/GNU Tools ARM Embedded/")); + defaultPath = FilePath::fromUserInput(qEnvironmentVariable(envVar)); + if (defaultPath.isEmpty() && HostOsInfo::isWindowsHost()) { + const FilePath installDir = findInProgramFiles("GNU Tools ARM Embedded"); if (installDir.exists()) { // If GNU Tools installation dir has only one sub dir, // select the sub dir, otherwise the installation dir. - const QFileInfoList subDirs = - installDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + const FilePaths subDirs = installDir.dirEntries(QDir::Dirs | QDir::NoDotAndDotDot); if (subDirs.count() == 1) - defaultPath = subDirs.first().filePath() + '/'; + defaultPath = subDirs.first(); } } if (defaultPath.isEmpty()) - defaultPath = QDir::homePath(); + defaultPath = FileUtils::homePath(); const QString detectionPath = Utils::HostOsInfo::withExecutableSuffix("bin/arm-none-eabi-g++"); const auto versionDetector = new McuPackageExecutableVersionDetector( @@ -131,8 +129,8 @@ static McuToolChainPackage *createGhsToolchainPackage() { const char envVar[] = "GHS_COMPILER_DIR"; - const QString defaultPath = - qEnvironmentVariableIsSet(envVar) ? qEnvironmentVariable(envVar) : QDir::homePath(); + const FilePath defaultPath = qEnvironmentVariableIsSet(envVar) + ? FilePath::fromUserInput(qEnvironmentVariable(envVar)) : FileUtils::homePath(); const auto versionDetector = new McuPackageExecutableVersionDetector( Utils::HostOsInfo::withExecutableSuffix("as850"), @@ -155,8 +153,8 @@ static McuToolChainPackage *createGhsArmToolchainPackage() { const char envVar[] = "GHS_ARM_COMPILER_DIR"; - const QString defaultPath = - qEnvironmentVariableIsSet(envVar) ? qEnvironmentVariable(envVar) : QDir::homePath(); + const FilePath defaultPath = qEnvironmentVariableIsSet(envVar) + ? FilePath::fromUserInput(qEnvironmentVariable(envVar)) : FileUtils::homePath(); const auto versionDetector = new McuPackageExecutableVersionDetector( Utils::HostOsInfo::withExecutableSuffix("asarm"), @@ -179,20 +177,20 @@ static McuToolChainPackage *createIarToolChainPackage() { const char envVar[] = "IAR_ARM_COMPILER_DIR"; - QString defaultPath; + FilePath defaultPath; if (qEnvironmentVariableIsSet(envVar)) - defaultPath = qEnvironmentVariable(envVar); + defaultPath = FilePath::fromUserInput(qEnvironmentVariable(envVar)); else { const ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainManager::toolChain([](const ProjectExplorer::ToolChain *t) { return t->typeId() == BareMetal::Constants::IAREW_TOOLCHAIN_TYPEID; }); if (tc) { - const Utils::FilePath compilerExecPath = tc->compilerCommand(); - defaultPath = compilerExecPath.parentDir().parentDir().toString(); + const FilePath compilerExecPath = tc->compilerCommand(); + defaultPath = compilerExecPath.parentDir().parentDir(); } else - defaultPath = QDir::homePath(); + defaultPath = FileUtils::homePath(); } const QString detectionPath = Utils::HostOsInfo::withExecutableSuffix("bin/iccarm"); @@ -217,17 +215,17 @@ static McuPackage *createRGLPackage() { const char envVar[] = "RGL_DIR"; - QString defaultPath; + FilePath defaultPath; if (qEnvironmentVariableIsSet(envVar)) { - defaultPath = qEnvironmentVariable(envVar); + defaultPath = FilePath::fromUserInput(qEnvironmentVariable(envVar)); } else if (Utils::HostOsInfo::isWindowsHost()) { - defaultPath = QDir::rootPath() + "Renesas_Electronics/D1x_RGL"; - if (QFileInfo::exists(defaultPath)) { - const QFileInfoList subDirs = - QDir(defaultPath).entryInfoList({QLatin1String("rgl_ghs_D1Mx_*")}, + defaultPath = FilePath::fromUserInput(QDir::rootPath() + "Renesas_Electronics/D1x_RGL"); + if (defaultPath.exists()) { + const FilePaths subDirs = + defaultPath.dirEntries({QLatin1String("rgl_ghs_D1Mx_*")}, QDir::Dirs | QDir::NoDotAndDotDot); if (subDirs.count() == 1) - defaultPath = subDirs.first().filePath() + '/'; + defaultPath = subDirs.first(); } } @@ -242,15 +240,15 @@ static McuPackage *createRGLPackage() static McuPackage *createStm32CubeProgrammerPackage() { - QString defaultPath = QDir::homePath(); - const QString cubePath = "/STMicroelectronics/STM32Cube/STM32CubeProgrammer/"; - if (Utils::HostOsInfo::isWindowsHost()) { - const QString programPath = findInProgramFiles(cubePath); + FilePath defaultPath = FileUtils::homePath(); + const QString cubePath = "STMicroelectronics/STM32Cube/STM32CubeProgrammer"; + if (HostOsInfo::isWindowsHost()) { + const FilePath programPath = findInProgramFiles(cubePath); if (!programPath.isEmpty()) defaultPath = programPath; } else { - const QString programPath = QDir::homePath() + cubePath; - if (QFileInfo::exists(programPath)) + const FilePath programPath = FileUtils::homePath() / cubePath; + if (programPath.exists()) defaultPath = programPath; } auto result = new McuPackage( @@ -270,18 +268,18 @@ static McuPackage *createMcuXpressoIdePackage() { const char envVar[] = "MCUXpressoIDE_PATH"; - QString defaultPath; + FilePath defaultPath; if (qEnvironmentVariableIsSet(envVar)) { - defaultPath = qEnvironmentVariable(envVar); - } else if (Utils::HostOsInfo::isWindowsHost()) { - defaultPath = QDir::rootPath() + "nxp"; - if (QFileInfo::exists(defaultPath)) { + defaultPath = FilePath::fromUserInput(qEnvironmentVariable(envVar)); + } else if (HostOsInfo::isWindowsHost()) { + defaultPath = FilePath::fromString(QDir::rootPath() + "nxp"); + if (defaultPath.exists()) { // If default dir has exactly one sub dir that could be the IDE path, pre-select that. - const QFileInfoList subDirs = - QDir(defaultPath).entryInfoList({QLatin1String("MCUXpressoIDE*")}, + const FilePaths subDirs = + defaultPath.dirEntries({QLatin1String("MCUXpressoIDE*")}, QDir::Dirs | QDir::NoDotAndDotDot); if (subDirs.count() == 1) - defaultPath = subDirs.first().filePath() + '/'; + defaultPath = subDirs.first(); } } else { defaultPath = "/usr/local/mcuxpressoide/"; @@ -301,21 +299,20 @@ static McuPackage *createCypressProgrammerPackage() { const char envVar[] = "CYPRESS_AUTO_FLASH_UTILITY_DIR"; - QString defaultPath; + FilePath defaultPath; if (qEnvironmentVariableIsSet(envVar)) { - defaultPath = qEnvironmentVariable(envVar); - } else if (Utils::HostOsInfo::isWindowsHost()) { - auto candidate = findInProgramFiles(QLatin1String("/Cypress/Cypress Auto Flash Utility 1.0/")); - if (QFileInfo::exists(candidate)) { + defaultPath = FilePath::fromUserInput(qEnvironmentVariable(envVar)); + } else if (HostOsInfo::isWindowsHost()) { + FilePath candidate = findInProgramFiles("Cypress/Cypress Auto Flash Utility 1.0"); + if (candidate.exists()) { defaultPath = candidate; } } else { - defaultPath = QLatin1String("/usr"); + defaultPath = "/usr"; } - if (defaultPath.isEmpty()) { - defaultPath = QDir::homePath(); - } + if (defaultPath.isEmpty()) + defaultPath = FileUtils::homePath(); auto result = new McuPackage( "Cypress Auto Flash Utility", @@ -378,18 +375,16 @@ static McuPackage *createBoardSdkPackage(const McuTargetDescription& desc) }; const QString sdkName = desc.boardSdkName.isEmpty() ? generateSdkName(desc.boardSdkEnvVar) : desc.boardSdkName; - const QString defaultPath = [&] { + const FilePath defaultPath = [&] { const auto envVar = desc.boardSdkEnvVar.toLatin1(); - if (qEnvironmentVariableIsSet(envVar)) { - return qEnvironmentVariable(envVar); - } + if (qEnvironmentVariableIsSet(envVar)) + return FilePath::fromUserInput(qEnvironmentVariable(envVar)); if (!desc.boardSdkDefaultPath.isEmpty()) { - QString defaultPath = QDir::rootPath() + desc.boardSdkDefaultPath; - if (QFileInfo::exists(defaultPath)) { + FilePath defaultPath = FilePath::fromUserInput(QDir::rootPath() + desc.boardSdkDefaultPath); + if (defaultPath.exists()) return defaultPath; - } } - return QDir::homePath(); + return FileUtils::homePath(); }(); const auto versionDetector = generatePackageVersionDetector(desc.boardSdkEnvVar); @@ -404,18 +399,18 @@ static McuPackage *createBoardSdkPackage(const McuTargetDescription& desc) return result; } -static McuPackage *createFreeRTOSSourcesPackage(const QString &envVar, const QString &boardSdkDir, +static McuPackage *createFreeRTOSSourcesPackage(const QString &envVar, const FilePath &boardSdkDir, const QString &freeRTOSBoardSdkSubDir) { const QString envVarPrefix = envVar.chopped(int(strlen("_FREERTOS_DIR"))); - QString defaultPath; + FilePath defaultPath; if (qEnvironmentVariableIsSet(envVar.toLatin1())) - defaultPath = qEnvironmentVariable(envVar.toLatin1()); + defaultPath = FilePath::fromUserInput(qEnvironmentVariable(envVar.toLatin1())); else if (!boardSdkDir.isEmpty() && !freeRTOSBoardSdkSubDir.isEmpty()) - defaultPath = boardSdkDir + "/" + freeRTOSBoardSdkSubDir; + defaultPath = boardSdkDir / freeRTOSBoardSdkSubDir; else - defaultPath = QDir::homePath(); + defaultPath = FileUtils::homePath(); auto result = new McuPackage( QString::fromLatin1("FreeRTOS Sources (%1)").arg(envVarPrefix), @@ -473,7 +468,7 @@ protected: if (vendorPkgs.contains(desc.platformVendor)) required3rdPartyPkgs.push_back(vendorPkgs.value(desc.platformVendor)); - QString boardSdkDefaultPath; + FilePath boardSdkDefaultPath; if (!desc.boardSdkEnvVar.isEmpty()) { if (!boardSdkPkgs.contains(desc.boardSdkEnvVar)) { auto boardSdkPkg = desc.boardSdkEnvVar != "RGL_DIR" @@ -551,7 +546,7 @@ protected: required3rdPartyPkgs.push_back(vendorPkgs.value(desc.platformVendor)); // Board SDK specific settings - QString boardSdkDefaultPath; + FilePath boardSdkDefaultPath; if (!desc.boardSdkEnvVar.isEmpty()) { if (!boardSdkPkgs.contains(desc.boardSdkEnvVar)) { auto boardSdkPkg = createBoardSdkPackage(desc); From 9e5744b1f37156f791b229d1b9d9b0882b90cd90 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 4 Oct 2021 16:35:58 +0200 Subject: [PATCH 06/67] Remove unneeded include of QAbstractProxyModel QSortFilterProxyModel, which we already include and use here, is derived from QAbstractProxyModel, which we don't use here. Change-Id: I896f27d25cc75e73a7f97b82657fad648ef0ab99 Reviewed-by: Qt CI Bot Reviewed-by: Eike Ziller --- src/plugins/coreplugin/dialogs/newdialogwidget.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/coreplugin/dialogs/newdialogwidget.cpp b/src/plugins/coreplugin/dialogs/newdialogwidget.cpp index f8a77c4e8d7..66569b85cfe 100644 --- a/src/plugins/coreplugin/dialogs/newdialogwidget.cpp +++ b/src/plugins/coreplugin/dialogs/newdialogwidget.cpp @@ -32,7 +32,6 @@ #include #include -#include #include #include #include From e0611c0cfafe850f206f67fd919938531a7af97c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 24 Sep 2021 15:49:49 +0300 Subject: [PATCH 07/67] QmlDesigner: Add support for Component type Component type is added to Component Library and can be dragged to the scene. Items under the component are not shown in the scene. Fixes: QDS-5093 Change-Id: I0c80647e73124866a8b772022a761ca6cbb545a1 Reviewed-by: Thomas Hartmann --- src/libs/qmljs/qmljscheck.cpp | 1 - .../components/formeditor/formeditoritem.cpp | 14 +------ .../components/formeditor/formeditoritem.h | 4 -- .../components/formeditor/formeditorview.cpp | 40 ++++++++++--------- .../components/formeditor/formeditorview.h | 1 - .../components/formeditor/selectiontool.cpp | 18 ++++++++- .../navigator/navigatortreemodel.cpp | 10 ++++- .../designercore/model/qmlvisualnode.cpp | 6 ++- .../qmldesigner/qtquickplugin/quick.metainfo | 16 ++++++++ 9 files changed, 70 insertions(+), 40 deletions(-) diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index d63ae116117..3ce402589c1 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -617,7 +617,6 @@ class UnsupportedTypesByQmlUi : public QStringList { public: UnsupportedTypesByQmlUi() : QStringList({"ShaderEffect", - "Component", "Drawer"}) { append(UnsupportedTypesByVisualDesigner()); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp index 8200558d182..4f000e12953 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp @@ -99,8 +99,7 @@ FormEditorItem::FormEditorItem(const QmlItemNode &qmlItemNode, FormEditorScene* m_borderWidth(1.0), m_highlightBoundingRect(false), m_blurContent(false), - m_isContentVisible(true), - m_isFormEditorVisible(true) + m_isContentVisible(true) { setCacheMode(QGraphicsItem::NoCache); setup(); @@ -208,17 +207,6 @@ bool FormEditorItem::isContentVisible() const return m_isContentVisible; } - -bool FormEditorItem::isFormEditorVisible() const -{ - return m_isFormEditorVisible; -} -void FormEditorItem::setFormEditorVisible(bool isVisible) -{ - m_isFormEditorVisible = isVisible; - setVisible(isVisible); -} - QPointF FormEditorItem::center() const { return mapToScene(qmlItemNode().instanceBoundingRect().center()); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.h b/src/plugins/qmldesigner/components/formeditor/formeditoritem.h index 769488aa4a3..2213f42a664 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.h @@ -104,9 +104,6 @@ public: void setContentVisible(bool visible); bool isContentVisible() const; - bool isFormEditorVisible() const; - void setFormEditorVisible(bool isVisible); - QPointF center() const; qreal selectionWeigth(const QPointF &point, int iteration); @@ -152,7 +149,6 @@ private: // variables bool m_highlightBoundingRect; bool m_blurContent; bool m_isContentVisible; - bool m_isFormEditorVisible; }; class FormEditorFlowItem : public FormEditorItem diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 0ee760b9a13..9a01bbd9401 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -199,16 +199,6 @@ void FormEditorView::removeNodeFromScene(const QmlItemNode &qmlItemNode) m_currentTool->itemsAboutToRemoved(removedItemList); } -void FormEditorView::hideNodeFromScene(const QmlItemNode &qmlItemNode) -{ - if (FormEditorItem *item = m_scene->itemForQmlItemNode(qmlItemNode)) { - QList removedItems = scene()->itemsForQmlItemNodes(qmlItemNode.allSubModelNodes()); - removedItems.append(item); - m_currentTool->itemsAboutToRemoved(removedItems); - item->setFormEditorVisible(false); - } -} - void FormEditorView::createFormEditorWidget() { m_formEditorWidget = QPointer(new FormEditorWidget(this)); @@ -248,10 +238,7 @@ void FormEditorView::temporaryBlockView(int duration) void FormEditorView::nodeCreated(const ModelNode &node) { - //If the node has source for components/custom parsers we ignore it. - if (QmlItemNode::isValidQmlItemNode(node) && node.nodeSourceType() == ModelNode::NodeWithoutSource) //only setup QmlItems - setupFormEditorItemTree(QmlItemNode(node)); - else if (QmlVisualNode::isFlowTransition(node)) + if (QmlVisualNode::isFlowTransition(node)) setupFormEditorItemTree(QmlItemNode(node)); } @@ -349,8 +336,26 @@ static inline bool hasNodeSourceParent(const ModelNode &node) void FormEditorView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &/*newPropertyParent*/, const NodeAbstractProperty &/*oldPropertyParent*/, AbstractView::PropertyChangeFlags /*propertyChange*/) { - if (hasNodeSourceParent(node)) - hideNodeFromScene(node); + // If node is not connected to scene root, don't do anything yet to avoid duplicated effort, + // as any removal or addition will remove or add descendants as well. + if (!node.isInHierarchy()) + return; + + QmlItemNode itemNode(node); + if (hasNodeSourceParent(node)) { + if (FormEditorItem *item = m_scene->itemForQmlItemNode(itemNode)) { + QList removed = scene()->itemsForQmlItemNodes(itemNode.allSubModelNodes()); + removed.append(item); + m_currentTool->itemsAboutToRemoved(removed); + removeNodeFromScene(itemNode); + } + } else if (itemNode.isValid() && node.nodeSourceType() == ModelNode::NodeWithoutSource) { + if (!m_scene->itemForQmlItemNode(itemNode)) { + setupFormEditorItemTree(itemNode); + // Simulate selection change to refresh tools + selectedNodesChanged(selectedModelNodes(), {}); + } + } } WidgetInfo FormEditorView::widgetInfo() @@ -603,8 +608,7 @@ void FormEditorView::auxiliaryDataChanged(const ModelNode &node, const PropertyN if (name == "invisible") { if (FormEditorItem *item = scene()->itemForQmlItemNode(QmlItemNode(node))) { bool isInvisible = data.toBool(); - if (item->isFormEditorVisible()) - item->setVisible(!isInvisible); + item->setVisible(!isInvisible); ModelNode newNode(node); if (isInvisible) newNode.deselectNode(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index ba2b79df994..04b7d1e83ec 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -144,7 +144,6 @@ protected: private: void setupFormEditorItemTree(const QmlItemNode &qmlItemNode); void removeNodeFromScene(const QmlItemNode &qmlItemNode); - void hideNodeFromScene(const QmlItemNode &qmlItemNode); void createFormEditorWidget(); void temporaryBlockView(int duration = 1000); void resetNodeInstanceView(); diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp index 7230e97a1c7..b6bf74e3d45 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp @@ -34,6 +34,8 @@ #include +#include + #include #include @@ -242,9 +244,23 @@ void SelectionTool::dragMoveEvent(const QList &/*itemList*/, QGr { } -void SelectionTool::itemsAboutToRemoved(const QList &/*itemList*/) +void SelectionTool::itemsAboutToRemoved(const QList &itemList) { + const QList current = items(); + QList remaining = Utils::filtered(current, [&itemList](const FormEditorItem *item) { + return !itemList.contains(item); + }); + + if (!remaining.isEmpty()) { + m_selectionIndicator.setItems(remaining); + m_resizeIndicator.setItems(remaining); + m_rotationIndicator.setItems(remaining); + m_anchorIndicator.setItems(remaining); + m_bindingIndicator.setItems(remaining); + } else { + clear(); + } } void SelectionTool::clear() diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 5abc38eba69..7f8a75f1c46 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -1085,10 +1085,18 @@ void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty &parentProper if (modelNode.isValid() && modelNode != parentProperty.parentModelNode() && !modelNode.isAncestorOf(parentProperty.parentModelNode()) - && (modelNode.metaInfo().isSubclassOf(propertyQmlType) || propertyQmlType == "alias")) { + && (modelNode.metaInfo().isSubclassOf(propertyQmlType) + || propertyQmlType == "alias" + || parentProperty.name() == "data")) { //### todo: allowing alias is just a heuristic //once the MetaInfo is part of instances we can do this right + // We assume above that "data" property in parent accepts all types. + // This is a workaround for Component parents to accept children, even though they + // do not have an actual "data" property or apparently any other default property. + // When the actual reparenting happens, model will create the "data" property if + // it is missing. + bool nodeCanBeMovedToParentProperty = removeModelNodeFromNodeProperty(parentProperty, modelNode); if (nodeCanBeMovedToParentProperty) { reparentModelNodeToNodeProperty(parentProperty, modelNode); diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index 802740fc1d3..544471b03cc 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -309,7 +309,11 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, } } - newQmlObjectNode = QmlObjectNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList)); + ModelNode::NodeSourceType nodeSourceType = ModelNode::NodeWithoutSource; + if (itemLibraryEntry.typeName() == "QtQml.Component") + nodeSourceType = ModelNode::NodeWithComponentSource; + + newQmlObjectNode = QmlObjectNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList, {}, {}, nodeSourceType)); } else { newQmlObjectNode = createQmlObjectNodeFromSource(view, itemLibraryEntry.qmlSource(), position); } diff --git a/src/plugins/qmldesigner/qtquickplugin/quick.metainfo b/src/plugins/qmldesigner/qtquickplugin/quick.metainfo index bbd91d40a85..877f1203390 100644 --- a/src/plugins/qmldesigner/qtquickplugin/quick.metainfo +++ b/src/plugins/qmldesigner/qtquickplugin/quick.metainfo @@ -432,4 +432,20 @@ MetaInfo { } } + Type { + name: "QtQml.Component" + icon: ":/qtquickplugin/images/item-icon16.png" + + Hints { + canBeDroppedInNavigator: true + canBeDroppedInFormEditor: false + } + + ItemLibraryEntry { + name: "Component" + category: "e.Qt Quick - Component" + libraryIcon: ":/qtquickplugin/images/item-icon.png" + version: "2.0" + } + } } From 545da2f6a661d1d82a79edd0f7cff8eb0041b8ef Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 4 Oct 2021 14:25:35 +0200 Subject: [PATCH 08/67] ClangCodeModel: Improve collection of highlighting info from AST ... with clangd. - Turn function with lots of lambdas into a class. - Traverse the AST without repeatedly modifying a list in a tight loop. Change-Id: I46668a4df672c00cbd7b1a562ae94a6db4cbd2fc Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 920 +++++++++++--------- 1 file changed, 488 insertions(+), 432 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index fea5314001e..0594947798b 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -171,6 +171,12 @@ public: bool isNamespace() const { return role() == "declaration" && kind() == "Namespace"; } + bool isTemplateParameterDeclaration() const + { + return role() == "declaration" && (kind() == "TemplateTypeParm" + || kind() == "NonTypeTemplateParm"); + }; + QString type() const { const Utils::optional arcanaString = arcana(); @@ -2013,440 +2019,31 @@ void ClangdClient::Private::setHelpItemForTooltip(const MessageId &token, const q->hoverHandler()->setHelpItem(token, helpItem); } -static void collectExtraResults(QFutureInterface &future, - HighlightingResults &results, const AstNode &ast, - QTextDocument *doc, const QString &docContent) +class ExtraHighlightingResultsCollector { - if (!ast.isValid()) - return; +public: + ExtraHighlightingResultsCollector(QFutureInterface &future, + HighlightingResults &results, const AstNode &ast, + QTextDocument *doc, const QString &docContent); - static const auto lessThan = [](const HighlightingResult &r1, - const HighlightingResult &r2) { - return r1.line < r2.line || (r1.line == r2.line && r1.column < r2.column) - || (r1.line == r2.line && r1.column == r2.column && r1.length < r2.length); - }; - const auto insert = [&](const HighlightingResult &result) { - if (!result.isValid()) // Some nodes don't have a range. - return; - const auto it = std::lower_bound(results.begin(), results.end(), result, lessThan); - if (it == results.end() || *it != result) { - qCDebug(clangdLogHighlight) << "adding additional highlighting result" - << result.line << result.column << result.length; - results.insert(it, result); - return; - } + void collect(); +private: + static bool lessThan(const HighlightingResult &r1, const HighlightingResult &r2); + static int onlyIndexOf(const QStringView &text, const QStringView &subString, int from = 0); + int posForNodeStart(const AstNode &node) const; + int posForNodeEnd(const AstNode &node) const; + void insertResult(const HighlightingResult &result); + void insertAngleBracketInfo(int searchStart1, int searchEnd1, int searchStart2, int searchEnd2); + void setResultPosFromRange(HighlightingResult &result, const Range &range); + void collectFromNode(const AstNode &node); + void visitNode(const AstNode&node); - // This is for conversion operators, whose type part is only reported as a type by clangd. - if ((it->textStyles.mainStyle == C_TYPE - || it->textStyles.mainStyle == C_PRIMITIVE_TYPE) - && !result.textStyles.mixinStyles.empty() - && result.textStyles.mixinStyles.at(0) == C_OPERATOR) { - it->textStyles.mixinStyles = result.textStyles.mixinStyles; - } - }; - const auto setFromRange = [doc](HighlightingResult &result, const Range &range) { - if (!range.isValid()) - return; - const Position startPos = range.start(); - const Position endPos = range.end(); - result.line = startPos.line() + 1; - result.column = startPos.character() + 1; - result.length = endPos.toPositionInDocument(doc) - startPos.toPositionInDocument(doc); - }; - static const auto onlyIndexOf = [](const QStringView &view, const QStringView &s, - int from = 0) { - const int firstIndex = view.indexOf(s, from); - if (firstIndex == -1) - return -1; - const int nextIndex = view.indexOf(s, firstIndex + 1); - - // The second condion deals with the off-by-one error in TemplateSpecialization nodes; - // see below. - return nextIndex == -1 || nextIndex == firstIndex + 1 ? firstIndex : -1; - }; - - QList nodes = {ast}; - while (!nodes.isEmpty()) { - if (future.isCanceled()) - return; - const AstNode node = nodes.takeFirst(); - const QList children = node.children().value_or(QList()); - nodes << children; - - if (node.kind().endsWith("Literal")) { - HighlightingResult result; - result.useTextSyles = true; - const bool isStringLike = node.kind().startsWith("String") - || node.kind().startsWith("Character"); - result.textStyles.mainStyle = isStringLike ? C_STRING : C_NUMBER; - setFromRange(result, node.range()); - insert(result); - continue; - } - if (node.role() == "type" && node.kind() == "Builtin") { - HighlightingResult result; - result.useTextSyles = true; - result.textStyles.mainStyle = C_PRIMITIVE_TYPE; - setFromRange(result, node.range()); - insert(result); - continue; - } - if (node.role() == "attribute" && (node.kind() == "Override" || node.kind() == "Final")) { - HighlightingResult result; - result.useTextSyles = true; - result.textStyles.mainStyle = C_KEYWORD; - setFromRange(result, node.range()); - insert(result); - continue; - } - - const bool isExpression = node.role() == "expression"; - const bool isDeclaration = node.role() == "declaration"; - - // Unfortunately, the exact position of a specific token is usually not - // recorded in the AST, so if we need that, we have to search for it textually. - // In corner cases, this might get sabotaged by e.g. comments, in which case we give up. - const auto posForNodeStart = [doc](const AstNode &node) { - return Utils::Text::positionInText(doc, node.range().start().line() + 1, - node.range().start().character() + 1); - }; - const auto posForNodeEnd = [doc](const AstNode &node) { - return Utils::Text::positionInText(doc, node.range().end().line() + 1, - node.range().end().character() + 1); - }; - const int nodeStartPos = posForNodeStart(node); - const int nodeEndPos = posForNodeEnd(node); - - // Match question mark and colon in ternary operators. - if (isExpression && node.kind() == "ConditionalOperator") { - if (children.size() != 3) - continue; - - // The question mark is between sub-expressions 1 and 2, the colon is between - // sub-expressions 2 and 3. - const int searchStartPosQuestionMark = posForNodeEnd(children.first()); - const int searchEndPosQuestionMark = posForNodeStart(children.at(1)); - QStringView content = QStringView(docContent).mid(searchStartPosQuestionMark, - searchEndPosQuestionMark - searchStartPosQuestionMark); - const int questionMarkPos = onlyIndexOf(content, QStringView(QStringLiteral("?"))); - if (questionMarkPos == -1) - continue; - const int searchStartPosColon = posForNodeEnd(children.at(1)); - const int searchEndPosColon = posForNodeStart(children.at(2)); - content = QStringView(docContent).mid(searchStartPosColon, - searchEndPosColon - searchStartPosColon); - const int colonPos = onlyIndexOf(content, QStringView(QStringLiteral(":"))); - if (colonPos == -1) - continue; - - const int absQuestionMarkPos = searchStartPosQuestionMark + questionMarkPos; - const int absColonPos = searchStartPosColon + colonPos; - if (absQuestionMarkPos > absColonPos) - continue; - - HighlightingResult result; - result.useTextSyles = true; - result.textStyles.mainStyle = C_PUNCTUATION; - result.textStyles.mixinStyles.push_back(C_OPERATOR); - Utils::Text::convertPosition(doc, absQuestionMarkPos, &result.line, &result.column); - result.length = 1; - result.kind = CppEditor::SemanticHighlighter::TernaryIf; - insert(result); - Utils::Text::convertPosition(doc, absColonPos, &result.line, &result.column); - result.kind = CppEditor::SemanticHighlighter::TernaryElse; - insert(result); - continue; - } - - // The following functions are for matching the "<" and ">" brackets of template - // declarations, specializations and instantiations. - const auto insertAngleBracketInfo = [&docContent, doc, &insert]( - int searchStart1, int searchEnd1, int searchStart2, int searchEnd2) { - const int openingAngleBracketPos = onlyIndexOf( - QStringView(docContent).mid(searchStart1, searchEnd1 - searchStart1), - QStringView(QStringLiteral("<"))); - if (openingAngleBracketPos == -1) - return; - const int absOpeningAngleBracketPos = searchStart1 + openingAngleBracketPos; - if (absOpeningAngleBracketPos > searchStart2) - searchStart2 = absOpeningAngleBracketPos + 1; - if (searchStart2 >= searchEnd2) - return; - const int closingAngleBracketPos = onlyIndexOf( - QStringView(docContent).mid(searchStart2, searchEnd2 - searchStart2), - QStringView(QStringLiteral(">"))); - if (closingAngleBracketPos == -1) - return; - - const int absClosingAngleBracketPos = searchStart2 + closingAngleBracketPos; - if (absOpeningAngleBracketPos > absClosingAngleBracketPos) - return; - - HighlightingResult result; - result.useTextSyles = true; - result.textStyles.mainStyle = C_PUNCTUATION; - Utils::Text::convertPosition(doc, absOpeningAngleBracketPos, - &result.line, &result.column); - result.length = 1; - result.kind = CppEditor::SemanticHighlighter::AngleBracketOpen; - insert(result); - Utils::Text::convertPosition(doc, absClosingAngleBracketPos, - &result.line, &result.column); - result.kind = CppEditor::SemanticHighlighter::AngleBracketClose; - insert(result); - }; - - if (isDeclaration && (node.kind() == "FunctionTemplate" - || node.kind() == "ClassTemplate")) { - // The child nodes are the template parameters and and the function or class. - // The opening angle bracket is before the first child node, the closing angle - // bracket is before the function child node and after the last param node. - const QString classOrFunctionKind = QLatin1String(node.kind() == "FunctionTemplate" - ? "Function" : "CXXRecord"); - const auto functionOrClassIt = std::find_if(children.begin(), children.end(), - [&classOrFunctionKind](const AstNode &n) { - return n.role() == "declaration" && n.kind() == classOrFunctionKind; - }); - if (functionOrClassIt == children.end() || functionOrClassIt == children.begin()) - continue; - const int firstTemplateParamStartPos = posForNodeStart(children.first()); - const int lastTemplateParamEndPos = posForNodeEnd(*(functionOrClassIt - 1)); - const int functionOrClassStartPos = posForNodeStart(*functionOrClassIt); - insertAngleBracketInfo(nodeStartPos, firstTemplateParamStartPos, - lastTemplateParamEndPos, functionOrClassStartPos); - continue; - } - - static const auto findTemplateParam = [](const AstNode &n) { - return n.role() == "declaration" && (n.kind() == "TemplateTypeParm" - || n.kind() == "NonTypeTemplateParm"); - }; - - if (isDeclaration && node.kind() == "TypeAliasTemplate") { - // Children are one node of type TypeAlias and the template parameters. - // The opening angle bracket is before the first parameter and the closing - // angle bracket is after the last parameter. - // The TypeAlias node seems to appear first in the AST, even though lexically - // is comes after the parameters. We don't rely on the order here. - // Note that there is a second pair of angle brackets. That one is part of - // a TemplateSpecialization, which is handled further below. - const auto firstTemplateParam = std::find_if(children.begin(), children.end(), - findTemplateParam); - if (firstTemplateParam == children.end()) - continue; - const auto lastTemplateParam = std::find_if(children.rbegin(), children.rend(), - findTemplateParam); - QTC_ASSERT(lastTemplateParam != children.rend(), continue); - const auto typeAlias = std::find_if(children.begin(), children.end(), - [](const AstNode &n) { return n.kind() == "TypeAlias"; }); - if (typeAlias == children.end()) - continue; - - const int firstTemplateParamStartPos = posForNodeStart(*firstTemplateParam); - const int lastTemplateParamEndPos = posForNodeEnd(*lastTemplateParam); - const int searchEndPos = posForNodeStart(*typeAlias); - insertAngleBracketInfo(nodeStartPos, firstTemplateParamStartPos, - lastTemplateParamEndPos, searchEndPos); - continue; - } - - if (isDeclaration && node.kind() == "ClassTemplateSpecialization") { - // There is one child of kind TemplateSpecialization. The first pair - // of angle brackets comes before that. - if (children.size() == 1) { - const int childNodePos = posForNodeStart(children.first()); - insertAngleBracketInfo(nodeStartPos, childNodePos, nodeStartPos, childNodePos); - } - continue; - } - - if (isDeclaration && node.kind() == "TemplateTemplateParm") { - // The child nodes are template arguments and template parameters. - // Arguments seem to appear before parameters in the AST, even though they - // come after them in the source code. We don't rely on the order here. - const auto firstTemplateParam = std::find_if(children.begin(), children.end(), - findTemplateParam); - if (firstTemplateParam == children.end()) - continue; - const auto lastTemplateParam = std::find_if(children.rbegin(), children.rend(), - findTemplateParam); - QTC_ASSERT(lastTemplateParam != children.rend(), continue); - const auto templateArg = std::find_if(children.begin(), children.end(), - [](const AstNode &n) { return n.role() == "template argument"; }); - - const int firstTemplateParamStartPos = posForNodeStart(*firstTemplateParam); - const int lastTemplateParamEndPos = posForNodeEnd(*lastTemplateParam); - const int searchEndPos = templateArg == children.end() - ? nodeEndPos : posForNodeStart(*templateArg); - insertAngleBracketInfo(nodeStartPos, firstTemplateParamStartPos, - lastTemplateParamEndPos, searchEndPos); - continue; - } - - // {static,dynamic,reinterpret}_cast<>(). - if (isExpression && node.kind().startsWith("CXX") && node.kind().endsWith("Cast")) { - // First child is type, second child is expression. - // The opening angle bracket is before the first child, the closing angle bracket - // is between the two children. - if (children.size() == 2) { - insertAngleBracketInfo(nodeStartPos, posForNodeStart(children.first()), - posForNodeEnd(children.first()), - posForNodeStart(children.last())); - } - continue; - } - - if (node.kind() == "TemplateSpecialization") { - // First comes the template type, then the template arguments. - // The opening angle bracket is before the first template argument, - // the closing angle bracket is after the last template argument. - // The first child node has no range, so we start searching at the parent node. - if (children.size() >= 2) { - int searchStart2 = posForNodeEnd(children.last()); - int searchEnd2 = nodeEndPos; - - // There is a weird off-by-one error on the clang side: If there is a - // nested template instantiation *and* there is no space between - // the closing angle brackets, then the inner TemplateSpecialization node's range - // will extend one character too far, covering the outer's closing angle bracket. - // This is what we are correcting for here. - // This issue is tracked at https://github.com/clangd/clangd/issues/871. - if (searchStart2 == searchEnd2) - --searchStart2; - insertAngleBracketInfo(nodeStartPos, posForNodeStart(children.at(1)), - searchStart2, searchEnd2); - } - continue; - } - - if (!isExpression && !isDeclaration) - continue; - - // Operators, overloaded ones in particular. - static const QString operatorPrefix = "operator"; - QString detail = node.detail().value_or(QString()); - const bool isCallToNew = node.kind() == "CXXNew"; - const bool isCallToDelete = node.kind() == "CXXDelete"; - if (!isCallToNew && !isCallToDelete - && (!detail.startsWith(operatorPrefix) || detail == operatorPrefix)) { - continue; - } - - if (!isCallToNew && !isCallToDelete) - detail.remove(0, operatorPrefix.length()); - - HighlightingResult result; - result.useTextSyles = true; - const bool isConversionOp = node.kind() == "CXXConversion"; - const bool isOverloaded = !isConversionOp - && (isDeclaration || ((!isCallToNew && !isCallToDelete) - || node.arcanaContains("CXXMethod"))); - result.textStyles.mainStyle = isConversionOp - ? C_PRIMITIVE_TYPE - : isCallToNew || isCallToDelete || detail.at(0).isSpace() - ? C_KEYWORD : C_PUNCTUATION; - result.textStyles.mixinStyles.push_back(C_OPERATOR); - if (isOverloaded) - result.textStyles.mixinStyles.push_back(C_OVERLOADED_OPERATOR); - if (isDeclaration) - result.textStyles.mixinStyles.push_back(C_DECLARATION); - - const QStringView nodeText = QStringView(docContent) - .mid(nodeStartPos, nodeEndPos - nodeStartPos); - - if (isCallToNew || isCallToDelete) { - result.line = node.range().start().line() + 1; - result.column = node.range().start().character() + 1; - result.length = isCallToNew ? 3 : 6; - insert(result); - if (node.arcanaContains("array")) { - const int openingBracketOffset = nodeText.indexOf('['); - if (openingBracketOffset == -1) - continue; - const int closingBracketOffset = nodeText.lastIndexOf(']'); - if (closingBracketOffset == -1 || closingBracketOffset < openingBracketOffset) - continue; - - result.textStyles.mainStyle = C_PUNCTUATION; - result.length = 1; - Utils::Text::convertPosition(doc, - nodeStartPos + openingBracketOffset, - &result.line, &result.column); - insert(result); - Utils::Text::convertPosition(doc, - nodeStartPos + closingBracketOffset, - &result.line, &result.column); - insert(result); - } - continue; - } - - if (isExpression && (detail == QLatin1String("()") || detail == QLatin1String("[]"))) { - result.line = node.range().start().line() + 1; - result.column = node.range().start().character() + 1; - result.length = 1; - insert(result); - result.line = node.range().end().line() + 1; - result.column = node.range().end().character(); - insert(result); - continue; - } - - const int opStringLen = detail.at(0).isSpace() ? detail.length() - 1 : detail.length(); - - // The simple case: Call to operator+, +=, * etc. - if (nodeEndPos - nodeStartPos == opStringLen) { - setFromRange(result, node.range()); - insert(result); - continue; - } - - const int prefixOffset = nodeText.indexOf(operatorPrefix); - if (prefixOffset == -1) - continue; - - const bool isArray = detail == "[]"; - const bool isCall = detail == "()"; - const bool isArrayNew = detail == " new[]"; - const bool isArrayDelete = detail == " delete[]"; - const QStringView searchTerm = isArray || isCall - ? QStringView(detail).chopped(1) : isArrayNew || isArrayDelete - ? QStringView(detail).chopped(2) : detail; - const int opStringOffset = nodeText.indexOf(searchTerm, prefixOffset - + operatorPrefix.length()); - if (opStringOffset == -1 || nodeText.indexOf(operatorPrefix, opStringOffset) != -1) - continue; - - const int opStringOffsetInDoc = nodeStartPos + opStringOffset - + detail.length() - opStringLen; - Utils::Text::convertPosition(doc, opStringOffsetInDoc, &result.line, &result.column); - result.length = opStringLen; - if (isArray || isCall) - result.length = 1; - else if (isArrayNew || isArrayDelete) - result.length -= 2; - if (!isArray && !isCall) - insert(result); - if (!isArray && !isCall && !isArrayNew && !isArrayDelete) - continue; - - result.textStyles.mainStyle = C_PUNCTUATION; - result.length = 1; - const int openingParenOffset = nodeText.indexOf( - isCall ? '(' : '[', prefixOffset + operatorPrefix.length()); - if (openingParenOffset == -1) - continue; - const int closingParenOffset = nodeText.indexOf(isCall ? ')' : ']', openingParenOffset + 1); - if (closingParenOffset == -1 || closingParenOffset < openingParenOffset) - continue; - Utils::Text::convertPosition(doc, nodeStartPos + openingParenOffset, - &result.line, &result.column); - insert(result); - Utils::Text::convertPosition(doc, nodeStartPos + closingParenOffset, - &result.line, &result.column); - insert(result); - } -} + QFutureInterface &m_future; + HighlightingResults &m_results; + const AstNode &m_ast; + const QTextDocument * const m_doc; + const QString &m_docContent; +}; // clangd reports also the #ifs, #elses and #endifs around the disabled code as disabled, // and not even in a consistent manner. We don't want this, so we have to clean up here. @@ -2635,7 +2232,7 @@ static void semanticHighlighter(QFutureInterface &future, if (widget && widget->textDocument()->document()->revision() == docRevision) widget->setIfdefedOutBlocks(ifdefedOutBlocks); }, Qt::QueuedConnection); - collectExtraResults(future, results, ast, &doc, docContents); + ExtraHighlightingResultsCollector(future, results, ast, &doc, docContents).collect(); if (!future.isCanceled()) { qCDebug(clangdLog) << "reporting" << results.size() << "highlighting results"; future.reportResults(QVector(results.cbegin(), @@ -3092,6 +2689,465 @@ MessageId ClangdClient::Private::getAndHandleAst(const TextDocOrFile &doc, return request.id(); } +ExtraHighlightingResultsCollector::ExtraHighlightingResultsCollector( + QFutureInterface &future, HighlightingResults &results, + const AstNode &ast, QTextDocument *doc, const QString &docContent) + : m_future(future), m_results(results), m_ast(ast), m_doc(doc), m_docContent(docContent) +{ + +} + +void ExtraHighlightingResultsCollector::collect() +{ + if (!m_ast.isValid()) + return; + visitNode(m_ast); +} + +bool ExtraHighlightingResultsCollector::lessThan(const HighlightingResult &r1, + const HighlightingResult &r2) +{ + return r1.line < r2.line || (r1.line == r2.line && r1.column < r2.column) + || (r1.line == r2.line && r1.column == r2.column && r1.length < r2.length); +} + +int ExtraHighlightingResultsCollector::onlyIndexOf(const QStringView &text, + const QStringView &subString, int from) +{ + const int firstIndex = text.indexOf(subString, from); + if (firstIndex == -1) + return -1; + const int nextIndex = text.indexOf(subString, firstIndex + 1); + + // The second condion deals with the off-by-one error in TemplateSpecialization nodes; + // see collectFromNode(). + return nextIndex == -1 || nextIndex == firstIndex + 1 ? firstIndex : -1; +} + +// Unfortunately, the exact position of a specific token is usually not +// recorded in the AST, so if we need that, we have to search for it textually. +// In corner cases, this might get sabotaged by e.g. comments, in which case we give up. +int ExtraHighlightingResultsCollector::posForNodeStart(const AstNode &node) const +{ + return Utils::Text::positionInText(m_doc, node.range().start().line() + 1, + node.range().start().character() + 1); +} + +int ExtraHighlightingResultsCollector::posForNodeEnd(const AstNode &node) const +{ + return Utils::Text::positionInText(m_doc, node.range().end().line() + 1, + node.range().end().character() + 1); +} + +void ExtraHighlightingResultsCollector::insertResult(const HighlightingResult &result) +{ + if (!result.isValid()) // Some nodes don't have a range. + return; + const auto it = std::lower_bound(m_results.begin(), m_results.end(), result, lessThan); + if (it == m_results.end() || *it != result) { + qCDebug(clangdLogHighlight) << "adding additional highlighting result" + << result.line << result.column << result.length; + m_results.insert(it, result); + return; + } + + // This is for conversion operators, whose type part is only reported as a type by clangd. + if ((it->textStyles.mainStyle == C_TYPE + || it->textStyles.mainStyle == C_PRIMITIVE_TYPE) + && !result.textStyles.mixinStyles.empty() + && result.textStyles.mixinStyles.at(0) == C_OPERATOR) { + it->textStyles.mixinStyles = result.textStyles.mixinStyles; + } +} + +// For matching the "<" and ">" brackets of template declarations, specializations +// and instantiations. +void ExtraHighlightingResultsCollector::insertAngleBracketInfo(int searchStart1, int searchEnd1, + int searchStart2, int searchEnd2) +{ + const int openingAngleBracketPos = onlyIndexOf( + QStringView(m_docContent).mid(searchStart1, searchEnd1 - searchStart1), + QStringView(QStringLiteral("<"))); + if (openingAngleBracketPos == -1) + return; + const int absOpeningAngleBracketPos = searchStart1 + openingAngleBracketPos; + if (absOpeningAngleBracketPos > searchStart2) + searchStart2 = absOpeningAngleBracketPos + 1; + if (searchStart2 >= searchEnd2) + return; + const int closingAngleBracketPos = onlyIndexOf( + QStringView(m_docContent).mid(searchStart2, searchEnd2 - searchStart2), + QStringView(QStringLiteral(">"))); + if (closingAngleBracketPos == -1) + return; + + const int absClosingAngleBracketPos = searchStart2 + closingAngleBracketPos; + if (absOpeningAngleBracketPos > absClosingAngleBracketPos) + return; + + HighlightingResult result; + result.useTextSyles = true; + result.textStyles.mainStyle = C_PUNCTUATION; + Utils::Text::convertPosition(m_doc, absOpeningAngleBracketPos, &result.line, &result.column); + result.length = 1; + result.kind = CppEditor::SemanticHighlighter::AngleBracketOpen; + insertResult(result); + Utils::Text::convertPosition(m_doc, absClosingAngleBracketPos, &result.line, &result.column); + result.kind = CppEditor::SemanticHighlighter::AngleBracketClose; + insertResult(result); +} + +void ExtraHighlightingResultsCollector::setResultPosFromRange(HighlightingResult &result, + const Range &range) +{ + if (!range.isValid()) + return; + const Position startPos = range.start(); + const Position endPos = range.end(); + result.line = startPos.line() + 1; + result.column = startPos.character() + 1; + result.length = endPos.toPositionInDocument(m_doc) - startPos.toPositionInDocument(m_doc); +} + +void ExtraHighlightingResultsCollector::collectFromNode(const AstNode &node) +{ + if (node.kind().endsWith("Literal")) { + HighlightingResult result; + result.useTextSyles = true; + const bool isStringLike = node.kind().startsWith("String") + || node.kind().startsWith("Character"); + result.textStyles.mainStyle = isStringLike ? C_STRING : C_NUMBER; + setResultPosFromRange(result, node.range()); + insertResult(result); + return; + } + if (node.role() == "type" && node.kind() == "Builtin") { + HighlightingResult result; + result.useTextSyles = true; + result.textStyles.mainStyle = C_PRIMITIVE_TYPE; + setResultPosFromRange(result, node.range()); + insertResult(result); + return; + } + if (node.role() == "attribute" && (node.kind() == "Override" || node.kind() == "Final")) { + HighlightingResult result; + result.useTextSyles = true; + result.textStyles.mainStyle = C_KEYWORD; + setResultPosFromRange(result, node.range()); + insertResult(result); + return; + } + + const bool isExpression = node.role() == "expression"; + const bool isDeclaration = node.role() == "declaration"; + + const int nodeStartPos = posForNodeStart(node); + const int nodeEndPos = posForNodeEnd(node); + const QList children = node.children().value_or(QList()); + + // Match question mark and colon in ternary operators. + if (isExpression && node.kind() == "ConditionalOperator") { + if (children.size() != 3) + return; + + // The question mark is between sub-expressions 1 and 2, the colon is between + // sub-expressions 2 and 3. + const int searchStartPosQuestionMark = posForNodeEnd(children.first()); + const int searchEndPosQuestionMark = posForNodeStart(children.at(1)); + QStringView content = QStringView(m_docContent).mid( + searchStartPosQuestionMark, + searchEndPosQuestionMark - searchStartPosQuestionMark); + const int questionMarkPos = onlyIndexOf(content, QStringView(QStringLiteral("?"))); + if (questionMarkPos == -1) + return; + const int searchStartPosColon = posForNodeEnd(children.at(1)); + const int searchEndPosColon = posForNodeStart(children.at(2)); + content = QStringView(m_docContent).mid(searchStartPosColon, + searchEndPosColon - searchStartPosColon); + const int colonPos = onlyIndexOf(content, QStringView(QStringLiteral(":"))); + if (colonPos == -1) + return; + + const int absQuestionMarkPos = searchStartPosQuestionMark + questionMarkPos; + const int absColonPos = searchStartPosColon + colonPos; + if (absQuestionMarkPos > absColonPos) + return; + + HighlightingResult result; + result.useTextSyles = true; + result.textStyles.mainStyle = C_PUNCTUATION; + result.textStyles.mixinStyles.push_back(C_OPERATOR); + Utils::Text::convertPosition(m_doc, absQuestionMarkPos, &result.line, &result.column); + result.length = 1; + result.kind = CppEditor::SemanticHighlighter::TernaryIf; + insertResult(result); + Utils::Text::convertPosition(m_doc, absColonPos, &result.line, &result.column); + result.kind = CppEditor::SemanticHighlighter::TernaryElse; + insertResult(result); + return; + } + + if (isDeclaration && (node.kind() == "FunctionTemplate" + || node.kind() == "ClassTemplate")) { + // The child nodes are the template parameters and and the function or class. + // The opening angle bracket is before the first child node, the closing angle + // bracket is before the function child node and after the last param node. + const QString classOrFunctionKind = QLatin1String(node.kind() == "FunctionTemplate" + ? "Function" : "CXXRecord"); + const auto functionOrClassIt = std::find_if(children.begin(), children.end(), + [&classOrFunctionKind](const AstNode &n) { + return n.role() == "declaration" && n.kind() == classOrFunctionKind; + }); + if (functionOrClassIt == children.end() || functionOrClassIt == children.begin()) + return; + const int firstTemplateParamStartPos = posForNodeStart(children.first()); + const int lastTemplateParamEndPos = posForNodeEnd(*(functionOrClassIt - 1)); + const int functionOrClassStartPos = posForNodeStart(*functionOrClassIt); + insertAngleBracketInfo(nodeStartPos, firstTemplateParamStartPos, + lastTemplateParamEndPos, functionOrClassStartPos); + return; + } + + const auto isTemplateParamDecl = [](const AstNode &node) { + return node.isTemplateParameterDeclaration(); + }; + if (isDeclaration && node.kind() == "TypeAliasTemplate") { + // Children are one node of type TypeAlias and the template parameters. + // The opening angle bracket is before the first parameter and the closing + // angle bracket is after the last parameter. + // The TypeAlias node seems to appear first in the AST, even though lexically + // is comes after the parameters. We don't rely on the order here. + // Note that there is a second pair of angle brackets. That one is part of + // a TemplateSpecialization, which is handled further below. + const auto firstTemplateParam = std::find_if(children.begin(), children.end(), + isTemplateParamDecl); + if (firstTemplateParam == children.end()) + return; + const auto lastTemplateParam = std::find_if(children.rbegin(), children.rend(), + isTemplateParamDecl); + QTC_ASSERT(lastTemplateParam != children.rend(), return); + const auto typeAlias = std::find_if(children.begin(), children.end(), + [](const AstNode &n) { return n.kind() == "TypeAlias"; }); + if (typeAlias == children.end()) + return; + + const int firstTemplateParamStartPos = posForNodeStart(*firstTemplateParam); + const int lastTemplateParamEndPos = posForNodeEnd(*lastTemplateParam); + const int searchEndPos = posForNodeStart(*typeAlias); + insertAngleBracketInfo(nodeStartPos, firstTemplateParamStartPos, + lastTemplateParamEndPos, searchEndPos); + return; + } + + if (isDeclaration && node.kind() == "ClassTemplateSpecialization") { + // There is one child of kind TemplateSpecialization. The first pair + // of angle brackets comes before that. + if (children.size() == 1) { + const int childNodePos = posForNodeStart(children.first()); + insertAngleBracketInfo(nodeStartPos, childNodePos, nodeStartPos, childNodePos); + } + return; + } + + if (isDeclaration && node.kind() == "TemplateTemplateParm") { + // The child nodes are template arguments and template parameters. + // Arguments seem to appear before parameters in the AST, even though they + // come after them in the source code. We don't rely on the order here. + const auto firstTemplateParam = std::find_if(children.begin(), children.end(), + isTemplateParamDecl); + if (firstTemplateParam == children.end()) + return; + const auto lastTemplateParam = std::find_if(children.rbegin(), children.rend(), + isTemplateParamDecl); + QTC_ASSERT(lastTemplateParam != children.rend(), return); + const auto templateArg = std::find_if(children.begin(), children.end(), + [](const AstNode &n) { return n.role() == "template argument"; }); + + const int firstTemplateParamStartPos = posForNodeStart(*firstTemplateParam); + const int lastTemplateParamEndPos = posForNodeEnd(*lastTemplateParam); + const int searchEndPos = templateArg == children.end() + ? nodeEndPos : posForNodeStart(*templateArg); + insertAngleBracketInfo(nodeStartPos, firstTemplateParamStartPos, + lastTemplateParamEndPos, searchEndPos); + return; + } + + // {static,dynamic,reinterpret}_cast<>(). + if (isExpression && node.kind().startsWith("CXX") && node.kind().endsWith("Cast")) { + // First child is type, second child is expression. + // The opening angle bracket is before the first child, the closing angle bracket + // is between the two children. + if (children.size() == 2) { + insertAngleBracketInfo(nodeStartPos, posForNodeStart(children.first()), + posForNodeEnd(children.first()), + posForNodeStart(children.last())); + } + return; + } + + if (node.kind() == "TemplateSpecialization") { + // First comes the template type, then the template arguments. + // The opening angle bracket is before the first template argument, + // the closing angle bracket is after the last template argument. + // The first child node has no range, so we start searching at the parent node. + if (children.size() >= 2) { + int searchStart2 = posForNodeEnd(children.last()); + int searchEnd2 = nodeEndPos; + + // There is a weird off-by-one error on the clang side: If there is a + // nested template instantiation *and* there is no space between + // the closing angle brackets, then the inner TemplateSpecialization node's range + // will extend one character too far, covering the outer's closing angle bracket. + // This is what we are correcting for here. + // This issue is tracked at https://github.com/clangd/clangd/issues/871. + if (searchStart2 == searchEnd2) + --searchStart2; + insertAngleBracketInfo(nodeStartPos, posForNodeStart(children.at(1)), + searchStart2, searchEnd2); + } + return; + } + + if (!isExpression && !isDeclaration) + return; + + // Operators, overloaded ones in particular. + static const QString operatorPrefix = "operator"; + QString detail = node.detail().value_or(QString()); + const bool isCallToNew = node.kind() == "CXXNew"; + const bool isCallToDelete = node.kind() == "CXXDelete"; + if (!isCallToNew && !isCallToDelete + && (!detail.startsWith(operatorPrefix) || detail == operatorPrefix)) { + return; + } + + if (!isCallToNew && !isCallToDelete) + detail.remove(0, operatorPrefix.length()); + + HighlightingResult result; + result.useTextSyles = true; + const bool isConversionOp = node.kind() == "CXXConversion"; + const bool isOverloaded = !isConversionOp + && (isDeclaration || ((!isCallToNew && !isCallToDelete) + || node.arcanaContains("CXXMethod"))); + result.textStyles.mainStyle = isConversionOp + ? C_PRIMITIVE_TYPE + : isCallToNew || isCallToDelete || detail.at(0).isSpace() + ? C_KEYWORD : C_PUNCTUATION; + result.textStyles.mixinStyles.push_back(C_OPERATOR); + if (isOverloaded) + result.textStyles.mixinStyles.push_back(C_OVERLOADED_OPERATOR); + if (isDeclaration) + result.textStyles.mixinStyles.push_back(C_DECLARATION); + + const QStringView nodeText = QStringView(m_docContent) + .mid(nodeStartPos, nodeEndPos - nodeStartPos); + + if (isCallToNew || isCallToDelete) { + result.line = node.range().start().line() + 1; + result.column = node.range().start().character() + 1; + result.length = isCallToNew ? 3 : 6; + insertResult(result); + if (node.arcanaContains("array")) { + const int openingBracketOffset = nodeText.indexOf('['); + if (openingBracketOffset == -1) + return; + const int closingBracketOffset = nodeText.lastIndexOf(']'); + if (closingBracketOffset == -1 || closingBracketOffset < openingBracketOffset) + return; + + result.textStyles.mainStyle = C_PUNCTUATION; + result.length = 1; + Utils::Text::convertPosition(m_doc, + nodeStartPos + openingBracketOffset, + &result.line, &result.column); + insertResult(result); + Utils::Text::convertPosition(m_doc, + nodeStartPos + closingBracketOffset, + &result.line, &result.column); + insertResult(result); + } + return; + } + + if (isExpression && (detail == QLatin1String("()") || detail == QLatin1String("[]"))) { + result.line = node.range().start().line() + 1; + result.column = node.range().start().character() + 1; + result.length = 1; + insertResult(result); + result.line = node.range().end().line() + 1; + result.column = node.range().end().character(); + insertResult(result); + return; + } + + const int opStringLen = detail.at(0).isSpace() ? detail.length() - 1 : detail.length(); + + // The simple case: Call to operator+, +=, * etc. + if (nodeEndPos - nodeStartPos == opStringLen) { + setResultPosFromRange(result, node.range()); + insertResult(result); + return; + } + + const int prefixOffset = nodeText.indexOf(operatorPrefix); + if (prefixOffset == -1) + return; + + const bool isArray = detail == "[]"; + const bool isCall = detail == "()"; + const bool isArrayNew = detail == " new[]"; + const bool isArrayDelete = detail == " delete[]"; + const QStringView searchTerm = isArray || isCall + ? QStringView(detail).chopped(1) : isArrayNew || isArrayDelete + ? QStringView(detail).chopped(2) : detail; + const int opStringOffset = nodeText.indexOf(searchTerm, prefixOffset + + operatorPrefix.length()); + if (opStringOffset == -1 || nodeText.indexOf(operatorPrefix, opStringOffset) != -1) + return; + + const int opStringOffsetInDoc = nodeStartPos + opStringOffset + + detail.length() - opStringLen; + Utils::Text::convertPosition(m_doc, opStringOffsetInDoc, &result.line, &result.column); + result.length = opStringLen; + if (isArray || isCall) + result.length = 1; + else if (isArrayNew || isArrayDelete) + result.length -= 2; + if (!isArray && !isCall) + insertResult(result); + if (!isArray && !isCall && !isArrayNew && !isArrayDelete) + return; + + result.textStyles.mainStyle = C_PUNCTUATION; + result.length = 1; + const int openingParenOffset = nodeText.indexOf( + isCall ? '(' : '[', prefixOffset + operatorPrefix.length()); + if (openingParenOffset == -1) + return; + const int closingParenOffset = nodeText.indexOf(isCall ? ')' : ']', openingParenOffset + 1); + if (closingParenOffset == -1 || closingParenOffset < openingParenOffset) + return; + Utils::Text::convertPosition(m_doc, nodeStartPos + openingParenOffset, + &result.line, &result.column); + insertResult(result); + Utils::Text::convertPosition(m_doc, nodeStartPos + closingParenOffset, + &result.line, &result.column); + insertResult(result); +} + +void ExtraHighlightingResultsCollector::visitNode(const AstNode &node) +{ + if (m_future.isCanceled()) + return; + collectFromNode(node); + const auto children = node.children(); + if (!children) + return; + for (const AstNode &childNode : *children) + visitNode(childNode); +} + } // namespace Internal } // namespace ClangCodeModel From 4036c20f63df9a5a5a53a26fb6ecaa0bef3b2a9a Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 28 Sep 2021 16:15:07 +0300 Subject: [PATCH 09/67] QmlDesigner: Add Loader and Repeater to component library Also fixes some issues with Repeater usage. Fixes: QDS-5149 Change-Id: I259dcb73be634150dd0c5e602165b63112ec958c Reviewed-by: Thomas Hartmann Reviewed-by: Qt CI Bot Reviewed-by: Samuel Ghinet Reviewed-by: Mahmoud Badri --- .../instances/nodeinstanceserver.cpp | 11 +- .../instances/qt5nodeinstanceserver.cpp | 28 +++++ .../instances/qt5nodeinstanceserver.h | 2 + .../QtQuick/LoaderSpecifics.qml | 106 ++++++++++++++++++ .../QtQuick/RepeaterSpecifics.qml | 77 +++++++++++++ .../components/formeditor/formeditorview.cpp | 3 + .../designercore/include/nodehints.h | 1 + .../designercore/include/qmlitemnode.h | 1 + .../designercore/metainfo/nodehints.cpp | 5 + .../designercore/model/qmlitemnode.cpp | 5 + .../qmldesigner/qtquickplugin/quick.metainfo | 31 +++++ 11 files changed, 268 insertions(+), 2 deletions(-) create mode 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/LoaderSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RepeaterSpecifics.qml diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 1fda59c964e..62ef8f246ab 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1287,8 +1287,15 @@ PixmapChangedCommand NodeInstanceServer::createPixmapChangedCommand(const QList< QVector imageVector; for (const ServerNodeInstance &instance : instanceList) { - if (instance.isValid() && instance.hasContent()) - imageVector.append(ImageContainer(instance.instanceId(), instance.renderImage(), instance.instanceId())); + if (!instance.isValid()) + continue; + + QImage renderImage; + // We need to return empty image if instance has no content to correctly update the + // item image in case the instance changed from having content to not having content. + if (instance.hasContent()) + renderImage = instance.renderImage(); + imageVector.append(ImageContainer(instance.instanceId(), renderImage, instance.instanceId())); } return PixmapChangedCommand(imageVector); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index 89e8c5d2db5..20611eef163 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -193,6 +194,19 @@ QList Qt5NodeInstanceServer::allItems() const return QList(); } +void Qt5NodeInstanceServer::markRepeaterParentDirty(qint32 id) const +{ + if (!hasInstanceForId(id)) + return; + + // If a Repeater instance was moved/removed, the old parent must be marked dirty to rerender it + ServerNodeInstance instance = instanceForId(id); + if (instance.isValid() && instance.isSubclassOf("QQuickRepeater") && instance.hasParent()) { + ServerNodeInstance parentInstance = instance.parent(); + DesignerSupport::addDirty(parentInstance.rootQuickItem(), QQuickDesignerSupport::Content); + } +} + bool Qt5NodeInstanceServer::initRhi(RenderViewData &viewData) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -523,9 +537,23 @@ void Qt5NodeInstanceServer::clearScene(const ClearSceneCommand &command) void Qt5NodeInstanceServer::reparentInstances(const ReparentInstancesCommand &command) { + const QVector &containerVector = command.reparentInstances(); + for (const ReparentContainer &container : containerVector) + markRepeaterParentDirty(container.instanceId()); + NodeInstanceServer::reparentInstances(command.reparentInstances()); startRenderTimer(); } +void Qt5NodeInstanceServer::removeInstances(const RemoveInstancesCommand &command) +{ + const QVector &idVector = command.instanceIds(); + for (const qint32 id : idVector) + markRepeaterParentDirty(id); + + NodeInstanceServer::removeInstances(command); + startRenderTimer(); +} + } // QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h index 4af451b61ae..d93ecad84ed 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h @@ -67,6 +67,7 @@ public: void createScene(const CreateSceneCommand &command) override; void clearScene(const ClearSceneCommand &command) override; void reparentInstances(const ReparentInstancesCommand &command) override; + void removeInstances(const RemoveInstancesCommand &command) override; QImage grabWindow() override; QImage grabItem(QQuickItem *item) override; @@ -79,6 +80,7 @@ protected: void resetAllItems(); void setupScene(const CreateSceneCommand &command) override; QList allItems() const; + void markRepeaterParentDirty(qint32 id) const; struct RenderViewData { QPointer window = nullptr; diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/LoaderSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/LoaderSpecifics.qml new file mode 100644 index 00000000000..2417c545876 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/LoaderSpecifics.qml @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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. +** +****************************************************************************/ + + +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import HelperWidgets 2.0 +import StudioTheme 1.0 as StudioTheme + +Column { + anchors.left: parent.left + anchors.right: parent.right + + Section { + caption: qsTr("Loader") + anchors.left: parent.left + anchors.right: parent.right + + SectionLayout { + PropertyLabel { + text: qsTr("Active") + tooltip: qsTr("This property is true if the Loader is currently active.") + } + + SecondColumnLayout { + CheckBox { + text: backendValues.active.valueToString + backendValue: backendValues.active + implicitWidth: StudioTheme.Values.twoControlColumnWidth + + StudioTheme.Values.actionIndicatorWidth + } + + ExpandingSpacer {} + } + + PropertyLabel { + text: qsTr("Source") + tooltip: qsTr("This property holds the URL of the QML component to instantiate.") + } + + SecondColumnLayout { + UrlChooser { + filter: "*.qml" + backendValue: backendValues.source + } + + ExpandingSpacer {} + } + + PropertyLabel { + text: qsTr("Source Component") + tooltip: qsTr("This property holds the component to instantiate.") + } + + SecondColumnLayout { + ItemFilterComboBox { + typeFilter: "Component" + validator: RegExpValidator { regExp: /(^$|^[a-z_]\w*)/ } + backendValue: backendValues.sourceComponent + implicitWidth: StudioTheme.Values.singleControlColumnWidth + + StudioTheme.Values.actionIndicatorWidth + } + + ExpandingSpacer {} + } + + PropertyLabel { + text: qsTr("Asynchronous") + tooltip: qsTr("This property holds whether the component will be instantiated asynchronously.") + } + + SecondColumnLayout { + CheckBox { + text: backendValues.asynchronous.valueToString + backendValue: backendValues.asynchronous + implicitWidth: StudioTheme.Values.twoControlColumnWidth + + StudioTheme.Values.actionIndicatorWidth + } + + ExpandingSpacer {} + } + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RepeaterSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RepeaterSpecifics.qml new file mode 100644 index 00000000000..33dfc387b1a --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RepeaterSpecifics.qml @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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. +** +****************************************************************************/ + +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import HelperWidgets 2.0 +import StudioTheme 1.0 as StudioTheme + +Column { + anchors.left: parent.left + anchors.right: parent.right + + Section { + caption: qsTr("Repeater") + anchors.left: parent.left + anchors.right: parent.right + + SectionLayout { + PropertyLabel { + text: qsTr("Model") + tooltip: qsTr("The model providing data for the repeater. This can simply specify the number of delegate instances to create or it can be bound to an actual model.") + } + + SecondColumnLayout { + LineEdit { + backendValue: backendValues.model + showTranslateCheckBox: false + writeAsExpression: true + implicitWidth: StudioTheme.Values.singleControlColumnWidth + + StudioTheme.Values.actionIndicatorWidth + width: implicitWidth + } + + ExpandingSpacer {} + } + + PropertyLabel { + text: qsTr("Delegate") + tooltip: qsTr("The delegate provides a template defining each object instantiated by the repeater.") + } + + SecondColumnLayout { + ItemFilterComboBox { + typeFilter: "Component" + validator: RegExpValidator { regExp: /(^$|^[a-z_]\w*)/ } + backendValue: backendValues.delegate + implicitWidth: StudioTheme.Values.singleControlColumnWidth + + StudioTheme.Values.actionIndicatorWidth + } + + ExpandingSpacer {} + } + } + } +} diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 9a01bbd9401..10e1373dde2 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -91,6 +91,9 @@ void FormEditorView::modelAttached(Model *model) //This function does the setup of the initial FormEditorItem tree in the scene void FormEditorView::setupFormEditorItemTree(const QmlItemNode &qmlItemNode) { + if (!qmlItemNode.hasFormEditorItem()) + return; + if (qmlItemNode.isFlowTransition()) { m_scene->addFormEditorItem(qmlItemNode, FormEditorScene::FlowTransition); if (qmlItemNode.hasNodeParent()) diff --git a/src/plugins/qmldesigner/designercore/include/nodehints.h b/src/plugins/qmldesigner/designercore/include/nodehints.h index a22dd40f403..16fe18320cd 100644 --- a/src/plugins/qmldesigner/designercore/include/nodehints.h +++ b/src/plugins/qmldesigner/designercore/include/nodehints.h @@ -62,6 +62,7 @@ public: bool canBeDroppedInView3D() const; bool isMovable() const; bool isResizable() const; + bool hasFormEditorItem() const; bool isStackedContainer() const; bool canBeReparentedTo(const ModelNode &potenialParent); QString indexPropertyForStackedContainer() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index 579a4ca7b85..9be07edfbfa 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -105,6 +105,7 @@ public: bool modelIsResizable() const; bool modelIsRotatable() const; bool modelIsInLayout() const; + bool hasFormEditorItem() const; QRectF instanceBoundingRect() const; QRectF instanceSceneBoundingRect() const; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp index 26b06cdc42f..84cc5650747 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp @@ -183,6 +183,11 @@ bool NodeHints::isResizable() const return evaluateBooleanExpression("isResizable", true); } +bool NodeHints::hasFormEditorItem() const +{ + return evaluateBooleanExpression("hasFormEditorItem", true); +} + bool NodeHints::isStackedContainer() const { if (!isValid()) diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 03ae0ecd1dc..02ecb64efde 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -395,6 +395,11 @@ bool QmlItemNode::modelIsInLayout() const return false; } +bool QmlItemNode::hasFormEditorItem() const +{ + return NodeHints::fromModelNode(modelNode()).hasFormEditorItem(); +} + QRectF QmlItemNode::instanceBoundingRect() const { return QRectF(QPointF(0, 0), nodeInstance().size()); diff --git a/src/plugins/qmldesigner/qtquickplugin/quick.metainfo b/src/plugins/qmldesigner/qtquickplugin/quick.metainfo index 877f1203390..019be099732 100644 --- a/src/plugins/qmldesigner/qtquickplugin/quick.metainfo +++ b/src/plugins/qmldesigner/qtquickplugin/quick.metainfo @@ -448,4 +448,35 @@ MetaInfo { version: "2.0" } } + + Type { + name: "QtQuick.Loader" + icon: ":/qtquickplugin/images/item-icon16.png" + + ItemLibraryEntry { + name: "Loader" + category: "e.Qt Quick - Component" + libraryIcon: ":/qtquickplugin/images/item-icon.png" + version: "2.0" + Property { name: "width"; type: "int"; value: 200; } + Property { name: "height"; type: "int"; value: 200; } + } + } + + Type { + name: "QtQuick.Repeater" + icon: ":/qtquickplugin/images/item-icon16.png" + + Hints { + canBeDroppedInFormEditor: false + hasFormEditorItem: false + } + + ItemLibraryEntry { + name: "Repeater" + category: "e.Qt Quick - Component" + libraryIcon: ":/qtquickplugin/images/item-icon.png" + version: "2.0" + } + } } From 2ab6f800b373d601261f090de89919e956bf2e1c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 1 Oct 2021 12:27:04 +0300 Subject: [PATCH 10/67] QmlDesigner: Fix issues with Components and Repeaters - Fixed state preview rendering by deparenting nodes under component wraps. - Ensure state preview image is always clipped to root item. The state preview bounding box broke when Repeater was direct child of root and had delegate with rotation. - Allow dragging items under Repeater to create implicit component. - Allow dragging Components under Repeater. - Do not ask for target property when Component is dragged under any node. - Update nodeSource properly when reparenting implicit component or removing last child of a Component item. - Fixed scene update when last child of a repeater is deleted/moved. Fixes: QDS-5197 Change-Id: Iaaf1745e25db3522ffc1dba7fd1b051da29f5aec Reviewed-by: Samuel Ghinet Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann Reviewed-by: Qt CI Bot --- .../instances/nodeinstanceserver.cpp | 15 ++++++- .../instances/objectnodeinstance.cpp | 14 +++++++ .../qml2puppet/instances/objectnodeinstance.h | 4 ++ .../instances/qt5nodeinstanceserver.cpp | 19 +++++++-- .../qt5previewnodeinstanceserver.cpp | 4 ++ .../instances/quickitemnodeinstance.cpp | 3 ++ .../instances/servernodeinstance.cpp | 7 ++++ .../qml2puppet/instances/servernodeinstance.h | 2 + .../navigator/navigatortreemodel.cpp | 35 ++++++++++------ .../designercore/model/texttomodelmerger.cpp | 42 +++++++++++++++---- .../designercore/model/texttomodelmerger.h | 7 +++- 11 files changed, 124 insertions(+), 28 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 62ef8f246ab..bb80c2e2e1c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -397,8 +397,19 @@ void NodeInstanceServer::reparentInstances(const QVector &con if (hasInstanceForId(container.instanceId())) { ServerNodeInstance instance = instanceForId(container.instanceId()); if (instance.isValid()) { - instance.reparent(instanceForId(container.oldParentInstanceId()), container.oldParentProperty(), - instanceForId(container.newParentInstanceId()), container.newParentProperty()); + ServerNodeInstance newParent = instanceForId(container.newParentInstanceId()); + PropertyName newParentProperty = container.newParentProperty(); + if (!isInformationServer()) { + // Children of the component wraps are left out of the node tree to avoid + // incorrectly rendering them + if (newParent.isComponentWrap()) { + newParent = {}; + newParentProperty.clear(); + } + } + instance.reparent(instanceForId(container.oldParentInstanceId()), + container.oldParentProperty(), + newParent, newParentProperty); } } } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index ab764a98b38..4eb8cdd65f4 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -415,6 +415,16 @@ bool ObjectNodeInstance::isLockedInEditor() const return m_isLockedInEditor; } +bool ObjectNodeInstance::isComponentWrap() const +{ + return m_isComponentWrap; +} + +void ObjectNodeInstance::setComponentWrap(bool wrap) +{ + m_isComponentWrap = wrap; +} + void ObjectNodeInstance::setModifiedFlag(bool b) { m_isModified = b; @@ -732,6 +742,10 @@ QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, cons QQmlComponent *component = new QQmlComponent(context->engine()); QByteArray data(nodeSource.toUtf8()); + if (data.isEmpty()) { + // Add a fake root element as an empty component is not valid and crashes in some cases + data.append("QtObject{}"); + } data.prepend(importCode); component->setData(data, context->baseUrl().resolved(QUrl("createComponent.qml"))); QObject *object = component; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h index c66365d3921..67e1663496c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h @@ -202,6 +202,9 @@ public: virtual void setLockedInEditor(bool b); bool isLockedInEditor() const; + bool isComponentWrap() const; + void setComponentWrap(bool wrap); + void setModifiedFlag(bool b); protected: @@ -234,6 +237,7 @@ private: bool m_isModified = false; bool m_isLockedInEditor = false; bool m_isHiddenInEditor = false; + bool m_isComponentWrap = false; static QHash m_enumationValueHash; }; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index 20611eef163..2e1e03fa630 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -199,11 +199,24 @@ void Qt5NodeInstanceServer::markRepeaterParentDirty(qint32 id) const if (!hasInstanceForId(id)) return; - // If a Repeater instance was moved/removed, the old parent must be marked dirty to rerender it ServerNodeInstance instance = instanceForId(id); - if (instance.isValid() && instance.isSubclassOf("QQuickRepeater") && instance.hasParent()) { - ServerNodeInstance parentInstance = instance.parent(); + if (!instance.isValid()) + return; + + ServerNodeInstance parentInstance = instance.parent(); + if (!parentInstance.isValid()) + return; + + // If a Repeater instance was moved/removed, the old parent must be marked dirty to rerender it + const QByteArray type("QQuickRepeater"); + if (ServerNodeInstance::isSubclassOf(instance.internalObject(), type)) DesignerSupport::addDirty(parentInstance.rootQuickItem(), QQuickDesignerSupport::Content); + + // Repeater's parent must also be dirtied when a child of a repeater was moved/removed. + if (ServerNodeInstance::isSubclassOf(parentInstance.internalObject(), type)) { + ServerNodeInstance parentsParent = parentInstance.parent(); + if (parentsParent.isValid()) + DesignerSupport::addDirty(parentsParent.rootQuickItem(), QQuickDesignerSupport::Content); } } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp index daa1cab4734..fb3113bdcd1 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp @@ -101,6 +101,10 @@ void Qt5PreviewNodeInstanceServer::changeState(const ChangeStateCommand &/*comma QImage Qt5PreviewNodeInstanceServer::renderPreviewImage() { + // Ensure the state preview image is always clipped properly to root item dimensions + if (auto rootItem = qobject_cast(rootNodeInstance().internalObject())) + rootItem->setClip(true); + rootNodeInstance().updateDirtyNodeRecursive(); QRectF boundingRect = rootNodeInstance().boundingRect(); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp index 7557e87ccee..34693cc0bcf 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp @@ -769,6 +769,9 @@ void QuickItemNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParen ObjectNodeInstance::reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty); + if (!newParentInstance) + quickItem()->setParentItem(nullptr); + if (instanceIsValidLayoutable(newParentInstance, newParentProperty)) { setInLayoutable(true); setMovable(false); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index be4c3ea626c..2aa17d9e2b7 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -150,6 +150,11 @@ bool ServerNodeInstance::holdsGraphical() const return m_nodeInstance->isQuickItem(); } +bool ServerNodeInstance::isComponentWrap() const +{ + return m_nodeInstance->isComponentWrap(); +} + void ServerNodeInstance::updateDirtyNodeRecursive() { m_nodeInstance->updateAllDirtyNodesRecursive(); @@ -280,6 +285,8 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe instance.internalInstance()->setInstanceId(instanceContainer.instanceId()); + instance.internalInstance()->setComponentWrap(componentWrap == WrapAsComponent); + instance.internalInstance()->initialize(instance.m_nodeInstance, instanceContainer.metaFlags()); // Handle hidden state to initialize pickable state diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h index 786a09fd476..52ead77e125 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h @@ -178,6 +178,8 @@ public: void updateDirtyNodeRecursive(); bool holdsGraphical() const; + bool isComponentWrap() const; + private: // functions ServerNodeInstance(const QSharedPointer &abstractInstance); diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 7f8a75f1c46..08dfc9fd039 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -732,17 +732,22 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in ModelNode targetNode = targetProperty.parentModelNode(); NodeMetaInfo metaInfo = targetNode.metaInfo(); TypeName typeName = newModelNode.type(); - const PropertyNameList nameList = targetNode.metaInfo().directPropertyNames(); - for (const auto &propertyName : nameList) { - auto testType = metaInfo.propertyTypeName(propertyName); - if (testType == typeName || newModelNode.isSubclassOf(testType)) { - ChooseFromPropertyListDialog *dialog = nullptr; - dialog = new ChooseFromPropertyListDialog(targetNode, testType, Core::ICore::dialogParent()); - dialog->exec(); - if (dialog->result() == QDialog::Accepted) - targetNode.bindingProperty(dialog->selectedProperty()).setExpression(newModelNode.validId()); - delete dialog; - break; + + // Empty components are not supported and having one as property value is generally + // unstable, so let's not offer user to put a fresh Component into a property + if (typeName != "QtQml.Component") { + const PropertyNameList nameList = targetNode.metaInfo().directPropertyNames(); + for (const auto &propertyName : nameList) { + auto testType = metaInfo.propertyTypeName(propertyName); + if (testType == typeName || newModelNode.isSubclassOf(testType)) { + ChooseFromPropertyListDialog *dialog = nullptr; + dialog = new ChooseFromPropertyListDialog(targetNode, testType, Core::ICore::dialogParent()); + dialog->exec(); + if (dialog->result() == QDialog::Accepted) + targetNode.bindingProperty(dialog->selectedProperty()).setExpression(newModelNode.validId()); + delete dialog; + break; + } } } } @@ -1087,7 +1092,9 @@ void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty &parentProper && !modelNode.isAncestorOf(parentProperty.parentModelNode()) && (modelNode.metaInfo().isSubclassOf(propertyQmlType) || propertyQmlType == "alias" - || parentProperty.name() == "data")) { + || parentProperty.name() == "data" + || (parentProperty.parentModelNode().metaInfo().defaultPropertyName() == parentProperty.name() + && propertyQmlType == ".QQmlComponent"))) { //### todo: allowing alias is just a heuristic //once the MetaInfo is part of instances we can do this right @@ -1097,6 +1104,10 @@ void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty &parentProper // When the actual reparenting happens, model will create the "data" property if // it is missing. + // We allow move even if target property type doesn't match, if the target property + // is the default property of the parent and is of Component type. + // In that case an implicit component will be created. + bool nodeCanBeMovedToParentProperty = removeModelNodeFromNodeProperty(parentProperty, modelNode); if (nodeCanBeMovedToParentProperty) { reparentModelNodeToNodeProperty(parentProperty, modelNode); diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 0209c7a0a7e..ef878f13c53 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1191,6 +1191,8 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (isComponentType(typeName) || isImplicitComponent) setupComponentDelayed(modelNode, differenceHandler.isAmender()); + else if (!modelNode.nodeSource().isEmpty() || modelNode.nodeSourceType() != ModelNode::NodeWithoutSource) + clearImplicitComponentDelayed(modelNode, differenceHandler.isAmender()); if (isCustomParserType(typeName)) setupCustomParserNodeDelayed(modelNode, differenceHandler.isAmender()); @@ -2079,18 +2081,23 @@ void TextToModelMerger::setupComponent(const ModelNode &node) QString componentText = m_rewriterView->extractText({node}).value(node); - if (componentText.isEmpty()) + if (componentText.isEmpty() && node.nodeSource().isEmpty()) return; QString result = extractComponentFromQml(componentText); - if (result.isEmpty()) + if (result.isEmpty() && node.nodeSource().isEmpty()) return; //No object definition found if (node.nodeSource() != result) ModelNode(node).setNodeSource(result, ModelNode::NodeWithComponentSource); } +void TextToModelMerger::clearImplicitComponent(const ModelNode &node) +{ + ModelNode(node).setNodeSource({}, ModelNode::NodeWithoutSource); +} + void TextToModelMerger::collectLinkErrors(QList *errors, const ReadingContext &ctxt) { foreach (const QmlJS::DiagnosticMessage &diagnosticMessage, ctxt.diagnosticLinkMessages()) { @@ -2237,9 +2244,9 @@ void TextToModelMerger::addIsoIconQrcMapping(const QUrl &fileUrl) } while (dir.cdUp()); } -void TextToModelMerger::setupComponentDelayed(const ModelNode &node, bool synchron) +void TextToModelMerger::setupComponentDelayed(const ModelNode &node, bool synchronous) { - if (synchron) { + if (synchronous) { setupComponent(node); } else { m_setupComponentList.insert(node); @@ -2254,7 +2261,7 @@ void TextToModelMerger::setupCustomParserNode(const ModelNode &node) QString modelText = m_rewriterView->extractText({node}).value(node); - if (modelText.isEmpty()) + if (modelText.isEmpty() && node.nodeSource().isEmpty()) return; if (node.nodeSource() != modelText) @@ -2262,11 +2269,11 @@ void TextToModelMerger::setupCustomParserNode(const ModelNode &node) } -void TextToModelMerger::setupCustomParserNodeDelayed(const ModelNode &node, bool synchron) +void TextToModelMerger::setupCustomParserNodeDelayed(const ModelNode &node, bool synchronous) { Q_ASSERT(isCustomParserType(node.type())); - if (synchron) { + if (synchronous) { setupCustomParserNode(node); } else { m_setupCustomParserList.insert(node); @@ -2274,15 +2281,32 @@ void TextToModelMerger::setupCustomParserNodeDelayed(const ModelNode &node, bool } } +void TextToModelMerger::clearImplicitComponentDelayed(const ModelNode &node, bool synchronous) +{ + Q_ASSERT(!isComponentType(node.type())); + + if (synchronous) { + clearImplicitComponent(node); + } else { + m_clearImplicitComponentList.insert(node); + m_setupTimer.start(); + } +} + void TextToModelMerger::delayedSetup() { - foreach (const ModelNode node, m_setupComponentList) + for (const ModelNode &node : std::as_const(m_setupComponentList)) setupComponent(node); - foreach (const ModelNode node, m_setupCustomParserList) + for (const ModelNode &node : std::as_const(m_setupCustomParserList)) setupCustomParserNode(node); + + for (const ModelNode &node : std::as_const(m_clearImplicitComponentList)) + clearImplicitComponent(node); + m_setupCustomParserList.clear(); m_setupComponentList.clear(); + m_clearImplicitComponentList.clear(); } QSet > TextToModelMerger::qrcMapping() const diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index f2e308d02f1..ed48d4ebc8f 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -128,8 +128,9 @@ public: ReadingContext *context, DifferenceHandler &differenceHandler); - void setupComponentDelayed(const ModelNode &node, bool synchron); - void setupCustomParserNodeDelayed(const ModelNode &node, bool synchron); + void setupComponentDelayed(const ModelNode &node, bool synchronous); + void setupCustomParserNodeDelayed(const ModelNode &node, bool synchronous); + void clearImplicitComponentDelayed(const ModelNode &node, bool synchronous); void delayedSetup(); @@ -140,6 +141,7 @@ public: private: void setupCustomParserNode(const ModelNode &node); void setupComponent(const ModelNode &node); + void clearImplicitComponent(const ModelNode &node); void collectLinkErrors(QList *errors, const ReadingContext &ctxt); void collectImportErrors(QList *errors); void collectSemanticErrorsAndWarnings(QList *errors, @@ -163,6 +165,7 @@ private: QTimer m_setupTimer; QSet m_setupComponentList; QSet m_setupCustomParserList; + QSet m_clearImplicitComponentList; QmlJS::ViewerContext m_vContext; QSet > m_qrcMapping; QSet m_possibleImportKeys; From 221eb6def08337c54313c8c0afe5803d6173c451 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Oct 2021 12:23:05 +0200 Subject: [PATCH 11/67] ClangCodeModel: Add infrastructure for collecting timing data ... and use it for highlighting with clangd. Change-Id: Ib082c0b80593a2115f9cc19ee8279b17187e9309 Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 110 ++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 0594947798b..2607b6d9e1c 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -66,6 +66,8 @@ #include #include +#include +#include #include #include #include @@ -89,6 +91,7 @@ static Q_LOGGING_CATEGORY(clangdLog, "qtc.clangcodemodel.clangd", QtWarningMsg); static Q_LOGGING_CATEGORY(clangdLogServer, "qtc.clangcodemodel.clangd.server", QtWarningMsg); static Q_LOGGING_CATEGORY(clangdLogAst, "qtc.clangcodemodel.clangd.ast", QtWarningMsg); static Q_LOGGING_CATEGORY(clangdLogHighlight, "qtc.clangcodemodel.clangd.highlight", QtWarningMsg); +static Q_LOGGING_CATEGORY(clangdLogTiming, "qtc.clangcodemodel.clangd.timing", QtWarningMsg); static QString indexingToken() { return "backgroundIndexProgress"; } class AstNode : public JsonObject @@ -779,6 +782,109 @@ private: std::unordered_map> m_data; }; +class TaskTimer +{ +public: + TaskTimer(const QString &task) : m_task(task) {} + + void stopTask() + { + // This can happen due to the RAII mechanism employed with SubtaskTimer. + // The subtask timers will expire immediately after, so this does not distort + // the timing data. + if (m_subtasks > 0) { + QTC_CHECK(m_timer.isValid()); + m_elapsedMs += m_timer.elapsed(); + m_timer.invalidate(); + m_subtasks = 0; + } + m_started = false; + qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": took " << m_elapsedMs + << " ms in UI thread"; + } + void startSubtask() + { + // We have some callbacks that are either synchronous or asynchronous, depending on + // dynamic conditions. In the sync case, we will have nested subtasks, in which case + // the inner ones must not collect timing data, as their code blocks are already covered. + if (++m_subtasks > 1) + return; + if (!m_started) { + QTC_ASSERT(m_elapsedMs == 0, m_elapsedMs = 0); + m_started = true; + m_finalized = false; + qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": starting"; + } + qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": subtask started at " + << QDateTime::currentDateTime().toString(); + QTC_CHECK(!m_timer.isValid()); + m_timer.start(); + } + void stopSubtask(bool isFinalizing) + { + if (m_subtasks == 0) // See stopTask(). + return; + if (isFinalizing) + m_finalized = true; + if (--m_subtasks > 0) // See startSubtask(). + return; + qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": subtask stopped at " + << QDateTime::currentDateTime().toString(); + QTC_CHECK(m_timer.isValid()); + m_elapsedMs += m_timer.elapsed(); + m_timer.invalidate(); + if (m_finalized) + stopTask(); + } + +private: + const QString m_task; + QElapsedTimer m_timer; + qint64 m_elapsedMs = 0; + int m_subtasks = 0; + bool m_started = false; + bool m_finalized = false; +}; + +class SubtaskTimer +{ +public: + SubtaskTimer(TaskTimer &timer) : m_timer(timer) { m_timer.startSubtask(); } + ~SubtaskTimer() { m_timer.stopSubtask(m_isFinalizing); } + +protected: + void makeFinalizing() { m_isFinalizing = true; } + +private: + TaskTimer &m_timer; + bool m_isFinalizing = false; +}; + +class FinalizingSubtaskTimer : public SubtaskTimer +{ +public: + FinalizingSubtaskTimer(TaskTimer &timer) : SubtaskTimer(timer) { makeFinalizing(); } +}; + +class ThreadedSubtaskTimer +{ +public: + ThreadedSubtaskTimer(const QString &task) : m_task(task) + { + qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": starting thread"; + m_timer.start(); + } + + ~ThreadedSubtaskTimer() + { + qCDebug(clangdLogTiming).noquote().nospace() << m_task << ": took " << m_timer.elapsed() + << " ms in dedicated thread"; + } +private: + const QString m_task; + QElapsedTimer m_timer; +}; + class ClangdClient::Private { public: @@ -830,6 +936,7 @@ public: std::unordered_map highlighters; VersionedDataCache astCache; VersionedDataCache externalAstCache; + TaskTimer highlightingTimer{"highlighting"}; quint64 nextJobId = 0; bool isFullyIndexed = false; bool isTesting = false; @@ -2110,6 +2217,7 @@ static void semanticHighlighter(QFutureInterface &future, const QPointer &widget, int docRevision, const QVersionNumber &clangdVersion) { + ThreadedSubtaskTimer t("highlighting"); if (future.isCanceled()) { future.reportFinished(); return; @@ -2256,12 +2364,14 @@ static void semanticHighlighter(QFutureInterface &future, void ClangdClient::Private::handleSemanticTokens(TextDocument *doc, const QList &tokens) { + SubtaskTimer t(highlightingTimer); qCDebug(clangdLog()) << "handling LSP tokens" << doc->filePath() << tokens.size(); for (const ExpandedSemanticToken &t : tokens) qCDebug(clangdLogHighlight()) << '\t' << t.line << t.column << t.length << t.type << t.modifiers; const auto astHandler = [this, tokens, doc](const AstNode &ast, const MessageId &) { + FinalizingSubtaskTimer t(highlightingTimer); if (!q->documentOpen(doc)) return; if (clangdLogAst().isDebugEnabled()) From 2641c2514e7c6eeea5a4042128fbf7055adbe68e Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Oct 2021 12:36:44 +0200 Subject: [PATCH 12/67] CppEditor: Add timing information for semantic highlighting Change-Id: If53fd8c8895916a613629628b4555983c0d76ce6 Reviewed-by: David Schulz --- src/plugins/cppeditor/semantichighlighter.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/plugins/cppeditor/semantichighlighter.cpp b/src/plugins/cppeditor/semantichighlighter.cpp index b4c1a6ff1ff..f3112a725be 100644 --- a/src/plugins/cppeditor/semantichighlighter.cpp +++ b/src/plugins/cppeditor/semantichighlighter.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include @@ -165,6 +166,8 @@ void SemanticHighlighter::onHighlighterResultAvailable(int from, int to) return; // aborted qCDebug(log) << "onHighlighterResultAvailable()" << from << to; + QElapsedTimer t; + t.start(); SyntaxHighlighter *highlighter = m_baseTextDocument->syntaxHighlighter(); QTC_ASSERT(highlighter, return); @@ -234,11 +237,17 @@ void SemanticHighlighter::onHighlighterResultAvailable(int from, int to) } if (parentheses.first.isValid()) TextDocumentLayout::setParentheses(parentheses.first, parentheses.second); + + qCDebug(log) << "onHighlighterResultAvailable() took" << t.elapsed() << "ms"; } void SemanticHighlighter::onHighlighterFinished() { QTC_ASSERT(m_watcher, return); + + QElapsedTimer t; + t.start(); + if (!m_watcher->isCanceled() && documentRevision() == m_revision) { SyntaxHighlighter *highlighter = m_baseTextDocument->syntaxHighlighter(); if (QTC_GUARD(highlighter)) { @@ -273,6 +282,7 @@ void SemanticHighlighter::onHighlighterFinished() } m_watcher.reset(); + qCDebug(log) << "onHighlighterFinished() took" << t.elapsed() << "ms"; } void SemanticHighlighter::connectWatcher() From bdb7aed82edf06038f5508c527963097bb5ca351 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 5 Oct 2021 11:40:46 +0200 Subject: [PATCH 13/67] QmlDesigner: Fix compile Amends e0611c0cfaf. Change-Id: I5bea935b8f6cd9e86c028d066a7b8775b10c06c7 Reviewed-by: Miikka Heikkinen --- src/plugins/qmldesigner/components/formeditor/selectiontool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp index b6bf74e3d45..f240b32f768 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp @@ -248,7 +248,7 @@ void SelectionTool::itemsAboutToRemoved(const QList &itemList) { const QList current = items(); - QList remaining = Utils::filtered(current, [&itemList](const FormEditorItem *item) { + QList remaining = Utils::filtered(current, [&itemList](FormEditorItem *item) { return !itemList.contains(item); }); From cc8d65aa2547c64f092725af6dad18c56a246a89 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2021 17:45:40 +0200 Subject: [PATCH 14/67] Debugger: Use FilePath in CdbSymbolPathsListEditor Change-Id: I8935284cf3712903660f61cd06083d4da6f1c7c2 Reviewed-by: David Schulz --- .../shared/cdbsymbolpathlisteditor.cpp | 19 ++++++++--------- .../debugger/shared/cdbsymbolpathlisteditor.h | 2 +- .../debugger/shared/symbolpathsdialog.cpp | 21 ++++++++++++------- .../debugger/shared/symbolpathsdialog.h | 8 ++++--- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp b/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp index 2e67bf675ed..18fcdce5dc3 100644 --- a/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp +++ b/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp @@ -35,7 +35,6 @@ #include "symbolpathsdialog.h" #include -#include #include #include #include @@ -165,7 +164,7 @@ void CdbSymbolPathListEditor::addSymbolPath(CdbSymbolPathListEditor::SymbolPathM { FilePath cacheDir; if (promptCacheDirectory(this, &cacheDir)) - insertPathAtCursor(CdbSymbolPathListEditor::symbolPath(cacheDir.path(), mode)); + insertPathAtCursor(CdbSymbolPathListEditor::symbolPath(cacheDir, mode)); } void CdbSymbolPathListEditor::setupSymbolPaths() @@ -174,13 +173,13 @@ void CdbSymbolPathListEditor::setupSymbolPaths() const int indexOfSymbolServer = indexOfSymbolPath(currentPaths, SymbolServerPath); const int indexOfSymbolCache = indexOfSymbolPath(currentPaths, SymbolCachePath); - QString path; + FilePath path; if (indexOfSymbolServer != -1) - path = currentPaths.at(indexOfSymbolServer); + path = FilePath::fromString(currentPaths.at(indexOfSymbolServer)); if (path.isEmpty() && indexOfSymbolCache != -1) - path = currentPaths.at(indexOfSymbolCache); + path = FilePath::fromString(currentPaths.at(indexOfSymbolCache)); if (path.isEmpty()) - path = TemporaryDirectory::masterDirectoryPath() + "/symbolcache"; + path = FilePath::fromString(TemporaryDirectory::masterDirectoryPath() + "/symbolcache"); bool useSymbolServer = true; bool useSymbolCache = true; @@ -193,20 +192,20 @@ void CdbSymbolPathListEditor::setupSymbolPaths() if (useSymbolCache) { insertPathAtCursor(CdbSymbolPathListEditor::symbolPath(path, SymbolCachePath)); if (useSymbolServer) - insertPathAtCursor(CdbSymbolPathListEditor::symbolPath(QString(), SymbolServerPath)); + insertPathAtCursor(CdbSymbolPathListEditor::symbolPath({}, SymbolServerPath)); } else if (useSymbolServer) { insertPathAtCursor(CdbSymbolPathListEditor::symbolPath(path, SymbolServerPath)); } } -QString CdbSymbolPathListEditor::symbolPath(const QString &cacheDir, +QString CdbSymbolPathListEditor::symbolPath(const FilePath &cacheDir, CdbSymbolPathListEditor::SymbolPathMode mode) { if (mode == SymbolCachePath) - return symbolCachePrefixC + QDir::toNativeSeparators(cacheDir); + return symbolCachePrefixC + cacheDir.toUserOutput(); QString s = QLatin1String(symbolServerPrefixC); if (!cacheDir.isEmpty()) - s += QDir::toNativeSeparators(cacheDir) + '*'; + s += cacheDir.toUserOutput() + '*'; s += QLatin1String(symbolServerPostfixC); return s; } diff --git a/src/plugins/debugger/shared/cdbsymbolpathlisteditor.h b/src/plugins/debugger/shared/cdbsymbolpathlisteditor.h index df64b35bfed..f7dffcdda09 100644 --- a/src/plugins/debugger/shared/cdbsymbolpathlisteditor.h +++ b/src/plugins/debugger/shared/cdbsymbolpathlisteditor.h @@ -53,7 +53,7 @@ public: static bool promptCacheDirectory(QWidget *parent, Utils::FilePath *cacheDirectory); // Format a symbol path specification - static QString symbolPath(const QString &cacheDir, SymbolPathMode mode); + static QString symbolPath(const Utils::FilePath &cacheDir, SymbolPathMode mode); // Check for a symbol server path and extract local cache directory static bool isSymbolServerPath(const QString &path, QString *cacheDir = nullptr); // Check for a symbol cache path and extract local cache directory diff --git a/src/plugins/debugger/shared/symbolpathsdialog.cpp b/src/plugins/debugger/shared/symbolpathsdialog.cpp index db0354cca47..be8ef21afec 100644 --- a/src/plugins/debugger/shared/symbolpathsdialog.cpp +++ b/src/plugins/debugger/shared/symbolpathsdialog.cpp @@ -26,10 +26,14 @@ #include "symbolpathsdialog.h" #include "ui_symbolpathsdialog.h" +#include + #include -using namespace Debugger; -using namespace Internal; +using namespace Utils; + +namespace Debugger { +namespace Internal { SymbolPathsDialog::SymbolPathsDialog(QWidget *parent) : QDialog(parent), @@ -54,9 +58,9 @@ bool SymbolPathsDialog::useSymbolServer() const return ui->useSymbolServer->isChecked(); } -QString SymbolPathsDialog::path() const +FilePath SymbolPathsDialog::path() const { - return ui->pathChooser->filePath().toString(); + return ui->pathChooser->filePath(); } void SymbolPathsDialog::setUseSymbolCache(bool useSymbolCache) @@ -69,13 +73,13 @@ void SymbolPathsDialog::setUseSymbolServer(bool useSymbolServer) ui->useSymbolServer->setChecked(useSymbolServer); } -void SymbolPathsDialog::setPath(const QString &path) +void SymbolPathsDialog::setPath(const FilePath &path) { - ui->pathChooser->setPath(path); + ui->pathChooser->setFilePath(path); } bool SymbolPathsDialog::useCommonSymbolPaths(bool &useSymbolCache, bool &useSymbolServer, - QString &path) + FilePath &path) { SymbolPathsDialog dialog; dialog.setUseSymbolCache(useSymbolCache); @@ -87,3 +91,6 @@ bool SymbolPathsDialog::useCommonSymbolPaths(bool &useSymbolCache, bool &useSymb path = dialog.path(); return ret == QDialog::Accepted; } + +} // Internal +} // Debugger diff --git a/src/plugins/debugger/shared/symbolpathsdialog.h b/src/plugins/debugger/shared/symbolpathsdialog.h index c3534fbcf6a..c77e112ea41 100644 --- a/src/plugins/debugger/shared/symbolpathsdialog.h +++ b/src/plugins/debugger/shared/symbolpathsdialog.h @@ -28,6 +28,8 @@ #include #include +namespace Utils { class FilePath; } + namespace Debugger { namespace Internal { @@ -43,15 +45,15 @@ public: bool useSymbolCache() const; bool useSymbolServer() const; - QString path() const; + Utils::FilePath path() const; bool doNotAskAgain() const; void setUseSymbolCache(bool useSymbolCache); void setUseSymbolServer(bool useSymbolServer); - void setPath(const QString &path); + void setPath(const Utils::FilePath &path); void setDoNotAskAgain(bool doNotAskAgain) const; - static bool useCommonSymbolPaths(bool &useSymbolCache, bool &useSymbolServer, QString &path); + static bool useCommonSymbolPaths(bool &useSymbolCache, bool &useSymbolServer, Utils::FilePath &path); private: Ui::SymbolPathsDialog *ui; From 04f6f6bbc07f25eee2fbee04b3d7558bfb675d77 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2021 16:58:46 +0200 Subject: [PATCH 15/67] CppCheck: Use more FilePath Change-Id: I45da67df4b76032303b57f567d73ae01bf9f2e91 Reviewed-by: Christian Stenger --- src/plugins/cppcheck/cppcheckoptions.cpp | 20 ++++++++++---------- src/plugins/cppcheck/cppcheckoptions.h | 7 +++---- src/plugins/cppcheck/cppcheckrunner.cpp | 4 ++-- src/plugins/cppcheck/cppcheckrunner.h | 4 ++-- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/plugins/cppcheck/cppcheckoptions.cpp b/src/plugins/cppcheck/cppcheckoptions.cpp index 735557daf23..d6c7b0196c0 100644 --- a/src/plugins/cppcheck/cppcheckoptions.cpp +++ b/src/plugins/cppcheck/cppcheckoptions.cpp @@ -39,9 +39,10 @@ #include #include -#include #include +using namespace Utils; + namespace Cppcheck { namespace Internal { @@ -102,7 +103,7 @@ OptionsWidget::OptionsWidget(QWidget *parent) void OptionsWidget::load(const CppcheckOptions &options) { - m_binary->setPath(options.binary); + m_binary->setFilePath(options.binary); m_customArguments->setText(options.customArguments); m_ignorePatterns->setText(options.ignoredPatterns); m_warning->setChecked(options.warning); @@ -121,7 +122,7 @@ void OptionsWidget::load(const CppcheckOptions &options) void OptionsWidget::save(CppcheckOptions &options) const { - options.binary = m_binary->filePath().toString(); + options.binary = m_binary->filePath(); options.customArguments = m_customArguments->text(); options.ignoredPatterns = m_ignorePatterns->text(); options.warning = m_warning->isChecked(); @@ -149,14 +150,13 @@ CppcheckOptionsPage::CppcheckOptionsPage(CppcheckTool &tool, CppcheckTrigger &tr setCategoryIconPath(Analyzer::Icons::SETTINGSCATEGORY_ANALYZER); CppcheckOptions options; - if (Utils::HostOsInfo::isAnyUnixHost()) { + if (HostOsInfo::isAnyUnixHost()) { options.binary = "cppcheck"; } else { - QString programFiles = QDir::fromNativeSeparators( - QString::fromLocal8Bit(qgetenv("PROGRAMFILES"))); + FilePath programFiles = FilePath::fromUserInput(qEnvironmentVariable("PROGRAMFILES")); if (programFiles.isEmpty()) programFiles = "C:/Program Files"; - options.binary = programFiles + "/Cppcheck/cppcheck.exe"; + options.binary = programFiles / "Cppcheck/cppcheck.exe"; } load(options); @@ -190,7 +190,7 @@ void CppcheckOptionsPage::save(const CppcheckOptions &options) const QSettings *s = Core::ICore::settings(); QTC_ASSERT(s, return); s->beginGroup(Constants::SETTINGS_ID); - s->setValue(Constants::SETTINGS_BINARY, options.binary); + s->setValue(Constants::SETTINGS_BINARY, options.binary.toString()); s->setValue(Constants::SETTINGS_CUSTOM_ARGUMENTS, options.customArguments); s->setValue(Constants::SETTINGS_IGNORE_PATTERNS, options.ignoredPatterns); s->setValue(Constants::SETTINGS_WARNING, options.warning); @@ -213,8 +213,8 @@ void CppcheckOptionsPage::load(CppcheckOptions &options) const QSettings *s = Core::ICore::settings(); QTC_ASSERT(s, return); s->beginGroup(Constants::SETTINGS_ID); - options.binary = s->value(Constants::SETTINGS_BINARY, - options.binary).toString(); + options.binary = FilePath::fromString(s->value(Constants::SETTINGS_BINARY, + options.binary.toString()).toString()); options.customArguments = s->value(Constants::SETTINGS_CUSTOM_ARGUMENTS, options.customArguments).toString(); options.ignoredPatterns = s->value(Constants::SETTINGS_IGNORE_PATTERNS, diff --git a/src/plugins/cppcheck/cppcheckoptions.h b/src/plugins/cppcheck/cppcheckoptions.h index 639ffca6c94..4d4ca83cb65 100644 --- a/src/plugins/cppcheck/cppcheckoptions.h +++ b/src/plugins/cppcheck/cppcheckoptions.h @@ -26,6 +26,7 @@ #pragma once #include +#include #include #include @@ -36,9 +37,7 @@ class QLineEdit; class QCheckBox; QT_END_NAMESPACE -namespace Utils { -class PathChooser; -} +namespace Utils { class PathChooser; } namespace Cppcheck { namespace Internal { @@ -50,7 +49,7 @@ class OptionsWidget; class CppcheckOptions final { public: - QString binary; + Utils::FilePath binary; bool warning = true; bool style = true; diff --git a/src/plugins/cppcheck/cppcheckrunner.cpp b/src/plugins/cppcheck/cppcheckrunner.cpp index 2f6cffb1eb2..261ccb3b638 100644 --- a/src/plugins/cppcheck/cppcheckrunner.cpp +++ b/src/plugins/cppcheck/cppcheckrunner.cpp @@ -74,7 +74,7 @@ CppcheckRunner::~CppcheckRunner() m_queueTimer.stop(); } -void CppcheckRunner::reconfigure(const QString &binary, const QString &arguments) +void CppcheckRunner::reconfigure(const FilePath &binary, const QString &arguments) { m_binary = binary; m_arguments = arguments; @@ -157,7 +157,7 @@ void CppcheckRunner::checkQueued() else m_queue.begin().value() = files; - m_process->setCommand(CommandLine(FilePath::fromString(m_binary), arguments, CommandLine::Raw)); + m_process->setCommand(CommandLine(m_binary, arguments, CommandLine::Raw)); m_process->start(); } diff --git a/src/plugins/cppcheck/cppcheckrunner.h b/src/plugins/cppcheck/cppcheckrunner.h index 83aca95192f..d49a9016dea 100644 --- a/src/plugins/cppcheck/cppcheckrunner.h +++ b/src/plugins/cppcheck/cppcheckrunner.h @@ -45,7 +45,7 @@ public: explicit CppcheckRunner(CppcheckTool &tool); ~CppcheckRunner() override; - void reconfigure(const QString &binary, const QString &arguments); + void reconfigure(const Utils::FilePath &binary, const QString &arguments); void addToQueue(const Utils::FilePaths &files, const QString &additionalArguments = {}); void removeFromQueue(const Utils::FilePaths &files); @@ -63,7 +63,7 @@ private: CppcheckTool &m_tool; Utils::QtcProcess *m_process = nullptr; - QString m_binary; + Utils::FilePath m_binary; QString m_arguments; QHash m_queue; Utils::FilePaths m_currentFiles; From 54459aaef656e4a8503366331ecc97ae0223ed10 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Tue, 5 Oct 2021 12:11:30 +0300 Subject: [PATCH 16/67] QmlDesigner: move 3D assets category to the right place Change-Id: I7c16dd687081646942b9fb45c608625ff02aa1da Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../componentcore/componentcore_constants.h | 1 + .../components/itemlibrary/itemlibraryview.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index 4fd6fdf1596..352c8796b41 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -222,6 +222,7 @@ const char addImagesDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources const char addFontsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Font Files"); const char addSoundsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Sound Files"); const char addShadersDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Shader Files"); +const char add3DAssetsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "3D Assets"); const char addCustomEffectDialogDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Add Custom Effect"); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 3bf7447a343..52d52d14823 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -242,14 +242,13 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) // All things importable by QSSGAssetImportManager are considered to be in the same category // so we don't get multiple separate import dialogs when different file types are imported. - const QString category = tr("3D Assets"); if (!m_importableExtensions3DMap.isEmpty()) - actionManager->unregisterAddResourceHandlers(category); + actionManager->unregisterAddResourceHandlers(ComponentCoreConstants::add3DAssetsDisplayString); m_importableExtensions3DMap = extMap; - auto handle3DModel = [this](const QStringList &fileNames, const QString &defaultDir) -> bool { + auto import3DModelOperation = [this](const QStringList &fileNames, const QString &defaultDir) -> bool { auto importDlg = new ItemLibraryAssetImportDialog(fileNames, defaultDir, m_importableExtensions3DMap, m_importOptions3DMap, {}, {}, @@ -258,17 +257,18 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) return true; }; - auto add3DHandler = [&](const QString &category, const QString &ext) { + auto add3DHandler = [&](const QString &ext) { const QString filter = QStringLiteral("*.%1").arg(ext); actionManager->registerAddResourceHandler( - AddResourceHandler(category, filter, handle3DModel, 10)); + AddResourceHandler(ComponentCoreConstants::add3DAssetsDisplayString, filter, + import3DModelOperation, 10)); }; const auto groups = extMap.keys(); for (const auto &group : groups) { const QStringList exts = extMap[group].toStringList(); for (const auto &ext : exts) - add3DHandler(category, ext); + add3DHandler(ext); } } From 53a4bc35445ffa8f3e10afad93b23aeb3875e277 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 30 Sep 2021 16:42:33 +0200 Subject: [PATCH 17/67] Doc: Document particle system component properties Fixes: QDS-5040 Change-Id: I47f0f159c1eb15cb6fbeb001fcb5987b5f430d0e Reviewed-by: Johanna Vanhatapio --- .../images/extraimages/images/9MqUCP6JLCQ.jpg | Bin 0 -> 9426 bytes .../qtdesignstudio-extraimages.qdocconf | 3 +- .../library/qtquick-preset-components.qdoc | 1 + .../src/qtquick/qtquick-library.qdoc | 1 + .../images/icons/attractor-16px.png | Bin 0 -> 288 bytes .../images/icons/emit-burst-16px.png | Bin 0 -> 381 bytes .../images/icons/emitter-16px.png | Bin 0 -> 318 bytes .../images/icons/gravity-16px.png | Bin 0 -> 328 bytes .../images/icons/item-ellipse-16px.png | Bin 0 -> 272 bytes .../images/icons/item-polygon-16px.png | Bin 0 -> 320 bytes .../icons/model-blend-particle-16px.png | Bin 0 -> 384 bytes .../images/icons/model-particle-16px.png | Bin 0 -> 448 bytes .../images/icons/model-shape-16px.png | Bin 0 -> 367 bytes .../images/icons/particle-shape-16px.png | Bin 0 -> 331 bytes .../images/icons/particle-system-16px.png | Bin 0 -> 334 bytes .../images/icons/point-rotator-16px.png | Bin 0 -> 421 bytes .../images/icons/sprite-particle-16px.png | Bin 0 -> 393 bytes .../images/icons/sprite-sequence-16px.png | Bin 0 -> 299 bytes .../images/icons/target-direction-16px.png | Bin 0 -> 253 bytes .../images/icons/trail-emitter-16px.png | Bin 0 -> 359 bytes .../images/icons/vector-direction-16px.png | Bin 0 -> 323 bytes .../images/icons/wander-16px.png | Bin 0 -> 334 bytes .../studio-3d-particle-system-navigator.png | Bin 0 -> 8916 bytes .../studio-3d-particles-fire-assets.png | Bin 0 -> 15634 bytes .../studio-3d-particles-fire-components.png | Bin 0 -> 12228 bytes .../studio-3d-particles-fire-emitter1.png | Bin 0 -> 8730 bytes ...icles-fire-properties-particle-emitter.png | Bin 0 -> 23329 bytes ...ticles-fire-properties-particle-system.png | Bin 0 -> 10138 bytes ...-3d-particles-fire-properties-particle.png | Bin 0 -> 25105 bytes ...ticles-fire-properties-sprite-particle.png | Bin 0 -> 10379 bytes ...icles-fire-properties-vector-direction.png | Bin 0 -> 8829 bytes .../images/studio-3d-particles-fire.gif | Bin 0 -> 324526 bytes .../images/studio-3d-particles.png | Bin 0 -> 11906 bytes ...dio-3d-properties-model-blend-particle.png | Bin 0 -> 9349 bytes .../studio-3d-properties-model-particle.png | Bin 0 -> 4465 bytes ...studio-3d-properties-particle-affector.png | Bin 0 -> 6883 bytes ...tudio-3d-properties-particle-attractor.png | Bin 0 -> 13833 bytes ...udio-3d-properties-particle-emit-burst.png | Bin 0 -> 3899 bytes .../studio-3d-properties-particle-emitter.png | Bin 0 -> 22954 bytes .../studio-3d-properties-particle-gravity.png | Bin 0 -> 5398 bytes ...dio-3d-properties-particle-model-shape.png | Bin 0 -> 4077 bytes ...o-3d-properties-particle-point-rotator.png | Bin 0 -> 7729 bytes ...studio-3d-properties-particle-rotation.png | Bin 0 -> 12568 bytes .../studio-3d-properties-particle-shape.png | Bin 0 -> 5883 bytes ...3d-properties-particle-sprite-sequence.png | Bin 0 -> 10154 bytes .../studio-3d-properties-particle-system.png | Bin 0 -> 9798 bytes ...d-properties-particle-target-direction.png | Bin 0 -> 11590 bytes ...d-properties-particle-vector-direction.png | Bin 0 -> 8433 bytes ...o-3d-properties-particle-wander-global.png | Bin 0 -> 7758 bytes ...o-3d-properties-particle-wander-unique.png | Bin 0 -> 8321 bytes .../studio-3d-properties-particle-wander.png | Bin 0 -> 3328 bytes .../images/studio-3d-properties-particle.png | Bin 0 -> 24143 bytes .../studio-3d-properties-sprite-particle.png | Bin 0 -> 10045 bytes .../src/qtdesignstudio-toc.qdoc | 8 + .../qtdesignstudio-3d-particles.qdoc | 1088 +++++++++++++++++ 55 files changed, 1100 insertions(+), 1 deletion(-) create mode 100644 doc/qtcreator/images/extraimages/images/9MqUCP6JLCQ.jpg create mode 100644 doc/qtdesignstudio/images/icons/attractor-16px.png create mode 100644 doc/qtdesignstudio/images/icons/emit-burst-16px.png create mode 100644 doc/qtdesignstudio/images/icons/emitter-16px.png create mode 100644 doc/qtdesignstudio/images/icons/gravity-16px.png create mode 100644 doc/qtdesignstudio/images/icons/item-ellipse-16px.png create mode 100644 doc/qtdesignstudio/images/icons/item-polygon-16px.png create mode 100644 doc/qtdesignstudio/images/icons/model-blend-particle-16px.png create mode 100644 doc/qtdesignstudio/images/icons/model-particle-16px.png create mode 100644 doc/qtdesignstudio/images/icons/model-shape-16px.png create mode 100644 doc/qtdesignstudio/images/icons/particle-shape-16px.png create mode 100644 doc/qtdesignstudio/images/icons/particle-system-16px.png create mode 100644 doc/qtdesignstudio/images/icons/point-rotator-16px.png create mode 100644 doc/qtdesignstudio/images/icons/sprite-particle-16px.png create mode 100644 doc/qtdesignstudio/images/icons/sprite-sequence-16px.png create mode 100644 doc/qtdesignstudio/images/icons/target-direction-16px.png create mode 100644 doc/qtdesignstudio/images/icons/trail-emitter-16px.png create mode 100644 doc/qtdesignstudio/images/icons/vector-direction-16px.png create mode 100644 doc/qtdesignstudio/images/icons/wander-16px.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particle-system-navigator.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire-assets.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire-components.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire-emitter1.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle-emitter.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle-system.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire-properties-sprite-particle.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire-properties-vector-direction.png create mode 100644 doc/qtdesignstudio/images/studio-3d-particles-fire.gif create mode 100644 doc/qtdesignstudio/images/studio-3d-particles.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-model-blend-particle.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-model-particle.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-affector.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-attractor.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-emit-burst.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-emitter.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-gravity.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-model-shape.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-point-rotator.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-rotation.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-shape.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-sprite-sequence.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-system.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-target-direction.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-vector-direction.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-wander-global.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-wander-unique.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle-wander.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-particle.png create mode 100644 doc/qtdesignstudio/images/studio-3d-properties-sprite-particle.png create mode 100644 doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-particles.qdoc diff --git a/doc/qtcreator/images/extraimages/images/9MqUCP6JLCQ.jpg b/doc/qtcreator/images/extraimages/images/9MqUCP6JLCQ.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db8ba3d9205cde6d832ec87d134ca2eb94919fb0 GIT binary patch literal 9426 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 B&xZg2 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/extraimages/qtdesignstudio-extraimages.qdocconf b/doc/qtcreator/images/extraimages/qtdesignstudio-extraimages.qdocconf index a0c485b95f2..7a4f2d4dcee 100644 --- a/doc/qtcreator/images/extraimages/qtdesignstudio-extraimages.qdocconf +++ b/doc/qtcreator/images/extraimages/qtdesignstudio-extraimages.qdocconf @@ -12,4 +12,5 @@ images/pEETxSxYazg.jpg \ images/V3Po15bNErw.jpg \ images/bMXeeQw6BYs.jpg \ - images/u3kZJjlk3CY.jpg + images/u3kZJjlk3CY.jpg \ + images/9MqUCP6JLCQ.jpg diff --git a/doc/qtcreator/src/qtquick/library/qtquick-preset-components.qdoc b/doc/qtcreator/src/qtquick/library/qtquick-preset-components.qdoc index cc896f78c9c..488dbbdfe04 100644 --- a/doc/qtcreator/src/qtquick/library/qtquick-preset-components.qdoc +++ b/doc/qtcreator/src/qtquick/library/qtquick-preset-components.qdoc @@ -86,6 +86,7 @@ \li \l {Morph Target} \li \l {Repeater3D} \li \l {Loader3D} + \li \l {Particles} \endlist When you import 3D scenes from files that you exported from 3D graphics diff --git a/doc/qtcreator/src/qtquick/qtquick-library.qdoc b/doc/qtcreator/src/qtquick/qtquick-library.qdoc index 3c73fcfa4ae..b1d03a72e67 100644 --- a/doc/qtcreator/src/qtquick/qtquick-library.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-library.qdoc @@ -85,6 +85,7 @@ \li \l{Scene Environment} \li \l{Morph Target} \li \l{Repeater3D} + \li \l{Particles} \endlist For more information about creating your own components, see diff --git a/doc/qtdesignstudio/images/icons/attractor-16px.png b/doc/qtdesignstudio/images/icons/attractor-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d49e7fd22592026963e99eca1fd9caa3f8ff67 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUxXV}JyzK{8_*K5hn_PSK^#`+*#jDo&-a7uXMAD0)Zlx|qf2(n^ RGy?+zgQu&X%Q~loCID`efh_<4 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/emit-burst-16px.png b/doc/qtdesignstudio/images/icons/emit-burst-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..d4259741547d30da1537a5676b3f1b0ff316d885 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7T|8YJLo9mdUf$d98z^$@ z;qy6X1mrLN@M!UJ?v4tv6FQmFr5U#9v-}0k5SLV|&Uq8eeVpjUa}PMm m9&+E4$bE8m)i0L)3>v#jZbsDhtY%KCCOXTq=OUZ1JbxoArG0vWblDIX-> z73}(KbNh46wC6vUeF?VGwFniKlacxvTM}_?>HVeLn~RS1-VE5fd@-L{>ms|=%kHk; z6&O6JIMse>%7NViT}FLpXKYG{IJkJus);GyCc9RgZWOT7)zpYApAz$@A>hjE7!G;1 zt38z-akCwaXBK3~EU|wr;FmJ@x5<;EE4Dw`**YavcUEb-pX$mj4FS^%b1rSI*>s7m zWm8`Exe_(oxPOYwo4)!#yWJEp?Wf=35BxX(@#gG%I*WgI?*^$Q$2WDUKRmls*7@sC a@zT}SV%!VoMlmojFnGH9xvX=*wEA(hx^xP$wzf@jQCSpuQmf4T z&Fu2{*?-NAi=Wx}pR+VpwRAb6RA$(3?l>m{c5Un2ws6&|Inoc9l;12qz;k}bp*^`er#CUG$UYX^UH_?FP|Yqpm2@i+EA7#J8BJYD@<);T3K0RWs+Zw3GW literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/item-polygon-16px.png b/doc/qtdesignstudio/images/icons/item-polygon-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..b56c7bb714cab773defe879307678fbfc2bdbf84 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7**#qxLo9liPPX-8aTI91 zzdBEV)zHxNBa_^L0A^+7gWNMXl{z?@lrkR3XFXCpcHs(?=v%SE3War^_DAqlDBbm z-@AVd33&|(oCoGEj7qt$BzfixAEOW3f%z)_I?w<3eM)V3p!3|ujKN@Y@}zj%2mIyr zEVuGyChvK1B7G7&LkJ7QgLmdC?)6EzzgF+w|M$yR-Hs=A4ZrJuh&WmJYHmFgdH$#L ZmlFk?Lf_Z!VPIfj@O1TaS?83{1OTuOfDixx literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/model-blend-particle-16px.png b/doc/qtdesignstudio/images/icons/model-blend-particle-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..0f77c30cf299cfeae5f113832a5350d94d468bc3 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7-923#Lo9mlPPX=Db`)vd zfAi*yvuV0YPEn$qc3jo2I$Jhu`5?GqLc+qg4ox>)ZrqAHc+5?Lb>o(<)`Y~RW?{eB zO|I%Va^!58+0m~e^~T2FtnK%@?*~#J^b76Jy%NQpz#h=RKZi*=PyF;X-32Q}70Pxo z=xkk~Tjv#^H=Wgh`3$qTgDTJA8@F~lu-;($m7^tv zO+GO7>vz|cAy$4%gSZ|1+kcc^FV(NTe_uzeyFco6^#hq3Wvj2g+Vt4ss{+TnCIt@< zP4|u01)XeECZ9akh8~*PGku<^%|6@bq1kS| zgz3R;(MJ}3?txRL1%3N(a!2UG+JBr0Qa70A-Tor+fMG_E*WEhP`}N5S13VZuA6WIg p(s^ghIyM=mbgz}u%Q){b9J=PaNM_aX*9;5{44$rjF6*2Ung9{Dqfr0= literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/model-particle-16px.png b/doc/qtdesignstudio/images/icons/model-particle-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..39cf9eeb23d4852edb9ecd2c58bdaa520f19647a GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUM; zzrQ~*F%d$p00WqOU4MUnU0oemY(*j%^!NAo^z?LhcV}c|Bqk<8q#)+h)q&KnSh1p{ zq@=X8w7I!CF)^{Nt*ySke#MFvwY9Y?R;)-*Pw(mJftU#)6B85b>gsxWdiwkOSFBjU zVrpi>z`$Tw666=mz{1MO!zU;xt)gmX9S|Imo|%Eak75uV!rQs|HZPfK&u`fJ>K7_)5!MHx^3-aqTe zD~sgs;h)atY~mJ}%9XlSNHfGM<-#1pb?tTpAF$Pa*2jMfn4Z zKjxNKxonUv|Bx%X#y;yD-XG+$Sh-g=SBL4AoY)%jft_9dz|FM}_(Si=9#v_&q`1;s zYw41JgBLgNZ7-I)_b@{w!$88MQLlhu4|Do~REf6p-I2NLw#*aXb)Za8qJl-Q;j;lx zJj0f{|4%%;t}>QAZ`96EnYwGz)u^v#r#Jb>UccWWFjZ7Rc;%Jao10>8Z@aDKy*X%- z%2^f92|<1_$0cv~1qTIHHk|MdR@|~NGiqhx6scKiQO2`oxi8Pmaw*&+eAF=Ll>YV7 zd0JDqu8G<9D(J-7MddCNXC7Xo(G{&4o9m%CH+ARIhS0D4Ka>v`8vIJl=eontZom0! zbsg^uhUx>?&g56zYfqe!S7*oI{J?~xDLi6R_5SDA8_hPnziNBe5`p=xfz`(%Z>FVdQ&MBb@01{H5=>Px# literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/particle-shape-16px.png b/doc/qtdesignstudio/images/icons/particle-shape-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..e8242fb4498131c4a9096994898223f0285c740e GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+3VFIXhDb=V9@NejOJHcY zXnaRzkwv@j!6&MfiAuj2xs9V)QnezEqzN|rc85xct^RN%F_3Ljzv}Gmn+yyiORRXL z+J02=F<4#t?zZ?i1H%i4_7{GO*URQCvt+n%bYDs9x33FdZ@IC38pD+h9vSzQ*9 z&0f5Bn&al&@B1tn7X00txqR`9y#H3*7q;>-%f9#TzmT?`!Rl6?KSR~M^e?;F8Emt+ zT=!fs)vZ|SE}PZ$`)-S;J4~0Jd*QqsQ?7|ruiNPhKex@kS|xpDxqn*}1H-JW&D(t&{l0I!SoMAP&Ao9Z{JL8> n7QD>+vTLr}?%ZuG2kK?^FWwVyY1u^v1_lOCS3j3^P6Eo!VeZ%)g$K)De$sQJ{jblJ+VvT_QLKZJhro4bdnAp$@;)3_y2UJbBJ*L*&gX-yADj5omQ20r|Te7#D>hvwI41d z9Ias2xK*az)b8VQcUo?DLuPX&1AENIl#{8+49|F%ZOpoxSa6~H9shH_hQrs^CfzM6 zG5WKrl;QL>!yW7oJmoKNrt%ey)*Z$+VY6kV1*SFU9Ng8J!D!gN6!T(@R zc-_yZOO5@0rEGYp#P=)XtV-=Ci(OwCEM9k?*ZacwlViub9?yIpyBWo2LyO;8BwcOW pzN~7ds{h)Xn^MmjyVrla|Fh)I8j+4i84L^z44$rjF6*2UngAg?m&O19 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/point-rotator-16px.png b/doc/qtdesignstudio/images/icons/point-rotator-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..f44a7f83f54df477498c09cbf30b748cd69164ca GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7b39!fLo9liUiR)dmnd@l z@yu|#EhTkGvC zu@gl}n=1aVzxOO`^5&{}%Rm2~`~Ib6`~M!l|4Ua{-DqdN(Z=}an03$NtV#NRXD##J zBX+)k*}jnJ_D1gQ22Gu-tSq}1th)Bl^4_C>N#~6NqjxRd(e&B#TuA8Um8(=MZid~R znUb||-s&t7^N$kR)00G+C0=!|&Qd;?#J%rvRCMK%+>OnNJ*E~Nw>|f5edK6!P;Sk! zw3tJ!DvvFiUW&a4yc||}!@W}K^s@!_VWG^P>yq`CRk3Ls+?;M<;{TiXn)9S;3BOPK z4)Wjq|L*7!8@9_oZtPa6yj5J=C|le4{6jWh^J!1DbUU+M&YSkH3fp>4zJ&dS-o8ho zeUGoiM0C$QUc1gN^Fjrul`EU<*gel_x;7v zh7%K9-cRJ&Ww9^)kc#4~YPpvexef}+Y<^VQ>hVKEnrri8jhc|0%IDu~)=tQMo>2Om idt1-Gig)k-@|zwKw0)m2C7FSNfx*+&&t;ucLK6T=VY-C? literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/sprite-sequence-16px.png b/doc/qtdesignstudio/images/icons/sprite-sequence-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..0174962ca4b6b94b708fbe4ad4c183e2a6d22430 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU= zz`!6~666=mz$~DkXyD-C8YqNRp=8*#>A%ZWUp=c3I+xS22WQ%mvv4FO#t0;hjIV_ literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/target-direction-16px.png b/doc/qtdesignstudio/images/icons/target-direction-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..42953368332b31acff3dbd0d2fa27de8f05d00ea GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUVFiXGDSph1 zYyQ`pwFbB9mZ$MEPIz^v`r47z1-~!LG8}Rb*I%mtm*v4VLB>ZHq$l;gJ{#vOd{tC& z`!q#8?aO>WFRDA2Z_>RGA}#VgQ)c4gFEecW=3eLDVgEo_WUxVm0JzvExcrM>Od`<`1qztgwsjLcD;xW}w+1+B(8kBePoUI(iivv2HC z<@sv=;&Ql-%aQqN0UIJ2zpEbR=`$*RWcGmhpS{A)i^XqJo*8QhZj3yctN8jtrqaxt zS6>%yV9nTMvfSOOGC1pNqr1~G>(c-CKM46NJ=)}I9qyX{-`=n@ex~KULnjLkYUeCi zZGQKz*o5w;S#NZ}}tnQ)jf)3|bRN{_bIt#CV{cdT~rC&6_eK01H4^_wNU^!|*QwKI;!d1r2wxDl|G zM?ld3=#po?as_u@>9U$QuA3dSTkzwbY=?#2N_G!7oVmbR5O<`xqv8+$10nqz?;re* goVoMPx__Lj`<;V03TuTK7#J8lUHx3vIVCg!0BtmrU;qFB literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/wander-16px.png b/doc/qtdesignstudio/images/icons/wander-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d43ed5c0894979c89cafc48796b805001f3de6 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUekkC0n-c-dw3=l|aAXDs_K+A+gyx;_H~1B0ilpUXO@geCx)e3v%> literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-particle-system-navigator.png b/doc/qtdesignstudio/images/studio-3d-particle-system-navigator.png new file mode 100644 index 0000000000000000000000000000000000000000..01e4519caab48135b8eab5917370797d52cdef2e GIT binary patch literal 8916 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 KT-G@yGywp3za(7% literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-particles-fire-assets.png b/doc/qtdesignstudio/images/studio-3d-particles-fire-assets.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3a94c162a111f134f0239804418c3e2716b8da GIT binary patch literal 15634 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-particles-fire-emitter1.png b/doc/qtdesignstudio/images/studio-3d-particles-fire-emitter1.png new file mode 100644 index 0000000000000000000000000000000000000000..ee56c599c7ae6f7810579bc800a208dac85374ba GIT binary patch literal 8730 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle-emitter.png b/doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle-emitter.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8106a8b7f0041cc1f9211666c6e52561f9d8f9 GIT binary patch literal 23329 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 TvZpgJFfe$!`njxgN@xNAQ~2)c literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle-system.png b/doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle-system.png new file mode 100644 index 0000000000000000000000000000000000000000..9a36cba2d87f3745bee97daf9bacb274f19289cb GIT binary patch literal 10138 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle.png b/doc/qtdesignstudio/images/studio-3d-particles-fire-properties-particle.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9282c6509677a6671ac5b1920d4cae4f17da5c GIT binary patch literal 25105 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-particles-fire-properties-vector-direction.png b/doc/qtdesignstudio/images/studio-3d-particles-fire-properties-vector-direction.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4d990a0d9ccf657ec44f27e7efe27372fca8a7 GIT binary patch literal 8829 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 HDWM4fh0Kj1 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-particles-fire.gif b/doc/qtdesignstudio/images/studio-3d-particles-fire.gif new file mode 100644 index 0000000000000000000000000000000000000000..292379041bb0c9a52d22773fdef42d2df1ae60cc GIT binary patch literal 324526 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%0DHMMg8@-5g`i)}3xd$N(o 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

byj@Vx#UG=zHmZYt&m%Cv*85KMIlvl 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


u!-_> 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�m8_9qM4xoN`E$N4A)SNq!C^@4p5H)(aQcvdX(; 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 X?s-xm&%rAU3=9mOu6{1-oD!M<&>`8w literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-model-particle.png b/doc/qtdesignstudio/images/studio-3d-properties-model-particle.png new file mode 100644 index 0000000000000000000000000000000000000000..bfbaf3a360149974312927bdcec7504cf359a35f GIT binary patch literal 4465 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-affector.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-affector.png new file mode 100644 index 0000000000000000000000000000000000000000..16000bdb24cafaa236f9afdc359a010f6410625e GIT binary patch literal 6883 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-attractor.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-attractor.png new file mode 100644 index 0000000000000000000000000000000000000000..fb46ef050e9293f6cde68f6fa2328e8b3f87e80d GIT binary patch literal 13833 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-emit-burst.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-emit-burst.png new file mode 100644 index 0000000000000000000000000000000000000000..3638646773c03df6ada4f59189a095090141407f GIT binary patch literal 3899 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-emitter.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-emitter.png new file mode 100644 index 0000000000000000000000000000000000000000..291d41329072b01e612f179f8b6c701a097c27a1 GIT binary patch literal 22954 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-gravity.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-gravity.png new file mode 100644 index 0000000000000000000000000000000000000000..b945aa85c188b1ad6903f8c7f83d8dec0e62ef2f GIT binary patch literal 5398 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-point-rotator.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-point-rotator.png new file mode 100644 index 0000000000000000000000000000000000000000..4069a35bda0ac7891a6aa8949e38acb3ec37820f GIT binary patch literal 7729 zcmeAS@N?(olHy`uVBq!ia0y~yU@T-{VC3UqVqjqSFmc0k1_s$5o-U3d6}R5b{TUvd zIqUfIId;oWXU(0LwfeMiaHw(Dwp&XV&1iM-h&aTT$l0Nz%C)IWfk|nT1_u{YS4Tq< z<3UkwfvLVXxm>uW3i&oUC@6R@R4}r&wf%pfMMdGn+14ASUXy;+`PJ>Hod3P{{n^_2 zzaQ>>|8&l8{nd;N52inkFW_Qe0AW8yh69=m3=GQ|7_QvXoH8N$k=;iT+t{XS(aUX0 zuAgFlE$g@aTgTBuj}%_*nRWNjw%zHq5wqu>-|l^6^9$*UNjufwn~^g~9Ui??qVoT)h5)V_V%yNPkSQZr}FsWHA0 zST<+*X1BP=joFc_@3}{wlTMwxX7lNaJ2iKz*biQ`S{J|e&Goh6n-+gP=k;r5^|2`- z!DUZcs@WZ6=L$uc$5bBh=s%hyef!5#8`=7KNp__-vt};kJSzStsZK)U_G;VJ%N~aK zDzDy~e*0Ke(cLdRJiWcWxk*{<@8pdxPtTLS7{UI!O`Bw|ujoy~+5t{`A9Kg*y|k#drR$eBZNHan-Wi zWq(dQe=Ez$cjdaKvACt`k9#kg5AV99+q`4jzihet8~V3<|Im|ue*MZfP5E5^gp=D! zn^whzvA^8&y5QBJxZ`Ih@_a1MQMfHzc+#nTdH&3crV(3;-E40&X~)^xnVE7{Jr~Jb zeR!dH_3Zu^=Pi!9EbO;*U!CIqDL#Ekj(f}BGxo`!SFKgGE_zhVeZalAYyJBCqc%*; z%%R0zC;nc1rn&rr(`&YOzw)E^UbEW!_od|RQkLoEXFV<}#y<7C_)Yi!&p?^tuZ!jg zE!mwqyXWld>pB$`Y5&UGq8CXRmtLE(tduXd?Cy_w!Avj9ZtAn7ueny+5d37n-^;#^ zUy2sVpI7BVZ9YC{`JUxdTU(84b>CjUyD7AKbzft(+wUKnQ#Nm1z4iOFj@Qb|Ce=Ug zYr3~wz30j2&j;l{2TuwP@=JXZTIR=h|I^}iVeh8A{k__KmQtzs<0&Wq*M9yrb;|X} zhqq4r#VsfIIN|Pvy%XNP*OHW}{!~2k`?T+KH-(1#714i})W7XN z^DFzjrzmfH;cRpNiFrBq!*51!?ce9Ie9!;aQ{H9N*|((U{Ih9&a$@S7Xa>7~Rj2GE zSFK&1Gdp3vu)S$dFff^suZ7!I=%U>e!9NSAK}-U z#r*kef4&rV4!`@)YO|JLLHQR?n`++1;IRK!pI+L$?8k%dRd;@$`D3-zde(LRkCLf>iqTWa6p_DJLgH~e-Fv@(lCfERd5XJV zO&()_`SJ^YxU=-D&hI=V(a1XWdD-6Geb;BXP7hVNY54rgl3y`<>Wxp8tWDajbvyg^ zZa)2r)B7@V?@ugP{4q2AI`_fH$8L*%m(229{PQdC*UMMt{4G0uXHwg-*%Q^Gmb9zy z?${pD8o#De<<%>pKM|F7H%czwi9MgWRC-4I^$QVV$@|KlowzT%c9QJbKUR+*F55OQ zq5M?;oF8|X7UcOcGB8-Mg3HMVA`A?3n83wn0;feQ69dD38Kj~VqzbB}A((-I0b0UZ zu(&pW4+o|!#s<>xs0^vSHh z7h0v-h(4>l@K9udTtM%gLy!1&NSqTf*va_u`KM2tCN)*Q`B^W+x%i3il^dGN3Vodq zr3*d$DY-I2)$YyjmoHDJFMn%aaw+lMtLIM>RPJ8-sxyh>+>OJU4$T*~ay=~H^K*W^ z&lZ`@6Q)a4e6Chk{rcz3nLn@A6`uU+@a@g7mcUPHuij00Hvctu9!H(kZf8Bw*N@lM zhW-?7KEKrO;?|qevu8zz#6%V8svkQW@QiKN$#pyCXy3oDbIP{**O{AVD(2fhTz+|x z(_*6^=H6XF%xfh@j`caG2Q}{q=_^09^w__3U2oQ`IrI28Q?ilYkCVp_RK;hx?U=0B zx+q_M&N=}eITC*r z)va{C6cnvYIHftK<5l9xyI(#qPqfrs|Ep`y43HNtWL)AtYO$v3mS#ymw|>=+I3Cw4 zs^K;jspgOGdNDXo@x0}tJVz+=S>4L$DUTO9m`lN5QSwZr8x!6R3nTL~S$Az^@o}Y4N*Y}IxtM6-0bC+_Pm3%h+?(Z4y zraV_#q))pYvi-hO;rd*@WhmjMJ!l#N|y)hIN9Hxt>p8B@!P-Ki|5YVQ@+w0lynsR z7G5Y%<5p9vUjN%GosVnzg|alx-+8T(($Sy39hvsMo4Z{4!V160xqqjg6l8a1+8etz z!X#*UfUL1~`#Tq_+c$5|wwzb-=hyMe_iWU^*Q&q&*3tcKLzyVwp4thIUOw2OZL)Tg zcgaQP{PeuDU}r-jlneKUu@){hD3YoR{J=H<_;vyKwjF z#h5BR&Bb2=lXrDrU1)7Pw|8l3`Kqkw-N)Qt_uZ&k5_;cKZ~7X~g1Wy?4OZu0ejloG zQpeepUn}F~D^YH($8RI@)ZhQRa#y(~qDt}qx4p*mc)A*IcYZpqzl()GFHU1mbg9>_ zszuK$oh6F?tK1Ydm!9^+d7D@w|71yQ5iblLE6dH!Xi7zbRs$ zC2#0SJ(EW(HaYbcbamZWZufHEo2BZvmw7JN(O+M8#+2WJHN#{-=W>a6`u~4^oh%)x zd2;!tZh2n5DebcoEEpSt|8c%JrgyMV-9J4|#r^lq%^B!LFIW}B942sitfDxFX*mPK z@;}qsgc-{sB!XhItkYHs2ZdZwM|BYB&bdfz=q8;DnX}t~pE% zZPrJ1mU$T|%v`kI{X$St(e^*SnI--2tE@K939X%Ic=k%=`u@#py7}KQ`Z0P-s+lYN zi;0U13o_{UjgFbJ=j0*J6|x_mi~jk4$7TM%UHMPD_FSF4()+q*@cY1Z-K870J-%gG zC9_Lu){8S=C+sVnkOnTsmt^Jdn&&EXQ1bW6`@b7)4`?QwOnPwk{oE;6J{ucUHLu+-@gl>*#T2&ffp;-}nDz38$}^Ro{L7eR_T7{#woR!D;u->NS7Nb^L$fs%;g# zROUKt`RL3_h3evd<>!~b7i%CFyid-hTDH&M8xvKvSV3D+#pGd7a(%dKSye7Q#lro20<`KKf*BqN0Ff0}1t)&f&zKgKKu^-X0yGY(FEzW3-w z_Qk%2%eY-m&epNw-2QoAOx)j}R?c&IGw0XM+7y_cdH?sBQm&&vF8mE&%PA(Zt9suO z>*!x~r7zv?A6b2|@Z{l1Q*8MJuO6PX`{hG+rQ)c#ucDQPEAI&R|Ns5Gt()^=;6_fv zgTEJ_zy7V;>$2a{Wk)K0YF90YIKI7yKV)uim&Kew&C0(92i((pR zgYOk{W&fXhG5zJ8oqjLRl}@~SW~LjcggyQ0(%s_u+(mbFlV{icOPp4je)sp8F9~wj zZG!4&D3||yxNG7wi|&^bL_XhGHa#@44P@zypD}NR=iay6t8&Qqt%M$b(nL4QCB7lv zPRVQSxBhw8zc5;C#kMbVlEkjtTr0Zr#&&ti>FH5#FVFj%Ta*%TZguB9CH>`BmNTm| z`UEYvSW@oM_4i9^VeS3d&P~RBo97&|3$Xmb{IEvAkI|d!*t|n|iQ85?352xsJUp@H zj(U&OM6gIBa*W7)j>@MUczN*me8gBKUck(Jk>5b_4?^u=U@N(@ZQhL`=;hI z!Rxc4<$NyQ38*y9oxgTojoSCzUwgY$UZ$S^;IVq&>=#Q4R?mApFi>Ghyl{)lk0;*@tF^A$tXQygb-2z7ADfD(d(B&ncXu2*_WV)Y$Ir)_JlJg` z=a=`LuFVyi6JKx1L~3 z^ve4&eAt)5zyK=+q3v6SFPlnRzF6mhMx~-HNK197`M^Xng8+qVlHSwb6!oS&rTw@%TQJC zPlL*pjj>zbTv^4t>$ds(f7ku{GBO|EWA|f}V(L}<+FTg%)n+*)<5wGsT#YF@+8kbH z+{q;=Kc(eX)Wp;OUVQ#~YRl93nYqgkXcll?Q0Y0e>Y1hM`R7^lU;H`u(v?3i>v%z> zK>LabUlTod%>8_|Yt8*ysZDj#nWh%3evGpoiokN6JSf+Bcs2+IDt>mJT=4mN=lq(5 zHL9$jfKan+J>*+w6C<3c^#9Pk`syvlligKyz;QOks`X{Pv(l+)_wEJk^vumyP2D)J z@7ueH*R778zlU01=REG`MG!U zq^i2Kw7SykJDyZ2R3Fr+ob0Nmcy-3Q?DeZ(EBt0U(%56|I1yoy1+?srdXI{;^ z#KJEJGlF|wG6jB8Tcy5m-@ML_Y(eMad->-uU6J2)yj9$`M!)Tk^jSzFyxHWGO75Z} zp`fqbIXk~clx(sBh1L~T+xe?&7k#!~KHX)+%Dd4zUSuG~bA&?bc#(EIlF6H-*K(bFteJ-w-dSKR*`u zwj|9v0E_MZN#>C?LYH{7c5IvebtSjF3aI(Awegg1R<*Wf_t%mw<^6lES>BuX%ww^^ z-+T|3o0o1&AJRx%c*@hmKIfq5>`mWZz5cCbx2p~0U=v1^=r=OWP5AlDBt&)hg^tCi zxI#<3maKf*KW*CD%k$fxwfTW`99Tbb;1k5w@~%jqsVNRhi@zV8ylRbuw^i%AkFoyg z(~L_CZ7=xD{r<~h|939aMS0Jiw<#aWdnmGDN@5Z7qw`OnrmC`jzOm(~>&e+Vb6RdO z*2f+Ef8O`<^y%OBP1XJsmcOjdXZeg{rv2BBT1DJ0d@FPJFgL64+( z7QBvB5uCGex!#SpHLEXpl)2o{ox?Ouhwa{A1}A8 zxUhof-`Povt~g}3O#*p2FOUNsCQ%>Z; zQ=;Yje{jEkyngu!y?+|s+a^vlJZ|>j(PqxTXMD%LEM51!v~+=XHM?(G>%(1#Wx6V3 zK70I4{Aqg5GRFLpO!~4f_n!aF(|xve>x`!&Kigo9rybuJU$x9Tf7R~d&$*YqmF`^W zd-zE~EOUzUEtjn-Cf9xipML*OVpnQo*8XY1|Gw2v78cG|yVukIZL3)8?N{e^9g1{( z>ikx7Tgc-LuNKM+FEQ8Wdnr39$-Xu+7}R>Yv^s8P@Uv3u{cDvc2H#-UVz2KoYz=O( zI(Q@ahVGfNP>!Zo6BK1MITI$i^?J-+Vd8(Y;?-sQn(alEM=#A>e&)^+4YjQI>k1}! zyxP|$alGNtyW=bQE-^t`OuVUAdHBP6x2Q(FdE3{mojC*;* zQm(19uY3y&5_|nJ@<}HDToI)p0_;)rub^e+!H??+` zU8{}z-dE{k;H?-uPlE&lPU#dktKWWd&l8^tl;b~%S+w!E39f{(BH-5z2(XP7} zA@I^*Yn?Yz|8j-O-E;ZYo0Z$#qrT34T;x8R<@xn^K4aB4Am2+M7hRgauWL=q_j3;2 z#NBJLYE8gYl{=f>cb~tsHSJp9mcL=OWqDuKZXGY-Y6w1%uZGs>0oOlBRSmd#MEjNy z1FKJ-!=Igd_N-ZwAUAv44p1$nvT)nw`P1e9zMB1VTlAeUz5ZY8eM3MM!K=PT^Zn&P zLFdn(IkWzq)btqs6nzQR{7olRmgN1jdiZ_*&Mg02W3!rxyK<(k<$DII3E@@Sz67MI zt=r#8_IBuLzqPj(?5_R%uKw?nj%jA^Y9EL!_y=p-@uA{r~O7b3SrYZM^QW_%#L}$d}SG zU-@?J5}j+8FW$5L6!pBKdX{qUp)dOt1yjBA^Eno`w1O(91}5Y*k!fW57`ZyLKckt= z_wS`Q$gT(1ebCw(2Q(RQH$Yq;w^M&`0Ng%yV4N&1P_L)2udO-b_%dBRuX`zmo*w>H|>l-Y7 zC2Y|=R??_ZDSUNuK>T@^BU?Kbf?Kw)`0qYG)GfD9-1%QGN>A33bLB7BZFj15tRiJW zq4lZ>d--`(Wy#OkxB6yC&X{n$DfofN0zHFoB4ym0V?~=5Sfy~ddoj&e5~zGhO-ps5 z;pLE=WGRp66>^aF%IrTCJJg&E{S)5rx4kv<q;xX5U9O- z%i*co*1c1w9Idjtwc9=JwM@Q$@shw9|IAeu<-B~$n>b}dz*Cha^4lJC`9@ZM{aPz3 zAL|Tq@T>;pev-+|S!Nq*iltUfip@9@nA)mkrF!YgCwK4D*Iu4?E_PN2>3DD*z41wI gf?#M+J^G(nwKcmdKI;Vst08Gw=y8r+H literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-rotation.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-rotation.png new file mode 100644 index 0000000000000000000000000000000000000000..207d0a676344727b2ffbb7040819b6283482d317 GIT binary patch literal 12568 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 C`<$i# literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-shape.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-shape.png new file mode 100644 index 0000000000000000000000000000000000000000..b84095fa69121088cf7d50f63ccfb4f87b96bc4b GIT binary patch literal 5883 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-system.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-system.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2205c7cc250ac7e2adebc54053408782e5ec30 GIT binary patch literal 9798 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 m(l2voq8SWTzV8db#u}vIIOkJB+ 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-wander-global.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-wander-global.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf45be008faca762d105a22db74b75b6b178cfd GIT binary patch literal 7758 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle-wander-unique.png b/doc/qtdesignstudio/images/studio-3d-properties-particle-wander-unique.png new file mode 100644 index 0000000000000000000000000000000000000000..dabef3c86fd8262d143a941f02299faae1d3a26f GIT binary patch literal 8321 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 B8Djtd literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-particle.png b/doc/qtdesignstudio/images/studio-3d-properties-particle.png new file mode 100644 index 0000000000000000000000000000000000000000..0615eb7733e3750e29d240a7dd8e77dd8a74a31f GIT binary patch literal 24143 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-3d-properties-sprite-particle.png b/doc/qtdesignstudio/images/studio-3d-properties-sprite-particle.png new file mode 100644 index 0000000000000000000000000000000000000000..6a3a7705f5cae06daea0f5b4cd4b5360e88e977e GIT binary patch literal 10045 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 + \uicontrol Components > \uicontrol {Qt Quick 3D Particles 3D} + after you add the \uicontrol {QtQuick3D.Particles3D} module to + your project, as instructed in \l{Adding and Removing Modules}. + + \image studio-3d-particles.png "3D Particles" + + When you add an instance of the \uicontrol {Particle System} component to a + scene, \QDS automatically adds instances of the \uicontrol {Sprite Particle}, + \uicontrol Emitter, and \uicontrol {Vector Direction} components for you. + + \image studio-3d-particle-system-navigator.png "Particle System in Navigator" + + The \uicontrol {Sprite Particle} is a visual \l{Textures}{2D texture} + particle. To use \l{3D Models}{3D model} particles, add instances of the + \uicontrol {Model Particle} component to the particle system. It is + important to define the amount of particles to use in \uicontrol Properties + > \uicontrol Particle > \uicontrol {Max amount}, so that the optimal buffer + sizes get allocated. You can also specify the color and opacity of the + particles, as well as the speed at which they fade in and out. + + The \uicontrol Emitter component emits the sprite or model particles. + You can specify particle shape and the area where they are emitted. Use + variation in particle size and rotation for more natural results. Further, + define the life span and initial direction of speed of the emitted + particles. + + Usually, affectors are used to make particle movement more interesting. + For example, you could add an instance of the \uicontrol Gravity component + to simulate falling objects, an instance of the \uicontrol Wander component + to simulate flying objects that follow wavy curves, or an instance of the + \uicontrol {Point Rotator} to simulate windy weather. + + To add a particle system that emits sprite particles: + + \list 1 + \li Select \uicontrol Library > \uicontrol Assets > \inlineimage plus.png + to add your sprites, 3D models, textures, and other graphical + \l{Assets}{assets} to the project. + \li Drag-and-drop an instance of the \uicontrol {Particle System} + component from \uicontrol Library to a scene component instance + in \l Navigator. + \li Drag-and-drop an instance of the \uicontrol Texture component + from \uicontrol Library > \uicontrol Components > + \uicontrol {Qt Quick 3D} to the sprite particle instance + in \uicontrol Navigator. + \li Drag-and-drop the sprite image from \uicontrol Library > + \uicontrol Assets to the texture instance in \uicontrol Navigator. + \li Select the sprite particle instance in \uicontrol Navigator to + display its properties in \l Properties. + \li In \uicontrol Sprite, select the texture instance. + \li Select the emitter instance in \uicontrol Navigator to + display its properties in \uicontrol Properties. + \li In \uicontrol Particle, select the particle instance to emit. + \li Select the vector 3D instance in \uicontrol Navigator to + display its properties in \uicontrol Properties. + \li In \uicontrol Direction, set the emitted particle velocity + towards the target vector. + \endlist + + Add instances of other components according to your use case. The following + section describes how to modify particle system component property values by + using the simulation of fire as an example. + + \section1 Example: Fire + + \image studio-3d-particles-fire.gif "Fire simulated by using particles" + + In this section, we explore using particle system components and modifying + their property values, such as particle source images and their color, life + span, and fading effects, to simulate fire. + + We will need the following \l{Assets}{assets}: + + \list + \li Two images of flames: \e flame_01.png and \e flame_03.png + \li An image of smoke: \e smoke_01.png + \endlist + + \image studio-3d-particles-fire-assets.png "The assets in Library" + + We will also need instances of the following components: + + \list + \li \l {Particle System} (one instance) + \li \l {Sprite Particle} (four instances) + \li \l {Emitter} (four instances) + \li \l {Vector Direction} (four instances) + \li \l {Textures}{Texture} (four instances) + \endlist + + We start by creating a \l{Using Project Wizards}{Qt Quick 3D Application} + project and adding the assets to it. We then follow the instructions above + to add the \uicontrol {Particle System} component instance, which provides + us with our first \uicontrol Emitter, \uicontrol {Sprite Particle}, and + \uicontrol {Vector Direction} instances. + + We add a \uicontrol Texture component instance with \e flame_01.png as the + source, and then add the texture as the sprite to use for the sprite + particle. We now have all the component instances we need for our first + emitter. To keep all the component instances together, we drag-and-drop the + sprite particle instance to the emitter instance in \uicontrol Navigator. + + \image studio-3d-particles-fire-emitter1.png "First emitter in fire example in Navigator" + + We need more than one particle to realistically simulate a fire, so we will + add three more emitter instances to the particle system. We can copy-paste + the first instance in \uicontrol Navigator, and just modify two of the + texture instances to use \e flame_03.png as the source and one of them to + use \e smoke_01.png as the source. We use three different flame particles + to be able to layer them and to hide the fact that two of them actually use + the same texture. + + \image studio-3d-particles-fire-components.png "Fire particle system component instances in Navigator" + + We can now start playing with the particle system component properties to + achieve the artistic effect that we want. To see how the changes in property + values affect the simulation, we will open the live preview by selecting + \inlineimage live_preview.png + on the main toolbar (or by pressing \key {Alt+P}). + + First, we will specify property values for the \uicontrol {Particle System} + component. We want to spawn some particles before the simulation starts, so + that the fire will be roaring at start. To achieve this, we set the value of + \uicontrol Properties > \uicontrol {Particle System} > + \uicontrol {Start Time} to \e 2000 milliseconds. We will + use the default values for the other properties. + + \image studio-3d-particles-fire-properties-particle-system.png "Particle System properties" + + Then, we will specify how individual particles are spawned. We set the + value of \uicontrol Properties > \uicontrol {Particle Emitter} > + \uicontrol {Emit rate} to \e 40.00 for the flame particles and \e 20.00 + for the smoke particle, because we want to have more flames than smoke. + + \image studio-3d-particles-fire-properties-particle-emitter.png "Particle Emitter properties" + + To increase the visibility of the smoke at the top, we set the value of + \uicontrol {Life span} to \e 1200 milliseconds for the smoke particles + and \e 900, \e 1000, and \e 600 milliseconds for the flame particles. + Further, we set \uicontrol {Life span variation} to \e 100, \e 200, and + \e 300 for the flame particles to have some of them expire sooner than + others. + + To scale the particles during their lifespan, we set + \uicontrol {Particle scale} to \e 2.00 for all particles and + \uicontrol {Particle end scale} to \e 5.00 for the flame + particles and to \e 6.00 for the smoke particles. + + We can now modify the appearance of the particles by setting their color in + \uicontrol Properties > \uicontrol Particle. We select transparent yellow, + orange, and transparent gray in \uicontrol Color and set values for + \uicontrol {Color variation} to use slightly different colors for the + individual particles. + + \image studio-3d-particles-fire-properties-particle.png "Particle properties" + + We set \uicontrol {Fade in effect} and \uicontrol {Fade out effect} values + to \uicontrol FadeOpacity to change particle opacity between 0 and 1 over + the time specified in milliseconds in \uicontrol {Fade in duration} and + \uicontrol {Fade out duration}. Fading duration is calculated into the + particle lifespan, and therefore the smoke particles are actually never + fully visible with our settings. + + To specify that the particle texture should always be aligned face towards + the screen, we enable \uicontrol Properties > \uicontrol {Sprite Particle} > + \uicontrol Billboard for all the particle component instances. + + \image studio-3d-particles-fire-properties-sprite-particle.png "Sprite Particle properties" + + Finally, we will specify the direction in which the particles move by + modifying the property values of the \uicontrol {Vector Direction} component + instances in \uicontrol Properties > \uicontrol {Particle Vector Direction}. + + In \uicontrol Direction, we set \uicontrol Y to \e 100.00 to make particles + move \e up, and \uicontrol Z to \e -100.00 to make them move in the + direction opposite to the target vector. We set the \uicontrol Direction + value to \e -50.00 for one of the flame particles and to \e -80.00 for the + smoke particle. + + \image studio-3d-particles-fire-properties-vector-direction.png "Vector Direction properties" + + We set the \uicontrol {Direction Variation} values for the different + vector direction instances to \e 10.00, \e 8.00, and \e 12.00 to make some + flames spread wider than others. You can try different values until you + get the effect you want. + + \section1 Performance Considerations + + The particles are designed to be usable on a variety of hardware on + desktops, as well as mobile and embedded devices. However, in addition + to rendering the maximum amount of particle elements on the screen, + extensibility to different use-cases, rendering quality, integration + with the other UI elements, are also important. + + Currently, the rendering runs on GPU, while the particle system logic + runs on CPU. However, the \e {stateless particle system} enables you + to move the system logic onto GPU if that seems beneficial. The initial + measurements indicate that the system is quite well balanced between + CPU and GPU. The stateless system also enables animating particles by + using a \l{Timeline}{timeline}. The model particles use instanced rendering + to boost the performance. Therefore, OpenGL ES 2.0 isn't sufficient to make + rendering performant, and at least OpenGL ES 3.0, Vulkan, or some other + modern backend is required. + + To get a more concrete view on the actual performance, the video below shows + a particles Testbed application running on four different Android devices. + These devices and their chipsets and GPUs could be considered to be + lower-end to mid-range, confirming that the particles can perform well also + on affordable hardware. + + \youtube 9MqUCP6JLCQ + + \section1 Summary of 3D Particles + + \note The \uicontrol {Particles 3D} components are released as a tech + preview feature in \QDS 2.2, and their functionality will be improved + in future releases. + + The following table lists preset particle components. + + \table + \header + \li Icon + \li Name + \li Purpose + \row + \li \inlineimage icons/attractor-16px.png + \li Attractor + \li Attracts particles towards a specific point. + \row + \li \inlineimage icons/emit-burst-16px.png + \li Emit Burst + \li Generates declarative emitter bursts. + \row + \li \inlineimage icons/emitter-16px.png + \li Emitter + \li Emits logical particles. + \row + \li \inlineimage icons/gravity-16px.png + \li Gravity + \li Accelerates particles to a vector of the specified magnitude in the + specified direction. + \row + \li \inlineimage icons/model-blend-particle-16px.png + \li Model Blend Particle + \li Blends a particle effect with an instance of a \uicontrol Model + component. + \row + \li \inlineimage icons/model-particle-16px.png + \li Model Particle + \li Creates a particle that uses an instance of a \uicontrol Model + component. + \row + \li \inlineimage icons/model-shape-16px.png + \li Model Shape + \li Provides 3D shapes from a model to emitters and affectors. + \row + \li \inlineimage icons/particle-shape-16px.png + \li Particle Shape + \li Provides 3D shapes to emitters and affectors. + \row + \li \inlineimage icons/particle-system-16px.png + \li Particle System + \li Creates a particle system that includes particle, emitter, and + affector components. + \row + \li \inlineimage icons/point-rotator-16px.png + \li Point Rotator + \li Rotates particles around a pivot point. + \row + \li \inlineimage icons/sprite-particle-16px.png + \li Sprite Particle + \li Creates particles that use a 2D sprite texture. + \row + \li \inlineimage icons/sprite-sequence-16px.png + \li Sprite Sequence + \li Provides image sequence features for \uicontrol {Sprite Particle} + component instances. + \row + \li \inlineimage icons/target-direction-16px.png + \li Target Direction + \li Specifies a direction towards the target position. + \row + \li \inlineimage icons/trail-emitter-16px.png + \li Trail Emitter + \li Emits logical particles from other particles. + \row + \li \inlineimage icons/vector-direction-16px.png + \li Vector Direction + \li Specifies a direction towards the target direction. + \row + \li \inlineimage icons/wander-16px.png + \li Wander + \li Applies random wave curves to particles. + \endtable +*/ + +/*! + \page studio-3d-particle-system.html + \previouspage studio-3d-particles.html + \nextpage studio-3d-logical-particles.html + + \title Particle System + + The preset \uicontrol {Particle System} component is the root of the + particle system. It ties all the other components together and manages + the shared progression in time. Emitters and affectors must either be + children of the same \uicontrol {Particle System} component or refer + to the same \uicontrol System to be able to interact with each other. + + You can add several \uicontrol {Particle System} components. Typically, you + would use separate \uicontrol {Particle System} instances for the components + that interact with each other. Or, you can use just one instance if the + total number of components is small enough to be controllable. + + Specify settings for the particle system in \l Properties > + \uicontrol {Particle System}. + + \image studio-3d-properties-particle-system.png "Particle System properties" + + You can freely animate the particle system property values using a timeline, + which enables you to synchronize particles with other animations, for + example. + + In \uicontrol {Start time}, set the time in milliseconds where the system + starts. This can be useful to warm up the system so that a set of particles + has already been emitted when the simulation starts. For example, if you set + the start time to 2000 and animate \uicontrol Time from 0 to 1000, the + animation shows particles from 2000 ms to 3000 ms. + + In \uicontrol Time, set the time in milliseconds for the system. If + you modify the value of this property, you should usually disable + \uicontrol Running to stop the simulation. All particles are destroyed + when you select it again. + + To temporarily stop the simulation, select \uicontrol Paused. Particles + are not destroyed, and when you deselect the check box, the simulation + resumes from the point where you paused it. + + Select \uicontrol Logging to collect particle system statistics, such as + the current and maximum amounts of particles in the system or the average + time in milliseconds used for emitting and animating particles in each + frame. Logging data can be useful when developing and optimizing the + particle effects. + + \note Logging can negatively affect performance, so it should be disabled + before packaging applications for release and delivery to users. + + Select \uicontrol {Use random seed} to randomize the particle system + with the seed that you specify in \uicontrol Seed to get an identical + pixel-perfect particle effect on every run. You should not modify the + seed value during particle animation. +*/ + +/*! + \page studio-3d-logical-particles.html + \previouspage studio-3d-particle-system.html + \nextpage studio-3d-particle-emitters.html + + \title Logical Particles + + All the particle system components act on \e {logical particles}. Each + particle has a logical representation within the particle system, and this + is what the components act upon. Not every logical particle needs to be + visualized, and some logical particles could lead to multiple visual + particles being drawn on screen. + + Two different logical particle components are supported: + \uicontrol {Sprite Particle} for \l{Textures}{2D texture} particles and + \uicontrol {Model Particle} for \l{3D Models}{3D model} particles. Model + particles use \l{Instanced Rendering}{instanced rendering} to enabled the + rendering of thousands of particles, with full \l{3D Materials}{materials} + and \l{Lights}{lights} support. + + The following components are available for adding logical particles and + for modifying their actions and appearance: + + \list + \li \l{Sprite Particle} + \li \l{Sprite Sequence} + \li \l{Model Particle} + \li \l{Model Blend Particle} + \endlist + + \section1 Sprite Particle + + Specify properties for sprite particles in \uicontrol Properties > + \uicontrol {Sprite Particle}. + + \image studio-3d-properties-sprite-particle.png "Sprite Particle properties" + + \uicontrol {Blend mode} determines whether particles are blended using + source over, screen, or multiply mode. If you select \uicontrol SourceOver, + the pixel component values from a foreground source are written over the + source by using alpha blending. If you select \uicontrol Screen, the values + are negated, then multiplied, negated again, and written. If you select + \uicontrol Multiply, they are multiplied and written. + + \uicontrol Sprite defines the \l{Textures}{Texture} component used for the + particles. For example, to use an image of a snowflake to simulate snow, + create an instance of the \uicontrol Texture component with the image + as the \uicontrol Source. + + In \uicontrol {Sprite sequence}, select the \l{Sprite Sequence} component + instance for the particle if the sprite texture contains a frame sequence. + If your image only has a single sprite frame, don't set this value. + + Select \uicontrol Billboard to specify that the particle texture should + always be aligned face towards the screen. Enabling this property + automatically disables \uicontrol Particle > \uicontrol {Align mode}. + + \uicontrol {Particle scale} specifies the scale multiplier of the particles. + To adjust particle sizes in the emitter, set \uicontrol {Particle Emitter} + properties. + + In \uicontrol {Color table}, select the \uicontrol Texture component that is + used for coloring the particles. The image can be a 1D or a 2D texture. + Horizontal pixels determine the particle color over the value you set in + \uicontrol {Particle Emitter} > \uicontrol {Life span}. For example, when + the particle is halfway through its life, it will have the color specified + halfway across the image. If the image is 2D, a vertical row is randomly + selected for each particle. For example, a \c {256 x 4} image contains 4 + different coloring options for particles. + + \section1 Sprite Sequence + + Specify properties for a sprite particle sequence that contains a frame + sequence in \uicontrol Properties > \uicontrol {Particle Sprite Sequence}. + + \image studio-3d-properties-particle-sprite-sequence.png "Particle Sprite Sequence properties" + + \uicontrol {Frame count} specifies the amount of image frames in a sprite. + A particle animates through these frames during its duration. The frames + should be laid out horizontally in the same image file. For example, the + sprite could be a 512x64 image, with the frame count of 8. This would make + each particle frame size 64x64 pixels. + + \uicontrol {Frame index} specifies the initial index of the frame. + This is the position between frames where the animation is started. For + example, when the frame index is 5 and \uicontrol {Animation direction} is + set to \uicontrol Normal, the first rendered frame is 5. If the animation + direction is set to \uicontrol Reverse, the first rendered frame is 4. + + The value of \uicontrol {Frame index} must be between 0 and the value of + \uicontrol {Frame count} minus 1. When \uicontrol {Animation direction} is + set to \uicontrol SingleFrame and \uicontrol {Random start} is disabled, all + the particles will render sprites with the frame index. + + Enable \uicontrol {Random start} to start the animation from a random frame + between 0 and \uicontrol {Frame count} minus 1. This allows animations to + not look like they all just started when the animation begins. + + \uicontrol Interpolate determines whether sprites are blended + between frames to make the animation appear smoother. + + \uicontrol Duration specifies the time in milliseconds that it + takes for the sprite sequence to animate. For example, if the duration + is 400 and the \uicontrol {Frame count} is 8, each frame will be shown + for 50 milliseconds. When the value is -1, \uicontrol Particle > + \uicontrol {Life span} is used as the duration. + + \uicontrol {Duration variation} defines the duration variation in + milliseconds. The actual duration of the animation is between + duration minus duration variation and duration plus duration variation. + + \uicontrol {Animation direction} defines the animation playback direction + of the sequence. Select \uicontrol Normal to play the animation from the + first frame to the last frame and to jump back to the first frame from the + last one. Select \uicontrol Reverse to reverse the normal order. Select + \uicontrol Alternate or \uicontrol AlternateReverse to alternate between + normal and reversed orders. + + If you don't want to animate the frame, select \uicontrol SingleFrame. + When \uicontrol {Random start} is disabled, the frame set in + \uicontrol {Frame index} is rendered. When it is enabled, each particle + renders a random frame. + + \section1 Model Particle + + Specify properties for model particles in \uicontrol Properties > + \uicontrol {Model Particle}. + + \image studio-3d-properties-model-particle.png "Model Particle properties" + + In \uicontrol Delegate, select the \uicontrol {3D Model} component that + defines each object instantiated by the particle. + + \uicontrol {Instance table} provides you with access to the internal + instancing table of the model particle that is used to implement efficient + rendering. This table can be applied to the instancing property of models + that are not part of the particle system. + + You can use this feature also to provide an instancing table without + showing any particles. This is done by omitting the delegate. + + \section1 Model Blend Particle + + Specify properties for model blend particles in \uicontrol Properties > + \uicontrol {Model Blend Particle}. + + \image studio-3d-properties-model-blend-particle.png "Model Blend Particle properties" + + The \uicontrol {Model Blend Particle} component blends a particle effect + with a \uicontrol {3D Model} component. The provided model needs to be + triangle-based. Each triangle in the model is converted into a particle, + which are then used by the emitter. Instead of particle shader, the model + is shaded using the material specified in the model. The way the effect is + blended is determined by \uicontrol {Model blend mode}. + + The possible blend modes are: + + \list + \li \uicontrol Construct, where the model is constructed from the + particles. + \li \uicontrol Explode, where the model is converted into particles. + \li \uicontrol Transfer, where \uicontrol Construct and + \uicontrol Explode are combined to create an effect where the + model is transferred from one place to another. + \endlist + + The particles are emitted in the order they are specified in the model + unless \uicontrol {Activation node} is set or \uicontrol Random is enabled. + + In \uicontrol Delegate, select the \uicontrol {3D Model} component that + defines each object instantiated by the particle. + + \uicontrol {End node} specifies the transformation for the model at the end + of a particle effect. It defines the size, position, and rotation where the + model is constructed when you set \uicontrol {Model blend mode} to + \uicontrol Construct or \uicontrol Explode. + + \uicontrol {End time} specifies the end time of the particle in + milliseconds. The end time is used during construction and defines + duration from particle lifetime at the end where the effect is blended + with the model positions. Before the end time, the particles' positions + are defined only by the particle effect, but during the end time the + particle position is blended linearly with the model end position. + + In \uicontrol {Activation node}, select the component instance that + activates particles and overrides the regular emit routine. The activation + node can be used to control how the particles are emitted spatially when + the model is exploded or constructed from the particles. The activation + node emits a particle if the center of that particle is on the positive + half of the z-axis of the activation node. Animating the activation node + to move trough the model will cause the particles to be emitted sequentially + along the path the activation node moves. + + To emit particles in random order instead of in the order in which they are + specified in the model, select \uicontrol Random. + + \section1 Common Particle Properties + + The properties that you specify for logical particles in + \uicontrol Properties > \uicontrol Particle determine the common + appearance of all particles. + + \image studio-3d-properties-particle.png "Particle properties" + + \uicontrol {Max amount} allocates data for particles. Setting this value + instead of just growing the data based on \uicontrol {Particle Emitter} > + \uicontrol {Emit rate}, \uicontrol {Life span}, and \uicontrol {Emit Bursts} + enables you to optimize memory usage and to modify the emit rate and life + span without reallocation. + + \uicontrol Color determines the base color for particles. You can use the + \l{Picking Colors}{Color Picker} to select colors. For color variation, set + values in \uicontrol {Color variation}. The values are in RGBA order (X=red, + Y=green, Z=blue, and W=alpha), and each value should be between 0.00 + (no variation) and 1.00 (full variation). + + To apply color variation uniformly for all the color channels, enable + \uicontrol {Unified color variation}. This applies all variations with + the same random amount. + + \uicontrol {Fade in effect} and \uicontrol {Fade out effect} define the + fading effect used when the particles appear. Fading is implemented by + changing the value of opacity or scale between 0 and 1 over the time + specified in milliseconds in \uicontrol {Fade in duration} and + \uicontrol {Fade out duration}. Fading duration is calculated into the + particle lifespan. For example, if \uicontrol {Particle Emitter} > + \uicontrol {Life span} is 3000, \uicontrol {Fade in duration} is 500, and + \uicontrol {Fade out duration} is 500, the particle will be fully visible + for 2000 ms. + + \uicontrol {Align mode} determines the direction that particles face: + + \list + \li Select \uicontrol AlignNone to use the value set for the emitter + component in \uicontrol {Particle Rotation} > \uicontrol Rotation. + \li Select \uicontrol AlignTowardsTarget to align the particles towards + the direction set in \uicontrol {Align target position}. + \li Select \uicontrol AlignTowardsStartVelocity to align the particles + towards their starting velocity direction. + \endlist + + This value takes no effect if \uicontrol {Sprite Particle} > + \uicontrol Billboard is enabled. + + Unlike the materials used with the models, particles default to being + rendered with assuming semi-transparency, and so with blending enabled. + This is the desired behavior most of the time due to particle textures, + color (alpha) variations, fadings, and so on. If you don't need the + blending, disable \uicontrol {Has transparency} for possible performance + gain. + + \uicontrol {Sort mode} determines the order in which the particles are + drawn. You can sort particles based on their distance from the camera, + farthest first, or lifetime, newest or oldest first. + + The particles are emitted from the location of the \l Emitter or + \l {Trail Emitter} component instance. +*/ + +/*! + \page studio-3d-particle-emitters.html + \previouspage studio-3d-logical-particles.html + \nextpage studio-3d-particle-affectors.html + + \title Particle Emitters + + The \uicontrol {Particle Emitter} component emits logical particles into + the system. You can determine how individual particles will look like and + how they are emitted. Many of the properties have \e variation counterparts, + such as \uicontrol {Color variation}, for adding variation to the particles. + + The \uicontrol {Trail Emitter} component emits particles from the location + of other logicial particles. Any logical particle of the followed component + within the bounds of a trail emitter will cause particle emission from its + location, as if there were an emitter on it with the same properties as the + trail emitter. + + Emitter components can use instances of the \l {Particle Shape} or + \l {Model Shape} component to emit particles from the surface of the + selected shape. + + You always need one emitter. If the \uicontrol {Particle System} component + instance is the direct parent of the emitter component instance, you don't + need to specify the particle system separately. However, you always need + to select the logical particle to emit, or nothing is emitted. + + The following components are available for emitting particles: + + \list + \li \l Emitter + \li \l {Trail Emitter} + \li \l {Emit Burst} + \li \l {Model Shape} + \li \l {Particle Shape} + \endlist + + \section1 Emitter + + Specify properties for particle emitters in \uicontrol Properties > + \uicontrol {Particle Emitter}. You need at least one emitter. + + \image studio-3d-properties-particle-emitter.png "Particle Emitter properties" + + \uicontrol Emitter emits \l{Logical Particles}{logical particles} that you + select in \uicontrol Particle, as defined by the other properties. If the + \uicontrol {Particle System} component instance is not the direct parent of + the emitter component instance, you need to select it in \uicontrol System. + + You can control the amount of particles emitted per second by setting the + value of \uicontrol {Emit rate} or add \uicontrol {Emit Burst} component + instances in \uicontrol {Emit bursts} to emit bursts of specified amounts + of particles at the specified point in time for the specified duration. + + In \uicontrol Velocity, set a starting velocity for emitted particles. + If velocity is not set, particles start motionless, and velocity is + determined by \l{Particle Affectors}{particle affectors}. + + Use \uicontrol Enabled to turn an emitter on or off. Usually, this property + is used in code to conditionally turn emitters on and off. To continue + emitting bursts, set \uicontrol {Emit rate} to 0 instead of disabling + \uicontrol Enabled. + + In \uicontrol Shape, select the instance of the \l {Particle Shape} or + \l {Model Shape} component to use. The shape is scaled, positioned, and + rotated based on the emitter node properties. When the shape \uicontrol Fill + property is set to false, particles are emitted only from the surface of the + shape. When the shape is not defined, particles are emitted from the center + point of the emitter. + + In \uicontrol {Life span}, specify the lifespan of a single particle + in milliseconds. Specify variation in the particle lifespan in + \uicontrol {Life span variation}. For example, to emit particles that + will exist from three to four seconds, set \uicontrol {Life span} to + 3500 ms and \uicontrol {Life span variation} to 500 ms. + + \uicontrol {Particle scale} and \uicontrol {Particle end scale} specify the + scale multiplier of the particles at the beginning and end. For variation + in particle size, specify values for \uicontrol {Particle scale variation} + and \uicontrol {Particle end scale variation}. + + \uicontrol {Depth bias} specifies the the depth bias of the emitter. Depth + bias is added to the object's distance from camera when sorting objects. + This can be used to force the rendering order of objects that are located + close to each other if it might otherwise change between frames. Negative + values cause the sorting value to move closer to the camera while positive + values move it further from the camera. + + \section1 Trail Emitter + + Specify additional properties for particle trail emitters in + \uicontrol Properties > \uicontrol {Particle Trail Emitter}. + + Select the logical particle component to follow in \uicontrol Follow. + + \section1 Particle Rotation + + Specify properties for the rotation of particles in \uicontrol Properties > + \uicontrol {Particle Rotation} + + \image studio-3d-properties-particle-rotation.png "Particle Rotation properties" + + \uicontrol Rotation specifies the rotation of the particles in the + beginning. Rotation is defined as degrees in euler angles. For variation + in rotation, specify values for \uicontrol Variation. + + \uicontrol Velocity specifies the rotation velocity of the particles in the + beginning. Rotation velocity is defined as degrees per second in euler + angles. For variation in velocity, specify values in + \uicontrol {Velocity variation}. + + \section1 Emit Burst + + Specify properties for emit bursts in \uicontrol Properties > + \uicontrol {Emit Burst}. + + \image studio-3d-properties-particle-emit-burst.png "Particle Emit Burst properties" + + \uicontrol Time specifies the time in milliseconds when emitting the burst + starts, and \uicontrol Amount specifies the amount of particles emitted + during the time specified in milliseconds in \uicontrol Duration. + + For example, you could use two \uicontrol {Emit Burst} instances to emit 100 + particles at the beginning and 50 particles at 2 seconds, so that both + bursts take 200 milliseconds. For one instance, set \uicontrol Time to 0, + \uicontrol Amount to 100, and \uicontrol Duration to 200. For the other + instance, set \uicontrol Time to 2000, \uicontrol Amount to 50, and + \uicontrol Duration to 200. + + \section1 Particle Shape + + The \uicontrol {Particle Shape} component supports shapes, such as cube, + sphere, and cylinder, for emitting particles from their area. + + Specify properties for particle shape in \uicontrol Properties > + \uicontrol {Particle Shape}. + + \image studio-3d-properties-particle-shape.png "Particle Shape properties" + + In \uicontrol Type, select the shape to use. + + Select \uicontrol Fill to fill the shape instead of just displaying its + outline. + + \uicontrol Extents determines the extent coordinates of the shape geometry. + + \section1 Model Shape + + The \uicontrol {Model Shape} component specifies a template for defining the + model. + + Specify properties for model shape in \uicontrol Properties > + \uicontrol {Particle Model Shape}. + + \image studio-3d-properties-particle-model-shape.png "Particle Model Shape properties" + + In \uicontrol Delegate, select the \uicontrol {3D Model} component that + defines each object instantiated by the particle. + + Select \uicontrol Fill to fill the shape instead of just displaying its + outline. +*/ + +/*! + \page studio-3d-particle-affectors.html + \previouspage studio-3d-particle-emitters.html + \nextpage studio-3d-particle-directions.html + + \title Particle Affectors + + Affectors are an optional component of a particle system. They can perform + a variety of manipulations to the simulation, such as altering the + trajectory of particles or prematurely ending their life in the simulation. + For performance reasons, it is recommended not to use affectors in + high-volume particle systems. + + The following affector components control how the particles are animated + during their lifetime: + + \list + \li \l Attractor attracts particles towards a specific point. + \li \l Gravity accelerates particles to a vector of the specified + magnitude in the specified direction. + \li \l {Point Rotator} rotates particles around a pivot point. + \li \l Wander applies random wave curves to particles. + \endlist + + If the system has multiple affectors, the order of affectors may result in + different outcome, as affectors are applied one after another. + + By default, affectors affect all particles in the system, but you can limit + this to the particles listed in \l Properties > \l {Particle Affector} > + \uicontrol Particles. + + \section1 Attractor + + The \uicontrol Attractor component attracts particles towards a position + inside the \l{3D Views}{View 3D} component instance. To model the gravity + of a massive object whose center of gravity is far away, use an instance of + the \l Gravity component. + + The attraction position is defined either by using the position of the + attractor and the value of \uicontrol {Position variation} or by selecting + an instance of the \uicontrol {Particle Shape} or \uicontrol {Model Shape} + component in \uicontrol Shape. If both position and shape are defined, the + shape is used. + + Specify settings for \uicontrol Attractor components in + \uicontrol Properties > \uicontrol {Particle Attractor}. + + \image studio-3d-properties-particle-attractor.png "Particle Attractor properties" + + \uicontrol {Position variation} specifies the variation on attract position. + Instead of attracting particles into a single point, it attracts them + randomly towards a wider area. For example, to attract particles into some + random point inside a (50, 50, 50) cube at position (100, 0, 0) within 2 to + 4 seconds, set \uicontrol X, \uicontrol Y, and \uicontrol Z to 50.00, + \uicontrol Duration to 3000, and \uicontrol {Duration variation} to 1000. + + In \uicontrol Shape, select an instance of the \l {Particle Shape} or + \l {Model Shape} component to attract particles into a random position + inside the shape. + + \uicontrol Duration specifies the duration in milliseconds that it takes + for particles to reach the attraction position. When the value is -1, + \uicontrol {Particle Emitter} > \uicontrol {Life span} is used as + the duration. If you specify \uicontrol {Duration variation}, the actual + duration to reach the attractor is between duration minus duration variation + and duration plus duration variation. + + Select \uicontrol {Hide at end} to make the particle disappear when it + reaches the attractor. + + Select \uicontrol {Use cached positions} to cache possible positions within + the attractor's \uicontrol Shape. Cached positions give less random results + but are better for performance. + + \uicontrol {Positions amount} specifies the amount of possible positions + stored within the attractor's \uicontrol Shape. By default, the amount + equals the particle count, but you can specify a lower amount for a smaller + cache. Specify a higher amount for additional randomization. + + \section1 Gravity + + The \uicontrol Gravity component models the gravity of a massive object + whose center of gravity is far away, and thus the gravitational pull is + effectively constant across the scene. To model the gravity of an object + near or inside the scene, use an \l Attractor component instance. + + Specify settings for \uicontrol Gravity component instances in + \uicontrol Properties > \uicontrol {Particle Gravity}. + + \image studio-3d-properties-particle-gravity.png "Particle Gravity properties" + + \uicontrol Magnitude defines the magnitude in particle position change in + degrees per second. A negative value accelerates in the opposite way from + the direction specified in \uicontrol Direction. Direction \uicontrol X, + \uicontrol Y, and \uicontrol Z values are automatically normalized to a unit + vector. + + \section1 Point Rotator + + Specify settings for \uicontrol {Point Rotator} component instances in + \uicontrol Properties > \uicontrol {Point Rotator}. + + \image studio-3d-properties-particle-point-rotator.png "Particle Point Rotator properties" + + The \uicontrol {Point Rotator} component rotates particles around the + pivot point specified in \uicontrol {Pivot point} towards the direction + specified in \uicontrol Direction. Direction \uicontrol X, \uicontrol Y, and + \uicontrol Z values are automatically normalized to a unit vector. + + \uicontrol Magnitude defines the magnitude in particle position change in + degrees per second. A negative value accelerates in the opposite way from + the direction specified in \uicontrol Direction. + + \section1 Wander + + The \uicontrol Wander component applies random wave curves to particles. + Curves can combine \l {Global Wander Properties}{global} values that are + the same for all particles and \l{Unique Wander Properties}{unique} values + that differ randomly. + + Specify settings for \uicontrol Wander component instances in + \uicontrol Properties > \uicontrol {Particle Wander}. + + \image studio-3d-properties-particle-wander.png "Particle Wander properties" + + \uicontrol {Fade in duration} specifies the duration in milliseconds for + fading in the affector. After this duration, the wandering will be in full + effect. Setting this value can be useful to emit from a specific position or + shape, otherwise wander will affect the position also at the beginning. + + \uicontrol {Fade out duration} specifies the duration in milliseconds for + fading out the affector. Setting this value can be useful to reduce the + wander when the particle life time ends, for example when combined with an + instance of the \l Attractor component so that the end positions will match + the shape. + + \section2 Global Wander Properties + + Specify global settings for \uicontrol Wander component instances in + \uicontrol Properties > \uicontrol {Global}. + + \image studio-3d-properties-particle-wander-global.png "Global Particle Wander properties" + + \uicontrol Amount specifies the distance that each particle moves + at the ends of curves. For example, if you set the value of \uicontrol X to + 100.00, \uicontrol Y to 10.00, and \uicontrol Z to 0.00, all particles + wander between (100, 10, 0) and (-100, -10, 0). + + \uicontrol Pace defines the frequency at which each particle wanders in + curves per second, starting from \uicontrol {Pace start}. The meaningful + range for pace start is between 0 .. 2 * PI. + + \section2 Unique Wander Properties + + Specify unique settings for the \uicontrol Wander component instances in + \uicontrol Properties > \uicontrol {Unique}. + + \image studio-3d-properties-particle-wander-unique.png "Unique Particle Wander properties" + + \uicontrol Amount specifies the distance that each particle moves + at the ends of curves. Specify amount variation for each particle between + 0.00 and 1.00 in \uicontrol {Amount variation}. When the amount variation is + 0.00, all particles reach the maximum amount. When it is 0.50, every + particle reaches between 0.50 and 1.50 of the amount. For example, if you + set \uicontrol Amount \uicontrol X to 100.00, \uicontrol Y to 50.00, and + \uicontrol Z to 20.00) and \uicontrol {Amount variation} to 0.10, the + particles' maximum wave distances are something random between (110, 55, 22) + and (90, 45, 18). + + \uicontrol Pace defines the frequency at which each particle wanders in + curves per second. Specify unique pace variation for each particle between + 0.00 and 1.00 in \uicontrol {Pace variation}. When the variation is 0.00, + all particles wander at the same frequency. For example, if you set + \uicontrol Pace \uicontrol X to 1.00, \uicontrol Y to 2.00, and \uicontrol Z + to 4.00 and \uicontrol {Pace variation} to 0.50, the particles' wave paces + are something random between (2.00, 4.00, 8.00) and (0.50, 1.00, 2.00). + + \section1 Particle Affector + + Specify common settings for particle affectors in \uicontrol Properties > + \l {Particle Affector}. + + \image studio-3d-properties-particle-affector.png "Affector properties" + + If the affector is not a direct child component of the particle system, + select the \uicontrol {Particle System} component instance to affect in + \uicontrol System. + + To only affect some of the particles in the particle system, select + them in \uicontrol Particles. Select \inlineimage plus.png + to add logical particles to the list. + + Deselect \uicontrol Enabled to turn the affector off. Usually, this + property is used in code to conditionally turn affectors off and on. +*/ + +/*! + \page studio-3d-particle-directions.html + \previouspage studio-3d-particle-affectors.html + \nextpage quick-component-instances.html + + \title Particle Directions + + Directions can be specified by specifying the emitted particle velocity + towards either the target position or the target vector. + + \section1 Target Direction + + The \uicontrol {Target Direction} component sets emitted particle velocity + towards the target position. + + Specify common settings for particle target direction in + \uicontrol Properties > \uicontrol {Particle Target Direction}. + + \image studio-3d-properties-particle-target-direction.png "Particle Target Direction properties" + + \uicontrol Position specifies the position of the target of + the particle. For variation in the target position, specify + \uicontrol {Position variation}. + + \uicontrol Normalized determines whether the distance to the position + affects the magnitude of the particle's velocity. Enable + \uicontrol Normalize to derive the velocity amount only from + \uicontrol Magnitude and \uicontrol {Magnitude variation}. + + \uicontrol Magnitude specifies the magnitude in \uicontrol Position change + per second. A negative value accelerates the in the opposite direction + from the position. When \uicontrol Normalized is disabled, this value is + multiplied with the distance to the target position. For variation in the + magnitude, specify \uicontrol {Magnitude variation}. + + For example, to emit particles towards the target position (100, 0, 0) with + random magnitude between 10..20, set \uicontrol Magnitude to 15.00 and + \uicontrol {Magnitude variation} to 5.00. Further, enable + \uicontrol Normalized. + + \section1 Vector Direction + + The \uicontrol {Vector Direction} component sets emitted particle velocity + towards the target vector. The length of the direction vector is used as + the velocity magnitude. + + Specify common settings for particle vector direction in + \uicontrol Properties > \uicontrol {Particle Vector Direction}. + + \image studio-3d-properties-particle-vector-direction.png "Vector Direction properties" + + \uicontrol Direction specifies the direction of the target of the particle. + A positive \uicontrol Y value means \e up, while a negative value means + \e down. A negative \uicontrol Z value causes the particles to move in the + direction opposite to the target vector. + + For variation in the target direction, specify + \uicontrol {Direction variation}. Enable \uicontrol Normalized to + normalize direction after applying the variation. When it is disabled, + variation affects the magnitude of the particles' velocity. When + it is enabled, variation affects the direction, but the magnitude is + determined by the original direction length. +*/ From 89d0239cd875b429817557abcae2a16221317aef Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 4 Oct 2021 18:40:57 +0200 Subject: [PATCH 18/67] CMakePM: Do not treat generated source files as project source files Also mark the CMake configured generated precompile header files as generated, so that the "Hide Generated Files" filter menu entry would take them into account. Fixes: QTCREATORBUG-25125 Change-Id: I0ec1cc923e361ae9b599eef1a039695e749a033a Reviewed-by: Eike Ziller --- .../fileapidataextractor.cpp | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index d893370028e..f800765ae9e 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -322,8 +322,14 @@ static QStringList splitFragments(const QStringList &fragments) return result; } +bool isPchFile(const FilePath &buildDirectory, const FilePath &path) +{ + return path.isChildOf(buildDirectory) && path.fileName().startsWith("cmake_pch"); +} + RawProjectParts generateRawProjectParts(const PreprocessedData &input, - const FilePath &sourceDirectory) + const FilePath &sourceDirectory, + const FilePath &buildDirectory) { RawProjectParts rpps; @@ -331,8 +337,12 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input, for (const TargetDetails &t : input.targetDetails) { QDir sourceDir(sourceDirectory.toString()); + // Do not tread generated files and CMake precompiled headers as project files + const auto sourceFiles = Utils::filtered(t.sources, [buildDirectory](const SourceInfo &si) { + return !si.isGenerated && !isPchFile(buildDirectory, FilePath::fromString(si.path)); + }); CppEditor::ProjectFileCategorizer - categorizer({}, transform(t.sources, [&sourceDir](const SourceInfo &si) { + categorizer({}, transform(sourceFiles, [&sourceDir](const SourceInfo &si) { return sourceDir.absoluteFilePath(si.path); })); @@ -531,6 +541,11 @@ void addCompileGroups(ProjectNode *targetRoot, auto node = std::make_unique(sourcePath, Node::fileTypeForFileName(sourcePath)); node->setIsGenerated(si.isGenerated); + // CMake pch files are generated at configured time, but not marked as generated + // so that a "clean" step won't remove them and at a subsequent build they won't exist. + if (isPchFile(buildDirectory, sourcePath)) + node->setIsGenerated(true); + // Where does the file node need to go? if (sourcePath.isChildOf(buildDirectory) && !inSourceBuild) { buildFileNodes.emplace_back(std::move(node)); @@ -705,7 +720,7 @@ FileApiQtcData extractData(FileApiData &input, result.buildTargets = generateBuildTargets(data, sourceDirectory, buildDirectory, haveLibrariesRelativeToBuildDirectory); result.cmakeFiles = std::move(data.cmakeFiles); - result.projectParts = generateRawProjectParts(data, sourceDirectory); + result.projectParts = generateRawProjectParts(data, sourceDirectory, buildDirectory); auto rootProjectNode = generateRootProjectNode(data, sourceDirectory, buildDirectory); ProjectTree::applyTreeManager(rootProjectNode.get()); // QRC nodes From 6c3310f450910848cf328b041757d5eaab157e99 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 5 Oct 2021 16:22:08 +0300 Subject: [PATCH 19/67] QmlDesigner: Fix implicit component clearing logic The logic didn't account for custom parser nodes, which were incorrectly detected as former implicit components needing clearing. Fixes: QDS-5223 Change-Id: I026d5530082de9c6f23b3b0f2b28df2d08c9ac03 Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index ef878f13c53..c678f3b06d7 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1191,11 +1191,11 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (isComponentType(typeName) || isImplicitComponent) setupComponentDelayed(modelNode, differenceHandler.isAmender()); + else if (isCustomParserType(typeName)) + setupCustomParserNodeDelayed(modelNode, differenceHandler.isAmender()); else if (!modelNode.nodeSource().isEmpty() || modelNode.nodeSourceType() != ModelNode::NodeWithoutSource) clearImplicitComponentDelayed(modelNode, differenceHandler.isAmender()); - if (isCustomParserType(typeName)) - setupCustomParserNodeDelayed(modelNode, differenceHandler.isAmender()); context->enterScope(astNode); From ec74c36a8c14862b3e11afbb1a689e9ee5b2808d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 5 Oct 2021 18:14:31 +0200 Subject: [PATCH 20/67] QmlDesigner: Fix foreach Change-Id: Iccad64883b166d8f8ece4422b504064e5bb1651c Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 556a7624ba9..c5ad9244a25 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -328,11 +328,11 @@ QmlPropertyChanges QmlObjectNode::propertyChangeForCurrentState() const static void removeStateOperationsForChildren(const QmlObjectNode &node) { if (node.isValid()) { - foreach (QmlModelStateOperation stateOperation, node.allAffectingStatesOperations()) { + for (QmlModelStateOperation stateOperation : node.allAffectingStatesOperations()) { stateOperation.modelNode().destroy(); //remove of belonging StatesOperations } - foreach (const QmlObjectNode &childNode, node.modelNode().directSubModelNodes()) { + for (const QmlObjectNode &childNode : node.modelNode().directSubModelNodes()) { removeStateOperationsForChildren(childNode); } } From 8b263b4ae504f82ae2c517c908796bbed06240b3 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Tue, 28 Sep 2021 10:26:34 +0200 Subject: [PATCH 21/67] ClangFormat: Rework clangformatconfigwidget - Move logic work with clang-format file to additional class to make clangformatconfigwidget responsible only for work with ui elements. - Fix functionality: when new BasedOnStyle was chosen all fields were empty or set in default, now it fills with the corresponding value. Change-Id: I2ee42a502e87da761274d293a7f0a38fda98804d Reviewed-by: Christian Kandeler --- src/plugins/clangformat/CMakeLists.txt | 1 + src/plugins/clangformat/clangformat.pro | 2 + src/plugins/clangformat/clangformat.qbs | 2 + .../clangformat/clangformatconfigwidget.cpp | 94 +++++--------- .../clangformat/clangformatconfigwidget.h | 6 +- src/plugins/clangformat/clangformatfile.cpp | 116 ++++++++++++++++++ src/plugins/clangformat/clangformatfile.h | 60 +++++++++ 7 files changed, 217 insertions(+), 64 deletions(-) create mode 100644 src/plugins/clangformat/clangformatfile.cpp create mode 100644 src/plugins/clangformat/clangformatfile.h diff --git a/src/plugins/clangformat/CMakeLists.txt b/src/plugins/clangformat/CMakeLists.txt index eb6e0687e6b..5db5f8111a7 100644 --- a/src/plugins/clangformat/CMakeLists.txt +++ b/src/plugins/clangformat/CMakeLists.txt @@ -8,6 +8,7 @@ add_qtc_plugin(ClangFormat clangformatchecks.ui clangformatconfigwidget.cpp clangformatconfigwidget.h clangformatconfigwidget.ui clangformatconstants.h + clangformatfile.cpp clangformatfile.h clangformatindenter.cpp clangformatindenter.h clangformatplugin.cpp clangformatplugin.h clangformatsettings.cpp clangformatsettings.h diff --git a/src/plugins/clangformat/clangformat.pro b/src/plugins/clangformat/clangformat.pro index 4d751db2ba4..da7645613cf 100644 --- a/src/plugins/clangformat/clangformat.pro +++ b/src/plugins/clangformat/clangformat.pro @@ -15,6 +15,7 @@ unix:!macos:QMAKE_LFLAGS += -Wl,--exclude-libs,ALL SOURCES += \ clangformatconfigwidget.cpp \ + clangformatfile.cpp \ clangformatindenter.cpp \ clangformatplugin.cpp \ clangformatsettings.cpp \ @@ -22,6 +23,7 @@ SOURCES += \ HEADERS += \ clangformatconfigwidget.h \ + clangformatfile.h \ clangformatindenter.h \ clangformatplugin.h \ clangformatsettings.h \ diff --git a/src/plugins/clangformat/clangformat.qbs b/src/plugins/clangformat/clangformat.qbs index ef8ae447817..fcd77b7c1b4 100644 --- a/src/plugins/clangformat/clangformat.qbs +++ b/src/plugins/clangformat/clangformat.qbs @@ -33,6 +33,8 @@ QtcPlugin { "clangformatconfigwidget.h", "clangformatconfigwidget.ui", "clangformatconstants.h", + "clangformatfile.cpp", + "clangformatfile.h", "clangformatindenter.cpp", "clangformatindenter.h", "clangformatplugin.cpp", diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index f0cc5d9700f..2749b1cf11d 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -27,6 +27,7 @@ #include "clangformatconstants.h" #include "clangformatindenter.h" +#include "clangformatfile.h" #include "clangformatsettings.h" #include "clangformatutils.h" #include "ui_clangformatchecks.h" @@ -121,6 +122,12 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(ProjectExplorer::Project *proje { m_ui->setupUi(this); + Utils::FilePath filePath = Core::ICore::userResourcePath(); + if (m_project) + filePath = filePath / "clang-format/" / currentProjectUniqueId(); + filePath = filePath / QLatin1String(Constants::SETTINGS_FILE_NAME); + m_config = std::make_unique(filePath); + initChecksAndPreview(); if (m_project) { @@ -147,6 +154,8 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(ProjectExplorer::Project *proje connectChecks(); } +ClangFormatConfigWidget::~ClangFormatConfigWidget() = default; + void ClangFormatConfigWidget::initChecksAndPreview() { m_checksScrollArea = new QScrollArea(); @@ -191,7 +200,7 @@ void ClangFormatConfigWidget::connectChecks() continue; } - auto button = qobject_cast(child); + const auto button = qobject_cast(child); if (button != nullptr) connect(button, &QPushButton::clicked, this, &ClangFormatConfigWidget::onTableChanged); } @@ -202,15 +211,7 @@ void ClangFormatConfigWidget::onTableChanged() if (m_disableTableUpdate) return; - const std::string newConfig = tableToString(sender()); - if (newConfig.empty()) - return; - const std::string oldConfig = m_project ? currentProjectConfigText() - : currentGlobalConfigText(); - saveConfig(newConfig); - fillTable(); - updatePreview(); - saveConfig(oldConfig); + saveChanges(sender()); } void ClangFormatConfigWidget::hideGlobalCheckboxes() @@ -379,16 +380,20 @@ void ClangFormatConfigWidget::fillTable() } } -std::string ClangFormatConfigWidget::tableToString(QObject *sender) +void ClangFormatConfigWidget::saveChanges(QObject *sender) { std::stringstream content; content << "---"; if (sender->objectName() == "BasedOnStyle") { - auto *basedOnStyle = m_checksWidget->findChild("BasedOnStyle"); - content << "\nBasedOnStyle: " << basedOnStyle->currentText().toStdString() << '\n'; + const auto *basedOnStyle = m_checksWidget->findChild("BasedOnStyle"); + m_config->setBasedOnStyle(basedOnStyle->currentText()); } else { + QList fields; + for (QObject *child : m_checksWidget->children()) { + if (child->objectName() == "BasedOnStyle") + continue; auto *label = qobject_cast(child); if (!label) continue; @@ -396,7 +401,7 @@ std::string ClangFormatConfigWidget::tableToString(QObject *sender) QWidget *valueWidget = m_checksWidget->findChild(label->text().trimmed()); if (!valueWidget) { // Currently BraceWrapping only. - content << '\n' << label->text().toStdString() << ":"; + fields.append({label->text(), ""}); continue; } @@ -410,46 +415,34 @@ std::string ClangFormatConfigWidget::tableToString(QObject *sender) if (plainText->toPlainText().trimmed().isEmpty()) continue; - content << '\n' << label->text().toStdString() << ":"; + + std::stringstream content; QStringList list = plainText->toPlainText().split('\n'); for (const QString &line : list) content << "\n " << line.toStdString(); + + fields.append({label->text(), QString::fromStdString(content.str())}); } else { - auto *comboBox = qobject_cast(valueWidget); - std::string text; - if (comboBox) { - text = comboBox->currentText().toStdString(); + QString text; + if (auto *comboBox = qobject_cast(valueWidget)) { + text = comboBox->currentText(); } else { auto *lineEdit = qobject_cast(valueWidget); QTC_ASSERT(lineEdit, continue;); - text = lineEdit->text().toStdString(); + text = lineEdit->text(); } - if (!text.empty() && text != "Default") - content << '\n' << label->text().toStdString() << ": " << text; + if (!text.isEmpty() && text != "Default") + fields.append({label->text(), text}); } } - content << '\n'; + m_config->changeFields(fields); } - std::string text = content.str(); - clang::format::FormatStyle style; - style.Language = clang::format::FormatStyle::LK_Cpp; - const std::error_code error = clang::format::parseConfiguration(text, &style); - if (error.value() != static_cast(clang::format::ParseError::Success)) { - QMessageBox::warning(this, - tr("Error in ClangFormat configuration"), - QString::fromStdString(error.message())); - fillTable(); - updatePreview(); - return std::string(); - } - - return text; + fillTable(); + updatePreview(); } -ClangFormatConfigWidget::~ClangFormatConfigWidget() = default; - void ClangFormatConfigWidget::apply() { ClangFormatSettings &settings = ClangFormatSettings::instance(); @@ -466,28 +459,7 @@ void ClangFormatConfigWidget::apply() if (!m_checksWidget->isVisible()) return; - const std::string config = tableToString(this); - if (config.empty()) - return; - - saveConfig(config); - fillTable(); - updatePreview(); -} - -void ClangFormatConfigWidget::saveConfig(const std::string &text) const -{ - QString filePath = Core::ICore::userResourcePath().toString(); - if (m_project) - filePath += "/clang-format/" + currentProjectUniqueId(); - filePath += "/" + QLatin1String(Constants::SETTINGS_FILE_NAME); - - QFile file(filePath); - if (!file.open(QFile::WriteOnly)) - return; - - file.write(text.c_str()); - file.close(); + saveChanges(this); } } // namespace ClangFormat diff --git a/src/plugins/clangformat/clangformatconfigwidget.h b/src/plugins/clangformat/clangformatconfigwidget.h index 869ddeccb78..4c261f99924 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.h +++ b/src/plugins/clangformat/clangformatconfigwidget.h @@ -44,6 +44,7 @@ namespace Ui { class ClangFormatConfigWidget; class ClangFormatChecksWidget; } +class ClangFormatFile; class ClangFormatConfigWidget : public TextEditor::CodeStyleEditorWidget { @@ -66,18 +67,17 @@ private: void connectChecks(); void fillTable(); - std::string tableToString(QObject *sender); + void saveChanges(QObject *sender); void hideGlobalCheckboxes(); void showGlobalCheckboxes(); - - void saveConfig(const std::string &text) const; void updatePreview(); ProjectExplorer::Project *m_project; QWidget *m_checksWidget; QScrollArea *m_checksScrollArea; TextEditor::SnippetEditorWidget *m_preview; + std::unique_ptr m_config; std::unique_ptr m_checks; std::unique_ptr m_ui; bool m_disableTableUpdate = false; diff --git a/src/plugins/clangformat/clangformatfile.cpp b/src/plugins/clangformat/clangformatfile.cpp new file mode 100644 index 00000000000..31f096ed6ff --- /dev/null +++ b/src/plugins/clangformat/clangformatfile.cpp @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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 "clangformatfile.h" +#include + +using namespace ClangFormat; + +ClangFormatFile::ClangFormatFile(Utils::FilePath filePath) + : m_filePath(filePath) +{ + if (!m_filePath.exists()) { + resetStyleToLLVM(); + return; + } + + const std::error_code error + = clang::format::parseConfiguration(m_filePath.fileContents().toStdString(), &m_style); + if (error.value() != static_cast(clang::format::ParseError::Success)) { + resetStyleToLLVM(); + } +} + +clang::format::FormatStyle ClangFormatFile::format() { + return m_style; +} + +Utils::FilePath ClangFormatFile::filePath() +{ + return m_filePath; +} + +void ClangFormatFile::setStyle(clang::format::FormatStyle style) +{ + m_style = style; + saveNewFormat(); +} + +void ClangFormatFile::resetStyleToLLVM() +{ + m_style = clang::format::getLLVMStyle(); + saveNewFormat(); +} + +void ClangFormatFile::setBasedOnStyle(QString styleName) +{ + changeField({"BasedOnStyle", styleName}); + saveNewFormat(); +} + +QString ClangFormatFile::setStyle(QString style) +{ + m_style.Language = clang::format::FormatStyle::LK_Cpp; + const std::error_code error = clang::format::parseConfiguration(style.toStdString(), &m_style); + if (error.value() != static_cast(clang::format::ParseError::Success)) { + return QString::fromStdString(error.message()); + } + + saveNewFormat(style.toUtf8()); + return ""; +} + +QString ClangFormatFile::changeField(Field field) +{ + return changeFields({field}); +} + +QString ClangFormatFile::changeFields(QList fields) +{ + std::stringstream content; + content << "---" << "\n"; + + for (const auto &field : fields) { + content << field.first.toStdString() << ": " << field.second.toStdString() << "\n"; + } + + return setStyle(QString::fromStdString(content.str())); +} + +void ClangFormatFile::saveNewFormat() +{ + std::string style = clang::format::configurationAsText(m_style); + + // workaround: configurationAsText() add comment "# " before BasedOnStyle line + const int pos = style.find("# BasedOnStyle"); + if (pos < style.size()) + style.erase(pos, 2); + m_filePath.writeFileContents(QByteArray::fromStdString(style)); +} + +void ClangFormatFile::saveNewFormat(QByteArray style) +{ + m_filePath.writeFileContents(style); +} diff --git a/src/plugins/clangformat/clangformatfile.h b/src/plugins/clangformat/clangformatfile.h new file mode 100644 index 00000000000..3fe9010f44e --- /dev/null +++ b/src/plugins/clangformat/clangformatfile.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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. +** +****************************************************************************/ + +#pragma once + +#include "utils/filepath.h" +#include + +namespace ClangFormat { + +class ClangFormatFile +{ +public: + explicit ClangFormatFile(Utils::FilePath file); + clang::format::FormatStyle format(); + + Utils::FilePath filePath(); + void resetStyleToLLVM(); + void setBasedOnStyle(QString styleName); + void setStyle(clang::format::FormatStyle style); + QString setStyle(QString style); + void clearBasedOnStyle(); + + using Field = std::pair; + QString changeFields(QList fields); + QString changeField(Field field); + +private: + void saveNewFormat(); + void saveNewFormat(QByteArray style); + +private: + Utils::FilePath m_filePath; + clang::format::FormatStyle m_style; +}; + + +} // namespace ClangFormat From b7815a418733b2f191a07837a17cca472b8d90af Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 4 Oct 2021 09:42:32 +0200 Subject: [PATCH 22/67] Docker: Use shell if possible Using the shell for short running processes that do not modify the container environment is recommended as it avoids starting up another process. Change-Id: I32a1f348bfa56ee4094599cff1af17525a6d2a98 Reviewed-by: hjk Reviewed-by: David Schulz --- src/plugins/docker/dockerdevice.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 624f3eab49b..bc732796a49 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1288,12 +1288,8 @@ QDateTime DockerDevice::lastModified(const FilePath &filePath) const return res; } - QtcProcess proc; - proc.setCommand({"stat", {"-c", "%Y", filePath.path()}}); - runProcess(proc); - proc.waitForFinished(); - - const qint64 secs = proc.rawStdOut().toLongLong(); + const QString output = d->outputForRunInShell({"stat", {"-c", "%Y", filePath.path()}}); + qint64 secs = output.toLongLong(); const QDateTime dt = QDateTime::fromSecsSinceEpoch(secs, Qt::UTC); return dt; } @@ -1615,6 +1611,12 @@ void DockerDevice::aboutToBeRemoved() const void DockerDevicePrivate::fetchSystemEnviroment() { + if (m_shell) { + const QString remoteOutput = outputForRunInShell({"env", {}}); + m_cachedEnviroment = Environment(remoteOutput.split('\n', Qt::SkipEmptyParts), q->osType()); + return; + } + QtcProcess proc; proc.setCommand({"env", {}}); From 91117a1c3652f13f76a11ef69a52f9c0aa7a0004 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Sun, 5 Sep 2021 18:49:26 +0300 Subject: [PATCH 23/67] Android: Clean up for extraData constants clean, rename and delete unused constants, we well as unify the usage between qmake, cmake, and qbs. Change-Id: I8827ac2f2f7660e337694fef17f744e727bd776a Reviewed-by: Alessandro Portale Reviewed-by: Qt CI Bot --- src/plugins/android/androidbuildapkstep.cpp | 3 ++- src/plugins/android/androidconfigurations.cpp | 11 ++++----- src/plugins/android/androidconstants.h | 19 +++++++-------- src/plugins/android/androiddeployqtstep.cpp | 6 ++--- src/plugins/android/androidmanager.cpp | 2 +- .../androidpackageinstallationstep.cpp | 2 +- src/plugins/android/androidpotentialkit.cpp | 2 +- src/plugins/android/androidqtversion.cpp | 4 ++-- .../android/androidrunconfiguration.cpp | 6 ++--- src/plugins/android/androidrunnerworker.cpp | 2 +- .../cmakebuildconfiguration.cpp | 2 +- .../cmakeprojectmanager/cmakeprojectnodes.cpp | 23 +++++++++++++------ src/plugins/qbsprojectmanager/qbsnodes.cpp | 2 +- .../profilecompletionassist.cpp | 13 ++++++----- .../qmakebuildconfiguration.cpp | 2 +- .../qmakeprojectmanager/qmakenodes.cpp | 17 +++++++------- .../qmakeprojectmanager/qmakeparsernodes.cpp | 6 ++--- .../qmakeprojectmanager/qmakeparsernodes.h | 6 ++--- src/plugins/qmakeprojectmanager/qmakestep.cpp | 5 ++-- 19 files changed, 72 insertions(+), 61 deletions(-) diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 4c47418c851..9e938db11b1 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -939,7 +939,8 @@ QVariant AndroidBuildApkStep::data(Utils::Id id) const } if (id == Constants::SdkLocation) return QVariant::fromValue(AndroidConfigurations::currentConfig().sdkLocation()); - if (id == Constants::AndroidABIs) + + if (id == Constants::AndroidMkSpecAbis) return AndroidManager::applicationAbis(target()); return AbstractProcessStep::data(id); diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index f1eb6379d6b..20281f71d02 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1127,10 +1127,9 @@ void AndroidConfigurations::removeOldToolChains() void AndroidConfigurations::removeUnusedDebuggers() { - const QList qtVersions - = QtVersionManager::versions([](const BaseQtVersion *v) { - return v->type() == Constants::ANDROIDQT; - }); + const QList qtVersions = QtVersionManager::versions([](const BaseQtVersion *v) { + return v->type() == Constants::ANDROID_QT_TYPE; + }); QVector uniqueNdks; for (const BaseQtVersion *qt : qtVersions) { @@ -1267,8 +1266,8 @@ void AndroidConfigurations::updateAutomaticKitList() removeUnusedDebuggers(); QHash > qtVersionsForArch; - const QList qtVersions = QtVersionManager::versions([](const BaseQtVersion *v) { - return v->type() == Constants::ANDROIDQT; + const QList qtVersions = QtVersionManager::versions([](const BaseQtVersion *v) { + return v->type() == Constants::ANDROID_QT_TYPE; }); for (const BaseQtVersion *qtVersion : qtVersions) { const Abis qtAbis = qtVersion->qtAbis(); diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h index df8c821f989..02bb50b348e 100644 --- a/src/plugins/android/androidconstants.h +++ b/src/plugins/android/androidconstants.h @@ -42,9 +42,9 @@ namespace Internal { namespace Constants { const char ANDROID_SETTINGS_ID[] = "BB.Android Configurations"; const char ANDROID_TOOLCHAIN_TYPEID[] = "Qt4ProjectManager.ToolChain.Android"; -const char ANDROIDQT[] = "Qt4ProjectManager.QtVersion.Android"; +const char ANDROID_QT_TYPE[] = "Qt4ProjectManager.QtVersion.Android"; -const char ANDROID_AMSTARTARGS[] = "Android.AmStartArgs"; +const char ANDROID_AM_START_ARGS[] = "Android.AmStartArgs"; // Note: Can be set on RunConfiguration using an aspect and/or // the AndroidRunnerWorker using recordData() const char ANDROID_PRESTARTSHELLCMDLIST[] = "Android.PreStartShellCmdList"; @@ -67,32 +67,33 @@ const char ANDROID_ARCHITECTURE[] = "Android.Architecture"; const char ANDROID_PACKAGE_SOURCE_DIR[] = "ANDROID_PACKAGE_SOURCE_DIR"; const char ANDROID_EXTRA_LIBS[] = "ANDROID_EXTRA_LIBS"; const char ANDROID_ABI[] = "ANDROID_ABI"; +const char ANDROID_TARGET_ARCH[] = "ANDROID_TARGET_ARCH"; const char ANDROID_ABIS[] = "ANDROID_ABIS"; const char ANDROID_APPLICATION_ARGUMENTS[] = "ANDROID_APPLICATION_ARGUMENTS"; -const char QT_ANDROID_APPLICATION_ARGUMENTS[] = "QT_ANDROID_APPLICATION_ARGUMENTS"; const char ANDROID_DEPLOYMENT_SETTINGS_FILE[] = "ANDROID_DEPLOYMENT_SETTINGS_FILE"; const char ANDROID_SO_LIBS_PATHS[] = "ANDROID_SO_LIBS_PATHS"; -const char ANDROID_PACKAGENAME[] = "Android.PackageName"; -const char ANDROID_PACKAGE_INSTALLATION_STEP_ID[] - = "Qt4ProjectManager.AndroidPackageInstallationStep"; +const char ANDROID_PACKAGE_INSTALL_STEP_ID[] = "Qt4ProjectManager.AndroidPackageInstallationStep"; const char ANDROID_BUILD_APK_ID[] = "QmakeProjectManager.AndroidBuildApkStep"; const char ANDROID_DEPLOY_QT_ID[] = "Qt4ProjectManager.AndroidDeployQtStep"; const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; // QString const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; // QString const char AndroidExtraLibs[] = "AndroidExtraLibs"; // QStringList -// REMOVE ME -const char AndroidArch[] = "AndroidArch"; // QString +const char AndroidAbi[] = "AndroidAbi"; // QString +const char AndroidAbis[] = "AndroidAbis"; // QStringList +const char AndroidMkSpecAbis[] = "AndroidMkSpecAbis"; // QStringList const char AndroidSoLibPath[] = "AndroidSoLibPath"; // QStringList const char AndroidTargets[] = "AndroidTargets"; // QStringList +const char AndroidApplicationArgs[] = "AndroidApplicationArgs"; // QString + +// For qbs support const char AndroidApk[] = "Android.APK"; // QStringList const char AndroidManifest[] = "Android.Manifest"; // QStringList const char AndroidNdkPlatform[] = "AndroidNdkPlatform"; //QString const char NdkLocation[] = "NdkLocation"; // FileName const char SdkLocation[] = "SdkLocation"; // FileName -const char AndroidABIs[] = "AndroidABIs"; // QString // Android Device const Utils::Id AndroidSerialNumber = "AndroidSerialNumber"; diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index 12d3b3e6510..8c50c7a52c2 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -149,14 +149,14 @@ bool AndroidDeployQtStep::init() info = androidDeployQtStep->m_deviceInfo; const BuildSystem *bs = buildSystem(); - auto selectedAbis = bs->property(Constants::ANDROID_ABIS).toStringList(); + auto selectedAbis = bs->property(Constants::AndroidAbis).toStringList(); const QString buildKey = target()->activeBuildKey(); if (selectedAbis.isEmpty()) - selectedAbis = bs->extraData(buildKey, Constants::ANDROID_ABIS).toStringList(); + selectedAbis = bs->extraData(buildKey, Constants::AndroidAbis).toStringList(); if (selectedAbis.isEmpty()) - selectedAbis.append(bs->extraData(buildKey, Constants::AndroidArch).toString()); + selectedAbis.append(bs->extraData(buildKey, Constants::AndroidAbi).toString()); if (!info.isValid()) { const IDevice *dev = DeviceKitAspect::device(kit()).data(); diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 7d2a568303f..e8944fba17f 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -408,7 +408,7 @@ QString AndroidManager::apkDevicePreferredAbi(const Target *target) auto libsPath = androidBuildDirectory(target).pathAppended("libs"); if (!libsPath.exists()) { if (const ProjectNode *node = currentProjectNode(target)) - return preferredAbi(node->data(Android::Constants::ANDROID_ABIS).toStringList(), + return preferredAbi(node->data(Android::Constants::AndroidAbis).toStringList(), target); } QStringList apkAbis; diff --git a/src/plugins/android/androidpackageinstallationstep.cpp b/src/plugins/android/androidpackageinstallationstep.cpp index cc951859ea9..e1eb82e0ccc 100644 --- a/src/plugins/android/androidpackageinstallationstep.cpp +++ b/src/plugins/android/androidpackageinstallationstep.cpp @@ -196,7 +196,7 @@ void AndroidPackageInstallationStep::doRun() AndroidPackageInstallationFactory::AndroidPackageInstallationFactory() { - registerStep(Constants::ANDROID_PACKAGE_INSTALLATION_STEP_ID); + registerStep(Constants::ANDROID_PACKAGE_INSTALL_STEP_ID); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); setSupportedDeviceType(Android::Constants::ANDROID_DEVICE_TYPE); setRepeatable(false); diff --git a/src/plugins/android/androidpotentialkit.cpp b/src/plugins/android/androidpotentialkit.cpp index 128c853c844..79a1afebecb 100644 --- a/src/plugins/android/androidpotentialkit.cpp +++ b/src/plugins/android/androidpotentialkit.cpp @@ -74,7 +74,7 @@ bool AndroidPotentialKit::isEnabled() const } return QtSupport::QtVersionManager::version([](const QtSupport::BaseQtVersion *v) { - return v->isValid() && v->type() == QString::fromLatin1(Constants::ANDROIDQT); + return v->isValid() && v->type() == QString::fromLatin1(Constants::ANDROID_QT_TYPE); }); } diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index 3cc9b06ccd4..b53dc9e8d07 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -197,7 +197,7 @@ void AndroidQtVersion::parseMkSpec(ProFileEvaluator *evaluator) const { m_androidAbis = evaluator->values("ALL_ANDROID_ABIS"); if (m_androidAbis.isEmpty()) - m_androidAbis = QStringList{evaluator->value("ANDROID_TARGET_ARCH")}; + m_androidAbis = QStringList{evaluator->value(Constants::ANDROID_TARGET_ARCH)}; const QString androidPlatform = evaluator->value("ANDROID_PLATFORM"); if (!androidPlatform.isEmpty()) { const QRegularExpression regex("android-(\\d+)"); @@ -232,7 +232,7 @@ QSet AndroidQtVersion::targetDeviceTypes() const AndroidQtVersionFactory::AndroidQtVersionFactory() { setQtVersionCreator([] { return new AndroidQtVersion; }); - setSupportedType(Constants::ANDROIDQT); + setSupportedType(Constants::ANDROID_QT_TYPE); setPriority(90); setRestrictionChecker([](const SetupData &setup) { diff --git a/src/plugins/android/androidrunconfiguration.cpp b/src/plugins/android/androidrunconfiguration.cpp index 5b834fa673a..e1477c26159 100644 --- a/src/plugins/android/androidrunconfiguration.cpp +++ b/src/plugins/android/androidrunconfiguration.cpp @@ -82,13 +82,13 @@ AndroidRunConfiguration::AndroidRunConfiguration(Target *target, Utils::Id id) if (target->buildConfigurations().first()->buildType() == BuildConfiguration::BuildType::Release) { const QString buildKey = target->activeBuildKey(); target->buildSystem()->setExtraData(buildKey, - Android::Constants::ANDROID_APPLICATION_ARGUMENTS, - extraAppArgsAspect->arguments(target->macroExpander())); + Android::Constants::AndroidApplicationArgs, + extraAppArgsAspect->arguments(target->macroExpander())); } }); auto amStartArgsAspect = addAspect(); - amStartArgsAspect->setId(Constants::ANDROID_AMSTARTARGS); + amStartArgsAspect->setId(Constants::ANDROID_AM_START_ARGS); amStartArgsAspect->setSettingsKey("Android.AmStartArgsKey"); amStartArgsAspect->setLabelText(tr("Activity manager start options:")); amStartArgsAspect->setDisplayStyle(StringAspect::LineEditDisplay); diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index db282915111..83c512a46ac 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -279,7 +279,7 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa m_extraAppParams = runControl->runnable().command.arguments(); } - if (auto aspect = runControl->aspect(Constants::ANDROID_AMSTARTARGS)) { + if (auto aspect = runControl->aspect(Constants::ANDROID_AM_START_ARGS)) { QTC_CHECK(aspect->value().type() == QVariant::String); const QString startArgs = aspect->value().toString(); m_amStartExtraArgs = ProcessArgs::splitArgs(startArgs, OsTypeOtherUnix); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 5371aae25a8..f43decd9406 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -936,7 +936,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id) initialArgs.append("-DCMAKE_TOOLCHAIN_FILE:PATH=" + ndkLocation.pathAppended("build/cmake/android.toolchain.cmake").path()); - auto androidAbis = bs->data(Android::Constants::AndroidABIs).toStringList(); + auto androidAbis = bs->data(Android::Constants::AndroidMkSpecAbis).toStringList(); QString preferredAbi; if (androidAbis.contains(ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A)) { preferredAbi = ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp index 6c84e3d8729..86d97babfed 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp @@ -128,20 +128,26 @@ QVariant CMakeTargetNode::data(Utils::Id role) const return {}; }; + if (role == Android::Constants::AndroidAbi) + return value(Android::Constants::ANDROID_ABI); + + if (role == Android::Constants::AndroidAbis) + return value(Android::Constants::ANDROID_ABIS); + + // TODO: Concerns the variables below. Qt 6 uses target properties which cannot be read + // by the current mechanism, and the variables start with "Qt_" prefix. + if (role == Android::Constants::AndroidPackageSourceDir) return value(Android::Constants::ANDROID_PACKAGE_SOURCE_DIR); - if (role == Android::Constants::AndroidDeploySettingsFile) - return value(Android::Constants::ANDROID_DEPLOYMENT_SETTINGS_FILE); - if (role == Android::Constants::AndroidExtraLibs) return value(Android::Constants::ANDROID_EXTRA_LIBS); - if (role == Android::Constants::ANDROID_APPLICATION_ARGUMENTS) - return value(Android::Constants::QT_ANDROID_APPLICATION_ARGUMENTS); + if (role == Android::Constants::AndroidDeploySettingsFile) + return value(Android::Constants::ANDROID_DEPLOYMENT_SETTINGS_FILE); - if (role == Android::Constants::AndroidArch) - return value(Android::Constants::ANDROID_ABI); + if (role == Android::Constants::AndroidApplicationArgs) + return value(Android::Constants::ANDROID_APPLICATION_ARGUMENTS); if (role == Android::Constants::ANDROID_ABIS) return value(Android::Constants::ANDROID_ABIS); @@ -152,6 +158,9 @@ QVariant CMakeTargetNode::data(Utils::Id role) const if (role == Android::Constants::AndroidTargets) return values("TARGETS_BUILD_PATH"); + if (role == Android::Constants::AndroidApk) + return {}; + if (role == Ios::Constants::IosTarget) { // For some reason the artifact is e.g. "Debug/untitled.app/untitled" which is wrong. // It actually is e.g. "Debug-iphonesimulator/untitled.app/untitled". diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 2a155d21284..2d6049b5702 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -218,7 +218,7 @@ QVariant QbsProductNode::data(Id role) const return m_productData.value("module-properties").toObject() .value("Qt.core.enableKeywords").toBool(); - if (role == Android::Constants::ANDROID_ABIS) { + if (role == Android::Constants::AndroidAbis) { // Try using qbs.architectures QStringList qbsAbis; QMap archToAbi { diff --git a/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp b/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp index 419b4044de5..ff08bb61b95 100644 --- a/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp +++ b/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp @@ -33,21 +33,22 @@ const TextEditor::Keywords &QmakeProjectManager::Internal::qmakeKeywords() { static TextEditor::Keywords keywords( QStringList{ // variables - "ANDROID_ABIS", + Android::Constants::ANDROID_ABI, + Android::Constants::ANDROID_ABIS, "ANDROID_API_VERSION", - QLatin1String(Android::Constants::ANDROID_APPLICATION_ARGUMENTS), + Android::Constants::ANDROID_APPLICATION_ARGUMENTS, "ANDROID_BUNDLED_JAR_DEPENDENCIES", "ANDROID_DEPLOYMENT_DEPENDENCIES", - QLatin1String(Android::Constants::ANDROID_DEPLOYMENT_SETTINGS_FILE), - QLatin1String(Android::Constants::ANDROID_EXTRA_LIBS), + Android::Constants::ANDROID_DEPLOYMENT_SETTINGS_FILE, + Android::Constants::ANDROID_EXTRA_LIBS, "ANDROID_EXTRA_PLUGINS", "ANDROID_FEATURES", "ANDROID_LIB_DEPENDENCIES", "ANDROID_MIN_SDK_VERSION", - QLatin1String(Android::Constants::ANDROID_PACKAGE_SOURCE_DIR), + Android::Constants::ANDROID_PACKAGE_SOURCE_DIR, "ANDROID_PERMISSIONS", "ANDROID_TARGET_SDK_VERSION", - "ANDROID_TARGET_ARCH", + Android::Constants::ANDROID_TARGET_ARCH, "ANDROID_VERSION_CODE", "ANDROID_VERSION_NAME", "ARGC", diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index beef0a160d9..6b28aa6b44b 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -157,7 +157,7 @@ QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Utils::Id id) if (DeviceTypeKitAspect::deviceTypeId(target->kit()) == Android::Constants::ANDROID_DEVICE_TYPE) { - buildSteps()->appendStep(Android::Constants::ANDROID_PACKAGE_INSTALLATION_STEP_ID); + buildSteps()->appendStep(Android::Constants::ANDROID_PACKAGE_INSTALL_STEP_ID); buildSteps()->appendStep(Android::Constants::ANDROID_BUILD_APK_ID); } diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 1214b79d64d..46e95f0a689 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -364,16 +364,16 @@ QStringList QmakeProFileNode::targetApplications() const QVariant QmakeProFileNode::data(Utils::Id role) const { - if (role == Android::Constants::ANDROID_ABIS) + if (role == Android::Constants::AndroidAbis) return variableValue(Variable::AndroidAbis); + if (role == Android::Constants::AndroidAbi) + return singleVariableValue(Variable::AndroidAbi); + if (role == Android::Constants::AndroidExtraLibs) + return variableValue(Variable::AndroidExtraLibs); if (role == Android::Constants::AndroidPackageSourceDir) return singleVariableValue(Variable::AndroidPackageSourceDir); if (role == Android::Constants::AndroidDeploySettingsFile) return singleVariableValue(Variable::AndroidDeploySettingsFile); - if (role == Android::Constants::AndroidExtraLibs) - return variableValue(Variable::AndroidExtraLibs); - if (role == Android::Constants::AndroidArch) - return singleVariableValue(Variable::AndroidArch); if (role == Android::Constants::AndroidSoLibPath) { TargetInformation info = targetInformation(); QStringList res = {info.buildDir.toString()}; @@ -431,8 +431,9 @@ bool QmakeProFileNode::setData(Utils::Id role, const QVariant &value) const if (Target *target = m_buildSystem->target()) { QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(target->kit()); if (version && !version->supportsMultipleQtAbis()) { - const QString arch = pro->singleVariableValue(Variable::AndroidArch); - scope = "contains(ANDROID_TARGET_ARCH," + arch + ')'; + const QString arch = pro->singleVariableValue(Variable::AndroidAbi); + scope = QString("contains(%1,%2)").arg(Android::Constants::ANDROID_TARGET_ARCH) + .arg(arch); flags |= QmakeProjectManager::Internal::ProWriter::MultiLine; } } @@ -443,7 +444,7 @@ bool QmakeProFileNode::setData(Utils::Id role, const QVariant &value) const if (role == Android::Constants::AndroidPackageSourceDir) return pro->setProVariable(QLatin1String(Android::Constants::ANDROID_PACKAGE_SOURCE_DIR), {value.toString()}, scope, flags); - if (role == Android::Constants::ANDROID_APPLICATION_ARGUMENTS) + if (role == Android::Constants::AndroidApplicationArgs) return pro->setProVariable(QLatin1String(Android::Constants::ANDROID_APPLICATION_ARGUMENTS), {value.toString()}, scope, flags); diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index 6cc4634375a..f64aecd2962 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -1562,11 +1562,11 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input) = exactReader->values(QLatin1String("TARGET_VERSION_EXT")); result->newVarValues[Variable::StaticLibExtension] = exactReader->values(QLatin1String("QMAKE_EXTENSION_STATICLIB")); result->newVarValues[Variable::ShLibExtension] = exactReader->values(QLatin1String("QMAKE_EXTENSION_SHLIB")); - result->newVarValues[Variable::AndroidArch] = exactReader->values(QLatin1String("ANDROID_TARGET_ARCH")); + result->newVarValues[Variable::AndroidAbi] = exactReader->values(QLatin1String(Android::Constants::ANDROID_TARGET_ARCH)); result->newVarValues[Variable::AndroidDeploySettingsFile] = exactReader->values(QLatin1String(Android::Constants::ANDROID_DEPLOYMENT_SETTINGS_FILE)); result->newVarValues[Variable::AndroidPackageSourceDir] = exactReader->values(QLatin1String(Android::Constants::ANDROID_PACKAGE_SOURCE_DIR)); - result->newVarValues[Variable::AndroidAbis] = exactReader->values(QLatin1String("ANDROID_ABIS")); - result->newVarValues[Variable::AndroidApplicationArguments] = exactReader->values(QLatin1String(Android::Constants::ANDROID_APPLICATION_ARGUMENTS)); + result->newVarValues[Variable::AndroidAbis] = exactReader->values(QLatin1String(Android::Constants::ANDROID_ABIS)); + result->newVarValues[Variable::AndroidApplicationArgs] = exactReader->values(QLatin1String(Android::Constants::ANDROID_APPLICATION_ARGUMENTS)); result->newVarValues[Variable::AndroidExtraLibs] = exactReader->values(QLatin1String(Android::Constants::ANDROID_EXTRA_LIBS)); result->newVarValues[Variable::AppmanPackageDir] = exactReader->values(QLatin1String("AM_PACKAGE_DIR")); result->newVarValues[Variable::AppmanManifest] = exactReader->values(QLatin1String("AM_MANIFEST")); diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h index fc90e0759de..cfa86b181f8 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h @@ -96,12 +96,12 @@ enum class Variable { TargetVersionExt, StaticLibExtension, ShLibExtension, - AndroidArch, - AndroidDeploySettingsFile, + AndroidAbi, AndroidAbis, + AndroidDeploySettingsFile, AndroidPackageSourceDir, AndroidExtraLibs, - AndroidApplicationArguments, + AndroidApplicationArgs, AppmanPackageDir, AppmanManifest, IsoIcons, diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index 7cc65532af3..9e7c7f22307 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -632,7 +632,7 @@ void QMakeStep::abisChanged() if (BaseQtVersion *qtVersion = QtKitAspect::qtVersion(target()->kit())) { if (qtVersion->hasAbi(Abi::LinuxOS, Abi::AndroidLinuxFlavor)) { - const QString prefix = "ANDROID_ABIS="; + const QString prefix = QString("%1=").arg(Android::Constants::ANDROID_ABIS); QStringList args = m_extraArgs; for (auto it = args.begin(); it != args.end(); ++it) { if (it->startsWith(prefix)) { @@ -643,8 +643,7 @@ void QMakeStep::abisChanged() if (!m_selectedAbis.isEmpty()) args << prefix + '"' + m_selectedAbis.join(' ') + '"'; setExtraArguments(args); - - buildSystem()->setProperty(Android::Constants::ANDROID_ABIS, m_selectedAbis); + buildSystem()->setProperty(Android::Constants::AndroidAbis, m_selectedAbis); } else if (qtVersion->hasAbi(Abi::DarwinOS) && !isIos(target()->kit())) { const QString prefix = "QMAKE_APPLE_DEVICE_ARCHS="; QStringList args = m_extraArgs; From c94d5a257be494c1c327c0a6988c5115aa4c938e Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Sat, 2 Oct 2021 23:35:25 +0300 Subject: [PATCH 24/67] Android: few fixes for android kits aspects Make some changes to make Android kits behave as, for example, desktop kits: * Set the build device of the kit to the default desktop device. * Don't make the device and toolchain aspects sticky. Change-Id: I41a40c6ed8dc3434fa4f3a09349b75b5fd379317 Reviewed-by: Alessandro Portale --- src/plugins/android/androidconfigurations.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 20281f71d02..c769a744d26 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1321,9 +1321,8 @@ void AndroidConfigurations::updateAutomaticKitList() QStringList abis = static_cast(qt)->androidAbis(); Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc, abis)); - k->setSticky(ToolChainKitAspect::id(), true); + BuildDeviceKitAspect::setDeviceId(k, DeviceManager::defaultDesktopDevice()->id()); k->setSticky(QtKitAspect::id(), true); - k->setSticky(DeviceKitAspect::id(), true); k->setMutable(DeviceKitAspect::id(), true); k->setSticky(DeviceTypeKitAspect::id(), true); From 6860e361a4470f45cc86b7da67c843af1de84ef5 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 28 Sep 2021 15:17:36 +0200 Subject: [PATCH 25/67] qmldom: fix output path Change-Id: I137accdb788fa4686a0c70dfcc1b66a6c576dcff Reviewed-by: Cristian Adam --- tests/unit/unittest/CMakeLists.txt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index 5699475432c..6252f4517d5 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -481,8 +481,16 @@ get_filename_component( ABSOLUTE ) -if(EXISTS ${QMLDOM_STANDALONE_CMAKELISTS}) - add_subdirectory(${QMLDOM_STANDALONE_CMAKELISTS} qmldom_standalone) + +if (EXISTS ../../../../qmldom_standalone/src/qmldom/standalone) + add_subdirectory( + ../../../../qmldom_standalone/src/qmldom/standalone + ${CMAKE_CURRENT_BINARY_DIR}/qmldom_standalone) + + set_target_properties(qmldomlib PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "$" + LIBRARY_OUTPUT_DIRECTORY "$") + extend_qtc_test(unittest DEPENDS qmldomlib SOURCES From 9dd6b59983b607aacd3b582ea6ed3970f82f945f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 6 Oct 2021 10:36:52 +0200 Subject: [PATCH 26/67] Bump version to 5.0.3 Change-Id: Iba72b6b0ff1d13a35b6d7473b0617ecb80afa164 Reviewed-by: Eike Ziller --- cmake/QtCreatorIDEBranding.cmake | 4 ++-- qbs/modules/qtc/qtc.qbs | 4 ++-- qtcreator_ide_branding.pri | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index 5d19f3fcc4e..2edbc46eedd 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -1,6 +1,6 @@ -set(IDE_VERSION "5.0.2") # The IDE version. +set(IDE_VERSION "5.0.3") # The IDE version. set(IDE_VERSION_COMPAT "5.0.0") # The IDE Compatibility version. -set(IDE_VERSION_DISPLAY "5.0.2") # The IDE display version. +set(IDE_VERSION_DISPLAY "5.0.3") # The IDE display version. set(IDE_COPYRIGHT_YEAR "2021") # The IDE current copyright year. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index 587b66df3c5..40d02fc9279 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -3,10 +3,10 @@ import qbs.Environment import qbs.FileInfo Module { - property string qtcreator_display_version: '5.0.2' + property string qtcreator_display_version: '5.0.3' property string ide_version_major: '5' property string ide_version_minor: '0' - property string ide_version_release: '2' + property string ide_version_release: '3' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release diff --git a/qtcreator_ide_branding.pri b/qtcreator_ide_branding.pri index e685d1488f5..1ab94df1f26 100644 --- a/qtcreator_ide_branding.pri +++ b/qtcreator_ide_branding.pri @@ -1,6 +1,6 @@ -QTCREATOR_VERSION = 5.0.2 +QTCREATOR_VERSION = 5.0.3 QTCREATOR_COMPAT_VERSION = 5.0.0 -QTCREATOR_DISPLAY_VERSION = 5.0.2 +QTCREATOR_DISPLAY_VERSION = 5.0.3 QTCREATOR_COPYRIGHT_YEAR = 2021 IDE_DISPLAY_NAME = Qt Creator From 372b0c9b7e6e4cb4ccd46a027d3c578b9b664d66 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 5 Oct 2021 15:22:09 +0200 Subject: [PATCH 27/67] ClangCodeModel: Handle clangd's semantic tokens in parallel This speeds up semantic highlighting considerably. Change-Id: I1dca2c8d6b9e41ac2895a53b795466a3249f79bc Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 2607b6d9e1c..8ba51f2fba0 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -73,6 +73,7 @@ #include #include #include +#include #include #include @@ -2131,7 +2132,7 @@ class ExtraHighlightingResultsCollector public: ExtraHighlightingResultsCollector(QFutureInterface &future, HighlightingResults &results, const AstNode &ast, - QTextDocument *doc, const QString &docContent); + const QTextDocument *doc, const QString &docContent); void collect(); private: @@ -2156,7 +2157,7 @@ private: // and not even in a consistent manner. We don't want this, so we have to clean up here. // But note that we require this behavior, as otherwise we would not be able to grey out // e.g. empty lines after an #fdef, due to the lack of symbols. -static QList cleanupDisabledCode(HighlightingResults &results, QTextDocument *doc, +static QList cleanupDisabledCode(HighlightingResults &results, const QTextDocument *doc, const QString &docContent) { QList ifdefedOutRanges; @@ -2223,7 +2224,7 @@ static void semanticHighlighter(QFutureInterface &future, return; } - QTextDocument doc(docContents); + const QTextDocument doc(docContents); const auto isOutputParameter = [&ast](const ExpandedSemanticToken &token) { if (token.modifiers.contains("usedAsMutableReference")) return true; @@ -2250,8 +2251,8 @@ static void semanticHighlighter(QFutureInterface &future, return false; }; - const auto toResult = [&ast, &isOutputParameter, &clangdVersion] - (const ExpandedSemanticToken &token) { + const std::function toResult + = [&ast, &isOutputParameter, &clangdVersion](const ExpandedSemanticToken &token) { TextStyles styles; if (token.type == "variable") { if (token.modifiers.contains("functionScope")) { @@ -2334,7 +2335,7 @@ static void semanticHighlighter(QFutureInterface &future, return HighlightingResult(token.line, token.column, token.length, styles); }; - HighlightingResults results = Utils::transform(tokens, toResult); + auto results = QtConcurrent::blockingMapped(tokens, toResult); const QList ifdefedOutBlocks = cleanupDisabledCode(results, &doc, docContents); QMetaObject::invokeMethod(widget, [widget, ifdefedOutBlocks, docRevision] { if (widget && widget->textDocument()->document()->revision() == docRevision) @@ -2801,7 +2802,7 @@ MessageId ClangdClient::Private::getAndHandleAst(const TextDocOrFile &doc, ExtraHighlightingResultsCollector::ExtraHighlightingResultsCollector( QFutureInterface &future, HighlightingResults &results, - const AstNode &ast, QTextDocument *doc, const QString &docContent) + const AstNode &ast, const QTextDocument *doc, const QString &docContent) : m_future(future), m_results(results), m_ast(ast), m_doc(doc), m_docContent(docContent) { From 0f480cee70a2bf0e4a99b9cfcd93194a00aa8f81 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 5 Oct 2021 13:39:13 +0200 Subject: [PATCH 28/67] Docker: allow windows style paths in settings Makes sure to convert it to unix style path on the target and use the correct capitalisation on the host Change-Id: I0c6dff47c34c1844a8198c3215ea857fdb6375c7 Reviewed-by: hjk Reviewed-by: Christian Stenger --- src/plugins/docker/dockerdevice.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index bc732796a49..11be0ce2b0d 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -834,9 +834,18 @@ void DockerDevicePrivate::startContainer() dockerRun.addArgs({"-u", QString("%1:%2").arg(getuid()).arg(getgid())}); #endif - for (const QString &mount : qAsConst(m_data.mounts)) { - if (!mount.isEmpty()) - dockerRun.addArgs({"-v", mount + ':' + mount}); + for (QString mount : qAsConst(m_data.mounts)) { + if (mount.isEmpty()) + continue; + // make sure to convert windows style paths to unix style paths with the file system case: + // C:/dev/src -> /c/dev/src + if (const FilePath mountPath = FilePath::fromUserInput(mount).normalizedPathName(); + mountPath.startsWithDriveLetter()) { + const QChar lowerDriveLetter = mountPath.path().at(0).toLower(); + const FilePath path = FilePath::fromUserInput(mountPath.path().mid(2)); // strip C: + mount = '/' + lowerDriveLetter + path.path(); + } + dockerRun.addArgs({"-v", mount + ':' + mount}); } dockerRun.addArgs({"--entrypoint", "/bin/sh", m_data.imageId}); From 704a758f69d43df8b772147bb5ebe03126335212 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 5 Oct 2021 12:52:26 +0200 Subject: [PATCH 29/67] Docker: use PathListEditor for mounts Change-Id: I5ed0ebf5ecdad17c1800f15906063d3413307da3 Reviewed-by: hjk --- src/libs/utils/pathlisteditor.cpp | 1 + src/libs/utils/pathlisteditor.h | 3 +++ src/plugins/docker/dockerdevice.cpp | 26 ++++++++++++++------------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/libs/utils/pathlisteditor.cpp b/src/libs/utils/pathlisteditor.cpp index 61d215fd837..d24be4995b5 100644 --- a/src/libs/utils/pathlisteditor.cpp +++ b/src/libs/utils/pathlisteditor.cpp @@ -130,6 +130,7 @@ PathListEditor::PathListEditor(QWidget *parent) : }); addButton(tr("Delete Line"), this, [this] { deletePathAtCursor(); }); addButton(tr("Clear"), this, [this] { d->edit->clear(); }); + connect(d->edit, &QPlainTextEdit::textChanged, this, &PathListEditor::changed); } PathListEditor::~PathListEditor() diff --git a/src/libs/utils/pathlisteditor.h b/src/libs/utils/pathlisteditor.h index 07392fbe6ed..edd70336c09 100644 --- a/src/libs/utils/pathlisteditor.h +++ b/src/libs/utils/pathlisteditor.h @@ -58,6 +58,9 @@ public: void setPathList(const QString &pathString); void setFileDialogTitle(const QString &l); +signals: + void changed(); + protected: // Index after which to insert further "Add" buttons static const int lastInsertButtonIndex; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 11be0ce2b0d..6948552c965 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -49,17 +49,18 @@ #include #include #include +#include #include -#include #include #include +#include #include #include #include #include #include #include -#include +#include #include #include @@ -394,15 +395,13 @@ public: dockerDevice->tryCreateLocalFileAccess(); }); - m_pathsLineEdit = new QLineEdit; - m_pathsLineEdit->setText(data.repo); - m_pathsLineEdit->setToolTip(tr("Paths in this semi-colon separated list will be " - "mapped one-to-one into the Docker container.")); - m_pathsLineEdit->setText(data.mounts.join(';')); - m_pathsLineEdit->setPlaceholderText(tr("List project source directories here")); + m_pathsListEdit = new PathListEditor; + m_pathsListEdit->setToolTip(tr("Paths in this list will be mapped one-to-one into the " + "Docker container.")); + m_pathsListEdit->setPathList(data.mounts); - connect(m_pathsLineEdit, &QLineEdit::textChanged, this, [dockerDevice](const QString &text) { - dockerDevice->setMounts(text.split(';', Qt::SkipEmptyParts)); + connect(m_pathsListEdit, &PathListEditor::changed, this, [dockerDevice, this]() { + dockerDevice->setMounts(m_pathsListEdit->pathList()); }); auto logView = new QTextBrowser; @@ -443,7 +442,10 @@ public: daemonStateLabel, m_daemonReset, m_daemonState, Break(), m_runAsOutsideUser, Break(), m_usePathMapping, Break(), - tr("Paths to mount:"), m_pathsLineEdit, Break(), + Column { + new QLabel(tr("Paths to mount:")), + m_pathsListEdit, + }, Break(), Column { Space(20), Row { autoDetectButton, undoAutoDetectButton, listAutoDetectedButton, Stretch() }, @@ -463,7 +465,7 @@ private: QLabel *m_daemonState; QCheckBox *m_runAsOutsideUser; QCheckBox *m_usePathMapping; - QLineEdit *m_pathsLineEdit; + Utils::PathListEditor *m_pathsListEdit; KitDetector m_kitItemDetector; }; From 7e7b6a52f9bbe105e08b7860ae993a1faa45d636 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 1 Oct 2021 10:56:52 +0200 Subject: [PATCH 30/67] Don't kill the QProcess instance which is running in other thread The main thread doesn't kill processes directly, but sets just the cancel flag. Instead of waiting infinitely long for a process to finish we poll periodically (every 100ms) for the canceled flag inside the thread that started the process. Amends: a30aa4421a0257b048197b51330e6bf5c2732af5 Task-number: QTCREATORBUG-26333 Change-Id: I599d5c6cd69381cadc4a01c65f6a79f9a9bbd3fb Reviewed-by: Eike Ziller Reviewed-by: Qt CI Bot Reviewed-by: Christian Kandeler --- .../qmakeprojectmanager/qmakeproject.cpp | 3 ++- src/shared/proparser/qmakebuiltins.cpp | 27 +++++++++++-------- src/shared/proparser/qmakeglobals.cpp | 4 --- src/shared/proparser/qmakeglobals.h | 3 +-- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 793ec73ba86..54395bfc37b 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -674,8 +674,9 @@ void QmakeBuildSystem::asyncUpdate() connect(watcher, &QFutureWatcher::canceled, this, [this, watcher] { if (!m_qmakeGlobals) return; - watcher->disconnect(); m_qmakeGlobals->killProcesses(); + watcher->disconnect(); + watcher->deleteLater(); }); connect(watcher, &QFutureWatcher::finished, this, [watcher] { watcher->disconnect(); diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp index a697133896f..c47bc1b2e72 100644 --- a/src/shared/proparser/qmakebuiltins.cpp +++ b/src/shared/proparser/qmakebuiltins.cpp @@ -474,12 +474,8 @@ void QMakeEvaluator::runProcess(QProcess *proc, const QString &command) const } # endif # ifdef PROEVALUATOR_THREAD_SAFE - m_option->mutex.lock(); - if (m_option->canceled) { - m_option->mutex.unlock(); + if (m_option->canceled) return; - } - m_option->runningProcs << proc; # endif # ifdef Q_OS_WIN proc->setNativeArguments(QLatin1String("/v:off /s /c \"") + command + QLatin1Char('"')); @@ -488,12 +484,21 @@ void QMakeEvaluator::runProcess(QProcess *proc, const QString &command) const proc->start(QLatin1String("/bin/sh"), QStringList() << QLatin1String("-c") << command); # endif # ifdef PROEVALUATOR_THREAD_SAFE - m_option->mutex.unlock(); -# endif - proc->waitForFinished(-1); -# ifdef PROEVALUATOR_THREAD_SAFE - QMutexLocker(&m_option->mutex); - m_option->runningProcs.removeOne(proc); + while (true) { + if (proc->waitForFinished(100)) + break; + if (m_option->canceled) { + proc->terminate(); + if (proc->waitForFinished(1000)) + break; + proc->kill(); + proc->waitForFinished(1000); + break; + } + } +# else + proc->waitForFinished(-1); // If have have single thread we can't cancel it using + // synchronous API of QProcess # endif } #endif diff --git a/src/shared/proparser/qmakeglobals.cpp b/src/shared/proparser/qmakeglobals.cpp index ea429145e3c..ca22bdde8b7 100644 --- a/src/shared/proparser/qmakeglobals.cpp +++ b/src/shared/proparser/qmakeglobals.cpp @@ -92,11 +92,7 @@ QMakeGlobals::~QMakeGlobals() void QMakeGlobals::killProcesses() { #ifdef PROEVALUATOR_THREAD_SAFE - QMutexLocker lock(&mutex); canceled = true; - for (QProcess * const proc : runningProcs) - proc->kill(); - runningProcs.clear(); #endif } diff --git a/src/shared/proparser/qmakeglobals.h b/src/shared/proparser/qmakeglobals.h index 2fa9a332135..2baeab4bf58 100644 --- a/src/shared/proparser/qmakeglobals.h +++ b/src/shared/proparser/qmakeglobals.h @@ -159,8 +159,7 @@ private: #ifdef PROEVALUATOR_THREAD_SAFE QMutex mutex; - bool canceled = false; - QList runningProcs; + std::atomic_bool canceled = false; #endif QHash baseEnvs; From d63b8b0bb7aeb79e928009a6e5cf0020ac43bbb7 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 6 Oct 2021 09:49:56 +0200 Subject: [PATCH 31/67] Fix that tabs where replaced with ? in search results Looks like tabs are not "print", so make sure that whitespace is kept unmodified. Amends 1aa92b5dabee638af54cec3eb572f349182e1613 Fixes: QTCREATORBUG-26367 Change-Id: Ie9a89b36440c51ef2bbcf7a668f3c9b5f3c0f485 Reviewed-by: Orgad Shaneh Reviewed-by: David Schulz Reviewed-by: Qt CI Bot --- src/plugins/texteditor/basefilefind.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index abe8777b347..f0fe19cc349 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -236,7 +236,7 @@ static QString displayText(const QString &line) QString result = line; auto end = result.end(); for (auto it = result.begin(); it != end; ++it) { - if (!it->isPrint()) + if (!it->isSpace() && !it->isPrint()) *it = QChar('?'); } return result; From 9ca3546e594ac1f1c4aff8b4bfaf589e811f6825 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 6 Oct 2021 10:06:10 +0200 Subject: [PATCH 32/67] Fix that ".." was no longer cleaned in file system locator filter Amends 66bf957618848cfa243a88a8f2909167d3535d27 Fixes: QTCREATORBUG-26368 Change-Id: I0b90b1a6b6d4bd1bdbf135f0447702d6a85bb9e4 Reviewed-by: Orgad Shaneh Reviewed-by: Qt CI Bot --- src/plugins/coreplugin/locator/filesystemfilter.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/locator/filesystemfilter.cpp b/src/plugins/coreplugin/locator/filesystemfilter.cpp index 95c9bf16ea2..9e0751e570f 100644 --- a/src/plugins/coreplugin/locator/filesystemfilter.cpp +++ b/src/plugins/coreplugin/locator/filesystemfilter.cpp @@ -176,8 +176,9 @@ void FileSystemFilter::accept(LocatorFilterEntry selection, { Q_UNUSED(selectionLength) if (selection.filePath.isDir()) { - const QString value = shortcutString() + ' ' - + selection.filePath.absoluteFilePath().toUserOutput() + '/'; + const QString value + = shortcutString() + ' ' + + selection.filePath.absoluteFilePath().cleanPath().pathAppended("/").toUserOutput(); *newText = value; *selectionStart = value.length(); } else { From 25a7f30ffc8fcfc75040949e95d64e866653a10e Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 6 Oct 2021 13:27:23 +0200 Subject: [PATCH 33/67] ClangCodeModel: Do not hold highlighters by value in ClangdClient Semantic highlighter objects are owned by their respective documents, so we can run into destruction issues when keeping them by value. Fixes: QTCREATORBUG-26364 Change-Id: Idc128d685ccdd25989dd9389d352453ccc935fa9 Reviewed-by: Eike Ziller --- src/plugins/clangcodemodel/clangdclient.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 8ba51f2fba0..fb3efa95ecc 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -77,6 +77,7 @@ #include #include +#include using namespace CPlusPlus; using namespace Core; @@ -934,7 +935,10 @@ public: Utils::optional switchDeclDefData; Utils::optional localRefsData; Utils::optional versionNumber; - std::unordered_map highlighters; + + // The highlighters are owned by their respective documents. + std::unordered_map highlighters; + VersionedDataCache astCache; VersionedDataCache externalAstCache; TaskTimer highlightingTimer{"highlighting"}; @@ -2400,12 +2404,13 @@ void ClangdClient::Private::handleSemanticTokens(TextDocument *doc, auto it = highlighters.find(doc); if (it == highlighters.end()) { - it = highlighters.emplace(doc, doc).first; + it = highlighters.insert(std::make_pair(doc, new CppEditor::SemanticHighlighter(doc))) + .first; } else { - it->second.updateFormatMapFromFontSettings(); + it->second->updateFormatMapFromFontSettings(); } - it->second.setHighlightingRunner(runner); - it->second.run(); + it->second->setHighlightingRunner(runner); + it->second->run(); }; getAndHandleAst(doc, astHandler, AstCallbackMode::SyncIfPossible); } From d02155f24a918d02d4ddcdde8cc7e6f11fcce5b8 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Wed, 6 Oct 2021 12:57:20 +0200 Subject: [PATCH 34/67] ClangFormat: Fix bug with reload of settings - Fixed behavior when saved data from file doesn't load in the first opening of the code style options Change-Id: I1c72845cbf8119f9eb402a2f40bcc816c5590c25 Reviewed-by: Christian Kandeler --- src/plugins/clangformat/clangformatconfigwidget.cpp | 3 --- src/plugins/clangformat/clangformatfile.cpp | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index 2749b1cf11d..0dc6d4c54fe 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -382,9 +382,6 @@ void ClangFormatConfigWidget::fillTable() void ClangFormatConfigWidget::saveChanges(QObject *sender) { - std::stringstream content; - content << "---"; - if (sender->objectName() == "BasedOnStyle") { const auto *basedOnStyle = m_checksWidget->findChild("BasedOnStyle"); m_config->setBasedOnStyle(basedOnStyle->currentText()); diff --git a/src/plugins/clangformat/clangformatfile.cpp b/src/plugins/clangformat/clangformatfile.cpp index 31f096ed6ff..8e532ea7976 100644 --- a/src/plugins/clangformat/clangformatfile.cpp +++ b/src/plugins/clangformat/clangformatfile.cpp @@ -36,6 +36,7 @@ ClangFormatFile::ClangFormatFile(Utils::FilePath filePath) return; } + m_style.Language = clang::format::FormatStyle::LK_Cpp; const std::error_code error = clang::format::parseConfiguration(m_filePath.fileContents().toStdString(), &m_style); if (error.value() != static_cast(clang::format::ParseError::Success)) { @@ -72,7 +73,6 @@ void ClangFormatFile::setBasedOnStyle(QString styleName) QString ClangFormatFile::setStyle(QString style) { - m_style.Language = clang::format::FormatStyle::LK_Cpp; const std::error_code error = clang::format::parseConfiguration(style.toStdString(), &m_style); if (error.value() != static_cast(clang::format::ParseError::Success)) { return QString::fromStdString(error.message()); From f3276a96e9d1b9c04fe8ff0b4ea37b126128f00b Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 6 Oct 2021 11:06:23 +0200 Subject: [PATCH 35/67] Wizards: Adapt QtQuickPrototype wizard to recent template changes Handle the new isQt6 property. amends: 77fed0b0fdce2a93f465c20cd87c41900117dcda Task-number: QTCREATORBUG-26373 Change-Id: Iff6fb8f91954aa116b8f1c461c7db45f321325fd Reviewed-by: Artem Sokolovskii Reviewed-by: Kai Koehne --- .../projects/qtquickuiprototype/wizard.json | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json index 366ec1e4cd1..78dbbd99561 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json @@ -14,6 +14,7 @@ "options": [ { "key": "QmlProjectFileName", "value": "%{JS: Util.fileName(value('ProjectDirectory') + '/' + value('ProjectName'), 'qmlproject')}" }, + { "key": "IsQt6", "value": "%{JS: value('QtVersion').IsQt6}" }, { "key": "MainQmlFileName", "value": "%{JS: Util.fileName(value('ProjectName'), 'qml')}" }, { "key": "QtQuickVersion", "value": "%{JS: value('QtVersion').QtQuickVersion}" }, { "key": "QtQuickWindowVersion", "value": "%{JS: value('QtVersion').QtQuickWindowVersion}" }, @@ -50,7 +51,8 @@ { "QtQuickVersion": "", "QtQuickWindowVersion": "", - "QtQuickVirtualKeyboardImport": "" + "QtQuickVirtualKeyboardImport": "", + "IsQt6": true } }, { @@ -59,7 +61,8 @@ { "QtQuickVersion": "2.15", "QtQuickWindowVersion": "2.15", - "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.15" + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.15", + "IsQt6": false } }, { @@ -68,7 +71,8 @@ { "QtQuickVersion": "2.14", "QtQuickWindowVersion": "2.14", - "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.14" + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.14", + "IsQt6": false } }, { @@ -77,7 +81,8 @@ { "QtQuickVersion": "2.13", "QtQuickWindowVersion": "2.13", - "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.4" + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.4", + "IsQt6": false } }, { @@ -86,7 +91,8 @@ { "QtQuickVersion": "2.12", "QtQuickWindowVersion": "2.12", - "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.4" + "QtQuickVirtualKeyboardImport": "QtQuick.VirtualKeyboard 2.4", + "IsQt6": false } } ] From ee6f3a8cc8eb59a09cec93a75a3013d731cb67d6 Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Wed, 6 Oct 2021 13:54:19 +0200 Subject: [PATCH 36/67] Consider Qt::Key_Backspace and Qt::Key_Delete as delete keys Both keys where set as a global shortcut for deletion. The timeline considered only one of them. Change-Id: I5d27221a371535e94751ffcd0f6d4420978d0f81 Reviewed-by: Thomas Hartmann --- .../timelineeditor/timelinegraphicsscene.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index 704d7c2b0d0..b3150e1e832 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -70,12 +70,9 @@ namespace QmlDesigner { -static int deleteKey() +static bool isDeleteKey(int key) { - if (Utils::HostOsInfo::isMacHost()) - return Qt::Key_Backspace; - - return Qt::Key_Delete; + return (key == Qt::Key_Backspace) | (key == Qt::Key_Delete); } QList allTimelineFrames(const QmlTimeline &timeline) @@ -674,7 +671,7 @@ void TimelineGraphicsScene::keyReleaseEvent(QKeyEvent *keyEvent) return; } - if (deleteKey() == keyEvent->key()) + if (isDeleteKey(keyEvent->key())) handleKeyframeDeletion(); QGraphicsScene::keyReleaseEvent(keyEvent); @@ -838,7 +835,7 @@ bool TimelineGraphicsScene::event(QEvent *event) { switch (event->type()) { case QEvent::ShortcutOverride: - if (static_cast(event)->key() == deleteKey()) { + if (isDeleteKey(static_cast(event)->key())) { QGraphicsScene::keyPressEvent(static_cast(event)); event->accept(); return true; From 7d5c9be52b94f15bdc9c56799e81ae241535fd38 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 4 Oct 2021 17:29:39 +0200 Subject: [PATCH 37/67] qmljseditor: fix crash at shutdown Change-Id: Ifae7ec5f378c0b2d3e667bd26a509fbcbefadecf Reviewed-by: Thomas Hartmann Reviewed-by: Kai Koehne --- src/plugins/qmljseditor/qmljseditorplugin.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp index e0d57031020..59cafdcfc19 100644 --- a/src/plugins/qmljseditor/qmljseditorplugin.cpp +++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp @@ -110,6 +110,7 @@ QmlJSEditorPlugin::QmlJSEditorPlugin() QmlJSEditorPlugin::~QmlJSEditorPlugin() { + delete QmlJS::Icons::instance(); // delete object held by singleton delete d; d = nullptr; m_instance = nullptr; @@ -226,8 +227,6 @@ void QmlJSEditorPlugin::extensionsInitialized() ExtensionSystem::IPlugin::ShutdownFlag QmlJSEditorPlugin::aboutToShutdown() { - delete QmlJS::Icons::instance(); // delete object held by singleton - return IPlugin::aboutToShutdown(); } From 2a0d09bdacedda89073b225abc6a3bbf3c26a007 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 6 Oct 2021 16:47:48 +0200 Subject: [PATCH 38/67] Utils: Drop unneeded env parameter in searchInDirectoryHelper Change-Id: I8134fe3f9306d8826b409771f60db36851613954 Reviewed-by: Christian Kandeler --- src/libs/utils/environment.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 2d3d6edf3b4..76f32ccb98c 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -136,8 +136,7 @@ void Environment::setupEnglishOutput() set("LANGUAGE", "en_US:en"); } -static FilePath searchInDirectory(const Environment &env, - const QStringList &execs, +static FilePath searchInDirectory(const QStringList &execs, const FilePath &directory, QSet &alreadyChecked) { @@ -226,7 +225,7 @@ static FilePath searchInDirectoriesHelper(const Environment &env, QSet alreadyChecked; for (const FilePath &dir : dirs) { - FilePath tmp = searchInDirectory(env, execs, dir, alreadyChecked); + FilePath tmp = searchInDirectory(execs, dir, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) return tmp; } @@ -236,7 +235,7 @@ static FilePath searchInDirectoriesHelper(const Environment &env, return FilePath(); for (const FilePath &p : env.path()) { - FilePath tmp = searchInDirectory(env, execs, p, alreadyChecked); + FilePath tmp = searchInDirectory(execs, p, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) return tmp; } @@ -281,14 +280,14 @@ FilePaths Environment::findAllInPath(const QString &executable, QSet result; QSet alreadyChecked; for (const FilePath &dir : additionalDirs) { - FilePath tmp = searchInDirectory(*this, execs, dir, alreadyChecked); + FilePath tmp = searchInDirectory(execs, dir, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) result << tmp; } if (!executable.contains('/')) { for (const FilePath &p : path()) { - FilePath tmp = searchInDirectory(*this, execs, p, alreadyChecked); + FilePath tmp = searchInDirectory(execs, p, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) result << tmp; } From 9491c04b8ae75af2e0bcc7c173aaadc099bcb027 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 5 Oct 2021 18:14:11 +0200 Subject: [PATCH 39/67] QmlDesigner: Update TransitionEditor when animation is removed Change-Id: Ida9c1a44879bd1d8d2bbf6614eda7d8b31de9037 Reviewed-by: Knud Dollereder --- .../components/transitioneditor/transitioneditorview.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp index 97dc457f39c..ccf84152b57 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp @@ -98,6 +98,10 @@ void TransitionEditorView::nodeRemoved(const ModelNode & removedNode, { if (parentProperty.name() == "transitions") widget()->updateData(removedNode); + + const ModelNode parent = parentProperty.parentModelNode(); + if (parent.isValid() && parent.metaInfo().isSubclassOf("QtQuick.Transition")) + asyncUpdate(parent); } void TransitionEditorView::nodeReparented(const ModelNode &node, @@ -110,7 +114,6 @@ void TransitionEditorView::nodeReparented(const ModelNode &node, const ModelNode parent = newPropertyParent.parentModelNode(); - // qDebug() << Q_FUNC_INFO << parent; if (parent.isValid() && parent.metaInfo().isValid() && parent.metaInfo().isSubclassOf("QtQuick.Transition")) { asyncUpdate(parent); From 1e765e59638b45bb5365f695e747f339d9be156a Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Wed, 6 Oct 2021 10:54:44 +0300 Subject: [PATCH 40/67] Android: add environment to removeAvd() Valid for windows hosts, otherwise, the command might fail. Change-Id: I3e759c74ea0a785fd226cda08f301f0cce17c9b7 Reviewed-by: Alessandro Portale --- src/plugins/android/androidavdmanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp index 27af7b76db7..1b308039107 100644 --- a/src/plugins/android/androidavdmanager.cpp +++ b/src/plugins/android/androidavdmanager.cpp @@ -203,6 +203,7 @@ bool AndroidAvdManager::removeAvd(const QString &name) const qCDebug(avdManagerLog) << "Running command (removeAvd):" << command.toUserOutput(); QtcProcess proc; proc.setTimeoutS(5); + proc.setEnvironment(AndroidConfigurations::toolsEnvironment(m_config)); proc.setCommand(command); proc.runBlocking(); return proc.result() == QtcProcess::FinishedWithSuccess; From 1cc4cbb402a8c1066416152c881d8586b3b9816c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Wed, 6 Oct 2021 22:28:22 +0200 Subject: [PATCH 41/67] Debugger: Tests: Fix warnings To not confuse testers. Change-Id: I2190e85cea5b0e32af883d8caa368aef0f55befc Reviewed-by: hjk --- tests/manual/debugger/simple/simple_test_app.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/manual/debugger/simple/simple_test_app.cpp b/tests/manual/debugger/simple/simple_test_app.cpp index cbe4294389d..d4df6f0411b 100644 --- a/tests/manual/debugger/simple/simple_test_app.cpp +++ b/tests/manual/debugger/simple/simple_test_app.cpp @@ -4433,7 +4433,11 @@ namespace qvariant { // FIXME: Known to break //QString type = var.typeName(); var.setValue(my); +#if QT_VERSION >= 0x051500 + const char *name = QMetaType(var.userType()).name(); +#else const char *name = QMetaType::typeName(var.userType()); +#endif BREAK_HERE; // Expand my my.0 my.0.value my.1 my.1.value var var.data var.data.0 var.data.0.value var.data.1 var.data.1.value. // Check my <2 items> qvariant::MyType. @@ -4706,6 +4710,7 @@ namespace noargs { { public: Goo(const QString &str, const int n) : str_(str), n_(n) {} + int n() {return n_;} private: QString str_; int n_; @@ -5459,7 +5464,7 @@ namespace basic { const int &b = a; typedef int &Ref; const int c = 44; - const Ref d = a; + Ref d = a; BREAK_HERE; // Check a 43 int. // Check b 43 int &. @@ -5475,7 +5480,7 @@ namespace basic { const QString &b = fooxx(); typedef QString &Ref; const QString c = "world"; - const Ref d = a; + Ref d = a; BREAK_HERE; // Check a "hello" QString. // Check b "bababa" QString &. @@ -5489,7 +5494,7 @@ namespace basic { { const QString &b = a; typedef QString &Ref; - const Ref d = const_cast(a); + Ref d = const_cast(a); BREAK_HERE; // Check a "hello" QString &. // Check b "hello" QString &. From 2a96c396f9d8def08fbb82bb767a832f876a82e0 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 5 Oct 2021 17:01:43 +0300 Subject: [PATCH 42/67] QmlDesigner: Notify other views of nodeSource triggered puppet reset Use resetPuppet() instead of delayedRestartProcess() to properly notify other views of the impending reset. Fixes: QDS-5222 Change-Id: I46dc0dfc9f0b675bd2a0fc07c6b7d9cde4d1e48a Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/instances/nodeinstanceview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 6ecde66a309..078a74a534d 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -644,7 +644,7 @@ void NodeInstanceView::nodeSourceChanged(const ModelNode &node, const QString & m_nodeInstanceServer->changeNodeSource(changeNodeSourceCommand); // Puppet doesn't deal with node source changes properly, so just reset the puppet for now - delayedRestartProcess(); // TODO: Remove this once the issue is properly fixed (QDS-4955) + resetPuppet(); // TODO: Remove this once the issue is properly fixed (QDS-4955) } } From 033d2c5cc34d44aa9fa6c69475e33fc6c00af155 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 29 Sep 2021 17:09:45 +0200 Subject: [PATCH 43/67] Docker: create container before running image Change-Id: Iea4a4ec446a2df6fc299be24615bca605fca83e9 Reviewed-by: hjk --- src/plugins/docker/dockerdevice.cpp | 59 ++++++++++++----------------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 6948552c965..638fb91db0e 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -76,8 +76,8 @@ #include #include #include -#include #include +#include #include @@ -815,25 +815,19 @@ static QString getLocalIPv4Address() void DockerDevicePrivate::startContainer() { - QString tempFileName; - - { - TemporaryFile temp("qtc-docker-XXXXXX"); - temp.open(); - tempFileName = temp.fileName(); - } - const QString display = HostOsInfo::isWindowsHost() ? QString(getLocalIPv4Address() + ":0.0") : QString(":0"); - CommandLine dockerRun{"docker", {"run", "-i", "--cidfile=" + tempFileName, - "--rm", - "-e", QString("DISPLAY=%1").arg(display), - "-e", "XAUTHORITY=/.Xauthority", - "--net", "host"}}; + CommandLine dockerCreate{"docker", {"create", + "-i", + "--rm", + "-e", QString("DISPLAY=%1").arg(display), + "-e", "XAUTHORITY=/.Xauthority", + "--net", "host"}}; #ifdef Q_OS_UNIX + // no getuid() and getgid() on Windows. if (m_data.useLocalUidGid) - dockerRun.addArgs({"-u", QString("%1:%2").arg(getuid()).arg(getgid())}); + dockerCreate.addArgs({"-u", QString("%1:%2").arg(getuid()).arg(getgid())}); #endif for (QString mount : qAsConst(m_data.mounts)) { @@ -847,11 +841,25 @@ void DockerDevicePrivate::startContainer() const FilePath path = FilePath::fromUserInput(mountPath.path().mid(2)); // strip C: mount = '/' + lowerDriveLetter + path.path(); } - dockerRun.addArgs({"-v", mount + ':' + mount}); + dockerCreate.addArgs({"-v", mount + ':' + mount}); } - dockerRun.addArgs({"--entrypoint", "/bin/sh", m_data.imageId}); + dockerCreate.addArgs({"--entrypoint", "/bin/sh", m_data.imageId}); + LOG("RUNNING: " << dockerCreate.toUserOutput()); + QtcProcess createProcess; + createProcess.setCommand(dockerCreate); + createProcess.runBlocking(); + + if (createProcess.result() != QtcProcess::FinishedWithSuccess) + return; + + m_container = createProcess.stdOut().trimmed(); + if (m_container.isEmpty()) + return; + LOG("Container via process: " << m_container); + + CommandLine dockerRun{"docker", {"container" , "start", "-i", "-a", m_container}}; LOG("RUNNING: " << dockerRun.toUserOutput()); QPointer shell = new QtcProcess(ProcessMode::Writer); connect(shell, &QtcProcess::finished, this, [this, shell] { @@ -886,23 +894,6 @@ void DockerDevicePrivate::startContainer() return; } - LOG("CHECKING: " << tempFileName); - for (int i = 0; i <= 20; ++i) { - QFile file(tempFileName); - if (file.open(QIODevice::ReadOnly)) { - m_container = QString::fromUtf8(file.readAll()).trimmed(); - if (!m_container.isEmpty()) { - LOG("Container: " << m_container); - break; - } - } - if (i == 20 || !DockerPlugin::isDaemonRunning().value_or(true)) { - qWarning("Docker cid file empty."); - return; // No - } - qApp->processEvents(); // FIXME turn this for-loop into - QThread::msleep(100); - } DockerPlugin::setGlobalDaemonState(true); } From 47cb2e9d245db1cff18bea42512a1c1a717a43e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Thu, 8 Jul 2021 14:22:03 +0200 Subject: [PATCH 44/67] Squish: Update and stabilize tst_rename_file Change-Id: I1dae24e20d8c65b716dd988812eee013f0491603 Reviewed-by: Christian Stenger --- tests/system/suite_general/tst_rename_file/test.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/system/suite_general/tst_rename_file/test.py b/tests/system/suite_general/tst_rename_file/test.py index 5f867f1f983..413e0385b43 100644 --- a/tests/system/suite_general/tst_rename_file/test.py +++ b/tests/system/suite_general/tst_rename_file/test.py @@ -111,10 +111,18 @@ def renameFile(projectDir, proFile, branch, oldname, newname): " windowTitle='Rename More Files?'}}")) test.verify(waitFor("os.path.exists(newFilePath)", 1000), "Verify that file with new name exists: %s" % newFilePath) - test.compare(readFile(newFilePath), oldFileText, - "Comparing content of file before and after renaming") test.verify(waitFor("' ' + newname in safeReadFile(proFile)", 2000), "Verify that new filename '%s' was added to pro-file." % newname) + if oldname.endswith(".h"): + # Creator updates include guards in renamed header files and changes line breaks + oldFileText = oldFileText.replace("\r\n", "\n") + includeGuard = " " + newname.upper().replace(".", "_") + if not includeGuard.endswith("_H"): + includeGuard += "_H" + oldFileText = oldFileText.replace(" " + oldname.upper().replace(".", "_"), includeGuard) + waitFor("includeGuard in safeReadFile(newFilePath)", 2000) + test.compare(readFile(newFilePath), oldFileText, + "Comparing content of file before and after renaming") if oldname not in newname: test.verify(oldname not in readFile(proFile), "Verify that old filename '%s' was removed from pro-file." % oldname) From cbc9f4c4e1f4a64b33d8f516f25cf2ba21d2716e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Tue, 13 Jul 2021 00:31:49 +0200 Subject: [PATCH 45/67] Squish: Stabilize tst_rename_file It takes a moment until the changed file appears in the project tree. A context menu opened in that time may be in an unexpected state, so wait until the renaming finished properly. Change-Id: I6e1941083737b2df5855b9b0e61a973c99831304 Reviewed-by: Christian Stenger --- .../suite_general/tst_rename_file/test.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/tests/system/suite_general/tst_rename_file/test.py b/tests/system/suite_general/tst_rename_file/test.py index 413e0385b43..7d846d3013d 100644 --- a/tests/system/suite_general/tst_rename_file/test.py +++ b/tests/system/suite_general/tst_rename_file/test.py @@ -87,14 +87,16 @@ def renameFile(projectDir, proFile, branch, oldname, newname): oldFilePath = os.path.join(projectDir, oldname) newFilePath = os.path.join(projectDir, newname) oldFileText = readFile(oldFilePath) - itemText = branch + "." + oldname.replace(".", "\\.") + oldItemText = branch + "." + oldname.replace(".", "\\.") + newItemText = branch + "." + newname.replace(".", "\\.") treeview = waitForObject(":Qt Creator_Utils::NavigationTreeView") try: - openItemContextMenu(treeview, itemText, 5, 5, 0) + openItemContextMenu(treeview, oldItemText, 5, 5, 0) except: - itemWithWildcard = addBranchWildcardToRoot(itemText) - waitForObjectItem(treeview, itemWithWildcard, 10000) - openItemContextMenu(treeview, itemWithWildcard, 5, 5, 0) + oldItemText = addBranchWildcardToRoot(oldItemText) + newItemText = addBranchWildcardToRoot(newItemText) + waitForObjectItem(treeview, oldItemText, 10000) + openItemContextMenu(treeview, oldItemText, 5, 5, 0) if oldname.lower().endswith(".qrc"): menu = ":Qt Creator.Project.Menu.Folder_QMenu" else: @@ -130,6 +132,13 @@ def renameFile(projectDir, proFile, branch, oldname, newname): test.verify(oldname not in os.listdir(projectDir), "Verify that file with old name does not exist: %s" % oldFilePath) + if newItemText.endswith("\\.qml"): + newItemText = newItemText.replace(".Other files.", ".QML.") + else: + newItemText = newItemText.replace(".QML.", ".Other files.") + waitForObjectItem(treeview, newItemText) + + def safeReadFile(filename): text = "" while text == "": From cfc732fe8f5934da3beba50849d1a378c2efbc47 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 5 Oct 2021 18:16:27 +0200 Subject: [PATCH 46/67] QmlDesigner: Remove all references also to children If a node is deleted also children are deleted. We have to remove all references to children, too. Change-Id: Ie944b00ffc832fb0fb11ef0380c4b9b30add5757 Reviewed-by: Miikka Heikkinen --- .../qmldesigner/designercore/model/qmlobjectnode.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index c5ad9244a25..25f792e9088 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -368,6 +368,14 @@ static void removeLayerEnabled(const ModelNode &node) } } +static void deleteAllReferencesToNodeAndChildren(const ModelNode &node) +{ + BindingProperty::deleteAllReferencesTo(node); + const auto subNodes = node.allSubModelNodes(); + for (const ModelNode &child : subNodes) + BindingProperty::deleteAllReferencesTo(child); +} + /*! Deletes this object's node and its dependencies from the model. Everything that belongs to this Object, the ModelNode, and ChangeOperations @@ -406,7 +414,7 @@ void QmlObjectNode::destroy() } removeStateOperationsForChildren(modelNode()); - BindingProperty::deleteAllReferencesTo(modelNode()); + deleteAllReferencesToNodeAndChildren(modelNode()); QmlFlowViewNode root(view()->rootModelNode()); From cd453a5c67d210898fefcd9e36ac67e3c6069b00 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 7 Oct 2021 10:58:54 +0200 Subject: [PATCH 47/67] ClangCodeModel: Refer to clangd for the AST node under the cursor The question which concrete AST node corresponds to a given cursor position is surprisingly difficult to answer, and clangd already has a lot of code for this. Therefore, we always refer to clangd to get a concrete node, even if we already have the full AST. Change-Id: I5d1528d776ee459a53b8e650a616ea7019ec59bf Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 69 ++++++++++----------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index fb3efa95ecc..5b3e76bee8b 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -316,14 +316,6 @@ static QList getAstPath(const AstNode &root, const Range &range) return path; } -static AstNode getAstNode(const AstNode &root, const Range &range) -{ - const QList path = getAstPath(root, range); - if (!path.isEmpty()) - return path.last(); - return {}; -} - static Usage::Type getUsageType(const QList &path) { bool potentialWrite = false; @@ -926,7 +918,7 @@ public: using TextDocOrFile = const Utils::variant; using AstHandler = const std::function; MessageId getAndHandleAst(TextDocOrFile &doc, AstHandler &astHandler, - AstCallbackMode callbackMode); + AstCallbackMode callbackMode, const Range &range = {}); ClangdClient * const q; const CppEditor::ClangdSettings::Data settings; @@ -1571,16 +1563,16 @@ void ClangdClient::followSymbol(TextDocument *document, return; } - const auto astHandler = [this, id = d->followSymbolData->id, range = Range(cursor)] + const auto astHandler = [this, id = d->followSymbolData->id] (const AstNode &ast, const MessageId &) { qCDebug(clangdLog) << "received ast response for cursor"; if (!d->followSymbolData || d->followSymbolData->id != id) return; - d->followSymbolData->cursorNode = getAstNode(ast, range); + d->followSymbolData->cursorNode = ast; if (d->followSymbolData->defLink.hasValidTarget()) d->handleGotoDefinitionResult(); }; - d->getAndHandleAst(document, astHandler, Private::AstCallbackMode::SyncIfPossible); + d->getAndHandleAst(document, astHandler, Private::AstCallbackMode::AlwaysAsync, Range(cursor)); } void ClangdClient::switchDeclDef(TextDocument *document, const QTextCursor &cursor, @@ -2030,18 +2022,19 @@ void ClangdClient::Private::handleGotoImplementationResult( : TextDocOrFile(defLinkFilePath); const Position defLinkPos(followSymbolData->defLink.targetLine - 1, followSymbolData->defLink.targetColumn); - const auto astHandler = [this, range = Range(defLinkPos, defLinkPos), id = followSymbolData->id] + const auto astHandler = [this, id = followSymbolData->id] (const AstNode &ast, const MessageId &) { qCDebug(clangdLog) << "received ast response for def link"; if (!followSymbolData || followSymbolData->id != id) return; - followSymbolData->defLinkNode = getAstNode(ast, range); + followSymbolData->defLinkNode = ast; if (followSymbolData->pendingSymbolInfoRequests.isEmpty() && followSymbolData->pendingGotoDefRequests.isEmpty()) { handleDocumentInfoResults(); } }; - getAndHandleAst(defLinkDocVariant, astHandler, AstCallbackMode::SyncIfPossible); + getAndHandleAst(defLinkDocVariant, astHandler, AstCallbackMode::AlwaysAsync, + Range(defLinkPos, defLinkPos)); } void ClangdClient::Private::handleDocumentInfoResults() @@ -2727,26 +2720,30 @@ void ClangdCompletionItem::apply(TextDocumentManipulatorInterface &manipulator, MessageId ClangdClient::Private::getAndHandleAst(const TextDocOrFile &doc, const AstHandler &astHandler, - AstCallbackMode callbackMode) + AstCallbackMode callbackMode, const Range &range) { const auto textDocPtr = Utils::get_if(&doc); const TextDocument * const textDoc = textDocPtr ? *textDocPtr : nullptr; const Utils::FilePath filePath = textDoc ? textDoc->filePath() : Utils::get(doc); - // If the document's AST is in the cache and is up to date, call the handler. - if (const auto ast = textDoc ? astCache.get(textDoc) : externalAstCache.get(filePath)) { - qCDebug(clangdLog) << "using AST from cache"; - switch (callbackMode) { - case AstCallbackMode::SyncIfPossible: - astHandler(*ast, {}); - break; - case AstCallbackMode::AlwaysAsync: - QMetaObject::invokeMethod(q, [ast, astHandler] { astHandler(*ast, {}); }, + // If the entire AST is requested and the document's AST is in the cache and it is up to date, + // call the handler. + const bool fullAstRequested = !range.isValid(); + if (fullAstRequested) { + if (const auto ast = textDoc ? astCache.get(textDoc) : externalAstCache.get(filePath)) { + qCDebug(clangdLog) << "using AST from cache"; + switch (callbackMode) { + case AstCallbackMode::SyncIfPossible: + astHandler(*ast, {}); + break; + case AstCallbackMode::AlwaysAsync: + QMetaObject::invokeMethod(q, [ast, astHandler] { astHandler(*ast, {}); }, Qt::QueuedConnection); - break; + break; + } + return {}; } - return {}; } // Otherwise retrieve the AST from clangd. @@ -2754,7 +2751,6 @@ MessageId ClangdClient::Private::getAndHandleAst(const TextDocOrFile &doc, class AstParams : public JsonObject { public: - AstParams() {} AstParams(const TextDocumentIdentifier &document, const Range &range = {}) { setTextDocument(document); @@ -2784,19 +2780,22 @@ MessageId ClangdClient::Private::getAndHandleAst(const TextDocOrFile &doc, explicit AstRequest(const AstParams ¶ms) : Request("textDocument/ast", params) {} }; - AstRequest request(AstParams(TextDocumentIdentifier(DocumentUri::fromFilePath(filePath)))); + AstRequest request(AstParams(TextDocumentIdentifier(DocumentUri::fromFilePath(filePath)), + range)); request.setResponseCallback([this, filePath, guardedTextDoc = QPointer(textDoc), astHandler, - docRev = textDoc ? getRevision(textDoc) : -1, + fullAstRequested, docRev = textDoc ? getRevision(textDoc) : -1, fileRev = getRevision(filePath), reqId = request.id()] (AstRequest::Response response) { qCDebug(clangdLog) << "retrieved AST from clangd"; const auto result = response.result(); const AstNode ast = result ? *result : AstNode(); - if (guardedTextDoc) { - if (docRev == getRevision(guardedTextDoc)) - astCache.insert(guardedTextDoc, ast); - } else if (fileRev == getRevision(filePath) && !q->documentForFilePath(filePath)) { - externalAstCache.insert(filePath, ast); + if (fullAstRequested) { + if (guardedTextDoc) { + if (docRev == getRevision(guardedTextDoc)) + astCache.insert(guardedTextDoc, ast); + } else if (fileRev == getRevision(filePath) && !q->documentForFilePath(filePath)) { + externalAstCache.insert(filePath, ast); + } } astHandler(ast, reqId); }); From 824b4db70ccdd48cdef523f5a2806e1fe60f661e Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 6 Oct 2021 19:44:58 +0200 Subject: [PATCH 48/67] GitHub Actions: Update Qt to 6.2.0 Change-Id: I657838699d95adc48c1b5b9b8e091a53369890f7 Reviewed-by: Eike Ziller --- .github/workflows/build_cmake.yml | 49 ++++++++++++++++--------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index e3a77501192..15cab0d19f0 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -3,7 +3,7 @@ name: CMake Build Matrix on: [push, pull_request] env: - QT_VERSION: 5.15.2 + QT_VERSION: 6.2.0 CLANG_VERSION: 130 ELFUTILS_VERSION: 0.175 CMAKE_VERSION: 3.21.1 @@ -111,24 +111,20 @@ jobs: set(qt_package_arch_suffix "win64_msvc2019_64") set(qt_dir_prefix "${qt_version}/msvc2019_64") set(qt_package_suffix "-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64") - elseif ("${{ matrix.config.environment_script }}" MATCHES "vcvars32.bat") - set(qt_package_arch_suffix "win32_msvc2019") - set(qt_dir_prefix "${qt_version}/msvc2019") - set(qt_package_suffix "-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86") endif() elseif ("${{ runner.os }}" STREQUAL "Linux") set(url_os "linux_x64") set(qt_package_arch_suffix "gcc_64") set(qt_dir_prefix "${qt_version}/gcc_64") - set(qt_package_suffix "-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64") + set(qt_package_suffix "-Linux-RHEL_8_2-GCC-Linux-RHEL_8_2-X86_64") elseif ("${{ runner.os }}" STREQUAL "macOS") set(url_os "mac_x64") set(qt_package_arch_suffix "clang_64") - set(qt_dir_prefix "${qt_version}/clang_64") - set(qt_package_suffix "-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64") + set(qt_dir_prefix "${qt_version}/macos") + set(qt_package_suffix "-MacOS-MacOS_11_00-Clang-MacOS-MacOS_11_00-X86_64-ARM64") endif() - set(qt_base_url "https://\${qt_mirror}/online/qtsdkrepository/${url_os}/desktop/qt5_${qt_version_dotless}") + set(qt_base_url "https://\${qt_mirror}/online/qtsdkrepository/${url_os}/desktop/qt6_${qt_version_dotless}") foreach(qt_mirror $ENV{QT_MIRRORS}) cmake_language(EVAL CODE " message(\"Downloading: ${qt_base_url}/Updates.xml\") @@ -141,13 +137,13 @@ jobs: endforeach() file(READ ./Updates.xml updates_xml) - string(REGEX MATCH "qt.qt5.*([0-9+-.]+)" updates_xml_output "${updates_xml}") + string(REGEX MATCH "qt.qt6.*([0-9+-.]+)" updates_xml_output "${updates_xml}") set(qt_package_version ${CMAKE_MATCH_1}) - file(MAKE_DIRECTORY qt5) + file(MAKE_DIRECTORY qt6) # Save the path for other steps - file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/qt5/${qt_dir_prefix}" qt_dir) + file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/qt6/${qt_dir_prefix}" qt_dir) message("::set-output name=qt_dir::${qt_dir}") function(downloadAndExtract url archive) @@ -161,19 +157,26 @@ jobs: break() endif() endforeach() - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${archive} WORKING_DIRECTORY qt5) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${archive} WORKING_DIRECTORY qt6) endfunction() - foreach(package qtbase qtdeclarative qttools qtsvg qtserialport qtquickcontrols qtquickcontrols2 qtgraphicaleffects qtlocation qtimageformats qttranslations) + foreach(package qtbase qtdeclarative qttools qtsvg qttranslations) downloadAndExtract( - "${qt_base_url}/qt.qt5.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z" + "${qt_base_url}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z" ${package}.7z ) endforeach() - foreach(package qtquicktimeline qtquick3d qtscript) + foreach(package qtimageformats qtserialport) downloadAndExtract( - "${qt_base_url}/qt.qt5.${qt_version_dotless}.${package}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z" + "${qt_base_url}/qt.qt6.${qt_version_dotless}.addons.${package}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z" + ${package}.7z + ) + endforeach() + + foreach(package qtquicktimeline qtquick3d qt5compat qtshadertools) + downloadAndExtract( + "${qt_base_url}/qt.qt6.${qt_version_dotless}.${package}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z" ${package}.7z ) endforeach() @@ -181,17 +184,17 @@ jobs: # uic depends on libicu56.so if ("${{ runner.os }}" STREQUAL "Linux") downloadAndExtract( - "${qt_base_url}/qt.qt5.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}icu-linux-Rhel7.2-x64.7z" + "${qt_base_url}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}icu-linux-Rhel7.2-x64.7z" icu.7z ) endif() - file(READ "qt5/${qt_dir_prefix}/mkspecs/qconfig.pri" qtconfig) + file(READ "qt6/${qt_dir_prefix}/mkspecs/qconfig.pri" qtconfig) string(REPLACE "Enterprise" "OpenSource" qtconfig "${qtconfig}") string(REPLACE "licheck.exe" "" qtconfig "${qtconfig}") string(REPLACE "licheck64" "" qtconfig "${qtconfig}") string(REPLACE "licheck_mac" "" qtconfig "${qtconfig}") - file(WRITE "qt5/${qt_dir_prefix}/mkspecs/qconfig.pri" "${qtconfig}") + file(WRITE "qt6/${qt_dir_prefix}/mkspecs/qconfig.pri" "${qtconfig}") if ("${{ runner.os }}" STREQUAL "Windows") # deploy "system" runtimes into Qt, so they get deployed as well @@ -199,7 +202,7 @@ jobs: # deploy MinGW foreach(file libwinpthread-1.dll libstdc++-6.dll libgcc_s_seh-1.dll) file(INSTALL "C:/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin/${file}" - DESTINATION "qt5/${qt_dir_prefix}/bin" + DESTINATION "qt6/${qt_dir_prefix}/bin" USE_SOURCE_PERMISSIONS) endforeach() else() @@ -207,7 +210,7 @@ jobs: foreach(file vcruntime140.dll concrt140.dll msvcp140_1.dll msvcp140_2.dll msvcp140_codecvt_ids.dll vcruntime140_1.dll msvcp140.dll) file(INSTALL "C:/Windows/System32/${file}" - DESTINATION "qt5/${qt_dir_prefix}/bin") + DESTINATION "qt6/${qt_dir_prefix}/bin") endforeach() endif() endif() @@ -377,7 +380,7 @@ jobs: COMMAND sudo apt update ) execute_process( - COMMAND sudo apt install libgl1-mesa-dev + COMMAND sudo apt install libgl1-mesa-dev libvulkan-dev libxcb-xinput-dev libxcb-xinerama0-dev libxkbcommon-dev libxkbcommon-x11-dev RESULT_VARIABLE result ) if (NOT result EQUAL 0) From 28b87ba4f4b84a89171527cd57c8c5cc7ed27aeb Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Wed, 6 Oct 2021 17:17:10 +0200 Subject: [PATCH 49/67] Fix check if a key is supposed for deletion Moved the function into timelineutils.h in order to be able to use it from other places as well. Change-Id: If5fa094abb6ae52d7922bc9bbcb96b482ece7ac0 Reviewed-by: Cristian Adam Reviewed-by: Thomas Hartmann Reviewed-by: Qt CI Bot --- .../timelineeditor/timelinegraphicsscene.cpp | 9 ++------- .../components/timelineeditor/timelineutils.h | 5 +++++ .../transitioneditorgraphicsscene.cpp | 11 ++--------- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index b3150e1e832..ad2dfd88f68 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -70,11 +70,6 @@ namespace QmlDesigner { -static bool isDeleteKey(int key) -{ - return (key == Qt::Key_Backspace) | (key == Qt::Key_Delete); -} - QList allTimelineFrames(const QmlTimeline &timeline) { QList returnList; @@ -671,7 +666,7 @@ void TimelineGraphicsScene::keyReleaseEvent(QKeyEvent *keyEvent) return; } - if (isDeleteKey(keyEvent->key())) + if (TimelineUtils::isDeleteKey(keyEvent->key())) handleKeyframeDeletion(); QGraphicsScene::keyReleaseEvent(keyEvent); @@ -835,7 +830,7 @@ bool TimelineGraphicsScene::event(QEvent *event) { switch (event->type()) { case QEvent::ShortcutOverride: - if (isDeleteKey(static_cast(event)->key())) { + if (TimelineUtils::isDeleteKey(static_cast(event)->key())) { QGraphicsScene::keyPressEvent(static_cast(event)); event->accept(); return true; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineutils.h b/src/plugins/qmldesigner/components/timelineeditor/timelineutils.h index ec0f4cec5b6..b31bd8f4222 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineutils.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineutils.h @@ -39,6 +39,11 @@ namespace TimelineUtils { enum class Side { Top, Right, Bottom, Left }; +inline bool isDeleteKey(int key) +{ + return (key == Qt::Key_Backspace) || (key == Qt::Key_Delete); +} + template inline T clamp(const T &value, const T &lo, const T &hi) { diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp index ab82744cc67..e2b95783569 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp @@ -39,6 +39,7 @@ #include "timelineplaceholder.h" #include "timelinepropertyitem.h" #include "timelinesectionitem.h" +#include "timelineutils.h" #include #include @@ -73,14 +74,6 @@ namespace QmlDesigner { -static int deleteKey() -{ - if (Utils::HostOsInfo::isMacHost()) - return Qt::Key_Backspace; - - return Qt::Key_Delete; -} - TransitionEditorGraphicsScene::TransitionEditorGraphicsScene(TransitionEditorWidget *parent) : AbstractScrollGraphicsScene(parent) , m_parent(parent) @@ -459,7 +452,7 @@ bool TransitionEditorGraphicsScene::event(QEvent *event) { switch (event->type()) { case QEvent::ShortcutOverride: - if (static_cast(event)->key() == deleteKey()) { + if (TimelineUtils::isDeleteKey(static_cast(event)->key())) { QGraphicsScene::keyPressEvent(static_cast(event)); event->accept(); return true; From 50557abd03cb57ec414b9e7d15c154b6748eccfa Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 5 Oct 2021 10:29:32 +0200 Subject: [PATCH 50/67] QmlDesigner: Fix crash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the target cannot be resolved the result is invalid. Task-number: QDS-5216 Change-Id: Ibd7884d6638ae653953347862ca1291f963aa3b3 Reviewed-by: Henning Gründl --- .../qmldesigner/components/stateseditor/stateseditorview.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 12fff40c798..997852cfb25 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -46,6 +46,7 @@ #include #include #include +#include namespace QmlDesigner { @@ -103,6 +104,7 @@ void StatesEditorView::removeState(int nodeId) const auto propertyChanges = modelState.propertyChanges(); for (const QmlPropertyChanges &change : propertyChanges) { const ModelNode target = change.target(); + QTC_ASSERT(target.isValid(), continue); if (target.locked()) lockedTargets.push_back(target.id()); } From 8f974cd1c533e20684df80bcee8c06a94ee7b868 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 6 Oct 2021 12:56:00 +0200 Subject: [PATCH 51/67] QmlDesigner: Implement new functions in QmlObjectNode and QmlTimelineKeyframeGroup * QmlObjectNode::allInvalidStateOperations * QmlTimelineKeyframeGroup::allInvalidTimelineKeyframeGroups These functions make it easy to find dangling/invalid PropertyChanges and KeyFrameGroups. Change-Id: I201a6561a51aba53405e8a8fc92821c467fecb1b Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot --- .../designercore/include/qmlobjectnode.h | 5 ++-- .../designercore/include/qmlstate.h | 1 + .../include/qmltimelinekeyframegroup.h | 3 +++ .../designercore/model/qmlobjectnode.cpp | 10 ++++++++ .../designercore/model/qmlstate.cpp | 7 ++++++ .../model/qmltimelinekeyframegroup.cpp | 23 +++++++++++++++++++ 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index 59f99bbe398..7b1cfbe86e1 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -128,14 +128,13 @@ public: virtual bool isBlocked(const PropertyName &propName) const; friend auto qHash(const QmlObjectNode &node) { return qHash(node.modelNode()); } + QList allDefinedStates() const; + QList allInvalidStateOperations() const; protected: NodeInstance nodeInstance() const; QmlObjectNode nodeForInstance(const NodeInstance &instance) const; QmlItemNode itemForInstance(const NodeInstance &instance) const; - -protected: - QList allDefinedStates() const; }; QMLDESIGNERCORE_EXPORT QList toModelNodeList(const QList &fxObjectNodeList); diff --git a/src/plugins/qmldesigner/designercore/include/qmlstate.h b/src/plugins/qmldesigner/designercore/include/qmlstate.h index bd0aad854ba..ce9a8bf3f74 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlstate.h +++ b/src/plugins/qmldesigner/designercore/include/qmlstate.h @@ -50,6 +50,7 @@ public: QList stateOperations(const ModelNode &node) const; QList propertyChanges() const; QList stateOperations() const; + QList allInvalidStateOperations() const; bool hasPropertyChanges(const ModelNode &node) const; diff --git a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h index a20eeae55eb..6aee5ea0d58 100644 --- a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h +++ b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h @@ -72,6 +72,7 @@ public: static bool isValidKeyframe(const ModelNode &node); static bool checkKeyframesType(const ModelNode &node); static QmlTimelineKeyframeGroup keyframeGroupForKeyframe(const ModelNode &node); + static QList allInvalidTimelineKeyframeGroups(AbstractView *view); void moveAllKeyframes(qreal offset); void scaleAllKeyframes(qreal factor); @@ -84,6 +85,8 @@ public: void toogleRecording(bool b) const; QmlTimeline timeline() const; + + bool isDangling() const; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 25f792e9088..72dad6afc68 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -523,6 +523,16 @@ QList QmlObjectNode::allDefinedStates() const return returnList; } +QList QmlObjectNode::allInvalidStateOperations() const +{ + QList result; + + const auto allStates = allDefinedStates(); + for (const auto &state : allStates) + result.append(state.allInvalidStateOperations()); + return result; +} + /*! Removes a variant property of the object specified by \a name from the diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp index ea15ba1d819..26fff118d2a 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp @@ -34,6 +34,7 @@ #include "qmlitemnode.h" #include "annotation.h" +#include #include namespace QmlDesigner { @@ -136,6 +137,12 @@ QList QmlModelState::stateOperations() const return returnList; } +QList QmlModelState::allInvalidStateOperations() const +{ + return Utils::filtered(stateOperations(), [](const QmlModelStateOperation &operation) { + return !operation.target().isValid(); + }); +} /*! Adds a change set for \a node to this state, but only if it does not diff --git a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp index ad0855ad955..85eb51de448 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp @@ -153,6 +153,13 @@ QmlTimeline QmlTimelineKeyframeGroup::timeline() const return {}; } +bool QmlTimelineKeyframeGroup::isDangling() const +{ + QTC_ASSERT(isValid(), return false); + + return !target().isValid() || keyframes().isEmpty(); +} + void QmlTimelineKeyframeGroup::setValue(const QVariant &value, qreal currentFrame) { QTC_ASSERT(isValid(), return ); @@ -294,6 +301,22 @@ QmlTimelineKeyframeGroup QmlTimelineKeyframeGroup::keyframeGroupForKeyframe(cons return QmlTimelineKeyframeGroup(); } +QList QmlTimelineKeyframeGroup::allInvalidTimelineKeyframeGroups(AbstractView *view) +{ + QList ret; + + QTC_ASSERT(view, return ret); + QTC_ASSERT(view->model(), return ret); + QTC_ASSERT(view->rootModelNode().isValid(), return ret); + + const auto groups = view->rootModelNode().subModelNodesOfType("QtQuick.Timeline.KeyframeGroup"); + for (const QmlTimelineKeyframeGroup &group : groups) { + if (group.isDangling()) + ret.append(group); + } + return ret; +} + void QmlTimelineKeyframeGroup::moveAllKeyframes(qreal offset) { for (const ModelNode &childNode : modelNode().defaultNodeListProperty().toModelNodeList()) { From 4bea534c62eb8b36d4c2e6a2681a14c2bea349a4 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 7 Oct 2021 12:03:56 +0200 Subject: [PATCH 52/67] CMakePM: Do not register qch files from device Change-Id: Ie6f8ce74d500d18b69fd5017ddd820356515c21a Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/cmaketool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index 51daa1bb5f3..d407adeb66a 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -360,7 +360,7 @@ Utils::optional CMakeTool::readerType() const FilePath CMakeTool::searchQchFile(const FilePath &executable) { - if (executable.isEmpty()) + if (executable.isEmpty() || executable.needsDevice()) // do not register docs from devices return {}; FilePath prefixDir = executable.parentDir().parentDir(); From 69fbe0ab906fe877a3aac8863492bf66f4e6073a Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 7 Oct 2021 10:23:34 +0200 Subject: [PATCH 53/67] ImageViewer: Fix crash when opening invalid movie MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Qt 6 sends the finished signal directly from QMovie::start, so if we connect QMovie::finished directly to QMovie::start, we end up in an endless recursion and stack exhaustion. Use a queued connection, and do not restart a movie if it went invalid. Fixes: QTCREATORBUG-26377 Change-Id: I9980615f44d0cf7e92f85c010427bd6b67046949 Reviewed-by: Robert Löhning Reviewed-by: Alessandro Portale Reviewed-by: Qt CI Bot --- src/plugins/imageviewer/imageviewerfile.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/plugins/imageviewer/imageviewerfile.cpp b/src/plugins/imageviewer/imageviewerfile.cpp index 2a6204e11d8..3fe26890d0d 100644 --- a/src/plugins/imageviewer/imageviewerfile.cpp +++ b/src/plugins/imageviewer/imageviewerfile.cpp @@ -126,7 +126,15 @@ Core::IDocument::OpenResult ImageViewerFile::openImpl(QString *errorString, m_type = TypeMovie; m_movie = new QMovie(fileName, QByteArray(), this); m_movie->setCacheMode(QMovie::CacheAll); - connect(m_movie, &QMovie::finished, m_movie, &QMovie::start); + connect( + m_movie, + &QMovie::finished, + m_movie, + [this] { + if (m_movie->isValid()) + m_movie->start(); + }, + Qt::QueuedConnection); connect(m_movie, &QMovie::resized, this, &ImageViewerFile::imageSizeChanged); m_movie->start(); m_isPaused = false; // force update From 0b96a1b76b869d8227e10ec1dd6aa9c21ba5ff13 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 6 Oct 2021 11:35:05 +0200 Subject: [PATCH 54/67] Ignore the wheel event explicitly in order to propagate it further MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Qt 6 brings a behavioral change regarding delivery of wheel events: 92df790f46b3a8b17aec2f385d6472fd3f8647f6 and 2a857ee28315c5bacfe2ecaf402ca9005b35c20e. If there is an event filter installed and wheel event is being processed, the event is now accepted by default, which means that after returning true from eventFilter(), the event is not propagated anymore. Since we want to redirect the event to the parent HelpViewer object, we explicitly ignore the event prior to returning true. Task-number: QTCREATORBUG-26369 Change-Id: I2fc8b7c8bfbc343a9ca7951684ced405f8a55039 Reviewed-by: Robert Löhning --- src/plugins/help/litehtmlhelpviewer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/help/litehtmlhelpviewer.cpp b/src/plugins/help/litehtmlhelpviewer.cpp index c33ebf62ef5..8d54e01b69c 100644 --- a/src/plugins/help/litehtmlhelpviewer.cpp +++ b/src/plugins/help/litehtmlhelpviewer.cpp @@ -235,8 +235,10 @@ bool LiteHtmlHelpViewer::eventFilter(QObject *src, QEvent *e) { if (isScrollWheelZoomingEnabled() && e->type() == QEvent::Wheel) { auto we = static_cast(e); - if (we->modifiers() == Qt::ControlModifier) + if (we->modifiers() == Qt::ControlModifier) { + e->ignore(); return true; + } } return HelpViewer::eventFilter(src, e); } From 5156c8b510cedc888d5b489d52ef18f098979543 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 7 Oct 2021 14:47:46 +0200 Subject: [PATCH 55/67] ProjectExplorer: Fix unsafe kit removal procedure We iterated through a list that was in the middle of a std::remove(), which is not safe. Change-Id: I2b4bce18ebe3365fd22f33521aa82868c10e9647 Reviewed-by: David Schulz --- src/plugins/projectexplorer/kitmanager.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index 3f77fee4141..1c338d730a7 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -238,12 +238,15 @@ void KitManager::restoreKits() kitsToCheck.clear(); // Remove replacement kits for which the original kit has turned up again. - Utils::erase(resultList, [&resultList](const std::unique_ptr &k) { - return k->isReplacementKit() - && contains(resultList, [&k](const std::unique_ptr &other) { - return other->id() == k->id() && other != k; - }); - }); + for (auto it = resultList.begin(); it != resultList.end();) { + const auto &k = *it; + if (k->isReplacementKit() && contains(resultList, [&k](const std::unique_ptr &other) { + return other->id() == k->id() && other != k; })) { + it = resultList.erase(it); + } else { + ++it; + } + } static const auto kitMatchesAbiList = [](const Kit *kit, const Abis &abis) { const QList toolchains = ToolChainKitAspect::toolChains(kit); From 19b59f88d247b49b4a20609eeaee3cb972cfdf35 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 6 Oct 2021 15:05:35 +0200 Subject: [PATCH 56/67] Fix that .ui files could be opened in C++ editor The glob "*.ui" is unfortunately not unique in the mime database, so it falls back to using the mime magic to determine the mime type. That process is unfortunately defined by the "standard" in a most useless way: Even if a mime type matches both by glob and by mime magic, a mime type that does not match by glob can be preferred, if its mime magic matches either with a higher priority, or with the same priority but is alphabetically "smaller" than the other mime type. Reduce the priority of the "#include" mime magic for the text/x-c++hdr mime type, so it is lower than the mime magic of the application/x- designer mime type. Fixes: QTCREATORBUG-21773 Change-Id: Idfb9ab509c13563b50381b098d643f6fa9292f27 Reviewed-by: Christian Kandeler Reviewed-by: David Schulz --- src/plugins/cppeditor/CppEditor.json.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cppeditor/CppEditor.json.in b/src/plugins/cppeditor/CppEditor.json.in index 437e85c35f8..b3c0149291b 100644 --- a/src/plugins/cppeditor/CppEditor.json.in +++ b/src/plugins/cppeditor/CppEditor.json.in @@ -61,7 +61,7 @@ \" \", - \" \", + \" \", \" \", \" \", \" \", From 0786e967ddb52a2c744576ae9dbc7ec4844b9581 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 7 Oct 2021 11:57:29 +0200 Subject: [PATCH 57/67] Core: Prevent contents of Popups being styled as "panelwidgets" Content of widgets with windowType Qt::Dialog was already excluded from being styled as "panelwidgets". This change adds Qt::Popup to the blacklist. Task-number: QTCREATORBUG-26370 Change-Id: I76d07da4d8f3ae9f1c8235cdc072a04917454065 Reviewed-by: Jarek Kobus Reviewed-by: Eike Ziller --- src/plugins/coreplugin/manhattanstyle.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp index 9a8934b989f..50837d9f153 100644 --- a/src/plugins/coreplugin/manhattanstyle.cpp +++ b/src/plugins/coreplugin/manhattanstyle.cpp @@ -73,14 +73,20 @@ bool styleEnabled(const QWidget *widget) return true; } +static bool isInDialogOrPopup(const QWidget *widget) +{ + // Do not style dialogs or explicitly ignored widgets + const Qt::WindowType windowType = widget->window()->windowType(); + return (windowType == Qt::Dialog || windowType == Qt::Popup); +} + // Consider making this a QStyle state bool panelWidget(const QWidget *widget) { if (!widget) return false; - // Do not style dialogs or explicitly ignored widgets - if ((widget->window()->windowFlags() & Qt::WindowType_Mask) == Qt::Dialog) + if (isInDialogOrPopup(widget)) return false; if (qobject_cast(widget)) @@ -107,8 +113,7 @@ bool lightColored(const QWidget *widget) if (!widget) return false; - // Don't style dialogs or explicitly ignored widgets - if ((widget->window()->windowFlags() & Qt::WindowType_Mask) == Qt::Dialog) + if (isInDialogOrPopup(widget)) return false; const QWidget *p = widget; From 21a90d53329e12f51964c84f7a34f44631355506 Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Thu, 7 Oct 2021 16:05:54 +0300 Subject: [PATCH 58/67] Update Qbs submodule to the top of 1.21 branch Change-Id: Ic97122e5b029ce854b24c641b764ea9910e3a2e4 Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 4592eff2898..a35ff56175c 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 4592eff289852e3e5a81596d1cc6b0c2488e6bc0 +Subproject commit a35ff56175cc8c993b54bb1d92ff71ba4532fc88 From df904decd040160ddd1a33b0f2597d094da0d8f2 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Sun, 3 Oct 2021 13:40:00 +0300 Subject: [PATCH 59/67] Android: correct label for build platform sdk in project settings The current label could be confused with build-tools version, so make it more explicit. Change-Id: I96abe9af04e6a6e8518926578411f759b90fc9a0 Reviewed-by: Alessandro Portale Reviewed-by: Leena Miettinen --- src/plugins/android/androidbuildapkstep.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 9e938db11b1..dc6b42754c1 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -196,7 +196,7 @@ QWidget *AndroidBuildApkWidget::createApplicationGroup() }); auto formLayout = new QFormLayout(group); - formLayout->addRow(tr("Android build SDK:"), targetSDKComboBox); + formLayout->addRow(tr("Android build platform SDK:"), targetSDKComboBox); auto createAndroidTemplatesButton = new QPushButton(tr("Create Templates")); createAndroidTemplatesButton->setToolTip( From 8770c8674d7ea46864a541e00fbf2df6d3256aee Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 5 Oct 2021 18:15:48 +0200 Subject: [PATCH 60/67] QmlDesigner: Delete animations if target is deleted Task-number: QDS-5221 Change-Id: I98d1a370bf73ef298d3f309d0129b85e2147de6a Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../designercore/model/qmlobjectnode.cpp | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 72dad6afc68..55305c72d17 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -338,6 +338,48 @@ static void removeStateOperationsForChildren(const QmlObjectNode &node) } } +static void removeAnimationsFromAnimation(const ModelNode &animation) +{ + QTC_ASSERT(animation.isValid(), return); + + const QList propertyAnimations = animation.subModelNodesOfType( + "QtQuick.PropertyAnimation"); + + for (const ModelNode &child : propertyAnimations) { + if (!child.hasBindingProperty("target")) { + ModelNode nonConst = animation; + nonConst.destroy(); + return; + } + } +} + +static void removeAnimationsFromTransition(const ModelNode &transition, const QmlObjectNode &node) +{ + QTC_ASSERT(node.isValid(), return); + QTC_ASSERT(transition.isValid(), return); + + const auto children = transition.directSubModelNodes(); + for (const ModelNode ¶llel : children) + removeAnimationsFromAnimation(parallel); +} + +static void removeDanglingAnimationsFromTransitions(const QmlObjectNode &node) +{ + QTC_ASSERT(node.isValid(), return); + + auto root = node.view()->rootModelNode(); + + if (root.isValid() && root.hasProperty("transitions")) { + NodeAbstractProperty transitions = root.nodeAbstractProperty("transitions"); + if (transitions.isValid()) { + const auto transitionNodes = transitions.directSubNodes(); + for (const auto &transition : transitionNodes) + removeAnimationsFromTransition(transition, node); + } + } +} + static void removeAliasExports(const QmlObjectNode &node) { @@ -416,6 +458,8 @@ void QmlObjectNode::destroy() removeStateOperationsForChildren(modelNode()); deleteAllReferencesToNodeAndChildren(modelNode()); + removeDanglingAnimationsFromTransitions(modelNode()); + QmlFlowViewNode root(view()->rootModelNode()); modelNode().destroy(); From 56de449b17e744c2633959f14c4f8e12d4e8de0c Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Wed, 6 Oct 2021 11:10:36 +0300 Subject: [PATCH 61/67] QmlDesigner: Add dropped 3D models to the 3D Editor When dragging 3D model file(s) from the file system and dropping them on the 3D Editor, add the models the the 3D Editor after importing them. Change-Id: I51ec945097a19e8895eb599b898d49e879100b6d Reviewed-by: Miikka Heikkinen Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../componentcore/componentcore_constants.h | 2 ++ .../components/edit3d/edit3dwidget.cpp | 28 ++++++++++++++----- .../itemlibrary/itemlibraryview.cpp | 17 ++++++----- .../designercore/include/itemlibraryinfo.h | 3 +- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index 352c8796b41..49505d2ca7d 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -223,6 +223,8 @@ const char addFontsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources" const char addSoundsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Sound Files"); const char addShadersDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Shader Files"); const char add3DAssetsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "3D Assets"); +const char addQt3DSPresentationsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", + "Qt 3D Studio Presentations"); const char addCustomEffectDialogDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Add Custom Effect"); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 025b6227893..835ba07b5b2 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -23,14 +23,15 @@ ** ****************************************************************************/ -#include "edit3dwidget.h" -#include "edit3dview.h" -#include "edit3dcanvas.h" -#include "edit3dactions.h" - -#include "qmldesignerplugin.h" #include "designersettings.h" +#include "edit3dactions.h" +#include "edit3dcanvas.h" +#include "edit3dview.h" +#include "edit3dwidget.h" +#include "metainfo.h" #include "qmldesignerconstants.h" +#include "qmldesignerplugin.h" +#include "qmlvisualnode.h" #include "viewmanager.h" #include @@ -174,7 +175,20 @@ void Edit3DWidget::dropEvent(QDropEvent *dropEvent) { const DesignerActionManager &actionManager = QmlDesignerPlugin::instance() ->viewManager().designerActionManager(); - actionManager.handleExternalAssetsDrop(dropEvent->mimeData()); + QHash addedAssets = actionManager.handleExternalAssetsDrop(dropEvent->mimeData()); + + // add 3D assets to 3d editor (QtQuick3D import will be added if missing) + ItemLibraryInfo *itemLibInfo = m_view->model()->metaInfo().itemLibraryInfo(); + + const QStringList added3DAssets = addedAssets.value(ComponentCoreConstants::add3DAssetsDisplayString); + for (const QString &assetPath : added3DAssets) { + QString fileName = QFileInfo(assetPath).baseName(); + fileName = fileName.at(0).toUpper() + fileName.mid(1); // capitalize first letter + QString type = QString("Quick3DAssets.%1.%1").arg(fileName); + QList entriesForType = itemLibInfo->entriesForType(type.toLatin1()); + if (!entriesForType.isEmpty()) // should always be true, but just in case + QmlVisualNode::createQml3DNode(view(), entriesForType.at(0), m_canvas->activeScene()).modelNode(); + } } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 52d52d14823..06b84d83f8b 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -240,9 +240,6 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) DesignerActionManager *actionManager = &QmlDesignerPlugin::instance()->viewManager().designerActionManager(); - // All things importable by QSSGAssetImportManager are considered to be in the same category - // so we don't get multiple separate import dialogs when different file types are imported. - if (!m_importableExtensions3DMap.isEmpty()) actionManager->unregisterAddResourceHandlers(ComponentCoreConstants::add3DAssetsDisplayString); @@ -253,22 +250,28 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) m_importableExtensions3DMap, m_importOptions3DMap, {}, {}, Core::ICore::mainWindow()); - importDlg->show(); + importDlg->exec(); return true; }; - auto add3DHandler = [&](const QString &ext) { + auto add3DHandler = [&](const QString &group, const QString &ext) { const QString filter = QStringLiteral("*.%1").arg(ext); actionManager->registerAddResourceHandler( - AddResourceHandler(ComponentCoreConstants::add3DAssetsDisplayString, filter, + AddResourceHandler(group, filter, import3DModelOperation, 10)); }; + const QHash groupNames { + {"3D Scene", ComponentCoreConstants::add3DAssetsDisplayString}, + {"Qt 3D Studio Presentation", ComponentCoreConstants::addQt3DSPresentationsDisplayString} + }; + const auto groups = extMap.keys(); for (const auto &group : groups) { const QStringList exts = extMap[group].toStringList(); + const QString grp = groupNames.contains(group) ? groupNames.value(group) : group; for (const auto &ext : exts) - add3DHandler(ext); + add3DHandler(grp, ext); } } diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h index c44467f002a..8244fbb4895 100644 --- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h +++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h @@ -100,7 +100,8 @@ class QMLDESIGNERCORE_EXPORT ItemLibraryInfo : public QObject public: QList entries() const; - QList entriesForType(const QByteArray &typeName, int majorVersion, int minorVersion) const; + QList entriesForType(const QByteArray &typeName, int majorVersion = 1, + int minorVersion = 0) const; void addEntries(const QList &entries, bool overwriteDuplicate = false); bool containsEntry(const ItemLibraryEntry &entry); From 2adec9274e7fd0e3bf713485d1776eeda3f74b5c Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 7 Oct 2021 11:34:21 +0200 Subject: [PATCH 62/67] Update change log for 6.0 Change-Id: Ic75aabfe80b69f9e50f97dc516cda05787fcd94a Reviewed-by: Leena Miettinen --- dist/changes-6.0.0.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/dist/changes-6.0.0.md b/dist/changes-6.0.0.md index c16f46c3cf8..90db19cc57e 100644 --- a/dist/changes-6.0.0.md +++ b/dist/changes-6.0.0.md @@ -24,6 +24,7 @@ Editing ### C++ +* Updated to LLVM 13 * Added completion and function hint to `clangd` support * Added option for saving open files automatically after refactoring (QTCREATORBUG-25924) @@ -36,6 +37,11 @@ Editing * Improved wizards for Qt 6.2 (QTCREATORBUG-26170) * Simplified wizards +### Language Server Protocol + +* Added support for `activeParameter` of signature information + (QTCREATORBUG-26346) + Projects -------- @@ -56,7 +62,13 @@ Projects `Issues` pane (QTCREATORBUG-26231) * Fixed header file handling when mentioned in target sources (QTCREATORBUG-23783, QTCREATORBUG-23843, QTCREATORBUG-26201, - QTCREATORBUG-26238) + QTCREATORBUG-26238, QTCREATORBUG-21452, QTCREATORBUG-25644, + QTCREATORBUG-25782) +* Fixed that generated files were selected for analyzing (QTCREATORBUG-25125) + +### qmake + +* Fixed crash when canceling parsing (QTCREATORBUG-26333) Version Control Systems ----------------------- @@ -87,6 +99,7 @@ Platforms * Removed device selection dialog in favor of device selection in target selector (QTCREATORBUG-23991) * Added details to device settings (QTCREATORBUG-23991) +* Added filter field for Android SDK manager ### Docker @@ -103,6 +116,7 @@ André Pönitz Artem Sokolovskii Artur Shepilko Assam Boudjelthia +Christiaan Janssen Christian Kandeler Christian Stenger Cristian Adam @@ -112,14 +126,17 @@ Fawzi Mohamed Henning Gruendl Ihor Dutchak Jaroslaw Kobus +Johanna Vanhatapio Jonas Karlsson Kai Köhne Kama Wójcik +Knud Dollereder Li Xi Loren Burkholder Mahmoud Badri Marco Bubke Martin Kampas +Miikka Heikkinen Miina Puuronen Orgad Shaneh Petar Perisin @@ -129,6 +146,7 @@ Shantanu Tushar Tasuku Suzuki Thiago Macieira Thomas Hartmann +Tim Jenssen Tony Leinonen Tor Arne Vestbø Vladimir Serdyuk From de3e33a76b10ec59d9603655710f08988365f3a9 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 7 Oct 2021 16:29:28 +0200 Subject: [PATCH 63/67] Optimize setupLocationInfoForTargets() Don't search for each target separately in the node tree, but do a one search for all targets at once. This makes searching for nodes much faster, as in case of loading a Qt6 project (5 main modules only) with debug build of Creator, the searching time went down from 36 seconds into 30 miliseconds (just 1000 times faster). The number of targets in this case was more than 5000. Change-Id: I015f6fd2a2d5e613307cc7b65746c01a5b14c6dc Reviewed-by: Eike Ziller --- .../cmakeprojectmanager/fileapidataextractor.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index f800765ae9e..cabac0b3b98 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -653,9 +653,16 @@ std::unique_ptr generateRootProjectNode( void setupLocationInfoForTargets(CMakeProjectNode *rootNode, const QList &targets) { + const QSet titles = Utils::transform(targets, &CMakeBuildTarget::title); + QHash buildKeyToNode; + rootNode->forEachGenericNode([&buildKeyToNode, &titles](Node *node) { + FolderNode *folderNode = node->asFolderNode(); + const QString &buildKey = node->buildKey(); + if (folderNode && titles.contains(buildKey)) + buildKeyToNode.insert(buildKey, folderNode); + }); for (const CMakeBuildTarget &t : targets) { - FolderNode *folderNode = static_cast( - rootNode->findNode(Utils::equal(&Node::buildKey, t.title))); + FolderNode *folderNode = buildKeyToNode.value(t.title); if (folderNode) { QSet> locations; auto dedup = [&locations](const Backtrace &bt) { From a7b9ee22ddcf2ee012f5225c8a8c5834dc916e73 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 8 Oct 2021 12:24:45 +0200 Subject: [PATCH 64/67] Optimize resetOptimalWidth() Don't call this method directly on every demand, but schedule a call instead and invoke it once after the current call returns back to the main loop. The single call may cost up to ~20ms, and when we call it for every target having 5000 targets, the total cost is up to ~10 seconds (every call removes one items, so subsequent calls take a bit less time). This happens on shutdown when Qt6 project was loaded. The shutdown time went down from ~15 seconds to ~4 seconds with this patch. Change-Id: Id821d72cd8e1dd949112d9167b7736a267b221fc Reviewed-by: Eike Ziller --- .../miniprojecttargetselector.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp index b73d12c5789..44fc5ae511a 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp +++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp @@ -238,6 +238,18 @@ public: protected: void resetOptimalWidth() { + if (m_resetScheduled) + return; + m_resetScheduled = true; + QMetaObject::invokeMethod(this, &SelectorView::doResetOptimalWidth, Qt::QueuedConnection); + } + +private: + void keyPressEvent(QKeyEvent *event) override; + void keyReleaseEvent(QKeyEvent *event) override; + void doResetOptimalWidth() + { + m_resetScheduled = false; int width = 0; QFontMetrics fn(font()); theModel()->forItemsAtLevel<1>([this, &width, &fn](const GenericItem *item) { @@ -246,12 +258,9 @@ protected: setOptimalWidth(width); } -private: - void keyPressEvent(QKeyEvent *event) override; - void keyReleaseEvent(QKeyEvent *event) override; - int m_maxCount = 0; int m_optimalWidth = 0; + bool m_resetScheduled = false; }; class ProjectListView : public SelectorView From 3ee484332b39f967a1adbd0442834bb4784c4b9c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 8 Oct 2021 11:27:08 +0200 Subject: [PATCH 65/67] Fix qmake build of qbs Change-Id: Ia59128fd3f37a73071bcefacd4163f3e997c7744 Reviewed-by: Christian Stenger --- src/shared/shared.pro | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/shared/shared.pro b/src/shared/shared.pro index b4c64a02fb4..4e4c860c82e 100644 --- a/src/shared/shared.pro +++ b/src/shared/shared.pro @@ -6,9 +6,12 @@ QBS_DIRS = \ qbslibexec \ qbsmsbuildlib \ qbsplugins \ - qbsstatic + qbsstatic \ + qbspkgconfig +qbspkgconfig.subdir = qbs/src/lib/pkgconfig qbscorelib.subdir = qbs/src/lib/corelib +qbscorelib.depends = qbspkgconfig qbsapps.subdir = qbs/src/app qbsapps.depends = qbscorelib qbslibexec.subdir = qbs/src/libexec From e454c918386c42478454cb64dde841fe4c49e18c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 8 Oct 2021 11:05:55 +0200 Subject: [PATCH 66/67] QmlPuppet: Fix qbs build Amends b8b6af0dbb. Change-Id: I5ef8c58fec1ccdf4b620969c07a2134818b82f1c Reviewed-by: Christian Stenger --- src/tools/qml2puppet/qml2puppet.qbs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 7eff7ba02b7..83acc77ba36 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -16,6 +16,7 @@ QtcTool { ] } Depends { name: "Qt.quick3d-private"; required: false } + Depends { name: "Qt.quick3dparticles-private"; required: false } property bool useQuick3d: Utilities.versionCompare(Qt.core.version, "5.15") >= 0 && Qt["quick3d-private"].present property bool useParticle3d: Utilities.versionCompare(Qt.core.version, "6.2") >= 0 From 7c2121bcfdff8a652b9cb6d190829af0be62cf5f Mon Sep 17 00:00:00 2001 From: Johanna Vanhatapio Date: Fri, 8 Oct 2021 14:58:44 +0300 Subject: [PATCH 67/67] Doc: Fix the file name for directional light Change-Id: Idd70918270f12371cf6dc6215047ef612616b4ec Reviewed-by: Mahmoud Badri --- .../src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc index 239a168970f..8fd1539d51e 100644 --- a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc +++ b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc @@ -60,7 +60,7 @@ \li More Information \row - \li \inlineimage spot.png + \li \inlineimage directional.png \li Directional Light \li \li \l{DirectionalLight}{Light Directional}