╭ changed ───────────╮ │src/ui/Repo/Refs.zig│ ╰────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────╮ │278 // same row offset. the parent (Repo) intercepts up at the top row to move│ │279 // focus to the header. │ │280 if (inp.rowDelta(key, self.columnRowCount())) |delta| { │ │281 - return self.moveRow(root_focus, delta); │ │281 + const scroll = self.activeScroll() orelse return; │ │282 + ui.moveRowFocus(&scroll.child.box, scroll, root_focus, delta); │ │283 + return; │ │284 } │ │285 switch (key) { │ │286 .arrow_left => try self.switchColumn(root_focus, left_col), │ ╰───────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────╮ │305 return &(self.activeScroll() orelse return null).child.box; │ │306 } │ │307 │ │306 - fn moveRow(self: *View, root_focus: *Focus, delta: isize) !void { │ │307 - const scroll = self.activeScroll() orelse return; │ │308 - const col = &scroll.child.box; │ │309 - const keys = col.children.keys(); │ │310 - if (keys.len == 0) return; │ │311 - const cur_id = col.getFocus().child_id orelse return; │ │312 - const cur: isize = @intCast(col.children.getIndex(cur_id) orelse return);│ │313 - // clamp a delta past either end to the first/last row. │ │314 - const last: isize = @intCast(keys.len - 1); │ │315 - const next: usize = @intCast(std.math.clamp(cur + delta, 0, last)); │ │316 - if (next == @as(usize, @intCast(cur))) return; │ │317 - root_focus.setFocus(keys[next]); │ │318 - if (col.children.values()[next].rect) |rect| scroll.scrollToRect(rect); │ │319 - } │ │320 - │ │308 fn switchColumn(self: *View, root_focus: *Focus, target: usize) !void { │ │309 if (target >= self.box.children.count()) return; │ │310 const cur_col = self.activeColumn() orelse return; │ ╰──────────────────────────────────────────────────────────────────────────────────────╯