地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.
at v0.2.0 82 lines 2.2 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 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}