╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭───────────────────────────────────────────╮ │2501 }, │ │2502 repo_members: struct { │ │2503 failure: MembersFailure, │ │2504 + name: []const u8, │ │2505 + }, │ │2506 + repo_branches: struct { │ │2507 + failure: BranchesFailure,│ │2508 name: []const u8, │ │2509 }, │ │2510 assignment: struct { │ ╰───────────────────────────────────────────╯ ╭ changed ──────╮ │src/ui/Repo.zig│ ╰───────────────╯ ╭────────────────────────────────────────────────────────╮ │28 pub const Events = @import("./Repo/Events.zig"); │ │29 pub const Settings = @import("./Repo/Settings.zig");│ │30 pub const Members = @import("./Repo/Members.zig"); │ │31 +pub const Branches = @import("./Repo/Branches.zig");│ │32 pub const Quit = @import("./Quit.zig"); │ │33 │ │34 header: Header, │ ╰────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │326 .issue_role = repo.event.issue_role, │ │327 .patch_role = repo.event.patch_role, │ │328 .hash_kind = opened.self_repo_opts.hash, │ │328 - .view = if (route == .repo_members) .members else .settings, │ │329 + .view = switch (route) { │ │330 + .repo_members => .members, │ │331 + .repo_branches => .branches, │ │332 + else => .settings, │ │333 + }, │ │334 .members = try Members.init(io, gpa, arena, session.haxy_moment orelse return error.NoMoment, session.users_dir orelse return error.NoMoment, repo_identity.identity, &owner_id, &repo_id, members_route.start, if (members_route.confirm) |action| .{ .action = action, .name = members_route.user.slice() } else null),│ │335 + .branches = try Branches.init(arena, repo_identity.identity, repo.event), │ │336 }; │ │337 } │ │338 // tabs switch in-page, so every tab's data is read here │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │396 }; │ │397 }; │ │398 if (route == .repo_undo and undo_data == null) return error.NotFound; │ │393 - if ((route == .repo_settings or route == .repo_members) and settings == null) return error.NotFound; │ │399 + if ((route == .repo_settings or route == .repo_members or route == .repo_branches) and settings == null) return error.NotFound;│ │400 if (undo_data) |*undo| undo.clear = undo_clear; │ │401 discussions.repo_source = source; │ │402 issues.repo_source = source; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─────────────╮ │src/ui/Repo/Header.zig│ ╰──────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │303 var text_box = try wgt.TextBox.init(allocator, ui.Repo.Settings.tab_label, .{ .border = .single, .round_corners = true, .wrap_kind = .none });│ │304 errdefer text_box.deinit(allocator); │ │305 text_box.getFocus().mode = .all; │ │306 - const selected = current_tag == .repo_settings or current_tag == .repo_members; │ │306 + const selected = current_tag == .repo_settings or current_tag == .repo_members or current_tag == .repo_branches; │ │307 text_box.getFocus().kind = .{ .custom = try ui.inPageTabLink(session, route, selected) }; │ │308 try tab_ids.put(allocator, text_box.getFocus().id, {}); │ │309 if (selected) selected_tab = text_box.getFocus().id; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───────────────╮ │src/ui/Repo/Settings.zig│ ╰────────────────────────╯ ╭────────────────────────────────────────────────────╮ │13 const Focus = xitui.focus.Focus; │ │14 │ │15 const Members = @import("./Members.zig"); │ │16 +const Branches = @import("./Branches.zig"); │ │17 │ │18 const wasm = builtin.target.cpu.arch == .wasm32;│ │19 │ ╰────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────╮ │30 patch_role: ?evt.Repo.Role, │ │31 hash_kind: hash.HashKind, │ │32 // the sub tab the route names │ │32 -view: enum { settings, members }, │ │33 +view: enum { settings, members, branches },│ │34 members: Members, │ │35 +branches: Branches, │ │36 │ │37 const Self = @This(); │ │38 │ ╰───────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────╮ │62 return error.InvalidRole; │ │63 } │ │64 │ │63 -// the repo settings and members sub tabs over their content │ │65 +// the repo settings, members and branches sub tabs over their content│ │66 pub const View = struct { │ │67 box: wgt.Box(ui.Widget), │ │68 │ ╰──────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │77 var header = try wgt.Box(ui.Widget).init(allocator, .{ .border = null, .direction = .horiz }); │ │78 errdefer header.deinit(allocator); │ │79 const on_tab = switch (session.data.current_page) { │ │78 - .repo_settings, .repo_members => true, │ │80 + .repo_settings, .repo_members, .repo_branches => true, │ │81 else => false, │ │82 }; │ │81 - const routes = [_]?ui.RoutablePage{ ui.RoutablePage.repoSettingsRoute(data.identity), ui.RoutablePage.repoMembersRoute(data.identity, 0) }; │ │82 - for ([_]@FieldType(Self, "view"){ .settings, .members }, [_][]const u8{ "repo settings", "members" }, routes) |view, label, route| { │ │83 + const routes = [_]?ui.RoutablePage{ ui.RoutablePage.repoSettingsRoute(data.identity), ui.RoutablePage.repoMembersRoute(data.identity, 0), ui.RoutablePage.repoBranchesRoute(data.identity) };│ │84 + for ([_]@FieldType(Self, "view"){ .settings, .members, .branches }, [_][]const u8{ "repo settings", "members", "branches" }, routes) |view, label, route| { │ │85 var tab = try wgt.TextBox.init(allocator, label, .{ .border = .hidden, .round_corners = true, .wrap_kind = .none }); │ │86 errdefer tab.deinit(allocator); │ │87 tab.getFocus().mode = .all; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │105 var members = try Members.View.init(allocator, &data.members, session); │ │106 errdefer members.deinit(allocator); │ │107 try stack.children.put(allocator, members.getFocus().id, .{ .repo_members = members }); │ │108 + } │ │109 + { │ │110 + var branches = try Branches.View.init(allocator, &data.branches, session); │ │111 + errdefer branches.deinit(allocator); │ │112 + try stack.children.put(allocator, branches.getFocus().id, .{ .repo_branches = branches }); │ │113 } │ │114 stack.getFocus().child_id = stack.children.keys()[@backingInt(data.view)]; │ │115 try box.children.put(allocator, stack.getFocus().id, .{ .widget = .{ .stack = stack }, .rect = null, .min_size = null });│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