Files
zterm/src/render.zig
Yves Biener b314ff7813
Some checks failed
Zig Project Action / Lint, Spell-check and test zig project (push) Failing after 30s
mod: replace Layout.content with Layout.render
The App.Renderer is used for the new `Layout.render` method. Each layout
renders itself now with corresponding renderers which might only update
parts of the screen, etc.
2024-11-10 14:34:28 +01:00

64 lines
2.1 KiB
Zig

//! Renderer which holds the screen to compare with the previous screen for efficient rendering.
const std = @import("std");
const terminal = @import("terminal.zig");
const Contents = std.ArrayList(u8);
const Position = terminal.Position;
const Size = terminal.Size;
pub fn Buffered(comptime fullscreen: bool) type {
return struct {
refresh: bool = false,
size: terminal.Size = undefined,
screen: Contents = undefined,
pub fn init(allocator: std.mem.Allocator) @This() {
return .{
.fullscreen = fullscreen,
.screen = Contents.init(allocator),
};
}
pub fn deinit(this: *@This()) void {
this.screen.deinit();
this.* = undefined;
}
pub fn resize(this: *@This(), size: Size) void {
// TODO: are there size changes which impact the corresponding rendered content?
// -> can I even be sure nothing needs to be re-rendered?
this.size = size;
this.refresh = true;
}
pub fn render(this: *@This(), content: *Contents) !void {
// TODO: put the corresponding screen to the terminal
// -> determine diff between screen and new content and only update the corresponding characters of the terminal
_ = this;
_ = content;
@panic("Not yet implemented.");
}
};
}
pub fn Plain(comptime _: bool) type {
return struct {
pub fn clear(this: @This(), anchor: Position, size: Size) !void {
_ = this;
_ = size;
// 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();
}
}
pub fn render(this: @This(), anchor: Position, size: Size, contents: *Contents) !void {
_ = this;
_ = size;
// FIXME: this should respect the given `size`
try terminal.setCursorPosition(anchor);
_ = try terminal.write(contents.items);
}
};
}