From f32f80dc57d8b0c8446a72ea0d382f3048f8bac1 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 21 Jun 2025 12:30:18 +0200 Subject: [PATCH] Fix resizing of Live views with reduced size. (#1840) --- src/Spectre.Console/Live/LiveDisplayRenderer.cs | 3 +-- src/Spectre.Console/Live/LiveRenderable.cs | 10 +++++++++- .../Live/Progress/Renderers/DefaultProgressRenderer.cs | 2 +- .../Prompts/List/ListPromptRenderHook.cs | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Spectre.Console/Live/LiveDisplayRenderer.cs b/src/Spectre.Console/Live/LiveDisplayRenderer.cs index a9a1a52..6e5e95a 100644 --- a/src/Spectre.Console/Live/LiveDisplayRenderer.cs +++ b/src/Spectre.Console/Live/LiveDisplayRenderer.cs @@ -4,7 +4,6 @@ internal sealed class LiveDisplayRenderer : IRenderHook { private readonly IAnsiConsole _console; private readonly LiveDisplayContext _context; - public LiveDisplayRenderer(IAnsiConsole console, LiveDisplayContext context) { _console = console; @@ -45,7 +44,7 @@ internal sealed class LiveDisplayRenderer : IRenderHook { lock (_context.Lock) { - yield return _context.Live.PositionCursor(); + yield return _context.Live.PositionCursor(options); foreach (var renderable in renderables) { diff --git a/src/Spectre.Console/Live/LiveRenderable.cs b/src/Spectre.Console/Live/LiveRenderable.cs index 40107f9..f43fc82 100644 --- a/src/Spectre.Console/Live/LiveRenderable.cs +++ b/src/Spectre.Console/Live/LiveRenderable.cs @@ -39,7 +39,7 @@ internal sealed class LiveRenderable : Renderable } } - public IRenderable PositionCursor() + public IRenderable PositionCursor(RenderOptions options) { lock (_lock) { @@ -48,6 +48,14 @@ internal sealed class LiveRenderable : Renderable return new ControlCode(string.Empty); } + // Check if the size have been reduced + if (_shape.Value.Height > options.ConsoleSize.Height || _shape.Value.Width > options.ConsoleSize.Width) + { + // Important reset shape, so the size can shrink + _shape = null; + return new ControlCode(ED(2) + ED(3) + CUP(1, 1)); + } + var linesToMoveUp = _shape.Value.Height - 1; return new ControlCode("\r" + CUU(linesToMoveUp)); } diff --git a/src/Spectre.Console/Live/Progress/Renderers/DefaultProgressRenderer.cs b/src/Spectre.Console/Live/Progress/Renderers/DefaultProgressRenderer.cs index 0607f2d..6a818ee 100644 --- a/src/Spectre.Console/Live/Progress/Renderers/DefaultProgressRenderer.cs +++ b/src/Spectre.Console/Live/Progress/Renderers/DefaultProgressRenderer.cs @@ -118,7 +118,7 @@ internal sealed class DefaultProgressRenderer : ProgressRenderer { lock (_lock) { - yield return _live.PositionCursor(); + yield return _live.PositionCursor(options); foreach (var renderable in renderables) { diff --git a/src/Spectre.Console/Prompts/List/ListPromptRenderHook.cs b/src/Spectre.Console/Prompts/List/ListPromptRenderHook.cs index 090a2f6..36b3ee9 100644 --- a/src/Spectre.Console/Prompts/List/ListPromptRenderHook.cs +++ b/src/Spectre.Console/Prompts/List/ListPromptRenderHook.cs @@ -42,7 +42,7 @@ internal sealed class ListPromptRenderHook : IRenderHook _dirty = false; } - yield return _live.PositionCursor(); + yield return _live.PositionCursor(options); foreach (var renderable in renderables) {