From 1082ac1efc7407c0c40d546afe44d9785bc6b8e2 Mon Sep 17 00:00:00 2001 From: nkochnev Date: Fri, 12 Aug 2022 09:10:42 +0500 Subject: [PATCH] Backward direction of autocomplete with Tab + Shift --- .../Extensions/AnsiConsoleExtensions.Input.cs | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs index 30c493e..c56e060 100644 --- a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs +++ b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs @@ -33,7 +33,10 @@ public static partial class AnsiConsoleExtensions 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)) { // Render the suggestion @@ -63,7 +66,7 @@ public static partial class AnsiConsoleExtensions } } - private static string AutoComplete(List autocomplete, string text) + private static string AutoComplete(List autocomplete, string text, AutoCompleteDirection autoCompleteDirection) { var found = autocomplete.Find(i => i == text); var replace = string.Empty; @@ -85,15 +88,38 @@ public static partial class AnsiConsoleExtensions else { // Get the next match - var index = autocomplete.IndexOf(found) + 1; - if (index >= autocomplete.Count) - { - index = 0; - } - - replace = autocomplete[index]; + replace = GetAutocompleteValue(autoCompleteDirection, autocomplete, found); } return replace; } + + private static string GetAutocompleteValue(AutoCompleteDirection autoCompleteDirection, IList 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) + { + index = 0; + } + + if (index < 0) + { + index = autocomplete.Count - 1; + } + + return autocomplete[index]; + } + + private enum AutoCompleteDirection + { + Forward, + Backward, + } } \ No newline at end of file