@@ -70,6 +70,8 @@ QgsDualView::QgsDualView( QWidget *parent )
70
70
71
71
void QgsDualView::init ( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, const QgsAttributeEditorContext &context )
72
72
{
73
+ mMapCanvas = mapCanvas;
74
+
73
75
if ( !layer )
74
76
return ;
75
77
@@ -192,15 +194,66 @@ QgsDualView::ViewMode QgsDualView::view() const
192
194
193
195
void QgsDualView::setFilterMode ( QgsAttributeTableFilterModel::FilterMode filterMode )
194
196
{
195
- bool needsGeometry = filterMode == QgsAttributeTableFilterModel::ShowVisible;
197
+ if ( mFilterModel ->filterMode () == filterMode )
198
+ return ;
199
+
200
+ // cleanup any existing connections
201
+ switch ( mFilterModel ->filterMode () )
202
+ {
203
+ case QgsAttributeTableFilterModel::ShowVisible:
204
+ disconnect ( mMapCanvas , &QgsMapCanvas::extentsChanged, this , &QgsDualView::extentChanged );
205
+ break ;
206
+
207
+ case QgsAttributeTableFilterModel::ShowAll:
208
+ case QgsAttributeTableFilterModel::ShowEdited:
209
+ case QgsAttributeTableFilterModel::ShowFilteredList:
210
+ break ;
211
+
212
+ case QgsAttributeTableFilterModel::ShowSelected:
213
+ disconnect ( masterModel ()->layer (), &QgsVectorLayer::selectionChanged, this , &QgsDualView::updateSelectedFeatures );
214
+ break ;
215
+ }
196
216
197
217
QgsFeatureRequest r = mMasterModel ->request ();
218
+ bool needsGeometry = filterMode == QgsAttributeTableFilterModel::ShowVisible;
219
+
198
220
if ( !needsGeometry )
199
221
r.setFlags ( r.flags () | QgsFeatureRequest::NoGeometry );
200
222
else
201
223
r.setFlags ( r.flags () & ~( QgsFeatureRequest::NoGeometry ) );
224
+
225
+ switch ( filterMode )
226
+ {
227
+ case QgsAttributeTableFilterModel::ShowVisible:
228
+ connect ( mMapCanvas , &QgsMapCanvas::extentsChanged, this , &QgsDualView::extentChanged );
229
+ r.setFilterFids ( QgsFeatureIds () );
230
+ r.disableFilter ();
231
+ if ( mMapCanvas )
232
+ {
233
+ QgsRectangle rect = mMapCanvas ->mapSettings ().mapToLayerCoordinates ( mLayer , mMapCanvas ->extent () );
234
+ r.setFilterRect ( rect );
235
+ }
236
+ break ;
237
+
238
+ case QgsAttributeTableFilterModel::ShowAll:
239
+ case QgsAttributeTableFilterModel::ShowEdited:
240
+ case QgsAttributeTableFilterModel::ShowFilteredList:
241
+ r.setFilterFids ( QgsFeatureIds () );
242
+ r.disableFilter ();
243
+ break ;
244
+
245
+ case QgsAttributeTableFilterModel::ShowSelected:
246
+ connect ( masterModel ()->layer (), &QgsVectorLayer::selectionChanged, this , &QgsDualView::updateSelectedFeatures );
247
+ if ( masterModel ()->layer ()->selectedFeatureCount () > 0 )
248
+ r.setFilterFids ( masterModel ()->layer ()->selectedFeatureIds () );
249
+ else
250
+ r.disableFilter ();
251
+ break ;
252
+ }
253
+
202
254
mMasterModel ->setRequest ( r );
203
255
whileBlocking ( mLayerCache )->setCacheGeometry ( needsGeometry );
256
+ mMasterModel ->loadLayer ();
204
257
205
258
mFilterModel ->setFilterMode ( filterMode );
206
259
emit filterChanged ();
@@ -649,6 +702,29 @@ void QgsDualView::sortByPreviewExpression()
649
702
setSortExpression ( mFeatureList ->displayExpression (), sortOrder );
650
703
}
651
704
705
+ void QgsDualView::updateSelectedFeatures ()
706
+ {
707
+ QgsFeatureRequest r = mMasterModel ->request ();
708
+ if ( masterModel ()->layer ()->selectedFeatureCount () > 0 )
709
+ r.setFilterFids ( masterModel ()->layer ()->selectedFeatureIds () );
710
+ else
711
+ r.disableFilter ();
712
+ mMasterModel ->setRequest ( r );
713
+ mMasterModel ->loadLayer ();
714
+ }
715
+
716
+ void QgsDualView::extentChanged ()
717
+ {
718
+ QgsFeatureRequest r = mMasterModel ->request ();
719
+ if ( mMapCanvas )
720
+ {
721
+ QgsRectangle rect = mMapCanvas ->mapSettings ().mapToLayerCoordinates ( mLayer , mMapCanvas ->extent () );
722
+ r.setFilterRect ( rect );
723
+ }
724
+ mMasterModel ->setRequest ( r );
725
+ mMasterModel ->loadLayer ();
726
+ }
727
+
652
728
void QgsDualView::featureFormAttributeChanged ()
653
729
{
654
730
mFeatureList ->setCurrentFeatureEdited ( true );
0 commit comments