╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ Files.zig ────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
1048 .enter => return self.submit(allocator, text_input), 1049 .arrow_right => if (text_input.cursor == text_input.content.items.len) { 1050 if (self.cloneUrl()) |clone_url| { 1051 root_focus.setFocus(clone_url.getFocus().id); 1052 return; 1053 } 1054 }, 1055 else => {}, 1056 } 1057 return text_input.input(allocator, key, root_focus); 1058 } 1059 } 1060 const clone_url = self.cloneUrl() orelse return; 1061 if (key == .arrow_left and clone_url.selected == 0) { 1062 if (self.findInput()) |text_input| { 1063 root_focus.setFocus(text_input.getFocus().id); 1064 return; 1065 } 1066 } 1067 try clone_url.input(allocator, key, root_focus); 1068 } 1069 1070 // navigate to the typed term's results, pinned to the listing's ref. an 1071 // empty term leaves the results for the plain listing. 1072 fn submit(self: *Header.View, allocator: std.mem.Allocator, text_input: *wgt.TextInput) !void { 1073 const term = try text_input.text(allocator); 1074 defer allocator.free(term); 1075 if (term.len == 0 and self.data.find == null) return; 1076 const route = self.data.filesRoute("", 0) orelse return; 1077 try self.session.navigate(route.withFind(term) orelse return); 1078 } 1079 1080 // enter the header, preferring the search box. 1081 pub fn focusHeader(self: *Header.View, root_focus: *Focus) bool { 1082 if (self.findInput()) |text_input| { 1083 root_focus.setFocus(text_input.getFocus().id); 1084 return true; 1085 } 1086 const clone_url = self.cloneUrl() orelse return false; 1087 root_focus.setFocus(clone_url.getFocus().id); 1088 return true; 1089 } 1090 1091 pub fn hasHeaderFocus(self: *Header.View) bool { 1092 return self.cloneUrl() != null or self.findInput() != null; 1093 } 1094 1095 fn cloneUrl(self: *Header.View) ?*ui.widget.CopyableText { 1096 for (self.box.children.values()) |*child| switch (child.widget) { 1097 .copyable_text => |*copyable_text| return copyable_text, 1098 else => {}, 1099 }; 1100 return null; 1101 } 1102 1103 fn findInput(self: *Header.View) ?*wgt.TextInput { 1104 for (self.box.children.values()) |*child| switch (child.widget) { 1105 .text_input => |*text_input| return text_input, 1106 else => {}, 1107 }; 1108 return null; 1109 } 1110 1111 pub fn clearGrid(self: *Header.View) void { 1112 self.box.clearGrid(); 1113 } 1114 1115 pub fn getGrid(self: Header.View) ?Grid { 1116 return self.box.getGrid(); 1117 } 1118 1119 pub fn getFocus(self: *Header.View) *Focus { 1120 return self.box.getFocus(); 1121 } 1122 }; 1123 }; 1124