Move filtering methods to separate interface

This commit is contained in:
Andrzej Rybczak
2016-11-13 06:18:39 +01:00
parent 0477e2e750
commit 9b6a080a29
17 changed files with 69 additions and 19 deletions

View File

@@ -1958,18 +1958,19 @@ void ReversePlaylist::run()
bool ApplyFilter::canBeRun()
{
m_searchable = dynamic_cast<Searchable *>(myScreen);
return m_searchable != nullptr;
m_filterable = dynamic_cast<Filterable *>(myScreen);
return m_filterable != nullptr
&& m_filterable->allowsFiltering();
}
void ApplyFilter::run()
{
using Global::wFooter;
std::string filter = m_searchable->currentFilter();
std::string filter = m_filterable->currentFilter();
if (!filter.empty())
{
m_searchable->applyFilter(filter);
m_filterable->applyFilter(filter);
myScreen->refreshWindow();
}
@@ -1978,13 +1979,13 @@ void ApplyFilter::run()
Statusbar::ScopedLock slock;
NC::Window::ScopedPromptHook helper(
*wFooter,
Statusbar::Helpers::ApplyFilterImmediately(m_searchable));
Statusbar::Helpers::ApplyFilterImmediately(m_filterable));
Statusbar::put() << "Apply filter: ";
filter = wFooter->prompt(filter);
}
catch (NC::PromptAborted &)
{
m_searchable->applyFilter(filter);
m_filterable->applyFilter(filter);
throw;
}

View File

@@ -1045,7 +1045,7 @@ private:
virtual bool canBeRun() OVERRIDE;
virtual void run() OVERRIDE;
Searchable *m_searchable;
Filterable *m_filterable;
};
struct Find: BaseAction

View File

