From c6823d8dd465379daa6602c97d74a57ebc6531cf Mon Sep 17 00:00:00 2001 From: David Signer Date: Mon, 11 May 2020 11:33:52 +0200 Subject: [PATCH] split the disconnecting and connecting on filtermodel change to methods, so the disconnect can be called on qgsdualview before the reload of the layer without doing an invalidate() (called in setFilterMode of the qgsattributetablefiltermodel) --- .../qgsattributetablefiltermodel.sip.in | 10 +++ .../qgsattributetablefiltermodel.cpp | 90 ++++++++++--------- .../qgsattributetablefiltermodel.h | 10 +++ src/gui/attributetable/qgsdualview.cpp | 10 ++- 4 files changed, 73 insertions(+), 47 deletions(-) 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(); }