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