/// <inheritdoc/> protected override IEnumerable <Segment> Render(RenderContext context, int maxWidth) { var border = Border.GetSafeBorder((context.LegacyConsole || !context.Unicode) && UseSafeBorder); var borderStyle = BorderStyle ?? Style.Plain; var child = new Padder(_child, Padding); var childWidth = maxWidth - EdgeWidth; if (!Expand) { var measurement = ((IRenderable)child).Measure(context, maxWidth - EdgeWidth); childWidth = measurement.Max; } var panelWidth = childWidth + EdgeWidth; panelWidth = Math.Min(panelWidth, maxWidth); var result = new List <Segment>(); // Panel top AddTopBorder(result, context, border, borderStyle, panelWidth); // Split the child segments into lines. var childSegments = ((IRenderable)child).Render(context, childWidth); foreach (var line in Segment.SplitLines(childSegments, childWidth)) { if (line.Count == 1 && line[0].IsWhiteSpace) { // NOTE: This check might impact other things. // Hopefully not, but there is a chance. continue; } result.Add(new Segment(border.GetPart(BoxBorderPart.Left), borderStyle)); var content = new List <Segment>(); content.AddRange(line); // Do we need to pad the panel? var length = line.Sum(segment => segment.CellLength(context)); if (length < childWidth) { var diff = childWidth - length; content.Add(new Segment(new string(' ', diff))); } result.AddRange(content); result.Add(new Segment(border.GetPart(BoxBorderPart.Right), borderStyle)); result.Add(Segment.LineBreak); } // Panel bottom AddBottomBorder(result, border, borderStyle, panelWidth); return(result); }
/// <inheritdoc/> protected override Measurement Measure(RenderContext context, int maxWidth) { var child = new Padder(_child, Padding); var childWidth = ((IRenderable)child).Measure(context, maxWidth); return(new Measurement( childWidth.Min + EdgeWidth, childWidth.Max + EdgeWidth)); }
/// <inheritdoc/> protected override IEnumerable <Segment> Render(RenderContext context, int maxWidth) { var edgeWidth = EdgeWidth; var border = BoxExtensions.GetSafeBorder(Border, (context.LegacyConsole || !context.Unicode) && UseSafeBorder); var borderStyle = BorderStyle ?? Style.Plain; var showBorder = true; if (border is NoBoxBorder) { showBorder = false; edgeWidth = 0; } var child = new Padder(_child, Padding); var childWidth = maxWidth - edgeWidth; if (!Expand) { var measurement = ((IRenderable)child).Measure(context, maxWidth - edgeWidth); childWidth = measurement.Max; } var panelWidth = childWidth + edgeWidth; panelWidth = Math.Min(panelWidth, maxWidth); var result = new List <Segment>(); if (showBorder) { // Panel top AddTopBorder(result, context, border, borderStyle, panelWidth); } // Split the child segments into lines. var childSegments = ((IRenderable)child).Render(context, childWidth); foreach (var(_, _, last, line) in Segment.SplitLines(context, childSegments, childWidth).Enumerate()) { if (line.Count == 1 && line[0].IsWhiteSpace) { // NOTE: This check might impact other things. // Hopefully not, but there is a chance. continue; } if (showBorder) { result.Add(new Segment(border.GetPart(BoxBorderPart.Left), borderStyle)); } var content = new List <Segment>(); content.AddRange(line); // Do we need to pad the panel? var length = line.Sum(segment => segment.CellCount(context)); if (length < childWidth) { var diff = childWidth - length; content.Add(Segment.Padding(diff)); } result.AddRange(content); if (showBorder) { result.Add(new Segment(border.GetPart(BoxBorderPart.Right), borderStyle)); } // Don't emit a line break if this is the last // line, we're not showing the border, and we're // not rendering this inline. var emitLinebreak = !(last && !showBorder && !Inline); if (!emitLinebreak) { continue; } result.Add(Segment.LineBreak); } // Panel bottom if (showBorder) { result.Add(new Segment(border.GetPart(BoxBorderPart.BottomLeft), borderStyle)); result.Add(new Segment(border.GetPart(BoxBorderPart.Bottom).Repeat(panelWidth - EdgeWidth), borderStyle)); result.Add(new Segment(border.GetPart(BoxBorderPart.BottomRight), borderStyle)); } // TODO: Need a better name for this? // If we're rendering this as part of an inline parent renderable, // such as columns, we should not emit the last line break. if (!Inline) { result.Add(Segment.LineBreak); } return(result); }