Skip to content

Commit 6cd97d8

Browse files
committed
Avoid unnecessary reloads layer for attribute table
On behalf of Faunalia, sponsored by ENEL
1 parent e1d80b5 commit 6cd97d8

File tree

4 files changed

+33
-31
lines changed

4 files changed

+33
-31
lines changed

python/gui/attributetable/qgsdualview.sip

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,8 @@ class QgsDualView : QStackedWidget
3232
explicit QgsDualView( QWidget* parent /TransferThis/ = 0 );
3333
virtual ~QgsDualView();
3434

35-
/**
36-
* Has to be called to initialize the dual view.
37-
*
38-
* @param layer The layer which should be used to fetch features
39-
* @param mapCanvas The mapCanvas (used for the FilterMode
40-
* {@link QgsAttributeTableFilterModel::ShowVisible}
41-
* @param request Use a modified request to limit the shown features
42-
* @param context The context in which this view is shown
43-
*/
44-
void init( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, const QgsFeatureRequest& request = QgsFeatureRequest(), const QgsAttributeEditorContext& context = QgsAttributeEditorContext() );
35+
void init( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, const QgsFeatureRequest& request = QgsFeatureRequest(), const QgsAttributeEditorContext& context = QgsAttributeEditorContext(),
36+
bool loadFeatures = true );
4537

