fix: reveal newly focused workspaces in the machines sidebar

This commit is contained in:
Ogulcan Celik
2026-09-15 15:02:09 +03:00
parent 052779c415
commit 9bd5f4ed37
2 changed files with 83 additions and 4 deletions
+14 -4
View File
@@ -328,7 +328,9 @@ pub(super) fn render_expanded(
_ => 0,
})
.collect::<Vec<_>>();
if std::mem::take(state.reveal_navigation_workspace) {
let reveal_navigation = !body.is_empty() && std::mem::take(state.reveal_navigation_workspace);
let reveal_focus = !body.is_empty() && std::mem::take(state.reveal_focused_workspace);
if reveal_navigation || reveal_focus {
let selected_row = rows.iter().position(|row| match row {
Row::Workspace { endpoint, entry } => {
let endpoint = &state.endpoints[*endpoint];
@@ -337,9 +339,17 @@ pub(super) fn render_expanded(
.as_deref()
.and_then(|snapshot| snapshot.workspaces.get(entry.index))
.is_some_and(|workspace| {
state.selected_workspace_id.is_some_and(|target| {
target.matches(&endpoint.endpoint_id, &workspace.workspace_id)
})
if reveal_navigation {
state.selected_workspace_id.is_some_and(|target| {
target.matches(&endpoint.endpoint_id, &workspace.workspace_id)
})
} else {
&endpoint.endpoint_id == state.active_endpoint_id
&& active_snapshot.is_some_and(|snapshot| {
snapshot.focused_workspace_id.as_deref()
== Some(workspace.workspace_id.as_str())
})
}
})
}
Row::Endpoint(_) => false,
+69
View File
@@ -564,6 +564,75 @@ fn saved_machine_preserves_endpoint_scoped_worktree_collapses() {
.any(|hit| { hit.endpoint_id == remote_id && hit.workspace_id == "remote_ws_2" }));
}
#[test]
fn expanded_machine_sidebar_reveals_newly_focused_workspace() {
let (mut state, remote_id) = state_with_remote();
let mut initial = snapshot();
let template = initial.workspaces[0].clone();
initial.workspaces = (1..=12)
.map(|number| ClientShellWorkspace {
workspace_id: format!("ws_{number}"),
number,
label: format!("space-{number}"),
focused: number == 1,
..template.clone()
})
.collect();
// Reuse workspace IDs across machines so revealing must be endpoint-scoped.
let mut remote = initial.clone();
remote.boot_id = "remote-boot".into();
remote.workspaces.push(ClientShellWorkspace {
workspace_id: "ws_13".into(),
number: 13,
focused: false,
..template.clone()
});
state.set_endpoint_snapshot(&remote_id, Box::new(remote));
state.set_snapshot(Box::new(initial));
state.compose(106, 20).expect("full machines sidebar");
assert!(state.hits.workspace_max_scroll > 0);
let mut update = state.snapshot.as_deref().expect("snapshot").clone();
update.revision = 2;
update.workspaces.push(ClientShellWorkspace {
workspace_id: "ws_13".into(),
number: 13,
label: "new-space".into(),
..template
});
update.focused_workspace_id = Some("ws_13".into());
for workspace in &mut update.workspaces {
workspace.focused = workspace.workspace_id == "ws_13";
}
state.set_snapshot(Box::new(update));
let mut updated_surface = surface();
updated_surface.projection_revision = 2;
state.set_pane_surface(updated_surface);
state.compose(106, 2).expect("zero-height workspace body");
assert!(state.reveal_focused_workspace);
state.compose(106, 20).expect("new workspace revealed");
assert!(state
.hits
.workspaces
.iter()
.any(|hit| { hit.endpoint_id == ClientEndpointId::Local && hit.workspace_id == "ws_13" }));
state.workspace_scroll = 0;
state.compose(106, 20).expect("manual scroll");
assert_eq!(state.workspace_scroll, 0);
assert!(!state
.hits
.workspaces
.iter()
.any(|hit| { hit.endpoint_id == ClientEndpointId::Local && hit.workspace_id == "ws_13" }));
let unchanged = state.snapshot.as_deref().expect("snapshot").clone();
state.set_snapshot(Box::new(unchanged));
state
.compose(106, 20)
.expect("unchanged focus preserves scroll");
assert_eq!(state.workspace_scroll, 0);
}
#[test]
fn expanded_machine_sidebar_applies_space_row_gap_within_each_machine() {
let (mut state, remote_id) = state_with_remote();