diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index c31ce9ea9..c07f3d32f 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -135,6 +135,7 @@ #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" #include "playlist/playlistview.h" +#include "playlist/playlistfilter.h" #include "queue/queue.h" #include "queue/queueview.h" #include "playlistparsers/playlistparser.h" @@ -1509,9 +1510,9 @@ void MainWindow::PlayIndex(const QModelIndex &idx, Playlist::AutoScroll autoscro if (!idx.isValid()) return; int row = idx.row(); - if (idx.model() == app_->playlist_manager()->current()->proxy()) { + if (idx.model() == app_->playlist_manager()->current()->filter()) { // The index was in the proxy model (might've been filtered), so we need to get the actual row in the source model. - row = app_->playlist_manager()->current()->proxy()->mapToSource(idx).row(); + row = app_->playlist_manager()->current()->filter()->mapToSource(idx).row(); } app_->playlist_manager()->SetActiveToCurrent(); @@ -1524,9 +1525,9 @@ void MainWindow::PlaylistDoubleClick(const QModelIndex &idx) { if (!idx.isValid()) return; QModelIndex source_idx = idx; - if (idx.model() == app_->playlist_manager()->current()->proxy()) { + if (idx.model() == app_->playlist_manager()->current()->filter()) { // The index was in the proxy model (might've been filtered), so we need to get the actual row in the source model. - source_idx = app_->playlist_manager()->current()->proxy()->mapToSource(idx); + source_idx = app_->playlist_manager()->current()->filter()->mapToSource(idx); } switch (doubleclick_playlist_addmode_) { @@ -1765,7 +1766,7 @@ void MainWindow::AddToPlaylistFromAction(QAction *action) { // Get the selected playlist items for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_index.row()); if (!item) continue; @@ -1804,8 +1805,8 @@ void MainWindow::PlaylistMenuHidden() { void MainWindow::PlaylistRightClick(const QPoint global_pos, const QModelIndex &index) { QModelIndex source_index = index; - if (index.model() == app_->playlist_manager()->current()->proxy()) { - source_index = app_->playlist_manager()->current()->proxy()->mapToSource(index); + if (index.model() == app_->playlist_manager()->current()->filter()) { + source_index = app_->playlist_manager()->current()->filter()->mapToSource(index); } playlist_menu_index_ = source_index; @@ -1844,7 +1845,7 @@ void MainWindow::PlaylistRightClick(const QPoint global_pos, const QModelIndex & for (const QModelIndex &idx : selection) { - const QModelIndex src_idx = app_->playlist_manager()->current()->proxy()->mapToSource(idx); + const QModelIndex src_idx = app_->playlist_manager()->current()->filter()->mapToSource(idx); if (!src_idx.isValid()) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(src_idx.row()); @@ -2048,7 +2049,7 @@ void MainWindow::RescanSongs() { SongList songs; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item(app_->playlist_manager()->current()->item_at(source_index.row())); if (!item) continue; @@ -2073,7 +2074,7 @@ void MainWindow::EditTracks() { PlaylistItemList items; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item(app_->playlist_manager()->current()->item_at(source_index.row())); if (!item) continue; @@ -2120,7 +2121,7 @@ void MainWindow::RenumberTracks() { } for (const QModelIndex &proxy_index : indexes) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_index.row()); if (!item) continue; @@ -2151,7 +2152,7 @@ void MainWindow::SelectionSetValue() { QVariant column_value = app_->playlist_manager()->current()->data(playlist_menu_index_); for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_index.row()); if (!item) continue; @@ -2265,7 +2266,7 @@ void MainWindow::ShowInCollection() { SongList songs; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_index.row()); if (item && item->IsLocalCollectionItem()) { @@ -2518,7 +2519,7 @@ void MainWindow::AddFilesToTranscoder() { QStringList filenames; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item(app_->playlist_manager()->current()->item_at(source_index.row())); if (!item) continue; @@ -2630,7 +2631,7 @@ void MainWindow::PlaylistOrganizeSelected(const bool copy) { SongList songs; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_index.row()); if (!item) continue; @@ -2652,7 +2653,7 @@ void MainWindow::PlaylistOpenInBrowser() { QList urls; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; urls << QUrl(source_index.sibling(source_index.row(), Playlist::Column_Filename).data().toString()); } @@ -2665,7 +2666,7 @@ void MainWindow::PlaylistCopyUrl() { QList urls; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_index.row()); if (!item) continue; @@ -2686,7 +2687,7 @@ void MainWindow::PlaylistQueue() { QModelIndexList indexes; indexes.reserve(selected_rows.count()); for (const QModelIndex &proxy_index : selected_rows) { - indexes << app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + indexes << app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); } app_->playlist_manager()->current()->queue()->ToggleTracks(indexes); @@ -2699,7 +2700,7 @@ void MainWindow::PlaylistQueuePlayNext() { QModelIndexList indexes; indexes.reserve(selected_rows.count()); for (const QModelIndex &proxy_index : selected_rows) { - indexes << app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + indexes << app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); } app_->playlist_manager()->current()->queue()->InsertFirst(indexes); @@ -2712,7 +2713,7 @@ void MainWindow::PlaylistSkip() { QModelIndexList indexes; indexes.reserve(selected_rows.count()); for (const QModelIndex &proxy_index : selected_rows) { - indexes << app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + indexes << app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); } app_->playlist_manager()->current()->SkipTracks(indexes); @@ -2726,7 +2727,7 @@ void MainWindow::PlaylistCopyToDevice() { SongList songs; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_index.row()); if (!item) continue; @@ -2875,7 +2876,7 @@ void MainWindow::PlaylistViewSelectionModelChanged() { void MainWindow::PlaylistCurrentChanged(const QModelIndex &proxy_current) { - const QModelIndex source_current = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_current); + const QModelIndex source_current = app_->playlist_manager()->current()->filter()->mapToSource(proxy_current); // If the user moves the current index using the keyboard and then presses // F2, we don't want that editing the last column that was right clicked on. @@ -2927,7 +2928,7 @@ void MainWindow::AutoCompleteTags() { // Get the selected songs and start fetching tags for them SongList songs; for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) { - const QModelIndex source_index = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_index); + const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index); if (!source_index.isValid()) continue; PlaylistItemPtr item(app_->playlist_manager()->current()->item_at(source_index.row())); if (!item) continue; @@ -3144,7 +3145,7 @@ void MainWindow::PlaylistDelete() { QStringList files; bool is_current_item = false; for (const QModelIndex &proxy_idx : ui_->playlist->view()->selectionModel()->selectedRows()) { - QModelIndex source_idx = app_->playlist_manager()->current()->proxy()->mapToSource(proxy_idx); + QModelIndex source_idx = app_->playlist_manager()->current()->filter()->mapToSource(proxy_idx); PlaylistItemPtr item = app_->playlist_manager()->current()->item_at(source_idx.row()); if (!item || !item->Metadata().url().isLocalFile()) continue; QString filename = item->Metadata().url().toLocalFile(); diff --git a/src/core/player.cpp b/src/core/player.cpp index f7834ee6a..78eb177cb 100644 --- a/src/core/player.cpp +++ b/src/core/player.cpp @@ -28,7 +28,6 @@ #include #include -#include #include #include #include @@ -58,6 +57,7 @@ #include "collection/collectionbackend.h" #include "playlist/playlist.h" +#include "playlist/playlistfilter.h" #include "playlist/playlistitem.h" #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" @@ -385,7 +385,7 @@ void Player::NextItem(const Engine::TrackChangeFlags change, const Playlist::Aut if (change == Engine::Auto) { const PlaylistSequence::RepeatMode repeat_mode = active_playlist->sequence()->repeat_mode(); if (repeat_mode != PlaylistSequence::Repeat_Off) { - if ((repeat_mode == PlaylistSequence::Repeat_Track && nb_errors_received_ >= 3) || (nb_errors_received_ >= app_->playlist_manager()->active()->proxy()->rowCount())) { + if ((repeat_mode == PlaylistSequence::Repeat_Track && nb_errors_received_ >= 3) || (nb_errors_received_ >= app_->playlist_manager()->active()->filter()->rowCount())) { // We received too many "Error" state changes: probably looping over a playlist which contains only unavailable elements: stop now. nb_errors_received_ = 0; Stop(); diff --git a/src/moodbar/moodbaritemdelegate.cpp b/src/moodbar/moodbaritemdelegate.cpp index c2eb33b9c..f8b1141ce 100644 --- a/src/moodbar/moodbaritemdelegate.cpp +++ b/src/moodbar/moodbaritemdelegate.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -39,6 +38,7 @@ #include "core/application.h" #include "playlist/playlist.h" #include "playlist/playlistview.h" +#include "playlist/playlistfilter.h" #include "moodbaritemdelegate.h" #include "moodbarloader.h" @@ -276,7 +276,7 @@ void MoodbarItemDelegate::ImageLoaded(const QUrl &url, const QImage &image) { data->state_ = Data::State_Loaded; Playlist *playlist = view_->playlist(); - const QSortFilterProxyModel *filter = playlist->proxy(); + const PlaylistFilter *filter = playlist->filter(); // Update all the indices with the new pixmap. for (const QPersistentModelIndex &idx : std::as_const(data->indexes_)) { diff --git a/src/playlist/playlist.cpp b/src/playlist/playlist.cpp index 556456e66..fa6aa0743 100644 --- a/src/playlist/playlist.cpp +++ b/src/playlist/playlist.cpp @@ -120,7 +120,7 @@ const qint64 Playlist::kMaxScrobblePointNsecs = 240LL * kNsecPerSec; Playlist::Playlist(PlaylistBackend *backend, TaskManager *task_manager, CollectionBackend *collection, const int id, const QString &special_type, const bool favorite, QObject *parent) : QAbstractListModel(parent), is_loading_(false), - proxy_(new PlaylistFilter(this)), + filter_(new PlaylistFilter(this)), queue_(new Queue(this, this)), timer_save_(new QTimer(this)), backend_(backend), @@ -150,7 +150,7 @@ Playlist::Playlist(PlaylistBackend *backend, TaskManager *task_manager, Collecti Restore(); - proxy_->setSourceModel(this); + filter_->setSourceModel(this); queue_->setSourceModel(this); QObject::connect(queue_, &Queue::rowsAboutToBeRemoved, this, &Playlist::TracksAboutToBeDequeued); @@ -491,7 +491,7 @@ void Playlist::ShuffleModeChanged(const PlaylistSequence::ShuffleMode mode) { bool Playlist::FilterContainsVirtualIndex(const int i) const { if (i < 0 || i >= virtual_items_.count()) return false; - return proxy_->filterAcceptsRow(virtual_items_[i], QModelIndex()); + return filter_->filterAcceptsRow(virtual_items_[i], QModelIndex()); } int Playlist::NextVirtualIndex(int i, const bool ignore_repeat_track) const { @@ -2013,7 +2013,7 @@ void Playlist::set_sequence(PlaylistSequence *v) { } -QSortFilterProxyModel *Playlist::proxy() const { return proxy_; } +PlaylistFilter *Playlist::filter() const { return filter_; } SongList Playlist::GetAllSongs() const { diff --git a/src/playlist/playlist.h b/src/playlist/playlist.h index 7accd83f7..4e1dee2a7 100644 --- a/src/playlist/playlist.h +++ b/src/playlist/playlist.h @@ -49,7 +49,6 @@ #include "smartplaylists/playlistgenerator_fwd.h" class QMimeData; -class QSortFilterProxyModel; class QUndoStack; class QTimer; @@ -180,7 +179,7 @@ class Playlist : public QAbstractListModel { void ScheduleSaveAsync(); // Accessors - QSortFilterProxyModel *proxy() const; + PlaylistFilter *filter() const; Queue *queue() const { return queue_; } int id() const { return id_; } @@ -380,7 +379,7 @@ class Playlist : public QAbstractListModel { private: bool is_loading_; - PlaylistFilter *proxy_; + PlaylistFilter *filter_; Queue *queue_; QTimer *timer_save_; diff --git a/src/playlist/playlistcontainer.cpp b/src/playlist/playlistcontainer.cpp index 79f998b65..b219e9e30 100644 --- a/src/playlist/playlistcontainer.cpp +++ b/src/playlist/playlistcontainer.cpp @@ -55,6 +55,7 @@ #include "playlistview.h" #include "playlistcontainer.h" #include "playlistmanager.h" +#include "playlistfilter.h" #include "playlistparsers/playlistparser.h" #include "ui_playlistcontainer.h" #include "widgets/qsearchfield.h" @@ -120,9 +121,9 @@ PlaylistContainer::PlaylistContainer(QWidget *parent) QObject::connect(filter_timer_, &QTimer::timeout, this, &PlaylistContainer::UpdateFilter); // Replace playlist search filter with native search box. - QObject::connect(ui_->filter, &QSearchField::textChanged, this, &PlaylistContainer::MaybeUpdateFilter); + QObject::connect(ui_->search_field, &QSearchField::textChanged, this, &PlaylistContainer::MaybeUpdateFilter); QObject::connect(ui_->playlist, &PlaylistView::FocusOnFilterSignal, this, &PlaylistContainer::FocusOnFilter); - ui_->filter->installEventFilter(this); + ui_->search_field->installEventFilter(this); ReloadSettings(); @@ -177,10 +178,10 @@ void PlaylistContainer::SetViewModel(Playlist *playlist, const int scroll_positi if (view()->selectionModel()) { QObject::disconnect(view()->selectionModel(), &QItemSelectionModel::selectionChanged, this, &PlaylistContainer::SelectionChanged); } - if (playlist_ && playlist_->proxy()) { - QObject::disconnect(playlist_->proxy(), &QSortFilterProxyModel::modelReset, this, &PlaylistContainer::UpdateNoMatchesLabel); - QObject::disconnect(playlist_->proxy(), &QSortFilterProxyModel::rowsInserted, this, &PlaylistContainer::UpdateNoMatchesLabel); - QObject::disconnect(playlist_->proxy(), &QSortFilterProxyModel::rowsRemoved, this, &PlaylistContainer::UpdateNoMatchesLabel); + if (playlist_ && playlist_->filter()) { + QObject::disconnect(playlist_->filter(), &QSortFilterProxyModel::modelReset, this, &PlaylistContainer::UpdateNoMatchesLabel); + QObject::disconnect(playlist_->filter(), &QSortFilterProxyModel::rowsInserted, this, &PlaylistContainer::UpdateNoMatchesLabel); + QObject::disconnect(playlist_->filter(), &QSortFilterProxyModel::rowsRemoved, this, &PlaylistContainer::UpdateNoMatchesLabel); } if (playlist_) { QObject::disconnect(playlist_, &Playlist::modelReset, this, &PlaylistContainer::UpdateNoMatchesLabel); @@ -192,7 +193,7 @@ void PlaylistContainer::SetViewModel(Playlist *playlist, const int scroll_positi // Set the view playlist->IgnoreSorting(true); - view()->setModel(playlist->proxy()); + view()->setModel(playlist->filter()); view()->SetPlaylist(playlist); view()->selectionModel()->select(manager_->current_selection(), QItemSelectionModel::ClearAndSelect); if (scroll_position != 0) view()->verticalScrollBar()->setValue(scroll_position); @@ -202,16 +203,12 @@ void PlaylistContainer::SetViewModel(Playlist *playlist, const int scroll_positi emit ViewSelectionModelChanged(); // Update filter -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - ui_->filter->setText(playlist->proxy()->filterRegularExpression().pattern().remove('\\')); -#else - ui_->filter->setText(playlist->proxy()->filterRegExp().pattern()); -#endif + ui_->search_field->setText(playlist->filter()->filter_text()); // Update the no matches label - QObject::connect(playlist_->proxy(), &QSortFilterProxyModel::modelReset, this, &PlaylistContainer::UpdateNoMatchesLabel); - QObject::connect(playlist_->proxy(), &QSortFilterProxyModel::rowsInserted, this, &PlaylistContainer::UpdateNoMatchesLabel); - QObject::connect(playlist_->proxy(), &QSortFilterProxyModel::rowsRemoved, this, &PlaylistContainer::UpdateNoMatchesLabel); + QObject::connect(playlist_->filter(), &QSortFilterProxyModel::modelReset, this, &PlaylistContainer::UpdateNoMatchesLabel); + QObject::connect(playlist_->filter(), &QSortFilterProxyModel::rowsInserted, this, &PlaylistContainer::UpdateNoMatchesLabel); + QObject::connect(playlist_->filter(), &QSortFilterProxyModel::rowsRemoved, this, &PlaylistContainer::UpdateNoMatchesLabel); QObject::connect(playlist_, &Playlist::modelReset, this, &PlaylistContainer::UpdateNoMatchesLabel); QObject::connect(playlist_, &Playlist::rowsInserted, this, &PlaylistContainer::UpdateNoMatchesLabel); QObject::connect(playlist_, &Playlist::rowsRemoved, this, &PlaylistContainer::UpdateNoMatchesLabel); @@ -252,7 +249,7 @@ void PlaylistContainer::ReloadSettings() { ui_->clear->setIconSize(QSize(iconsize, iconsize)); ui_->undo->setIconSize(QSize(iconsize, iconsize)); ui_->redo->setIconSize(QSize(iconsize, iconsize)); - ui_->filter->setIconSize(iconsize); + ui_->search_field->setIconSize(iconsize); bool playlist_clear = settings_.value("playlist_clear", true).toBool(); if (playlist_clear) { @@ -265,16 +262,16 @@ void PlaylistContainer::ReloadSettings() { bool show_toolbar = settings_.value("show_toolbar", true).toBool(); ui_->toolbar->setVisible(show_toolbar); - if (!show_toolbar) ui_->filter->clear(); + if (!show_toolbar) ui_->search_field->clear(); } bool PlaylistContainer::SearchFieldHasFocus() const { - return ui_->filter->hasFocus(); + return ui_->search_field->hasFocus(); } void PlaylistContainer::FocusSearchField() { - if (ui_->toolbar->isVisible()) ui_->filter->setFocus(); + if (ui_->toolbar->isVisible()) ui_->search_field->setFocus(); } void PlaylistContainer::ActivePlaying() { @@ -409,7 +406,7 @@ void PlaylistContainer::SetTabBarHeight(const int 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()) { + if (manager_->current()->rowCount() < kFilterDelayPlaylistSizeThreshold || ui_->search_field->text().isEmpty()) { UpdateFilter(); } else { @@ -420,7 +417,7 @@ void PlaylistContainer::MaybeUpdateFilter() { void PlaylistContainer::UpdateFilter() { - manager_->current()->proxy()->setFilterFixedString(ui_->filter->text()); + manager_->current()->filter()->SetFilterText(ui_->search_field->text()); ui_->playlist->JumpToCurrentlyPlayingTrack(); UpdateNoMatchesLabel(); @@ -431,7 +428,7 @@ void PlaylistContainer::UpdateNoMatchesLabel() { Playlist *playlist = manager_->current(); const bool has_rows = playlist->rowCount() != 0; - const bool has_results = playlist->proxy()->rowCount() != 0; + const bool has_results = playlist->filter()->rowCount() != 0; QString text; if (has_rows && !has_results) { @@ -457,15 +454,15 @@ void PlaylistContainer::resizeEvent(QResizeEvent *e) { void PlaylistContainer::FocusOnFilter(QKeyEvent *event) { if (ui_->toolbar->isVisible()) { - ui_->filter->setFocus(); + ui_->search_field->setFocus(); switch (event->key()) { case Qt::Key_Backspace: break; case Qt::Key_Escape: - ui_->filter->clear(); + ui_->search_field->clear(); break; default: - ui_->filter->setText(ui_->filter->text() + event->text()); + ui_->search_field->setText(ui_->search_field->text() + event->text()); break; } } @@ -494,7 +491,7 @@ void PlaylistContainer::SelectionChanged() { bool PlaylistContainer::eventFilter(QObject *objectWatched, QEvent *event) { - if (objectWatched == ui_->filter) { + if (objectWatched == ui_->search_field) { if (event->type() == QEvent::KeyPress) { QKeyEvent *e = static_cast(event); switch (e->key()) { @@ -508,7 +505,7 @@ bool PlaylistContainer::eventFilter(QObject *objectWatched, QEvent *event) { QApplication::sendEvent(ui_->playlist, event); return true; case Qt::Key_Escape: - ui_->filter->clear(); + ui_->search_field->clear(); return true; default: break; diff --git a/src/playlist/playlistcontainer.ui b/src/playlist/playlistcontainer.ui index e6ee463f1..89263ef74 100644 --- a/src/playlist/playlistcontainer.ui +++ b/src/playlist/playlistcontainer.ui @@ -143,7 +143,7 @@ - + diff --git a/src/playlist/playlistfilter.cpp b/src/playlist/playlistfilter.cpp index 24fc1dc38..74605b37a 100644 --- a/src/playlist/playlistfilter.cpp +++ b/src/playlist/playlistfilter.cpp @@ -23,7 +23,6 @@ #include #include -#include #include #include @@ -66,6 +65,7 @@ PlaylistFilter::PlaylistFilter(QObject *parent) << Playlist::Column_Samplerate << Playlist::Column_Bitdepth << Playlist::Column_Bitrate; + } PlaylistFilter::~PlaylistFilter() = default; @@ -78,19 +78,13 @@ void PlaylistFilter::sort(int column, Qt::SortOrder order) { bool PlaylistFilter::filterAcceptsRow(int row, const QModelIndex &parent) const { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - QString filter = filterRegularExpression().pattern().remove('\\'); + size_t hash = qHash(filter_text_); #else - QString filter = filterRegExp().pattern(); -#endif - -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - size_t hash = qHash(filter); -#else - uint hash = qHash(filter); + uint hash = qHash(filter_text_); #endif if (hash != query_hash_) { // Parse the query - FilterParser p(filter, column_names_, numerical_columns_); + FilterParser p(filter_text_, column_names_, numerical_columns_); filter_tree_.reset(p.parse()); query_hash_ = hash; @@ -100,3 +94,10 @@ bool PlaylistFilter::filterAcceptsRow(int row, const QModelIndex &parent) const return filter_tree_->accept(row, parent, sourceModel()); } + +void PlaylistFilter::SetFilterText(const QString &filter_text) { + + filter_text_ = filter_text; + setFilterFixedString(filter_text); + +} diff --git a/src/playlist/playlistfilter.h b/src/playlist/playlistfilter.h index e0f6131aa..bab9a6c3e 100644 --- a/src/playlist/playlistfilter.h +++ b/src/playlist/playlistfilter.h @@ -48,6 +48,10 @@ class PlaylistFilter : public QSortFilterProxyModel { // public so Playlist::NextVirtualIndex and friends can get at it bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; + void SetFilterText(const QString &filter_text); + + QString filter_text() const { return filter_text_; } + private: // Mutable because they're modified from filterAcceptsRow() const mutable QScopedPointer filter_tree_; @@ -59,6 +63,7 @@ class PlaylistFilter : public QSortFilterProxyModel { QMap column_names_; QSet numerical_columns_; + QString filter_text_; }; #endif // PLAYLISTFILTER_H diff --git a/src/playlist/playlistview.cpp b/src/playlist/playlistview.cpp index 34db9a27c..f2e19b5c2 100644 --- a/src/playlist/playlistview.cpp +++ b/src/playlist/playlistview.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -75,6 +74,7 @@ #include "playlistdelegates.h" #include "playlistheader.h" #include "playlistview.h" +#include "playlistfilter.h" #include "covermanager/currentalbumcoverloader.h" #include "covermanager/albumcoverloaderresult.h" #include "settings/appearancesettingspage.h" @@ -903,7 +903,7 @@ void PlaylistView::mousePressEvent(QMouseEvent *event) { QModelIndexList src_index_list; for (const QModelIndex &i : selectedIndexes()) { if (i.data(Playlist::Role_CanSetRating).toBool()) { - src_index_list << playlist_->proxy()->mapToSource(i); + src_index_list << playlist_->filter()->mapToSource(i); } } if (!src_index_list.isEmpty()) { @@ -912,7 +912,7 @@ void PlaylistView::mousePressEvent(QMouseEvent *event) { } else { // Update only this item rating - playlist_->RateSong(playlist_->proxy()->mapToSource(idx), new_rating); + playlist_->RateSong(playlist_->filter()->mapToSource(idx), new_rating); } } break; @@ -965,7 +965,7 @@ void PlaylistView::JumpToCurrentlyPlayingTrack() { if (playlist_->current_row() == -1) return; - QModelIndex current = playlist_->proxy()->mapFromSource(playlist_->index(playlist_->current_row(), 0)); + QModelIndex current = playlist_->filter()->mapFromSource(playlist_->index(playlist_->current_row(), 0)); if (!current.isValid()) return; if (visibleRegion().boundingRect().contains(visualRect(current))) return; @@ -986,7 +986,7 @@ void PlaylistView::JumpToLastPlayedTrack() { if (playlist_->last_played_row() == -1) return; - QModelIndex last_played = playlist_->proxy()->mapFromSource(playlist_->index(playlist_->last_played_row(), 0)); + QModelIndex last_played = playlist_->filter()->mapFromSource(playlist_->index(playlist_->last_played_row(), 0)); if (!last_played.isValid()) return; // Select last played song