Skip to content

Commit 0290b8c

Browse files
committedMay 5, 2020
timer on reload visible features (according to extend) and on filtering features (according to filter) to avoid long reload time in case a signal (like featureAdded) is called multiple times in short period
1 parent 92547ed commit 0290b8c

File tree

4 files changed

+61
-14
lines changed

4 files changed

+61
-14
lines changed
 

‎python/gui/auto_generated/attributetable/qgsattributetablefiltermodel.sip.in

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,16 @@ Emitted whenever the sort column is changed
214214

215215
:param column: The sort column
216216
:param order: The sort order
217+
%End
218+
219+
void featuresFiltered();
220+
%Docstring
221+
Emitted when the filtering of the features has been done
222+
%End
223+
224+
void visibleReloaded();
225+
%Docstring
226+
Emitted when the the visible features on extend are reloaded (the list is created)
217227
%End
218228

219229
protected:

‎src/gui/attributetable/qgsattributetablefiltermodel.cpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ QgsAttributeTableFilterModel::QgsAttributeTableFilterModel( QgsMapCanvas *canvas
4040
setDynamicSortFilter( true );
4141
setSortRole( QgsAttributeTableModel::SortRole );
4242
connect( layer(), &QgsVectorLayer::selectionChanged, this, &QgsAttributeTableFilterModel::selectionChanged );
43+
44+
mReloadVisibleTimer.setSingleShot( true );
45+
connect( &mReloadVisibleTimer, &QTimer::timeout, this, &QgsAttributeTableFilterModel::reloadVisible );
46+
mFilterFeaturesTimer.setSingleShot( true );
47+
connect( &mFilterFeaturesTimer, &QTimer::timeout, this, &QgsAttributeTableFilterModel::filterFeatures );
4348
}
4449

4550
bool QgsAttributeTableFilterModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const
@@ -322,42 +327,42 @@ void QgsAttributeTableFilterModel::setFilterMode( FilterMode filterMode )
322327
switch ( mFilterMode )
323328
{
324329
case ShowVisible:
325-
disconnect( mCanvas, &QgsMapCanvas::extentsChanged, this, &QgsAttributeTableFilterModel::reloadVisible );
326-
disconnect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::reloadVisible );
327-
disconnect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::reloadVisible );
328-
disconnect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::reloadVisible );
330+
disconnect( mCanvas, &QgsMapCanvas::extentsChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible );
331+
disconnect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedReloadVisible );
332+
disconnect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible );
333+
disconnect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::startTimedReloadVisible );
329334
break;
330335
case ShowAll:
331336
case ShowEdited:
332337
case ShowSelected:
333338
break;
334339
case ShowFilteredList:
335-
disconnect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::filterFeatures );
340+
disconnect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures );
341+
disconnect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures );
336342
disconnect( layer(), &QgsVectorLayer::attributeValueChanged, this, &QgsAttributeTableFilterModel::onAttributeValueChanged );
337343
disconnect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::onGeometryChanged );
338-
disconnect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::filterFeatures );
339344
break;
340345
}
341346

342347
// setup new connections
343348
switch ( filterMode )
344349
{
345350
case ShowVisible:
346-
connect( mCanvas, &QgsMapCanvas::extentsChanged, this, &QgsAttributeTableFilterModel::reloadVisible );
347-
connect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::reloadVisible );
348-
connect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::reloadVisible );
349-
connect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::reloadVisible );
351+
connect( mCanvas, &QgsMapCanvas::extentsChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible );
352+
connect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedReloadVisible );
353+
connect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::startTimedReloadVisible );
354+
connect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::startTimedReloadVisible );
350355
generateListOfVisibleFeatures();
351356
break;
352357
case ShowAll:
353358
case ShowEdited:
354359
case ShowSelected:
355360
break;
356361
case ShowFilteredList:
357-
connect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::filterFeatures );
362+
connect( layer(), &QgsVectorLayer::featureAdded, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures );
363+
connect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::startTimedFilterFeatures );
358364
connect( layer(), &QgsVectorLayer::attributeValueChanged, this, &QgsAttributeTableFilterModel::onAttributeValueChanged );
359365
connect( layer(), &QgsVectorLayer::geometryChanged, this, &QgsAttributeTableFilterModel::onGeometryChanged );
360-
connect( mTableModel, &QgsAttributeTableModel::finished, this, &QgsAttributeTableFilterModel::filterFeatures );
361366
break;
362367
}
363368

