Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2297,6 +2297,13 @@
public static Spectre.Console.Layout Ratio(this Spectre.Console.Layout layout, int ratio) { }
public static Spectre.Console.Layout Size(this Spectre.Console.Layout layout, int size) { }
}
public sealed class LineNumbers : Spectre.Console.Rendering.Renderable
{
public LineNumbers(params Spectre.Console.Rendering.IRenderable[] items) { }
public LineNumbers(System.Collections.Generic.IEnumerable<Spectre.Console.Rendering.IRenderable> children) { }
protected override Spectre.Console.Rendering.Measurement Measure(Spectre.Console.Rendering.RenderOptions options, int maxWidth) { }
protected override System.Collections.Generic.IEnumerable<Spectre.Console.Rendering.Segment> Render(Spectre.Console.Rendering.RenderOptions options, int maxWidth) { }
}
public sealed class LiveDisplay
{
public LiveDisplay(Spectre.Console.IAnsiConsole console, Spectre.Console.Rendering.IRenderable target) { }
Expand Down
81 changes: 81 additions & 0 deletions src/Spectre.Console/Widgets/LineNumbers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
namespace Spectre.Console;

/// <summary>
/// Renders things in rows.
Comment thread
AntekOlszewski marked this conversation as resolved.
Outdated
/// </summary>
public sealed class LineNumbers : Renderable
{
private readonly List<IRenderable> _children;

/// <summary>
/// Initializes a new instance of the <see cref="LineNumbers"/> class.
/// </summary>
/// <param name="items">The items to render with line numbers.</param>
public LineNumbers(params IRenderable[] items)
: this((IEnumerable<IRenderable>)items)
{
}

/// <summary>
/// Initializes a new instance of the <see cref="LineNumbers"/> class.
/// </summary>
/// <param name="children">The items to render with line numbers.</param>
public LineNumbers(IEnumerable<IRenderable> children)
{
_children = new List<IRenderable>(children ?? throw new ArgumentNullException(nameof(children)));
}

/// <inheritdoc/>
protected override Measurement Measure(RenderOptions options, int maxWidth)
{
var measurements = _children.Select(c => c.Measure(options, maxWidth)).ToArray();
if (measurements.Length > 0)
{
return new Measurement(
measurements.Max(c => c.Min),
measurements.Max(c => c.Max));
}

return new Measurement(0, 0);
}

/// <inheritdoc/>
protected override IEnumerable<Segment> Render(RenderOptions options, int maxWidth)
{
var segments = new List<Segment>();
var result = new List<Segment>();

foreach (var child in _children)
{
var childSegments = child.Render(options, maxWidth);
foreach (var (_, _, _, segment) in childSegments.Enumerate())
segments.Add(segment);
Comment thread
AntekOlszewski marked this conversation as resolved.
}

var lineNumber = 1;
var totalLines = segments.Count(s => s.IsLineBreak) + 1;
var padding = totalLines.ToString().Length + 1;

if (segments.Count > 0)
result.Add(GetLineNumber(lineNumber, padding));
Comment thread
AntekOlszewski marked this conversation as resolved.

foreach (var segment in segments)
{
result.Add(segment);

if (segment.IsLineBreak)
{
lineNumber++;
result.Add(GetLineNumber(lineNumber, padding));
}
}

return result;
}

private static Segment GetLineNumber(int lineNumber, int padding)
{
var paddedLineNumber = lineNumber.ToString().PadRight(padding);
return new Segment(paddedLineNumber);
}
}