Skip to content

Commit a0a2bf5

Browse files
BobSilentjonsequitur
authored andcommitted
Fix GridView Row sizing priority and max height
1 parent c016b9b commit a0a2bf5

File tree

2 files changed

+76
-20
lines changed

2 files changed

+76
-20
lines changed

src/System.CommandLine.Rendering.Tests/Views/GridViewTests.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,58 @@ public void Empty_size_to_content_grid_do_not_take_up_space()
5757
measuredSize.Height.Should().Be(0);
5858
}
5959

60+
[Theory]
61+
[InlineData(OutputMode.Ansi)]
62+
[InlineData(OutputMode.NonAnsi)]
63+
public void Column_width_definition_size_calculation_according_priority_fixed_then_size_to_content_then_star(OutputMode outputMode)
64+
{
65+
var grid = new GridView();
66+
grid.SetColumns(ColumnDefinition.Star(1), ColumnDefinition.SizeToContent(), ColumnDefinition.Fixed(10));
67+
grid.SetChild(new ContentView("The quick"), 0, 0);
68+
grid.SetChild(new ContentView("brown fox"), 1, 0);
69+
grid.SetChild(new ContentView("jumped"), 2, 0);
70+
71+
var terminal = new TestTerminal();
72+
var renderer = new ConsoleRenderer(terminal, outputMode);
73+
grid.Render(renderer, new Region(0, 0, 20, 1));
74+
75+
terminal.Events.Should().BeEquivalentSequenceTo(
76+
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
77+
new TestTerminal.ContentWritten("brown fox "),
78+
new TestTerminal.CursorPositionChanged(new Point(10, 0)),
79+
new TestTerminal.ContentWritten("jumped "));
80+
}
81+
82+
[Theory]
83+
[InlineData(OutputMode.Ansi)]
84+
[InlineData(OutputMode.NonAnsi)]
85+
public void Row_height_definition_size_calculation_according_priority_fixed_then_size_to_content_then_star(OutputMode outputMode)
86+
{
87+
var grid = new GridView();
88+
grid.SetRows(RowDefinition.Star(1), RowDefinition.SizeToContent(), RowDefinition.Fixed(4));
89+
grid.SetChild(new ContentView("The"), 0, 0);
90+
grid.SetChild(new ContentView("quick brown fox"), 0, 1);
91+
grid.SetChild(new ContentView("jumped over the sleepy"), 0, 2);
92+
93+
var terminal = new TestTerminal();
94+
var renderer = new ConsoleRenderer(terminal, outputMode);
95+
grid.Render(renderer, new Region(0, 0, 8, 6));
96+
97+
terminal.Events.Should().BeEquivalentSequenceTo(
98+
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
99+
new TestTerminal.ContentWritten("quick "),
100+
new TestTerminal.CursorPositionChanged(new Point(0, 1)),
101+
new TestTerminal.ContentWritten("brown "),
102+
new TestTerminal.CursorPositionChanged(new Point(0, 2)),
103+
new TestTerminal.ContentWritten("jumped "),
104+
new TestTerminal.CursorPositionChanged(new Point(0, 3)),
105+
new TestTerminal.ContentWritten("over the"),
106+
new TestTerminal.CursorPositionChanged(new Point(0, 4)),
107+
new TestTerminal.ContentWritten("sleepy "),
108+
new TestTerminal.CursorPositionChanged(new Point(0, 5)),
109+
new TestTerminal.ContentWritten(" "));
110+
}
111+
60112
[Theory]
61113
[InlineData(OutputMode.Ansi)]
62114
[InlineData(OutputMode.NonAnsi)]

src/System.CommandLine.Rendering/Views/GridView.cs

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -129,23 +129,34 @@ public override void Render(ConsoleRenderer renderer, Region region)
129129
foreach (var (column, columnIndex) in _columns.Select((definition, columnIndex) => (definition, columnIndex)).OrderBy(t => GetProcessOrder(t.definition.SizeMode)))
130130
{
131131
int availableHeight = maxSize.Height;
132+
int? totalHeightForStarSizing = null;
132133

133-
for (int rowIndex = 0; rowIndex < _rows.Count; rowIndex++)
134+
foreach (var (row, rowIndex) in _rows.Select((definition, rowIndex) => (definition, rowIndex)).OrderBy(t => GetProcessOrder(t.definition.SizeMode)))
134135
{
135136
if (measuredRows[rowIndex] == null)
136137
{
137-
switch (_rows[rowIndex].SizeMode)
138+
switch (row.SizeMode)
138139
{
139140
case SizeMode.Fixed:
140-
measuredRows[rowIndex] = Math.Min((int)_rows[rowIndex].Value, availableHeight);
141+
{
142+
measuredRows[rowIndex] = Math.Min((int)row.Value, availableHeight);
141143
break;
144+
}
142145
case SizeMode.Star:
143-
measuredRows[rowIndex] = (int)Math.Round(_rows[rowIndex].Value / totalRowStarSize * maxSize.Height);
146+
{
147+
totalHeightForStarSizing ??= availableHeight;
148+
int starHeight = (int)Math.Round(row.Value / totalRowStarSize * totalHeightForStarSizing.Value);
149+
if (measuredRows[rowIndex] < starHeight)
150+
{
151+
starHeight = measuredRows[rowIndex].Value;
152+
}
153+
measuredRows[rowIndex] = starHeight;
144154
break;
155+
}
145156
case SizeMode.SizeToContent:
146157
break;
147158
default:
148-
throw new InvalidOperationException($"Unknown row size mode {_rows[rowIndex].SizeMode}");
159+
throw new InvalidOperationException($"Unknown row size mode {row.SizeMode}");
149160
}
150161
}
151162
Size childSize = null;
@@ -182,10 +193,7 @@ public override void Render(ConsoleRenderer renderer, Region region)
182193
break;
183194
case SizeMode.Star:
184195
{
185-
if (totalWidthForStarSizing == null)
186-
{
187-
totalWidthForStarSizing = availableWidth;
188-
}
196+
totalWidthForStarSizing ??= availableWidth;
189197
int starWidth = (int)Math.Round(column.Value / totalColumnStarSize * totalWidthForStarSizing.Value);
190198
if (measuredColumns[columnIndex] < starWidth)
191199
{
@@ -198,7 +206,7 @@ public override void Render(ConsoleRenderer renderer, Region region)
198206
throw new InvalidOperationException($"Unknown column size mode {column.SizeMode}");
199207
}
200208

201-
if (_rows[rowIndex].SizeMode == SizeMode.SizeToContent)
209+
if (row.SizeMode == SizeMode.SizeToContent)
202210
{
203211
if (childSize == null && ChildLocations[columnIndex, rowIndex] is View child)
204212
{
@@ -226,17 +234,13 @@ public override void Render(ConsoleRenderer renderer, Region region)
226234

227235
private static int GetProcessOrder(SizeMode sizeMode)
228236
{
229-
switch (sizeMode)
237+
return sizeMode switch
230238
{
231-
case SizeMode.Fixed:
232-
return 0;
233-
case SizeMode.SizeToContent:
234-
return 1;
235-
case SizeMode.Star:
236-
return 2;
237-
default:
238-
throw new InvalidOperationException($"Unknown size mode {sizeMode}");
239-
}
239+
SizeMode.Fixed => 0,
240+
SizeMode.SizeToContent => 1,
241+
SizeMode.Star => 2,
242+
_ => throw new InvalidOperationException($"Unknown size mode {sizeMode}")
243+
};
240244
}
241245
}
242246
}

0 commit comments

Comments
 (0)