地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.
at v1.3.0 2.1 kB view raw
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}