From 96654efd3f11ca07c0e5f1c9032f961c9cfab699 Mon Sep 17 00:00:00 2001 From: Michael Niggli Date: Sun, 9 Sep 2012 00:35:50 +0200 Subject: [PATCH] Delay queries on large playlists. Fixes issue 3148 --- src/playlist/playlistcontainer.cpp | 24 ++++++++++++++++++++++-- src/playlist/playlistcontainer.h | 7 +++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/playlist/playlistcontainer.cpp b/src/playlist/playlistcontainer.cpp index e90658ec8..14ff540ff 100644 --- a/src/playlist/playlistcontainer.cpp +++ b/src/playlist/playlistcontainer.cpp @@ -32,9 +32,12 @@ #include #include #include +#include #include const char* PlaylistContainer::kSettingsGroup = "Playlist"; +const int PlaylistContainer::kFilterDelayMs = 100; +const int PlaylistContainer::kFilterDelayPlaylistSizeThreshold = 5000; PlaylistContainer::PlaylistContainer(QWidget *parent) : QWidget(parent), @@ -47,7 +50,8 @@ PlaylistContainer::PlaylistContainer(QWidget *parent) tab_bar_visible_(false), tab_bar_animation_(new QTimeLine(500, this)), no_matches_label_(NULL), - did_you_mean_(NULL) + did_you_mean_(NULL), + filter_timer_(new QTimer(this)) { ui_->setupUi(this); @@ -83,8 +87,13 @@ PlaylistContainer::PlaylistContainer(QWidget *parent) connect(ui_->tab_bar, SIGNAL(currentChanged(int)), SLOT(Save())); connect(ui_->tab_bar, SIGNAL(Save(int)), SLOT(SavePlaylist(int))); + // set up timer for delayed filter updates + filter_timer_->setSingleShot(true); + filter_timer_->setInterval(kFilterDelayMs); + connect(filter_timer_,SIGNAL(timeout()),this,SLOT(UpdateFilter())); + // Replace playlist search filter with native search box. - connect(ui_->filter, SIGNAL(textChanged(QString)), SLOT(UpdateFilter())); + connect(ui_->filter, SIGNAL(textChanged(QString)), SLOT(MaybeUpdateFilter())); connect(ui_->playlist, SIGNAL(FocusOnFilterSignal(QKeyEvent*)), SLOT(FocusOnFilter(QKeyEvent*))); ui_->filter->installEventFilter(this); @@ -374,6 +383,17 @@ void PlaylistContainer::SetTabBarHeight(int height) { ui_->tab_bar->setMaximumHeight(height); } +void PlaylistContainer::MaybeUpdateFilter() { + // delaying the filter update on small playlists is undesirable + // and an empty filter applies very quickly, too + if (manager_->current()->rowCount() < kFilterDelayPlaylistSizeThreshold || + ui_->filter->text().isEmpty()) { + UpdateFilter(); + } else { + filter_timer_->start(); + } +} + void PlaylistContainer::UpdateFilter() { Playlist* playlist = manager_->current(); SpecialPlaylistType* type = manager_->GetPlaylistType(playlist->special_type()); diff --git a/src/playlist/playlistcontainer.h b/src/playlist/playlistcontainer.h index 119ce50cd..048167ba4 100644 --- a/src/playlist/playlistcontainer.h +++ b/src/playlist/playlistcontainer.h @@ -30,6 +30,7 @@ class PlaylistManager; class PlaylistView; class QTimeLine; +class QTimer; class QLabel; class PlaylistContainer : public QWidget { @@ -86,6 +87,7 @@ private slots: void SetTabBarHeight(int height); void SelectionChanged(); + void MaybeUpdateFilter(); void UpdateFilter(); void FocusOnFilter(QKeyEvent *event); @@ -97,6 +99,9 @@ private: void RepositionNoMatchesLabel(bool force = false); private: + static const int kFilterDelayMs; + static const int kFilterDelayPlaylistSizeThreshold; + Ui_PlaylistContainer* ui_; PlaylistManager* manager_; @@ -113,6 +118,8 @@ private: QLabel* no_matches_label_; DidYouMean* did_you_mean_; + + QTimer* filter_timer_; }; #endif // PLAYLISTCONTAINER_H