multi_workspace: Add actions to cycle workspace (#52156)

This commit is contained in:
Cameron Mcloughlin 2026-03-23 01:54:26 +00:00 committed by GitHub
parent 42e7811d45
commit fb1a98cfef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 31 additions and 1 deletions

View file

@ -30,6 +30,10 @@ actions!(
CloseWorkspaceSidebar,
/// Moves focus to or from the workspace sidebar without closing it.
FocusWorkspaceSidebar,
/// Switches to the next workspace.
NextWorkspace,
/// Switches to the previous workspace.
PreviousWorkspace,
]
);
@ -405,6 +409,29 @@ impl MultiWorkspace {
cx.notify();
}
fn cycle_workspace(&mut self, delta: isize, window: &mut Window, cx: &mut Context<Self>) {
let count = self.workspaces.len() as isize;
if count <= 1 {
return;
}
let current = self.active_workspace_index as isize;
let next = ((current + delta).rem_euclid(count)) as usize;
self.activate_index(next, window, cx);
}
fn next_workspace(&mut self, _: &NextWorkspace, window: &mut Window, cx: &mut Context<Self>) {
self.cycle_workspace(1, window, cx);
}
fn previous_workspace(
&mut self,
_: &PreviousWorkspace,
window: &mut Window,
cx: &mut Context<Self>,
) {
self.cycle_workspace(-1, window, cx);
}
fn serialize(&mut self, cx: &mut App) {
let window_id = self.window_id;
let state = crate::persistence::model::MultiWorkspaceState {
@ -760,6 +787,8 @@ impl Render for MultiWorkspace {
this.focus_sidebar(window, cx);
},
))
.on_action(cx.listener(Self::next_workspace))
.on_action(cx.listener(Self::previous_workspace))
})
.when(
self.sidebar_open() && self.multi_workspace_enabled(cx),

View file

@ -28,7 +28,8 @@ pub use crate::notifications::NotificationFrame;
pub use dock::Panel;
pub use multi_workspace::{
CloseWorkspaceSidebar, DraggedSidebar, FocusWorkspaceSidebar, MultiWorkspace,
MultiWorkspaceEvent, Sidebar, SidebarHandle, ToggleWorkspaceSidebar,
MultiWorkspaceEvent, NextWorkspace, PreviousWorkspace, Sidebar, SidebarHandle,
ToggleWorkspaceSidebar,
};
pub use path_list::{PathList, SerializedPathList};
pub use toast_layer::{ToastAction, ToastLayer, ToastView};