From f3bc2d609f1d09fe8869eb30d9a39ba2ea25c445 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Wed, 20 May 2020 00:12:55 +0300 Subject: [PATCH] Add/remove the simulink component when the import is added/removed Task-number: QDS-2122 Change-Id: Ib4e2ff14ed9cfef1534f9c3edb0a8279fbabfd6a Reviewed-by: Thomas Hartmann --- .../importmanager/importswidget.cpp | 9 +++++- .../itemlibrary/itemlibraryview.cpp | 32 ++++++++++++++++++- .../designercore/include/itemlibraryinfo.h | 1 - .../designercore/metainfo/itemlibraryinfo.cpp | 11 ------- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp index d3aaf3c9b14..650033a42d8 100644 --- a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp +++ b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp @@ -122,8 +122,15 @@ void ImportsWidget::removePossibleImports() void ImportsWidget::setUsedImports(const QList &usedImports) { + const QStringList excludeList = {"SimulinkConnector"}; + + // exclude imports in the excludeList from being readonly (i.e. always enable their x button) + QList filteredImports = Utils::filtered(usedImports, [excludeList](const Import &import) { + return !excludeList.contains(import.url()); + }); + foreach (ImportLabel *importLabel, m_importLabels) - importLabel->setReadOnly(usedImports.contains(importLabel->import())); + importLabel->setReadOnly(filteredImports.contains(importLabel->import())); } void ImportsWidget::removeUsedImports() diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index cad7189698c..ea2e472f43d 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -29,6 +29,10 @@ #include #include #include +#include +#include +#include +#include "metainfo.h" namespace QmlDesigner { @@ -82,9 +86,35 @@ void ItemLibraryView::modelAboutToBeDetached(Model *model) m_widget->setModel(nullptr); } -void ItemLibraryView::importsChanged(const QList &/*addedImports*/, const QList &/*removedImports*/) +void ItemLibraryView::importsChanged(const QList &addedImports, const QList &removedImports) { updateImports(); + + // TODO: generalize the logic below to allow adding/removing any Qml component when its import is added/removed + bool simulinkImportAdded = std::any_of(addedImports.cbegin(), addedImports.cend(), [](const Import &import) { + return import.url() == "SimulinkConnector"; + }); + if (simulinkImportAdded) { + // add SLConnector component when SimulinkConnector import is added + ModelNode node = createModelNode("SLConnector", 1, 0); + node.bindingProperty("root").setExpression(rootModelNode().validId()); + rootModelNode().defaultNodeListProperty().reparentHere(node); + } else { + bool simulinkImportRemoved = std::any_of(removedImports.cbegin(), removedImports.cend(), [](const Import &import) { + return import.url() == "SimulinkConnector"; + }); + + if (simulinkImportRemoved) { + // remove SLConnector component when SimulinkConnector import is removed + const QList slConnectors = Utils::filtered(rootModelNode().directSubModelNodes(), + [](const ModelNode &node) { + return node.type() == "SLConnector" || node.type() == "SimulinkConnector.SLConnector"; + }); + + for (ModelNode node : slConnectors) + node.destroy(); + } + } } void ItemLibraryView::setResourcePath(const QString &resourcePath) diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h index 58d24137870..7cfa0ae1ab5 100644 --- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h +++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h @@ -98,7 +98,6 @@ public: QList entries() const; QList entriesForType(const QByteArray &typeName, int majorVersion, int minorVersion) const; - ItemLibraryEntry entry(const QString &name) const; void addEntries(const QList &entries, bool overwriteDuplicate = false); bool containsEntry(const ItemLibraryEntry &entry); diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp index e76fe609f07..1464084b67e 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp @@ -272,17 +272,6 @@ QList ItemLibraryInfo::entriesForType(const QByteArray &typeNa return entries; } -ItemLibraryEntry ItemLibraryInfo::entry(const QString &name) const -{ - if (m_nameToEntryHash.contains(name)) - return m_nameToEntryHash.value(name); - - if (m_baseInfo) - return m_baseInfo->entry(name); - - return ItemLibraryEntry(); -} - QList ItemLibraryInfo::entries() const { QList list = m_nameToEntryHash.values();