diff --git a/src/sel_items_adder.cpp b/src/sel_items_adder.cpp index 1d76a1a7..81644096 100644 --- a/src/sel_items_adder.cpp +++ b/src/sel_items_adder.cpp @@ -42,6 +42,14 @@ void DisplayComponent(SelectedItemsAdder::Component &menu) menu << Charset::utf8ToLocale(menu.drawn()->value().item()); } +bool EntryMatcher(const Regex::Regex &rx, const NC::Menu::Item &item) +{ + if (!item.isSeparator()) + return Regex::search(item.value().item(), rx); + else + return false; +} + } SelectedItemsAdder::SelectedItemsAdder() @@ -180,6 +188,32 @@ void SelectedItemsAdder::mouseButtonPressed(MEVENT me) Screen::mouseButtonPressed(me); } +/***********************************************************************/ + +bool SelectedItemsAdder::allowsSearching() +{ + return true; +} + +void SelectedItemsAdder::setSearchConstraint(const std::string &constraint) +{ + m_search_predicate = Regex::ItemFilter( + Regex::make(constraint, Config.regex_type), EntryMatcher + ); +} + +void SelectedItemsAdder::clearConstraint() +{ + m_search_predicate.clear(); +} + +bool SelectedItemsAdder::find(SearchDirection direction, bool wrap, bool skip_current) +{ + return search(*w, m_search_predicate, direction, wrap, skip_current); +} + +/***********************************************************************/ + void SelectedItemsAdder::populatePlaylistSelector(BaseScreen *old_screen) { // stored playlists don't support songs from outside of mpd database diff --git a/src/sel_items_adder.h b/src/sel_items_adder.h index b22f7f22..b3208785 100644 --- a/src/sel_items_adder.h +++ b/src/sel_items_adder.h @@ -23,10 +23,11 @@ #include "runnable_item.h" #include "interfaces.h" +#include "regex_filter.h" #include "screen.h" #include "song.h" -struct SelectedItemsAdder: Screen> *>, Tabbable +struct SelectedItemsAdder: Screen> *>, Searchable, Tabbable { typedef SelectedItemsAdder Self; typedef typename std::remove_pointer::type Component; @@ -49,6 +50,12 @@ struct SelectedItemsAdder: Screen> *> virtual bool isLockable() OVERRIDE { return false; } virtual bool isMergable() OVERRIDE { return false; } + // Searchable implementation + virtual bool allowsSearching() OVERRIDE; + virtual void setSearchConstraint(const std::string &constraint) OVERRIDE; + virtual void clearConstraint() OVERRIDE; + virtual bool find(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE; + private: void populatePlaylistSelector(BaseScreen *screen); @@ -75,6 +82,8 @@ private: Component m_position_selector; std::vector m_selected_items; + + Regex::ItemFilter m_search_predicate; }; extern SelectedItemsAdder *mySelectedItemsAdder;