diff --git a/Vocaluxe/Menu/CInteraction.cs b/Vocaluxe/Menu/CInteraction.cs index 03e0eb64..a95e450b 100644 --- a/Vocaluxe/Menu/CInteraction.cs +++ b/Vocaluxe/Menu/CInteraction.cs @@ -45,7 +45,8 @@ namespace Vocaluxe.Menu _Type == EType.TSongMenu || _Type == EType.TLyric || _Type == EType.TSingNote || - _Type == EType.TEqualizer); + _Type == EType.TEqualizer || + _Type == EType.TPlaylist); } } diff --git a/Vocaluxe/Menu/CMenu.cs b/Vocaluxe/Menu/CMenu.cs index 2f70b117..ffbd6281 100644 --- a/Vocaluxe/Menu/CMenu.cs +++ b/Vocaluxe/Menu/CMenu.cs @@ -878,22 +878,24 @@ namespace Vocaluxe.Menu if (KeyEvent.Key == Keys.Left) { if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != Modifier.Shift) - PrevElement(); - else - _NextInteraction(KeyEvent); + KeyEvent.Handled = PrevElement(); + + if (!KeyEvent.Handled) + KeyEvent.Handled = _NextInteraction(KeyEvent); } if (KeyEvent.Key == Keys.Right) { if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != Modifier.Shift) - NextElement(); - else - _NextInteraction(KeyEvent); + KeyEvent.Handled = NextElement(); + + if (!KeyEvent.Handled) + KeyEvent.Handled = _NextInteraction(KeyEvent); } if (KeyEvent.Key == Keys.Up || KeyEvent.Key == Keys.Down) { - _NextInteraction(KeyEvent); + KeyEvent.Handled = _NextInteraction(KeyEvent); } } else @@ -1242,16 +1244,28 @@ namespace Vocaluxe.Menu _PrevInteraction(); } - public void NextElement() + /// + /// Selects the next element in a menu interaction. + /// + /// True if the next element is selected. False if either there is no next element or the interaction does not provide such a method. + public bool NextElement() { if (_Interactions.Count > 0) - _NextElement(); + return _NextElement(); + + return false; } - public void PrevElement() + /// + /// Selects the previous element in a menu interaction. + /// + /// True if the previous element is selected. False if either there is no next element or the interaction does not provide such a method. + public bool PrevElement() { if (_Interactions.Count > 0) - _PrevElement(); + return _PrevElement(); + + return false; } public bool SetInteractionToButton(CButton button) @@ -1502,7 +1516,12 @@ namespace Vocaluxe.Menu _SetSelected(); } - private void _NextInteraction(KeyEvent Key) + /// + /// Selects the next best interaction in a menu. + /// + /// + /// + private bool _NextInteraction(KeyEvent Key) { KeyEvent[] Directions = new KeyEvent[4]; float[] Distances = new float[4]; @@ -1568,8 +1587,11 @@ namespace Vocaluxe.Menu _Selection = element; _SetSelected(); _SetHighlighted(_Selection); + + return true; } } + return false; } private int _GetNextElement(KeyEvent Key, out float Distance, out int Stage) @@ -1728,16 +1750,30 @@ namespace Vocaluxe.Menu return distance; } - private void _NextElement() + /// + /// Selects the next element in a menu interaction. + /// + /// True if the next element is selected. False if either there is no next element or the interaction does not provide such a method. + private bool _NextElement() { if (_Interactions[_Selection].Type == EType.TSelectSlide) - _SelectSlides[_Interactions[_Selection].Num].NextValue(); + return _SelectSlides[_Interactions[_Selection].Num].NextValue(); + + return false; } - private void _PrevElement() + /// + /// Selects the previous element in a menu interaction. + /// + /// + /// True if the previous element is selected. False if either there is no previous element or the interaction does not provide such a method. + /// + private bool _PrevElement() { if (_Interactions[_Selection].Type == EType.TSelectSlide) - _SelectSlides[_Interactions[_Selection].Num].PrevValue(); + return _SelectSlides[_Interactions[_Selection].Num].PrevValue(); + + return false; } private void _SetSelected() diff --git a/Vocaluxe/Menu/CPlaylist.cs b/Vocaluxe/Menu/CPlaylist.cs index f64a5ddf..9d3fd36a 100644 --- a/Vocaluxe/Menu/CPlaylist.cs +++ b/Vocaluxe/Menu/CPlaylist.cs @@ -77,7 +77,21 @@ namespace Vocaluxe.Menu public SColorF BackgroundSColor; public bool Visible; - public bool Selected; + + private bool _Selected; + public bool Selected + { + get { return _Selected; } + set + { + _Selected = value; + if (CurrentPlaylistElement == -1 && _Selected) + { + CurrentPlaylistElement = 0; + ActiveHover = CurrentPlaylistElement; + } + } + } public bool changeOrder = false; public int ActivePlaylistID = -1; @@ -266,7 +280,7 @@ namespace Vocaluxe.Menu for (int i = 0; i < PlaylistElements.Count; i++ ) { - if (i == ActiveHover) + if (i == ActiveHover && _Selected) { PlaylistElements[i].Background.Texture = CTheme.GetSkinTexture(_Theme.STextureBackgroundName); PlaylistElements[i].Background.Color = BackgroundSColor; @@ -484,7 +498,7 @@ namespace Vocaluxe.Menu for (int i = 0; i < PlaylistElements.Count; i++) { //Hover for playlist-element - if (CHelper.IsInBounds(PlaylistElements[i].Background.Rect, mevent)) + if (PlaylistElementContents.Count - 1 >= i && CHelper.IsInBounds(PlaylistElements[i].Background.Rect, mevent)) { PlaylistElements[i].Background.Texture = CTheme.GetSkinTexture(_Theme.STextureBackgroundName); PlaylistElements[i].Background.Color = BackgroundSColor; @@ -638,7 +652,6 @@ namespace Vocaluxe.Menu } } - private void ClosePlaylist() { Visible = false; diff --git a/Vocaluxe/Menu/SongMenu/CSongMenu.cs b/Vocaluxe/Menu/SongMenu/CSongMenu.cs index 57ef11b6..48fdf61f 100644 --- a/Vocaluxe/Menu/SongMenu/CSongMenu.cs +++ b/Vocaluxe/Menu/SongMenu/CSongMenu.cs @@ -73,6 +73,16 @@ namespace Vocaluxe.Menu.SongMenu _SongMenu.Draw(); } + public bool IsActive() + { + return _SongMenu.IsActive(); + } + + public void SetActive(bool Active) + { + _SongMenu.SetActive(Active); + } + public int GetSelectedSong() { return _SongMenu.GetSelectedSong(); diff --git a/Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs b/Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs index dc917994..b32037ee 100644 --- a/Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs +++ b/Vocaluxe/Menu/SongMenu/CSongMenuFramework.cs @@ -115,6 +115,7 @@ namespace Vocaluxe.Menu.SongMenu protected long _PendingTime = 500L; private int _LockedInternal = -1; + protected bool _Active = false; protected int _PreviewSelected //for preview only { @@ -217,6 +218,7 @@ namespace Vocaluxe.Menu.SongMenu public void SetSelected(bool Selected) { _Selected = Selected; + SetActive(Selected); } public bool IsVisible() @@ -516,6 +518,16 @@ namespace Vocaluxe.Menu.SongMenu } + public virtual bool IsActive() + { + return _Active; + } + + public virtual void SetActive(bool Active) + { + _Active = Active; + } + public virtual int GetSelectedSong() { return -1; diff --git a/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs b/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs index cb000ad1..9dafa1bb 100644 --- a/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs +++ b/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs @@ -148,6 +148,11 @@ namespace Vocaluxe.Menu.SongMenu } else { + if (!(KeyEvent.Key == Keys.Left || KeyEvent.Key == Keys.Right || KeyEvent.Key == Keys.Up || KeyEvent.Key == Keys.Down || + KeyEvent.Key == Keys.Escape || KeyEvent.Key == Keys.Back || KeyEvent.Key == Keys.Enter || + KeyEvent.Key == Keys.PageDown || KeyEvent.Key == Keys.PageUp)) + return; + bool sel = false; foreach (CStatic tile in _Tiles) { @@ -400,7 +405,7 @@ namespace Vocaluxe.Menu.SongMenu { foreach (CStatic tile in _Tiles) { - if (tile.Selected) + if (tile.Selected && _Active) tile.Draw(1.2f, tile.Rect.Z - 0.1f, true, false); else { diff --git a/Vocaluxe/Menu/SongMenu/ISongMenu.cs b/Vocaluxe/Menu/SongMenu/ISongMenu.cs index a7e20542..a859e84b 100644 --- a/Vocaluxe/Menu/SongMenu/ISongMenu.cs +++ b/Vocaluxe/Menu/SongMenu/ISongMenu.cs @@ -20,6 +20,9 @@ namespace Vocaluxe.Menu.SongMenu int GetSelectedSong(); void SetSelectedSong(int VisibleSongNr); + bool IsActive(); + void SetActive(bool Active); + int GetSelectedCategory(); int GetActualSelection(); diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index a8c0481c..83988d94 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -42,6 +42,7 @@ namespace Vocaluxe.Screens private bool _SearchActive = false; private bool _SongOptionsActive = false; + private bool _PlaylistActive = false; private List _AvailableGameModes; public CScreenSong() @@ -80,14 +81,24 @@ namespace Vocaluxe.Screens public override bool HandleInput(KeyEvent KeyEvent) { - KeyEvent.Handled = Playlists[htPlaylists(Playlist)].HandleInput(KeyEvent); - if (KeyEvent.Handled) - return true; - base.HandleInput(KeyEvent); if (KeyEvent.Handled) return true; + if (_PlaylistActive) + { + if (!KeyEvent.KeyPressed && KeyEvent.Key == Keys.Tab) + { + _PlaylistActive = !_PlaylistActive; + Playlists[htPlaylists(Playlist)].Selected = _PlaylistActive; + SongMenus[htSongMenus(SongMenu)].SetActive(!_PlaylistActive); + return true; + } + + Playlists[htPlaylists(Playlist)].HandleInput(KeyEvent); + return true; + } + if (!_SongOptionsActive) { if (KeyEvent.KeyPressed && !Char.IsControl(KeyEvent.Unicode)) @@ -104,7 +115,6 @@ namespace Vocaluxe.Screens else { SongMenus[htSongMenus(SongMenu)].HandleInput(ref KeyEvent); - if (KeyEvent.Handled) return true; @@ -123,6 +133,15 @@ namespace Vocaluxe.Screens } break; + case Keys.Tab: + if (Playlists[htPlaylists(Playlist)].Visible) + { + _PlaylistActive = !_PlaylistActive; + Playlists[htPlaylists(Playlist)].Selected = _PlaylistActive; + SongMenus[htSongMenus(SongMenu)].SetActive(!_PlaylistActive); + } + break; + case Keys.Back: if (_SearchText.Length > 0) { @@ -147,6 +166,7 @@ namespace Vocaluxe.Screens } break; + //TODO: Move that to the new menu and delete it! case Keys.A: if (!_SearchActive && KeyEvent.Mod == Modifier.None) { @@ -158,6 +178,7 @@ namespace Vocaluxe.Screens } break; + //TODO: Delete that from here and from wiki! case Keys.F: if (KeyEvent.Mod == Modifier.Ctrl) { @@ -174,6 +195,7 @@ namespace Vocaluxe.Screens } break; + //TODO: We need another key for random! case Keys.R: if (CSongs.Category != -1 && KeyEvent.Mod == Modifier.Ctrl) { @@ -181,6 +203,7 @@ namespace Vocaluxe.Screens } break; + //TODO: Delete that! case Keys.S: if (CSongs.NumVisibleSongs > 0) StartMedleySong(SongMenus[htSongMenus(SongMenu)].GetSelectedSong()); @@ -246,11 +269,22 @@ namespace Vocaluxe.Screens { base.HandleMouse(MouseEvent); - if (Playlists[htPlaylists(Playlist)].HandleMouse(MouseEvent)) + if (CHelper.IsInBounds(Playlists[htPlaylists(Playlist)].Rect, MouseEvent.X, MouseEvent.Y)) { - return true; + _PlaylistActive = true; + Playlists[htPlaylists(Playlist)].Selected = _PlaylistActive; + SongMenus[htSongMenus(SongMenu)].SetActive(!_PlaylistActive); + } + else if (CHelper.IsInBounds(SongMenus[htSongMenus(SongMenu)].Rect, MouseEvent.X, MouseEvent.Y)) + { + _PlaylistActive = false; + Playlists[htPlaylists(Playlist)].Selected = _PlaylistActive; + SongMenus[htSongMenus(SongMenu)].SetActive(!_PlaylistActive); } + if (Playlists[htPlaylists(Playlist)].HandleMouse(MouseEvent)) + return true; + if (!_SongOptionsActive) { @@ -333,6 +367,7 @@ namespace Vocaluxe.Screens base.OnShow(); CGame.EnterNormalGame(); SongMenus[htSongMenus(SongMenu)].OnShow(); + SongMenus[htSongMenus(SongMenu)].SetActive(!_PlaylistActive); Playlists[htPlaylists(Playlist)].Init(); if (Playlists[htPlaylists(Playlist)].ActivePlaylistID != -1) Playlists[htPlaylists(Playlist)].LoadPlaylist(Playlists[htPlaylists(Playlist)].ActivePlaylistID);