mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-14 00:07:35 -04:00
Avoid unnecessary reloads layer for attribute table
On behalf of Faunalia, sponsored by ENEL
This commit is contained in:
parent
e1d80b5bbb
commit
6cd97d8bcb
@ -32,16 +32,8 @@ class QgsDualView : QStackedWidget
|
||||
explicit QgsDualView( QWidget* parent /TransferThis/ = 0 );
|
||||
virtual ~QgsDualView();
|
||||
|
||||
/**
|
||||
* Has to be called to initialize the dual view.
|
||||
*
|
||||
* @param layer The layer which should be used to fetch features
|
||||
* @param mapCanvas The mapCanvas (used for the FilterMode
|
||||
* {@link QgsAttributeTableFilterModel::ShowVisible}
|
||||
* @param request Use a modified request to limit the shown features
|
||||
* @param context The context in which this view is shown
|
||||
*/
|
||||
void init( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, const QgsFeatureRequest& request = QgsFeatureRequest(), const QgsAttributeEditorContext& context = QgsAttributeEditorContext() );
|
||||
void init( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, const QgsFeatureRequest& request = QgsFeatureRequest(), const QgsAttributeEditorContext& context = QgsAttributeEditorContext(),
|
||||
bool loadFeatures = true );
|
||||
|
||||
/**
|
||||
* Change the current view mode.
|
||||
|
@ -157,7 +157,7 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *layer, QWidget
|
||||
r.setFlags( QgsFeatureRequest::NoGeometry );
|
||||
|
||||
// Initialize dual view
|
||||
mMainView->init( mLayer, QgisApp::instance()->mapCanvas(), r, mEditorContext );
|
||||
mMainView->init( mLayer, QgisApp::instance()->mapCanvas(), r, mEditorContext, false );
|
||||
|
||||
QgsAttributeTableConfig config = mLayer->attributeTableConfig();
|
||||
mMainView->setAttributeTableConfig( config );
|
||||
|
@ -68,7 +68,7 @@ QgsDualView::QgsDualView( QWidget *parent )
|
||||
connect( mFeatureList, &QgsFeatureListView::displayExpressionChanged, this, &QgsDualView::previewExpressionChanged );
|
||||
}
|
||||
|
||||
void QgsDualView::init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, const QgsAttributeEditorContext &context )
|
||||
void QgsDualView::init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, const QgsAttributeEditorContext &context, bool loadFeatures )
|
||||
{
|
||||
mMapCanvas = mapCanvas;
|
||||
|
||||
@ -85,7 +85,7 @@ void QgsDualView::init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const Qg
|
||||
connect( mTableView, &QgsAttributeTableView::columnResized, this, &QgsDualView::tableColumnResized );
|
||||
|
||||
initLayerCache( !( request.flags() & QgsFeatureRequest::NoGeometry ) || !request.filterRect().isNull() );
|
||||
initModels( mapCanvas, request );
|
||||
initModels( mapCanvas, request, loadFeatures );
|
||||
|
||||
mConditionalFormatWidget->setLayer( mLayer );
|
||||
|
||||
@ -194,9 +194,6 @@ QgsDualView::ViewMode QgsDualView::view() const
|
||||
|
||||
void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filterMode )
|
||||
{
|
||||
if ( mFilterModel->filterMode() == filterMode )
|
||||
return;
|
||||
|
||||
// cleanup any existing connections
|
||||
switch ( mFilterModel->filterMode() )
|
||||
{
|
||||
@ -217,17 +214,23 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
|
||||
QgsFeatureRequest r = mMasterModel->request();
|
||||
bool needsGeometry = filterMode == QgsAttributeTableFilterModel::ShowVisible;
|
||||
|
||||
bool requiresTableReload = ( r.filterType() != QgsFeatureRequest::FilterNone || !r.filterRect().isNull() ) // previous request was subset
|
||||
|| ( needsGeometry && r.flags() & QgsFeatureRequest::NoGeometry ) // no geometry for last request
|
||||
|| ( mMasterModel->rowCount() == 0 ); // no features
|
||||
|
||||
if ( !needsGeometry )
|
||||
r.setFlags( r.flags() | QgsFeatureRequest::NoGeometry );
|
||||
else
|
||||
r.setFlags( r.flags() & ~( QgsFeatureRequest::NoGeometry ) );
|
||||
r.setFilterFids( QgsFeatureIds() );
|
||||
r.setFilterRect( QgsRectangle() );
|
||||
r.disableFilter();
|
||||
|
||||
// setup new connections and filter request parameters
|
||||
switch ( filterMode )
|
||||
{
|
||||
case QgsAttributeTableFilterModel::ShowVisible:
|
||||
connect( mMapCanvas, &QgsMapCanvas::extentsChanged, this, &QgsDualView::extentChanged );
|
||||
r.setFilterFids( QgsFeatureIds() );
|
||||
r.disableFilter();
|
||||
if ( mMapCanvas )
|
||||
{
|
||||
QgsRectangle rect = mMapCanvas->mapSettings().mapToLayerCoordinates( mLayer, mMapCanvas->extent() );
|
||||
@ -238,23 +241,23 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
|
||||
case QgsAttributeTableFilterModel::ShowAll:
|
||||
case QgsAttributeTableFilterModel::ShowEdited:
|
||||
case QgsAttributeTableFilterModel::ShowFilteredList:
|
||||
r.setFilterFids( QgsFeatureIds() );
|
||||
r.disableFilter();
|
||||
break;
|
||||
|
||||
case QgsAttributeTableFilterModel::ShowSelected:
|
||||
connect( masterModel()->layer(), &QgsVectorLayer::selectionChanged, this, &QgsDualView::updateSelectedFeatures );
|
||||
if ( masterModel()->layer()->selectedFeatureCount() > 0 )
|
||||
r.setFilterFids( masterModel()->layer()->selectedFeatureIds() );
|
||||
else
|
||||
r.disableFilter();
|
||||
break;
|
||||
}
|
||||
|
||||
mMasterModel->setRequest( r );
|
||||
whileBlocking( mLayerCache )->setCacheGeometry( needsGeometry );
|
||||
mMasterModel->loadLayer();
|
||||
if ( requiresTableReload )
|
||||
{
|
||||
mMasterModel->setRequest( r );
|
||||
whileBlocking( mLayerCache )->setCacheGeometry( needsGeometry );
|
||||
mMasterModel->loadLayer();
|
||||
}
|
||||
|
||||
//update filter model
|
||||
mFilterModel->setFilterMode( filterMode );
|
||||
emit filterChanged();
|
||||
}
|
||||
@ -278,7 +281,7 @@ void QgsDualView::initLayerCache( bool cacheGeometry )
|
||||
}
|
||||
}
|
||||
|
||||
void QgsDualView::initModels( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request )
|
||||
void QgsDualView::initModels( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request, bool loadFeatures )
|
||||
{
|
||||
delete mFeatureListModel;
|
||||
delete mFilterModel;
|
||||
@ -294,7 +297,8 @@ void QgsDualView::initModels( QgsMapCanvas *mapCanvas, const QgsFeatureRequest &
|
||||
|
||||
connect( mConditionalFormatWidget, &QgsFieldConditionalFormatWidget::rulesUpdated, mMasterModel, &QgsAttributeTableModel::fieldConditionalStyleChanged );
|
||||
|
||||
mMasterModel->loadLayer();
|
||||
if ( loadFeatures )
|
||||
mMasterModel->loadLayer();
|
||||
|
||||
mFilterModel = new QgsAttributeTableFilterModel( mapCanvas, mMasterModel, mMasterModel );
|
||||
|
||||
@ -711,6 +715,9 @@ void QgsDualView::sortByPreviewExpression()
|
||||
void QgsDualView::updateSelectedFeatures()
|
||||
{
|
||||
QgsFeatureRequest r = mMasterModel->request();
|
||||
if ( r.filterType() == QgsFeatureRequest::FilterNone && r.filterRect().isNull() )
|
||||
return; // already requested all features
|
||||
|
||||
if ( masterModel()->layer()->selectedFeatureCount() > 0 )
|
||||
r.setFilterFids( masterModel()->layer()->selectedFeatureIds() );
|
||||
else
|
||||
@ -722,13 +729,13 @@ void QgsDualView::updateSelectedFeatures()
|
||||
void QgsDualView::extentChanged()
|
||||
{
|
||||
QgsFeatureRequest r = mMasterModel->request();
|
||||
if ( mMapCanvas )
|
||||
if ( mMapCanvas && ( r.filterType() != QgsFeatureRequest::FilterNone || !r.filterRect().isNull() ) )
|
||||
{
|
||||
QgsRectangle rect = mMapCanvas->mapSettings().mapToLayerCoordinates( mLayer, mMapCanvas->extent() );
|
||||
r.setFilterRect( rect );
|
||||
mMasterModel->setRequest( r );
|
||||
mMasterModel->loadLayer();
|
||||
}
|
||||
mMasterModel->setRequest( r );
|
||||
mMasterModel->loadLayer();
|
||||
}
|
||||
|
||||
void QgsDualView::featureFormAttributeChanged()
|
||||
|
@ -80,8 +80,11 @@ class GUI_EXPORT QgsDualView : public QStackedWidget, private Ui::QgsDualViewBas
|
||||
* {@link QgsAttributeTableFilterModel::ShowVisible}
|
||||
* @param request Use a modified request to limit the shown features
|
||||
* @param context The context in which this view is shown
|
||||
* @param loadFeatures whether to initially load all features into the view. If set to
|
||||
* false, limited features can later be loaded using setFilterMode()
|
||||
*/
|
||||
void init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request = QgsFeatureRequest(), const QgsAttributeEditorContext &context = QgsAttributeEditorContext() );
|
||||
void init( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request = QgsFeatureRequest(), const QgsAttributeEditorContext &context = QgsAttributeEditorContext(),
|
||||
bool loadFeatures = true );
|
||||
|
||||
/**
|
||||
* Change the current view mode.
|
||||
|
Loading…
x
Reference in New Issue
Block a user