diff --git a/src/nvim.rs b/src/nvim.rs index afce458..1d66a87 100644 --- a/src/nvim.rs +++ b/src/nvim.rs @@ -2,6 +2,7 @@ use neovim_lib::{Neovim, NeovimApi, Session}; use std::io::{Result, Error, ErrorKind}; use std::sync::Arc; use std::result; +use ui_model::UiModel; use ui_mutex::UiMutex; use rmp::Value; use rmp::value::Integer; @@ -12,11 +13,13 @@ pub type SharedUi = Arc>; pub trait RedrawEvents { fn on_cursor_goto(&mut self, row: u64, col: u64); + + fn on_put(&mut self, text: &str); } macro_rules! try_str { ($exp:expr) => (match $exp { - Value::String(ref val) => val.to_owned(), + Value::String(ref val) => val, _ => return Err("Can't convert argument to string".to_owned()) }) } @@ -37,6 +40,7 @@ pub fn initialize(mut ui: Ui) -> Result { }; let nvim = Neovim::new(session); ui.set_nvim(nvim); + ui.model = UiModel::new(80, 24); let sh_ui = Arc::new(UiMutex::new(ui)); @@ -60,8 +64,10 @@ fn nvim_cb(ui: &SharedUi, method: &str, params: Vec) { for ev in params { if let Value::Array(ev_args) = ev { if let Value::String(ref ev_name) = ev_args[0] { - let mut args = vec![]; - args.extend_from_slice(&ev_args[1..]); + let args = match ev_args[1] { + Value::Array(ref ar) => ar.clone(), + _ => vec![], + }; call(ui, ev_name, args); } else { println!("Unsupported event {:?}", ev_args); @@ -82,6 +88,12 @@ fn call(ui: &SharedUi, method: &str, args: Vec) { ui.borrow_mut().on_cursor_goto(try_int!(args[0]), try_int!(args[1])); Ok(()) }) + }, + "put" => { + safe_call(ui.clone(), move |ui| { + ui.borrow_mut().on_put(try_str!(args[0])); + Ok(()) + }) } _ => println!("Event {}", method), }; diff --git a/src/ui.rs b/src/ui.rs index 9a3b446..e10662d 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -8,7 +8,7 @@ use ui_model::UiModel; use nvim::RedrawEvents; pub struct Ui { - model: UiModel, + pub model: UiModel, nvim: Option, } @@ -82,5 +82,9 @@ impl RedrawEvents for Ui { fn on_cursor_goto(&mut self, row: u64, col: u64) { self.model.set_cursor(row, col); } + + fn on_put(&mut self, text: &str) { + self.model.put(text); + } } diff --git a/src/ui_model.rs b/src/ui_model.rs index a7face1..d0bb26d 100644 --- a/src/ui_model.rs +++ b/src/ui_model.rs @@ -9,11 +9,11 @@ impl Cell { } pub struct UiModel { - columns: u64, - rows: u64, - cur_row: u64, - cur_col: u64, - model: Vec, + columns: usize, + rows: usize, + cur_row: usize, + cur_col: usize, + model: Vec>, } impl UiModel { @@ -21,16 +21,18 @@ impl UiModel { UiModel::new(0, 0) } - pub fn new(columns: u64, rows: u64) -> UiModel { - let cells = (columns * rows) as usize; - let mut model = Vec::with_capacity(cells); - for i in 0..cells { - model[i] = Cell::new(' '); + pub fn new(rows: u64, columns: u64) -> UiModel { + let mut model = Vec::with_capacity(rows as usize); + for i in 0..rows as usize { + model.push(Vec::with_capacity(columns as usize)); + for _ in 0..columns as usize{ + model[i].push(Cell::new(' ')); + } } UiModel { - columns: columns, - rows: rows, + columns: columns as usize, + rows: rows as usize, cur_row: 0, cur_col: 0, model: model, @@ -38,7 +40,12 @@ impl UiModel { } pub fn set_cursor(&mut self, row: u64, col: u64) { - self.cur_col = col; - self.cur_row = row; + self.cur_col = col as usize; + self.cur_row = row as usize; + } + + pub fn put(&mut self, text: &str) { + self.model[self.cur_row][self.cur_col].ch = text.chars().last().unwrap(); + self.cur_col += 1; } }