add support for built-in mpd searching in search engine
This commit is contained in:
@@ -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<Buffer *, MPD::Song *> >(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<Buffer *>(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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user