spectre.console/src/Spectre.Console/Prompts/List/ListPromptRenderHook.cs
Patrik Svensson c3ec6a7363
Add Layout widget (#1041)
* Add width to panels
* Add height to panels
* Replace RenderContext with RenderOptions
* Remove exclusivity from alternative buffer
* Add Layout widget
* Add Align widget
2022-11-15 10:12:17 +01:00

55 lines
1.4 KiB
C#

namespace Spectre.Console;
internal sealed class ListPromptRenderHook<T> : IRenderHook
where T : notnull
{
private readonly IAnsiConsole _console;
private readonly Func<IRenderable> _builder;
private readonly LiveRenderable _live;
private readonly object _lock;
private bool _dirty;
public ListPromptRenderHook(
IAnsiConsole console,
Func<IRenderable> builder)
{
_console = console ?? throw new ArgumentNullException(nameof(console));
_builder = builder ?? throw new ArgumentNullException(nameof(builder));
_live = new LiveRenderable(console);
_lock = new object();
_dirty = true;
}
public void Clear()
{
_console.Write(_live.RestoreCursor());
}
public void Refresh()
{
_dirty = true;
_console.Write(new ControlCode(string.Empty));
}
public IEnumerable<IRenderable> Process(RenderOptions options, IEnumerable<IRenderable> renderables)
{
lock (_lock)
{
if (!_live.HasRenderable || _dirty)
{
_live.SetRenderable(_builder());
_dirty = false;
}
yield return _live.PositionCursor();
foreach (var renderable in renderables)
{
yield return renderable;
}
yield return _live;
}
}
}