@@ -267,6 +267,13 @@ bool Browser::search(SearchDirection direction, bool wrap, bool skip_current)
return ::search(w, m_search_predicate, direction, wrap, skip_current);
}
/***********************************************************************/
bool Browser::allowsFiltering()
{
return allowsSearching();
}
std::string Browser::currentFilter()
{
std::string result;

View File

@@ -43,7 +43,7 @@ struct BrowserWindow: NC::Menu<MPD::Item>, SongList
virtual std::vector<MPD::Song> getSelectedSongs() OVERRIDE;
};
struct Browser: Screen<BrowserWindow>, HasSongs, Searchable, Tabbable
struct Browser: Screen<BrowserWindow>, Filterable, HasSongs, Searchable, Tabbable
{
Browser();
@@ -68,6 +68,8 @@ struct Browser: Screen<BrowserWindow>, HasSongs, Searchable, Tabbable
virtual void clearSearchConstraint() OVERRIDE;
virtual bool search(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE;
// Filterable implemenetation
virtual bool allowsFiltering() OVERRIDE;
virtual std::string currentFilter() OVERRIDE;
virtual void applyFilter(const std::string &filter) OVERRIDE;

View File

@@ -37,9 +37,13 @@ struct Searchable
virtual void setSearchConstraint(const std::string &constraint) = 0;
virtual void clearSearchConstraint() = 0;
virtual bool search(SearchDirection direction, bool wrap, bool skip_current) = 0;
};
virtual std::string currentFilter() { return ""; }
virtual void applyFilter(const std::string &) { }
struct Filterable
{
virtual bool allowsFiltering() = 0;
virtual std::string currentFilter() = 0;
virtual void applyFilter(const std::string &constraint) = 0;
};
struct HasActions

View File

@@ -604,6 +604,13 @@ bool MediaLibrary::search(SearchDirection direction, bool wrap, bool skip_curren
return result;
}
/***********************************************************************/
bool MediaLibrary::allowsFiltering()
{
return allowsSearching();
}
std::string MediaLibrary::currentFilter()
{
std::string result;

View File

@@ -28,7 +28,7 @@
#include "screen.h"
#include "song_list.h"
struct MediaLibrary: Screen<NC::Window *>, HasColumns, HasSongs, Searchable, Tabbable
struct MediaLibrary: Screen<NC::Window *>, Filterable, HasColumns, HasSongs, Searchable, Tabbable
{
MediaLibrary();
@@ -55,6 +55,8 @@ struct MediaLibrary: Screen<NC::Window *>, HasColumns, HasSongs, Searchable, Tab
virtual void clearSearchConstraint() OVERRIDE;
virtual bool search(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE;
// Filterable implementation
virtual bool allowsFiltering() OVERRIDE;
virtual std::string currentFilter() OVERRIDE;
virtual void applyFilter(const std::string &filter) OVERRIDE;

View File

@@ -176,6 +176,13 @@ bool Playlist::search(SearchDirection direction, bool wrap, bool skip_current)
return ::search(w, m_search_predicate, direction, wrap, skip_current);
}
/***********************************************************************/
bool Playlist::allowsFiltering()
{
return allowsSearching();
}
std::string Playlist::currentFilter()
{
std::string result;

View File

@@ -30,7 +30,7 @@
#include "song.h"
#include "song_list.h"
struct Playlist: Screen<SongMenu>, HasSongs, Searchable, Tabbable
struct Playlist: Screen<SongMenu>, Filterable, HasSongs, Searchable, Tabbable
{
Playlist();
@@ -55,6 +55,8 @@ struct Playlist: Screen<SongMenu>, HasSongs, Searchable, Tabbable
virtual void clearSearchConstraint() OVERRIDE;
virtual bool search(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE;
// Filterable implementation
virtual bool allowsFiltering() OVERRIDE;
virtual std::string currentFilter() OVERRIDE;
virtual void applyFilter(const std::string &filter) OVERRIDE;

View File

@@ -318,6 +318,13 @@ bool PlaylistEditor::search(SearchDirection direction, bool wrap, bool skip_curr
return result;
}
/***********************************************************************/
bool PlaylistEditor::allowsFiltering()
{
return allowsSearching();
}
std::string PlaylistEditor::currentFilter()
{
std::string result;

View File

@@ -28,7 +28,7 @@
#include "screen.h"
#include "song_list.h"
struct PlaylistEditor: Screen<NC::Window *>, HasColumns, HasSongs, Searchable, Tabbable
struct PlaylistEditor: Screen<NC::Window *>, Filterable, HasColumns, HasSongs, Searchable, Tabbable
{
PlaylistEditor();
@@ -55,6 +55,8 @@ struct PlaylistEditor: Screen<NC::Window *>, HasColumns, HasSongs, Searchable, T
virtual void clearSearchConstraint() OVERRIDE;
virtual bool search(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE;
// Filterable implementation
virtual bool allowsFiltering() OVERRIDE;
virtual std::string currentFilter() OVERRIDE;
virtual void applyFilter(const std::string &filter) OVERRIDE;

View File

@@ -269,6 +269,13 @@ bool SearchEngine::search(SearchDirection direction, bool wrap, bool skip_curren
return ::search(w, m_search_predicate, direction, wrap, skip_current);
}
/***********************************************************************/
bool SearchEngine::allowsFiltering()
{
return allowsSearching();
}
std::string SearchEngine::currentFilter()
{
std::string result;

View File

@@ -91,7 +91,7 @@ struct SearchEngineWindow: NC::Menu<SEItem>, SongList
virtual std::vector<MPD::Song> getSelectedSongs() OVERRIDE;
};
struct SearchEngine: Screen<SearchEngineWindow>, HasActions, HasSongs, Searchable, Tabbable
struct SearchEngine: Screen<SearchEngineWindow>, Filterable, HasActions, HasSongs, Searchable, Tabbable
{
SearchEngine();
@@ -116,6 +116,8 @@ struct SearchEngine: Screen<SearchEngineWindow>, HasActions, HasSongs, Searchabl
virtual void clearSearchConstraint() OVERRIDE;
virtual bool search(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE;
// Filterable implementation
virtual bool allowsFiltering() OVERRIDE;
virtual std::string currentFilter() OVERRIDE;
virtual void applyFilter(const std::string &filter) OVERRIDE;

View File

@@ -49,7 +49,7 @@ struct SelectedItemsAdder: Screen<NC::Menu<RunnableItem<std::string, void()>> *>
virtual bool isLockable() OVERRIDE { return false; }
virtual bool isMergable() OVERRIDE { return false; }
// HasActions implemenetation
// HasActions implementation
virtual bool actionRunnable() OVERRIDE;
virtual void runAction() OVERRIDE;

View File

@@ -225,7 +225,7 @@ bool Statusbar::Helpers::ApplyFilterImmediately::operator()(const char *s)
using Global::myScreen;
Status::trace();
try {
if (m_w->allowsSearching() && m_w->currentFilter() != s)
if (m_w->allowsFiltering() && m_w->currentFilter() != s)
{
m_w->applyFilter(s);
if (myScreen == myPlaylist)

View File

@@ -91,14 +91,14 @@ private:
struct ApplyFilterImmediately
{
ApplyFilterImmediately(Searchable *w)
ApplyFilterImmediately(Filterable *w)
: m_w(w)
{ }
bool operator()(const char *s);
private:
Searchable *m_w;
Filterable *m_w;
};
struct FindImmediately

View File

@@ -47,7 +47,7 @@ struct TinyTagEditor: Screen<NC::Menu<NC::Buffer>>, HasActions
virtual bool isLockable() OVERRIDE { return false; }
virtual bool isMergable() OVERRIDE { return true; }
// HasActions implemenetation
// HasActions implementation
virtual bool actionRunnable() OVERRIDE;
virtual void runAction() OVERRIDE;