mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
Fixes #2451. ListView SelectedItem should be -1 by default.
This commit is contained in:
@@ -188,7 +188,7 @@ namespace Terminal.Gui {
|
||||
if (SuperView != null && SuperView.Subviews.Contains (this)) {
|
||||
SelectedItem = -1;
|
||||
search.Text = "";
|
||||
Search_Changed (this, new TextChangedEventArgs(""));
|
||||
Search_Changed (this, new TextChangedEventArgs (""));
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
}
|
||||
@@ -316,7 +316,7 @@ namespace Terminal.Gui {
|
||||
}
|
||||
};
|
||||
|
||||
Added += (s, e) => {
|
||||
Added += (s, e) => {
|
||||
|
||||
// Determine if this view is hosted inside a dialog and is the only control
|
||||
for (View view = this.SuperView; view != null; view = view.SuperView) {
|
||||
@@ -328,7 +328,7 @@ namespace Terminal.Gui {
|
||||
|
||||
SetNeedsLayout ();
|
||||
SetNeedsDisplay ();
|
||||
Search_Changed (this, new TextChangedEventArgs( Text));
|
||||
Search_Changed (this, new TextChangedEventArgs (Text));
|
||||
};
|
||||
|
||||
// Things this view knows how to do
|
||||
@@ -745,15 +745,17 @@ namespace Terminal.Gui {
|
||||
if (listview.Source.Count == 0 || (searchset?.Count ?? 0) == 0) {
|
||||
text = "";
|
||||
HideList ();
|
||||
isShow = false;
|
||||
return;
|
||||
}
|
||||
|
||||
SetValue (searchset [listview.SelectedItem]);
|
||||
SetValue (listview.SelectedItem > -1 ? searchset [listview.SelectedItem] : text);
|
||||
search.CursorPosition = search.Text.ConsoleWidth;
|
||||
Search_Changed (this, new TextChangedEventArgs(search.Text));
|
||||
Search_Changed (this, new TextChangedEventArgs (search.Text));
|
||||
OnOpenSelectedItem ();
|
||||
Reset (keepSearchText: true);
|
||||
HideList ();
|
||||
isShow = false;
|
||||
}
|
||||
|
||||
private int GetSelectedItemFromSource (ustring value)
|
||||
|
||||
@@ -96,7 +96,7 @@ namespace Terminal.Gui {
|
||||
/// </remarks>
|
||||
public class ListView : View {
|
||||
int top, left;
|
||||
int selected;
|
||||
int selected = -1;
|
||||
|
||||
IListDataSource source;
|
||||
/// <summary>
|
||||
@@ -112,7 +112,7 @@ namespace Terminal.Gui {
|
||||
source = value;
|
||||
KeystrokeNavigator.Collection = source?.ToList ()?.Cast<object> ();
|
||||
top = 0;
|
||||
selected = 0;
|
||||
selected = -1;
|
||||
lastSelectedItem = -1;
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
@@ -207,7 +207,7 @@ namespace Terminal.Gui {
|
||||
|
||||
if (value < 0 || (source.Count > 0 && value >= source.Count))
|
||||
throw new ArgumentException ("value");
|
||||
top = value;
|
||||
top = Math.Max (value, 0);
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
}
|
||||
@@ -485,7 +485,7 @@ namespace Terminal.Gui {
|
||||
n = 0;
|
||||
if (n != selected) {
|
||||
selected = n;
|
||||
top = selected;
|
||||
top = Math.Max (selected, 0);
|
||||
OnSelectedChanged ();
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
@@ -506,7 +506,7 @@ namespace Terminal.Gui {
|
||||
if (n != selected) {
|
||||
selected = n;
|
||||
if (source.Count >= Frame.Height)
|
||||
top = selected;
|
||||
top = Math.Max (selected, 0);
|
||||
else
|
||||
top = 0;
|
||||
OnSelectedChanged ();
|
||||
@@ -540,9 +540,7 @@ namespace Terminal.Gui {
|
||||
if (selected >= top + Frame.Height) {
|
||||
top++;
|
||||
} else if (selected < top) {
|
||||
top = selected;
|
||||
} else if (selected < top) {
|
||||
top = selected;
|
||||
top = Math.Max (selected, 0);
|
||||
}
|
||||
OnSelectedChanged ();
|
||||
SetNeedsDisplay ();
|
||||
@@ -550,7 +548,7 @@ namespace Terminal.Gui {
|
||||
OnSelectedChanged ();
|
||||
SetNeedsDisplay ();
|
||||
} else if (selected >= top + Frame.Height) {
|
||||
top = source.Count - Frame.Height;
|
||||
top = Math.Max (source.Count - Frame.Height, 0);
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
|
||||
@@ -581,14 +579,14 @@ namespace Terminal.Gui {
|
||||
selected = Source.Count - 1;
|
||||
}
|
||||
if (selected < top) {
|
||||
top = selected;
|
||||
top = Math.Max (selected, 0);
|
||||
} else if (selected > top + Frame.Height) {
|
||||
top = Math.Max (selected - Frame.Height + 1, 0);
|
||||
}
|
||||
OnSelectedChanged ();
|
||||
SetNeedsDisplay ();
|
||||
} else if (selected < top) {
|
||||
top = selected;
|
||||
top = Math.Max (selected, 0);
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
return true;
|
||||
@@ -604,7 +602,7 @@ namespace Terminal.Gui {
|
||||
if (source.Count > 0 && selected != source.Count - 1) {
|
||||
selected = source.Count - 1;
|
||||
if (top + selected > Frame.Height - 1) {
|
||||
top = selected;
|
||||
top = Math.Max (selected, 0);
|
||||
}
|
||||
OnSelectedChanged ();
|
||||
SetNeedsDisplay ();
|
||||
@@ -622,7 +620,7 @@ namespace Terminal.Gui {
|
||||
{
|
||||
if (selected != 0) {
|
||||
selected = 0;
|
||||
top = selected;
|
||||
top = Math.Max (selected, 0);
|
||||
OnSelectedChanged ();
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
@@ -750,7 +748,7 @@ namespace Terminal.Gui {
|
||||
{
|
||||
SuperView?.LayoutSubviews ();
|
||||
if (selected < top) {
|
||||
top = selected;
|
||||
top = Math.Max (selected, 0);
|
||||
} else if (Frame.Height > 0 && selected >= top + Frame.Height) {
|
||||
top = Math.Max (selected - Frame.Height + 1, 0);
|
||||
}
|
||||
|
||||
@@ -35,12 +35,21 @@ namespace Terminal.Gui.TextTests {
|
||||
[Fact]
|
||||
public void Cycling ()
|
||||
{
|
||||
// cycling with 'b'
|
||||
var n = new CollectionNavigator (simpleStrings);
|
||||
Assert.Equal (2, n.GetNextMatchingItem (0, 'b'));
|
||||
Assert.Equal (3, n.GetNextMatchingItem (2, 'b'));
|
||||
|
||||
// if 4 (candle) is selected it should loop back to bat
|
||||
Assert.Equal (2, n.GetNextMatchingItem (4, 'b'));
|
||||
|
||||
// cycling with 'a'
|
||||
n = new CollectionNavigator (simpleStrings);
|
||||
Assert.Equal (0, n.GetNextMatchingItem (-1, 'a'));
|
||||
Assert.Equal (1, n.GetNextMatchingItem (0, 'a'));
|
||||
|
||||
// if 4 (candle) is selected it should loop back to appricot
|
||||
Assert.Equal (0, n.GetNextMatchingItem (4, 'a'));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -88,13 +88,14 @@ namespace Terminal.Gui.ViewTests {
|
||||
Assert.Equal (-1, cb.SelectedItem);
|
||||
Assert.Equal (string.Empty, cb.Text);
|
||||
var opened = false;
|
||||
cb.OpenSelectedItem += (s,_) => opened = true;
|
||||
cb.OpenSelectedItem += (s, _) => opened = true;
|
||||
Assert.True (cb.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
|
||||
Assert.False (opened);
|
||||
cb.Text = "Tw";
|
||||
Assert.True (cb.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
|
||||
Assert.True (opened);
|
||||
Assert.Equal ("Two", cb.Text);
|
||||
Assert.Equal ("", cb.Text);
|
||||
Assert.False (cb.IsShow);
|
||||
cb.SetSource (null);
|
||||
Assert.False (cb.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
|
||||
Assert.True (cb.ProcessKey (new KeyEvent (Key.F4, new KeyModifiers ()))); // with no source also expand empty
|
||||
@@ -253,11 +254,11 @@ Three
|
||||
Assert.True (cb.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
|
||||
Assert.False (cb.IsShow);
|
||||
Assert.Equal (2, cb.Source.Count);
|
||||
Assert.Equal (1, cb.SelectedItem);
|
||||
Assert.Equal ("Two", cb.Text);
|
||||
Assert.Equal (-1, cb.SelectedItem);
|
||||
Assert.Equal ("", cb.Text);
|
||||
Assert.True (cb.ProcessKey (new KeyEvent (Key.Esc, new KeyModifiers ())));
|
||||
Assert.False (cb.IsShow);
|
||||
Assert.Equal (1, cb.SelectedItem); // retains last accept selected item
|
||||
Assert.Equal (-1, cb.SelectedItem); // retains last accept selected item
|
||||
Assert.Equal ("", cb.Text); // clear text
|
||||
cb.SetSource (new List<string> ());
|
||||
Assert.Equal (0, cb.Source.Count);
|
||||
@@ -274,7 +275,7 @@ Three
|
||||
Width = 5
|
||||
};
|
||||
cb.SetSource (new List<string> { "One", "Two", "Three" });
|
||||
cb.OpenSelectedItem += (s,e) => selected = e.Value.ToString ();
|
||||
cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -369,7 +370,7 @@ Three
|
||||
HideDropdownListOnClick = true
|
||||
};
|
||||
cb.SetSource (new List<string> { "One", "Two", "Three" });
|
||||
cb.OpenSelectedItem += (s,e) => selected = e.Value.ToString ();
|
||||
cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -431,7 +432,7 @@ Three
|
||||
HideDropdownListOnClick = true
|
||||
};
|
||||
cb.SetSource (new List<string> { "One", "Two", "Three" });
|
||||
cb.OpenSelectedItem += (s,e) => selected = e.Value.ToString ();
|
||||
cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -551,7 +552,7 @@ Three
|
||||
ReadOnly = true
|
||||
};
|
||||
cb.SetSource (new List<string> { "One", "Two", "Three" });
|
||||
cb.OpenSelectedItem += (s,e) => selected = e.Value.ToString ();
|
||||
cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -611,7 +612,7 @@ Three
|
||||
HideDropdownListOnClick = true
|
||||
};
|
||||
cb.SetSource (new List<string> { "One", "Two", "Three" });
|
||||
cb.OpenSelectedItem += (s,e) => selected = e.Value.ToString ();
|
||||
cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -648,7 +649,7 @@ Three
|
||||
HideDropdownListOnClick = false
|
||||
};
|
||||
cb.SetSource (new List<string> { "One", "Two", "Three" });
|
||||
cb.OpenSelectedItem += (s,e) => selected = e.Value.ToString ();
|
||||
cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -685,7 +686,7 @@ Three
|
||||
HideDropdownListOnClick = true
|
||||
};
|
||||
cb.SetSource (new List<string> { "One", "Two", "Three" });
|
||||
cb.OpenSelectedItem += (s,e) => selected = e.Value.ToString ();
|
||||
cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -790,7 +791,7 @@ Three
|
||||
HideDropdownListOnClick = true,
|
||||
};
|
||||
cb.SetSource (new List<string> { "One", "Two", "Three" });
|
||||
cb.OpenSelectedItem += (s,e) => selected = e.Value.ToString ();
|
||||
cb.OpenSelectedItem += (s, e) => selected = e.Value.ToString ();
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -912,8 +913,8 @@ Three ", output);
|
||||
};
|
||||
var list = new List<string> { "One", "Two", "Three" };
|
||||
|
||||
cb.Expanded += (s,e) => cb.SetSource (list);
|
||||
cb.Collapsed += (s,e) => cb.Source = null;
|
||||
cb.Expanded += (s, e) => cb.SetSource (list);
|
||||
cb.Collapsed += (s, e) => cb.Source = null;
|
||||
|
||||
Application.Top.Add (cb);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -22,19 +22,24 @@ namespace Terminal.Gui.ViewTests {
|
||||
var lv = new ListView ();
|
||||
Assert.Null (lv.Source);
|
||||
Assert.True (lv.CanFocus);
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
|
||||
lv = new ListView (new List<string> () { "One", "Two", "Three" });
|
||||
Assert.NotNull (lv.Source);
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
|
||||
lv = new ListView (new NewListDataSource ());
|
||||
Assert.NotNull (lv.Source);
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
|
||||
lv = new ListView (new Rect (0, 1, 10, 20), new List<string> () { "One", "Two", "Three" });
|
||||
Assert.NotNull (lv.Source);
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
Assert.Equal (new Rect (0, 1, 10, 20), lv.Frame);
|
||||
|
||||
lv = new ListView (new Rect (0, 1, 10, 20), new NewListDataSource ());
|
||||
Assert.NotNull (lv.Source);
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
Assert.Equal (new Rect (0, 1, 10, 20), lv.Frame);
|
||||
}
|
||||
|
||||
@@ -46,8 +51,8 @@ namespace Terminal.Gui.ViewTests {
|
||||
|
||||
Assert.NotNull (lv.Source);
|
||||
|
||||
// first item should be selected by default
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
// first item should be deselected by default
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
|
||||
// nothing is ticked
|
||||
Assert.False (lv.Source.IsMarked (0));
|
||||
@@ -61,6 +66,17 @@ namespace Terminal.Gui.ViewTests {
|
||||
// view should indicate that it has accepted and consumed the event
|
||||
Assert.True (lv.ProcessKey (ev));
|
||||
|
||||
// first item should now be selected
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
|
||||
// none of the items should be ticked
|
||||
Assert.False (lv.Source.IsMarked (0));
|
||||
Assert.False (lv.Source.IsMarked (1));
|
||||
Assert.False (lv.Source.IsMarked (2));
|
||||
|
||||
// Press key combo again
|
||||
Assert.True (lv.ProcessKey (ev));
|
||||
|
||||
// second item should now be selected
|
||||
Assert.Equal (1, lv.SelectedItem);
|
||||
|
||||
@@ -109,8 +125,8 @@ namespace Terminal.Gui.ViewTests {
|
||||
|
||||
Assert.NotNull (lv.Source);
|
||||
|
||||
// first item should be selected by default
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
// first item should be deselected by default
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
|
||||
// bind shift down to move down twice in control
|
||||
lv.AddKeyBinding (Key.CursorDown | Key.ShiftMask, Command.LineDown, Command.LineDown);
|
||||
@@ -119,8 +135,8 @@ namespace Terminal.Gui.ViewTests {
|
||||
|
||||
Assert.True (lv.ProcessKey (ev), "The first time we move down 2 it should be possible");
|
||||
|
||||
// After moving down twice from One we should be at 'Three'
|
||||
Assert.Equal (2, lv.SelectedItem);
|
||||
// After moving down twice from -1 we should be at 'Two'
|
||||
Assert.Equal (1, lv.SelectedItem);
|
||||
|
||||
// clear the items
|
||||
lv.SetSource (null);
|
||||
@@ -160,9 +176,9 @@ namespace Terminal.Gui.ViewTests {
|
||||
{
|
||||
List<string> source = new List<string> () { "One", "Two", "Three" };
|
||||
ListView lv = new ListView (source) { Height = 2, AllowsMarking = true };
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
Assert.True (lv.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
|
||||
Assert.Equal (1, lv.SelectedItem);
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
Assert.True (lv.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
Assert.True (lv.ProcessKey (new KeyEvent (Key.PageDown, new KeyModifiers ())));
|
||||
@@ -175,7 +191,7 @@ namespace Terminal.Gui.ViewTests {
|
||||
Assert.True (lv.ProcessKey (new KeyEvent (Key.Space, new KeyModifiers ())));
|
||||
Assert.True (lv.Source.IsMarked (lv.SelectedItem));
|
||||
var opened = false;
|
||||
lv.OpenSelectedItem += (s,_) => opened = true;
|
||||
lv.OpenSelectedItem += (s, _) => opened = true;
|
||||
Assert.True (lv.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
|
||||
Assert.True (opened);
|
||||
Assert.True (lv.ProcessKey (new KeyEvent (Key.End, new KeyModifiers ())));
|
||||
@@ -191,7 +207,7 @@ namespace Terminal.Gui.ViewTests {
|
||||
var rendered = false;
|
||||
var source = new List<string> () { "one", "two", "three" };
|
||||
var lv = new ListView () { Width = Dim.Fill (), Height = Dim.Fill () };
|
||||
lv.RowRender += (s,_) => rendered = true;
|
||||
lv.RowRender += (s, _) => rendered = true;
|
||||
Application.Top.Add (lv);
|
||||
Application.Begin (Application.Top);
|
||||
Assert.False (rendered);
|
||||
@@ -246,7 +262,7 @@ namespace Terminal.Gui.ViewTests {
|
||||
((FakeDriver)Application.Driver).SetBufferSize (12, 12);
|
||||
Application.Refresh ();
|
||||
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||||
┌──────────┐
|
||||
│Line0 │
|
||||
@@ -263,7 +279,7 @@ namespace Terminal.Gui.ViewTests {
|
||||
|
||||
Assert.True (lv.ScrollDown (10));
|
||||
lv.Redraw (lv.Bounds);
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
Assert.Equal (-1, lv.SelectedItem);
|
||||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||||
┌──────────┐
|
||||
│Line10 │
|
||||
@@ -280,9 +296,10 @@ namespace Terminal.Gui.ViewTests {
|
||||
|
||||
Assert.True (lv.MoveDown ());
|
||||
lv.Redraw (lv.Bounds);
|
||||
Assert.Equal (1, lv.SelectedItem);
|
||||
Assert.Equal (0, lv.SelectedItem);
|
||||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||||
┌──────────┐
|
||||
│Line0 │
|
||||
│Line1 │
|
||||
│Line2 │
|
||||
│Line3 │
|
||||
@@ -292,7 +309,6 @@ namespace Terminal.Gui.ViewTests {
|
||||
│Line7 │
|
||||
│Line8 │
|
||||
│Line9 │
|
||||
│Line10 │
|
||||
└──────────┘", output);
|
||||
|
||||
Assert.True (lv.MoveEnd ());
|
||||
|
||||
Reference in New Issue
Block a user