This branch will implement the necessary changes for the widgets and their implementations to use the new renderer correctly.
134 lines
4.5 KiB
Zig
134 lines
4.5 KiB
Zig
const std = @import("std");
|
|
const zterm = @import("zterm");
|
|
|
|
const App = zterm.App(
|
|
union(enum) {},
|
|
zterm.Renderer.Buffered,
|
|
true,
|
|
);
|
|
const Key = zterm.Key;
|
|
const Layout = App.Layout;
|
|
const Widget = App.Widget;
|
|
|
|
const log = std.log.scoped(.stack);
|
|
|
|
pub fn main() !void {
|
|
errdefer |err| log.err("Application Error: {any}", .{err});
|
|
|
|
var gpa: std.heap.GeneralPurposeAllocator(.{}) = .{};
|
|
defer {
|
|
const deinit_status = gpa.deinit();
|
|
// fail test; can't try in defer as defer is executed after we return
|
|
if (deinit_status == .leak) {
|
|
log.err("memory leak", .{});
|
|
}
|
|
}
|
|
const allocator = gpa.allocator();
|
|
|
|
var app: App = .{};
|
|
var renderer = App.Renderer.init(allocator);
|
|
defer renderer.deinit();
|
|
// TODO: when not running fullscreen, the application needs to screen down accordingly to display the contents
|
|
// -> size hint how much should it use?
|
|
|
|
var layout = Layout.createFrom(Layout.Framing.init(allocator, .{
|
|
.style = .{
|
|
.fg = .{
|
|
.index = 6,
|
|
},
|
|
},
|
|
.frame = .round,
|
|
.title = .{
|
|
.str = "HStack",
|
|
.style = .{
|
|
.ul_style = .single,
|
|
.ul = .{ .index = 6 },
|
|
.bold = true,
|
|
},
|
|
},
|
|
}, .{
|
|
.layout = Layout.createFrom(Layout.HStack.init(allocator, .{
|
|
Widget.createFrom(Widget.Spacer.init(allocator)),
|
|
Layout.createFrom(Layout.Framing.init(
|
|
allocator,
|
|
.{
|
|
.style = .{
|
|
.fg = .{
|
|
.index = 6,
|
|
},
|
|
},
|
|
.frame = .round,
|
|
.title = .{
|
|
.str = "VStack",
|
|
.style = .{
|
|
.ul_style = .single,
|
|
.ul = .{ .index = 6 },
|
|
.bold = true,
|
|
},
|
|
},
|
|
},
|
|
.{
|
|
.layout = Layout.createFrom(
|
|
Layout.Margin.init(
|
|
allocator,
|
|
.{
|
|
.margin = 10,
|
|
},
|
|
.{
|
|
.layout = Layout.createFrom(Layout.VStack.init(allocator, .{
|
|
// Widget.createFrom(blk: {
|
|
// const file = try std.fs.cwd().openFile("./examples/stack.zig", .{});
|
|
// defer file.close();
|
|
// break :blk Widget.RawText.init(allocator, file);
|
|
// }),
|
|
Widget.createFrom(Widget.Spacer.init(allocator)),
|
|
Widget.createFrom(Widget.Spacer.init(allocator)),
|
|
Widget.createFrom(Widget.Spacer.init(allocator)),
|
|
// Widget.createFrom(blk: {
|
|
// const file = try std.fs.cwd().openFile("./examples/stack.zig", .{});
|
|
// defer file.close();
|
|
// break :blk Widget.RawText.init(allocator, file);
|
|
// }),
|
|
})),
|
|
},
|
|
),
|
|
),
|
|
},
|
|
)),
|
|
Widget.createFrom(Widget.Spacer.init(allocator)),
|
|
})),
|
|
}));
|
|
defer layout.deinit();
|
|
|
|
try app.start(null);
|
|
defer app.stop() catch unreachable;
|
|
|
|
// App.Event loop
|
|
while (true) {
|
|
const event = app.nextEvent();
|
|
log.debug("received event: {s}", .{@tagName(event)});
|
|
|
|
switch (event) {
|
|
.quit => break,
|
|
.resize => |size| {
|
|
renderer.resize(size);
|
|
},
|
|
.key => |key| {
|
|
// ctrl+c to quit
|
|
if (Key.matches(key, .{ .cp = 'c', .mod = .{ .ctrl = true } })) {
|
|
app.quit();
|
|
}
|
|
},
|
|
.err => |err| {
|
|
log.err("Received {any} with message: {s}", .{ err.err, err.msg });
|
|
},
|
|
else => {},
|
|
}
|
|
const events = try layout.handle(event);
|
|
for (events.items) |e| {
|
|
app.postEvent(e);
|
|
}
|
|
try layout.render(&renderer);
|
|
}
|
|
}
|