Backward direction of autocomplete with Tab + Shift

This commit is contained in:
nkochnev 2022-08-12 09:10:42 +05:00 committed by Patrik Svensson
parent a60910c15f
commit 1082ac1efc

View File

@ -33,7 +33,10 @@ public static partial class AnsiConsoleExtensions
if (key.Key == ConsoleKey.Tab && autocomplete.Count > 0) if (key.Key == ConsoleKey.Tab && autocomplete.Count > 0)
{ {
var replace = AutoComplete(autocomplete, text); var autoCompleteDirection = key.Modifiers.HasFlag(ConsoleModifiers.Shift)
? AutoCompleteDirection.Backward
: AutoCompleteDirection.Forward;
var replace = AutoComplete(autocomplete, text, autoCompleteDirection);
if (!string.IsNullOrEmpty(replace)) if (!string.IsNullOrEmpty(replace))
{ {
// Render the suggestion // Render the suggestion
@ -63,7 +66,7 @@ public static partial class AnsiConsoleExtensions
} }
} }
private static string AutoComplete(List<string> autocomplete, string text) private static string AutoComplete(List<string> autocomplete, string text, AutoCompleteDirection autoCompleteDirection)
{ {
var found = autocomplete.Find(i => i == text); var found = autocomplete.Find(i => i == text);
var replace = string.Empty; var replace = string.Empty;
@ -85,15 +88,38 @@ public static partial class AnsiConsoleExtensions
else else
{ {
// Get the next match // Get the next match
var index = autocomplete.IndexOf(found) + 1; replace = GetAutocompleteValue(autoCompleteDirection, autocomplete, found);
}
return replace;
}
private static string GetAutocompleteValue(AutoCompleteDirection autoCompleteDirection, IList<string> autocomplete, string found)
{
var foundAutocompleteIndex = autocomplete.IndexOf(found);
var index = autoCompleteDirection switch
{
AutoCompleteDirection.Forward => foundAutocompleteIndex + 1,
AutoCompleteDirection.Backward => foundAutocompleteIndex - 1,
_ => throw new ArgumentOutOfRangeException(nameof(autoCompleteDirection), autoCompleteDirection, null),
};
if (index >= autocomplete.Count) if (index >= autocomplete.Count)
{ {
index = 0; index = 0;
} }
replace = autocomplete[index]; if (index < 0)
{
index = autocomplete.Count - 1;
} }
return replace; return autocomplete[index];
}
private enum AutoCompleteDirection
{
Forward,
Backward,
} }
} }