Fix needs geometry on table reload

This commit is contained in:
Alessandro Pasotti 2024-06-03 15:58:35 +02:00
parent e115e6df08
commit f08dfed622
2 changed files with 8 additions and 10 deletions

View File

@ -1053,9 +1053,7 @@ void QgsAttributeTableModel::prefetchSortData( const QString &expressionString,
widgetData = getWidgetData( cache.sortFieldIndex );
}
const QgsFeatureRequest request = QgsFeatureRequest( mFeatureRequest )
.setFlags( cache.sortCacheExpression.needsGeometry() ? Qgis::FeatureRequestFlag::NoFlags : Qgis::FeatureRequestFlag::NoGeometry )
.setSubsetOfAttributes( cache.sortCacheAttributes );
const QgsFeatureRequest request = QgsFeatureRequest( mFeatureRequest ).setFlags( cache.sortCacheExpression.needsGeometry() ? Qgis::FeatureRequestFlag::NoFlags : Qgis::FeatureRequestFlag::NoGeometry ).setSubsetOfAttributes( cache.sortCacheAttributes );
QgsFeatureIterator it = mLayerCache->getFeatures( request );

View File

@ -336,16 +336,13 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
// create an empty form to find out if it needs geometry or not
const QgsAttributeForm emptyForm( mLayer, QgsFeature(), mEditorContext );
const bool needsGeometry = ( filterMode == QgsAttributeTableFilterModel::ShowVisible ) || emptyForm.needsGeometry();
const bool needsGeometry = ( filterMode == QgsAttributeTableFilterModel::ShowVisible ) || emptyForm.needsGeometry() || QgsExpression( mConfig.sortExpression() ).needsGeometry();
const bool requiresTableReload = ( request.filterType() != Qgis::Qgis::FeatureRequestFilterType::NoFilter || request.spatialFilterType() != Qgis::SpatialFilterType::NoFilter ) // previous request was subset
|| ( needsGeometry && request.flags() & Qgis::FeatureRequestFlag::NoGeometry ) // no geometry for last request
|| ( mMasterModel->rowCount() == 0 ); // no features
if ( !needsGeometry )
request.setFlags( request.flags() | Qgis::FeatureRequestFlag::NoGeometry );
else
request.setFlags( request.flags() & ~( static_cast< int >( Qgis::FeatureRequestFlag::NoGeometry ) ) );
request.setFlags( request.flags().setFlag( Qgis::FeatureRequestFlag::NoGeometry, !needsGeometry ) );
request.setFilterFids( QgsFeatureIds() );
request.setFilterRect( QgsRectangle() );
request.disableFilter();
@ -1135,7 +1132,6 @@ bool QgsDualView::modifySort()
config.setSortExpression( QString() );
}
setAttributeTableConfig( config );
return true;
}
else
@ -1334,7 +1330,10 @@ void QgsDualView::setAttributeTableConfig( const QgsAttributeTableConfig &config
mFilterModel->setAttributeTableConfig( mConfig );
mTableView->setAttributeTableConfig( mConfig );
const QgsAttributeList attributes { requiredAttributes( mLayer ) };
QgsFeatureRequest request { mMasterModel->request() };
// Determine if the sort expression needs geometry
const bool newSortExpressionNeedsGeometry { QgsExpression( config.sortExpression() ).needsGeometry() };
QgsFeatureRequest request = mMasterModel->request();
request.setFlags( request.flags().setFlag( Qgis::FeatureRequestFlag::NoGeometry, !newSortExpressionNeedsGeometry ) );
request.setSubsetOfAttributes( attributes );
mMasterModel->setRequest( request );
mLayerCache->setCacheSubsetOfAttributes( attributes );
@ -1342,6 +1341,7 @@ void QgsDualView::setAttributeTableConfig( const QgsAttributeTableConfig &config
void QgsDualView::setSortExpression( const QString &sortExpression, Qt::SortOrder sortOrder )
{
if ( sortExpression.isNull() )
mFilterModel->sort( -1 );
else