@@ -71,20 +71,24 @@ impl Editor {
73 fn render(&mut self) {
73 fn render(&mut self) {
74− use tui::backend::Backend;
75 use tui::style::Color;
74 use tui::style::Color;
76 // TODO: ideally not mut but highlights require it because of cursor cache
75 // TODO: ideally not mut but highlights require it because of cursor cache
77− let viewport = Rect::new(OFFSET, 0, self.size.0, self.size.1 - 1); // - 1 for statusline
76+ let viewport = Rect::new(OFFSET, 0, self.size.0, self.size.1 - 2); // - 2 for statusline and prompt
78 let text_color: Style = Style::default().fg(Color::Rgb(219, 191, 239)); // lilac
77 let text_color: Style = Style::default().fg(Color::Rgb(219, 191, 239)); // lilac
80− self.render_view(viewport);
79+ self.render_view(viewport, text_color);
82 self.render_prompt(text_color);
81 self.render_prompt(text_color);
84 self.render_cursor(viewport, text_color);
83 self.render_cursor(viewport, text_color);
87− pub fn render_view(&mut self, viewport: Rect) {
86+ pub fn render_view(&mut self, viewport: Rect, text_color: Style) {
87+ self.render_buffer(viewport);
88+ self.render_statusline(text_color);
91+ pub fn render_buffer(&mut self, viewport: Rect) {
88 use tui::style::Color;
92 use tui::style::Color;
89 let area = Rect::new(0, 0, self.size.0, self.size.1);
93 let area = Rect::new(0, 0, self.size.0, self.size.1);
90 let mut view: &mut View = self.view.as_mut().unwrap();
94 let mut view: &mut View = self.view.as_mut().unwrap();
@@ -219,63 +223,40 @@ impl Editor {
224− pub fn render_prompt(&mut self, text_color: Style) {
225− use tui::backend::Backend;
226− let view = self.view.as_ref().unwrap();
227 let style: Style = view.theme.get("ui.linenr");
226 let style: Style = view.theme.get("ui.linenr");
228 let last_line = view.last_line();
227 let last_line = view.last_line();
229 for (i, line) in (view.first_line..last_line).enumerate() {
228 for (i, line) in (view.first_line..last_line).enumerate() {
230 self.surface
229 self.surface
231 .set_stringn(0, i as u16, format!("{:>5}", line + 1), 5, style);
230 .set_stringn(0, i as u16, format!("{:>5}", line + 1), 5, style);
235− // let lines = state
234+ pub fn render_statusline(&mut self, text_color: Style) {
236− // .doc
235+ let view = self.view.as_ref().unwrap();
237− // .lines_at(self.first_line as usize)
238− // .take(self.size.1 as usize)
239− // .map(|x| x.as_str().unwrap());
241− // // iterate over selections and render them
242− // let select = Style::default().bg(tui::style::Color::LightBlue);
243− // let text = state.doc.slice(..);
244− // for range in state.selection.ranges() {
245− // // get terminal coords for x,y for each range pos
246− // // TODO: this won't work with multiline
247− // let (y1, x1) = coords_at_pos(&text, range.from());
248− // let (y2, x2) = coords_at_pos(&text, range.to());
249− // let area = Rect::new(
252− // (x2 - x1 + 1) as u16,
253− // (y2 - y1 + 1) as u16,
255− // self.surface.set_style(area, select);
257− // // TODO: don't highlight next char in append mode
261 let mode = match view.state.mode() {
236 let mode = match view.state.mode() {
262 Mode::Insert => "INS",
237 Mode::Insert => "INS",
263 Mode::Normal => "NOR",
238 Mode::Normal => "NOR",
264 Mode::Goto => "GOTO",
239 Mode::Goto => "GOTO",
265− Mode::Command => ":",
240+ Mode::Command => "COM", // command mode i guess
267 self.surface.set_style(
243 self.surface.set_style(
268− Rect::new(0, self.size.1 - 1, self.size.0, 1),
244+ Rect::new(0, self.size.1 - 2, self.size.0, 1),
269 view.theme.get("ui.statusline"),
245 view.theme.get("ui.statusline"),
248+ .set_string(1, self.size.1 - 2, mode, text_color);
251+ pub fn render_prompt(&mut self, text_color: Style) {
252+ use tui::backend::Backend;
253+ let view = self.view.as_ref().unwrap();
271 // render buffer text
254 // render buffer text
272 let buffer_string = &self.prompt.buffer;
255 let buffer_string = &self.prompt.buffer;
273 self.surface
256 self.surface
274 .set_string(2, self.size.1 - 1, buffer_string, text_color);
257 .set_string(2, self.size.1 - 1, buffer_string, text_color);
276− self.surface
259+ // TODO: theres probably a better place for this
277− .set_string(1, self.size.1 - 1, mode, text_color);
279 self.terminal
260 self.terminal
280 .backend_mut()
261 .backend_mut()
281 .draw(self.cache.diff(&self.surface).into_iter());
262 .draw(self.cache.diff(&self.surface).into_iter());