Skip to content

Commit c671fa1

Browse files
BobSilentjonsequitur
authored andcommitted
Add Column Padding for all SizeModes, to render all columns equal
1 parent 5e855e9 commit c671fa1

File tree

3 files changed

+75
-47
lines changed

3 files changed

+75
-47
lines changed

src/System.CommandLine.Rendering.Tests/TableRenderingTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ public void A_row_is_written_for_each_item_and_a_header_for_each_column(OutputMo
4848
lines
4949
.Should()
5050
.BeEquivalentSequenceTo(
51-
Cell("Option ", 0, 0), Cell(" ", 13, 0),
52-
Cell("-s ", 0, 1), Cell("a short option", 13, 1),
53-
Cell("--very-long ", 0, 2), Cell("a long option ", 13, 2));
51+
Cell("Option ", 0, 0), Cell(" ", 13, 0),
52+
Cell("-s ", 0, 1), Cell("a short option", 13, 1),
53+
Cell("--very-long", 0, 2), Cell("a long option ", 13, 2));
5454
}
5555

5656
[Fact]
@@ -70,9 +70,9 @@ public void A_row_is_written_for_each_item_and_a_header_for_each_column_in_file_
7070
.ToString()
7171
.Should()
7272
.Be(
73-
"Option " + NewLine +
74-
"-s a short option" + NewLine +
75-
"--very-long a long option ");
73+
"Option " + NewLine +
74+
"-s a short option" + NewLine +
75+
"--very-longa long option ");
7676
}
7777

7878
[Theory]

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

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@ public void Column_width_definition_size_calculation_according_priority_fixed_th
7070

7171
var terminal = new TestTerminal();
7272
var renderer = new ConsoleRenderer(terminal, outputMode);
73-
grid.Render(renderer, new Region(0, 0, 20, 1));
73+
grid.Render(renderer, new Region(0, 0, 22, 1));
7474

7575
terminal.Events.Should().BeEquivalentSequenceTo(
7676
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
77-
new TestTerminal.ContentWritten("brown fox "),
78-
new TestTerminal.CursorPositionChanged(new Point(10, 0)),
77+
new TestTerminal.ContentWritten("brown fox"),
78+
new TestTerminal.CursorPositionChanged(new Point(11, 0)),
7979
new TestTerminal.ContentWritten("jumped "));
8080
}
8181

@@ -109,6 +109,33 @@ public void Row_height_definition_size_calculation_according_priority_fixed_then
109109
new TestTerminal.ContentWritten(" "));
110110
}
111111

112+
[Theory]
113+
[InlineData(OutputMode.Ansi)]
114+
[InlineData(OutputMode.NonAnsi)]
115+
public void Column_width_definition_is_preserved_even_defintion_is_mixed_for_subsequent_columns2(OutputMode outputMode)
116+
{
117+
var grid = new GridView();
118+
grid.SetColumns(ColumnDefinition.Fixed(9), ColumnDefinition.Star(1), ColumnDefinition.SizeToContent(), ColumnDefinition.Fixed(15));
119+
grid.SetChild(new ContentView("The quick"), 0, 0);
120+
grid.SetChild(new ContentView("brown fox"), 1, 0);
121+
grid.SetChild(new ContentView("jumped"), 2, 0);
122+
grid.SetChild(new ContentView("over the sleepy"), 3, 0);
123+
124+
var terminal = new TestTerminal();
125+
var renderer = new ConsoleRenderer(terminal, outputMode);
126+
grid.Render(renderer, new Region(0, 0, 45, 1));
127+
128+
terminal.Events.Should().BeEquivalentSequenceTo(
129+
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
130+
new TestTerminal.ContentWritten("The quick"),
131+
new TestTerminal.CursorPositionChanged(new Point(11, 0)),
132+
new TestTerminal.ContentWritten("brown fox"),
133+
new TestTerminal.CursorPositionChanged(new Point(22, 0)),
134+
new TestTerminal.ContentWritten("jumped"),
135+
new TestTerminal.CursorPositionChanged(new Point(30, 0)),
136+
new TestTerminal.ContentWritten("over the sleepy"));
137+
}
138+
112139
[Theory]
113140
[InlineData(OutputMode.Ansi)]
114141
[InlineData(OutputMode.NonAnsi)]
@@ -123,16 +150,16 @@ public void Column_width_definition_is_preserved_even_defintion_is_mixed_for_sub
123150

