on master help sign in
Support multiple open views.
b2b3083Blaž Hrastnik
helix-term/src/application.rs+5−8
@@ -354,7 +354,7 @@ impl Application {
354 fn render(&mut self) {
354 fn render(&mut self) {
355 let viewport = Rect::new(OFFSET, 0, self.terminal.size.0, self.terminal.size.1 - 2); // - 2 for statusline and prompt
355 let viewport = Rect::new(OFFSET, 0, self.terminal.size.0, self.terminal.size.1 - 2); // - 2 for statusline and prompt
356
356
357− if let Some(view) = &mut self.editor.view {
357+ if let Some(view) = self.editor.view_mut() {
358 self.terminal.render_view(view, viewport);
358 self.terminal.render_view(view, viewport);
359 if let Some(prompt) = &self.prompt {
359 if let Some(prompt) = &self.prompt {
360 if prompt.should_close {
360 if prompt.should_close {
@@ -368,11 +368,8 @@ impl Application {
368 self.terminal.draw();
368 self.terminal.draw();
369
369
370 // TODO: drop unwrap
370 // TODO: drop unwrap
371− self.terminal.render_cursor(
371+ self.terminal
372− self.editor.view.as_ref().unwrap(),
372+ .render_cursor(self.editor.view().unwrap(), self.prompt.as_ref(), viewport);
373− self.prompt.as_ref(),
374− viewport,
375− );
376 }
373 }
377
374
378 pub async fn event_loop(&mut self) {
375 pub async fn event_loop(&mut self) {
@@ -392,7 +389,7 @@ impl Application {
392 self.terminal.resize(width, height);
389 self.terminal.resize(width, height);
393
390
394 // TODO: simplistic ensure cursor in view for now
391 // TODO: simplistic ensure cursor in view for now
395− if let Some(view) = &mut self.editor.view {
392+ if let Some(view) = self.editor.view_mut() {
396 view.size = self.terminal.size;
393 view.size = self.terminal.size;
397 view.ensure_cursor_in_view()
394 view.ensure_cursor_in_view()
398 };
395 };
@@ -408,7 +405,7 @@ impl Application {
408 .handle_input(event, &mut self.editor);
405 .handle_input(event, &mut self.editor);
409
406
410 self.render();
407 self.render();
411− } else if let Some(view) = &mut self.editor.view {
408+ } else if let Some(view) = self.editor.view_mut() {
412 let keys = vec![event];
409 let keys = vec![event];
413 // TODO: sequences (`gg`)
410 // TODO: sequences (`gg`)
414 // TODO: handle count other than 1
411 // TODO: handle count other than 1
helix-view/src/editor.rs+15−3
@@ -5,20 +5,32 @@ use std::path::PathBuf;
5use anyhow::Error;
5use anyhow::Error;
6
6
7pub struct Editor {
7pub struct Editor {
8− pub view: Option<View>,
8+ pub views: Vec<View>,
9+ pub focus: usize,
9 pub should_close: bool,
10 pub should_close: bool,
10}
11}
11
12
12impl Editor {
13impl Editor {
13 pub fn new() -> Self {
14 pub fn new() -> Self {
14 Self {
15 Self {
15− view: None,
16+ views: Vec::new(),
17+ focus: 0,
16 should_close: false,
18 should_close: false,
17 }
19 }
18 }
20 }
19
21
20 pub fn open(&mut self, path: PathBuf, size: (u16, u16)) -> Result<(), Error> {
22 pub fn open(&mut self, path: PathBuf, size: (u16, u16)) -> Result<(), Error> {
23+ let pos = self.views.len();
21− self.view = Some(View::open(path, size)?);
24+ self.views.push(View::open(path, size)?);
25+ self.focus = pos;
22 Ok(())
26 Ok(())
23 }
27 }
28+
29+ pub fn view(&self) -> Option<&View> {
30+ self.views.get(self.focus)
31+ }
32+
33+ pub fn view_mut(&mut self) -> Option<&mut View> {
34+ self.views.get_mut(self.focus)
35+ }
24}
36}