From 142367bd4cd21c604741c098b03c49e712e85a75 Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Sun, 14 Jan 2024 10:24:21 +0700 Subject: [PATCH] When opening or reloading a project, clear the previous one to empty the layer tree --- src/core/layertreemodel.cpp | 23 ++++++++++++++++++++--- src/core/layertreemodel.h | 3 ++- src/core/qgismobileapp.cpp | 7 +++++-- src/qml/qgismobileapp.qml | 4 ++-- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/core/layertreemodel.cpp b/src/core/layertreemodel.cpp index 7a80a7418c..f12a10d6f5 100644 --- a/src/core/layertreemodel.cpp +++ b/src/core/layertreemodel.cpp @@ -115,7 +115,8 @@ FlatLayerTreeModelBase::FlatLayerTreeModelBase( QgsLayerTree *layerTree, QgsProj mLayerTreeModel = new QgsLayerTreeModel( layerTree, this ); mLayerTreeModel->setFlag( QgsLayerTreeModel::ShowLegendAsTree, true ); QAbstractProxyModel::setSourceModel( mLayerTreeModel ); - connect( mProject, &QgsProject::cleared, this, [=] { updateTemporalState(); buildMap( nullptr ); } ); + connect( mProject, &QgsProject::aboutToBeCleared, this, [=] { mFrozen++; clearMap(); } ); + connect( mProject, &QgsProject::cleared, this, [=] { mFrozen--; } ); connect( mProject, &QgsProject::readProject, this, [=] { buildMap( mLayerTreeModel ); } ); connect( mProject, &QgsProject::layersAdded, this, &FlatLayerTreeModelBase::adjustTemporalStateFromAddedLayers ); connect( mLayerTreeModel, &QAbstractItemModel::dataChanged, this, &FlatLayerTreeModelBase::updateMap ); @@ -125,12 +126,12 @@ FlatLayerTreeModelBase::FlatLayerTreeModelBase( QgsLayerTree *layerTree, QgsProj void FlatLayerTreeModelBase::freeze() { - mFrozen = true; + mFrozen++; } void FlatLayerTreeModelBase::unfreeze( bool resetModel ) { - mFrozen = false; + mFrozen = 0; if ( resetModel ) buildMap( mLayerTreeModel ); } @@ -331,6 +332,22 @@ void FlatLayerTreeModelBase::removeFromMap( const QModelIndex &parent, int first } } +void FlatLayerTreeModelBase::clearMap() +{ + if ( mIsTemporal ) + { + mIsTemporal = false; + emit isTemporalChanged(); + } + + beginResetModel(); + mRowMap.clear(); + mIndexMap.clear(); + mCollapsedItems.clear(); + mTreeLevelMap.clear(); + endResetModel(); +} + int FlatLayerTreeModelBase::buildMap( QgsLayerTreeModel *model, const QModelIndex &parent, int row, int treeLevel ) { if ( mFrozen ) diff --git a/src/core/layertreemodel.h b/src/core/layertreemodel.h index ec60fd3ab6..cd95539c10 100644 --- a/src/core/layertreemodel.h +++ b/src/core/layertreemodel.h @@ -34,6 +34,7 @@ class FlatLayerTreeModelBase : public QAbstractProxyModel void updateMap( const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles ); int buildMap( QgsLayerTreeModel *model, const QModelIndex &parent = QModelIndex(), int row = 0, int treeLevel = 0 ); + void clearMap(); void removeFromMap( const QModelIndex &parent, int first, int last ); void insertInMap( const QModelIndex &parent, int first, int last ); @@ -101,7 +102,7 @@ class FlatLayerTreeModelBase : public QAbstractProxyModel bool mIsTemporal = false; - bool mFrozen = false; + int mFrozen = 0; }; class FlatLayerTreeModel : public QSortFilterProxyModel diff --git a/src/core/qgismobileapp.cpp b/src/core/qgismobileapp.cpp index 862cb440e0..5fcc456d47 100644 --- a/src/core/qgismobileapp.cpp +++ b/src/core/qgismobileapp.cpp @@ -687,6 +687,8 @@ bool QgisMobileapp::loadProjectFile( const QString &path, const QString &name ) mAuthRequestHandler->clearStoredRealms(); + // Clear project to empty the layer tree prior to freezing during project load + mProject->clear(); mProjectFilePath = path; mProjectFileName = !name.isEmpty() ? name : fi.completeBaseName(); @@ -702,6 +704,9 @@ void QgisMobileapp::reloadProjectFile() if ( mProjectFilePath.isEmpty() ) QgsMessageLog::logMessage( tr( "No project file currently opened" ), QStringLiteral( "QField" ), Qgis::Warning ); + // Clear project to empty the layer tree prior to freezing during project load + mProject->clear(); + emit loadProjectTriggered( mProjectFilePath, mProjectFileName ); } @@ -715,8 +720,6 @@ void QgisMobileapp::readProjectFile() const QString suffix = fi.suffix().toLower(); - mProject->removeAllMapLayers(); - mProject->setTitle( QString() ); mProject->layerTreeRegistryBridge()->setLayerInsertionMethod( Qgis::LayerTreeInsertionMethod::OptimalInInsertionGroup ); mTrackingModel->reset(); diff --git a/src/qml/qgismobileapp.qml b/src/qml/qgismobileapp.qml index 774e537d2d..909c7b300c 100644 --- a/src/qml/qgismobileapp.qml +++ b/src/qml/qgismobileapp.qml @@ -3206,9 +3206,9 @@ ApplicationWindow { busyOverlay.text = qsTr( "Loading %1" ).arg( name !== '' ? name : path ) busyOverlay.state = "visible" - navigation.clearDestinationFeature(); + navigation.clearDestinationFeature() - projectInfo.filePath = ''; + projectInfo.filePath = '' readProjectTimer.start() }