summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/tui_backend.rs13
-rw-r--r--src/ui/views/tui_worker_view.rs19
-rw-r--r--src/ui/widgets/tui_menu.rs50
-rw-r--r--src/ui/widgets/tui_prompt.rs18
-rw-r--r--src/ui/widgets/tui_textfield.rs18
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),
};
}
}