Exemplo n.º 1
0
    /// <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));
    }
Exemplo n.º 2
0
    /// <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));
    }
Exemplo n.º 3
0
    /// <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);
    }