124151
var terminal = new TestTerminal();
125152
var renderer = new ConsoleRenderer(terminal, outputMode);
126-
grid.Render(renderer, new Region(0, 0, 115, 1));
153+
grid.Render(renderer, new Region(0, 0, 121, 1));
127154

128155
terminal.Events.Should().BeEquivalentSequenceTo(
129156
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
130157
new TestTerminal.ContentWritten("The quick "),
131-
new TestTerminal.CursorPositionChanged(new Point(10, 0)),
158+
new TestTerminal.CursorPositionChanged(new Point(12, 0)),
132159
new TestTerminal.ContentWritten("brown fox" + new string(' ', 71)),
133-
new TestTerminal.CursorPositionChanged(new Point(90, 0)),
160+
new TestTerminal.CursorPositionChanged(new Point(94, 0)),
134161
new TestTerminal.ContentWritten("jumped "),
135-
new TestTerminal.CursorPositionChanged(new Point(100, 0)),
162+
new TestTerminal.CursorPositionChanged(new Point(106, 0)),
136163
new TestTerminal.ContentWritten("over the sleepy"));
137164
}
138165

@@ -151,24 +178,24 @@ public void Star_grid_lays_out_in_even_grid(OutputMode outputMode)
151178

152179
var terminal = new TestTerminal();
153180
var renderer = new ConsoleRenderer(terminal, outputMode);
154-
grid.Render(renderer, new Region(0, 0, 10, 4));
181+
grid.Render(renderer, new Region(0, 0, 12, 4));
155182

156183
terminal.Events.Should().BeEquivalentSequenceTo(
157184
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
158185
new TestTerminal.ContentWritten("The "),
159186
new TestTerminal.CursorPositionChanged(new Point(0, 1)),
160187
new TestTerminal.ContentWritten("quick"),
161-
new TestTerminal.CursorPositionChanged(new Point(5, 0)),
188+
new TestTerminal.CursorPositionChanged(new Point(7, 0)),
162189
new TestTerminal.ContentWritten("brown"),
163-
new TestTerminal.CursorPositionChanged(new Point(5, 1)),
190+
new TestTerminal.CursorPositionChanged(new Point(7, 1)),
164191
new TestTerminal.ContentWritten("fox "),
165192
new TestTerminal.CursorPositionChanged(new Point(0, 2)),
166193
new TestTerminal.ContentWritten("jumpe"),
167194
new TestTerminal.CursorPositionChanged(new Point(0, 3)),
168195
new TestTerminal.ContentWritten(" "),
169-
new TestTerminal.CursorPositionChanged(new Point(5, 2)),
196+
new TestTerminal.CursorPositionChanged(new Point(7, 2)),
170197
new TestTerminal.ContentWritten("over "),
171-
new TestTerminal.CursorPositionChanged(new Point(5, 3)),
198+
new TestTerminal.CursorPositionChanged(new Point(7, 3)),
172199
new TestTerminal.ContentWritten(" "));
173200
}
174201

@@ -187,22 +214,22 @@ public void Fixed_grid_lays_out_fixed_rows_and_columns(OutputMode outputMode)
187214

188215
var terminal = new TestTerminal();
189216
var renderer = new ConsoleRenderer(terminal, outputMode);
190-
grid.Render(renderer, new Region(0, 0, 10, 4));
217+
grid.Render(renderer, new Region(0, 0, 12, 4));
191218

