From 6deb5acbc860bf2f0a485560e12c16ec91a544cb Mon Sep 17 00:00:00 2001 From: Edi316 <61267443+Edi316@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:26:23 +0200 Subject: [PATCH] Remember selected position for each folder/tab (#859) * Remember Last Tab Position * Remember Last Tab Position * Remember Last Tab Position * Remember Last Tab Position * Remember Last Tab Position --- Vocaluxe/Screens/CScreenSong.cs | 51 +++++++++++++++++-- .../Menu/SongMenu/CSongMenuFramework.cs | 13 +++-- VocaluxeLib/Menu/SongMenu/CSongMenuList.cs | 8 ++- .../Menu/SongMenu/CSongMenuTileBoard.cs | 8 ++- 4 files changed, 64 insertions(+), 16 deletions(-) diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index 117970d1..666bd655 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -125,6 +125,18 @@ namespace Vocaluxe.Screens return _PlayerSelect; } + private static int _StaticSelectedCategoryIndex = -1; + + private static void SetStaticSelectedCategoryIndex(int categoryIndex) + { + _StaticSelectedCategoryIndex = categoryIndex; + } + + private static int GetStaticSelectedCategoryIndex() + { + return _StaticSelectedCategoryIndex; + } + private static int _StaticSelectedSongID; private static void setStaticSelectedSongID(int songID) @@ -769,6 +781,7 @@ namespace Vocaluxe.Screens else if (_Sso.Selection.CategoryChangeAllowed) { _ToggleSongOptions(ESongOptionsView.None); + _SelectedCategoryIndex = _SongMenu.GetSelectedCategory(); _SongMenu.EnterSelectedCategory(); } } @@ -790,9 +803,9 @@ namespace Vocaluxe.Screens _SongMenu.SetSelectedCategory(_SelectedCategoryIndex); _SongMenu.EnterSelectedCategory(); } - else + else if (CBase.Songs.IsInCategory()) { - _SongMenu.LeaveSelectedCategory(); + CBase.Songs.SetCategory(-1); } } _SearchActive = _Sso.Sorting.SearchActive; @@ -801,6 +814,32 @@ namespace Vocaluxe.Screens CGame.Reset(); _SongMenu.OnShow(); + if (_Sso.Sorting.Tabs == EOffOn.TR_CONFIG_ON) + { + int lastCategoryIndex = GetStaticSelectedCategoryIndex(); + + if (CBase.Songs.IsInCategory()) + CBase.Songs.SetCategory(-1); + + _SongMenu.OnShow(); + + if (lastCategoryIndex >= 0 && lastCategoryIndex < CSongs.Categories.Count) + _SongMenu.SetSelectedCategory(lastCategoryIndex); + } + + int lastSongId = getSelectedSongID(); + if (CSongs.IsInCategory && lastSongId >= 0) + { + for (int i = 0; i < CSongs.VisibleSongs.Count; i++) + { + if (CSongs.VisibleSongs[i].ID == lastSongId) + { + _SongMenu.SetSelectedSong(i); + break; + } + } + } + if (_Sso.Selection.PartyMode) { _ClosePlaylist(); @@ -1049,6 +1088,9 @@ namespace Vocaluxe.Screens { if (CSongs.IsInCategory && (songNr >= 0)) { + SetStaticSelectedCategoryIndex(CBase.Songs.GetCurrentCategoryIndex()); + setStaticSelectedSongID(CSongs.VisibleSongs[songNr].ID); + EGameMode gm; if (_AvailableGameModes.Count >= _SelectSlides[_SelectSlideOptionsMode].Selection) gm = _AvailableGameModes[_SelectSlides[_SelectSlideOptionsMode].Selection]; @@ -1077,7 +1119,10 @@ namespace Vocaluxe.Screens { if (CSongs.IsInCategory && songNr >= 0 && CSongs.NumSongsVisible > songNr) { - EGameMode gm = CSongs.VisibleSongs[songNr].IsDuet ? EGameMode.TR_GAMEMODE_DUET : EGameMode.TR_GAMEMODE_NORMAL; + SetStaticSelectedCategoryIndex(CBase.Songs.GetCurrentCategoryIndex()); + setStaticSelectedSongID(CSongs.VisibleSongs[songNr].ID); + + EGameMode gm = CSongs.VisibleSongs[songNr].IsDuet ? EGameMode.TR_GAMEMODE_DUET : EGameMode.TR_GAMEMODE_NORMAL; CGame.Reset(); CGame.ClearSongs(); diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs index 7daa889d..f25f5c30 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs @@ -299,9 +299,16 @@ namespace VocaluxeLib.Menu.SongMenu public void LeaveSelectedCategory() { - // Stefan1200: This was implemented with the pull request #359 and is the reason for the bug described in issue #390. - // Currently disabled until we know if this is still needed or we find a better solution! - // _LeaveCategory(); + if (!CBase.Songs.IsInCategory()) + return; + + int oldCategory = CBase.Songs.GetCurrentCategoryIndex(); + _LeaveCategory(); + + if (oldCategory >= 0 && oldCategory < CBase.Songs.GetNumCategories()) + SetSelectedCategory(oldCategory); + else if (CBase.Songs.GetNumCategories() > 0) + SetSelectedCategory(0); } public virtual void UnloadSkin() {} diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs index 6072f7d7..eb832e2e 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs @@ -1,4 +1,4 @@ -#region license +#region license // This file is part of Vocaluxe. // // Vocaluxe is free software: you can redistribute it and/or modify @@ -358,7 +358,7 @@ namespace VocaluxeLib.Menu.SongMenu case Keys.Back: if (CBase.Songs.IsInCategory() && catChangePossible) { - _LeaveCategory(); + LeaveSelectedCategory(); keyEvent.Handled = true; } break; @@ -510,7 +510,7 @@ namespace VocaluxeLib.Menu.SongMenu if (CBase.Songs.IsInCategory() && CBase.Songs.GetNumCategories() > 0 && CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && songOptions.Selection.CategoryChangeAllowed) { - _LeaveCategory(); + LeaveSelectedCategory(); return true; } if (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_OFF && !songOptions.Selection.PartyMode) @@ -611,8 +611,6 @@ namespace VocaluxeLib.Menu.SongMenu protected override void _LeaveCategory() { base._LeaveCategory(); - - SetSelectedCategory(0); _UpdateListIfRequired(); } diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs index 0d54ce25..d94e6d7c 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs @@ -1,4 +1,4 @@ -#region license +#region license // This file is part of Vocaluxe. // // Vocaluxe is free software: you can redistribute it and/or modify @@ -349,7 +349,7 @@ namespace VocaluxeLib.Menu.SongMenu case Keys.Back: if (CBase.Songs.IsInCategory() && catChangePossible) { - _LeaveCategory(); + LeaveSelectedCategory(); keyEvent.Handled = true; } break; @@ -499,7 +499,7 @@ namespace VocaluxeLib.Menu.SongMenu if (CBase.Songs.IsInCategory() && CBase.Songs.GetNumCategories() > 0 && CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && songOptions.Selection.CategoryChangeAllowed) { - _LeaveCategory(); + LeaveSelectedCategory(); return true; } if (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_OFF && !songOptions.Selection.PartyMode) @@ -576,8 +576,6 @@ namespace VocaluxeLib.Menu.SongMenu protected override void _LeaveCategory() { base._LeaveCategory(); - - SetSelectedCategory(0); _UpdateListIfRequired(); }