地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.
1const std = @import("std");
2const vaxis = @import("vaxis");
3
4pub fn List(comptime T: type) type {
5 return struct {
6 const Self = @This();
7
8 alloc: std.mem.Allocator,
9 items: std.ArrayList(T),
10 selected: usize,
11 offset: usize,
12
13 pub fn init(alloc: std.mem.Allocator) Self {
14 return Self{
15 .alloc = alloc,
16 .items = std.ArrayList(T).init(alloc),
17 .selected = 0,
18 .offset = 0,
19 };
20 }
21
22 pub fn deinit(self: *Self) void {
23 self.items.deinit();
24 }
25
26 pub fn append(self: *Self, item: T) !void {
27 try self.items.append(item);
28 }
29
30 pub fn clear(self: *Self) void {
31 self.items.clearAndFree();
32 self.selected = 0;
33 self.offset = 0;
34 }
35
36 pub fn get(self: *Self, index: usize) !T {
37 if (index + 1 > self.items.items.len) {
38 return error.OutOfBounds;
39 }
40
41 return self.items.items[index];
42 }
43
44 pub fn all(self: *Self) []T {
45 return self.items.items;
46 }
47
48 pub fn next(self: *Self, win_height: usize) void {
49 if (self.selected + 1 < self.items.items.len) {
50 self.selected += 1;
51
52 if (self.items.items[self.offset..].len != win_height and self.selected >= win_height / 2) {
53 self.offset += 1;
54 }
55 }
56 }
57
58 pub fn previous(self: *Self, win_height: usize) void {
59 _ = win_height;
60
61 if (self.selected > 0) {
62 self.selected -= 1;
63
64 if (self.offset > 0) {
65 self.offset -= 1;
66 }
67 }
68 }
69
70 pub fn select_last(self: *Self, win_height: usize) void {
71 self.selected = self.items.items.len - 1;
72 if (self.selected >= win_height) {
73 self.offset = self.selected - (win_height - 1);
74 }
75 }
76
77 pub fn select_first(self: *Self) void {
78 self.selected = 0;
79 self.offset = 0;
80 }
81 };
82}