using System;
using System.Collections.Generic;
using System.Linq;
using Spectre.Console.Internal;
using Spectre.Console.Rendering;
namespace Spectre.Console
{
///
/// Renders things in rows.
///
public sealed class Rows : Renderable, IExpandable
{
private readonly List _children;
///
public bool Expand { get; set; }
///
/// Initializes a new instance of the class.
///
/// The items to render as rows.
public Rows(params IRenderable[] items)
: this((IEnumerable)items)
{
}
///
/// Initializes a new instance of the class.
///
/// The items to render as rows.
public Rows(IEnumerable children)
{
_children = new List(children ?? throw new ArgumentNullException(nameof(children)));
}
///
protected override Measurement Measure(RenderContext context, int maxWidth)
{
if (Expand)
{
return new Measurement(maxWidth, maxWidth);
}
else
{
var measurements = _children.Select(c => c.Measure(context, maxWidth));
return new Measurement(
measurements.Min(c => c.Min),
measurements.Min(c => c.Max));
}
}
///
protected override IEnumerable Render(RenderContext context, int maxWidth)
{
var result = new List();
foreach (var child in _children)
{
var segments = child.Render(context, maxWidth);
foreach (var (_, _, last, segment) in segments.Enumerate())
{
result.Add(segment);
if (last)
{
if (!segment.IsLineBreak)
{
result.Add(Segment.LineBreak);
}
}
}
}
return result;
}
}
}