diff --git a/src/MusicWheel.cpp b/src/MusicWheel.cpp index 1ea2973a55..ca108fb6cf 100644 --- a/src/MusicWheel.cpp +++ b/src/MusicWheel.cpp @@ -199,7 +199,7 @@ void MusicWheel::ReloadSongList(bool searching, RString findme) SCREENMAN->PostMessageToTopScreen(SM_SongChanged, 0); // when searching, automatically land on the first search result available -mina & dadbearcop - if (findme != "") + if (findme != "" || !hashList.empty()) { if (groupnamesearchmatch != "") { SelectSection(groupnamesearchmatch); @@ -394,7 +394,7 @@ void MusicWheel::GetSongList( vector &arraySongs, SortOrder so ) } } } -bool contains(std::string container, std::string findme) { +bool contains(string container, string findme) { std::transform(begin(container), end(container), begin(container), ::tolower); return container.find(findme) != string::npos; } @@ -407,9 +407,9 @@ void MusicWheel::FilterBySearch(vector& inv, RString findme) { size_t artist = findme.find("artist="); size_t author = findme.find("author="); size_t title = findme.find("title="); - std::string findartist = ""; - std::string findauthor = ""; - std::string findtitle = ""; + string findartist = ""; + string findauthor = ""; + string findtitle = ""; if (artist != findme.npos || author != findme.npos || title != findme.npos) { super_search = true; @@ -493,6 +493,27 @@ void MusicWheel::FilterBySearch(vector& inv, RString findme) { } } +void MusicWheel::SetHashList(const vector &newHashList) { hashList = newHashList; } + +void MusicWheel::FilterByStepKeys(vector& inv) { + vector tmp; + std::function check; + check = [this](Song* x) { + FOREACH(string, hashList, hash) + if (x->HasChartByHash(*hash)) { + return true; + } + return false; + }; + for (Song* x : inv) { + if (check(x)) + tmp.emplace_back(x); + } + if (tmp.size() > 0) { + inv.swap(tmp); + } +} + bool MusicWheel::SearchGroupNames(RString& findme) { const vector& grps = SONGMAN->GetSongGroupNames(); for (size_t i = 0; i < grps.size(); ++i) { @@ -599,7 +620,7 @@ void MusicWheel::FilterBySkillsets(vector& inv) { inv.swap(tmp); } -void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas, SortOrder so, bool searching, RString findme ) +void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas, SortOrder so, bool searching, RString findme) { map commanDZ; @@ -634,6 +655,9 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelIt if (searching) FilterBySearch(arraySongs, findme); + if (!hashList.empty()) + FilterByStepKeys(arraySongs); + if (FILTERMAN->AnyActiveFilter()) FilterBySkillsets(arraySongs); @@ -1548,6 +1572,18 @@ class LunaMusicWheel : public Luna return 1; } + static int FilterByStepKeys(T* p, lua_State *L) + { + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushvalue(L, 1); + vector newHashList; + LuaHelpers::ReadArrayFromTable(newHashList, L); + lua_pop(L, 1); + p->SetHashList(newHashList); + p->ReloadSongList(false, ""); + return 1; + } + LunaMusicWheel() { ADD_METHOD(ChangeSort); @@ -1558,6 +1594,7 @@ class LunaMusicWheel : public Luna ADD_METHOD(ReloadSongList); ADD_METHOD(Move); ADD_METHOD(MoveAndCheckType); + ADD_METHOD(FilterByStepKeys); } }; diff --git a/src/MusicWheel.h b/src/MusicWheel.h index 5ac3f7d19f..766100c2bf 100644 --- a/src/MusicWheel.h +++ b/src/MusicWheel.h @@ -47,6 +47,7 @@ class MusicWheel : public WheelBase const MusicWheelItemData *GetCurWheelItemData( int i ) { return (const MusicWheelItemData *) m_CurWheelItemData[i]; } virtual void ReloadSongList(bool searching, RString findme); + void SetHashList( const vector &newHashList ); // Lua void PushSelf( lua_State *L ) override; @@ -54,10 +55,12 @@ class MusicWheel : public WheelBase protected: MusicWheelItem *MakeItem() override; + vector hashList; void GetSongList( vector &arraySongs, SortOrder so ); bool SelectSongOrCourse(); bool SelectModeMenuItem(); + void FilterByStepKeys(vector& inv); void FilterBySearch(vector& inv, RString findme); bool SearchGroupNames(RString & findme); void FilterBySkillsets(vector& inv); @@ -111,7 +114,7 @@ class MusicWheel : public WheelBase vector m__WheelItemDatas[NUM_SortOrder]; vector m__UnFilteredWheelItemDatas[NUM_SortOrder]; - void BuildWheelItemDatas( vector &arrayWheelItems, SortOrder so, bool searching, RString findme ); + void BuildWheelItemDatas( vector &arrayWheelItems, SortOrder so, bool searching, RString findme); void FilterWheelItemDatas(vector& aUnFilteredDatas, vector& aFilteredData, SortOrder so); void SelectSongAfterSearch(); RString prevSongTitle;