From 5594f6cdcc1f170c35304a85552849e8fa1e7525 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 10 Jan 2018 19:17:29 -0300 Subject: [PATCH] Fix multiple profile playlists/favourites/goals --- src/DBProfile.cpp | 6 +++--- src/MusicWheel.cpp | 2 +- src/Profile.h | 4 ++++ src/ScreenGameplay.cpp | 4 ++-- src/ScreenSelectMusic.cpp | 13 ++++++++---- src/SongManager.cpp | 42 +++++++++++++++++++++++++-------------- src/SongManager.h | 13 ++++++------ src/XMLProfile.cpp | 10 +++++----- 8 files changed, 58 insertions(+), 36 deletions(-) diff --git a/src/DBProfile.cpp b/src/DBProfile.cpp index 0416173590..ee1feadd3e 100644 --- a/src/DBProfile.cpp +++ b/src/DBProfile.cpp @@ -156,7 +156,7 @@ void DBProfile::LoadPlayLists(SQLite::Database* db) "INNER JOIN songs ON songs.id = charts.songid " "INNER JOIN chartkeys ON charts.chartkeyid = chartkeys.id " "ORDER BY playlists.name, chartkeys.chartkey, chartplaylists.rate"); - auto& pls = SONGMAN->allplaylists; + auto& pls = loadingProfile->allplaylists; Playlist *tmp; @@ -653,9 +653,9 @@ void DBProfile::SavePlayLists(SQLite::Database* db, const Profile* profile) cons "CONSTRAINT fk_courserunid FOREIGN KEY (courserunid) REFERENCES courseruns(id))"); - auto& pls = SONGMAN->allplaylists; + auto& pls = profile->allplaylists; if (!pls.empty()) { - FOREACHM(string, Playlist, pls, pl) + FOREACHM_CONST(string, Playlist, pls, pl) { if (pl->first != "" && pl->first != "Favorites") { diff --git a/src/MusicWheel.cpp b/src/MusicWheel.cpp index b17bd9bf92..343eda1d43 100644 --- a/src/MusicWheel.cpp +++ b/src/MusicWheel.cpp @@ -280,7 +280,7 @@ bool MusicWheel::SelectSong( const Song *p ) SetOpenSection( from[i]->m_sText ); // skip any playlist groups - if (!SONGMAN->allplaylists.count(GetExpandedSectionName())) + if (!SONGMAN->GetPlaylists().count(GetExpandedSectionName())) break; } } diff --git a/src/Profile.h b/src/Profile.h index d5c6333bfd..d1133cb69c 100644 --- a/src/Profile.h +++ b/src/Profile.h @@ -14,6 +14,7 @@ #include "LuaReference.h" #include "XMLProfile.h" #include "DBProfile.h" +#include "SongManager.h" #include "arch/LoadingWindow/LoadingWindow.h" #include @@ -21,6 +22,7 @@ class XNode; struct lua_State; class Character; +struct Playlist; // Current file versions extern const RString STATS_XML; @@ -186,6 +188,8 @@ class Profile ProfileType m_Type{ProfileType_Normal}; // Profiles of the same type and priority are sorted by dir name. int m_ListPriority{0}; + // Profile Playlists + map allplaylists; // Editable data RString m_sDisplayName; diff --git a/src/ScreenGameplay.cpp b/src/ScreenGameplay.cpp index d07171e014..39130b9979 100644 --- a/src/ScreenGameplay.cpp +++ b/src/ScreenGameplay.cpp @@ -790,7 +790,7 @@ void ScreenGameplay::InitSongQueues() FOREACH_EnabledPlayerInfo(m_vPlayerInfo, pi) pi->m_vpStepsQueue.clear(); - Playlist& pl = SONGMAN->allplaylists[SONGMAN->playlistcourse]; + Playlist& pl = SONGMAN->GetPlaylists()[SONGMAN->playlistcourse]; FOREACH(Chart, pl.chartlist, ch) { m_apSongsQueue.emplace_back(ch->songptr); FOREACH_EnabledPlayerInfo(m_vPlayerInfo, pi) @@ -2260,7 +2260,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) MESSAGEMAN->Broadcast(msg); if (GAMESTATE->IsPlaylistCourse()) { - SONGMAN->allplaylists[SONGMAN->playlistcourse].courseruns.emplace_back(playlistscorekeys); + SONGMAN->GetPlaylists()[SONGMAN->playlistcourse].courseruns.emplace_back(playlistscorekeys); } TweenOffScreen(); diff --git a/src/ScreenSelectMusic.cpp b/src/ScreenSelectMusic.cpp index ae0973d4dd..5ee98350ee 100644 --- a/src/ScreenSelectMusic.cpp +++ b/src/ScreenSelectMusic.cpp @@ -229,6 +229,9 @@ void ScreenSelectMusic::BeginScreen() g_ScreenStartedLoadingAt.Touch(); m_timerIdleComment.GetDeltaTime(); + + SONGMAN->MakeSongGroupsFromPlaylists(); + SONGMAN->SetFavoritedStatus(PROFILEMAN->GetProfile(PLAYER_1)->FavoritedCharts); if (CommonMetrics::AUTO_SET_STYLE) { GAMESTATE->SetCompatibleStylesForPlayers(); @@ -477,6 +480,8 @@ bool ScreenSelectMusic::Input(const InputEventPlus &input) if (!fav_me_biatch->IsFavorited()) { fav_me_biatch->SetFavorited(true); pProfile->AddToFavorites(GAMESTATE->m_pCurSteps[PLAYER_1]->GetChartKey()); + pProfile->allplaylists.erase("Favorites"); + SONGMAN->MakePlaylistFromFavorites(pProfile->FavoritedCharts, pProfile->allplaylists); } else { fav_me_biatch->SetFavorited(false); @@ -541,10 +546,10 @@ bool ScreenSelectMusic::Input(const InputEventPlus &input) } else if (bHoldingCtrl && c == 'A' && m_MusicWheel.IsSettled() && input.type == IET_FIRST_PRESS) { - if (SONGMAN->allplaylists.empty()) + if (SONGMAN->GetPlaylists().empty()) return true; - SONGMAN->allplaylists[SONGMAN->activeplaylist].AddChart(GAMESTATE->m_pCurSteps[PLAYER_1]->GetChartKey()); + SONGMAN->GetPlaylists()[SONGMAN->activeplaylist].AddChart(GAMESTATE->m_pCurSteps[PLAYER_1]->GetChartKey()); MESSAGEMAN->Broadcast("DisplaySinglePlaylist"); SCREENMAN->SystemMessage(ssprintf("Added chart: %s to playlist: %s", GAMESTATE->m_pCurSong->GetDisplayMainTitle().c_str(), SONGMAN->activeplaylist.c_str())); return true; @@ -1176,7 +1181,7 @@ void ScreenSelectMusic::HandleScreenMessage(const ScreenMessage SM) Playlist pl; pl.name = ScreenTextEntry::s_sLastAnswer; if (pl.name != "") { - SONGMAN->allplaylists.emplace(pl.name, pl); + SONGMAN->GetPlaylists().emplace(pl.name, pl); SONGMAN->activeplaylist = pl.name; Message msg("DisplayAll"); MESSAGEMAN->Broadcast(msg); @@ -1825,7 +1830,7 @@ class LunaScreenSelectMusic : public Luna static int StartPlaylistAsCourse(T* p, lua_State *L) { string name = SArg(1); - Playlist& pl = SONGMAN->allplaylists[name]; + Playlist& pl = SONGMAN->GetPlaylists()[name]; // don't allow empty playlists to be started as a course if (pl.chartlist.empty()) diff --git a/src/SongManager.cpp b/src/SongManager.cpp index cdc529fcc0..628a8aa2bf 100644 --- a/src/SongManager.cpp +++ b/src/SongManager.cpp @@ -363,8 +363,11 @@ void Playlist::LoadFromNode(const XNode* node) { } } -void SongManager::MakeSongGroupsFromPlaylists() { - for (auto& p : allplaylists) { +void SongManager::MakeSongGroupsFromPlaylists(map& playlists) { + for(auto& plName : playlistGroups) + groupderps.erase(plName); + playlistGroups.clear(); + for (auto& p : playlists) { vector playlistgroup; for (auto& n : p.second.chartlist) if (n.loaded) @@ -373,6 +376,7 @@ void SongManager::MakeSongGroupsFromPlaylists() { groupderps.erase(p.first); groupderps[p.first] = playlistgroup; SongUtil::SortSongPointerArrayByTitle(groupderps[p.first]); + playlistGroups.emplace_back(p.first); } } @@ -399,18 +403,18 @@ vector Playlist::GetKeys() { return o; } -void SongManager::DeletePlaylist(const string& pl) { - allplaylists.erase(pl); +void SongManager::DeletePlaylist(const string& pl, map &playlists) { + playlists.erase(pl); // stuff gets weird if all playlists have been deleted and a chart is added - mina - if(allplaylists.size() > 0) - activeplaylist = allplaylists.begin()->first; + if(playlists.size() > 0) + activeplaylist = playlists.begin()->first; // clear out the entry for the music wheel as well or it'll crash -mina groupderps.erase(pl); } -void SongManager::MakePlaylistFromFavorites(set& favs) { +void SongManager::MakePlaylistFromFavorites(set& favs, map& playlists) { Playlist pl; pl.name = "Favorites"; for (auto& n : favs) @@ -421,7 +425,7 @@ void SongManager::MakePlaylistFromFavorites(set& favs) { if (!pl.chartlist[i].loaded) pl.DeleteChart(i); - allplaylists.emplace("Favorites", pl); + playlists.emplace("Favorites", pl); } string SongManager::ReconcileBustedKeys(const string& ck) { @@ -706,10 +710,13 @@ bool SongManager::IsGroupNeverCached(const RString& group) const } void SongManager::SetFavoritedStatus(set& favs) { - FOREACH(Song*, m_pSongs, song) + FOREACH(Song*, m_pSongs, song) { + bool fav = false; FOREACH_CONST(Steps*, (*song)->GetAllSteps(), steps) - if (favs.count((*steps)->GetChartKey())) - (*song)->SetFavorited(true); + if (favs.count((*steps)->GetChartKey())) + fav = true; + (*song)->SetFavorited(fav); + } } void SongManager::SetPermaMirroredStatus(set& pmir) { @@ -764,11 +771,11 @@ bool SongManager::DoesSongGroupExist( const RString &sSongGroup ) const return find( m_sSongGroupNames.begin(), m_sSongGroupNames.end(), sSongGroup ) != m_sSongGroupNames.end(); } -RageColor SongManager::GetSongGroupColor( const RString &sSongGroup ) const +RageColor SongManager::GetSongGroupColor( const RString &sSongGroup, map& playlists) const { for( unsigned i=0; i& SongManager::GetPlaylists() +{ + return PROFILEMAN->GetProfile(PLAYER_1)->allplaylists; +} + void SongManager::SetPreferences() { } @@ -1447,7 +1459,7 @@ class LunaSongManager: public Luna static int GetActivePlaylist(T* p, lua_State *L) { - p->allplaylists[p->activeplaylist].PushSelf(L); + p->GetPlaylists()[p->activeplaylist].PushSelf(L); return 1; } @@ -1467,7 +1479,7 @@ class LunaSongManager: public Luna { int idx = 1; lua_newtable(L); - FOREACHM(string, Playlist, p->allplaylists, pl) { + FOREACHM(string, Playlist, p->GetPlaylists(), pl) { pl->second.PushSelf(L); lua_rawseti(L, -2, idx); ++idx; diff --git a/src/SongManager.h b/src/SongManager.h index c1786eadaa..dd0014614e 100644 --- a/src/SongManager.h +++ b/src/SongManager.h @@ -7,6 +7,7 @@ class Style; class Steps; class PlayerOptions; struct lua_State; +struct GoalsForChart; #include "RageTypes.h" #include "GameConstantsAndTypes.h" @@ -83,7 +84,7 @@ class SongManager void Cleanup(); void Invalidate( const Song *pStaleSong ); - + static map& GetPlaylists(); void SetPreferences(); void SaveEnabledSongsToPref(); void LoadEnabledSongsFromPref(); @@ -107,7 +108,7 @@ class SongManager void GetSongGroupNames( vector &AddTo ) const; const vector& GetSongGroupNames() const; bool DoesSongGroupExist( const RString &sSongGroup ) const; - RageColor GetSongGroupColor( const RString &sSongGroupName ) const; + RageColor GetSongGroupColor( const RString &sSongGroupName, map& playlists = GetPlaylists()) const; RageColor GetSongColor( const Song* pSong ) const; // temporary solution to reorganizing the entire songid/stepsid system - mina @@ -182,16 +183,16 @@ class SongManager // Lua void PushSelf( lua_State *L ); - map allplaylists; string activeplaylist = ""; string playlistcourse = ""; string ReconcileBustedKeys(const string& ck); map keyconversionmap; - void MakeSongGroupsFromPlaylists(); - void DeletePlaylist(const string& ck); - void MakePlaylistFromFavorites(set& favs); + void MakeSongGroupsFromPlaylists(map& playlists = GetPlaylists()); + void DeletePlaylist(const string& ck, map& playlists = GetPlaylists()); + void MakePlaylistFromFavorites(set& favs, map& playlists = GetPlaylists()); map> groupderps; + vector playlistGroups; // To delete from groupderps when rebuilding playlist groups protected: void LoadStepManiaSongDir( RString sDir, LoadingWindow *ld ); void LoadDWISongDir( const RString &sDir ); diff --git a/src/XMLProfile.cpp b/src/XMLProfile.cpp index 38e1b9bc02..c792e7ec09 100644 --- a/src/XMLProfile.cpp +++ b/src/XMLProfile.cpp @@ -444,8 +444,8 @@ XNode* XMLProfile::SavePlaylistsCreateNode(const Profile* profile) const { CHECKPOINT_M("Saving the playlists node."); XNode* playlists = new XNode("Playlists"); - auto& pls = SONGMAN->allplaylists; - FOREACHM(string, Playlist, pls, i) + auto& pls = profile->allplaylists; + FOREACHM_CONST(string, Playlist, pls, i) if (i->first != "" && i->first != "Favorites") playlists->AppendChild(i->second.CreateNode()); return playlists; @@ -458,7 +458,7 @@ void XMLProfile::LoadFavoritesFromNode(const XNode *pNode) { loadingProfile->FavoritedCharts.emplace(SONGMAN->ReconcileBustedKeys(ck->GetName())); SONGMAN->SetFavoritedStatus(loadingProfile->FavoritedCharts); - SONGMAN->MakePlaylistFromFavorites(loadingProfile->FavoritedCharts); + SONGMAN->MakePlaylistFromFavorites(loadingProfile->FavoritedCharts, loadingProfile->allplaylists); } void XMLProfile::LoadPermaMirrorFromNode(const XNode *pNode) { @@ -493,7 +493,7 @@ void XMLProfile::LoadScoreGoalsFromNode(const XNode *pNode) { void XMLProfile::LoadPlaylistsFromNode(const XNode *pNode) { CHECKPOINT_M("Loading the playlists node."); - auto& pls = SONGMAN->allplaylists; + auto& pls = loadingProfile->allplaylists; FOREACH_CONST_Child(pNode, pl) { Playlist tmp; tmp.LoadFromNode(pl); @@ -1146,7 +1146,7 @@ XNode *XMLProfile::SaveEttXmlCreateNode(const Profile* profile) const if (!profile->PermaMirrorCharts.empty()) xml->AppendChild(SavePermaMirrorCreateNode(profile)); - if (!SONGMAN->allplaylists.empty()) + if (!loadingProfile->allplaylists.empty()) xml->AppendChild(SavePlaylistsCreateNode(profile)); if (!profile->goalmap.empty())