From aa727d7f767882d2c5b16a8ede5a3c6400764884 Mon Sep 17 00:00:00 2001 From: MinaciousGrace Date: Mon, 8 May 2017 17:28:55 -0400 Subject: [PATCH] make slightly less rough playlist frontend --- .../playlists.lua | 229 ++++++++++-------- src/Profile.cpp | 2 +- src/ScreenSelectMusic.cpp | 17 +- src/SongManager.cpp | 42 +++- src/SongManager.h | 7 +- 5 files changed, 167 insertions(+), 130 deletions(-) diff --git a/Themes/Til Death/BGAnimations/ScreenSelectMusic decorations/playlists.lua b/Themes/Til Death/BGAnimations/ScreenSelectMusic decorations/playlists.lua index b12a548e2b..f834d7f8e3 100644 --- a/Themes/Til Death/BGAnimations/ScreenSelectMusic decorations/playlists.lua +++ b/Themes/Til Death/BGAnimations/ScreenSelectMusic decorations/playlists.lua @@ -13,6 +13,7 @@ local t = Def.ActorFrame{ self:queuecommand("Off") update = false end + MESSAGEMAN:Broadcast("DisplayAll") end, TabChangedMessageCommand=cmd(queuecommand,"Set"), PlayerJoinedMessageCommand=cmd(queuecommand,"Set"), @@ -28,7 +29,6 @@ local scoreYspacing = 10 local distY = 15 local offsetX = -10 local offsetY = 20 -local rankingSkillset=1 local rankingPage=1 local numrankingpages = 10 local rankingWidth = frameWidth-capWideScale(15,50) @@ -38,17 +38,19 @@ local rankingTitleSpacing = (rankingWidth/(#ms.SkillSets)) local buttondiffuse = 0.4 local whee +local PlaylistYspacing = 30 +local playliststodisplay = 10 + +local row2Yoffset = 12 + local pl local keylist local ratelist local songlist = {} local stepslist = {} - -if GAMESTATE:IsPlayerEnabled(PLAYER_1) then - profile = GetPlayerOrMachineProfile(PLAYER_1) -end - +local allplaylists +local playlistnames t[#t+1] = Def.Quad{InitCommand=cmd(xy,frameX,frameY;zoomto,frameWidth,frameHeight;halign,0;valign,0;diffuse,color("#333333CC"))} t[#t+1] = Def.Quad{InitCommand=cmd(xy,frameX,frameY;zoomto,frameWidth,offsetY;halign,0;valign,0;diffuse,getMainColor('frames');diffusealpha,0.5)} @@ -64,7 +66,6 @@ local function ButtonActive(self,scale) return isOverScaled(self,scale) and update end - local function makesimpletextbutton(buttontext, leftcmd, rightcmd) local o = Def.ActorFrame{ OnCommand=function(self) @@ -102,13 +103,12 @@ local r = Def.ActorFrame{ OnCommand=function(self) whee = SCREENMAN:GetTopScreen():GetMusicWheel() end, - UpdateRankingMessageCommand=function(self) + DisplayPlaylistMessageCommand=function(self) if update then pl = SONGMAN:GetActivePlaylist() if pl then keylist = pl:GetChartlist() ratelist = pl:GetRatelist() - for j=1,#keylist do songlist[j] = SONGMAN:GetSongByChartKey(keylist[j]) stepslist[j] = SONGMAN:GetStepsByChartKey(keylist[j]) @@ -117,7 +117,7 @@ local r = Def.ActorFrame{ --songlist = pl:GetSonglist() --stepslist = pl:GetStepslist() self:visible(true) - self:RunCommandsOnChildren(cmd(queuecommand, "Display")) + self:RunCommandsOnChildren(cmd(queuecommand, "DisplayPP")) end else self:visible(false) @@ -131,7 +131,6 @@ local r = Def.ActorFrame{ } } -r[#r+1] = makesimpletextbutton("Add Chart", function() pl:AddChart(GAMESTATE:GetCurrentSteps(PLAYER_1):GetChartKey()) end) local function RateDisplayButton(i) local o = Def.ActorFrame{ @@ -141,7 +140,7 @@ local function RateDisplayButton(i) end, LoadFont("Common Large") .. { Name="Text", - DisplayCommand=function(self) + DisplayPlaylistCommand=function(self) local ratestring = string.format("%.2f", ratelist[i]):gsub("%.?0+$", "").."x" self:settext(ratestring) self:GetParent():queuecommand("Resize") @@ -153,13 +152,13 @@ local function RateDisplayButton(i) MouseLeftClickMessageCommand=function(self) if ButtonActive(self,fontScale) then pl:ChangeRateAtIndex(i,0.1) - BroadcastIfActive("UpdateRanking") + BroadcastIfActive("DisplayPlaylist") end end, MouseRightClickMessageCommand=function(self) if ButtonActive(self,fontScale) then pl:ChangeRateAtIndex(i,-0.1) - BroadcastIfActive("UpdateRanking") + BroadcastIfActive("DisplayPlaylist") end end } @@ -176,7 +175,7 @@ local function TitleDisplayButton(i) LoadFont("Common Large") .. { Name="Text", InitCommand=cmd(halign,0), - DisplayCommand=function(self) + DisplayPlaylistCommand=function(self) self:settext(songlist[i]:GetDisplayMainTitle()) self:GetParent():queuecommand("Resize") end @@ -201,27 +200,20 @@ local function rankingLabel(i) self:RunCommandsOnChildren(cmd(halign,0;zoom,fontScale)) self:visible(false) end, - UpdateRankingMessageCommand=function(self) - if rankingSkillset > 1 and update then - pl = SONGMAN:GetActivePlaylist() - keylist = pl:GetChartlist() - ratelist = pl:GetRatelist() - - for j=1,#keylist do - songlist[j] = SONGMAN:GetSongByChartKey(keylist[j]) - stepslist[j] = SONGMAN:GetStepsByChartKey(keylist[j]) + DisplayAllMessageCommand=cmd(visible,false), + DisplayPPMessageCommand=function(self) + if update then + if songlist[i] then + self:visible(true) + self:RunCommandsOnChildren(cmd(queuecommand, "DisplayPlaylist",visible,true)) end - --songlist = pl:GetSonglist() - --stepslist = pl:GetStepslist() - self:visible(true) - self:RunCommandsOnChildren(cmd(queuecommand, "Display")) else self:visible(false) end end, LoadFont("Common Large") .. { InitCommand=cmd(maxwidth,100), - DisplayCommand=function(self) + DisplayPlaylistCommand=function(self) self:halign(0.5) self:diffuse(getMainColor("positive")) self:settext(((rankingPage-1)*25)+i..".") @@ -229,13 +221,13 @@ local function rankingLabel(i) }, LoadFont("Common Large") .. { -- pack mouseover for later InitCommand=cmd(x,15;maxwidth,580), - DisplayCommand=function(self) + DisplayPlaylistCommand=function(self) --self:settext(songlist[i]:GetGroupName()) end }, LoadFont("Common Large") .. { InitCommand=cmd(x,256;maxwidth,160), - DisplayCommand=function(self) + DisplayPlaylistCommand=function(self) local rating = stepslist[i]:GetMSD(1,ratelist[i]) self:settextf("%.2f", rating) self:diffuse(ByMSD(rating)) @@ -243,7 +235,7 @@ local function rankingLabel(i) }, LoadFont("Common Large") .. { InitCommand=cmd(x,300), - DisplayCommand=function(self) + DisplayPlaylistCommand=function(self) local diff = stepslist[i]:GetDifficulty() self:halign(0.5) self:diffuse(byDifficulty(diff)) @@ -256,102 +248,125 @@ local function rankingLabel(i) return t end -local function rankingButton(i) - local t = Def.ActorFrame{ - InitCommand=function(self) - self:xy(rankingX + (i-1)*rankingTitleSpacing, rankingY) + +local b2 = Def.ActorFrame{ + InitCommand=cmd(xy,260,40;zoom,0.3), + DisplayAllMessageCommand=cmd(visible,false), + DisplayPlaylistMessageCommand=cmd(visible,true) +} + +b2[#b2+1] = makesimpletextbutton("Add Chart", function() pl:AddChart(GAMESTATE:GetCurrentSteps(PLAYER_1):GetChartKey()) end) +r[#r+1] = b2 + + + + +local function PlaylistTitleDisplayButton(i) + local o = Def.ActorFrame{ + InitCommand=cmd(x,15), + ResizeCommand=function(self) + self:GetChild("Button"):zoomto(self:GetChild("Text"):GetZoomedWidth(),self:GetChild("Text"):GetZoomedHeight()) end, - Def.Quad{ - InitCommand=cmd(zoomto,rankingTitleSpacing,30;diffuse,getMainColor('frames');diffusealpha,0.35), - SetCommand=function(self) - if i == rankingSkillset then - self:diffusealpha(1) - else - self:diffusealpha(0.35) + LoadFont("Common Large") .. { + Name="Text", + InitCommand=cmd(halign,0), + AllDisplayCommand=function(self) + if allplaylists[i] then + self:settext(allplaylists[i]:GetName()) + self:GetParent():queuecommand("Resize") end - end, + end + }, + Def.Quad{ + Name="Button", + InitCommand=cmd(diffusealpha,buttondiffuse;halign,0), MouseLeftClickMessageCommand=function(self) - if ButtonActive(self) then - rankingSkillset = i - rankingPage = 1 - SCOREMAN:SortSSRs(ms.SkillSets[rankingSkillset]) - BroadcastIfActive("UpdateRanking") + if ButtonActive(self,fontScale) then + SONGMAN:SetActivePlaylist(allplaylists[i]:GetName()) + pl = allplaylists[i] + MESSAGEMAN:Broadcast("DisplayPlaylist") end - end, - UpdateRankingMessageCommand=cmd(queuecommand,"Set") - }, - LoadFont("Common Large") .. { - InitCommand=cmd(diffuse,getMainColor('positive');maxwidth,rankingTitleSpacing;maxheight,25;zoom,0.85), - BeginCommand=function(self) - self:settext(ms.SkillSets[i]) end } } - return t + return o end --- prev/next page -r[#r+1] = Def.ActorFrame{ - InitCommand=cmd(xy, 10, frameHeight - offsetY;visible,false), - UpdateRankingMessageCommand=function(self) - if rankingSkillset > 1 then +local function PlaylistSelectLabel(i) + local t = Def.ActorFrame{ + InitCommand=function(self) + self:xy(rankingX + offsetX, rankingY + offsetY + 10 + (i-1)*PlaylistYspacing) + self:RunCommandsOnChildren(cmd(halign,0;zoom,fontScale)) self:visible(true) - self:RunCommandsOnChildren(cmd(queuecommand, "Display")) - else - self:visible(false) - end - end, - Def.Quad{ - InitCommand=cmd(xy,300,-8;zoomto,40,20;halign,0;valign,0;diffuse,getMainColor('frames');diffusealpha,buttondiffuse), - MouseLeftClickMessageCommand=function(self) - if isOver(self) then - if rankingPage < numrankingpages then - rankingPage = rankingPage + 1 - else - rankingPage = 1 - end - BroadcastIfActive("UpdateRanking") + end, + DisplayPlaylistMessageCommand=cmd(visible,false), + DisplayAllMessageCommand=function(self) + if update and allplaylists[i] then + self:visible(true) + self:RunCommandsOnChildren(cmd(queuecommand, "AllDisplay")) + else + self:visible(false) end - end - }, - LoadFont("Common Large") .. { - InitCommand=cmd(x,300;halign,0;zoom,0.3;diffuse,getMainColor('positive');settext,"Next"), - }, - Def.Quad{ - InitCommand=cmd(y,-8;zoomto,65,20;halign,0;valign,0;diffuse,getMainColor('frames');diffusealpha,buttondiffuse), - MouseLeftClickMessageCommand=function(self) - if isOver(self) then - if rankingPage > 1 then - rankingPage = rankingPage - 1 - else - rankingPage = numrankingpages - end - BroadcastIfActive("UpdateRanking") + end, + LoadFont("Common Large") .. { + InitCommand=cmd(maxwidth,100), + AllDisplayCommand=function(self) + self:halign(0.5) + self:diffuse(getMainColor("positive")) + self:settext(((rankingPage-1)*25)+i..".") end - end - }, - LoadFont("Common Large") .. { - InitCommand=cmd(halign,0;zoom,0.3;diffuse,getMainColor('positive');settext,"Previous"), - }, - LoadFont("Common Large") .. { - InitCommand=cmd(x,175;halign,0.5;zoom,0.3;diffuse,getMainColor('positive')), - DisplayCommand=function(self) - self:settextf("%i-%i", ((rankingPage-1)*25)+1, rankingPage*25) - end + }, + LoadFont("Common Large") .. { + InitCommand=cmd(xy,15,row2Yoffset), + AllDisplayCommand=function(self) + self:diffuse(getMainColor("positive")) + self:settextf("Number of charts: %d", allplaylists[i]:GetNumCharts()) + end + }, + LoadFont("Common Large") .. { + InitCommand=cmd(xy,200,row2Yoffset), + AllDisplayCommand=function(self) + local rating = 0 + self:settextf("Average Rating:%5.2f", rating) + self:diffuse(getMainColor("positive")) + end + }, } + t[#t+1] = PlaylistTitleDisplayButton(i) + return t +end + +local playlists = Def.ActorFrame{ + OnCommand=function(self) + allplaylists = SONGMAN:GetPlaylists() + end, + DisplayAllMessageCommand=function(self) + self:visible(true) + allplaylists = SONGMAN:GetPlaylists() + self:RunCommandsOnChildren(cmd(queuecommand, "Display")) + end +} + +local b = Def.ActorFrame{ + InitCommand=cmd(xy,100,frameHeight+20;zoom,0.3), + DisplayPlaylistMessageCommand=cmd(visible,false), + DisplayAllMessageCommand=cmd(visible,true) } -for i=1,scoresperpage do +b[#b+1] = makesimpletextbutton("New Playlist", function() SONGMAN:NewPlaylist() end) +playlists[#playlists+1] = b + +for i=1,scoresperpage do r[#r+1] = rankingLabel(i) end --- Technically the "overall" skillset is used for single value display during music select/eval and isn't factored in to the profile rating --- Only the specific skillsets are, and so overall should be used to display the specific skillset breakdowns separately - mina -for i=1,#ms.SkillSets do - r[#r+1] = rankingButton(i) +for i=1,playliststodisplay do + playlists[#playlists+1] = PlaylistSelectLabel(i) end + +t[#t+1] = playlists t[#t+1] = r return t \ No newline at end of file diff --git a/src/Profile.cpp b/src/Profile.cpp index 57a8e7e7dc..6a2bcd51ae 100644 --- a/src/Profile.cpp +++ b/src/Profile.cpp @@ -1394,7 +1394,7 @@ XNode* Profile::SaveScoreGoalsCreateNode() const { XNode* Profile::SavePlaylistsCreateNode() const { XNode* playlists = new XNode("Playlists"); auto& pls = SONGMAN->allplaylists; - FOREACHUM(string, Playlist, pls, i) + FOREACHM(string, Playlist, pls, i) playlists->AppendChild(i->second.CreateNode()); return playlists; } diff --git a/src/ScreenSelectMusic.cpp b/src/ScreenSelectMusic.cpp index 8cf7869e2c..9f7068a977 100644 --- a/src/ScreenSelectMusic.cpp +++ b/src/ScreenSelectMusic.cpp @@ -511,21 +511,6 @@ bool ScreenSelectMusic::Input( const InputEventPlus &input ) m_MusicWheel.ChangeMusic(0); return true; } - else if (bHoldingCtrl && c == 'P' && m_MusicWheel.IsSettled() && input.type == IET_FIRST_PRESS) - { - ScreenTextEntry::TextEntry(SM_BackFromNamePlaylist, "DOOT DOOT MOTHAFUCKA", "", 255); - return true; - } - - else if (bHoldingCtrl && c == 'A' && m_MusicWheel.IsSettled() && input.type == IET_FIRST_PRESS) - { - Chart ch; - string ck = GAMESTATE->m_pCurSteps[PLAYER_1]->ChartKey; - ch.FromKey(ck); - SONGMAN->allplaylists[SONGMAN->activeplaylist].Add(ch); - return true; - } - else if( input.DeviceI.device == DEVICE_KEYBOARD && bHoldingCtrl && input.DeviceI.button == KEY_BACK && input.type == IET_FIRST_PRESS && m_MusicWheel.IsSettled() ) { @@ -1238,6 +1223,8 @@ void ScreenSelectMusic::HandleScreenMessage( const ScreenMessage SM ) pl.name = ScreenTextEntry::s_sLastAnswer; SONGMAN->allplaylists.emplace(pl.name, pl); SONGMAN->activeplaylist = pl.name; + Message msg("DisplayAll"); + MESSAGEMAN->Broadcast(msg); } ScreenWithMenuElements::HandleScreenMessage( SM ); diff --git a/src/SongManager.cpp b/src/SongManager.cpp index f678e516fc..a729e71bee 100644 --- a/src/SongManager.cpp +++ b/src/SongManager.cpp @@ -32,6 +32,7 @@ #include "ThemeManager.h" #include "TitleSubstitution.h" #include "SpecialFiles.h" +#include "ScreenTextEntry.h" SongManager* SONGMAN = NULL; // global and accessible from anywhere in our program @@ -52,6 +53,8 @@ RString SONG_GROUP_COLOR_NAME( size_t i ) { return ssprintf( "SongGroupColor%i static const float next_loading_window_update= 0.02f; +AutoScreenMessage(SM_BackFromNamePlaylist); + SongManager::SongManager() { // Register with Lua. @@ -142,7 +145,6 @@ void SongManager::InitSongsFromDisk( LoadingWindow *ld ) void Chart::FromKey(const string& ck) { Song* song = SONGMAN->GetSongByChartkey(ck); - if (song) { Steps* steps = SONGMAN->GetStepsByChartkey(ck); lastpack = song->GetSongDir(); @@ -151,6 +153,7 @@ void Chart::FromKey(const string& ck) { loaded = true; songptr = song; stepsptr = steps; + key = ck; LOG->Trace(songptr->GetDisplayMainTitle()); } loaded = false; @@ -159,7 +162,6 @@ void Chart::FromKey(const string& ck) { XNode* Playlist::CreateNode() const { XNode* pl = new XNode("Playlist"); pl->AppendAttr("Name", name); - FOREACH_CONST(Chart, chartlist, ch) { XNode* chart = new XNode(ch->key); Song* song = SONGMAN->GetSongByChartkey(ch->key); @@ -201,7 +203,7 @@ void Playlist::LoadFromNode(const XNode* node) { vector Playlist::GetKeys() { vector o; for (size_t i = 0; i < chartlist.size(); ++i) - o.emplace_back(chartlist[i].key); + o.emplace_back(chartlist[i].key); return o; } @@ -1406,6 +1408,33 @@ class LunaSongManager: public Luna return 1; } + static int SetActivePlaylist(T* p, lua_State *L) + { + p->activeplaylist= SArg(1); + return 1; + } + + static int NewPlaylist(T* p, lua_State *L) + { + p->allplaylists[p->activeplaylist].PushSelf(L); + ScreenTextEntry::TextEntry(SM_BackFromNamePlaylist, "Name Playlist", "", 128); + return 1; + } + + static int GetPlaylists(T* p, lua_State *L) + { + int idx = 0; + lua_newtable(L); + FOREACHM(string, Playlist, p->allplaylists, pl) { + pl->second.PushSelf(L); + lua_rawseti(L, -2, idx); + ++idx; + } + + return 1; + } + + LunaSongManager() { ADD_METHOD( GetAllSongs ); @@ -1433,6 +1462,9 @@ class LunaSongManager: public Luna ADD_METHOD( GetStepsByChartKey ); ADD_METHOD(GetNumCourses); ADD_METHOD(GetActivePlaylist); + ADD_METHOD(SetActivePlaylist); + ADD_METHOD(NewPlaylist); + ADD_METHOD(GetPlaylists); } }; @@ -1489,14 +1521,18 @@ class LunaPlaylist : public Luna static int AddChart(T* p, lua_State *L) { p->AddChart(SArg(1)); + Message msg("DisplayPlaylist"); + MESSAGEMAN->Broadcast(msg); return 1; } DEFINE_METHOD(GetName, GetName()); + DEFINE_METHOD(GetNumCharts, GetNumCharts()) LunaPlaylist() { ADD_METHOD(AddChart); ADD_METHOD(GetChartlist); + ADD_METHOD(GetNumCharts); ADD_METHOD(GetRatelist); ADD_METHOD(GetName); ADD_METHOD(GetSonglist); diff --git a/src/SongManager.h b/src/SongManager.h index 4714d2541d..5d8db13b89 100644 --- a/src/SongManager.h +++ b/src/SongManager.h @@ -48,7 +48,7 @@ struct Playlist { vector chartlist; vector chartrates; void Add(Chart ch) { chartlist.emplace_back(ch); } - void AddChart(const string& ck) { Chart ch; ch.FromKey(ck); chartlist.emplace_back(); } + void AddChart(const string& ck) { Chart ch; ch.FromKey(ck); chartlist.emplace_back(ch); chartrates.emplace_back(1.f); } void SwapPosition(); void Create(); @@ -56,7 +56,7 @@ struct Playlist { XNode* CreateNode() const; void LoadFromNode(const XNode* node); - + int GetNumCharts() { return chartlist.size(); } vector GetKeys(); vector GetRates() { return chartrates; } string GetName() { return name; } @@ -183,9 +183,8 @@ class SongManager void PushSelf( lua_State *L ); - unordered_map allplaylists; + map allplaylists; string activeplaylist; - protected: void LoadStepManiaSongDir( RString sDir, LoadingWindow *ld ); void LoadDWISongDir( const RString &sDir );