@@ -68,7 +68,7 @@ QgsDualView::QgsDualView( QWidget* parent )
68
68
connect ( mFeatureList , SIGNAL ( displayExpressionChanged ( QString ) ), this , SLOT ( previewExpressionChanged ( QString ) ) );
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 , SIGNAL ( columnResized ( int , int ) ), this , SLOT ( tableColumnResized ( int , int ) ) );
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
@@ -238,9 +238,6 @@ QgsDualView::ViewMode QgsDualView::view() const
238
238
239
239
void QgsDualView::setFilterMode ( QgsAttributeTableFilterModel::FilterMode filterMode )
240
240
{
241
- if ( mFilterModel ->filterMode () == filterMode )
242
- return ;
243
-
244
241
// cleanup any existing connections
245
242
switch ( mFilterModel ->filterMode () )
246
243
{
@@ -262,17 +259,23 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
262
259
QgsFeatureRequest r = mMasterModel ->request ();
263
260
bool needsGeometry = filterMode == QgsAttributeTableFilterModel::ShowVisible;
264
261
262
+ bool requiresTableReload = ( r.filterType () != QgsFeatureRequest::FilterNone || !r.filterRect ().isNull () ) // previous request was subset
263
+ || ( needsGeometry && r.flags () & QgsFeatureRequest::NoGeometry ) // no geometry for last request
264
+ || ( mMasterModel ->rowCount () == 0 ); // no features
265
+
265
266
if ( !needsGeometry )
266
267
r.setFlags ( r.flags () | QgsFeatureRequest::NoGeometry );
267
268
else
268
269
r.setFlags ( r.flags () & ~( QgsFeatureRequest::NoGeometry ) );
270
+ r.setFilterFids ( QgsFeatureIds () );
271
+ r.setFilterRect ( QgsRectangle () );
272
+ r.disableFilter ();
269
273
274
+ // setup new connections and filter request parameters
270
275
switch ( filterMode )
271
276
{
272
277
case QgsAttributeTableFilterModel::ShowVisible:
273
278
connect ( mMapCanvas , SIGNAL ( extentsChanged () ), this , SLOT ( extentChanged () ) );
274
- r.setFilterFids ( QgsFeatureIds () );
275
- r.disableFilter ();
276
279
if ( mMapCanvas )
277
280
{
278
281
QgsRectangle rect = mMapCanvas ->mapSettings ().mapToLayerCoordinates ( mLayer , mMapCanvas ->extent () );
@@ -283,23 +286,23 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
283
286
case QgsAttributeTableFilterModel::ShowAll:
284
287
case QgsAttributeTableFilterModel::ShowEdited:
285
288
case QgsAttributeTableFilterModel::ShowFilteredList:
286
- r.setFilterFids ( QgsFeatureIds () );
287
- r.disableFilter ();
288
289
break ;
289
290
290
291
case QgsAttributeTableFilterModel::ShowSelected:
291
292
connect ( masterModel ()->layer (), SIGNAL ( selectionChanged () ), this , SLOT ( updateSelectedFeatures () ) );
292
293
if ( masterModel ()->layer ()->selectedFeatureCount () > 0 )
293
294
r.setFilterFids ( masterModel ()->layer ()->selectedFeaturesIds () );
294
- else
295
- r.disableFilter ();
296
295
break ;
297
296
}
298
297
299
- mMasterModel ->setRequest ( r );
300
- whileBlocking ( mLayerCache )->setCacheGeometry ( needsGeometry );
301
- mMasterModel ->loadLayer ();
298
+ if ( requiresTableReload )
299
+ {
300
+ mMasterModel ->setRequest ( r );
301
+ whileBlocking ( mLayerCache )->setCacheGeometry ( needsGeometry );
302
+ mMasterModel ->loadLayer ();
303
+ }
302
304
305
+ // update filter model
303
306
mFilterModel ->setFilterMode ( filterMode );
304
307
emit filterChanged ();
305
308
}
@@ -318,12 +321,12 @@ void QgsDualView::initLayerCache( bool cacheGeometry )
318
321
mLayerCache ->setCacheGeometry ( cacheGeometry );
319
322
if ( 0 == cacheSize || 0 == ( QgsVectorDataProvider::SelectAtId & mLayer ->dataProvider ()->capabilities () ) )
320
323
{
321
- connect ( mLayerCache , SIGNAL (invalidated ()), this , SLOT (rebuildFullLayerCache ()) );
324
+ connect ( mLayerCache , SIGNAL ( invalidated () ), this , SLOT ( rebuildFullLayerCache () ) );
322
325
rebuildFullLayerCache ();
323
326
}
324
327
}
325
328
326
- void QgsDualView::initModels ( QgsMapCanvas* mapCanvas, const QgsFeatureRequest& request )
329
+ void QgsDualView::initModels ( QgsMapCanvas * mapCanvas, const QgsFeatureRequest & request, bool loadFeatures )
327
330
{
328
331
delete mFeatureListModel ;
329
332
delete mFilterModel ;
@@ -339,7 +342,8 @@ void QgsDualView::initModels( QgsMapCanvas* mapCanvas, const QgsFeatureRequest&
339
342
340
343
connect ( mConditionalFormatWidget , SIGNAL ( rulesUpdated ( QString ) ), mMasterModel , SLOT ( fieldConditionalStyleChanged ( QString ) ) );
341
344
342
- mMasterModel ->loadLayer ();
345
+ if ( loadFeatures )
346
+ mMasterModel ->loadLayer ();
343
347
344
348
mFilterModel = new QgsAttributeTableFilterModel ( mapCanvas, mMasterModel , mMasterModel );
345
349
@@ -714,8 +718,8 @@ void QgsDualView::zoomToCurrentFeature()
714
718
715
719
void QgsDualView::rebuildFullLayerCache ()
716
720
{
717
- connect ( mLayerCache , SIGNAL (progress (int ,bool &) ), this , SLOT (progress (int ,bool &) ), Qt::UniqueConnection );
718
- connect ( mLayerCache , SIGNAL (finished ()), this , SLOT (finished ()), Qt::UniqueConnection );
721
+ connect ( mLayerCache , SIGNAL ( progress ( int , bool & ) ), this , SLOT ( progress ( int , bool & ) ), Qt::UniqueConnection );
722
+ connect ( mLayerCache , SIGNAL ( finished () ), this , SLOT ( finished () ), Qt::UniqueConnection );
719
723
720
724
mLayerCache ->setFullCache ( true );
721
725
}
@@ -746,6 +750,9 @@ void QgsDualView::sortByPreviewExpression()
746
750
void QgsDualView::updateSelectedFeatures ()
747
751
{
748
752
QgsFeatureRequest r = mMasterModel ->request ();
753
+ if ( r.filterType () == QgsFeatureRequest::FilterNone && r.filterRect ().isNull () )
754
+ return ; // already requested all features
755
+
749
756
if ( masterModel ()->layer ()->selectedFeatureCount () > 0 )
750
757
r.setFilterFids ( masterModel ()->layer ()->selectedFeaturesIds () );
751
758
else
@@ -757,13 +764,13 @@ void QgsDualView::updateSelectedFeatures()
757
764
void QgsDualView::extentChanged ()
758
765
{
759
766
QgsFeatureRequest r = mMasterModel ->request ();
760
- if ( mMapCanvas )
767
+ if ( mMapCanvas && ( r. filterType () != QgsFeatureRequest::FilterNone || !r. filterRect (). isNull () ) )
761
768
{
762
769
QgsRectangle rect = mMapCanvas ->mapSettings ().mapToLayerCoordinates ( mLayer , mMapCanvas ->extent () );
763
770
r.setFilterRect ( rect );
771
+ mMasterModel ->setRequest ( r );
772
+ mMasterModel ->loadLayer ();
764
773
}
765
- mMasterModel ->setRequest ( r );
766
- mMasterModel ->loadLayer ();
767
774
}
768
775
769
776
void QgsDualView::featureFormAttributeChanged ()
0 commit comments