diff options
author | Blaž Hrastnik | 2020-10-16 05:37:12 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2020-10-16 05:37:12 +0000 |
commit | 49b4cdb5669b1c572b2b26af4353cb16cb1260f7 (patch) | |
tree | 46b8399f87bb9df099e63cb499a6513e5f3e52c8 | |
parent | 49cc6c19244462b80beeac96be0ea0cc5bc1febc (diff) |
Refactor command calling.
-rw-r--r-- | helix-term/src/application.rs | 42 | ||||
-rw-r--r-- | helix-view/src/editor.rs | 6 | ||||
-rw-r--r-- | helix-view/src/prompt.rs | 12 |
3 files changed, 32 insertions, 28 deletions
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index d4756ef0..51df234a 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -37,7 +37,6 @@ static EX: smol::Executor = smol::Executor::new(); pub struct Application { editor: Editor, prompt: Option<Prompt>, - should_close: bool, terminal: Renderer, } @@ -299,19 +298,18 @@ impl Application { terminal, // TODO; move to state prompt: None, - should_close: false, }; Ok(app) } pub fn set_prompt(&mut self) { - // let commands = |input| match input { - // "q" => self.should_close = true, - // _ => (), - // }; - // let prompt = Prompt::new(|input| None, commands); - // self.prompt = Some(prompt); + let commands = |editor: &mut Editor, input: &str| match input { + "q" => editor.should_close = true, + _ => (), + }; + let prompt = Prompt::new(|input| None, commands); + self.prompt = Some(prompt); } fn render(&mut self) { @@ -341,12 +339,12 @@ impl Application { self.render(); loop { - // Handle key events - if self.should_close { + if self.editor.should_close { break; } - let mut event = reader.next().await; - match event { + + // Handle key events + match reader.next().await { Some(Ok(Event::Resize(width, height))) => { self.terminal.resize(width, height); @@ -359,10 +357,16 @@ impl Application { self.render(); } Some(Ok(Event::Key(event))) => { - // TODO: sequences (`gg`) - // TODO: handle count other than 1 - if let Some(view) = &mut self.editor.view { + // if there's a prompt, it takes priority + if let Some(prompt) = &mut self.prompt { + self.prompt + .as_mut() + .unwrap() + .handle_input(event, &mut self.editor); + } else if let Some(view) = &mut self.editor.view { let keys = vec![event]; + // TODO: sequences (`gg`) + // TODO: handle count other than 1 match view.state.mode() { Mode::Insert => { if let Some(command) = keymap[&Mode::Insert].get(&keys) { @@ -376,9 +380,7 @@ impl Application { } view.ensure_cursor_in_view(); } - Mode::Command => { - self.prompt.as_mut().unwrap().handle_input(event, view); - } + Mode::Command => unreachable!(), mode => { if let Some(command) = keymap[&mode].get(&keys) { command(view, 1); @@ -391,9 +393,7 @@ impl Application { self.render(); } } - Some(Ok(_)) => { - // unhandled event - } + Some(Ok(Event::Mouse(_))) => (), // unhandled Some(Err(x)) => panic!(x), None => break, } diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 444e4bf7..c292caed 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -6,11 +6,15 @@ use anyhow::Error; pub struct Editor { pub view: Option<View>, + pub should_close: bool, } impl Editor { pub fn new() -> Self { - Self { view: None } + Self { + view: None, + should_close: false, + } } pub fn open(&mut self, path: PathBuf, size: (u16, u16)) -> Result<(), Error> { diff --git a/helix-view/src/prompt.rs b/helix-view/src/prompt.rs index b352a386..f0ae44c9 100644 --- a/helix-view/src/prompt.rs +++ b/helix-view/src/prompt.rs @@ -1,5 +1,5 @@ use crate::commands; -use crate::View; +use crate::{Editor, View}; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use std::string::String; @@ -7,13 +7,13 @@ pub struct Prompt { pub buffer: String, pub cursor_loc: usize, completion_fn: Box<dyn FnMut(&str) -> Option<Vec<&str>>>, - callback_fn: Box<dyn FnMut(&str)>, + callback_fn: Box<dyn FnMut(&mut Editor, &str)>, } impl Prompt { pub fn new( completion_fn: impl FnMut(&str) -> Option<Vec<&str>> + 'static, - callback_fn: impl FnMut(&str) + 'static, + callback_fn: impl FnMut(&mut Editor, &str) + 'static, ) -> Prompt { Prompt { buffer: String::from(""), @@ -55,7 +55,7 @@ impl Prompt { } } - pub fn handle_input(&mut self, key_event: KeyEvent, view: &mut View) { + pub fn handle_input(&mut self, key_event: KeyEvent, editor: &mut Editor) { match key_event { KeyEvent { code: KeyCode::Char(c), @@ -63,7 +63,7 @@ impl Prompt { } => self.insert_char(c), KeyEvent { code: KeyCode::Esc, .. - } => commands::normal_mode(view, 1), + } => unimplemented!("Exit prompt!"), KeyEvent { code: KeyCode::Right, .. @@ -87,7 +87,7 @@ impl Prompt { KeyEvent { code: KeyCode::Enter, .. - } => (self.callback_fn)(&self.buffer), + } => (self.callback_fn)(editor, &self.buffer), _ => (), } } |