╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ───────────────╮ │src/ui/widget/thread.zig│ ╰────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────╮ │2228 return stack.children.getIndex(cid); │ │2229 } │ │2230 │ │2231 - // the stack's selected master-detail split (null when the tags view or the │ │2231 + // the stack's selected master-detail split (null when the labels view or the│ │2232 // new-thread form shows). │ │2233 fn selectedSplitIndex(self: *This) ?usize { │ │2234 const idx = self.stackSelectedIndex() orelse return null; │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────╮ │2246 return self.box.children.getIndex(cid) == header_index;│ │2247 } │ │2248 │ │2249 - fn tagsViewActive(self: *This) bool { │ │2249 + fn labelsViewActive(self: *This) bool { │ │2250 if (self.headerActive()) return false; │ │2251 - return self.stackSelectedIndex() == tags_view_index; │ │2251 + return self.stackSelectedIndex() == labels_view_index; │ │2252 } │ │2253 │ │2254 fn formViewActive(self: *This) bool { │ ╰─────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2357 // the query; other keys move within the sub-header. │ │2358 if (inp.vertDirection(key) == .down) { │ │2359 const enterable = if (self.viewStack().getSelected()) |selected| switch (selected.*) {│ │2360 - .tag_flow => |*tf| tf.text_boxes.items.len > 0, │ │2360 + .word_flow => |*tf| tf.text_boxes.items.len > 0, │ │2361 // nothing focusable in the unauthorized view │ │2362 .unauthorized => false, │ │2363 else => true, │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────╮ │2373 } │ │2374 return; │ │2375 } │ │2376 - if (self.tagsViewActive()) { │ │2377 - self.tagsViewInput(key, root_focus); │ │2376 + if (self.labelsViewActive()) { │ │2377 + self.labelsViewInput(key, root_focus);│ │2378 return; │ │2379 } │ │2380 if (self.formViewActive()) { │ ╰────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────╮ │2399 } │ │2400 } │ │2401 │ │2402 - // navigate to the typed query's results, keeping the tag filter and the │ │2402 + // navigate to the typed query's results, keeping the label filter and the│ │2403 // status list the page shows. an empty box clears a filtered page and │ │2404 // does nothing on any other one. │ │2405 fn submitSearch(self: *This, text: []const u8) !void { │ ╰────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2406 if (text.len == 0 and self.data.search == null) return; │ │2407 const selected = self.header().getSelectedIndex() orelse 0; │ │2408 const status: Status = if (selected < status_count) splitStatus(selected) else @enumFromInt(0);│ │2409 - const route = listRoute(self.data.identity, status, self.data.tag, "") orelse return; │ │2409 + const route = listRoute(self.data.identity, status, self.data.label, "") orelse return; │ │2410 try self.session.navigate(route.withSearch(text) orelse return); │ │2411 } │ │2412 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────╮ │2413 - // arrow keys move the tag selection; up from the top row crosses to the │ │2413 + // arrow keys move the label selection; up from the top row crosses to the│ │2414 // header tabs. │ │2415 - fn tagsViewInput(self: *This, key: Key, root_focus: *Focus) void { │ │2416 - const tf = self.tagsView(); │ │2415 + fn labelsViewInput(self: *This, key: Key, root_focus: *Focus) void { │ │2416 + const tf = self.labelsView(); │ │2417 const cid = tf.focus.child_id orelse return; │ │2418 const cur = tf.indexOfFocusId(cid) orelse return; │ │2419 const count = tf.text_boxes.items.len; │ ╰────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────╮ │2584 │ │2585 // gather the inputs by name; the d<n> hunk inputs appear in chunk order│ │2586 var title: ?[]u8 = null; │ │2587 - var tags: ?[]u8 = null; │ │2587 + var labels: ?[]u8 = null; │ │2588 var hunks: std.ArrayList([]const u8) = .empty; │ │2589 defer { │ │2590 if (title) |t| allocator.free(t); │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────╮ │2591 - if (tags) |t| allocator.free(t); │ │2591 + if (labels) |t| allocator.free(t); │ │2592 for (hunks.items) |h| allocator.free(h);│ │2593 hunks.deinit(allocator); │ │2594 } │ ╰──────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────╮ │2598 errdefer allocator.free(text); │ │2599 if (std.mem.eql(u8, ti.options.name, "title")) { │ │2600 title = text; │ │2601 - } else if (std.mem.eql(u8, ti.options.name, "tags")) { │ │2602 - tags = text; │ │2601 + } else if (std.mem.eql(u8, ti.options.name, "labels")) {│ │2602 + labels = text; │ │2603 } else { │ │2604 try hunks.append(allocator, text); │ │2605 } │ ╰──────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