Add keyboard shortcuts to cycle tabs

This commit is contained in:
Josh Megnauth 2024-01-19 01:29:12 -05:00
parent 0581f96f46
commit 37318444d3
No known key found for this signature in database
GPG key ID: 70813183462EFAD3
2 changed files with 40 additions and 0 deletions

View file

@ -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
}

View file

@ -216,6 +216,8 @@ pub enum Message {
TabClose(segmented_button::Entity),
TabContextAction(segmented_button::Entity, Action),
TabContextMenu(segmented_button::Entity, Option<Point>),
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::<Tab>(entity) {
let mut editor = tab.editor.lock().unwrap();