diff --git a/src/nvim.rs b/src/nvim.rs index 1d66a87..e81aa93 100644 --- a/src/nvim.rs +++ b/src/nvim.rs @@ -15,6 +15,8 @@ pub trait RedrawEvents { fn on_cursor_goto(&mut self, row: u64, col: u64); fn on_put(&mut self, text: &str); + + fn on_clear(&mut self); } macro_rules! try_str { @@ -84,26 +86,33 @@ fn nvim_cb(ui: &SharedUi, method: &str, params: Vec) { fn call(ui: &SharedUi, method: &str, args: Vec) { match method { "cursor_goto" => { - safe_call(ui.clone(), move |ui| { + safe_call(ui, move |ui| { ui.borrow_mut().on_cursor_goto(try_int!(args[0]), try_int!(args[1])); Ok(()) }) - }, + } "put" => { - safe_call(ui.clone(), move |ui| { + safe_call(ui, move |ui| { ui.borrow_mut().on_put(try_str!(args[0])); Ok(()) }) } + "clear" => { + safe_call(ui, move |ui| { + ui.borrow_mut().on_clear(); + Ok(()) + }) + } _ => println!("Event {}", method), }; } -fn safe_call(mutex: SharedUi, cb: F) +fn safe_call(ui: &SharedUi, cb: F) where F: Fn(&UiMutex) -> result::Result<(), String> + 'static + Send { + let sent_ui = ui.clone(); glib::idle_add(move || { - if let Err(msg) = cb(&*mutex) { + if let Err(msg) = cb(&*sent_ui) { println!("Error call function: {}", msg); } glib::Continue(false) diff --git a/src/ui.rs b/src/ui.rs index e10662d..3e01d74 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -86,5 +86,9 @@ impl RedrawEvents for Ui { fn on_put(&mut self, text: &str) { self.model.put(text); } + + fn on_clear(&mut self) { + self.model.clear(); + } } diff --git a/src/ui_model.rs b/src/ui_model.rs index d0bb26d..ef19073 100644 --- a/src/ui_model.rs +++ b/src/ui_model.rs @@ -6,6 +6,10 @@ impl Cell { pub fn new(ch: char) -> Cell { Cell { ch: ch } } + + fn clear(&mut self) { + self.ch = ' '; + } } pub struct UiModel { @@ -48,4 +52,12 @@ impl UiModel { self.model[self.cur_row][self.cur_col].ch = text.chars().last().unwrap(); self.cur_col += 1; } + + pub fn clear(&mut self) { + for row in 0..self.rows { + for col in 0..self.columns { + self.model[row][col].clear(); + } + } + } }