@@ -68,7 +68,7 @@ QgsDualView::QgsDualView( QWidget *parent )
68
68
connect ( mFeatureList , &QgsFeatureListView::displayExpressionChanged, this , &QgsDualView::previewExpressionChanged );
69
69
}
70
70
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 )
72
72
{
73
73
mMapCanvas = mapCanvas;
74
74
@@ -85,7 +85,7 @@ void QgsDualView::init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const Qg
85
85
connect ( mTableView , &QgsAttributeTableView::columnResized, this , &QgsDualView::tableColumnResized );
86
86
87
87
initLayerCache ( !( request.flags () & QgsFeatureRequest::NoGeometry ) || !request.filterRect ().isNull () );
88
- initModels ( mapCanvas, request );
88
+ initModels ( mapCanvas, request, loadFeatures );
89
89
90
90
mConditionalFormatWidget ->setLayer ( mLayer );
91
91
@@ -194,9 +194,6 @@ QgsDualView::ViewMode QgsDualView::view() const
194
194
195
195
void QgsDualView::setFilterMode ( QgsAttributeTableFilterModel::FilterMode filterMode )
196
196
{
197
- if ( mFilterModel ->filterMode () == filterMode )
198
- return ;
199
-
200
197
// cleanup any existing connections
201
198
switch ( mFilterModel ->filterMode () )
202
199
{
@@ -217,17 +214,23 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
217
214
QgsFeatureRequest r = mMasterModel ->request ();
218
215
bool needsGeometry = filterMode == QgsAttributeTableFilterModel::ShowVisible;
219
216
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
+
220
221
if ( !needsGeometry )
221
222
r.setFlags ( r.flags () | QgsFeatureRequest::NoGeometry );
222
223
else
223
224
r.setFlags ( r.flags () & ~( QgsFeatureRequest::NoGeometry ) );
225
+ r.setFilterFids ( QgsFeatureIds () );
226
+ r.setFilterRect ( QgsRectangle () );
227
+ r.disableFilter ();
224
228
229
+ // setup new connections and filter request parameters
225
230
switch ( filterMode )
226
231
{
227
232
case QgsAttributeTableFilterModel::ShowVisible:
228
233
connect ( mMapCanvas , &QgsMapCanvas::extentsChanged, this , &QgsDualView::extentChanged );
229
- r.setFilterFids ( QgsFeatureIds () );
230
- r.disableFilter ();
231
234
if ( mMapCanvas )
232
235
{
233
236
QgsRectangle rect = mMapCanvas ->mapSettings ().mapToLayerCoordinates ( mLayer , mMapCanvas ->extent () );
@@ -238,23 +241,23 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
238
241
case QgsAttributeTableFilterModel::ShowAll:
239
242
case QgsAttributeTableFilterModel::ShowEdited:
240
243
case QgsAttributeTableFilterModel::ShowFilteredList:
241
- r.setFilterFids ( QgsFeatureIds () );
242
- r.disableFilter ();
243
244
break ;
244
245
245
246
case QgsAttributeTableFilterModel::ShowSelected:
246
247
connect ( masterModel ()->layer (), &QgsVectorLayer::selectionChanged, this , &QgsDualView::updateSelectedFeatures );
247
248
if ( masterModel ()->layer ()->selectedFeatureCount () > 0 )
248
249
r.setFilterFids ( masterModel ()->layer ()->selectedFeatureIds () );
249
- else
250
- r.disableFilter ();
251
250
break ;
252
251
}
253
252
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
+ }
257
259
260
+ // update filter model
258
261
mFilterModel ->setFilterMode ( filterMode );
259
262
emit filterChanged ();
260
263
}
@@ -278,7 +281,7 @@ void QgsDualView::initLayerCache( bool cacheGeometry )
278
281
}
279
282
}
280
283
281
- void QgsDualView::initModels ( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request )
284
+ void QgsDualView::initModels ( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, bool loadFeatures )
282
285
{
283
286
delete mFeatureListModel ;
284
287
delete mFilterModel ;
@@ -294,7 +297,8 @@ void QgsDualView::initModels( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &
294
297
295
298
connect ( mConditionalFormatWidget , &QgsFieldConditionalFormatWidget::rulesUpdated, mMasterModel , &QgsAttributeTableModel::fieldConditionalStyleChanged );
296
299
297
- mMasterModel ->loadLayer ();
300
+ if ( loadFeatures )
301
+ mMasterModel ->loadLayer ();
298
302
299
303
mFilterModel = new QgsAttributeTableFilterModel ( mapCanvas, mMasterModel , mMasterModel );
300
304
@@ -711,6 +715,9 @@ void QgsDualView::sortByPreviewExpression()
711
715
void QgsDualView::updateSelectedFeatures ()
712
716
{
713
717
QgsFeatureRequest r = mMasterModel ->request ();
718
+ if ( r.filterType () == QgsFeatureRequest::FilterNone && r.filterRect ().isNull () )
719
+ return ; // already requested all features
720
+
714
721
if ( masterModel ()->layer ()->selectedFeatureCount () > 0 )
715
722
r.setFilterFids ( masterModel ()->layer ()->selectedFeatureIds () );
716
723
else
@@ -722,13 +729,13 @@ void QgsDualView::updateSelectedFeatures()
722
729
void QgsDualView::extentChanged ()
723
730
{
724
731
QgsFeatureRequest r = mMasterModel ->request ();
725
- if ( mMapCanvas )
732
+ if ( mMapCanvas && ( r. filterType () != QgsFeatureRequest::FilterNone || !r. filterRect (). isNull () ) )
726
733
{
727
734
QgsRectangle rect = mMapCanvas ->mapSettings ().mapToLayerCoordinates ( mLayer , mMapCanvas ->extent () );
728
735
r.setFilterRect ( rect );
736
+ mMasterModel ->setRequest ( r );
737
+ mMasterModel ->loadLayer ();
729
738
}
730
- mMasterModel ->setRequest ( r );
731
- mMasterModel ->loadLayer ();
732
739
}
733
740
734
741
void QgsDualView::featureFormAttributeChanged ()
0 commit comments