const std = @import("std"); const terminal = @import("../terminal.zig"); const isTaggedUnion = @import("../event.zig").isTaggedUnion; const Error = @import("../event.zig").Error; const log = std.log.scoped(.widget_spacer); pub fn Widget(comptime Event: type, comptime Renderer: type) type { if (!isTaggedUnion(Event)) { @compileError("Provided user event `Event` for `Layout(comptime Event: type)` is not of type `union(enum)`."); } return struct { size: terminal.Size = undefined, size_changed: bool = false, pub fn init() @This() { return .{}; } pub fn deinit(this: *@This()) void { this.* = undefined; } pub fn handle(this: *@This(), event: Event) ?Event { switch (event) { .resize => |size| { this.size = size; this.size_changed = true; }, else => {}, } return null; } pub fn render(this: *@This(), renderer: *Renderer) !void { if (this.size_changed) { try renderer.clear(this.size); this.size_changed = false; } } }; }