Add keyboard shortcuts to cycle tabs
This commit is contained in:
parent
0581f96f46
commit
37318444d3
2 changed files with 40 additions and 0 deletions
|
|
@ -35,6 +35,8 @@ pub enum Action {
|
||||||
ToggleSettingsPage,
|
ToggleSettingsPage,
|
||||||
ToggleWordWrap,
|
ToggleWordWrap,
|
||||||
Undo,
|
Undo,
|
||||||
|
TabNext,
|
||||||
|
TabPrev,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Action {
|
impl Action {
|
||||||
|
|
@ -55,6 +57,8 @@ 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::TabNext => Message::TabNext,
|
||||||
|
Self::TabPrev => Message::TabPrev,
|
||||||
Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement),
|
Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement),
|
||||||
Self::ToggleProjectSearch => Message::ToggleContextPage(ContextPage::ProjectSearch),
|
Self::ToggleProjectSearch => Message::ToggleContextPage(ContextPage::ProjectSearch),
|
||||||
Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings),
|
Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings),
|
||||||
|
|
@ -131,6 +135,8 @@ impl KeyBind {
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
34
src/main.rs
34
src/main.rs
|
|
@ -216,6 +216,8 @@ pub enum Message {
|
||||||
TabClose(segmented_button::Entity),
|
TabClose(segmented_button::Entity),
|
||||||
TabContextAction(segmented_button::Entity, Action),
|
TabContextAction(segmented_button::Entity, Action),
|
||||||
TabContextMenu(segmented_button::Entity, Option<Point>),
|
TabContextMenu(segmented_button::Entity, Option<Point>),
|
||||||
|
TabNext,
|
||||||
|
TabPrev,
|
||||||
TabSetCursor(segmented_button::Entity, Cursor),
|
TabSetCursor(segmented_button::Entity, Cursor),
|
||||||
TabWidth(u16),
|
TabWidth(u16),
|
||||||
Todo,
|
Todo,
|
||||||
|
|
@ -1639,6 +1641,38 @@ impl Application for App {
|
||||||
tab.context_menu = position_opt;
|
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) => {
|
Message::TabSetCursor(entity, cursor) => {
|
||||||
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 editor = tab.editor.lock().unwrap();
|
let mut editor = tab.editor.lock().unwrap();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue