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);