aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBlaž Hrastnik2020-10-16 05:37:12 +0000
committerBlaž Hrastnik2020-10-16 05:37:12 +0000
commit49b4cdb5669b1c572b2b26af4353cb16cb1260f7 (patch)
tree46b8399f87bb9df099e63cb499a6513e5f3e52c8
parent49cc6c19244462b80beeac96be0ea0cc5bc1febc (diff)
Refactor command calling.
-rw-r--r--helix-term/src/application.rs42
-rw-r--r--helix-view/src/editor.rs6
-rw-r--r--helix-view/src/prompt.rs12
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),
_ => (),
}
}