diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp index e2ebb4f5223..f35e9f2ed26 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp @@ -557,6 +557,14 @@ void CollectionDetails::swap(CollectionDetails &other) d.swap(other.d); } +void CollectionDetails::resetReference(const CollectionReference &reference) +{ + if (d->reference != reference) { + d->reference = reference; + markChanged(); + } +} + void CollectionDetails::registerDeclarativeType() { typedef CollectionDetails::DataType DataType; diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.h b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.h index e3593c3cc10..a18c557c52b 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.h @@ -103,6 +103,7 @@ public: bool markSaved(); void swap(CollectionDetails &other); + void resetReference(const CollectionReference &reference); QString getCollectionAsJsonString() const; QString getCollectionAsCsvString() const; diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp index 40450e895c7..51e3be9ad6b 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp @@ -458,6 +458,42 @@ void CollectionDetailsModel::loadCollection(const ModelNode &sourceNode, const Q } } +void CollectionDetailsModel::removeCollection(const ModelNode &sourceNode, const QString &collection) +{ + CollectionReference collectionRef{sourceNode, collection}; + if (!m_openedCollections.contains(collectionRef)) + return; + + if (m_currentCollection.reference() == collectionRef) + loadCollection({}, {}); + + m_openedCollections.remove(collectionRef); +} + +void CollectionDetailsModel::removeAllCollections() +{ + loadCollection({}, {}); + m_openedCollections.clear(); +} + +void CollectionDetailsModel::renameCollection(const ModelNode &sourceNode, + const QString &oldName, + const QString &newName) +{ + CollectionReference oldRef{sourceNode, oldName}; + if (!m_openedCollections.contains(oldRef)) + return; + + CollectionReference newReference{sourceNode, newName}; + bool collectionIsSelected = m_currentCollection.reference() == oldRef; + CollectionDetails collection = m_openedCollections.take(oldRef); + collection.resetReference(newReference); + m_openedCollections.insert(newReference, collection); + + if (collectionIsSelected) + setCollectionName(newName); +} + bool CollectionDetailsModel::saveDataStoreCollections() { const ModelNode node = m_currentCollection.reference().node; diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h index 8e5b21ce7ff..cef942b0448 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h @@ -61,6 +61,9 @@ public: static Q_INVOKABLE QStringList typesList(); void loadCollection(const ModelNode &sourceNode, const QString &collection); + void removeCollection(const ModelNode &sourceNode, const QString &collection); + void removeAllCollections(); + void renameCollection(const ModelNode &sourceNode, const QString &oldName, const QString &newName); Q_INVOKABLE bool saveDataStoreCollections(); Q_INVOKABLE bool exportCollection(const QUrl &url); diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionsourcemodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectionsourcemodel.cpp index 1f9c7aa5d7a..1d27f205489 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionsourcemodel.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionsourcemodel.cpp @@ -498,8 +498,21 @@ void CollectionSourceModel::onCollectionNameChanged(CollectionListModel *collect return; } + CollectionListModel *list = m_collectionList.at(nodeIndex.row()).data(); + bool updateSelectedNames = list && list == m_previousSelectedList.data(); emit collectionRenamed(oldName, newName); updateCollectionList(nodeIndex); + + if (updateSelectedNames) { + list = m_collectionList.at(nodeIndex.row()).data(); + if (m_selectedCollectionName == oldName) { + list->selectCollectionName(newName); + setSelectedCollectionName(newName); + } else { + // reselect to update ID if it's changed due to renaming and order changes + list->selectCollectionName(m_selectedCollectionName); + } + } } } diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp index 7f3ee7192ac..1b1d1a7d9fc 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp @@ -48,7 +48,11 @@ CollectionView::CollectionView(ExternalDependenciesInterface &externalDependenci connect(ProjectExplorer::ProjectManager::instance(), &ProjectExplorer::ProjectManager::startupProjectChanged, this, - &CollectionView::resetDataStoreNode); + [=] { + resetDataStoreNode(); + if (m_widget.get()) + m_widget->collectionDetailsModel()->removeAllCollections(); + }); resetDataStoreNode(); } @@ -91,6 +95,9 @@ QmlDesigner::WidgetInfo CollectionView::widgetInfo() this, [this](const QString &oldName, const QString &newName) { m_dataStore->renameCollection(oldName, newName); + m_widget->collectionDetailsModel()->renameCollection(dataStoreNode(), + oldName, + newName); }); connect(sourceModel, @@ -98,6 +105,8 @@ QmlDesigner::WidgetInfo CollectionView::widgetInfo() this, [this](const QString &collectionName) { m_dataStore->removeCollection(collectionName); + m_widget->collectionDetailsModel()->removeCollection(dataStoreNode(), + collectionName); }); }