From 153081158d6c9700fac9bafec754a89c4aef61c6 Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Fri, 22 Jan 2010 21:35:34 +0100 Subject: [PATCH] add support for built-in mpd searching in search engine --- doc/config | 16 +++++++++++++++- doc/ncmpcpp.1 | 3 +++ src/mpdpp.cpp | 16 +++++++++++++++- src/mpdpp.h | 4 +++- src/search_engine.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++--------- src/search_engine.h | 7 ++++--- src/settings.cpp | 10 ++++++++++ src/settings.h | 1 + 8 files changed, 95 insertions(+), 15 deletions(-) diff --git a/doc/config b/doc/config index 62f7074..754819e 100644 --- a/doc/config +++ b/doc/config @@ -307,8 +307,22 @@ #enable_window_title = "yes" # ## +## Note: You can choose default search mode for search +## engine. Available modes are: +## +## - 1 - use mpd built-in searching (no regexes, pattern matching) +## - 2 - use ncmpcpp searching (pattern matching with support for regexes, +## but if your mpd is on a remote machine, downloading big database +## to process it can take a while +## - 3 - match only exact values (this mode uses mpd function for searching +## in database and local one for searching in current playlist) +## +# +#search_engine_default_search_mode = "1" +# +## ## Note: These triggers will allow you to phisically remove -## files and directories from your hdd in using ncmpcpp's +## files and directories from your hdd using ncmpcpp's ## browser screen. ## # diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1 index 740e572..38154a7 100644 --- a/doc/ncmpcpp.1 +++ b/doc/ncmpcpp.1 @@ -162,6 +162,9 @@ If enabled, mouse wheel will scroll the whole page of item list at a time, other .B lines_scrolled = NUMBER Number of lines that are scrolled with mouse wheel. .TP +.B search_engine_default_search_mode = MODE_NUMBER +Number of default mode used in search engine. +.TP .B playlist_show_remaining_time = yes/no If enabled, time remaining to end of playlist will be shown after playlist's statistics. .TP diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index a75036b..c2b330c 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -1042,7 +1042,7 @@ void MPD::Connection::StartFieldSearch(mpd_tag_type item) } } -void MPD::Connection::AddSearch(mpd_tag_type item, const std::string &str) +void MPD::Connection::AddSearch(mpd_tag_type item, const std::string &str) const { // mpd version < 0.14.* doesn't support empty search constraints if (Version() < 14 && str.empty()) @@ -1051,6 +1051,20 @@ void MPD::Connection::AddSearch(mpd_tag_type item, const std::string &str) mpd_search_add_tag_constraint(itsConnection, MPD_OPERATOR_DEFAULT, item, str.c_str()); } +void MPD::Connection::AddSearchAny(const std::string &str) const +{ + assert(!str.empty()); + if (itsConnection) + mpd_search_add_any_tag_constraint(itsConnection, MPD_OPERATOR_DEFAULT, str.c_str()); +} + +void MPD::Connection::AddSearchURI(const std::string &str) const +{ + assert(!str.empty()); + if (itsConnection) + mpd_search_add_uri_constraint(itsConnection, MPD_OPERATOR_DEFAULT, str.c_str()); +} + void MPD::Connection::CommitSearch(SongList &v) { if (!itsConnection) diff --git a/src/mpdpp.h b/src/mpdpp.h index fe9ead9..5c3da20 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -191,7 +191,9 @@ namespace MPD void StartSearch(bool); void StartFieldSearch(mpd_tag_type); - void AddSearch(mpd_tag_type, const std::string &); + void AddSearch(mpd_tag_type, const std::string &) const; + void AddSearchAny(const std::string &str) const; + void AddSearchURI(const std::string &str) const; void CommitSearch(SongList &); void CommitSearch(TagList &); diff --git a/src/search_engine.cpp b/src/search_engine.cpp index 1f35ee4..218c896 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -47,15 +47,18 @@ const char *SearchEngine::ConstraintsNames[] = "Comment:" }; -const char *SearchEngine::NormalMode = "Match if tag contains searched phrase (regexes supported)"; -const char *SearchEngine::StrictMode = "Match only if both values are the same"; +const char *SearchEngine::SearchModes[] = +{ + "Match if tag contains searched phrase (no regexes)", + "Match if tag contains searched phrase (regexes supported)", + "Match only if both values are the same", + 0 +}; size_t SearchEngine::StaticOptions = 19; size_t SearchEngine::ResetButton = 15; size_t SearchEngine::SearchButton = 14; -bool SearchEngine::MatchToPattern = 1; - void SearchEngine::Init() { w = new Menu< std::pair >(0, MainStartY, COLS, MainHeight, "", Config.main_color, brNone); @@ -65,6 +68,7 @@ void SearchEngine::Init() w->SetSelectPrefix(&Config.selected_item_prefix); w->SetSelectSuffix(&Config.selected_item_suffix); w->SetGetStringFunction(SearchEngineOptionToString); + SearchMode = &SearchModes[Config.search_engine_default_search_mode]; isInitialized = 1; } @@ -131,8 +135,9 @@ void SearchEngine::EnterPressed() } else if (option == ConstraintsNumber+2) { - MatchToPattern = !MatchToPattern; - *w->Current().first << fmtBold << "Search mode:" << fmtBoldEnd << ' ' << (MatchToPattern ? NormalMode : StrictMode); + if (!*++SearchMode) + SearchMode = &SearchModes[0]; + *w->Current().first << fmtBold << "Search mode:" << fmtBoldEnd << ' ' << *SearchMode; } else if (option == SearchButton) { @@ -290,7 +295,7 @@ void SearchEngine::Prepare() } *w->at(ConstraintsNumber+1).first << fmtBold << "Search in:" << fmtBoldEnd << ' ' << (Config.search_in_db ? "Database" : "Current playlist"); - *w->at(ConstraintsNumber+2).first << fmtBold << "Search mode:" << fmtBoldEnd << ' ' << (MatchToPattern ? NormalMode : StrictMode); + *w->at(ConstraintsNumber+2).first << fmtBold << "Search mode:" << fmtBoldEnd << ' ' << *SearchMode; *w->at(SearchButton).first << "Search"; *w->at(ResetButton).first << "Reset"; @@ -310,6 +315,36 @@ void SearchEngine::Search() if (constraints_empty) return; + if (Config.search_in_db && (SearchMode == &SearchModes[0] || SearchMode == &SearchModes[2])) // use built-in mpd searching + { + Mpd.StartSearch(SearchMode == &SearchModes[2]); + if (!itsConstraints[0].empty()) + Mpd.AddSearchAny(itsConstraints[0]); + if (!itsConstraints[1].empty()) + Mpd.AddSearch(MPD_TAG_ARTIST, itsConstraints[1]); + if (!itsConstraints[2].empty()) + Mpd.AddSearch(MPD_TAG_TITLE, itsConstraints[2]); + if (!itsConstraints[3].empty()) + Mpd.AddSearch(MPD_TAG_ALBUM, itsConstraints[3]); + if (!itsConstraints[4].empty()) + Mpd.AddSearchURI(itsConstraints[4]); + if (!itsConstraints[5].empty()) + Mpd.AddSearch(MPD_TAG_COMPOSER, itsConstraints[5]); + if (!itsConstraints[6].empty()) + Mpd.AddSearch(MPD_TAG_PERFORMER, itsConstraints[6]); + if (!itsConstraints[7].empty()) + Mpd.AddSearch(MPD_TAG_GENRE, itsConstraints[7]); + if (!itsConstraints[8].empty()) + Mpd.AddSearch(MPD_TAG_DATE, itsConstraints[8]); + if (!itsConstraints[9].empty()) + Mpd.AddSearch(MPD_TAG_COMMENT, itsConstraints[9]); + MPD::SongList results; + Mpd.CommitSearch(results); + for (MPD::SongList::const_iterator it = results.begin(); it != results.end(); ++it) + w->AddOption(std::make_pair(static_cast(0), *it)); + return; + } + MPD::SongList list; if (Config.search_in_db) Mpd.GetDirectoryRecursive("/", list); @@ -325,7 +360,7 @@ void SearchEngine::Search() for (MPD::SongList::const_iterator it = list.begin(); it != list.end(); ++it) { - if (MatchToPattern) + if (SearchMode != &SearchModes[2]) // match to pattern { regex_t rx; if (!itsConstraints[0].empty()) @@ -401,7 +436,7 @@ void SearchEngine::Search() regfree(&rx); } } - else + else // match only if values are equal { CaseInsensitiveStringComparison cmp; diff --git a/src/search_engine.h b/src/search_engine.h index 3b96787..a40848d 100644 --- a/src/search_engine.h +++ b/src/search_engine.h @@ -53,9 +53,6 @@ class SearchEngine : public Screen< Menu< std::pair > > static size_t SearchButton; static size_t ResetButton; - static const char *NormalMode; - static const char *StrictMode; - protected: virtual void Init(); @@ -63,8 +60,12 @@ class SearchEngine : public Screen< Menu< std::pair > > void Prepare(); void Search(); + const char **SearchMode; + static std::string SearchEngineOptionToString(const std::pair &, void *); + static const char *SearchModes[]; + static const size_t ConstraintsNumber = 10; static const char *ConstraintsNames[]; std::string itsConstraints[ConstraintsNumber]; diff --git a/src/settings.cpp b/src/settings.cpp index 96d47b7..5adf62e 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -336,6 +336,7 @@ void DefaultConfiguration(ncmpcpp_config &conf) conf.lyrics_db = 0; conf.regex_type = 0; conf.lines_scrolled = 2; + conf.search_engine_default_search_mode = 0; conf.selected_item_suffix_length = 0; # ifdef HAVE_LANGINFO_H conf.system_encoding = nl_langinfo(CODESET); @@ -902,6 +903,15 @@ void ReadConfiguration(ncmpcpp_config &conf) if (!v.empty()) conf.lines_scrolled = StrToInt(v); } + else if (cl.find("search_engine_default_search_mode") != std::string::npos) + { + if (!v.empty()) + { + unsigned mode = StrToInt(v); + if (--mode < 3) + conf.search_engine_default_search_mode = mode; + } + } else if (cl.find("song_window_title_format") != std::string::npos) { if (!v.empty()) diff --git a/src/settings.h b/src/settings.h index cfb8a68..2fd184d 100644 --- a/src/settings.h +++ b/src/settings.h @@ -229,6 +229,7 @@ struct ncmpcpp_config int regex_type; unsigned lines_scrolled; + unsigned search_engine_default_search_mode; size_t selected_item_suffix_length; }; -- 2.11.4.GIT