diff options
Diffstat (limited to 'src/tui/handler.rs')
| -rw-r--r-- | src/tui/handler.rs | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/src/tui/handler.rs b/src/tui/handler.rs new file mode 100644 index 0000000..5a196b5 --- /dev/null +++ b/src/tui/handler.rs @@ -0,0 +1,210 @@ +// bibiman - a TUI for managing BibLaTeX databases +// Copyright (C) 2024 lukeflo +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. +///// + +use crate::tui::app::App; +use crate::tui::Tui; +use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + +use super::app::CurrentArea; +use color_eyre::eyre::Result; + +/// Handles the key events and updates the state of [`App`]. +pub fn handle_key_events(key_event: KeyEvent, app: &mut App, tui: &mut Tui) -> Result<()> { + // Keycodes activated for every area (high priority) + match key_event.code { + // Exit application on `ESC` or `q` + KeyCode::Char('Q') | KeyCode::Char('q') => { + app.quit(); + } + // Exit application on `Ctrl-C` + KeyCode::Char('c') | KeyCode::Char('C') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.quit(); + } + } + KeyCode::PageDown => { + app.scroll_info_down(); + } + KeyCode::PageUp => { + app.scroll_info_up(); + } + _ => {} + } + // Keycodes for specific areas + match app.current_area { + // Keycodes for the tag area + CurrentArea::TagArea => match key_event.code { + KeyCode::Down => { + app.select_next_tag(1); + } + KeyCode::Up => { + app.select_previous_tag(1); + } + KeyCode::Char('j') => { + if key_event.modifiers == KeyModifiers::ALT { + app.scroll_info_down(); + } else { + app.select_next_tag(1); + } + } + KeyCode::Char('k') => { + if key_event.modifiers == KeyModifiers::ALT { + app.scroll_info_up(); + } else { + app.select_previous_tag(1); + } + } + KeyCode::Char('d') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.select_next_tag(5) + } + } + KeyCode::Char('u') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.select_previous_tag(5) + } + } + KeyCode::Char('g') | KeyCode::Home => { + app.select_first_tag(); + } + KeyCode::Char('G') | KeyCode::End => { + app.select_last_tag(); + } + KeyCode::Char('/') => { + app.enter_search_area(); + } + KeyCode::Char('f') | KeyCode::Char('F') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.enter_search_area(); + } + } + KeyCode::Tab | KeyCode::BackTab => { + app.toggle_area(); + } + KeyCode::Esc => { + app.reset_current_list(); + } + KeyCode::Enter => { + app.filter_for_tags(); + } + _ => {} + }, + // Keycodes for the entry area + CurrentArea::EntryArea => match key_event.code { + KeyCode::Down => { + app.select_next_entry(1); + } + KeyCode::Up => { + app.select_previous_entry(1); + } + KeyCode::Char('j') => { + if key_event.modifiers == KeyModifiers::ALT { + app.scroll_info_down(); + } else { + app.select_next_entry(1); + } + } + KeyCode::Char('k') => { + if key_event.modifiers == KeyModifiers::ALT { + app.scroll_info_up(); + } else { + app.select_previous_entry(1); + } + } + KeyCode::Char('d') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.select_next_entry(5); + } + } + KeyCode::Char('u') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.select_previous_entry(5); + } else { + app.open_doi_url()?; + } + } + KeyCode::Char('g') | KeyCode::Home => { + app.select_first_entry(); + } + KeyCode::Char('G') | KeyCode::End => { + app.select_last_entry(); + } + KeyCode::Char('h') => { + app.select_prev_column(); + } + KeyCode::Char('l') => { + app.select_next_column(); + } + KeyCode::Char('s') => { + app.entry_table.sort_entry_table(true); + } + KeyCode::Char('y') => { + App::yank_text(&app.get_selected_citekey()); + } + KeyCode::Char('e') => { + app.run_editor(tui)?; + } + KeyCode::Char('o') => { + app.open_connected_file()?; + } + KeyCode::Char('/') => { + app.enter_search_area(); + } + KeyCode::Char('f') | KeyCode::Char('F') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.enter_search_area(); + } + } + KeyCode::Tab | KeyCode::BackTab => { + app.toggle_area(); + } + KeyCode::Esc => { + app.reset_current_list(); + } + _ => {} + }, + // Keycodes for the search area (rendered in footer) + CurrentArea::SearchArea => match key_event.code { + KeyCode::Esc => { + app.break_search(); + } + KeyCode::Enter => { + app.confirm_search(); + } + KeyCode::Backspace => { + app.search_pattern_pop(); + } + KeyCode::Char(search_pattern) => { + app.search_pattern_push(search_pattern); + } + _ => {} + }, + // Keycodes for the help area (popup) + CurrentArea::HelpArea => match key_event.code { + KeyCode::Char('q') => { + app.quit(); + } + KeyCode::Esc => { + app.toggle_area(); + app.former_area = None; + } + _ => {} + }, + CurrentArea::InfoArea => {} + } + Ok(()) +} |
