Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
70660a3
Merge branch 'v2_develop' of tig:tig/Terminal.Gui into v2_develop
tig Nov 12, 2025
3de47ac
Merge branch 'v2_develop' of tig:tig/Terminal.Gui into v2_develop
tig Nov 12, 2025
b05373f
Add comprehensive unit tests for WindowsKeyConverter
tig Nov 12, 2025
41f0228
Merge branch 'v2_develop' of tig:tig/Terminal.Gui into v2_develop
tig Nov 12, 2025
6b0e882
Rename `start` parameter to `viewportXOffset` for clarity
tig Nov 15, 2025
7cd37fe
Remove WindowsKeyConverterTests class that was added by mistake
tig Nov 15, 2025
8b9d478
Modernized ListView and IListDataSource - Tons of new unit tests
tig Nov 15, 2025
cf613a2
Improve index validation in ComboBox and ListView
tig Nov 15, 2025
0622900
Refactor and enhance test coverage across modules
tig Nov 15, 2025
0227174
Refactor to use nullable types for better null safety
tig Nov 15, 2025
f66fdc3
Merge branch 'v2_develop' into v2_IListDataSource
tig Nov 19, 2025
6d4dcb8
Merge branch 'v2_IListDataSource' of tig:tig/Terminal.Gui into v2_ILi…
tig Nov 19, 2025
6cb544a
on` functionality has been deprecated, refactored, or removed from th…
tig Nov 19, 2025
f3111c7
Refactor: Transition to instance-based architecture
tig Nov 19, 2025
32c2cf1
Refactor ListViewTests to use Terminal.Gui framework
tig Nov 19, 2025
bbf5449
Update Terminal.Gui/Views/CollectionNavigation/CollectionNavigatorBas…
tig Nov 20, 2025
c921129
Update Terminal.Gui/Views/CollectionNavigation/CollectionNavigatorBas…
tig Nov 20, 2025
2d55e56
Update Examples/UICatalog/UICatalogTop.cs
tig Nov 20, 2025
9d6eb72
Update Terminal.Gui/Views/ListWrapper.cs
tig Nov 20, 2025
5bcaa3d
Update Terminal.Gui/Views/ListWrapper.cs
tig Nov 20, 2025
55b07ab
Updated the `SetMark` method to return `Source.IsMarked(SelectedItem.…
tig Nov 20, 2025
b1923dc
Merge branch 'v2_IListDataSource' of tig:tig/Terminal.Gui into v2_ILi…
tig Nov 20, 2025
6b94e7b
Add comprehensive ListView behavior test coverage
tig Nov 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"version": 1,
"isRoot": true,
"tools": {}
}
2 changes: 1 addition & 1 deletion Examples/UICatalog/Scenarios/AllViewsTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public override void Main ()
// Dispose existing current View, if any
DisposeCurrentView ();

CreateCurrentView (_viewClasses.Values.ToArray () [_classListView.SelectedItem]);
CreateCurrentView (_viewClasses.Values.ToArray () [_classListView.SelectedItem.Value]);

// Force ViewToEdit to be the view and not a subview
if (_adornmentsEditor is { })
Expand Down
4 changes: 2 additions & 2 deletions Examples/UICatalog/Scenarios/ComboBoxIteration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public override void Main ()

listview.SelectedItemChanged += (s, e) =>
{
lbListView.Text = items [e.Item];
comboBox.SelectedItem = e.Item;
lbListView.Text = items [e.Item!.Value];
comboBox.SelectedItem = e.Item.Value;
};

comboBox.SelectedItemChanged += (sender, text) =>
Expand Down
24 changes: 12 additions & 12 deletions Examples/UICatalog/Scenarios/DynamicMenuBar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -712,7 +712,7 @@ public DynamicMenuBarSample ()

btnUp.Accepting += (s, e) =>
{
int i = _lstMenus.SelectedItem;
int i = _lstMenus.SelectedItem.Value;
MenuItem menuItem = DataContext.Menus.Count > 0 ? DataContext.Menus [i].MenuItem : null;

if (menuItem != null)
Expand All @@ -734,7 +734,7 @@ public DynamicMenuBarSample ()

btnDown.Accepting += (s, e) =>
{
int i = _lstMenus.SelectedItem;
int i = _lstMenus.SelectedItem.Value;
MenuItem menuItem = DataContext.Menus.Count > 0 ? DataContext.Menus [i].MenuItem : null;

if (menuItem != null)
Expand Down Expand Up @@ -836,7 +836,7 @@ public DynamicMenuBarSample ()
: MenuItemCheckStyle.Radio,
ShortcutKey = frmMenuDetails.TextShortcutKey.Text
};
UpdateMenuItem (_currentEditMenuBarItem, menuItem, _lstMenus.SelectedItem);
UpdateMenuItem (_currentEditMenuBarItem, menuItem, _lstMenus.SelectedItem.Value);
}
};

Expand Down Expand Up @@ -885,8 +885,8 @@ public DynamicMenuBarSample ()

