this repo has no description
1const std = @import("std");
2const log = std.log.scoped(.main);
3const vaxis = @import("vaxis");
4
5const TextView = vaxis.widgets.TextView;
6
7const Event = union(enum) {
8 key_press: vaxis.Key,
9 winsize: vaxis.Winsize,
10};
11
12pub fn main() !void {
13 var gpa = std.heap.GeneralPurposeAllocator(.{}){};
14
15 defer {
16 const deinit_status = gpa.deinit();
17 if (deinit_status == .leak) {
18 log.err("memory leak", .{});
19 }
20 }
21
22 const alloc = gpa.allocator();
23 var buffer: [1024]u8 = undefined;
24 var tty = try vaxis.Tty.init(&buffer);
25 defer tty.deinit();
26 var vx = try vaxis.init(alloc, .{});
27 defer vx.deinit(alloc, tty.writer());
28 var loop: vaxis.Loop(Event) = .{
29 .vaxis = &vx,
30 .tty = &tty,
31 };
32 try loop.init();
33 try loop.start();
34 defer loop.stop();
35 try vx.enterAltScreen(tty.writer());
36 try vx.queryTerminal(tty.writer(), 20 * std.time.ns_per_s);
37 var text_view = TextView{};
38 var text_view_buffer = TextView.Buffer{};
39 defer text_view_buffer.deinit(alloc);
40 try text_view_buffer.append(alloc, .{ .bytes = "Press Enter to add a line, Up/Down to scroll, 'c' to close." });
41
42 var counter: i32 = 0;
43 var lineBuf: [128]u8 = undefined;
44
45 while (true) {
46 const event = loop.nextEvent();
47 switch (event) {
48 .key_press => |key| {
49 // Close demo
50 if (key.matches('c', .{})) break;
51 if (key.matches(vaxis.Key.enter, .{})) {
52 counter += 1;
53 const new_content = try std.fmt.bufPrint(&lineBuf, "\nLine {d}", .{counter});
54 try text_view_buffer.append(alloc, .{ .bytes = new_content });
55 }
56 text_view.input(key);
57 },
58 .winsize => |ws| try vx.resize(alloc, tty.writer(), ws),
59 }
60 const win = vx.window();
61 win.clear();
62 text_view.draw(win, text_view_buffer);
63 try vx.render(tty.writer());
64 try tty.writer.flush();
65 }
66}