@@ -71,20 +71,24 @@ impl Editor {
7171 }
7272
7373 fn render(&mut self) {
74− use tui::backend::Backend;
7574 use tui::style::Color;
7675 // 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
7877 let text_color: Style = Style::default().fg(Color::Rgb(219, 191, 239)); // lilac
7978
80− self.render_view(viewport);
79+ self.render_view(viewport, text_color);
8180
8281 self.render_prompt(text_color);
8382
8483 self.render_cursor(viewport, text_color);
8584 }
8685
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);
89+ }
90+
91+ pub fn render_buffer(&mut self, viewport: Rect) {
8892 use tui::style::Color;
8993 let area = Rect::new(0, 0, self.size.0, self.size.1);
9094 let mut view: &mut View = self.view.as_mut().unwrap();
@@ -219,63 +223,40 @@ impl Editor {
219223 }
220224 }
221225 }
222− }
223−
224− pub fn render_prompt(&mut self, text_color: Style) {
225− use tui::backend::Backend;
226− let view = self.view.as_ref().unwrap();
227226 let style: Style = view.theme.get("ui.linenr");
228227 let last_line = view.last_line();
229228 for (i, line) in (view.first_line..last_line).enumerate() {
230229 self.surface
231230 .set_stringn(0, i as u16, format!("{:>5}", line + 1), 5, style);
232− // lavender
233231 }
232+ }
234233
235− // let lines = state
236− // .doc
237− // .lines_at(self.first_line as usize)
238− // .take(self.size.1 as usize)
239− // .map(|x| x.as_str().unwrap());
240−
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(
250− // (x1 + 2) as u16,
251− // y1 as u16,
252− // (x2 - x1 + 1) as u16,
253− // (y2 - y1 + 1) as u16,
254− // );
255− // self.surface.set_style(area, select);
256−
257− // // TODO: don't highlight next char in append mode
258− // }
259−
260− // statusline
234+ pub fn render_statusline(&mut self, text_color: Style) {
235+ let view = self.view.as_ref().unwrap();
261236 let mode = match view.state.mode() {
262237 Mode::Insert => "INS",
263238 Mode::Normal => "NOR",
264239 Mode::Goto => "GOTO",
265− Mode::Command => ":",
240+ Mode::Command => "COM", // command mode i guess
266241 };
242+ // statusline
267243 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),
269245 view.theme.get("ui.statusline"),
270246 );
247+ self.surface
248+ .set_string(1, self.size.1 - 2, mode, text_color);
249+ }
250+
251+ pub fn render_prompt(&mut self, text_color: Style) {
252+ use tui::backend::Backend;
253+ let view = self.view.as_ref().unwrap();
271254 // render buffer text
272255 let buffer_string = &self.prompt.buffer;
273256 self.surface
274257 .set_string(2, self.size.1 - 1, buffer_string, text_color);
275258
276− self.surface
277− .set_string(1, self.size.1 - 1, mode, text_color);
278−
259+ // TODO: theres probably a better place for this
279260 self.terminal
280261 .backend_mut()
281262 .draw(self.cache.diff(&self.surface).into_iter());