diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/tui_backend.rs | 13 | ||||
-rw-r--r-- | src/ui/views/tui_worker_view.rs | 19 | ||||
-rw-r--r-- | src/ui/widgets/tui_menu.rs | 50 | ||||
-rw-r--r-- | src/ui/widgets/tui_prompt.rs | 18 | ||||
-rw-r--r-- | src/ui/widgets/tui_textfield.rs | 18 |
5 files changed, 39 insertions, 79 deletions
diff --git a/src/ui/tui_backend.rs b/src/ui/tui_backend.rs index 2294737..6a42a5f 100644 --- a/src/ui/tui_backend.rs +++ b/src/ui/tui_backend.rs @@ -1,20 +1,23 @@ use std::io::stdout; use std::io::Write; +use termion::input::MouseTerminal; use termion::raw::{IntoRawMode, RawTerminal}; use termion::screen::AlternateScreen; use tui::backend::TermionBackend; use tui::widgets::Widget; +pub type JoshutoTerminal = + tui::Terminal<TermionBackend<MouseTerminal<AlternateScreen<RawTerminal<std::io::Stdout>>>>>; + pub struct TuiBackend { - pub terminal: - Option<tui::Terminal<TermionBackend<AlternateScreen<RawTerminal<std::io::Stdout>>>>>, + pub terminal: Option<JoshutoTerminal>, } impl TuiBackend { pub fn new() -> std::io::Result<Self> { let stdout = std::io::stdout().into_raw_mode()?; - let mut alt_screen = AlternateScreen::from(stdout); + let mut alt_screen = MouseTerminal::from(AlternateScreen::from(stdout)); // clears the screen of artifacts write!(alt_screen, "{}", termion::clear::All)?; @@ -36,9 +39,7 @@ impl TuiBackend { }); } - pub fn terminal_mut( - &mut self, - ) -> &mut tui::Terminal<TermionBackend<AlternateScreen<RawTerminal<std::io::Stdout>>>> { + pub fn terminal_mut(&mut self) -> &mut JoshutoTerminal { self.terminal.as_mut().unwrap() } diff --git a/src/ui/views/tui_worker_view.rs b/src/ui/views/tui_worker_view.rs index 536c45a..58eaef2 100644 --- a/src/ui/views/tui_worker_view.rs +++ b/src/ui/views/tui_worker_view.rs @@ -1,12 +1,12 @@ -use termion::event::Key; +use termion::event::{Event, Key}; use tui::layout::Rect; use crate::context::JoshutoContext; use crate::ui::widgets::TuiWorker; use crate::ui::TuiBackend; -use crate::util::event::Event; -use crate::util::worker; +use crate::util::event::JoshutoEvent; +use crate::util::input_process; pub struct TuiWorkerView {} @@ -33,21 +33,16 @@ impl TuiWorkerView { if let Ok(event) = context.poll_event() { match event { - Event::IOWorkerProgress(res) => { - worker::process_worker_progress(context, res); - } - Event::IOWorkerResult(res) => { - worker::process_finished_worker(context, res); - } - Event::Input(key) => { - match key { - Key::Esc => { + JoshutoEvent::Termion(event) => { + match event { + Event::Key(Key::Esc) => { break; } _ => {} } context.flush_event(); } + event => input_process::process_noninteractive(event, context), }; } } diff --git a/src/ui/widgets/tui_menu.rs b/src/ui/widgets/tui_menu.rs index d8fc148..38eed64 100644 --- a/src/ui/widgets/tui_menu.rs +++ b/src/ui/widgets/tui_menu.rs @@ -1,6 +1,6 @@ use std::iter::Iterator; -use termion::event::Key; +use termion::event::{Event, Key}; use tui::buffer::Buffer; use tui::layout::Rect; use tui::style::{Color, Style}; @@ -11,42 +11,15 @@ use crate::config::JoshutoCommandMapping; use crate::context::JoshutoContext; use crate::ui::views::TuiView; use crate::ui::TuiBackend; -use crate::util::event::Event; -use crate::util::worker; +use crate::util::event::JoshutoEvent; +use crate::util::input_process; +use crate::util::key_mapping::ToString; const BORDER_HEIGHT: usize = 1; const BOTTOM_MARGIN: usize = 1; pub struct TuiCommandMenu; -trait ToString { - fn to_string(&self) -> String; -} - -impl ToString for Key { - fn to_string(&self) -> String { - match *self { - Key::Char(c) => format!("{}", c), - Key::Ctrl(c) => format!("ctrl+{}", c), - Key::Left => "arrow_left".to_string(), - Key::Right => "arrow_right".to_string(), - Key::Up => "arrow_up".to_string(), - Key::Down => "arrow_down".to_string(), - Key::Backspace => "backspace".to_string(), - Key::Home => "home".to_string(), - Key::End => "end".to_string(), - Key::PageUp => "page_up".to_string(), - Key::PageDown => "page_down".to_string(), - Key::BackTab => "backtab".to_string(), - Key::Insert => "insert".to_string(), - Key::Delete => "delete".to_string(), - Key::Esc => "escape".to_string(), - Key::F(i) => format!("f{}", i), - k => format!("{:?}", k), - } - } -} - impl TuiCommandMenu { pub fn new() -> Self { Self {} @@ -107,16 +80,10 @@ impl TuiCommandMenu { if let Ok(event) = context.poll_event() { match event { - Event::IOWorkerProgress(res) => { - worker::process_worker_progress(context, res); - } - Event::IOWorkerResult(res) => { - worker::process_finished_worker(context, res); - } - Event::Input(key) => { - match key { - Key::Esc => return None, - key => match map.as_ref().get(&key) { + JoshutoEvent::Termion(event) => { + match event { + Event::Key(Key::Esc) => return None, + event => match map.as_ref().get(&event) { Some(CommandKeybind::SimpleKeybind(s)) => { return Some(s); } @@ -128,6 +95,7 @@ impl TuiCommandMenu { } context.flush_event(); } + event => input_process::process_noninteractive(event, context), } } } diff --git a/src/ui/widgets/tui_prompt.rs b/src/ui/widgets/tui_prompt.rs index f520de9..c4d0c1c 100644 --- a/src/ui/widgets/tui_prompt.rs +++ b/src/ui/widgets/tui_prompt.rs @@ -1,4 +1,4 @@ -use termion::event::Key; +use termion::event::{Event, Key}; use tui::layout::Rect; use tui::style::{Color, Style}; use tui::text::Span; @@ -7,8 +7,8 @@ use tui::widgets::{Clear, Paragraph, Wrap}; use crate::context::JoshutoContext; use crate::ui::views::TuiView; use crate::ui::TuiBackend; -use crate::util::event::Event; -use crate::util::worker; +use crate::util::event::JoshutoEvent; +use crate::util::input_process; pub struct TuiPrompt<'a> { prompt: &'a str, @@ -56,15 +56,13 @@ impl<'a> TuiPrompt<'a> { if let Ok(event) = context.poll_event() { match event { - Event::IOWorkerProgress(res) => { - worker::process_worker_progress(context, res); - } - Event::IOWorkerResult(res) => { - worker::process_finished_worker(context, res); - } - Event::Input(key) => { + JoshutoEvent::Termion(Event::Key(key)) => { return key; } + JoshutoEvent::Termion(_) => { + context.flush_event(); + } + event => input_process::process_noninteractive(event, context), }; } } diff --git a/src/ui/widgets/tui_textfield.rs b/src/ui/widgets/tui_textfield.rs index c70c079..d6e9371 100644 --- a/src/ui/widgets/tui_textfield.rs +++ b/src/ui/widgets/tui_textfield.rs @@ -1,7 +1,7 @@ use rustyline::completion::{Candidate, Completer, FilenameCompleter, Pair}; use rustyline::line_buffer; -use termion::event::Key; +use termion::event::{Event, Key}; use tui::layout::Rect; use tui::style::{Color, Modifier, Style}; use tui::text::{Span, Spans}; @@ -11,8 +11,8 @@ use crate::context::JoshutoContext; use crate::ui::views::TuiView; use crate::ui::widgets::TuiMenu; use crate::ui::TuiBackend; -use crate::util::event::Event; -use crate::util::worker; +use crate::util::event::JoshutoEvent; +use crate::util::input_process; struct CompletionTracker { pub index: usize, @@ -159,13 +159,7 @@ impl<'a> TuiTextField<'a> { if let Ok(event) = context.poll_event() { match event { - Event::IOWorkerProgress(res) => { - worker::process_worker_progress(context, res); - } - Event::IOWorkerResult(res) => { - worker::process_finished_worker(context, res); - } - Event::Input(key) => { + JoshutoEvent::Termion(Event::Key(key)) => { match key { Key::Backspace => { if line_buffer.backspace(1) { @@ -243,6 +237,10 @@ impl<'a> TuiTextField<'a> { } context.flush_event(); } + JoshutoEvent::Termion(_) => { + context.flush_event(); + } + event => input_process::process_noninteractive(event, context), }; } } |