@@ -420,6 +425,7 @@ void QgsAttributeTableFilterModel::reloadVisible()
420425
{
421426
generateListOfVisibleFeatures();
422427
invalidateFilter();
428+
emit visibleReloaded();
423429
}
424430

425431
void QgsAttributeTableFilterModel::onAttributeValueChanged( QgsFeatureId fid, int idx, const QVariant &value )
@@ -429,18 +435,28 @@ void QgsAttributeTableFilterModel::onAttributeValueChanged( QgsFeatureId fid, in
429435

430436
if ( mFilterExpression.referencedAttributeIndexes( layer()->fields() ).contains( idx ) )
431437
{
432-
filterFeatures();
438+
startTimedFilterFeatures();
433439
}
434440
}
435441

436442
void QgsAttributeTableFilterModel::onGeometryChanged()
437443
{
438444
if ( mFilterExpression.needsGeometry() )
439445
{
440-
filterFeatures();
446+
startTimedFilterFeatures();
441447
}
442448
}
443449

450+
void QgsAttributeTableFilterModel::startTimedReloadVisible()
451+
{
452+
mReloadVisibleTimer.start( 10 );
453+
}
454+
455+
void QgsAttributeTableFilterModel::startTimedFilterFeatures()
456+
{
457+
mFilterFeaturesTimer.start( 10 );
458+
}
459+
444460
void QgsAttributeTableFilterModel::filterFeatures()
445461
{
446462
if ( !mFilterExpression.isValid() )
@@ -490,6 +506,8 @@ void QgsAttributeTableFilterModel::filterFeatures()
490506
setFilteredFeatures( filteredFeatures );
491507

492508
QApplication::restoreOverrideCursor();
509+
510+
emit featuresFiltered();
493511
}
494512

495513

‎src/gui/attributetable/qgsattributetablefiltermodel.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,16 @@ class GUI_EXPORT QgsAttributeTableFilterModel: public QSortFilterProxyModel, pub
238238
*/
239239
void sortColumnChanged( int column, Qt::SortOrder order );
240240

241+
/**
242+
* Emitted when the filtering of the features has been done
243+
*/
244+
void featuresFiltered();
245+
246+
/**
247+
* Emitted when the the visible features on extend are reloaded (the list is created)
248+
*/
249+
void visibleReloaded();
250+
241251
protected:
242252

243253
/**
@@ -300,6 +310,10 @@ class GUI_EXPORT QgsAttributeTableFilterModel: public QSortFilterProxyModel, pub
300310
int mapColumnToSource( int column ) const;
301311
int mapColumnFromSource( int column ) const;
302312

313+
QTimer mReloadVisibleTimer;
314+
QTimer mFilterFeaturesTimer;
315+
void startTimedReloadVisible();
316+
void startTimedFilterFeatures();
303317
};
304318

305319
#endif

‎tests/src/gui/testqgsdualview.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,14 +164,19 @@ void TestQgsDualView::testFilterSelected()
164164

165165
void TestQgsDualView::testSelectAll()
166166
{
167+
168+
QEventLoop loop;
169+
connect( qobject_cast<QgsAttributeTableFilterModel *>( mDualView->mFilterModel ), &QgsAttributeTableFilterModel::visibleReloaded, &loop, &QEventLoop::quit );
167170
mDualView->setFilterMode( QgsAttributeTableFilterModel::ShowVisible );
168171
// Only show parts of the canvas, so only one selected feature is visible
169172
mCanvas->setExtent( QgsRectangle( -139, 23, -100, 48 ) );
173+
loop.exec();
170174
mDualView->mTableView->selectAll();
171175
QCOMPARE( mPointsLayer->selectedFeatureCount(), 10 );
172176

173177
mPointsLayer->selectByIds( QgsFeatureIds() );
174178
mCanvas->setExtent( QgsRectangle( -110, 40, -100, 48 ) );
179+
loop.exec();
175180
mDualView->mTableView->selectAll();
176181
QCOMPARE( mPointsLayer->selectedFeatureCount(), 1 );
177182
}

0 commit comments

Comments
 (0)
Please sign in to comment.