diff --git a/python/gui/auto_generated/attributetable/qgsattributetablefiltermodel.sip.in b/python/gui/auto_generated/attributetable/qgsattributetablefiltermodel.sip.in index f815d4be9ca..984fb09b002 100644 --- a/python/gui/auto_generated/attributetable/qgsattributetablefiltermodel.sip.in +++ b/python/gui/auto_generated/attributetable/qgsattributetablefiltermodel.sip.in @@ -92,6 +92,16 @@ Gets a list of currently filtered feature ids Set the filter mode the filter will use. :param filterMode: Sets the current mode of the filter +%End + + void disconnectFilterModeConnections(); +%Docstring +Disconnect the connections set for the current filterMode +%End + + void connectFilterModeConnections( FilterMode filterMode ); +%Docstring +Disconnect the connections set for the new ``filterMode`` %End FilterMode filterMode(); diff --git a/src/gui/attributetable/qgsattributetablefiltermodel.cpp b/src/gui/attributetable/qgsattributetablefiltermodel.cpp index a0582d3c5a8..e7fbe6ee21a 100644 --- a/src/gui/attributetable/qgsattributetablefiltermodel.cpp +++ b/src/gui/attributetable/qgsattributetablefiltermodel.cpp @@ -323,54 +323,58 @@ void QgsAttributeTableFilterModel::setFilterMode( FilterMode filterMode ) { if ( filterMode != mFilterMode ) { - // cleanup existing connections - switch ( mFilterMode ) - { - case ShowVisible: - disconnect( mCanvas, &QgsMapCanvas::extentsChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); - disconnect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); - disconnect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); - disconnect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); - break; - case ShowAll: - case ShowEdited: - case ShowSelected: - break; - case ShowFilteredList: - disconnect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures ); - disconnect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures ); - disconnect( layer(), &QgsVectorLayer::attributeValueChanged, this, &QgsAttributeTableFilterModel::onAttributeValueChanged ); - disconnect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::onGeometryChanged ); - break; - } - - // setup new connections - switch ( filterMode ) - { - case ShowVisible: - connect( mCanvas, &QgsMapCanvas::extentsChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); - connect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); - connect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); - connect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); - generateListOfVisibleFeatures(); - break; - case ShowAll: - case ShowEdited: - case ShowSelected: - break; - case ShowFilteredList: - connect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures ); - connect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures ); - connect( layer(), &QgsVectorLayer::attributeValueChanged, this, &QgsAttributeTableFilterModel::onAttributeValueChanged ); - connect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::onGeometryChanged ); - break; - } - + disconnectFilterModeConnections(); + connectFilterModeConnections( filterMode ); mFilterMode = filterMode; invalidateFilter(); } } +void QgsAttributeTableFilterModel::disconnectFilterModeConnections() +{ + // cleanup existing connections + switch ( mFilterMode ) + { + case ShowVisible: + disconnect( mCanvas, &QgsMapCanvas::extentsChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); + disconnect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); + disconnect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); + break; + case ShowAll: + case ShowEdited: + case ShowSelected: + break; + case ShowFilteredList: + disconnect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures ); + disconnect( layer(), &QgsVectorLayer::attributeValueChanged, this, &QgsAttributeTableFilterModel::onAttributeValueChanged ); + disconnect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::onGeometryChanged ); + break; + } +} + +void QgsAttributeTableFilterModel::connectFilterModeConnections( QgsAttributeTableFilterModel::FilterMode filterMode ) +{ + // setup new connections + switch ( filterMode ) + { + case ShowVisible: + connect( mCanvas, &QgsMapCanvas::extentsChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); + connect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); + connect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible ); + generateListOfVisibleFeatures(); + break; + case ShowAll: + case ShowEdited: + case ShowSelected: + break; + case ShowFilteredList: + connect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures ); + connect( layer(), &QgsVectorLayer::attributeValueChanged, this, &QgsAttributeTableFilterModel::onAttributeValueChanged ); + connect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::onGeometryChanged ); + break; + } +} + bool QgsAttributeTableFilterModel::filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const { Q_UNUSED( sourceParent ) diff --git a/src/gui/attributetable/qgsattributetablefiltermodel.h b/src/gui/attributetable/qgsattributetablefiltermodel.h index 805c3397957..de101fe6f48 100644 --- a/src/gui/attributetable/qgsattributetablefiltermodel.h +++ b/src/gui/attributetable/qgsattributetablefiltermodel.h @@ -127,6 +127,16 @@ class GUI_EXPORT QgsAttributeTableFilterModel: public QSortFilterProxyModel, pub */ void setFilterMode( FilterMode filterMode ); + /** + * Disconnect the connections set for the current filterMode + */ + void disconnectFilterModeConnections(); + + /** + * Disconnect the connections set for the new \a filterMode + */ + void connectFilterModeConnections( FilterMode filterMode ); + /** * The current filterModel */ diff --git a/src/gui/attributetable/qgsdualview.cpp b/src/gui/attributetable/qgsdualview.cpp index c2eafda7ea9..0b53701d25e 100644 --- a/src/gui/attributetable/qgsdualview.cpp +++ b/src/gui/attributetable/qgsdualview.cpp @@ -293,7 +293,7 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter case QgsAttributeTableFilterModel::ShowAll: case QgsAttributeTableFilterModel::ShowEdited: case QgsAttributeTableFilterModel::ShowFilteredList: - disconnect( mFilterModel, &QgsAttributeTableFilterModel::featuresFiltered, this, &QgsDualView::filterChanged ); + connect( mFilterModel, &QgsAttributeTableFilterModel::featuresFiltered, this, &QgsDualView::filterChanged ); break; case QgsAttributeTableFilterModel::ShowSelected: @@ -317,16 +317,18 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter break; } - //update filter model - mFilterModel->setFilterMode( filterMode ); - if ( requiresTableReload ) { + //disconnect the connections of the current (old) filtermode before reload + mFilterModel->disconnectFilterModeConnections(); + mMasterModel->setRequest( r ); whileBlocking( mLayerCache )->setCacheGeometry( needsGeometry ); mMasterModel->loadLayer(); } + //update filter model + mFilterModel->setFilterMode( filterMode ); emit filterChanged(); }