Add whitespaces rendering

This commit is contained in:
Kirill Bulatov 2023-05-04 21:09:59 +03:00
parent 2d8c88ad73
commit 714734d279
2 changed files with 42 additions and 33 deletions

View file

@ -889,27 +889,30 @@ impl EditorElement {
ShowInvisibles::None => {} ShowInvisibles::None => {}
ShowInvisibles::All => { ShowInvisibles::All => {
for invisible in &line_with_invisibles.invisibles { for invisible in &line_with_invisibles.invisibles {
match invisible {
Invisible::Tab { line_start_offset } => {
// TODO kb cache, deduplicate // TODO kb cache, deduplicate
let x_offset = let (token_offset, mut test_svg) = match invisible {
line_with_invisibles.line.x_for_index(*line_start_offset); Invisible::Tab { line_start_offset } => (
*line_start_offset,
Svg::new("icons/arrow_right_16.svg")
.with_color(self.style.line_number),
),
Invisible::Whitespace { line_offset } => (
*line_offset,
Svg::new("icons/plus_8.svg").with_color(self.style.line_number),
),
};
let x_offset = line_with_invisibles.line.x_for_index(token_offset);
let font_size = line_with_invisibles.line.font_size(); let font_size = line_with_invisibles.line.font_size();
let max_size = vec2f(font_size, font_size); let max_size = vec2f(font_size, font_size);
let origin = content_origin let origin = content_origin
+ vec2f( + vec2f(
-scroll_left + x_offset, -scroll_left + x_offset,
row as f32 * layout.position_map.line_height row as f32 * layout.position_map.line_height - scroll_top,
- scroll_top,
); );
let mut test_svg = Svg::new("icons/arrow_right_16.svg") let (_, mut layout_state) =
.with_color(Color::red()); test_svg.layout(SizeConstraint::new(origin, max_size), editor, cx);
let (_, mut layout_state) = test_svg.layout(
SizeConstraint::new(origin, max_size),
editor,
cx,
);
test_svg.paint( test_svg.paint(
scene, scene,
RectF::new(origin, max_size), RectF::new(origin, max_size),
@ -919,10 +922,6 @@ impl EditorElement {
cx, cx,
); );
} }
// TODO kb draw whitespaces too
Invisible::Whitespace { .. } => {}
}
}
} }
} }
} }
@ -1723,6 +1722,16 @@ fn layout_highlighted_chunks<'a>(
invisibles.push(Invisible::Tab { invisibles.push(Invisible::Tab {
line_start_offset: line.len(), line_start_offset: line.len(),
}); });
} else {
invisibles.extend(
line_chunk
.chars()
.enumerate()
.filter(|(_, line_char)| line_char.is_whitespace())
.map(|(whitespace_index, _)| Invisible::Whitespace {
line_offset: line.len() + whitespace_index,
}),
)
} }
line.push_str(line_chunk); line.push_str(line_chunk);
} }

View file

@ -214,7 +214,7 @@ pub struct Glyph {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum Invisible { pub enum Invisible {
Tab { line_start_offset: usize }, Tab { line_start_offset: usize },
Whitespace { line_range: std::ops::Range<usize> }, Whitespace { line_offset: usize },
} }
impl Line { impl Line {