aboutsummaryrefslogtreecommitdiff
path: root/helix-view/src/view.rs
diff options
context:
space:
mode:
authorBlaž Hrastnik2020-10-22 05:35:07 +0000
committerBlaž Hrastnik2020-12-03 04:10:35 +0000
commitb39849dde1b1277d14dbc4e2e1604e5d020db43d (patch)
treec247d4f605db00248eaa0a4383c5ec65db5f69cc /helix-view/src/view.rs
parent81ccca0c6a18de86223b8142b5742e0603b9b230 (diff)
Refactor: Document type as a wrapper around barebones State.
Diffstat (limited to 'helix-view/src/view.rs')
-rw-r--r--helix-view/src/view.rs40
1 files changed, 29 insertions, 11 deletions
diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs
index 817714c8..4cf6a2ee 100644
--- a/helix-view/src/view.rs
+++ b/helix-view/src/view.rs
@@ -2,10 +2,11 @@ use anyhow::Error;
use std::borrow::Cow;
+use crate::Document;
use helix_core::{
graphemes::{grapheme_width, RopeGraphemes},
indent::TAB_WIDTH,
- History, Position, RopeSlice, State,
+ Position, RopeSlice,
};
use tui::layout::Rect;
@@ -14,29 +15,25 @@ pub const PADDING: usize = 5;
// TODO: view should be View { doc: Document(state, history,..) }
// since we can have multiple views into the same file
pub struct View {
- pub state: State,
+ pub doc: Document,
pub first_line: usize,
pub size: (u16, u16),
-
- // TODO: Doc fields
- pub history: History,
}
impl View {
- pub fn new(state: State, size: (u16, u16)) -> Result<Self, Error> {
+ pub fn new(doc: Document, size: (u16, u16)) -> Result<Self, Error> {
let view = Self {
- state,
+ doc,
first_line: 0,
size,
- history: History::default(),
};
Ok(view)
}
pub fn ensure_cursor_in_view(&mut self) {
- let cursor = self.state.selection().cursor();
- let line = self.state.doc().char_to_line(cursor);
+ let cursor = self.doc.state.selection().cursor();
+ let line = self.doc.text().char_to_line(cursor);
let document_end = self.first_line + (self.size.1 as usize).saturating_sub(2);
// TODO: side scroll
@@ -56,7 +53,7 @@ impl View {
let viewport = Rect::new(6, 0, self.size.0, self.size.1 - 2); // - 2 for statusline and prompt
std::cmp::min(
self.first_line + (viewport.height as usize),
- self.state.doc().len_lines() - 1,
+ self.doc.text().len_lines() - 1,
)
}
@@ -88,4 +85,25 @@ impl View {
Some(Position::new(row, col))
}
+
+ pub fn traverse<F>(&self, text: &RopeSlice, start: usize, end: usize, fun: F)
+ where
+ F: Fn(usize, usize),
+ {
+ let start = self.screen_coords_at_pos(text, start);
+ let end = self.screen_coords_at_pos(text, end);
+
+ match (start, end) {
+ // fully on screen
+ (Some(start), Some(end)) => {
+ // we want to calculate ends of lines for each char..
+ }
+ // from start to end of screen
+ (Some(start), None) => {}
+ // from start of screen to end
+ (None, Some(end)) => {}
+ // not on screen
+ (None, None) => return,
+ }
+ }
}