Delay queries on large playlists.

Fixes issue 3148
This commit is contained in:
Michael Niggli 2012-09-09 00:35:50 +02:00 committed by Arnaud Bienner
parent 3e9cfb5a0b
commit 96654efd3f
2 changed files with 29 additions and 2 deletions

View File

@ -32,9 +32,12 @@
#include <QSettings> #include <QSettings>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QTimeLine> #include <QTimeLine>
#include <QTimer>
#include <QUndoStack> #include <QUndoStack>
const char* PlaylistContainer::kSettingsGroup = "Playlist"; const char* PlaylistContainer::kSettingsGroup = "Playlist";
const int PlaylistContainer::kFilterDelayMs = 100;
const int PlaylistContainer::kFilterDelayPlaylistSizeThreshold = 5000;
PlaylistContainer::PlaylistContainer(QWidget *parent) PlaylistContainer::PlaylistContainer(QWidget *parent)
: QWidget(parent), : QWidget(parent),
@ -47,7 +50,8 @@ PlaylistContainer::PlaylistContainer(QWidget *parent)
tab_bar_visible_(false), tab_bar_visible_(false),
tab_bar_animation_(new QTimeLine(500, this)), tab_bar_animation_(new QTimeLine(500, this)),
no_matches_label_(NULL), no_matches_label_(NULL),
did_you_mean_(NULL) did_you_mean_(NULL),
filter_timer_(new QTimer(this))
{ {
ui_->setupUi(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(currentChanged(int)), SLOT(Save()));
connect(ui_->tab_bar, SIGNAL(Save(int)), SLOT(SavePlaylist(int))); 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. // 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*))); connect(ui_->playlist, SIGNAL(FocusOnFilterSignal(QKeyEvent*)), SLOT(FocusOnFilter(QKeyEvent*)));
ui_->filter->installEventFilter(this); ui_->filter->installEventFilter(this);
@ -374,6 +383,17 @@ void PlaylistContainer::SetTabBarHeight(int height) {
ui_->tab_bar->setMaximumHeight(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() { void PlaylistContainer::UpdateFilter() {
Playlist* playlist = manager_->current(); Playlist* playlist = manager_->current();
SpecialPlaylistType* type = manager_->GetPlaylistType(playlist->special_type()); SpecialPlaylistType* type = manager_->GetPlaylistType(playlist->special_type());

View File

@ -30,6 +30,7 @@ class PlaylistManager;
class PlaylistView; class PlaylistView;
class QTimeLine; class QTimeLine;
class QTimer;
class QLabel; class QLabel;
class PlaylistContainer : public QWidget { class PlaylistContainer : public QWidget {
@ -86,6 +87,7 @@ private slots:
void SetTabBarHeight(int height); void SetTabBarHeight(int height);
void SelectionChanged(); void SelectionChanged();
void MaybeUpdateFilter();
void UpdateFilter(); void UpdateFilter();
void FocusOnFilter(QKeyEvent *event); void FocusOnFilter(QKeyEvent *event);
@ -97,6 +99,9 @@ private:
void RepositionNoMatchesLabel(bool force = false); void RepositionNoMatchesLabel(bool force = false);
private: private:
static const int kFilterDelayMs;
static const int kFilterDelayPlaylistSizeThreshold;
Ui_PlaylistContainer* ui_; Ui_PlaylistContainer* ui_;
PlaylistManager* manager_; PlaylistManager* manager_;
@ -113,6 +118,8 @@ private:
QLabel* no_matches_label_; QLabel* no_matches_label_;
DidYouMean* did_you_mean_; DidYouMean* did_you_mean_;
QTimer* filter_timer_;
}; };
#endif // PLAYLISTCONTAINER_H #endif // PLAYLISTCONTAINER_H