From 74f24125dafc2d3e562f41069de502e31893e584 Mon Sep 17 00:00:00 2001 From: Florian Kuepper Date: Sun, 8 Jul 2012 14:09:05 +0200 Subject: [PATCH] Added first (playable) Playlist-Element to ScreenSong. Still a lot to do! --- Output/Themes/Ambient/Close.png | Bin 0 -> 5236 bytes Output/Themes/Ambient/Delete.png | Bin 0 -> 5705 bytes Output/Themes/Ambient/Save.png | Bin 0 -> 5036 bytes Output/Themes/Ambient/Screens/ScreenSong.xml | 502 +++++++++++++++++- Output/Themes/Ambient/Sing.png | Bin 0 -> 4616 bytes Output/Themes/Ambient/Skin Blue.xml | 10 + Output/Themes/Ambient/Skin Green.xml | 10 + Output/Themes/Ambient/Skin Red.xml | 10 + Output/Themes/Ambient/Skin Yellow.xml | 10 + .../Themes/Changelog/Changelog_ScreenSong.txt | 11 + Vocaluxe/Base/CPlaylists.cs | 29 + Vocaluxe/Lib/Playlist/CPlaylist.cs | 68 ++- Vocaluxe/Lib/Song/CSong.cs | 18 + Vocaluxe/Menu/CInteraction.cs | 3 +- Vocaluxe/Menu/CMenu.cs | 113 +++- Vocaluxe/Menu/CSelectSlide.cs | 8 + Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs | 4 +- Vocaluxe/Screens/CScreenSong.cs | 169 +++++- Vocaluxe/Vocaluxe.csproj | 1 + 19 files changed, 933 insertions(+), 33 deletions(-) create mode 100644 Output/Themes/Ambient/Close.png create mode 100644 Output/Themes/Ambient/Delete.png create mode 100644 Output/Themes/Ambient/Save.png create mode 100644 Output/Themes/Ambient/Sing.png diff --git a/Output/Themes/Ambient/Close.png b/Output/Themes/Ambient/Close.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b8a99477da3831071a68cc0d20b1d06ad8d624 GIT binary patch literal 5236 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 literal 0 HcmV?d00001 diff --git a/Output/Themes/Ambient/Save.png b/Output/Themes/Ambient/Save.png new file mode 100644 index 0000000000000000000000000000000000000000..1afc31136a75898cc89c655d7add37abe5c468e5 GIT binary patch literal 5036 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 EA1h22W&i*H literal 0 HcmV?d00001 diff --git a/Output/Themes/Ambient/Screens/ScreenSong.xml b/Output/Themes/Ambient/Screens/ScreenSong.xml index 4abd92ab..24f56698 100644 --- a/Output/Themes/Ambient/Screens/ScreenSong.xml +++ b/Output/Themes/Ambient/Screens/ScreenSong.xml @@ -72,6 +72,38 @@ 26 + + + Menu + + 970 + 40 + -1,00 + 295 + 40 + + + StaticColor + + + + + + + Menu + + 970 + 550 + -1,00 + 295 + 40 + + + StaticColor + + + + Button @@ -126,7 +158,7 @@ Button 40 - 180 + 235 -2,11 360 40 @@ -173,7 +205,7 @@ Button 40 - 225 + 290 -2,11 360 40 @@ -213,6 +245,194 @@ + + + CloseIcon + + CloseIcon + + 1215 + 42 + -1,01 + 35 + 35 + + + ButtonColor + + + ButtonSColor + + + 180 + 5 + + 30 + + 350 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Outline + + + + + + + + + + + + + SingIcon + + SingIcon + + 975 + 553 + -1,01 + 35 + 35 + + + ButtonColor + + + ButtonSColor + + + 180 + 5 + + 30 + + 350 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Outline + + + + + + + + + + + + + SaveIcon + + SaveIcon + + 1175 + 553 + -1,01 + 35 + 35 + + + ButtonColor + + + ButtonSColor + + + 180 + 5 + + 30 + + 350 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Outline + + + + + + + + + + + + + DeleteIcon + + DeleteIcon + + 1215 + 553 + -1,01 + 35 + 35 + + + ButtonColor + + + ButtonSColor + + + 180 + 5 + + 30 + + 350 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Outline + + + + + + + + + + 200 @@ -367,6 +587,36 @@ + + + 975 + 45 + + -1,01 + + 30 + + 220 + + + StaticColor + + + TextSColor + + Left + + Center + + + + Outline + + + + + + Button @@ -432,6 +682,71 @@ 1 + + + Button + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 40 + 190 + -2,11 + 360 + 40 + + 45 + 195 + -2,12 + 30 + 30 + + 365 + 195 + -2,12 + 30 + 30 + + + ButtonColor + + + ButtonSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 30 + + 280 + + Outline + + Bold + + 1 + CoverTile @@ -671,5 +986,188 @@ + + 970 + 80 + 295 + 460 + -1,00 + 50,00 + CoverTile + CoverTile + StaticColorAlpha + StaticColor + + + 54 + 4 + + -1,01 + + 24 + + 235 + + + StaticColor + + + TextSColor + + Left + + Top + + + + Outline + + %a - %t + + + + + + + 222 + 456 + + -1,01 + + 38 + + 340 + + + StaticColor + + + TextSColor + + Center + + Center + + + + Outline + + + + + + + + + 222 + 456 + + -1,01 + + 38 + + 340 + + + StaticColor + + + TextSColor + + Center + + Center + + + + Outline + + + + + + + + + + + 4 + 2 + -1,00 + 46 + 46 + + + Visible + + + + + + + Button + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 54 + 28 + -1,01 + 235 + 24 + + 54 + 30 + 0,00 + 20 + 20 + + 110 + 30 + 0,00 + 20 + 20 + + + ButtonColor + + + ButtonSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 24,00 + + 230,00 + + Outline + + Bold + + 1 + + diff --git a/Output/Themes/Ambient/Sing.png b/Output/Themes/Ambient/Sing.png new file mode 100644 index 0000000000000000000000000000000000000000..c7daf961999ad89e32b0f0ddc2f49d627dfc2ad9 GIT binary patch literal 4616 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 Z>fc39b;R*=^?!eD6yl+FmFAPM{{X#!ZRh|1 literal 0 HcmV?d00001 diff --git a/Output/Themes/Ambient/Skin Blue.xml b/Output/Themes/Ambient/Skin Blue.xml index 50a16aa8..3cb2b0db 100644 --- a/Output/Themes/Ambient/Skin Blue.xml +++ b/Output/Themes/Ambient/Skin Blue.xml @@ -166,6 +166,12 @@ 0,969 1,000 + + 0,675 + 0,890 + 0,969 + 0,500 + 0,675 0,890 @@ -315,6 +321,10 @@ PauseIcon.png RepeatIcon.png SongMenuBG.png + Close.png + Delete.png + Save.png + Sing.png [Blue]BG_Video.mp4 diff --git a/Output/Themes/Ambient/Skin Green.xml b/Output/Themes/Ambient/Skin Green.xml index 7aefeb34..663faf5c 100644 --- a/Output/Themes/Ambient/Skin Green.xml +++ b/Output/Themes/Ambient/Skin Green.xml @@ -130,6 +130,12 @@ 0,674 1,000 + + 0,709 + 0,968 + 0,674 + 0,500 + 0,709 0,968 @@ -315,6 +321,10 @@ PauseIcon.png RepeatIcon.png SongMenuBG.png + Close.png + Delete.png + Save.png + Sing.png [Green]BG_Video.mp4 diff --git a/Output/Themes/Ambient/Skin Red.xml b/Output/Themes/Ambient/Skin Red.xml index d7f5ecf2..9d3f1f8d 100644 --- a/Output/Themes/Ambient/Skin Red.xml +++ b/Output/Themes/Ambient/Skin Red.xml @@ -130,6 +130,12 @@ 0,674 1,000 + + 0,968 + 0,674 + 0,674 + 0,500 + 0,968 0,674 @@ -315,6 +321,10 @@ PauseIcon.png RepeatIcon.png SongMenuBG.png + Close.png + Delete.png + Save.png + Sing.png [Red]BG_Video.mp4 diff --git a/Output/Themes/Ambient/Skin Yellow.xml b/Output/Themes/Ambient/Skin Yellow.xml index d7366abc..fcb4664a 100644 --- a/Output/Themes/Ambient/Skin Yellow.xml +++ b/Output/Themes/Ambient/Skin Yellow.xml @@ -130,6 +130,12 @@ 0,674 1,000 + + 0,968 + 0,956 + 0,674 + 0,500 + 0,968 0,956 @@ -315,6 +321,10 @@ PauseIcon.png RepeatIcon.png SongMenuBG.png + Close.png + Delete.png + Save.png + Sing.png [Yellow]BG_Video.mp4 diff --git a/Output/Themes/Changelog/Changelog_ScreenSong.txt b/Output/Themes/Changelog/Changelog_ScreenSong.txt index 1303abb5..e78df639 100644 --- a/Output/Themes/Changelog/Changelog_ScreenSong.txt +++ b/Output/Themes/Changelog/Changelog_ScreenSong.txt @@ -1,5 +1,16 @@ ScreenSong +++++++++++ +Version 3: + +Add: +, , +, +, , , , , , +, +and + as a new Screen-Element. For details, look at ScreenSong.xml + ++++++++++ Version 2: diff --git a/Vocaluxe/Base/CPlaylists.cs b/Vocaluxe/Base/CPlaylists.cs index a720107a..8ab1dfe5 100644 --- a/Vocaluxe/Base/CPlaylists.cs +++ b/Vocaluxe/Base/CPlaylists.cs @@ -21,6 +21,19 @@ namespace Vocaluxe.Base get { return _Playlists.ToArray(); } } + public static string[] PlaylistNames + { + get + { + List names = new List(); + for (int i = 0; i < _Playlists.Count; i++) + { + names.Add(_Playlists[i].PlaylistName); + } + return names.ToArray(); + } + } + public static int NumPlaylists { get { return _Playlists.Count; } @@ -40,6 +53,7 @@ namespace Vocaluxe.Base foreach (string file in files) { CPlaylist playlist = new CPlaylist(file); + _Playlists.Add(playlist); } SortPlaylistsByName(); @@ -75,6 +89,21 @@ namespace Vocaluxe.Base } } + public static void SavePlaylist(int PlaylistID) + { + if (PlaylistID < 0 || PlaylistID >= _Playlists.Count) + return; + _Playlists[PlaylistID].SavePlaylist(); + } + + public static int NewPlaylist() + { + CPlaylist pl = new CPlaylist(); + pl.PlaylistName = "New Playlist"; + _Playlists.Add(pl); + return (_Playlists.Count - 1); + } + #endregion } } diff --git a/Vocaluxe/Lib/Playlist/CPlaylist.cs b/Vocaluxe/Lib/Playlist/CPlaylist.cs index a87ee61a..86e5e320 100644 --- a/Vocaluxe/Lib/Playlist/CPlaylist.cs +++ b/Vocaluxe/Lib/Playlist/CPlaylist.cs @@ -36,17 +36,19 @@ namespace Vocaluxe.Lib.Playlist public string PlaylistName; public string PlaylistFile; - public List Songs; + public List Songs = new List(); public CPlaylist() { Init(); + PlaylistName = string.Empty; + PlaylistFile = string.Empty; } public CPlaylist(string file) { Init(); - PlaylistName = file; + PlaylistFile = file; LoadPlaylist(); } @@ -58,29 +60,32 @@ namespace Vocaluxe.Lib.Playlist } - private void SavePlaylist() + public void SavePlaylist() { - string filename = string.Empty; - foreach (char chr in PlaylistName) + if (PlaylistFile == string.Empty) { - if (char.IsLetter(chr)) - filename += chr.ToString(); - } - - if (filename == String.Empty) - filename = "1"; - - int i = 0; - while (File.Exists(Path.Combine(CSettings.sFolderPlaylists, filename + ".xml"))) - { - i++; - if (!File.Exists(Path.Combine(CSettings.sFolderPlaylists, filename + i + ".xml"))) + string filename = string.Empty; + foreach (char chr in PlaylistName) { - filename += i; + if (char.IsLetter(chr)) + filename += chr.ToString(); } - } - PlaylistFile = Path.Combine(CSettings.sFolderPlaylists, filename + ".xml"); + if (filename == String.Empty) + filename = "1"; + + int i = 0; + while (File.Exists(Path.Combine(CSettings.sFolderPlaylists, filename + ".xml"))) + { + i++; + if (!File.Exists(Path.Combine(CSettings.sFolderPlaylists, filename + i + ".xml"))) + { + filename += i; + } + } + + PlaylistFile = Path.Combine(CSettings.sFolderPlaylists, filename + ".xml"); + } XmlWriter writer; try @@ -107,7 +112,7 @@ namespace Vocaluxe.Lib.Playlist writer.WriteEndElement(); writer.WriteStartElement("Songs"); - for (i = 0; i < Songs.Count; i++) + for (int i = 0; i < Songs.Count; i++) { CSong song = CSongs.GetSong(Songs[i].SongID); if (song != null) @@ -202,5 +207,26 @@ namespace Vocaluxe.Lib.Playlist } } } + + public void AddSong(int SongID) + { + CPlaylistSong song = new CPlaylistSong(); + song.SongID = SongID; + if (CSongs.GetSong(SongID).IsDuet) + song.GameMode = EGameMode.TR_GAMEMODE_DUET; + else + song.GameMode = EGameMode.TR_GAMEMODE_NORMAL; + + Songs.Add(song); + } + + public void AddSong(int SongID, EGameMode gm) + { + CPlaylistSong song = new CPlaylistSong(); + song.SongID = SongID; + song.GameMode = gm; + + Songs.Add(song); + } } } diff --git a/Vocaluxe/Lib/Song/CSong.cs b/Vocaluxe/Lib/Song/CSong.cs index 120efbf6..2cb63c36 100644 --- a/Vocaluxe/Lib/Song/CSong.cs +++ b/Vocaluxe/Lib/Song/CSong.cs @@ -7,6 +7,7 @@ using System.Text.RegularExpressions; using Vocaluxe.Base; using Vocaluxe.Lib.Draw; using Vocaluxe.Menu; +using Vocaluxe.GameModes; namespace Vocaluxe.Lib.Song { @@ -148,6 +149,23 @@ namespace Vocaluxe.Lib.Song // Notes public CNotes Notes = new CNotes(); + public EGameMode[] AvailableGameModes + { + get + { + List gms = new List(); + if (IsDuet) + gms.Add(EGameMode.TR_GAMEMODE_DUET); + else + gms.Add(EGameMode.TR_GAMEMODE_NORMAL); + if (Medley.Source != EMedleySource.None) + gms.Add(EGameMode.TR_GAMEMODE_MEDLEY); + gms.Add(EGameMode.TR_GAMEMODE_SHORTSONG); + + return gms.ToArray(); + } + } + public CSong() { } diff --git a/Vocaluxe/Menu/CInteraction.cs b/Vocaluxe/Menu/CInteraction.cs index 618bc051..8f7afe8d 100644 --- a/Vocaluxe/Menu/CInteraction.cs +++ b/Vocaluxe/Menu/CInteraction.cs @@ -14,7 +14,8 @@ namespace Vocaluxe.Menu TSongMenu, TLyric, TSingNote, - TNameSelection + TNameSelection, + TPlaylist } class CInteraction diff --git a/Vocaluxe/Menu/CMenu.cs b/Vocaluxe/Menu/CMenu.cs index 01432976..e27a7c51 100644 --- a/Vocaluxe/Menu/CMenu.cs +++ b/Vocaluxe/Menu/CMenu.cs @@ -36,6 +36,7 @@ namespace Vocaluxe.Menu private List _Lyrics; private List _SingNotes; private List _NameSelections; + private List _Playlists; private Hashtable _htBackgrounds; private Hashtable _htStatics; @@ -46,6 +47,7 @@ namespace Vocaluxe.Menu private Hashtable _htSelectSlides; private Hashtable _htSingNotes; private Hashtable _htNameSelections; + private Hashtable _htPlaylists; private int _PrevMouseX; @@ -67,6 +69,7 @@ namespace Vocaluxe.Menu protected string[] _ThemeSelectSlides; protected string[] _ThemeSingNotes; protected string[] _ThemeNameSelections; + protected string[] _ThemePlaylists; protected SRectF _ScreenArea; @@ -99,6 +102,7 @@ namespace Vocaluxe.Menu _Lyrics = new List(); _SingNotes = new List(); _NameSelections = new List(); + _Playlists = new List(); _htBackgrounds = new Hashtable(); _htStatics = new Hashtable(); @@ -109,6 +113,7 @@ namespace Vocaluxe.Menu _htSelectSlides = new Hashtable(); _htSingNotes = new Hashtable(); _htNameSelections = new Hashtable(); + _htPlaylists = new Hashtable(); _PrevMouseX = 0; _PrevMouseY = 0; @@ -129,6 +134,7 @@ namespace Vocaluxe.Menu _ThemeSelectSlides = null; _ThemeSingNotes = null; _ThemeNameSelections = null; + _ThemePlaylists = null; } #region ThemeHandler @@ -311,6 +317,22 @@ namespace Vocaluxe.Menu } } } + + if (_ThemePlaylists != null) + { + for (int i = 0; i < _ThemePlaylists.Length; i++) + { + CPlaylist pls = new CPlaylist(); + if (pls.LoadTheme("//root/" + _ThemeName, _ThemePlaylists[i], navigator, SkinIndex)) + { + _htPlaylists.Add(_ThemePlaylists[i], AddPlaylist(pls)); + } + else + { + CLog.LogError("Can't load Playlist \"" + _ThemePlaylists[i] + "\" in screen " + _ThemeName); + } + } + } } else { @@ -386,6 +408,12 @@ namespace Vocaluxe.Menu _NameSelections[i].SaveTheme(writer); } + //Playlists + for (int i = 0; i < _Playlists.Count; i++) + { + _Playlists[i].SaveTheme(writer); + } + writer.WriteEndElement(); // End of File @@ -442,6 +470,11 @@ namespace Vocaluxe.Menu { ns.ReloadTextures(); } + + foreach (CPlaylist pls in _Playlists) + { + pls.ReloadTextures(); + } } public virtual void UnloadTextures() @@ -490,7 +523,10 @@ namespace Vocaluxe.Menu { ns.UnloadTextures(); } - + foreach (CPlaylist pls in _Playlists) + { + pls.UnloadTextures(); + } } @@ -547,6 +583,11 @@ namespace Vocaluxe.Menu { return _NameSelections; } + + public List GetPlaylists() + { + return _Playlists; + } #endregion GetLists #region ElementHandler @@ -622,6 +663,14 @@ namespace Vocaluxe.Menu return _NameSelections.ToArray(); } } + + public CPlaylist[] Playlists + { + get + { + return _Playlists.ToArray(); + } + } #endregion Get Arrays #region Hashtables @@ -741,6 +790,19 @@ namespace Vocaluxe.Menu throw; } } + + public int htPlaylists(string key) + { + try + { + return (int)_htPlaylists[key]; + } + catch (Exception) + { + CLog.LogError("Can't find Playlist Element \"" + key + "\" in Screen " + _ThemeName); + throw; + } + } #endregion Hashtables #endregion ElementHandler @@ -999,7 +1061,8 @@ namespace Vocaluxe.Menu _Interactions[i].Type == EType.TStatic || _Interactions[i].Type == EType.TNameSelection || _Interactions[i].Type == EType.TText || - _Interactions[i].Type == EType.TSongMenu)) + _Interactions[i].Type == EType.TSongMenu || + _Interactions[i].Type == EType.TPlaylist)) { ZSort zs = new ZSort(); zs.ID = i; @@ -1085,6 +1148,13 @@ namespace Vocaluxe.Menu _AddInteraction(_NameSelections.Count - 1, EType.TNameSelection); return _NameSelections.Count - 1; } + + public int AddPlaylist(CPlaylist pls) + { + _Playlists.Add(pls); + _AddInteraction(_Playlists.Count - 1, EType.TPlaylist); + return _Playlists.Count - 1; + } #endregion Elements #region InteractionHandling @@ -1233,6 +1303,10 @@ namespace Vocaluxe.Menu if (CHelper.IsInBounds(_NameSelections[interact.Num].Rect, x, y)) return true; break; + case EType.TPlaylist: + if (CHelper.IsInBounds(_Playlists[interact.Num].Rect, x, y)) + return true; + break; } return false; } @@ -1255,6 +1329,8 @@ namespace Vocaluxe.Menu return _Lyrics[interact.Num].Rect.Z; case EType.TNameSelection: return _NameSelections[interact.Num].Rect.Z; + case EType.TPlaylist: + return _Playlists[interact.Num].Rect.Z; } return CSettings.zFar; } @@ -1283,6 +1359,9 @@ namespace Vocaluxe.Menu case EType.TNameSelection: return _NameSelections[_Interactions[interaction].Num].Rect.Z; + + case EType.TPlaylist: + return _Playlists[_Interactions[interaction].Num].Rect.Z; } return CSettings.zFar; @@ -1605,6 +1684,9 @@ namespace Vocaluxe.Menu case EType.TNameSelection: _NameSelections[_Interactions[_Selection].Num].Selected = true; break; + case EType.TPlaylist: + //_Playlists[_Interactions[_Selection].Num].Selected = true; + break; } } @@ -1633,6 +1715,9 @@ namespace Vocaluxe.Menu case EType.TNameSelection: _NameSelections[_Interactions[_Selection].Num].Selected = false; break; + case EType.TPlaylist: + //_Playlists[_Interactions[_Selection].Num].Selected = true; + break; } } @@ -1664,6 +1749,9 @@ namespace Vocaluxe.Menu case EType.TNameSelection: //_NameSelections[_Interactions[selection].Num].Selected = true; break; + case EType.TPlaylist: + //_Playlists[_Interactions[_Selection].Num].Selected = true; + break; } } @@ -1695,6 +1783,9 @@ namespace Vocaluxe.Menu case EType.TNameSelection: //_NameSelections[_Interactions[selection].Num].Selected = false; break; + case EType.TPlaylist: + //_Playlists[_Interactions[_Selection].Num].Selected = true; + break; } } @@ -1744,6 +1835,9 @@ namespace Vocaluxe.Menu case EType.TNameSelection: return _NameSelections[_Interactions[interaction].Num].Visible; + + case EType.TPlaylist: + return _Playlists[_Interactions[interaction].Num].Visible; } return false; @@ -1774,6 +1868,9 @@ namespace Vocaluxe.Menu case EType.TNameSelection: return _NameSelections[_Interactions[interaction].Num].Rect; + + case EType.TPlaylist: + return _Playlists[_Interactions[interaction].Num].Rect; } return Result; @@ -1815,6 +1912,10 @@ namespace Vocaluxe.Menu case EType.TNameSelection: _NameSelections[_Interactions[interaction].Num].Draw(); break; + + case EType.TPlaylist: + _Playlists[_Interactions[interaction].Num].Draw(); + break; //TODO: //case EType.TLyric: @@ -1859,6 +1960,10 @@ namespace Vocaluxe.Menu case EType.TNameSelection: _NameSelections[_Interactions[_Selection].Num].MoveElement(stepX, stepY); break; + + case EType.TPlaylist: + _Playlists[_Interactions[_Selection].Num].MoveElement(stepX, stepY); + break; } } } @@ -1896,6 +2001,10 @@ namespace Vocaluxe.Menu case EType.TNameSelection: _NameSelections[_Interactions[_Selection].Num].ResizeElement(stepW, stepH); break; + + case EType.TPlaylist: + _Playlists[_Interactions[_Selection].Num].ResizeElement(stepW, stepH); + break; } } } diff --git a/Vocaluxe/Menu/CSelectSlide.cs b/Vocaluxe/Menu/CSelectSlide.cs index 099ef2ea..126ec839 100644 --- a/Vocaluxe/Menu/CSelectSlide.cs +++ b/Vocaluxe/Menu/CSelectSlide.cs @@ -112,6 +112,14 @@ namespace Vocaluxe.Menu } } + public int NumValues + { + get + { + return _ValueNames.Count; + } + } + private int _NumVisible = -1; public int NumVisible { diff --git a/Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs b/Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs index e4730e8e..dc917994 100644 --- a/Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs +++ b/Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs @@ -383,10 +383,10 @@ namespace Vocaluxe.Menu.SongMenu writer.WriteElementString("SpaceH", _Theme.songMenuTileBoard.spaceH.ToString("#0.00")); writer.WriteComment(": Number of tiles horizontal in small-mode"); - writer.WriteElementString("NumW", _Theme.songMenuTileBoard.numW.ToString()); + writer.WriteElementString("NumWsmall", _Theme.songMenuTileBoard.numW.ToString()); writer.WriteComment(": Number of tiles vertical in small-mode"); - writer.WriteElementString("NumH", _Theme.songMenuTileBoard.numH.ToString()); + writer.WriteElementString("NumHsmall", _Theme.songMenuTileBoard.numH.ToString()); writer.WriteComment(", , , , : SongMenu position, width and height"); writer.WriteElementString("TileRectX", _Theme.songMenuTileBoard.TileRect.X.ToString("#0")); diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index e520d0ee..9b18ab2f 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -25,21 +25,31 @@ namespace Vocaluxe.Screens private const string TextSearchBarTitle = "TextSearchBarTitle"; private const string TextSearchBar = "TextSearchBar"; private const string TextOptionsTitle = "TextOptionsTitle"; + private const string TextPlaylistHeader = "TextPlaylistHeader"; private const string ButtonOptionsSing = "ButtonOptionsSing"; private const string ButtonOptionsPlaylist = "ButtonOptionsPlaylist"; private const string ButtonOptionsClose = "ButtonOptionsClose"; + private const string ButtonPlaylistClose = "ButtonPlaylistClose"; + private const string ButtonPlaylistSing = "ButtonPlaylistSing"; + private const string ButtonPlaylistSave = "ButtonPlaylistSave"; + private const string ButtonPlaylistDelete = "ButtonPlaylistDelete"; private const string SelectSlideOptionsMode = "SelectSlideOptionsMode"; + private const string SelectSlideOptionsPlaylist = "SelectSlideOptionsPlaylist"; private const string StaticSearchBar = "StaticSearchBar"; private const string StaticOptionsBG = "StaticOptionsBG"; + private const string StaticPlaylistHeader = "StaticPlaylistHeader"; + private const string StaticPlaylistFooter = "StaticPlaylistFooter"; private const string SongMenu = "SongMenu"; + private const string Playlist = "Playlist"; private string _SearchText = String.Empty; private bool _SearchActive = false; private bool _SongOptionsActive = false; + private int _OpenedPlaylist = -1; private List _AvailableGameModes; public CScreenSong() @@ -55,22 +65,32 @@ namespace Vocaluxe.Screens _ThemeName = "ScreenSong"; _ScreenVersion = ScreenVersion; - _ThemeStatics = new string[] { StaticSearchBar, StaticOptionsBG }; - _ThemeTexts = new string[] { TextCategory, TextSelection, TextSearchBarTitle, TextSearchBar, TextOptionsTitle }; - _ThemeButtons = new string[] { ButtonOptionsClose, ButtonOptionsPlaylist, ButtonOptionsSing }; - _ThemeSelectSlides = new string[] { SelectSlideOptionsMode }; + _ThemeStatics = new string[] { StaticSearchBar, StaticOptionsBG, StaticPlaylistHeader, StaticPlaylistFooter }; + _ThemeTexts = new string[] { TextCategory, TextSelection, TextSearchBarTitle, TextSearchBar, TextOptionsTitle, TextPlaylistHeader }; + _ThemeButtons = new string[] { ButtonOptionsClose, ButtonOptionsPlaylist, ButtonOptionsSing, ButtonPlaylistClose, ButtonPlaylistSing, ButtonPlaylistSave, ButtonPlaylistDelete }; + _ThemeSelectSlides = new string[] { SelectSlideOptionsMode, SelectSlideOptionsPlaylist }; _ThemeSongMenus = new string[] { SongMenu }; + _ThemePlaylists = new string[] { Playlist }; } public override void LoadTheme() { base.LoadTheme(); SelectSlides[htSelectSlides(SelectSlideOptionsMode)].Visible = false; + SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Visible = false; Buttons[htButtons(ButtonOptionsClose)].Visible = false; Buttons[htButtons(ButtonOptionsSing)].Visible = false; Buttons[htButtons(ButtonOptionsPlaylist)].Visible = false; + Buttons[htButtons(ButtonPlaylistClose)].Visible = false; + Buttons[htButtons(ButtonPlaylistSing)].Visible = false; + Buttons[htButtons(ButtonPlaylistSave)].Visible = false; + Buttons[htButtons(ButtonPlaylistDelete)].Visible = false; Texts[htTexts(TextOptionsTitle)].Visible = false; + Texts[htTexts(TextPlaylistHeader)].Visible = false; Statics[htStatics(StaticOptionsBG)].Visible = false; + Statics[htStatics(StaticPlaylistHeader)].Visible = false; + Statics[htStatics(StaticPlaylistFooter)].Visible = false; + Playlists[htPlaylists(Playlist)].Visible = false; } public override bool HandleInput(KeyEvent KeyEvent) @@ -185,14 +205,40 @@ namespace Vocaluxe.Screens { case Keys.Enter: if (Buttons[htButtons(ButtonOptionsClose)].Selected) + { ToggleSongOptions(); + } else if (Buttons[htButtons(ButtonOptionsSing)].Selected) { ToggleSongOptions(); StartSong(SongMenus[htSongMenus(SongMenu)].GetSelectedSong()); } else if (Buttons[htButtons(ButtonOptionsPlaylist)].Selected) + { + //Open a playlist and add song + if (_OpenedPlaylist != (SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Selection - 1)) + { + _OpenedPlaylist = SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Selection - 1; + if (_OpenedPlaylist < 0) + _OpenedPlaylist = CPlaylists.NewPlaylist(); + CPlaylists.Playlists[_OpenedPlaylist].AddSong(CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].ID); + OpenPlaylist(_OpenedPlaylist); + } + //Create a new playlist and add song + else if ((SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Selection - 1) == -1) + { + _OpenedPlaylist = CPlaylists.NewPlaylist(); + CPlaylists.Playlists[_OpenedPlaylist].AddSong(CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].ID); + OpenPlaylist(_OpenedPlaylist); + } + //Add song to loaded playlist + else + { + CPlaylists.Playlists[_OpenedPlaylist].AddSong(CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].ID); + Playlists[htPlaylists(Playlist)].UpdatePlaylist(); + } ToggleSongOptions(); + } break; case Keys.Escape: @@ -251,7 +297,31 @@ namespace Vocaluxe.Screens } else if (Buttons[htButtons(ButtonOptionsPlaylist)].Selected) { - SongMenus[htSongMenus(SongMenu)].SetSmallView(true); + //Open a playlist and add song + if (_OpenedPlaylist != (SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Selection - 1)) + { + _OpenedPlaylist = SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Selection - 1; + if (_OpenedPlaylist < 0) + _OpenedPlaylist = CPlaylists.NewPlaylist(); + CPlaylists.Playlists[_OpenedPlaylist].AddSong(CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].ID); + OpenPlaylist(_OpenedPlaylist); + } + //Create a new playlist and add song + else if ((SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Selection - 1) == -1) + { + _OpenedPlaylist = CPlaylists.NewPlaylist(); + CPlaylists.Playlists[_OpenedPlaylist].AddSong(CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].ID); + OpenPlaylist(_OpenedPlaylist); + UpdatePlaylistNames(); + SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Selection = SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].NumValues - 1; + } + //Add song to loaded playlist + else + { + CPlaylists.Playlists[_OpenedPlaylist].AddSong(CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].ID); + Playlists[htPlaylists(Playlist)].UpdatePlaylist(); + } + ToggleSongOptions(); } } if (MouseEvent.RB) @@ -260,6 +330,31 @@ namespace Vocaluxe.Screens } } + if (_OpenedPlaylist > -1) + { + if (MouseEvent.LB && IsMouseOver(MouseEvent)) + { + if (Buttons[htButtons(ButtonPlaylistClose)].Selected) + { + ClosePlaylist(); + } + else if (Buttons[htButtons(ButtonPlaylistSing)].Selected) + { + StartPlaylistSongs(); + } + else if (Buttons[htButtons(ButtonPlaylistSave)].Selected) + { + CPlaylists.SavePlaylist(_OpenedPlaylist); + } + else if (Buttons[htButtons(ButtonPlaylistDelete)].Selected) + { + CPlaylists.DeletePlaylist(_OpenedPlaylist); + ClosePlaylist(); + UpdatePlaylistNames(); + } + } + } + return true; } @@ -268,11 +363,16 @@ namespace Vocaluxe.Screens base.OnShow(); CGame.EnterNormalGame(); SongMenus[htSongMenus(SongMenu)].OnShow(); + Playlists[htPlaylists(Playlist)].Init(); + if(_OpenedPlaylist != -1) + Playlists[htPlaylists(Playlist)].LoadPlaylist(_OpenedPlaylist); + UpdatePlaylistNames(); } public override bool UpdateGame() { SongMenus[htSongMenus(SongMenu)].Update(); + Playlists[htPlaylists(Playlist)].Visible = SongMenus[htSongMenus(SongMenu)].IsSmallView(); Texts[htTexts(TextCategory)].Text = CSongs.GetActualCategoryName(); if (CSongs.Category > -1 || CConfig.Tabs == EOffOn.TR_CONFIG_OFF) @@ -368,6 +468,22 @@ namespace Vocaluxe.Screens } } + private void StartPlaylistSongs() + { + CGame.Reset(); + CGame.ClearSongs(); + + if (_OpenedPlaylist > -1 && _OpenedPlaylist < CPlaylists.NumPlaylists) + { + for (int i = 0; i < CPlaylists.Playlists[_OpenedPlaylist].Songs.Count; i++) + { + CGame.AddSong(CPlaylists.Playlists[_OpenedPlaylist].Songs[i].SongID, CPlaylists.Playlists[_OpenedPlaylist].Songs[i].GameMode); + } + if (CGame.GetNumSongs() > 0) + CGraphics.FadeTo(EScreens.ScreenNames); + } + } + private void StartRandomAllSongs() { CGame.Reset(); @@ -498,6 +614,7 @@ namespace Vocaluxe.Screens _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_MEDLEY); } SelectSlides[htSelectSlides(SelectSlideOptionsMode)].Visible = true; + SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Visible = true; Buttons[htButtons(ButtonOptionsClose)].Visible = true; Buttons[htButtons(ButtonOptionsSing)].Visible = true; Buttons[htButtons(ButtonOptionsPlaylist)].Visible = true; @@ -507,6 +624,7 @@ namespace Vocaluxe.Screens else { SelectSlides[htSelectSlides(SelectSlideOptionsMode)].Visible = false; + SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Visible = false; Buttons[htButtons(ButtonOptionsClose)].Visible = false; Buttons[htButtons(ButtonOptionsSing)].Visible = false; Buttons[htButtons(ButtonOptionsPlaylist)].Visible = false; @@ -514,5 +632,46 @@ namespace Vocaluxe.Screens Statics[htStatics(StaticOptionsBG)].Visible = false; } } + + private void OpenPlaylist(int PlaylistID) + { + if (CPlaylists.Playlists.Length > PlaylistID && PlaylistID > -1) + { + _OpenedPlaylist = PlaylistID; + Playlists[htPlaylists(Playlist)].LoadPlaylist(_OpenedPlaylist); + SongMenus[htSongMenus(SongMenu)].SetSmallView(true); + Playlists[htPlaylists(Playlist)].Visible = true; + Statics[htStatics(StaticPlaylistHeader)].Visible = true; + Statics[htStatics(StaticPlaylistFooter)].Visible = true; + Texts[htTexts(TextPlaylistHeader)].Visible = true; + Texts[htTexts(TextPlaylistHeader)].Text = CPlaylists.Playlists[PlaylistID].PlaylistName; + Buttons[htButtons(ButtonPlaylistClose)].Visible = true; + Buttons[htButtons(ButtonPlaylistSing)].Visible = true; + Buttons[htButtons(ButtonPlaylistSave)].Visible = true; + Buttons[htButtons(ButtonPlaylistDelete)].Visible = true; + } + } + + private void ClosePlaylist() + { + _OpenedPlaylist = -1; + SongMenus[htSongMenus(SongMenu)].SetSmallView(false); + Playlists[htPlaylists(Playlist)].Visible = false; + Statics[htStatics(StaticPlaylistHeader)].Visible = false; + Statics[htStatics(StaticPlaylistFooter)].Visible = false; + Texts[htTexts(TextPlaylistHeader)].Visible = false; + Texts[htTexts(TextPlaylistHeader)].Text = String.Empty; + Buttons[htButtons(ButtonPlaylistClose)].Visible = false; + Buttons[htButtons(ButtonPlaylistSing)].Visible = false; + Buttons[htButtons(ButtonPlaylistSave)].Visible = false; + Buttons[htButtons(ButtonPlaylistDelete)].Visible = false; + } + + private void UpdatePlaylistNames() + { + SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].Clear(); + SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].AddValue("TR_SCREENSONG_NEWPLAYLIST"); + SelectSlides[htSelectSlides(SelectSlideOptionsPlaylist)].AddValues(CPlaylists.PlaylistNames); + } } } diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index 3b9ff835..8c439bef 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -214,6 +214,7 @@ +