diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index cf102fc16109555971defbdc279e89738582ab74..aa100550749142b94df034195385c31dd54dbba3 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -5967,6 +5967,88 @@ impl Workspace { }, )) .on_action(cx.listener(Workspace::toggle_centered_layout)) + .on_action(cx.listener( + |workspace: &mut Workspace, _action: &pane::ActivateNextItem, window, cx| { + if let Some(active_dock) = workspace.active_dock(window, cx) { + let dock = active_dock.read(cx); + if let Some(active_panel) = dock.active_panel() { + if active_panel.pane(cx).is_none() { + let mut recent_pane: Option> = None; + let mut recent_timestamp = 0; + for pane_handle in workspace.panes() { + let pane = pane_handle.read(cx); + for entry in pane.activation_history() { + if entry.timestamp > recent_timestamp { + recent_timestamp = entry.timestamp; + recent_pane = Some(pane_handle.clone()); + } + } + } + + if let Some(pane) = recent_pane { + pane.update(cx, |pane, cx| { + let current_index = pane.active_item_index(); + let items_len = pane.items_len(); + if items_len > 0 { + let next_index = if current_index + 1 < items_len { + current_index + 1 + } else { + 0 + }; + pane.activate_item( + next_index, false, false, window, cx, + ); + } + }); + return; + } + } + } + } + cx.propagate(); + }, + )) + .on_action(cx.listener( + |workspace: &mut Workspace, _action: &pane::ActivatePreviousItem, window, cx| { + if let Some(active_dock) = workspace.active_dock(window, cx) { + let dock = active_dock.read(cx); + if let Some(active_panel) = dock.active_panel() { + if active_panel.pane(cx).is_none() { + let mut recent_pane: Option> = None; + let mut recent_timestamp = 0; + for pane_handle in workspace.panes() { + let pane = pane_handle.read(cx); + for entry in pane.activation_history() { + if entry.timestamp > recent_timestamp { + recent_timestamp = entry.timestamp; + recent_pane = Some(pane_handle.clone()); + } + } + } + + if let Some(pane) = recent_pane { + pane.update(cx, |pane, cx| { + let current_index = pane.active_item_index(); + let items_len = pane.items_len(); + if items_len > 0 { + let prev_index = if current_index > 0 { + current_index - 1 + } else { + items_len.saturating_sub(1) + }; + pane.activate_item( + prev_index, false, false, window, cx, + ); + } + }); + return; + } + } + } + } + cx.propagate(); + }, + )) .on_action(cx.listener(Workspace::cancel)) }