diff options
author | Ali Kianian <ali.kianian@qt.io> | 2024-03-25 15:45:47 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2024-03-26 08:56:21 +0000 |
commit | 4e63bcb744df8324551f28472ef6ff48d6bd1613 (patch) | |
tree | 776a2643ca20c568828fb1e6e292f18825503785 /src | |
parent | 41f3eaa3a9d8ef089f0dc7525f7a1d8ccb9c453e (diff) |
QmlDesigner: Fix the bad access for the listModel of the model editor
Change-Id: I9954e11135ab5913a82f12067291b04f22fbe5d2
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Ali Kianian <ali.kianian@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src')
4 files changed, 45 insertions, 20 deletions
diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp index f6ec821fde..b47fb6a51f 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp @@ -60,14 +60,10 @@ CollectionView::CollectionView(ExternalDependenciesInterface &externalDependenci , m_dataStore(std::make_unique<DataStoreModelNode>()) { - connect(ProjectExplorer::ProjectManager::instance(), - &ProjectExplorer::ProjectManager::startupProjectChanged, this, [this] { - resetDataStoreNode(); - if (m_widget.get()) - m_widget->collectionDetailsModel()->removeAllCollections(); - }); } +CollectionView::~CollectionView() = default; + bool CollectionView::hasWidget() const { return true; @@ -75,11 +71,16 @@ bool CollectionView::hasWidget() const QmlDesigner::WidgetInfo CollectionView::widgetInfo() { - if (m_widget.isNull()) { - m_widget = new CollectionWidget(this); + if (!m_widget) { + m_widget = Utils::makeUniqueObjectPtr<CollectionWidget>(this); m_widget->setMinimumSize(m_widget->minimumSizeHint()); + connect(ProjectExplorer::ProjectManager::instance(), + &ProjectExplorer::ProjectManager::startupProjectChanged, m_widget.get(), [&] { + resetDataStoreNode(); + m_widget->collectionDetailsModel()->removeAllCollections(); + }); - auto collectionEditorContext = new Internal::CollectionEditorContext(m_widget.data()); + auto collectionEditorContext = new Internal::CollectionEditorContext(m_widget.get()); Core::ICore::addContextObject(collectionEditorContext); CollectionListModel *listModel = m_widget->listModel().data(); @@ -128,7 +129,7 @@ QmlDesigner::WidgetInfo CollectionView::widgetInfo() }); } - return createWidgetInfo(m_widget.data(), + return createWidgetInfo(m_widget.get(), "CollectionEditor", WidgetInfo::LeftPane, 0, @@ -150,12 +151,16 @@ void CollectionView::modelAboutToBeDetached([[maybe_unused]] Model *model) m_dataStoreTypeFound = false; disconnect(m_documentUpdateConnection); QTC_ASSERT(m_delayedTasks.isEmpty(), m_delayedTasks.clear()); - m_widget->listModel()->setDataStoreNode(); + if (m_widget) + m_widget->listModel()->setDataStoreNode(); } void CollectionView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList, [[maybe_unused]] const QList<ModelNode> &lastSelectedNodeList) { + if (!m_widget) + return; + QList<ModelNode> selectedCollectionNodes = Utils::filtered(selectedNodeList, &isStudioCollectionModel); @@ -170,10 +175,6 @@ void CollectionView::selectedNodesChanged(const QList<ModelNode> &selectedNodeLi } m_widget->setTargetNodeSelected(singleSelectedHasModelProperty); - - // More than one model is selected. So ignore them - if (selectedCollectionNodes.size() > 1) - return; } void CollectionView::customNotification(const AbstractView *, @@ -181,6 +182,9 @@ void CollectionView::customNotification(const AbstractView *, const QList<ModelNode> &nodeList, const QList<QVariant> &data) { + if (!m_widget) + return; + if (identifier == QLatin1String("item_library_created_by_drop") && !nodeList.isEmpty()) onItemLibraryNodeCreated(nodeList.first()); else if (identifier == QLatin1String("open_collection_by_id") && !data.isEmpty()) @@ -221,6 +225,9 @@ void CollectionView::addResource(const QUrl &url, const QString &name) void CollectionView::assignCollectionToNode(const QString &collectionName, const ModelNode &node) { + if (!m_widget) + return; + using DataType = CollectionDetails::DataType; executeInTransaction("CollectionView::assignCollectionToNode", [&]() { m_dataStore->assignCollectionToNode( @@ -279,12 +286,18 @@ void CollectionView::assignCollectionToSelectedNode(const QString &collectionNam void CollectionView::addNewCollection(const QString &collectionName, const QJsonObject &localCollection) { + if (!m_widget) + return; + addTask(QSharedPointer<CollectionTask>( new AddCollectionTask(this, m_widget->listModel(), localCollection, collectionName))); } void CollectionView::openCollection(const QString &collectionName) { + if (!m_widget) + return; + m_widget->openCollection(collectionName); } @@ -296,6 +309,9 @@ void CollectionView::registerDeclarativeType() void CollectionView::resetDataStoreNode() { + if (!m_widget) + return; + m_dataStore->reloadModel(); ModelNode dataStore = m_dataStore->modelNode(); @@ -395,6 +411,9 @@ void CollectionView::ensureStudioModelImport() void CollectionView::onItemLibraryNodeCreated(const ModelNode &node) { + if (!m_widget) + return; + if (node.metaInfo().isQtQuickListView()) { addTask(QSharedPointer<CollectionTask>( new DropListViewTask(this, m_widget->listModel(), node))); diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionview.h b/src/plugins/qmldesigner/components/collectioneditor/collectionview.h index a4b16c4c27..d8be8b7055 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionview.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionview.h @@ -3,9 +3,12 @@ #pragma once -#include "abstractview.h" #include "datastoremodelnode.h" -#include "modelnode.h" + +#include <abstractview.h> +#include <modelnode.h> + +#include <utils/uniqueobjectptr.h> #include <QJsonObject> @@ -27,6 +30,7 @@ class CollectionView : public AbstractView public: explicit CollectionView(ExternalDependenciesInterface &externalDependencies); + ~CollectionView(); bool hasWidget() const override; WidgetInfo widgetInfo() override; @@ -66,8 +70,8 @@ private: void onDocumentUpdated(const QSharedPointer<const QmlJS::Document> &doc); void addTask(QSharedPointer<CollectionTask> task); - QPointer<CollectionWidget> m_widget; std::unique_ptr<DataStoreModelNode> m_dataStore; + Utils::UniqueObjectPtr<CollectionWidget> m_widget; QSet<Utils::FilePath> m_expectedDocumentUpdates; QList<QSharedPointer<CollectionTask>> m_delayedTasks; QMetaObject::Connection m_documentUpdateConnection; diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp index 093729dc67..7ecd54174a 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp @@ -54,8 +54,7 @@ QString getPreferredCollectionName(const QUrl &url, const QString &collectionNam namespace QmlDesigner { CollectionWidget::CollectionWidget(CollectionView *view) - : QFrame() - , m_view(view) + : m_view(view) , m_listModel(new CollectionListModel) , m_collectionDetailsModel(new CollectionDetailsModel) , m_collectionDetailsSortFilterModel(std::make_unique<CollectionDetailsSortFilterModel>()) @@ -104,6 +103,8 @@ CollectionWidget::CollectionWidget(CollectionView *view) QmlDesignerPlugin::trackWidgetFocusTime(this, Constants::EVENT_MODELEDITOR_TIME); } +CollectionWidget::~CollectionWidget() = default; + void CollectionWidget::contextHelp(const Core::IContext::HelpCallback &callback) const { if (m_view) diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h index 0957bd81e0..f06edd2323 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h @@ -25,6 +25,7 @@ class CollectionWidget : public QFrame public: CollectionWidget(CollectionView *view); + ~CollectionWidget(); void contextHelp(const Core::IContext::HelpCallback &callback) const; QPointer<CollectionListModel> listModel() const; |