From 8ae9129403d02f2a0253bb81c70163e64f71a9c1 Mon Sep 17 00:00:00 2001 From: Yves Biener Date: Sun, 10 Nov 2024 16:02:49 +0100 Subject: [PATCH] fix(widget): respect size for RawText and Spacer Widgets --- src/layout/VStack.zig | 15 +-------------- src/render.zig | 4 ++-- src/widget/RawText.zig | 6 +++--- src/widget/Spacer.zig | 14 +++++++++----- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/layout/VStack.zig b/src/layout/VStack.zig index 88e532e..40d70f5 100644 --- a/src/layout/VStack.zig +++ b/src/layout/VStack.zig @@ -142,25 +142,12 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { pub fn render(this: *@This(), renderer: Renderer) !void { // FIX: renderer should clear only what is going to change! (i.e. the 'active' widget / layout) - try renderer.clear(this.anchor, this.size); - var overflow = this.size.rows % this.elements.items.len; - for (this.elements.items, 0..) |*element, i| { - const row_mul: u16 = @truncate(i); - var row = row_mul * this.element_rows + 1; - if (i > 0 and overflow > 0) { - overflow -|= 1; - row += 1; - } - // TODO: that's the anchor of each component (only necessary for each widget rendering) - const pos: terminal.Position = .{ .col = 1, .row = row }; - // TODO: do this using the renderer - try terminal.setCursorPosition(pos); + for (this.elements.items) |*element| { switch (element.*) { .layout => |*layout| { try layout.render(renderer); }, .widget => |*widget| { - // TODO: clear per widget if necesary (i.e. can I query that?) try widget.render(renderer); }, } diff --git a/src/render.zig b/src/render.zig index 12726f5..59255d9 100644 --- a/src/render.zig +++ b/src/render.zig @@ -43,9 +43,9 @@ pub fn Buffered(comptime fullscreen: bool) type { pub fn Plain(comptime _: bool) type { return struct { - pub fn clear(this: @This(), anchor: Position, size: Size) !void { + pub fn clear(this: @This(), size: Size) !void { _ = this; - _ = size; + const anchor = size.anchor; // NOTE: clear entire screen for the first content (derived from the anchor being at the very left-top) if (anchor.col == 1 and anchor.row == 1) { try terminal.clearScreen(); diff --git a/src/widget/RawText.zig b/src/widget/RawText.zig index 36f3ec2..5833849 100644 --- a/src/widget/RawText.zig +++ b/src/widget/RawText.zig @@ -76,16 +76,16 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type { } pub fn render(this: *@This(), renderer: Renderer) !void { + try renderer.clear(this.size); try terminal.setCursorPosition(this.size.anchor); // TODO: render `this.contents` - _ = renderer; if (this.size.rows >= this.line_index.items.len) { _ = try terminal.write(this.contents.items); } else { // more rows than we can display const i = this.line_index.items[this.line]; - const e = this.size.rows + this.line + 1; - if (e >= this.line_index.items.len) { + const e = this.size.rows + this.line; + if (e > this.line_index.items.len) { _ = try terminal.write(this.contents.items[i..]); } // last line should not end with the last character (likely a newline character) diff --git a/src/widget/Spacer.zig b/src/widget/Spacer.zig index b347a24..d1e36ee 100644 --- a/src/widget/Spacer.zig +++ b/src/widget/Spacer.zig @@ -11,6 +11,8 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type { @compileError("Provided user event `Event` for `Layout(comptime Event: type)` is not of type `union(enum)`."); } return struct { + size: terminal.Size = undefined, + pub fn init() @This() { return .{}; } @@ -20,15 +22,17 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type { } pub fn handle(this: *@This(), event: Event) ?Event { - _ = this; - _ = event; + switch (event) { + .resize => |size| { + this.size = size; + }, + else => {}, + } return null; } pub fn render(this: *@This(), renderer: Renderer) !void { - // FIX: this should rather clear the `terminal.Size` provided through the event system using the _renderer_. - _ = this; - _ = renderer; + try renderer.clear(this.size); } }; }