aboutsummaryrefslogtreecommitdiff
path: root/helix-view
diff options
context:
space:
mode:
Diffstat (limited to 'helix-view')
-rw-r--r--helix-view/src/editor.rs8
-rw-r--r--helix-view/src/gutter.rs11
-rw-r--r--helix-view/src/view.rs63
3 files changed, 64 insertions, 18 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index 51c0eee0..babb5c43 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -314,6 +314,8 @@ pub enum GutterType {
Diagnostics,
/// Show line numbers
LineNumbers,
+ /// Show one blank space
+ Padding,
}
impl std::str::FromStr for GutterType {
@@ -450,7 +452,11 @@ impl Default for Config {
},
line_number: LineNumber::Absolute,
cursorline: false,
- gutters: vec![GutterType::Diagnostics, GutterType::LineNumbers],
+ gutters: vec![
+ GutterType::Diagnostics,
+ GutterType::LineNumbers,
+ GutterType::Padding,
+ ],
middle_click_paste: true,
auto_pairs: AutoPairConfig::default(),
auto_completion: true,
diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs
index 05fec758..8f7c3062 100644
--- a/helix-view/src/gutter.rs
+++ b/helix-view/src/gutter.rs
@@ -102,6 +102,17 @@ pub fn line_numbers<'doc>(
})
}
+pub fn padding<'doc>(
+ _editor: &'doc Editor,
+ _doc: &'doc Document,
+ _view: &View,
+ _theme: &Theme,
+ _is_focused: bool,
+ _width: usize,
+) -> GutterFn<'doc> {
+ Box::new(|_line: usize, _selected: bool, _out: &mut String| None)
+}
+
#[inline(always)]
const fn abs_diff(a: usize, b: usize) -> usize {
if a > b {
diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs
index bfae12a4..8bf3611f 100644
--- a/helix-view/src/view.rs
+++ b/helix-view/src/view.rs
@@ -75,7 +75,11 @@ pub struct View {
pub last_modified_docs: [Option<DocumentId>; 2],
/// used to store previous selections of tree-sitter objects
pub object_selections: Vec<Selection>,
- pub gutters: Vec<(Gutter, usize)>,
+ /// Gutter (constructor) and width of gutter, used to calculate
+ /// `gutter_offset`
+ gutters: Vec<(Gutter, usize)>,
+ /// cached total width of gutter
+ gutter_offset: u16,
}
impl fmt::Debug for View {
@@ -91,12 +95,23 @@ impl fmt::Debug for View {
impl View {
pub fn new(doc: DocumentId, gutter_types: Vec<crate::editor::GutterType>) -> Self {
let mut gutters: Vec<(Gutter, usize)> = vec![];
+ let mut gutter_offset = 0;
use crate::editor::GutterType;
for gutter_type in &gutter_types {
- match gutter_type {
- GutterType::Diagnostics => gutters.push((gutter::diagnostics_or_breakpoints, 1)),
- GutterType::LineNumbers => gutters.push((gutter::line_numbers, 5)),
- }
+ let width = match gutter_type {
+ GutterType::Diagnostics => 1,
+ GutterType::LineNumbers => 5,
+ GutterType::Padding => 1,
+ };
+ gutter_offset += width;
+ gutters.push((
+ match gutter_type {
+ GutterType::Diagnostics => gutter::diagnostics_or_breakpoints,
+ GutterType::LineNumbers => gutter::line_numbers,
+ GutterType::Padding => gutter::padding,
+ },
+ width as usize,
+ ));
}
Self {
id: ViewId::default(),
@@ -108,6 +123,7 @@ impl View {
last_modified_docs: [None, None],
object_selections: Vec::new(),
gutters,
+ gutter_offset,
}
}
@@ -119,14 +135,12 @@ impl View {
}
pub fn inner_area(&self) -> Rect {
- // TODO: cache this
- let offset = self
- .gutters
- .iter()
- .map(|(_, width)| *width as u16)
- .sum::<u16>()
- + 1; // +1 for some space between gutters and line
- self.area.clip_left(offset).clip_bottom(1) // -1 for statusline
+ // TODO add abilty to not use cached offset for runtime configurable gutter
+ self.area.clip_left(self.gutter_offset).clip_bottom(1) // -1 for statusline
+ }
+
+ pub fn gutters(&self) -> &[(Gutter, usize)] {
+ &self.gutters
}
//
@@ -327,7 +341,11 @@ mod tests {
fn test_text_pos_at_screen_coords() {
let mut view = View::new(
DocumentId::default(),
- vec![GutterType::Diagnostics, GutterType::LineNumbers],
+ vec![
+ GutterType::Diagnostics,
+ GutterType::LineNumbers,
+ GutterType::Padding,
+ ],
);
view.area = Rect::new(40, 40, 40, 40);
let rope = Rope::from_str("abc\n\tdef");
@@ -374,7 +392,10 @@ mod tests {
#[test]
fn test_text_pos_at_screen_coords_without_line_numbers_gutter() {
- let mut view = View::new(DocumentId::default(), vec![GutterType::Diagnostics]);
+ let mut view = View::new(
+ DocumentId::default(),
+ vec![GutterType::Diagnostics, GutterType::Padding],
+ );
view.area = Rect::new(40, 40, 40, 40);
let rope = Rope::from_str("abc\n\tdef");
let text = rope.slice(..);
@@ -400,7 +421,11 @@ mod tests {
fn test_text_pos_at_screen_coords_cjk() {
let mut view = View::new(
DocumentId::default(),
- vec![GutterType::Diagnostics, GutterType::LineNumbers],
+ vec![
+ GutterType::Diagnostics,
+ GutterType::LineNumbers,
+ GutterType::Padding,
+ ],
);
view.area = Rect::new(40, 40, 40, 40);
let rope = Rope::from_str("Hi! こんにちは皆さん");
@@ -440,7 +465,11 @@ mod tests {
fn test_text_pos_at_screen_coords_graphemes() {
let mut view = View::new(
DocumentId::default(),
- vec![GutterType::Diagnostics, GutterType::LineNumbers],
+ vec![
+ GutterType::Diagnostics,
+ GutterType::LineNumbers,
+ GutterType::Padding,
+ ],
);
view.area = Rect::new(40, 40, 40, 40);
let rope = Rope::from_str("Hèl̀l̀ò world!");