diff --git a/src/config.rs b/src/config.rs index 422b72d..4f74ba7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -35,6 +35,8 @@ pub enum Action { ToggleSettingsPage, ToggleWordWrap, Undo, + TabNext, + TabPrev, } impl Action { @@ -55,6 +57,8 @@ impl Action { Self::Redo => Message::Redo, Self::Save => Message::Save, Self::SelectAll => Message::SelectAll, + Self::TabNext => Message::TabNext, + Self::TabPrev => Message::TabPrev, Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement), Self::ToggleProjectSearch => Message::ToggleContextPage(ContextPage::ProjectSearch), Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings), @@ -131,6 +135,8 @@ impl KeyBind { bind!([Ctrl], Comma, ToggleSettingsPage); bind!([Alt], Z, ToggleWordWrap); bind!([Ctrl], Z, Undo); + bind!([Ctrl], PageUp, TabNext); + bind!([Ctrl], PageDown, TabPrev); keybinds } diff --git a/src/main.rs b/src/main.rs index ad928d3..f03327b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -216,6 +216,8 @@ pub enum Message { TabClose(segmented_button::Entity), TabContextAction(segmented_button::Entity, Action), TabContextMenu(segmented_button::Entity, Option), + TabNext, + TabPrev, TabSetCursor(segmented_button::Entity, Cursor), TabWidth(u16), Todo, @@ -1639,6 +1641,38 @@ impl Application for App { tab.context_menu = position_opt; } } + Message::TabNext => { + let len = self.tab_model.iter().count(); + // Next tab position. Wraps around to 0 (the first tab) if the last tab is active. + let pos = self + .tab_model + .position(self.tab_model.active()) + .map(|i| (i as usize + 1) % len) + .expect("at least one tab is always open"); + + let entity = self.tab_model.iter().nth(pos); + if let Some(entity) = entity { + return self.update(Message::TabActivate(entity)); + } + } + Message::TabPrev => { + let pos = self + .tab_model + .position(self.tab_model.active()) + .and_then(|i| (i as usize).checked_sub(1)) + .unwrap_or_else(|| { + self.tab_model + .iter() + .count() + .checked_sub(1) + .unwrap_or_default() + }); + + let entity = self.tab_model.iter().nth(pos); + if let Some(entity) = entity { + return self.update(Message::TabActivate(entity)); + } + } Message::TabSetCursor(entity, cursor) => { if let Some(Tab::Editor(tab)) = self.tab_model.data::(entity) { let mut editor = tab.editor.lock().unwrap();