╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ Settings.zig ─────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
62 const logged_out_message = 63 \\you must be logged in to see settings. 64 \\ 65 \\here's an emoticon from the early 2000s instead: 66 \\ 67 \\<('o'<) ^( '-' )^ (>'o')> 68 \\ 69 \\hope it helps. 70 ; 71 72 var message = try wgt.TextBox(ui.Widget).init(allocator, logged_out_message, .{ .border_style = null, .rounded_corners = false, .wrap_kind = .word }); 73 errdefer message.deinit(allocator); 74 try stack.children.put(allocator, message.getFocus().id, .{ .text_box = message }); 75 } 76 77 return .{ 78 .center = try ui.Center.init(allocator, .{ .stack = stack }), 79 .session = session, 80 .button_id = button_id, 81 }; 82 } 83 84 pub fn deinit(self: *View, allocator: std.mem.Allocator) void { 85 self.center.deinit(allocator); 86 } 87 88 pub fn build(self: *View, allocator: std.mem.Allocator, constraint: layout.Constraint, root_focus: *Focus) !void { 89 // select the logged-in view when logged in, else the logged-out view. 90 // decided per-frame since the tty doesn't rebuild the page on login. 91 const logged_in = self.session.data.user_id != null; 92 const stack = &self.center.child.stack; 93 if (logged_in) { 94 const box = &stack.children.values()[logged_in_index].box; 95 const button = &box.children.values()[0].widget.text_box; 96 button.box.children.values()[0].widget.text.content = ansiLabel(self.session); 97 } 98 stack.getFocus().child_id = stack.children.keys()[if (logged_in) logged_in_index else logged_out_index]; 99 try self.center.build(allocator, constraint, root_focus); 100 } 101 102 pub fn input(self: *View, allocator: std.mem.Allocator, key: Key, root_focus: *Focus) !void { 103 _ = allocator; 104 if (self.session.data.user_id == null) return; // blank/disabled when logged out 105 switch (key) { 106 .enter => try self.toggle(), 107 .mouse => |mouse| { 108 if (mouse.action == .press and mouse.action.press == .left) { 109 if (root_focus.children.get(self.button_id)) |entry| { 110 const r = entry.rect; 111 if (mouse.x >= r.x and mouse.y >= r.y and 112 mouse.x < r.x + r.size.width and mouse.y < r.y + r.size.height) 113 { 114 try self.toggle(); 115 } 116 } 117 } 118 }, 119 else => {}, 120 } 121 } 122 123 fn toggle(self: *View) !void { 124 try self.session.push(.toggle_ansi); 125 } 126 127 pub fn clearGrid(self: *View) void { 128 self.center.clearGrid(); 129 } 130 131 pub fn getGrid(self: View) ?Grid { 132 return self.center.getGrid(); 133 } 134 135 pub fn getFocus(self: *View) *Focus { 136 return self.center.getFocus(); 137 } 138 139 pub fn getSelectedIndex(self: View) ?usize { 140 _ = self; 141 return 0; 142 } 143 }; 144 145 fn ansiLabel(session: *const ui.Session) []const u8 { 146 const label_on = "turn off ANSI art"; 147 const label_off = "turn on ANSI art"; 148 return if (session.data.enable_ansi) label_on else label_off; 149 } 150