Draft invisibles' tabs display

This commit is contained in:
Kirill Bulatov 2023-05-04 13:53:33 +03:00 committed by Kirill Bulatov
parent 4f8607039c
commit ad731ea6d2
3 changed files with 75 additions and 11 deletions

View file

@ -11,6 +11,7 @@ use crate::{
window::WindowContext,
SceneBuilder,
};
use itertools::Itertools;
use ordered_float::OrderedFloat;
use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard};
use smallvec::SmallVec;
@ -178,6 +179,7 @@ impl<'a> Hash for CacheKeyRef<'a> {
pub struct Line {
layout: Arc<LineLayout>,
style_runs: SmallVec<[StyleRun; 32]>,
pub invisibles: SmallVec<[Invisible; 32]>,
}
#[derive(Debug, Clone, Copy)]
@ -211,6 +213,12 @@ pub struct Glyph {
pub is_emoji: bool,
}
#[derive(Debug, Clone)]
pub enum Invisible {
Tab { range: std::ops::Range<usize> },
Whitespace { range: std::ops::Range<usize> },
}
impl Line {
fn new(layout: Arc<LineLayout>, runs: &[(usize, RunStyle)]) -> Self {
let mut style_runs = SmallVec::new();
@ -221,7 +229,11 @@ impl Line {
underline: style.underline,
});
}
Self { layout, style_runs }
Self {
layout,
style_runs,
invisibles: SmallVec::new(),
}
}
pub fn runs(&self) -> &[Run] {
@ -298,6 +310,16 @@ impl Line {
let mut color = Color::black();
let mut underline = None;
let tab_ranges = self
.invisibles
.iter()
.filter_map(|invisible| match invisible {
Invisible::Tab { range } => Some(range),
Invisible::Whitespace { .. } => None,
})
.sorted_by(|tab_range_1, tab_range_2| tab_range_1.start.cmp(&tab_range_2.start))
.collect::<Vec<_>>();
for run in &self.layout.runs {
let max_glyph_width = cx
.font_cache
@ -364,10 +386,19 @@ impl Line {
origin: glyph_origin,
});
} else {
let id = if tab_ranges.iter().any(|tab_range| {
tab_range.start <= glyph.index && glyph.index < tab_range.end
}) {
// TODO kb get a proper (cached) glyph
glyph.id + 100
} else {
glyph.id
};
scene.push_glyph(scene::Glyph {
font_id: run.font_id,
font_size: self.layout.font_size,
id: glyph.id,
id,
origin: glyph_origin,
color,
});