Add shortcut to jump to tabs; ctrl + n

This commit is contained in:
Josh Megnauth 2024-01-20 20:45:49 -05:00
parent 37318444d3
commit e4db4c0dcd
No known key found for this signature in database
GPG key ID: 70813183462EFAD3
2 changed files with 40 additions and 2 deletions

View file

@ -30,6 +30,7 @@ pub enum Action {
Redo, Redo,
Save, Save,
SelectAll, SelectAll,
TabJump(usize),
ToggleGitManagement, ToggleGitManagement,
ToggleProjectSearch, ToggleProjectSearch,
ToggleSettingsPage, ToggleSettingsPage,
@ -57,6 +58,7 @@ impl Action {
Self::Redo => Message::Redo, Self::Redo => Message::Redo,
Self::Save => Message::Save, Self::Save => Message::Save,
Self::SelectAll => Message::SelectAll, Self::SelectAll => Message::SelectAll,
Self::TabJump(n) => Message::TabActivateJump(*n),
Self::TabNext => Message::TabNext, Self::TabNext => Message::TabNext,
Self::TabPrev => Message::TabPrev, Self::TabPrev => Message::TabPrev,
Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement), Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement),
@ -114,6 +116,17 @@ impl KeyBind {
Action::$action, Action::$action,
); );
}}; }};
// Match enums with a payload
([$($modifier:ident),+ $(,)?], $key_code:ident, $action:ident($($arg:expr)*)) => {{
keybinds.insert(
KeyBind {
modifiers: vec![$(Modifier::$modifier),+],
key_code: KeyCode::$key_code,
},
Action::$action($($arg)*),
);
}};
} }
bind!([Ctrl], W, CloseFile); bind!([Ctrl], W, CloseFile);
@ -130,13 +143,22 @@ impl KeyBind {
bind!([Ctrl, Shift], Z, Redo); bind!([Ctrl, Shift], Z, Redo);
bind!([Ctrl], S, Save); bind!([Ctrl], S, Save);
bind!([Ctrl], A, SelectAll); bind!([Ctrl], A, SelectAll);
bind!([Ctrl], Key1, TabJump(0));
bind!([Ctrl], Key2, TabJump(1));
bind!([Ctrl], Key3, TabJump(2));
bind!([Ctrl], Key4, TabJump(3));
bind!([Ctrl], Key5, TabJump(4));
bind!([Ctrl], Key6, TabJump(5));
bind!([Ctrl], Key7, TabJump(6));
bind!([Ctrl], Key8, TabJump(7));
bind!([Ctrl], Key9, TabJump(8));
bind!([Ctrl], PageUp, TabNext);
bind!([Ctrl], PageDown, TabPrev);
bind!([Ctrl, Shift], G, ToggleGitManagement); bind!([Ctrl, Shift], G, ToggleGitManagement);
bind!([Ctrl, Shift], F, ToggleProjectSearch); bind!([Ctrl, Shift], F, ToggleProjectSearch);
bind!([Ctrl], Comma, ToggleSettingsPage); bind!([Ctrl], Comma, ToggleSettingsPage);
bind!([Alt], Z, ToggleWordWrap); bind!([Alt], Z, ToggleWordWrap);
bind!([Ctrl], Z, Undo); bind!([Ctrl], Z, Undo);
bind!([Ctrl], PageUp, TabNext);
bind!([Ctrl], PageDown, TabPrev);
keybinds keybinds
} }

View file

@ -212,6 +212,7 @@ pub enum Message {
SystemThemeModeChange(cosmic_theme::ThemeMode), SystemThemeModeChange(cosmic_theme::ThemeMode),
SyntaxTheme(usize, bool), SyntaxTheme(usize, bool),
TabActivate(segmented_button::Entity), TabActivate(segmented_button::Entity),
TabActivateJump(usize),
TabChanged(segmented_button::Entity), TabChanged(segmented_button::Entity),
TabClose(segmented_button::Entity), TabClose(segmented_button::Entity),
TabContextAction(segmented_button::Entity, Action), TabContextAction(segmented_button::Entity, Action),
@ -1599,6 +1600,21 @@ impl Application for App {
self.tab_model.activate(entity); self.tab_model.activate(entity);
return self.update_tab(); return self.update_tab();
} }
Message::TabActivateJump(pos) => {
// Length is always at least one, so there shouldn't be a division by zero
let len = self.tab_model.iter().count();
//
let pos = if pos >= 8 || pos > len - 1 {
len - 1
} else {
pos % len
};
let entity = self.tab_model.iter().nth(pos);
if let Some(entity) = entity {
return self.update(Message::TabActivate(entity));
}
}
Message::TabChanged(entity) => { Message::TabChanged(entity) => {
if let Some(Tab::Editor(tab)) = self.tab_model.data::<Tab>(entity) { if let Some(Tab::Editor(tab)) = self.tab_model.data::<Tab>(entity) {
let mut title = tab.title(); let mut title = tab.title();