192219
terminal.Events
193220
.Should()
194221
.BeEquivalentSequenceTo(
195222
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
196223
new TestTerminal.ContentWritten("The "),
197-
new TestTerminal.CursorPositionChanged(new Point(6, 0)),
224+
new TestTerminal.CursorPositionChanged(new Point(8, 0)),
198225
new TestTerminal.ContentWritten("brow"),
199226
new TestTerminal.CursorPositionChanged(new Point(0, 1)),
200227
new TestTerminal.ContentWritten("jumped"),
201228
new TestTerminal.CursorPositionChanged(new Point(0, 2)),
202229
new TestTerminal.ContentWritten("over "),
203-
new TestTerminal.CursorPositionChanged(new Point(6, 1)),
230+
new TestTerminal.CursorPositionChanged(new Point(8, 1)),
204231
new TestTerminal.ContentWritten("the "),
205-
new TestTerminal.CursorPositionChanged(new Point(6, 2)),
232+
new TestTerminal.CursorPositionChanged(new Point(8, 2)),
206233
new TestTerminal.ContentWritten("slee"));
207234
}
208235

@@ -225,11 +252,11 @@ public void Size_to_content_grid_with_wide_region_adjusts_to_content_size(Output
225252

226253
terminal.Events.Should().BeEquivalentSequenceTo(
227254
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
228-
new TestTerminal.ContentWritten("The quick "),
255+
new TestTerminal.ContentWritten("The quick "),
229256
new TestTerminal.CursorPositionChanged(new Point(13, 0)),
230257
new TestTerminal.ContentWritten("brown fox "),
231258
new TestTerminal.CursorPositionChanged(new Point(0, 1)),
232-
new TestTerminal.ContentWritten("jumped over "),
259+
new TestTerminal.ContentWritten("jumped over"),
233260
new TestTerminal.CursorPositionChanged(new Point(13, 1)),
234261
new TestTerminal.ContentWritten("the sleepy"));
235262
}
@@ -253,15 +280,15 @@ public void Size_to_content_grid_with_narrow_region_increases_row_height(OutputM
253280

254281
terminal.Events.Should().BeEquivalentSequenceTo(
255282
new TestTerminal.CursorPositionChanged(new Point(0, 0)),
256-
new TestTerminal.ContentWritten("The quick "),
283+
new TestTerminal.ContentWritten("The quick "),
257284
new TestTerminal.CursorPositionChanged(new Point(0, 1)),
258-
new TestTerminal.ContentWritten(" "),
285+
new TestTerminal.ContentWritten(" "),
259286
new TestTerminal.CursorPositionChanged(new Point(13, 0)),
260287
new TestTerminal.ContentWritten("brown"),
261288
new TestTerminal.CursorPositionChanged(new Point(13, 1)),
262289
new TestTerminal.ContentWritten("fox "),
263290
new TestTerminal.CursorPositionChanged(new Point(0, 2)),
264-
new TestTerminal.ContentWritten("jumped over "),
291+
new TestTerminal.ContentWritten("jumped over"),
265292
new TestTerminal.CursorPositionChanged(new Point(13, 2)),
266293
new TestTerminal.ContentWritten("the s"));
267294
}

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

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class GridView : LayoutView<View>
1010
{
1111
private readonly List<ColumnDefinition> _columns = new List<ColumnDefinition>();
1212
private readonly List<RowDefinition> _rows = new List<RowDefinition>();
13-
private readonly int _gutterWidth = 2;
13+
private readonly int _columnPaddingRight = 2;
1414

1515
private View[,] ChildLocations { get; set; }
1616

@@ -102,12 +102,18 @@ public override void Render(ConsoleRenderer renderer, Region region)
102102
int maxRowHeight = 0;
103103
for (int column = 0; column < _columns.Count; column++)
104104
{
105-
if (ChildLocations[column, row] is View child &&
106-
sizes[column, row].Width > 0 &&
107-
sizes[column, row].Height > 0)
105+
var paddingWidth = GetColumnPaddingWidth(column);
106+
if (ChildLocations[column, row] is not { } child ||
107+
sizes[column, row].Width - paddingWidth <= 0 ||
108+
sizes[column, row].Height <= 0)
108109
{
109-
child.Render(renderer, new Region(left, top, sizes[column, row]));
110+
//child no view or no space left to render
111+
continue;
110112
}
113+
114+
var contentSize = new Size(sizes[column, row].Width - paddingWidth, sizes[column, row].Height);
115+
child.Render(renderer, new Region(left, top, contentSize));
116+
111117
left += sizes[column, row].Width;
112118
maxRowHeight = Math.Max(maxRowHeight, sizes[column, row].Height);
113119
}
@@ -117,6 +123,7 @@ public override void Render(ConsoleRenderer renderer, Region region)
117123

118124
private Size[,] GetGridSizes(ConsoleRenderer renderer, Size maxSize)
119125
{
126+
int countStarSizedColumnsWithPadding = _columns.AsEnumerable().Reverse().Skip(1).Count(x => x.SizeMode == SizeMode.Star);
120127
double totalColumnStarSize = _columns.Where(x => x.SizeMode == SizeMode.Star).Sum(x => x.Value);
121128
double totalRowStarSize = _rows.Where(x => x.SizeMode == SizeMode.Star).Sum(x => x.Value);
122129

@@ -159,14 +166,15 @@ public override void Render(ConsoleRenderer renderer, Region region)
159166
throw new InvalidOperationException($"Unknown row size mode {row.SizeMode}");
160167
}
161168
}
169+
var paddingWidth = GetColumnPaddingWidth(columnIndex);
162170
Size childSize = null;
163171
switch (column.SizeMode)
164172
{
165173
case SizeMode.Fixed:
166174
{
167175
if (measuredColumns[columnIndex] == null)
168176
{
169-
measuredColumns[columnIndex] = Math.Min((int)column.Value, availableWidth);
177+
measuredColumns[columnIndex] = Math.Min((int)column.Value + paddingWidth, availableWidth);
170178
}
171179
break;
172180
}
@@ -176,30 +184,19 @@ public override void Render(ConsoleRenderer renderer, Region region)
176184
{
177185
childSize = child.Measure(renderer, new Size(availableWidth, availableHeight));
178186
}
179-
180-
int gutterWidth;
181-
if (columnIndex < _columns.Count - 1)
182-
{
183-
gutterWidth = _gutterWidth;
184-
}
185-
else
186-
{
187-
gutterWidth = 0;
188-
}
189-
190-
var width = childSize?.Width + gutterWidth ?? 0;
187+
var width = childSize?.Width + paddingWidth ?? 0;
191188
measuredColumns[columnIndex] = Math.Min(Math.Max(measuredColumns[columnIndex] ?? 0, width), availableWidth);
192189
}
193190
break;
194191
case SizeMode.Star:
195192
{
196-
totalWidthForStarSizing ??= availableWidth;
193+
totalWidthForStarSizing ??= availableWidth - countStarSizedColumnsWithPadding * _columnPaddingRight;
197194
int starWidth = (int)Math.Round(column.Value / totalColumnStarSize * totalWidthForStarSizing.Value);
198195
if (measuredColumns[columnIndex] < starWidth)
199196
{
200197
starWidth = measuredColumns[columnIndex].Value;
201198
}
202-
measuredColumns[columnIndex] = starWidth;
199+
measuredColumns[columnIndex] = starWidth + paddingWidth;
203200
break;
204201
}
205202
default:
@@ -232,6 +229,10 @@ public override void Render(ConsoleRenderer renderer, Region region)
232229
return rv;
233230
}
234231

232+
233+
private int GetColumnPaddingWidth(int columnIndex) => columnIndex < _columns.Count - 1 ? _columnPaddingRight : 0;
234+
235+
235236
private static int GetProcessOrder(SizeMode sizeMode)
236237
{
237238
return sizeMode switch

0 commit comments

Comments
 (0)