地圖 (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
12 pub fn init(alloc: std.mem.Allocator) Self {
13 return Self{
14 .alloc = alloc,
15 .items = std.ArrayList(T).init(alloc),
16 .selected = 0,
17 };
18 }
19
20 pub fn deinit(self: *Self) void {
21 self.items.deinit();
22 }
23
24 pub fn append(self: *Self, item: T) !void {
25 try self.items.append(item);
26 }
27
28 pub fn clear(self: *Self) void {
29 self.items.clearAndFree();
30 self.selected = 0;
31 }
32
33 pub fn fromArray(self: *Self, array: []const T) !void {
34 for (array) |item| {
35 try self.append(item);
36 }
37 }
38
39 pub fn get(self: Self, index: usize) !T {
40 if (index + 1 > self.len()) {
41 return error.OutOfBounds;
42 }
43
44 return self.all()[index];
45 }
46
47 pub fn getSelected(self: *Self) !?T {
48 if (self.len() > 0) {
49 if (self.selected >= self.len()) {
50 self.selected = self.len() - 1;
51 }
52
53 return try self.get(self.selected);
54 }
55
56 return null;
57 }
58
59 pub fn all(self: Self) []T {
60 return self.items.items;
61 }
62
63 pub fn len(self: Self) usize {
64 return self.items.items.len;
65 }
66
67 pub fn next(self: *Self) void {
68 if (self.selected + 1 < self.len()) {
69 self.selected += 1;
70 }
71 }
72
73 pub fn previous(self: *Self) void {
74 if (self.selected > 0) {
75 self.selected -= 1;
76 }
77 }
78
79 pub fn selectLast(self: *Self) void {
80 self.selected = self.len() - 1;
81 }
82
83 pub fn selectFirst(self: *Self) void {
84 self.selected = 0;
85 }
86 };
87}