Skip to content

Commit 1577a57

Browse files
committedMay 21, 2017
Don't clear locator model immediately when a new search triggers
Instead delay the search until either a tiny timeout (100ms) or the first new results come in, whichever happens first. This avoids the list view clearing too frequently and giving a distracting "flashing" appearance when users type quickly into to locator bar.
1 parent d55fa22 commit 1577a57

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed
 

‎src/gui/locator/qgslocatorwidget.cpp

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ void QgsLocatorWidget::updateResults( const QString &text )
304304
else
305305
{
306306
mHasSelectedResult = false;
307-
mLocatorModel->clear();
307+
mLocatorModel->deferredClear();
308308
mLocator->fetchResults( text, createContext() );
309309
}
310310
}
@@ -350,16 +350,29 @@ QgsLocatorContext QgsLocatorWidget::createContext()
350350

351351
QgsLocatorModel::QgsLocatorModel( QObject *parent )
352352
: QAbstractTableModel( parent )
353-
{}
353+
{
354+
mDeferredClearTimer.setInterval( 100 );
355+
mDeferredClearTimer.setSingleShot( true );
356+
connect( &mDeferredClearTimer, &QTimer::timeout, this, &QgsLocatorModel::clear );
357+
}
354358

355359
void QgsLocatorModel::clear()
356360
{
361+
mDeferredClearTimer.stop();
362+
mDeferredClear = false;
363+
357364
beginResetModel();
358365
mResults.clear();
359366
mFoundResultsFromFilterNames.clear();
360367
endResetModel();
361368
}
362369

370+
void QgsLocatorModel::deferredClear()
371+
{
372+
mDeferredClear = true;
373+
mDeferredClearTimer.start();
374+
}
375+
363376
int QgsLocatorModel::rowCount( const QModelIndex & ) const
364377
{
365378
return mResults.size();
@@ -459,17 +472,29 @@ Qt::ItemFlags QgsLocatorModel::flags( const QModelIndex &index ) const
459472
flags = flags & ~( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
460473
}
461474
return flags;
462-
463475
}
464476

465477
void QgsLocatorModel::addResult( const QgsLocatorResult &result )
466478
{
479+
mDeferredClearTimer.stop();
480+
if ( mDeferredClear )
481+
{
482+
mFoundResultsFromFilterNames.clear();
483+
}
484+
467485
int pos = mResults.size();
468486
bool addingFilter = !result.filter->displayName().isEmpty() && !mFoundResultsFromFilterNames.contains( result.filter->name() );
469487
if ( addingFilter )
470488
mFoundResultsFromFilterNames << result.filter->name();
471489

472-
beginInsertRows( QModelIndex(), pos, pos + ( addingFilter ? 1 : 0 ) );
490+
if ( mDeferredClear )
491+
{
492+
beginResetModel();
493+
mResults.clear();
494+
}
495+
else
496+
beginInsertRows( QModelIndex(), pos, pos + ( addingFilter ? 1 : 0 ) );
497+
473498
if ( addingFilter )
474499
{
475500
Entry entry;
@@ -480,7 +505,13 @@ void QgsLocatorModel::addResult( const QgsLocatorResult &result )
480505
Entry entry;
481506
entry.result = result;
482507
mResults << entry;
483-
endInsertRows();
508+
509+
if ( mDeferredClear )
510+
endResetModel();
511+
else
512+
endInsertRows();
513+
514+
mDeferredClear = false;
484515
}
485516

486517

‎src/gui/locator/qgslocatorwidget.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,18 @@ class QgsLocatorModel : public QAbstractTableModel
180180

181181
/**
182182
* Resets the model and clears all existing results.
183+
* \see deferredClear()
183184
*/
184185
void clear();
185186

187+
/**
188+
* Resets the model and clears all existing results after a short delay, or whenever the next result is added to the model
189+
* (whichever occurs first). Using deferredClear() instead of clear() can avoid the visually distracting frequent clears
190+
* which may occur if the model is being updated quickly multiple times as a result of users typing in a search query.
191+
* \see deferredClear()
192+
*/
193+
void deferredClear();
194+
186195
int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
187196
int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
188197
QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
@@ -206,6 +215,8 @@ class QgsLocatorModel : public QAbstractTableModel
206215

207216
QList<Entry> mResults;
208217
QSet<QString> mFoundResultsFromFilterNames;
218+
bool mDeferredClear = false;
219+
QTimer mDeferredClearTimer;
209220
};
210221

211222
class QgsLocatorProxyModel : public QSortFilterProxyModel

0 commit comments

Comments
 (0)
Please sign in to comment.