2
0
Эх сурвалжийг харах

Fixes #3106: Combo Box selection fixes (#3117)

* Search selected item on filtered set

* Fix unit test - don't return first item when combobox is not focused or showed

* Improve method readability

* Clean selection from previous search

* Update unit test - after changing search text unselect previously selected item
Maciej 1 жил өмнө
parent
commit
3d829d71db

+ 8 - 5
Terminal.Gui/Views/ComboBox.cs

@@ -759,13 +759,13 @@ namespace Terminal.Gui {
 			isShow = false;
 		}
 
-		private int GetSelectedItemFromSource (string value)
+		private int GetSelectedItemFromSource (string searchText)
 		{
-			if (source == null) {
+			if (source is null) {
 				return -1;
 			}
-			for (int i = 0; i < source.Count; i++) {
-				if (source.ToList () [i].ToString () == value) {
+			for (int i = 0; i < searchset.Count; i++) {
+				if (searchset [i].ToString () == searchText) {
 					return i;
 				}
 			}
@@ -815,13 +815,16 @@ namespace Terminal.Gui {
 
 		private void Search_Changed (object sender, TextChangedEventArgs e)
 		{
-			if (source == null) { // Object initialization		
+			if (source is null) { // Object initialization		
 				return;
 			}
 
 			if (string.IsNullOrEmpty (search.Text) && string.IsNullOrEmpty (e.OldValue)) {
 				ResetSearchSet ();
 			} else if (search.Text != e.OldValue) {
+				if (search.Text.Length < e.OldValue.Length) {
+					selectedItem = -1;
+				}
 				isShow = true;
 				ResetSearchSet (noCopy: true);
 

+ 4 - 4
UnitTests/Views/ComboBoxTests.cs

@@ -215,17 +215,17 @@ Three
 			Assert.True (cb.NewKeyDownEvent (new (KeyCode.CursorDown))); // losing focus
 			Assert.False (cb.HasFocus);
 			Assert.False (cb.IsShow);
-			Assert.Equal (0, cb.SelectedItem);
+			Assert.Equal (-1, cb.SelectedItem);
 			Assert.Equal ("One", cb.Text);
 			Application.Top.FocusFirst (); // Gets focus again
 			Assert.True (cb.HasFocus);
 			Assert.False (cb.IsShow);
-			Assert.Equal (0, cb.SelectedItem);
+			Assert.Equal (-1, cb.SelectedItem);
 			Assert.Equal ("One", cb.Text);
 			Assert.True (cb.NewKeyDownEvent (new (KeyCode.U | KeyCode.CtrlMask)));
 			Assert.True (cb.HasFocus);
 			Assert.True (cb.IsShow);
-			Assert.Equal (0, cb.SelectedItem);
+			Assert.Equal (-1, cb.SelectedItem);
 			Assert.Equal ("", cb.Text);
 			Assert.Equal (3, cb.Source.Count);
 		}
@@ -256,7 +256,7 @@ Three
 			Assert.Equal ("One", cb.Text);
 			cb.Text = "T";
 			Assert.True (cb.IsShow);
-			Assert.Equal (0, cb.SelectedItem);
+			Assert.Equal (-1, cb.SelectedItem);
 			Assert.Equal ("T", cb.Text);
 			Assert.True (cb.NewKeyDownEvent (new (KeyCode.Enter)));
 			Assert.False (cb.IsShow);