/// <inheritdoc/> protected override Measurement Measure(RenderContext context, int maxWidth) { var maxPadding = Math.Max(Padding.GetLeftSafe(), Padding.GetRightSafe()); var itemWidths = _items.Select(item => item.Measure(context, maxWidth).Max).ToArray(); var columnCount = CalculateColumnCount(maxWidth, itemWidths, _items.Count, maxPadding); if (columnCount == 0) { // Temporary work around for extremely small consoles return(new Measurement(maxWidth, maxWidth)); } var rows = _items.Count / Math.Max(columnCount, 1); var greatestWidth = 0; for (var row = 0; row < rows; row += Math.Max(1, columnCount)) { var widths = itemWidths.Skip(row * columnCount).Take(columnCount).ToList(); var totalWidth = widths.Sum() + (maxPadding * (widths.Count - 1)); if (totalWidth > greatestWidth) { greatestWidth = totalWidth; } } return(new Measurement(greatestWidth, greatestWidth)); }
/// <inheritdoc/> protected override IEnumerable <Segment> Render(RenderContext context, int maxWidth) { var maxPadding = Math.Max(Padding.GetLeftSafe(), Padding.GetRightSafe()); var itemWidths = _items.Select(item => item.Measure(context, maxWidth).Max).ToArray(); var columnCount = CalculateColumnCount(maxWidth, itemWidths, _items.Count, maxPadding); if (columnCount == 0) { // Temporary work around for extremely small consoles columnCount = 1; } var table = new Table(); table.NoBorder(); table.HideHeaders(); table.PadRightCell = false; if (Expand) { table.Expand(); } // Add columns for (var index = 0; index < columnCount; index++) { table.AddColumn(new TableColumn(string.Empty) { Padding = Padding, NoWrap = true, }); } // Add rows for (var start = 0; start < _items.Count; start += columnCount) { table.AddRow(_items.Skip(start).Take(columnCount).ToArray()); } return(((IRenderable)table).Render(context, maxWidth)); }
/// <inheritdoc/> protected override IEnumerable <Segment> Render(RenderContext context, int maxWidth) { var paddingWidth = Padding?.GetWidth() ?? 0; var childWidth = maxWidth - paddingWidth; if (!Expand) { var measurement = _child.Measure(context, maxWidth - paddingWidth); childWidth = measurement.Max; } var width = childWidth + paddingWidth; var result = new List <Segment>(); if (width > maxWidth) { width = maxWidth; } // Top padding for (var i = 0; i < Padding.GetTopSafe(); i++) { result.Add(Segment.Padding(width)); result.Add(Segment.LineBreak); } var child = _child.Render(context, maxWidth - paddingWidth); foreach (var line in Segment.SplitLines(child)) { // Left padding if (Padding.GetLeftSafe() != 0) { result.Add(Segment.Padding(Padding.GetLeftSafe())); } result.AddRange(line); // Right padding if (Padding.GetRightSafe() != 0) { result.Add(Segment.Padding(Padding.GetRightSafe())); } // Missing space on right side? var lineWidth = line.CellCount(); var diff = width - lineWidth - Padding.GetLeftSafe() - Padding.GetRightSafe(); if (diff > 0) { result.Add(Segment.Padding(diff)); } result.Add(Segment.LineBreak); } // Bottom padding for (var i = 0; i < Padding.GetBottomSafe(); i++) { result.Add(Segment.Padding(width)); result.Add(Segment.LineBreak); } return(result); }