mod: change interface for rendering of Layouts and Widgets to use a non-const pointer to the renderer instead
All checks were successful
Zig Project Action / Lint, Spell-check and test zig project (push) Successful in 38s
All checks were successful
Zig Project Action / Lint, Spell-check and test zig project (push) Successful in 38s
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
//! Dynamic dispatch for layout implementations.
|
//! Dynamic dispatch for layout implementations.
|
||||||
//! Each layout should at last implement these functions:
|
//! Each layout should at last implement these functions:
|
||||||
//! - handle(this: *@This(), event: Event) anyerror!*std.ArrayList(Event) {}
|
//! - 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 {}
|
//! - deinit(this: *@This()) void {}
|
||||||
//!
|
//!
|
||||||
//! Create a `Layout` using `createFrom(object: anytype)` and use them through
|
//! 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 {
|
const VTable = struct {
|
||||||
handle: *const fn (this: *LayoutType, event: Event) anyerror!*Events,
|
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,
|
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.
|
// 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);
|
return try this.vtable.render(this, renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type {
|
|||||||
}.handle,
|
}.handle,
|
||||||
.render = struct {
|
.render = struct {
|
||||||
// Render the contents of this `Layout`.
|
// 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);
|
const layout: @TypeOf(object) = @ptrFromInt(this.object);
|
||||||
try layout.render(renderer);
|
try layout.render(renderer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type {
|
|||||||
const round_frame = .{ "╭", "─", "╮", "│", "╰", "╯" };
|
const round_frame = .{ "╭", "─", "╮", "│", "╰", "╯" };
|
||||||
const square_frame = .{ "┌", "─", "┐", "│", "└", "┘" };
|
const square_frame = .{ "┌", "─", "┐", "│", "└", "┘" };
|
||||||
|
|
||||||
fn renderFrame(this: *@This(), renderer: Renderer) !void {
|
fn renderFrame(this: *@This(), renderer: *Renderer) !void {
|
||||||
// FIXME: use renderer instead!
|
// FIXME: use renderer instead!
|
||||||
_ = renderer;
|
_ = renderer;
|
||||||
const frame = switch (this.config.frame) {
|
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]);
|
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 renderer.clear(this.size);
|
||||||
try this.renderFrame(renderer);
|
try this.renderFrame(renderer);
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type {
|
|||||||
return &this.events;
|
return &this.events;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(this: *@This(), renderer: Renderer) !void {
|
pub fn render(this: *@This(), renderer: *Renderer) !void {
|
||||||
for (this.elements.items) |*element| {
|
for (this.elements.items) |*element| {
|
||||||
switch (element.*) {
|
switch (element.*) {
|
||||||
.layout => |*layout| {
|
.layout => |*layout| {
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type {
|
|||||||
return &this.events;
|
return &this.events;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(this: *@This(), renderer: Renderer) !void {
|
pub fn render(this: *@This(), renderer: *Renderer) !void {
|
||||||
switch ((&this.element).*) {
|
switch ((&this.element).*) {
|
||||||
.layout => |*layout| {
|
.layout => |*layout| {
|
||||||
try layout.render(renderer);
|
try layout.render(renderer);
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ pub fn Layout(comptime Event: type, comptime Renderer: type) type {
|
|||||||
return &this.events;
|
return &this.events;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(this: *@This(), renderer: Renderer) !void {
|
pub fn render(this: *@This(), renderer: *Renderer) !void {
|
||||||
for (this.elements.items) |*element| {
|
for (this.elements.items) |*element| {
|
||||||
switch (element.*) {
|
switch (element.*) {
|
||||||
.layout => |*layout| {
|
.layout => |*layout| {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ pub fn main() !void {
|
|||||||
const allocator = gpa.allocator();
|
const allocator = gpa.allocator();
|
||||||
|
|
||||||
var app: App = .{};
|
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
|
// FIX: when not running fullscreen, the application needs to screen down accordingly to display the contents
|
||||||
// -> size hint how much should it use?
|
// -> size hint how much should it use?
|
||||||
|
|
||||||
@@ -142,6 +142,6 @@ pub fn main() !void {
|
|||||||
for (events.items) |e| {
|
for (events.items) |e| {
|
||||||
app.postEvent(e);
|
app.postEvent(e);
|
||||||
}
|
}
|
||||||
try layout.render(renderer);
|
try layout.render(&renderer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,11 @@ pub fn Buffered(comptime _: bool) type {
|
|||||||
|
|
||||||
pub fn Direct(comptime _: bool) type {
|
pub fn Direct(comptime _: bool) type {
|
||||||
return struct {
|
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;
|
_ = this;
|
||||||
const anchor = size.anchor;
|
const anchor = size.anchor;
|
||||||
// NOTE: clear entire screen for the first content (derived from the anchor being at the very left-top)
|
// 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;
|
_ = this;
|
||||||
try terminal.setCursorPosition(size.anchor);
|
try terminal.setCursorPosition(size.anchor);
|
||||||
var row: u16 = 0;
|
var row: u16 = 0;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
//! Dynamic dispatch for widget implementations.
|
//! Dynamic dispatch for widget implementations.
|
||||||
//! Each widget should at last implement these functions:
|
//! Each widget should at last implement these functions:
|
||||||
//! - handle(this: *@This(), event: Event) ?Event {}
|
//! - handle(this: *@This(), event: Event) ?Event {}
|
||||||
//! - render(this: *@This(), renderer: Renderer) !void {}
|
//! - render(this: *@This(), renderer: *Renderer) !void {}
|
||||||
//! - deinit(this: *@This()) void {}
|
//! - deinit(this: *@This()) void {}
|
||||||
//!
|
//!
|
||||||
//! Create a `Widget` using `createFrom(object: anytype)` and use them through
|
//! 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 {
|
const VTable = struct {
|
||||||
handle: *const fn (this: *WidgetType, event: Event) ?Event,
|
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,
|
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`).
|
// 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);
|
try this.vtable.render(this, renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type {
|
|||||||
}.handle,
|
}.handle,
|
||||||
.render = struct {
|
.render = struct {
|
||||||
// Return the entire content of this `Widget`.
|
// 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);
|
const widget: @TypeOf(object) = @ptrFromInt(this.object);
|
||||||
try widget.render(renderer);
|
try widget.render(renderer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(this: *@This(), renderer: Renderer) !void {
|
pub fn render(this: *@This(), renderer: *Renderer) !void {
|
||||||
try renderer.clear(this.size);
|
try renderer.clear(this.size);
|
||||||
try terminal.setCursorPosition(this.size.anchor);
|
try terminal.setCursorPosition(this.size.anchor);
|
||||||
if (this.size.rows >= this.line_index.items.len) {
|
if (this.size.rows >= this.line_index.items.len) {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ pub fn Widget(comptime Event: type, comptime Renderer: type) type {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(this: *@This(), renderer: Renderer) !void {
|
pub fn render(this: *@This(), renderer: *Renderer) !void {
|
||||||
try renderer.clear(this.size);
|
try renderer.clear(this.size);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user