diff --git a/Output/Themes/Ambient/Close.png b/Output/Themes/Ambient/Close.png new file mode 100644 index 00000000..b8b8a994 Binary files /dev/null and b/Output/Themes/Ambient/Close.png differ diff --git a/Output/Themes/Ambient/Delete.png b/Output/Themes/Ambient/Delete.png new file mode 100644 index 00000000..46a686ad Binary files /dev/null and b/Output/Themes/Ambient/Delete.png differ diff --git a/Output/Themes/Ambient/Save.png b/Output/Themes/Ambient/Save.png new file mode 100644 index 00000000..1afc3113 Binary files /dev/null and b/Output/Themes/Ambient/Save.png differ 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 00000000..c7daf961 Binary files /dev/null and b/Output/Themes/Ambient/Sing.png differ 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 @@ +