From b984f5f7c59f316b7ffb8001c9ddfdeb71766a8e Mon Sep 17 00:00:00 2001 From: Richard Kello Date: Mon, 20 Jul 2026 14:12:31 +0200 Subject: [PATCH] Update filtering for recording layer dropdown --- app/layer/layertreesortfiltermodel.cpp | 8 ++++++-- app/layer/layertreesortfiltermodel.h | 3 +++ app/recordinglayersproxymodel.cpp | 18 ++++++++++++++++++ app/recordinglayersproxymodel.h | 1 + 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/layer/layertreesortfiltermodel.cpp b/app/layer/layertreesortfiltermodel.cpp index 3e9ec3e05..167192a17 100644 --- a/app/layer/layertreesortfiltermodel.cpp +++ b/app/layer/layertreesortfiltermodel.cpp @@ -92,10 +92,14 @@ QModelIndex LayerTreeSortFilterModel::node2index( QgsLayerTreeNode *node ) const return mapFromSource( srcIndex ); } +LayerTreeSortFilterModel::SortMethodEnum LayerTreeSortFilterModel::sortMethod( QgsProject *project ) +{ + return static_cast( project->readNumEntry( QStringLiteral( "Mergin" ), QStringLiteral( "SortLayersMethod/Method" ), SortMethodEnum::Alphabetical ) ); +} + void LayerTreeSortFilterModel::onSourceModelInitialized() { - bool sortMethod = mLayerTreeModel->qgsProject()->readNumEntry( QStringLiteral( "Mergin" ), QStringLiteral( "SortLayersMethod/Method" ), 1 ); - if ( sortMethod == SortMethodEnum::Alphabetical ) + if ( sortMethod( mLayerTreeModel->qgsProject() ) == SortMethodEnum::Alphabetical ) { sort( 0 ); } diff --git a/app/layer/layertreesortfiltermodel.h b/app/layer/layertreesortfiltermodel.h index 205c7f7e5..9f834d65d 100644 --- a/app/layer/layertreesortfiltermodel.h +++ b/app/layer/layertreesortfiltermodel.h @@ -37,6 +37,9 @@ class LayerTreeSortFilterModel : public QSortFilterProxyModel bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const override; + // Returns the layer sorting method configured for the given project (defaults to Alphabetical) + static SortMethodEnum sortMethod( QgsProject *project ); + LayerTreeModel *layerTreeModel() const; void setLayerTreeModel( LayerTreeModel *newLayerTreeModel ); diff --git a/app/recordinglayersproxymodel.cpp b/app/recordinglayersproxymodel.cpp index 1ad1ed328..69df81873 100644 --- a/app/recordinglayersproxymodel.cpp +++ b/app/recordinglayersproxymodel.cpp @@ -13,6 +13,8 @@ #include "qgsproject.h" #include "qgslayertree.h" +#include "layer/layertreesortfiltermodel.h" + RecordingLayersProxyModel::RecordingLayersProxyModel( QObject *parent ) : QgsMapLayerProxyModel{ parent }, mModel( nullptr ) @@ -34,6 +36,22 @@ bool RecordingLayersProxyModel::filterAcceptsRow( int source_row, const QModelIn return mModel->data( index, LayersModel::LayerVisible ).toBool(); } +bool RecordingLayersProxyModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const +{ + if ( !mModel || LayerTreeSortFilterModel::sortMethod( QgsProject::instance() ) == LayerTreeSortFilterModel::Alphabetical ) + return QgsMapLayerProxyModel::lessThan( left, right ); + + // preserve the layer order as arranged in the QGIS project's layer tree + QgsMapLayer *leftLayer = mModel->layerFromIndex( left ); + QgsMapLayer *rightLayer = mModel->layerFromIndex( right ); + + if ( !leftLayer || !rightLayer ) + return QgsMapLayerProxyModel::lessThan( left, right ); + + const QStringList treeOrder = QgsProject::instance()->layerTreeRoot()->findLayerIds(); + return treeOrder.indexOf( leftLayer->id() ) < treeOrder.indexOf( rightLayer->id() ); +} + QList RecordingLayersProxyModel::layers() const { if ( !mModel ) diff --git a/app/recordinglayersproxymodel.h b/app/recordinglayersproxymodel.h index 91fc5f5ee..10831a93b 100644 --- a/app/recordinglayersproxymodel.h +++ b/app/recordinglayersproxymodel.h @@ -30,6 +30,7 @@ class RecordingLayersProxyModel : public QgsMapLayerProxyModel Q_INVOKABLE explicit RecordingLayersProxyModel( QObject *parent = nullptr ); bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const override; + bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override; /** * @brief layers method return layers from source model filtered with filter function