4638
/**
4739
* Change the current view mode.

src/app/qgsattributetabledialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *layer, QWidget
157157
r.setFlags( QgsFeatureRequest::NoGeometry );
158158

159159
// Initialize dual view
160-
mMainView->init( mLayer, QgisApp::instance()->mapCanvas(), r, mEditorContext );
160+
mMainView->init( mLayer, QgisApp::instance()->mapCanvas(), r, mEditorContext, false );
161161

162162
QgsAttributeTableConfig config = mLayer->attributeTableConfig();
163163
mMainView->setAttributeTableConfig( config );

src/gui/attributetable/qgsdualview.cpp

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ QgsDualView::QgsDualView( QWidget *parent )
6868
connect( mFeatureList, &QgsFeatureListView::displayExpressionChanged, this, &QgsDualView::previewExpressionChanged );
6969
}
7070

71-
void QgsDualView::init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, const QgsAttributeEditorContext &context )
71+
void QgsDualView::init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, const QgsAttributeEditorContext &context, bool loadFeatures )
7272
{
7373
mMapCanvas = mapCanvas;
7474

@@ -85,7 +85,7 @@ void QgsDualView::init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const Qg
8585
connect( mTableView, &QgsAttributeTableView::columnResized, this, &QgsDualView::tableColumnResized );
8686

8787
initLayerCache( !( request.flags() & QgsFeatureRequest::NoGeometry ) || !request.filterRect().isNull() );
88-
initModels( mapCanvas, request );
88+
initModels( mapCanvas, request, loadFeatures );
8989

9090
mConditionalFormatWidget->setLayer( mLayer );
9191

@@ -194,9 +194,6 @@ QgsDualView::ViewMode QgsDualView::view() const
194194

195195
void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filterMode )
196196
{
197-
if ( mFilterModel->filterMode() == filterMode )
198-
return;
199-
200197
// cleanup any existing connections
201198
switch ( mFilterModel->filterMode() )
202199
{
@@ -217,17 +214,23 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
217214
QgsFeatureRequest r = mMasterModel->request();
218215
bool needsGeometry = filterMode == QgsAttributeTableFilterModel::ShowVisible;
219216

217+
bool requiresTableReload = ( r.filterType() != QgsFeatureRequest::FilterNone || !r.filterRect().isNull() ) // previous request was subset
218+
|| ( needsGeometry && r.flags() & QgsFeatureRequest::NoGeometry ) // no geometry for last request
219+
|| ( mMasterModel->rowCount() == 0 ); // no features
220+
220221
if ( !needsGeometry )
221222
r.setFlags( r.flags() | QgsFeatureRequest::NoGeometry );
222223
else
223224
r.setFlags( r.flags() & ~( QgsFeatureRequest::NoGeometry ) );
225+
r.setFilterFids( QgsFeatureIds() );
226+
r.setFilterRect( QgsRectangle() );
227+
r.disableFilter();
224228

229+
// setup new connections and filter request parameters
225230
switch ( filterMode )
226231
{
227232
case QgsAttributeTableFilterModel::ShowVisible:
228233
connect( mMapCanvas, &QgsMapCanvas::extentsChanged, this, &QgsDualView::extentChanged );
229-
r.setFilterFids( QgsFeatureIds() );
230-
r.disableFilter();
231234
if ( mMapCanvas )
232235
{
233236
QgsRectangle rect = mMapCanvas->mapSettings().mapToLayerCoordinates( mLayer, mMapCanvas->extent() );
@@ -238,23 +241,23 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
238241
case QgsAttributeTableFilterModel::ShowAll:
239242
case QgsAttributeTableFilterModel::ShowEdited:
240243
case QgsAttributeTableFilterModel::ShowFilteredList:
241-
r.setFilterFids( QgsFeatureIds() );
242-
r.disableFilter();
243244
break;
244245

245246
case QgsAttributeTableFilterModel::ShowSelected:
246247
connect( masterModel()->layer(), &QgsVectorLayer::selectionChanged, this, &QgsDualView::updateSelectedFeatures );
247248
if ( masterModel()->layer()->selectedFeatureCount() > 0 )
248249
r.setFilterFids( masterModel()->layer()->selectedFeatureIds() );
249-
else
250-
r.disableFilter();
251250
break;
252251
}
253252

254-
mMasterModel->setRequest( r );
255-
whileBlocking( mLayerCache )->setCacheGeometry( needsGeometry );
256-
mMasterModel->loadLayer();
253+
if ( requiresTableReload )
254+
{
255+
mMasterModel->setRequest( r );
256+
whileBlocking( mLayerCache )->setCacheGeometry( needsGeometry );
257+
mMasterModel->loadLayer();
258+
}
257259

260+
//update filter model
258261
mFilterModel->setFilterMode( filterMode );
259262
emit filterChanged();
260263
}
@@ -278,7 +281,7 @@ void QgsDualView::initLayerCache( bool cacheGeometry )
278281
}
279282
}
280283

281-
void QgsDualView::initModels( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request )
284+
void QgsDualView::initModels( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, bool loadFeatures )
282285
{
283286
delete mFeatureListModel;
284287
delete mFilterModel;
@@ -294,7 +297,8 @@ void QgsDualView::initModels( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &
294297

295298
connect( mConditionalFormatWidget, &QgsFieldConditionalFormatWidget::rulesUpdated, mMasterModel, &QgsAttributeTableModel::fieldConditionalStyleChanged );
296299

297-
mMasterModel->loadLayer();
300+
if ( loadFeatures )
301+
mMasterModel->loadLayer();
298302

299303
mFilterModel = new QgsAttributeTableFilterModel( mapCanvas, mMasterModel, mMasterModel );
300304

@@ -711,6 +715,9 @@ void QgsDualView::sortByPreviewExpression()
711715
void QgsDualView::updateSelectedFeatures()
712716
{
713717
QgsFeatureRequest r = mMasterModel->request();
718+
if ( r.filterType() == QgsFeatureRequest::FilterNone && r.filterRect().isNull() )
719+
return; // already requested all features
720+
714721
if ( masterModel()->layer()->selectedFeatureCount() > 0 )
715722
r.setFilterFids( masterModel()->layer()->selectedFeatureIds() );
716723
else
@@ -722,13 +729,13 @@ void QgsDualView::updateSelectedFeatures()
722729
void QgsDualView::extentChanged()
723730
{
724731
QgsFeatureRequest r = mMasterModel->request();
725-
if ( mMapCanvas )
732+
if ( mMapCanvas && ( r.filterType() != QgsFeatureRequest::FilterNone || !r.filterRect().isNull() ) )
726733
{
727734
QgsRectangle rect = mMapCanvas->mapSettings().mapToLayerCoordinates( mLayer, mMapCanvas->extent() );
728735
r.setFilterRect( rect );
736+
mMasterModel->setRequest( r );
737+
mMasterModel->loadLayer();
729738
}
730-
mMasterModel->setRequest( r );
731-
mMasterModel->loadLayer();
732739
}
733740

734741
void QgsDualView::featureFormAttributeChanged()

src/gui/attributetable/qgsdualview.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,11 @@ class GUI_EXPORT QgsDualView : public QStackedWidget, private Ui::QgsDualViewBas
8080
* {@link QgsAttributeTableFilterModel::ShowVisible}
8181
* @param request Use a modified request to limit the shown features
8282
* @param context The context in which this view is shown
83+
* @param loadFeatures whether to initially load all features into the view. If set to
84+
* false, limited features can later be loaded using setFilterMode()
8385
*/
84-
void init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request = QgsFeatureRequest(), const QgsAttributeEditorContext &context = QgsAttributeEditorContext() );
86+
void init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request = QgsFeatureRequest(), const QgsAttributeEditorContext &context = QgsAttributeEditorContext(),
87+
bool loadFeatures = true );
8588

8689
/**
8790
* Change the current view mode.

0 commit comments

Comments
 (0)