From d2d655c8293b329421e1fe525c8141d245c502da Mon Sep 17 00:00:00 2001 From: Yves Biener Date: Mon, 11 Nov 2024 13:47:01 +0100 Subject: [PATCH] mod: change interface for rendering of `Layout`s and `Widget`s to use a non-const pointer to the renderer instead --- src/layout.zig | 8 ++++---- src/layout/Framing.zig | 4 ++-- src/layout/HStack.zig | 2 +- src/layout/Padding.zig | 2 +- src/layout/VStack.zig | 2 +- src/main.zig | 4 ++-- src/render.zig | 8 ++++++-- src/widget.zig | 8 ++++---- src/widget/RawText.zig | 2 +- src/widget/Spacer.zig | 2 +- 10 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/layout.zig b/src/layout.zig index 80ee1b4..16ff1d0 100644 --- a/src/layout.zig +++ b/src/layout.zig @@ -1,7 +1,7 @@ //! Dynamic dispatch for layout implementations. //! Each layout should at last implement these functions: //! - handle(this: *@This(), event: Event) anyerror!*std.ArrayList(Event) {} -//! - render(this: *@This(), renderer: Renderer) anyerror!void {} +//! - render(this: *@This(), renderer: *Renderer) anyerror!void {} //! - deinit(this: *@This()) void {} //! //! Create a `Layout` using `createFrom(object: anytype)` and use them through @@ -28,7 +28,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { const VTable = struct { handle: *const fn (this: *LayoutType, event: Event) anyerror!*Events, - render: *const fn (this: *LayoutType, renderer: Renderer) anyerror!void, + render: *const fn (this: *LayoutType, renderer: *Renderer) anyerror!void, deinit: *const fn (this: *LayoutType) void, }; @@ -41,7 +41,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { } // Render this `Layout` completely. This will render contained sub-elements too. - pub fn render(this: *LayoutType, renderer: Renderer) !void { + pub fn render(this: *LayoutType, renderer: *Renderer) !void { return try this.vtable.render(this, renderer); } @@ -63,7 +63,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { }.handle, .render = struct { // Render the contents of this `Layout`. - fn render(this: *LayoutType, renderer: Renderer) !void { + fn render(this: *LayoutType, renderer: *Renderer) !void { const layout: @TypeOf(object) = @ptrFromInt(this.object); try layout.render(renderer); } diff --git a/src/layout/Framing.zig b/src/layout/Framing.zig index 16c3539..e0bc6a2 100644 --- a/src/layout/Framing.zig +++ b/src/layout/Framing.zig @@ -118,7 +118,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { const round_frame = .{ "╭", "─", "╮", "│", "╰", "╯" }; const square_frame = .{ "┌", "─", "┐", "│", "└", "┘" }; - fn renderFrame(this: *@This(), renderer: Renderer) !void { + fn renderFrame(this: *@This(), renderer: *Renderer) !void { // FIXME: use renderer instead! _ = renderer; const frame = switch (this.config.frame) { @@ -167,7 +167,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { try this.config.style.value(writer, frame[5]); } - pub fn render(this: *@This(), renderer: Renderer) !void { + pub fn render(this: *@This(), renderer: *Renderer) !void { try renderer.clear(this.size); try this.renderFrame(renderer); diff --git a/src/layout/HStack.zig b/src/layout/HStack.zig index 8d2ad5f..7014824 100644 --- a/src/layout/HStack.zig +++ b/src/layout/HStack.zig @@ -138,7 +138,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { return &this.events; } - pub fn render(this: *@This(), renderer: Renderer) !void { + pub fn render(this: *@This(), renderer: *Renderer) !void { for (this.elements.items) |*element| { switch (element.*) { .layout => |*layout| { diff --git a/src/layout/Padding.zig b/src/layout/Padding.zig index 773dbab..03b9401 100644 --- a/src/layout/Padding.zig +++ b/src/layout/Padding.zig @@ -123,7 +123,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { return &this.events; } - pub fn render(this: *@This(), renderer: Renderer) !void { + pub fn render(this: *@This(), renderer: *Renderer) !void { switch ((&this.element).*) { .layout => |*layout| { try layout.render(renderer); diff --git a/src/layout/VStack.zig b/src/layout/VStack.zig index d5b1a2b..b948510 100644 --- a/src/layout/VStack.zig +++ b/src/layout/VStack.zig @@ -137,7 +137,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type { return &this.events; } - pub fn render(this: *@This(), renderer: Renderer) !void { + pub fn render(this: *@This(), renderer: *Renderer) !void { for (this.elements.items) |*element| { switch (element.*) { .layout => |*layout| { diff --git a/src/main.zig b/src/main.zig index 8355a88..a47e6a6 100644 --- a/src/main.zig +++ b/src/main.zig @@ -26,7 +26,7 @@ pub fn main() !void { const allocator = gpa.allocator(); var app: App = .{}; - const renderer: App.Renderer = .{}; + var renderer: App.Renderer = .{}; // FIX: when not running fullscreen, the application needs to screen down accordingly to display the contents // -> size hint how much should it use? @@ -142,6 +142,6 @@ pub fn main() !void { for (events.items) |e| { app.postEvent(e); } - try layout.render(renderer); + try layout.render(&renderer); } } diff --git a/src/render.zig b/src/render.zig index 6b03e7c..5d8a9b4 100644 --- a/src/render.zig +++ b/src/render.zig @@ -44,7 +44,11 @@ pub fn Buffered(comptime _: bool) type { pub fn Direct(comptime _: bool) type { return struct { - pub fn clear(this: @This(), size: Size) !void { + pub fn resize(this: *@This(), size: Size) void { + _ = this; + _ = size; + } + pub fn clear(this: *@This(), size: Size) !void { _ = this; const anchor = size.anchor; // NOTE: clear entire screen for the first content (derived from the anchor being at the very left-top) @@ -53,7 +57,7 @@ pub fn Direct(comptime _: bool) type { } } - pub fn render(this: @This(), size: Size, contents: []u8) !void { + pub fn render(this: *@This(), size: Size, contents: []u8) !void { _ = this; try terminal.setCursorPosition(size.anchor); var row: u16 = 0; diff --git a/src/widget.zig b/src/widget.zig index 514d294..40421ea 100644 --- a/src/widget.zig +++ b/src/widget.zig @@ -1,7 +1,7 @@ //! Dynamic dispatch for widget implementations. //! Each widget should at last implement these functions: //! - handle(this: *@This(), event: Event) ?Event {} -//! - render(this: *@This(), renderer: Renderer) !void {} +//! - render(this: *@This(), renderer: *Renderer) !void {} //! - deinit(this: *@This()) void {} //! //! Create a `Widget` using `createFrom(object: anytype)` and use them through @@ -27,7 +27,7 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type { const VTable = struct { handle: *const fn (this: *WidgetType, event: Event) ?Event, - render: *const fn (this: *WidgetType, renderer: Renderer) anyerror!void, + render: *const fn (this: *WidgetType, renderer: *Renderer) anyerror!void, deinit: *const fn (this: *WidgetType) void, }; @@ -51,7 +51,7 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type { } // Render the content of this `Widget` given the `Size` of the widget (.resize System`Event`). - pub fn render(this: *WidgetType, renderer: Renderer) !void { + pub fn render(this: *WidgetType, renderer: *Renderer) !void { try this.vtable.render(this, renderer); } @@ -73,7 +73,7 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type { }.handle, .render = struct { // Return the entire content of this `Widget`. - fn render(this: *WidgetType, renderer: Renderer) !void { + fn render(this: *WidgetType, renderer: *Renderer) !void { const widget: @TypeOf(object) = @ptrFromInt(this.object); try widget.render(renderer); } diff --git a/src/widget/RawText.zig b/src/widget/RawText.zig index a9749b9..7f4b336 100644 --- a/src/widget/RawText.zig +++ b/src/widget/RawText.zig @@ -75,7 +75,7 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type { return null; } - pub fn render(this: *@This(), renderer: Renderer) !void { + pub fn render(this: *@This(), renderer: *Renderer) !void { try renderer.clear(this.size); try terminal.setCursorPosition(this.size.anchor); if (this.size.rows >= this.line_index.items.len) { diff --git a/src/widget/Spacer.zig b/src/widget/Spacer.zig index d1e36ee..633c960 100644 --- a/src/widget/Spacer.zig +++ b/src/widget/Spacer.zig @@ -31,7 +31,7 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type { return null; } - pub fn render(this: *@This(), renderer: Renderer) !void { + pub fn render(this: *@This(), renderer: *Renderer) !void { try renderer.clear(this.size); } };