aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAli Kianian <ali.kianian@qt.io>2024-03-25 15:45:47 +0200
committerTim Jenssen <tim.jenssen@qt.io>2024-03-26 08:56:21 +0000
commit4e63bcb744df8324551f28472ef6ff48d6bd1613 (patch)
tree776a2643ca20c568828fb1e6e292f18825503785 /src
parent41f3eaa3a9d8ef089f0dc7525f7a1d8ccb9c453e (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')
-rw-r--r--src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp49
-rw-r--r--src/plugins/qmldesigner/components/collectioneditor/collectionview.h10
-rw-r--r--src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp5
-rw-r--r--src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h1
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;