Skip to content

Commit 9365673

Browse files
committed
Fix attribute table always fetches geometries for features
On behalf of Faunalia, sponsored by ENEL (cherry-picked from 8a050de)
1 parent c55ffd5 commit 9365673

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

src/app/qgsattributetabledialog.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
131131
mEditorContext.setVectorLayerTools( QgisApp::instance()->vectorLayerTools() );
132132

133133
QgsFeatureRequest r;
134+
bool needsGeom = false;
134135
if ( mLayer->geometryType() != QGis::NoGeometry &&
135136
settings.value( "/qgis/attributeTableBehaviour", QgsAttributeTableFilterModel::ShowAll ).toInt() == QgsAttributeTableFilterModel::ShowVisible )
136137
{
@@ -144,7 +145,10 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
144145
delete g;
145146

146147
mActionShowAllFilter->setText( tr( "Show All Features In Initial Canvas Extent" ) );
148+
needsGeom = true;
147149
}
150+
if ( !needsGeom )
151+
r.setFlags( QgsFeatureRequest::NoGeometry );
148152

149153
// Initialize dual view
150154
mMainView->init( mLayer, QgisApp::instance()->mapCanvas(), r, mEditorContext );

src/gui/attributetable/qgsdualview.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,16 @@ QgsDualView::ViewMode QgsDualView::view() const
235235

236236
void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filterMode )
237237
{
238+
bool needsGeometry = filterMode == QgsAttributeTableFilterModel::ShowVisible;
239+
240+
QgsFeatureRequest r = mMasterModel->request();
241+
if ( !needsGeometry )
242+
r.setFlags( r.flags() | QgsFeatureRequest::NoGeometry );
243+
else
244+
r.setFlags( r.flags() & ~( QgsFeatureRequest::NoGeometry ) );
245+
mMasterModel->setRequest( r );
246+
whileBlocking( mLayerCache )->setCacheGeometry( needsGeometry );
247+
238248
mFilterModel->setFilterMode( filterMode );
239249
emit filterChanged();
240250
}

tests/src/app/testqgsattributetable.cpp

+16-5
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,32 @@ void TestQgsAttributeTable::testFieldCalculationArea()
179179
void TestQgsAttributeTable::testNoGeom()
180180
{
181181
//test that by default the attribute table DOESN'T fetch geometries (because performance)
182-
std::unique_ptr< QgsVectorLayer> tempLayer( new QgsVectorLayer( QString( "LineString?crs=epsg:3111&field=pk:int&field=col1:double" ), QString( "vl" ), QString( "memory" ) ) );
182+
QScopedPointer< QgsVectorLayer> tempLayer( new QgsVectorLayer( QString( "LineString?crs=epsg:3111&field=pk:int&field=col1:double" ), QString( "vl" ), QString( "memory" ) ) );
183183
QVERIFY( tempLayer->isValid() );
184184

185-
QSettings().setValue( QString( "/qgis/attributeTableBehavior" ), QgsAttributeTableFilterModel::ShowAll );
186-
std::unique_ptr< QgsAttributeTableDialog > dlg( new QgsAttributeTableDialog( tempLayer.get() ) );
185+
QSettings().setValue( QString( "/qgis/attributeTableBehaviour" ), QgsAttributeTableFilterModel::ShowAll );
186+
QScopedPointer< QgsAttributeTableDialog > dlg( new QgsAttributeTableDialog( tempLayer.data() ) );
187187

188188
QVERIFY( !dlg->mMainView->masterModel()->layerCache()->cacheGeometry() );
189189
QVERIFY( dlg->mMainView->masterModel()->request().flags() & QgsFeatureRequest::NoGeometry );
190190

191191
// but if we are requesting only visible features, then geometry must be fetched...
192192

193-
QSettings().setValue( QString( "/qgis/attributeTableBehavior" ), QgsAttributeTableFilterModel::ShowVisible );
194-
dlg.reset( new QgsAttributeTableDialog( tempLayer.get() ) );
193+
QSettings().setValue( QString( "/qgis/attributeTableBehaviour" ), QgsAttributeTableFilterModel::ShowVisible );
194+
dlg.reset( new QgsAttributeTableDialog( tempLayer.data() ) );
195195
QVERIFY( dlg->mMainView->masterModel()->layerCache()->cacheGeometry() );
196196
QVERIFY( !( dlg->mMainView->masterModel()->request().flags() & QgsFeatureRequest::NoGeometry ) );
197+
198+
// try changing existing dialog to no geometry mode
199+
dlg->filterShowAll();
200+
QVERIFY( !dlg->mMainView->masterModel()->layerCache()->cacheGeometry() );
201+
QVERIFY( dlg->mMainView->masterModel()->request().flags() & QgsFeatureRequest::NoGeometry );
202+
203+
// and back to a geometry mode
204+
dlg->filterVisible();
205+
QVERIFY( dlg->mMainView->masterModel()->layerCache()->cacheGeometry() );
206+
QVERIFY( !( dlg->mMainView->masterModel()->request().flags() & QgsFeatureRequest::NoGeometry ) );
207+
197208
}
198209

199210
QTEST_MAIN( TestQgsAttributeTable )

0 commit comments

Comments
 (0)