aboutsummaryrefslogtreecommitdiff
path: root/src/tui/handler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tui/handler.rs')
-rw-r--r--src/tui/handler.rs210
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(())
+}