mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-16 00:42:51 +08:00

* Add width to panels * Add height to panels * Replace RenderContext with RenderOptions * Remove exclusivity from alternative buffer * Add Layout widget * Add Align widget
139 lines
3.8 KiB
C#
139 lines
3.8 KiB
C#
namespace Spectre.Console;
|
|
|
|
internal static class Aligner
|
|
{
|
|
public static string Align(string text, Justify? alignment, int maxWidth)
|
|
{
|
|
if (alignment == null || alignment == Justify.Left)
|
|
{
|
|
return text;
|
|
}
|
|
|
|
var width = Cell.GetCellLength(text);
|
|
if (width >= maxWidth)
|
|
{
|
|
return text;
|
|
}
|
|
|
|
switch (alignment)
|
|
{
|
|
case Justify.Right:
|
|
{
|
|
var diff = maxWidth - width;
|
|
return new string(' ', diff) + text;
|
|
}
|
|
|
|
case Justify.Center:
|
|
{
|
|
var diff = (maxWidth - width) / 2;
|
|
|
|
var left = new string(' ', diff);
|
|
var right = new string(' ', diff);
|
|
|
|
// Right side
|
|
var remainder = (maxWidth - width) % 2;
|
|
if (remainder != 0)
|
|
{
|
|
right += new string(' ', remainder);
|
|
}
|
|
|
|
return left + text + right;
|
|
}
|
|
|
|
default:
|
|
throw new NotSupportedException("Unknown alignment");
|
|
}
|
|
}
|
|
|
|
public static void Align<T>(T segments, Justify? alignment, int maxWidth)
|
|
where T : List<Segment>
|
|
{
|
|
if (alignment == null || alignment == Justify.Left)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var width = Segment.CellCount(segments);
|
|
if (width >= maxWidth)
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch (alignment)
|
|
{
|
|
case Justify.Right:
|
|
{
|
|
var diff = maxWidth - width;
|
|
segments.Insert(0, Segment.Padding(diff));
|
|
break;
|
|
}
|
|
|
|
case Justify.Center:
|
|
{
|
|
// Left side.
|
|
var diff = (maxWidth - width) / 2;
|
|
segments.Insert(0, Segment.Padding(diff));
|
|
|
|
// Right side
|
|
segments.Add(Segment.Padding(diff));
|
|
var remainder = (maxWidth - width) % 2;
|
|
if (remainder != 0)
|
|
{
|
|
segments.Add(Segment.Padding(remainder));
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
throw new NotSupportedException("Unknown alignment");
|
|
}
|
|
}
|
|
|
|
public static void AlignHorizontally<T>(T segments, HorizontalAlignment alignment, int maxWidth)
|
|
where T : List<Segment>
|
|
{
|
|
var width = Segment.CellCount(segments);
|
|
if (width >= maxWidth)
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch (alignment)
|
|
{
|
|
case HorizontalAlignment.Left:
|
|
{
|
|
var diff = maxWidth - width;
|
|
segments.Add(Segment.Padding(diff));
|
|
break;
|
|
}
|
|
|
|
case HorizontalAlignment.Right:
|
|
{
|
|
var diff = maxWidth - width;
|
|
segments.Insert(0, Segment.Padding(diff));
|
|
break;
|
|
}
|
|
|
|
case HorizontalAlignment.Center:
|
|
{
|
|
// Left side.
|
|
var diff = (maxWidth - width) / 2;
|
|
segments.Insert(0, Segment.Padding(diff));
|
|
|
|
// Right side
|
|
segments.Add(Segment.Padding(diff));
|
|
var remainder = (maxWidth - width) % 2;
|
|
if (remainder != 0)
|
|
{
|
|
segments.Add(Segment.Padding(remainder));
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
throw new NotSupportedException("Unknown alignment");
|
|
}
|
|
}
|
|
} |