From fcf212df1282f0f9fba6054333b47847eaf4e3a9 Mon Sep 17 00:00:00 2001 From: Stefan Date: Wed, 8 Jan 2020 22:06:20 +0100 Subject: [PATCH 1/3] Allow selection with more letters by key press While in a song list in Vocaluxe, you can press a letter key to select the first entry starting with this letter. I prefer to be able to press multiple letters, maybe ABB to get the first ABBA entry selected. I did the change on my end. --- Vocaluxe/Screens/CScreenSong.cs | 46 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index 60031c4d..d3b4ef13 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.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 @@ -77,6 +77,9 @@ namespace Vocaluxe.Screens private string _SearchText = String.Empty; private bool _SearchActive; + private int _JumpTo_lastCharTime = 0; + private String _JumpTo_lastSearchString = ""; + private readonly List _ButtonsJoker = new List(); private readonly List _TextsPlayer = new List(); private ESongOptionsView _CurSongOptionsView; @@ -1042,6 +1045,13 @@ namespace Vocaluxe.Screens private void _JumpTo(char letter) { + // Stefan1200: Add all letters from a key press within one second to a search string. Clear search string, if last key press is older than one second. + String searchString; + if (Environment.TickCount - _JumpTo_lastCharTime < 1000) + searchString = _JumpTo_lastSearchString + letter.ToString(); + else + searchString = letter.ToString(); + int start = 0; int curSelected = CSongs.IsInCategory ? _SongMenu.GetSelectedSongNr() : _SongMenu.GetSelectedCategory(); bool firstLevel = CConfig.Config.Game.Tabs == EOffOn.TR_CONFIG_OFF && CSongs.IsInCategory; @@ -1061,28 +1071,20 @@ namespace Vocaluxe.Screens { case ESongSorting.TR_CONFIG_ARTIST: case ESongSorting.TR_CONFIG_ARTIST_LETTER: - if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Artist.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)) - start = curSelected + 1; - visibleID = _FindIndex(songs, start, element => element.Artist.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)); + visibleID = _FindIndex(songs, start, element => element.Artist.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)); break; case ESongSorting.TR_CONFIG_YEAR: case ESongSorting.TR_CONFIG_DECADE: - if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Year.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)) - start = curSelected + 1; - visibleID = _FindIndex(songs, start, element => element.Year.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)); + visibleID = _FindIndex(songs, start, element => element.Year.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)); break; case ESongSorting.TR_CONFIG_TITLE_LETTER: - if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Title.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)) - start = curSelected + 1; - visibleID = _FindIndex(songs, start, element => element.Title.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)); + visibleID = _FindIndex(songs, start, element => element.Title.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)); break; case ESongSorting.TR_CONFIG_FOLDER: - if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Folder.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)) - start = curSelected + 1; - visibleID = _FindIndex(songs, start, element => element.Folder.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)); + visibleID = _FindIndex(songs, start, element => element.Folder.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)); break; } if (visibleID > -1) @@ -1097,16 +1099,12 @@ namespace Vocaluxe.Screens { case ESongSorting.TR_CONFIG_FOLDER: case ESongSorting.TR_CONFIG_TITLE_LETTER: - if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Artist.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)) - start = curSelected + 1; - visibleID = _FindIndex(songs, start, element => element.Artist.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)); + visibleID = _FindIndex(songs, start, element => element.Artist.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)); break; case ESongSorting.TR_CONFIG_ARTIST: case ESongSorting.TR_CONFIG_ARTIST_LETTER: - if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Title.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)) - start = curSelected + 1; - visibleID = _FindIndex(songs, start, element => element.Title.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)); + visibleID = _FindIndex(songs, start, element => element.Title.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)); break; } if (visibleID > -1) @@ -1116,12 +1114,14 @@ namespace Vocaluxe.Screens { ReadOnlyCollection categories = CSongs.Categories; int ct = categories.Count; - if (curSelected >= 0 && curSelected < ct - 1 && categories[curSelected].Name.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)) - start = curSelected + 1; - int visibleID = _FindIndex(categories, start, element => element.Name.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase)); + int visibleID = _FindIndex(categories, start, element => element.Name.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)); if (visibleID > -1) _SongMenu.SetSelectedCategory(visibleID); } + + // Stefan1200: Remember search string and current TickCount in class variables. + _JumpTo_lastCharTime = Environment.TickCount; + _JumpTo_lastSearchString = searchString; } private void _ApplyNewSearchFilter(string newFilterString) @@ -1395,4 +1395,4 @@ namespace Vocaluxe.Screens } #endregion Playlist Actions } -} \ No newline at end of file +} From a1e43aa1ce7a2c321136cfdd7982d387dda66dab Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 11 Jan 2020 16:17:28 +0100 Subject: [PATCH 2/3] Scroll the new selected song to the middle of the screen Updated _UpdateList() to scroll the song list, that the new selected song is in the middle of the screen. --- VocaluxeLib/Menu/SongMenu/CSongMenuList.cs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs index 2c85058a..89a43849 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuList.cs @@ -592,13 +592,28 @@ namespace VocaluxeLib.Menu.SongMenu private void _UpdateList(bool force = false) { + bool isInCategory = CBase.Songs.IsInCategory(); + int itemCount = isInCategory ? CBase.Songs.GetNumSongsVisible() : CBase.Songs.GetNumCategories(); + int halfListLength = _ListLength / 2; int offset; + if (_SelectionNr < _Offset && _SelectionNr >= 0) - offset = _SelectionNr; + { + if (_SelectionNr - halfListLength >= 0) + offset = _SelectionNr - halfListLength; + else + offset = 0; + } else if (_SelectionNr >= _Offset + _ListLength) - offset = _SelectionNr - _ListLength + 1; + { + if (_SelectionNr + halfListLength > itemCount) + offset = itemCount - _ListLength; + else + offset = _SelectionNr - halfListLength; + } else offset = _Offset; + _UpdateList(offset, force); } @@ -653,4 +668,4 @@ namespace VocaluxeLib.Menu.SongMenu base.LoadSkin(); } } -} \ No newline at end of file +} From a26d3aae2aa81a1345cb4d6bf9a6a3603ad75892 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 12 Jan 2020 15:13:54 +0100 Subject: [PATCH 3/3] Removed unused code lines --- Vocaluxe/Screens/CScreenSong.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index beb6a19d..f4aed971 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -1066,7 +1066,6 @@ namespace Vocaluxe.Screens searchString = letter.ToString(); int start = 0; - int curSelected = CSongs.IsInCategory ? _SongMenu.GetSelectedSongNr() : _SongMenu.GetSelectedCategory(); bool firstLevel = CConfig.Config.Game.Tabs == EOffOn.TR_CONFIG_OFF && CSongs.IsInCategory; bool secondSort = CConfig.Config.Game.Tabs == EOffOn.TR_CONFIG_ON && (CConfig.Config.Game.SongSorting == ESongSorting.TR_CONFIG_ARTIST || @@ -1078,7 +1077,6 @@ namespace Vocaluxe.Screens //TODO: What's to do with multiple tags? //Flamefire: What? We only sorted by one tag, sorting by multiple tags (e.g. Album) will be by e.g. the first entry. That can be used here too as otherwhise it will confuse users because it jumps randomly ReadOnlyCollection songs = CSongs.VisibleSongs; - int ct = songs.Count; int visibleID = -1; switch (CConfig.Config.Game.SongSorting) { @@ -1106,7 +1104,6 @@ namespace Vocaluxe.Screens else if (secondSort && CSongs.IsInCategory) { ReadOnlyCollection songs = CSongs.VisibleSongs; - int ct = songs.Count; int visibleID = -1; switch (CConfig.Config.Game.SongSorting) { @@ -1126,7 +1123,6 @@ namespace Vocaluxe.Screens else if (!CSongs.IsInCategory) { ReadOnlyCollection categories = CSongs.Categories; - int ct = categories.Count; int visibleID = _FindIndex(categories, start, element => element.Name.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)); if (visibleID > -1) _SongMenu.SetSelectedCategory(visibleID);