Rebuild the sidebar around the four questions it exists to answer
The rail showed a frozen attention count over a worktree list backed by a crate that does not exist. What replaces it starts from a question rather than from a list of things we happened to know: what needs me, what am I running, what did I set aside, where does it run and what will stop me. Layout is data. sidebar/model.rs holds no renderer types, so which sections exist, what collapsing hides, what the filter keeps, and where the keyboard cursor lands are ordinary tests in CI; sidebar/view.rs renders and decides nothing. Eleven model tests, none of which need a window. The cursor is a RowKey rather than an index, because an index is wrong the moment a row above it disappears and silently pointing at a different row is worse than losing the cursor. Every header renders even when its section is empty, so positions never move under the pointer. The filter's empty state does not quote what was typed — the sidebar is the part of the window people screenshot. One selection language everywhere: before this, attention cards darkened on hover while worktree rows lightened, so the same gesture meant two different things a hundred pixels apart. Two defects the screenshots caught that review had not. Flexbox shrinks proportionally, so the longer string wins: the attention row rendered as "Te… Exited with code 7 · observed", having discarded the one word that says which pane to look at. And three quota rows all read "CLAUDE CODE" with the scope truncated away, naming the same thing three times and identifying none of them. Titles now have a floor and the harness name prints once per group. WORKSPACE is deliberately flat: a Repository → Worktree → Pane tree would need lumbridge-git, and every level above Pane would be a second fixture. The depth field and disclosure column are reserved for when it is real. HOSTS has two states, live or not — connecting and unreachable are unbuildable until lumbridge-remote exists, and shipping them would be the Buzz card again in a Rust enum. The rail drags between 200 and 480 px, applied live so the workspace reflows under the pointer; decision 0009 measures pane thresholds after the sidebar, so widening really can drop three panes to one. PTYs are resized on release only, or every mouse-move is a SIGWINCH storm through the runtime's bounded queues. While the sidebar owns the keyboard, on_key_down returns before encoding anything. Without that guard a bare `j` would be written into whatever pane happened to be selected while the user believed they were walking a list. Not persisted yet, not virtualised, and describe() has nothing to attach to until the accessibility adapter from decision 0017 lands. Recorded in 0021. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3a8a100ea5
commit
72887cb4ab
@@ -29,9 +29,10 @@
|
||||
use gpui::KeyBinding;
|
||||
|
||||
use crate::{
|
||||
AddPanel, DetachSelectedPanel, FocusDown, FocusLeft, FocusRight, FocusUp, OpenPalette,
|
||||
PasteIntoPane, RestartPane, SelectPane1, SelectPane2, SelectPane3, SelectPane4, SelectPane5,
|
||||
SelectPane6, TerminalNarrower, TerminalShorter, TerminalTaller, TerminalWider, TerminatePane,
|
||||
AddPanel, DetachSelectedPanel, FocusDown, FocusLeft, FocusRight, FocusSidebar, FocusUp,
|
||||
JumpToAttention, OpenPalette, PasteIntoPane, RestartPane, SelectPane1, SelectPane2,
|
||||
SelectPane3, SelectPane4, SelectPane5, SelectPane6, TerminalNarrower, TerminalShorter,
|
||||
TerminalTaller, TerminalWider, TerminatePane, ToggleSidebar,
|
||||
};
|
||||
|
||||
/// The context every binding is scoped to.
|
||||
@@ -64,6 +65,9 @@ pub(crate) const BINDINGS: &[&str] = &[
|
||||
// The terminal convention, and the only safe spelling: `secondary-v` is
|
||||
// ctrl-v on Linux, which readline reads as quoted-insert.
|
||||
"secondary-shift-v",
|
||||
"secondary-alt-b",
|
||||
"secondary-alt-s",
|
||||
"secondary-alt-a",
|
||||
];
|
||||
|
||||
/// Builds the bindings in the same order as [`BINDINGS`].
|
||||
@@ -93,6 +97,9 @@ pub(crate) fn bindings() -> Vec<KeyBinding> {
|
||||
KeyBinding::new(BINDINGS[17], RestartPane, Some(CONTEXT)),
|
||||
KeyBinding::new(BINDINGS[18], TerminatePane, Some(CONTEXT)),
|
||||
KeyBinding::new(BINDINGS[19], PasteIntoPane, Some(CONTEXT)),
|
||||
KeyBinding::new(BINDINGS[20], ToggleSidebar, Some(CONTEXT)),
|
||||
KeyBinding::new(BINDINGS[21], FocusSidebar, Some(CONTEXT)),
|
||||
KeyBinding::new(BINDINGS[22], JumpToAttention, Some(CONTEXT)),
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user