btnRemove.Accepting += (s, e) =>
{
MenuItem menuItem = (DataContext.Menus.Count > 0 && _lstMenus.SelectedItem > -1
? DataContext.Menus [_lstMenus.SelectedItem].MenuItem
MenuItem menuItem = (DataContext.Menus.Count > 0 && _lstMenus.SelectedItem is {} selectedItem
? DataContext.Menus [selectedItem].MenuItem
: _currentEditMenuBarItem);

if (menuItem != null)
Expand All @@ -905,9 +905,9 @@ public DynamicMenuBarSample ()
SelectCurrentMenuBarItem ();
}

if (_lstMenus.SelectedItem > -1)
if (_lstMenus.SelectedItem is {} selected)
{
DataContext.Menus?.RemoveAt (_lstMenus.SelectedItem);
DataContext.Menus?.RemoveAt (selected);
}

if (_lstMenus.Source.Count > 0 && _lstMenus.SelectedItem > _lstMenus.Source.Count - 1)
Expand All @@ -927,7 +927,7 @@ public DynamicMenuBarSample ()

_lstMenus.OpenSelectedItem += (s, e) =>
{
_currentMenuBarItem = DataContext.Menus [e.Item].MenuItem;
_currentMenuBarItem = DataContext.Menus [e.Item.Value].MenuItem;

if (!(_currentMenuBarItem is MenuBarItem))
{
Expand All @@ -945,8 +945,8 @@ public DynamicMenuBarSample ()

_lstMenus.HasFocusChanging += (s, e) =>
{
MenuItem menuBarItem = _lstMenus.SelectedItem > -1 && DataContext.Menus.Count > 0
? DataContext.Menus [_lstMenus.SelectedItem].MenuItem
MenuItem menuBarItem = _lstMenus.SelectedItem is {} selectedItem && DataContext.Menus.Count > 0
? DataContext.Menus [selectedItem].MenuItem
: null;
SetFrameDetails (menuBarItem);
};
Expand Down Expand Up @@ -1077,8 +1077,8 @@ void SetFrameDetails (MenuItem menuBarItem = null)

if (menuBarItem == null)
{
menuItem = _lstMenus.SelectedItem > -1 && DataContext.Menus.Count > 0
? DataContext.Menus [_lstMenus.SelectedItem].MenuItem
menuItem = _lstMenus.SelectedItem is {} selectedItem && DataContext.Menus.Count > 0
? DataContext.Menus [selectedItem].MenuItem
: _currentEditMenuBarItem;
}
else
Expand Down
29 changes: 21 additions & 8 deletions Examples/UICatalog/Scenarios/DynamicStatusBar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,12 @@ public DynamicStatusBarSample ()

btnUp.Accepting += (s, e) =>
{
int i = _lstItems.SelectedItem;
if (_lstItems.SelectedItem is null)
{
return;
}
int i = _lstItems.SelectedItem.Value;

Shortcut statusItem = DataContext.Items.Count > 0 ? DataContext.Items [i].Shortcut : null;

if (statusItem != null)
Expand All @@ -335,7 +340,12 @@ public DynamicStatusBarSample ()

btnDown.Accepting += (s, e) =>
{
int i = _lstItems.SelectedItem;
if (_lstItems.SelectedItem is null)
{
return;
}
int i = _lstItems.SelectedItem.Value;

Shortcut statusItem = DataContext.Items.Count > 0 ? DataContext.Items [i].Shortcut : null;

if (statusItem != null)
Expand Down Expand Up @@ -376,14 +386,17 @@ public DynamicStatusBarSample ()
}
else if (_currentEditStatusItem != null)
{

var statusItem = new DynamicStatusItem
{
Title = frmStatusBarDetails.TextTitle.Text,
Action = frmStatusBarDetails.TextAction.Text,
Shortcut = frmStatusBarDetails.TextShortcut.Text
};
UpdateStatusItem (_currentEditStatusItem, statusItem, _lstItems.SelectedItem);

if (_lstItems.SelectedItem is { } selectedItem)
{
UpdateStatusItem (_currentEditStatusItem, statusItem, selectedItem);
}
}
};

Expand Down Expand Up @@ -420,14 +433,14 @@ public DynamicStatusBarSample ()
btnRemove.Accepting += (s, e) =>
{
Shortcut statusItem = DataContext.Items.Count > 0
? DataContext.Items [_lstItems.SelectedItem].Shortcut
? DataContext.Items [_lstItems.SelectedItem.Value].Shortcut
: null;

if (statusItem != null)
{
_statusBar.RemoveShortcut (_currentSelectedStatusBar);
statusItem.Dispose ();
DataContext.Items.RemoveAt (_lstItems.SelectedItem);
DataContext.Items.RemoveAt (_lstItems.SelectedItem.Value);

if (_lstItems.Source.Count > 0 && _lstItems.SelectedItem > _lstItems.Source.Count - 1)
{
Expand All @@ -442,7 +455,7 @@ public DynamicStatusBarSample ()
_lstItems.HasFocusChanging += (s, e) =>
{
Shortcut statusItem = DataContext.Items.Count > 0
? DataContext.Items [_lstItems.SelectedItem].Shortcut
? DataContext.Items [_lstItems.SelectedItem.Value].Shortcut
: null;
SetFrameDetails (statusItem);
};
Expand Down Expand Up @@ -489,7 +502,7 @@ void SetFrameDetails (Shortcut statusItem = null)
if (statusItem == null)
{
newStatusItem = DataContext.Items.Count > 0
? DataContext.Items [_lstItems.SelectedItem].Shortcut
? DataContext.Items [_lstItems.SelectedItem.Value].Shortcut
: null;
}
else
Expand Down
8 changes: 4 additions & 4 deletions Examples/UICatalog/Scenarios/ListViewWithSelection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ public void Render (
int col,
int line,
int width,
int start = 0
int viewportX = 0
)
{
container.Move (col, line);
Expand All @@ -247,7 +247,7 @@ public void Render (
string.Format ("{{0,{0}}}", -_nameColumnWidth),
Scenarios [item].GetName ()
);
RenderUstr (container, $"{s} ({Scenarios [item].GetDescription ()})", col, line, width, start);
RenderUstr (container, $"{s} ({Scenarios [item].GetDescription ()})", col, line, width, viewportX);
}

public void SetMark (int item, bool value)
Expand Down Expand Up @@ -288,10 +288,10 @@ Scenarios [i].GetName ()
}

// A slightly adapted method from: https://github.com/gui-cs/Terminal.Gui/blob/fc1faba7452ccbdf49028ac49f0c9f0f42bbae91/Terminal.Gui/Views/ListView.cs#L433-L461
private void RenderUstr (View view, string ustr, int col, int line, int width, int start = 0)
private void RenderUstr (View view, string ustr, int col, int line, int width, int viewportX = 0)
{
var used = 0;
int index = start;
int index = viewportX;

while (index < ustr.Length)
{
Expand Down
2 changes: 1 addition & 1 deletion Examples/UICatalog/Scenarios/ListsAndCombos.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public override void Main ()
Width = Dim.Percent (40),
Source = new ListWrapper<string> (items)
};
listview.SelectedItemChanged += (s, e) => lbListView.Text = items [listview.SelectedItem];
listview.SelectedItemChanged += (s, e) => lbListView.Text = items [listview.SelectedItem.Value];
win.Add (lbListView, listview);

//var scrollBar = new ScrollBarView (listview, true);
Expand Down
2 changes: 1 addition & 1 deletion Examples/UICatalog/Scenarios/SpinnerStyles.cs
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ public override void Main ()
else
{
spinner.Visible = true;
spinner.Style = (SpinnerStyle)Activator.CreateInstance (styleDict [e.Item].Value);
spinner.Style = (SpinnerStyle)Activator.CreateInstance (styleDict [e.Item.Value].Value);
delayField.Text = spinner.SpinDelay.ToString ();
ckbBounce.CheckedState = spinner.SpinBounce ? CheckState.Checked : CheckState.UnChecked;
ckbNoSpecial.CheckedState = !spinner.HasSpecialCharacters ? CheckState.Checked : CheckState.UnChecked;
Expand Down
14 changes: 11 additions & 3 deletions Examples/UICatalog/UICatalogTop.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@ public UICatalogTop ()
Unloaded += UnloadedHandler;

// Restore previous selections
_categoryList.SelectedItem = _cachedCategoryIndex;
if (_categoryList.Source?.Count > 0) {
_categoryList.SelectedItem = _cachedCategoryIndex ?? 0;
} else {
_categoryList.SelectedItem = null;
}
_scenarioList.SelectedRow = _cachedScenarioIndex;

SchemeName = CachedTopLevelScheme = SchemeManager.SchemesToSchemeName (Schemes.Base);
Expand Down Expand Up @@ -510,7 +514,7 @@ private void ScenarioView_OpenSelectedItem (object? sender, EventArgs? e)
#region Category List

private readonly ListView? _categoryList;
private static int _cachedCategoryIndex;
private static int? _cachedCategoryIndex;
public static ObservableCollection<string>? CachedCategories { get; set; }

private ListView CreateCategoryList ()
Expand Down Expand Up @@ -540,7 +544,11 @@ private ListView CreateCategoryList ()

private void CategoryView_SelectedChanged (object? sender, ListViewItemEventArgs? e)
{
string item = CachedCategories! [e!.Item];
if (e is null or { Item: null })
{
return;
}
string item = CachedCategories! [e.Item.Value];
ObservableCollection<Scenario> newScenarioList;

if (e.Item == 0)
Expand Down
2 changes: 1 addition & 1 deletion Scripts/Run-LocalCoverage.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ dotnet test Tests/UnitTests `
--verbosity minimal `
--collect:"XPlat Code Coverage" `
--settings Tests/UnitTests/runsettings.coverage.xml `
--blame-hang-timeout 10s
--blame-hang-timeout 60s

# ------------------------------------------------------------
# 4. Run UNIT TESTS (parallel)
Expand Down
Loading
Loading