helix-mirror/helix-view/src/view.rs

48 lines
1.2 KiB
Rust
Raw Normal View History

use anyhow::Error;
use std::path::PathBuf;
use crate::theme::Theme;
use helix_core::State;
pub struct View {
pub state: State,
pub first_line: u16,
pub size: (u16, u16),
pub theme: Theme, // TODO: share one instance
}
impl View {
2020-09-29 13:02:27 +04:00
pub fn open(path: PathBuf, size: (u16, u16)) -> Result<Self, Error> {
let theme = Theme::default();
let state = State::load(path, theme.scopes())?;
2020-09-29 13:02:27 +04:00
let view = Self {
state,
first_line: 0,
size, // TODO: pass in from term
theme,
};
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) as u16;
let document_end = self.first_line + self.size.1.saturating_sub(1) - 1;
let padding = 5u16;
// TODO: side scroll
if line > document_end.saturating_sub(padding) {
// scroll down
self.first_line += line - (document_end.saturating_sub(padding));
} else if line < self.first_line + padding {
// scroll up
self.first_line = line.saturating_sub(padding);
}
}
}