diff --git a/build.zig b/build.zig index 522aff7..d1cdc24 100644 --- a/build.zig +++ b/build.zig @@ -41,6 +41,7 @@ pub fn build(b: *std.Build) void { split_view, table, text_input, + text_view, vaxis, view, vt, diff --git a/examples/text_view.zig b/examples/text_view.zig new file mode 100644 index 0000000..73e8e54 --- /dev/null +++ b/examples/text_view.zig @@ -0,0 +1,66 @@ +const std = @import("std"); +const log = std.log.scoped(.main); +const vaxis = @import("vaxis"); + +const TextView = vaxis.widgets.TextView; + +const Event = union(enum) { + key_press: vaxis.Key, + winsize: vaxis.Winsize, +}; + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + + defer { + const deinit_status = gpa.deinit(); + if (deinit_status == .leak) { + log.err("memory leak", .{}); + } + } + + const alloc = gpa.allocator(); + var buffer: [1024]u8 = undefined; + var tty = try vaxis.Tty.init(&buffer); + defer tty.deinit(); + var vx = try vaxis.init(alloc, .{}); + defer vx.deinit(alloc, tty.writer()); + var loop: vaxis.Loop(Event) = .{ + .vaxis = &vx, + .tty = &tty, + }; + try loop.init(); + try loop.start(); + defer loop.stop(); + try vx.enterAltScreen(tty.writer()); + try vx.queryTerminal(tty.writer(), 20 * std.time.ns_per_s); + var text_view = TextView{}; + var text_view_buffer = TextView.Buffer{}; + defer text_view_buffer.deinit(alloc); + try text_view_buffer.append(alloc, .{ .bytes = "Press Enter to add a line, Up/Down to scroll, 'c' to close." }); + + var counter: i32 = 0; + var lineBuf: [128]u8 = undefined; + + while (true) { + const event = loop.nextEvent(); + switch (event) { + .key_press => |key| { + // Close demo + if (key.matches('c', .{})) break; + if (key.matches(vaxis.Key.enter, .{})) { + counter += 1; + const new_content = try std.fmt.bufPrint(&lineBuf, "\nLine {d}", .{counter}); + try text_view_buffer.append(alloc, .{ .bytes = new_content }); + } + text_view.input(key); + }, + .winsize => |ws| try vx.resize(alloc, tty.writer(), ws), + } + const win = vx.window(); + win.clear(); + text_view.draw(win, text_view_buffer); + try vx.render(tty.writer()); + try tty.writer.flush(); + } +} diff --git a/src/widgets/TextView.zig b/src/widgets/TextView.zig index 6d94157..45f9e44 100644 --- a/src/widgets/TextView.zig +++ b/src/widgets/TextView.zig @@ -85,7 +85,8 @@ pub const Buffer = struct { while (iter.next()) |result| { if (prev_break and !result.is_break) { // Start of a new grapheme - grapheme_start = iter.i - std.unicode.utf8CodepointSequenceLength(result.cp) catch 1; + const cp_len: usize = std.unicode.utf8CodepointSequenceLength(result.cp) catch 1; + grapheme_start = iter.i - cp_len; } if (result.is_break) {