Skip to content

Commit 51e16d5

Browse files
archseerSchuyler Mortimer
authored andcommitted
Revert "Fix precedence of ui.virtual.whitespace (helix-editor#8750)"
This reverts commit 41b307b.
1 parent 24af082 commit 51e16d5

File tree

3 files changed

+65
-125
lines changed

3 files changed

+65
-125
lines changed

helix-term/src/ui/document.rs

Lines changed: 24 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,7 @@ pub fn render_document(
9797
doc: &Document,
9898
offset: ViewPosition,
9999
doc_annotations: &TextAnnotations,
100-
syntax_highlight_iter: impl Iterator<Item = HighlightEvent>,
101-
overlay_highlight_iter: impl Iterator<Item = HighlightEvent>,
100+
highlight_iter: impl Iterator<Item = HighlightEvent>,
102101
theme: &Theme,
103102
line_decoration: &mut [Box<dyn LineDecoration + '_>],
104103
translated_positions: &mut [TranslatedPosition],
@@ -110,8 +109,7 @@ pub fn render_document(
110109
offset,
111110
&doc.text_format(viewport.width, Some(theme)),
112111
doc_annotations,
113-
syntax_highlight_iter,
114-
overlay_highlight_iter,
112+
highlight_iter,
115113
theme,
116114
line_decoration,
117115
translated_positions,
@@ -159,8 +157,7 @@ pub fn render_text<'t>(
159157
offset: ViewPosition,
160158
text_fmt: &TextFormat,
161159
text_annotations: &TextAnnotations,
162-
syntax_highlight_iter: impl Iterator<Item = HighlightEvent>,
163-
overlay_highlight_iter: impl Iterator<Item = HighlightEvent>,
160+
highlight_iter: impl Iterator<Item = HighlightEvent>,
164161
theme: &Theme,
165162
line_decorations: &mut [Box<dyn LineDecoration + '_>],
166163
translated_positions: &mut [TranslatedPosition],
@@ -181,16 +178,10 @@ pub fn render_text<'t>(
181178

182179
let (mut formatter, mut first_visible_char_idx) =
183180
DocumentFormatter::new_at_prev_checkpoint(text, text_fmt, text_annotations, offset.anchor);
184-
let mut syntax_styles = StyleIter {
181+
let mut styles = StyleIter {
185182
text_style: renderer.text_style,
186183
active_highlights: Vec::with_capacity(64),
187-
highlight_iter: syntax_highlight_iter,
188-
theme,
189-
};
190-
let mut overlay_styles = StyleIter {
191-
text_style: renderer.text_style,
192-
active_highlights: Vec::with_capacity(64),
193-
highlight_iter: overlay_highlight_iter,
184+
highlight_iter,
194185
theme,
195186
};
196187

@@ -202,10 +193,7 @@ pub fn render_text<'t>(
202193
};
203194
let mut is_in_indent_area = true;
204195
let mut last_line_indent_level = 0;
205-
let mut syntax_style_span = syntax_styles
206-
.next()
207-
.unwrap_or_else(|| (Style::default(), usize::MAX));
208-
let mut overlay_style_span = overlay_styles
196+
let mut style_span = styles
209197
.next()
210198
.unwrap_or_else(|| (Style::default(), usize::MAX));
211199

@@ -233,16 +221,9 @@ pub fn render_text<'t>(
233221

234222
// skip any graphemes on visual lines before the block start
235223
if pos.row < row_off {
236-
if char_pos >= syntax_style_span.1 {
237-
syntax_style_span = if let Some(syntax_style_span) = syntax_styles.next() {
238-
syntax_style_span
239-
} else {
240-
break;
241-
}
242-
}
243-
if char_pos >= overlay_style_span.1 {
244-
overlay_style_span = if let Some(overlay_style_span) = overlay_styles.next() {
245-
overlay_style_span
224+
if char_pos >= style_span.1 {
225+
style_span = if let Some(style_span) = styles.next() {
226+
style_span
246227
} else {
247228
break;
248229
}
@@ -279,15 +260,8 @@ pub fn render_text<'t>(
279260
}
280261

281262
// acquire the correct grapheme style
282-
if char_pos >= syntax_style_span.1 {
283-
syntax_style_span = syntax_styles
284-
.next()
285-
.unwrap_or((Style::default(), usize::MAX));
286-
}
287-
if char_pos >= overlay_style_span.1 {
288-
overlay_style_span = overlay_styles
289-
.next()
290-
.unwrap_or((Style::default(), usize::MAX));
263+
if char_pos >= style_span.1 {
264+
style_span = styles.next().unwrap_or((Style::default(), usize::MAX));
291265
}
292266
char_pos += grapheme.doc_chars();
293267

@@ -301,25 +275,22 @@ pub fn render_text<'t>(
301275
pos,
302276
);
303277

304-
let (syntax_style, overlay_style) =
305-
if let GraphemeSource::VirtualText { highlight } = grapheme.source {
306-
let mut style = renderer.text_style;
307-
if let Some(highlight) = highlight {
308-
style = style.patch(theme.highlight(highlight.0))
309-
}
310-
(style, Style::default())
278+
let grapheme_style = if let GraphemeSource::VirtualText { highlight } = grapheme.source {
279+
let style = renderer.text_style;
280+
if let Some(highlight) = highlight {
281+
style.patch(theme.highlight(highlight.0))
311282
} else {
312-
(syntax_style_span.0, overlay_style_span.0)
313-
};
283+
style
284+
}
285+
} else {
286+
style_span.0
287+
};
314288

315-
let is_virtual = grapheme.is_virtual();
289+
let virt = grapheme.is_virtual();
316290
renderer.draw_grapheme(
317291
grapheme.grapheme,
318-
GraphemeStyle {
319-
syntax_style,
320-
overlay_style,
321-
},
322-
is_virtual,
292+
grapheme_style,
293+
virt,
323294
&mut last_line_indent_level,
324295
&mut is_in_indent_area,
325296
pos,
@@ -351,11 +322,6 @@ pub struct TextRenderer<'a> {
351322
pub viewport: Rect,
352323
}
353324

354-
pub struct GraphemeStyle {
355-
syntax_style: Style,
356-
overlay_style: Style,
357-
}
358-
359325
impl<'a> TextRenderer<'a> {
360326
pub fn new(
361327
surface: &'a mut Surface,
@@ -429,7 +395,7 @@ impl<'a> TextRenderer<'a> {
429395
pub fn draw_grapheme(
430396
&mut self,
431397
grapheme: Grapheme,
432-
grapheme_style: GraphemeStyle,
398+
mut style: Style,
433399
is_virtual: bool,
434400
last_indent_level: &mut usize,
435401
is_in_indent_area: &mut bool,
@@ -439,11 +405,9 @@ impl<'a> TextRenderer<'a> {
439405
let is_whitespace = grapheme.is_whitespace();
440406

441407
// TODO is it correct to apply the whitespace style to all unicode white spaces?
442-
let mut style = grapheme_style.syntax_style;
443408
if is_whitespace {
444409
style = style.patch(self.whitespace_style);
445410
}
446-
style = style.patch(grapheme_style.overlay_style);
447411

448412
let width = grapheme.width();
449413
let space = if is_virtual { " " } else { &self.space };

helix-term/src/ui/editor.rs

Lines changed: 38 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -124,20 +124,16 @@ impl EditorView {
124124
line_decorations.push(Box::new(line_decoration));
125125
}
126126

127-
let syntax_highlights =
127+
let mut highlights =
128128
Self::doc_syntax_highlights(doc, view.offset.anchor, inner.height, theme);
129-
130-
let mut overlay_highlights =
131-
Self::empty_highlight_iter(doc, view.offset.anchor, inner.height);
132-
let overlay_syntax_highlights = Self::overlay_syntax_highlights(
129+
let overlay_highlights = Self::overlay_syntax_highlights(
133130
doc,
134131
view.offset.anchor,
135132
inner.height,
136133
&text_annotations,
137134
);
138-
if !overlay_syntax_highlights.is_empty() {
139-
overlay_highlights =
140-
Box::new(syntax::merge(overlay_highlights, overlay_syntax_highlights));
135+
if !overlay_highlights.is_empty() {
136+
highlights = Box::new(syntax::merge(highlights, overlay_highlights));
141137
}
142138

143139
for diagnostic in Self::doc_diagnostics_highlights(doc, theme) {
@@ -146,12 +142,12 @@ impl EditorView {
146142
if diagnostic.is_empty() {
147143
continue;
148144
}
149-
overlay_highlights = Box::new(syntax::merge(overlay_highlights, diagnostic));
145+
highlights = Box::new(syntax::merge(highlights, diagnostic));
150146
}
151147

152-
if is_focused {
148+
let highlights: Box<dyn Iterator<Item = HighlightEvent>> = if is_focused {
153149
let highlights = syntax::merge(
154-
overlay_highlights,
150+
highlights,
155151
Self::doc_selection_highlights(
156152
editor.mode(),
157153
doc,
@@ -162,11 +158,13 @@ impl EditorView {
162158
);
163159
let focused_view_elements = Self::highlight_focused_view_elements(view, doc, theme);
164160
if focused_view_elements.is_empty() {
165-
overlay_highlights = Box::new(highlights)
161+
Box::new(highlights)
166162
} else {
167-
overlay_highlights = Box::new(syntax::merge(highlights, focused_view_elements))
163+
Box::new(syntax::merge(highlights, focused_view_elements))
168164
}
169-
}
165+
} else {
166+
Box::new(highlights)
167+
};
170168

171169
let gutter_overflow = view.gutter_offset(doc) == 0;
172170
if !gutter_overflow {
@@ -199,8 +197,7 @@ impl EditorView {
199197
doc,
200198
view.offset,
201199
&text_annotations,
202-
syntax_highlights,
203-
overlay_highlights,
200+
highlights,
204201
theme,
205202
&mut line_decorations,
206203
&mut translated_positions,
@@ -260,39 +257,27 @@ impl EditorView {
260257
.for_each(|area| surface.set_style(area, ruler_theme))
261258
}
262259

263-
fn viewport_byte_range(
264-
text: helix_core::RopeSlice,
265-
row: usize,
266-
height: u16,
267-
) -> std::ops::Range<usize> {
268-
// Calculate viewport byte ranges:
269-
// Saturating subs to make it inclusive zero indexing.
270-
let last_line = text.len_lines().saturating_sub(1);
271-
let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
272-
let start = text.line_to_byte(row.min(last_line));
273-
let end = text.line_to_byte(last_visible_line + 1);
274-
275-
start..end
276-
}
277-
278-
pub fn empty_highlight_iter(
260+
pub fn overlay_syntax_highlights(
279261
doc: &Document,
280262
anchor: usize,
281263
height: u16,
282-
) -> Box<dyn Iterator<Item = HighlightEvent>> {
264+
text_annotations: &TextAnnotations,
265+
) -> Vec<(usize, std::ops::Range<usize>)> {
283266
let text = doc.text().slice(..);
284267
let row = text.char_to_line(anchor.min(text.len_chars()));
285268

286-
// Calculate viewport byte ranges:
287-
// Saturating subs to make it inclusive zero indexing.
288-
let range = Self::viewport_byte_range(text, row, height);
289-
Box::new(
290-
[HighlightEvent::Source {
291-
start: text.byte_to_char(range.start),
292-
end: text.byte_to_char(range.end),
293-
}]
294-
.into_iter(),
295-
)
269+
let range = {
270+
// Calculate viewport byte ranges:
271+
// Saturating subs to make it inclusive zero indexing.
272+
let last_line = text.len_lines().saturating_sub(1);
273+
let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
274+
let start = text.line_to_byte(row.min(last_line));
275+
let end = text.line_to_byte(last_visible_line + 1);
276+
277+
start..end
278+
};
279+
280+
text_annotations.collect_overlay_highlights(range)
296281
}
297282

298283
/// Get syntax highlights for a document in a view represented by the first line
@@ -307,7 +292,16 @@ impl EditorView {
307292
let text = doc.text().slice(..);
308293
let row = text.char_to_line(anchor.min(text.len_chars()));
309294

310-
let range = Self::viewport_byte_range(text, row, height);
295+
let range = {
296+
// Calculate viewport byte ranges:
297+
// Saturating subs to make it inclusive zero indexing.
298+
let last_line = text.len_lines().saturating_sub(1);
299+
let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
300+
let start = text.line_to_byte(row.min(last_line));
301+
let end = text.line_to_byte(last_visible_line + 1);
302+
303+
start..end
304+
};
311305

312306
match doc.syntax() {
313307
Some(syntax) => {
@@ -340,20 +334,6 @@ impl EditorView {
340334
}
341335
}
342336

343-
pub fn overlay_syntax_highlights(
344-
doc: &Document,
345-
anchor: usize,
346-
height: u16,
347-
text_annotations: &TextAnnotations,
348-
) -> Vec<(usize, std::ops::Range<usize>)> {
349-
let text = doc.text().slice(..);
350-
let row = text.char_to_line(anchor.min(text.len_chars()));
351-
352-
let range = Self::viewport_byte_range(text, row, height);
353-
354-
text_annotations.collect_overlay_highlights(range)
355-
}
356-
357337
/// Get highlight spans for document diagnostics
358338
pub fn doc_diagnostics_highlights(
359339
doc: &Document,

helix-term/src/ui/picker.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -752,20 +752,17 @@ impl<T: Item + 'static> Picker<T> {
752752
}
753753
}
754754

755-
let syntax_highlights = EditorView::doc_syntax_highlights(
755+
let mut highlights = EditorView::doc_syntax_highlights(
756756
doc,
757757
offset.anchor,
758758
area.height,
759759
&cx.editor.theme,
760760
);
761-
762-
let mut overlay_highlights =
763-
EditorView::empty_highlight_iter(doc, offset.anchor, area.height);
764761
for spans in EditorView::doc_diagnostics_highlights(doc, &cx.editor.theme) {
765762
if spans.is_empty() {
766763
continue;
767764
}
768-
overlay_highlights = Box::new(helix_core::syntax::merge(overlay_highlights, spans));
765+
highlights = Box::new(helix_core::syntax::merge(highlights, spans));
769766
}
770767
let mut decorations: Vec<Box<dyn LineDecoration>> = Vec::new();
771768

@@ -796,8 +793,7 @@ impl<T: Item + 'static> Picker<T> {
796793
offset,
797794
// TODO: compute text annotations asynchronously here (like inlay hints)
798795
&TextAnnotations::default(),
799-
syntax_highlights,
800-
overlay_highlights,
796+
highlights,
801797
&cx.editor.theme,
802798
&mut decorations,
803799
&mut [],

0 commit comments

Comments
 (0)