Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
103 changes: 53 additions & 50 deletions Terminal.Gui/Views/ListView/ListView.Drawing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,66 +11,70 @@ protected override bool OnDrawingContent (DrawContext? context)
}

var current = Attribute.Default;
Move (0, 0);
Rectangle f = Viewport;
int item = Viewport.Y;
bool focused = HasFocus;
int col = ShowMarks ? 2 : 0;
int start = Viewport.X;
Move (0, 0);

for (var row = 0; row < f.Height; row++, item++)
for (var row = 0; row < Viewport.Height; row++, item++)
{
bool isSelected = item == SelectedItem;
bool isMarked = Source!.IsMarked (item);
bool hasFocus = focused;
bool isMarked = item < Source?.Count && Source?.IsMarked (item) is true;

// Determine visual role based on the 4 combinations of ShowMarks and MarkMultiple
VisualRole role;
var applyHighlightStyle = false;

if (!ShowMarks && !MarkMultiple)
{
// Combination 1: Standard selection mode (no marking)
// Mark glyphs: None (MarkWidth = 0)
// Visual roles: SelectedItem uses Focus (focused) or Active (not focused)
role = isSelected ? hasFocus ? VisualRole.Focus : VisualRole.Active : VisualRole.Normal;
}
else if (!ShowMarks && MarkMultiple)
switch (ShowMarks)
{
// Combination 2: Hidden marks with visual role indicators
// Mark glyphs: None (MarkWidth = 0) - marks exist internally
// Visual roles use Highlight for marked items; compose TextStyle when marked+selected+focused
if (isSelected && isMarked)
{
role = hasFocus ? VisualRole.Focus : VisualRole.Highlight;
applyHighlightStyle = hasFocus; // Apply Highlight's TextStyle to Focus
}
else if (isSelected)
{
role = hasFocus ? VisualRole.Focus : VisualRole.Normal;
}
else if (isMarked)
{
role = VisualRole.Highlight;
}
else
case false when !MarkMultiple:
// Combination 1: Standard selection mode (no marking)
// Mark glyphs: None (MarkWidth = 0)
// Visual roles: SelectedItem uses Focus (focused) or Active (not focused)
role = isSelected ? HasFocus ? VisualRole.Focus : VisualRole.Active : VisualRole.Normal;

break;

case false when MarkMultiple:
{
role = VisualRole.Normal;
switch (isSelected)
{
// Combination 2: Hidden marks with visual role indicators
// Mark glyphs: None (MarkWidth = 0) - marks exist internally
// Visual roles use Highlight for marked items; compose TextStyle when marked+selected+focused
case true when isMarked:
role = HasFocus ? VisualRole.Focus : VisualRole.Highlight;
applyHighlightStyle = HasFocus; // Apply Highlight's TextStyle to Focus

break;

case true: role = HasFocus ? VisualRole.Focus : VisualRole.Normal; break;

default:
{
role = isMarked ? VisualRole.Highlight : VisualRole.Normal;

break;
}
}

break;
}
}
else if (ShowMarks && !MarkMultiple)
{
// Combination 3: Radio button style
// Mark glyphs: Radio-button style (◉ marked, ○ unmarked)
// Visual roles: Standard selection (mark glyphs provide visual indication)
role = isSelected ? hasFocus ? VisualRole.Focus : VisualRole.Active : VisualRole.Normal;
}
else // ShowMarks == true && MarkMultiple == true
{
// Combination 4: Checkbox style
// Mark glyphs: Checkbox style (☒ marked, ☐ unmarked)
// Visual roles: Standard selection (mark glyphs provide visual indication)
role = isSelected ? hasFocus ? VisualRole.Focus : VisualRole.Active : VisualRole.Normal;

case true when !MarkMultiple:
// Combination 3: Radio button style
// Mark glyphs: Radio-button style (◉ marked, ○ unmarked)
// Visual roles: Standard selection (mark glyphs provide visual indication)
role = isSelected ? HasFocus ? VisualRole.Focus : VisualRole.Active : VisualRole.Normal;

break;

default:
// Combination 4: Checkbox style
// Mark glyphs: Checkbox style (☒ marked, ☐ unmarked)
// Visual roles: Standard selection (mark glyphs provide visual indication)
role = isSelected ? HasFocus ? VisualRole.Focus : VisualRole.Active : VisualRole.Normal;

break;
}

Attribute newAttribute = GetAttributeForRole (role);
Expand All @@ -92,7 +96,7 @@ protected override bool OnDrawingContent (DrawContext? context)

if (Source is null || item >= Source.Count)
{
for (var c = 0; c < f.Width; c++)
for (var c = 0; c < Viewport.Width; c++)
{
AddRune ((Rune)' ');
}
Expand Down Expand Up @@ -142,7 +146,7 @@ protected override bool OnDrawingContent (DrawContext? context)
}

int contentCol = col > 0 ? col : markWidth;
Source.Render (this, isSelected, item, contentCol, row, f.Width - contentCol, start);
Source.Render (this, isSelected, item, contentCol, row, Viewport.Width - contentCol, Viewport.X);
}
}

Expand All @@ -159,5 +163,4 @@ protected override bool OnDrawingContent (DrawContext? context)

/// <summary>This event is invoked when this <see cref="ListView"/> is being drawn before rendering.</summary>
public event EventHandler<ListViewRowEventArgs>? RowRender;

}
Loading
Loading