diff --git a/Terminal.Gui/Views/ListView.cs b/Terminal.Gui/Views/ListView.cs index 6997ce5ce..67d0e88c4 100644 --- a/Terminal.Gui/Views/ListView.cs +++ b/Terminal.Gui/Views/ListView.cs @@ -430,7 +430,7 @@ namespace Terminal.Gui { var newItem = KeystrokeNavigator?.GetNextMatchingItem (SelectedItem, (char)kb.KeyValue); if (newItem is int && newItem != -1) { SelectedItem = (int)newItem; - EnsuresVisibilitySelectedItem (); + EnsureSelectedItemVisible (); SetNeedsDisplay (); return true; } @@ -727,7 +727,7 @@ namespace Terminal.Gui { Application.Driver.SetCursorVisibility (CursorVisibility.Invisible); if (lastSelectedItem == -1) { - EnsuresVisibilitySelectedItem (); + EnsureSelectedItemVisible (); } return base.OnEnter (view); @@ -743,7 +743,10 @@ namespace Terminal.Gui { return base.OnLeave (view); } - void EnsuresVisibilitySelectedItem () + /// + /// Ensures the selected item is always visible on the screen. + /// + public void EnsureSelectedItemVisible () { SuperView?.LayoutSubviews (); if (selected < top) { @@ -840,7 +843,7 @@ namespace Terminal.Gui { if (src == null || src?.Count == 0) { return 0; } - + int maxLength = 0; for (int i = 0; i < src.Count; i++) { var t = src [i]; @@ -924,7 +927,7 @@ namespace Terminal.Gui { return i; } } else if (t is string s) { - if (s.ToUpperInvariant ().StartsWith (search.ToUpperInvariant ())) { + if (s.StartsWith (search, StringComparison.InvariantCultureIgnoreCase)) { return i; } } diff --git a/UnitTests/Views/ListViewTests.cs b/UnitTests/Views/ListViewTests.cs index 171e30286..01e784810 100644 --- a/UnitTests/Views/ListViewTests.cs +++ b/UnitTests/Views/ListViewTests.cs @@ -203,7 +203,7 @@ namespace Terminal.Gui.ViewTests { [Fact] [AutoInitShutdown] - public void EnsuresVisibilitySelectedItem_Top () + public void EnsureSelectedItemVisible_Top () { var source = new List () { "First", "Second" }; ListView lv = new ListView (source) { Width = Dim.Fill (), Height = 1 }; @@ -451,5 +451,67 @@ namespace Terminal.Gui.ViewTests { lv.SetSourceAsync (null); Assert.NotNull (lv.Source); } + + [Fact] + public void ListWrapper_StartsWith () + { + var lw = new ListWrapper (new List { "One", "Two", "Three" }); + + Assert.Equal (1, lw.StartsWith ("t")); + Assert.Equal (1, lw.StartsWith ("tw")); + Assert.Equal (2, lw.StartsWith ("th")); + Assert.Equal (1, lw.StartsWith ("T")); + Assert.Equal (1, lw.StartsWith ("TW")); + Assert.Equal (2, lw.StartsWith ("TH")); + + lw = new ListWrapper (new List { "One", "Two", "Three" }); + + Assert.Equal (1, lw.StartsWith ("t")); + Assert.Equal (1, lw.StartsWith ("tw")); + Assert.Equal (2, lw.StartsWith ("th")); + Assert.Equal (1, lw.StartsWith ("T")); + Assert.Equal (1, lw.StartsWith ("TW")); + Assert.Equal (2, lw.StartsWith ("TH")); + } + + [Fact, AutoInitShutdown] + public void EnsureSelectedItemVisible_SelectedItem () + { + var source = new List (); + for (int i = 0; i < 10; i++) { + source.Add ($"Item {i}"); + } + var lv = new ListView (source) { + Width = 10, + Height = 5 + }; + Application.Top.Add (lv); + Application.Begin (Application.Top); + + TestHelpers.AssertDriverContentsWithFrameAre (@" +Item 0 +Item 1 +Item 2 +Item 3 +Item 4", output); + + lv.SelectedItem = 6; + Application.Refresh (); + TestHelpers.AssertDriverContentsWithFrameAre (@" +Item 0 +Item 1 +Item 2 +Item 3 +Item 4", output); + + lv.EnsureSelectedItemVisible (); + Application.Refresh (); + TestHelpers.AssertDriverContentsWithFrameAre (@" +Item 2 +Item 3 +Item 4 +Item 5 +Item 6", output); + } } }