Change Editor::set_highlighted_row to take a row range

Co-Authored-By: Antonio Scandurra <me@as-cii.com>
This commit is contained in:
Max Brunsfeld 2022-01-13 09:49:46 -08:00
parent 055d48cfb2
commit 373fe6fadf
3 changed files with 33 additions and 23 deletions

View file

@ -376,7 +376,7 @@ pub struct Editor {
blinking_paused: bool, blinking_paused: bool,
mode: EditorMode, mode: EditorMode,
placeholder_text: Option<Arc<str>>, placeholder_text: Option<Arc<str>>,
highlighted_row: Option<u32>, highlighted_rows: Option<Range<u32>>,
} }
pub struct EditorSnapshot { pub struct EditorSnapshot {
@ -505,7 +505,7 @@ impl Editor {
blinking_paused: false, blinking_paused: false,
mode: EditorMode::Full, mode: EditorMode::Full,
placeholder_text: None, placeholder_text: None,
highlighted_row: None, highlighted_rows: None,
}; };
let selection = Selection { let selection = Selection {
id: post_inc(&mut this.next_selection_id), id: post_inc(&mut this.next_selection_id),
@ -3546,12 +3546,12 @@ impl Editor {
.update(cx, |map, cx| map.set_wrap_width(width, cx)) .update(cx, |map, cx| map.set_wrap_width(width, cx))
} }
pub fn set_highlighted_row(&mut self, row: Option<u32>) { pub fn set_highlighted_rows(&mut self, rows: Option<Range<u32>>) {
self.highlighted_row = row; self.highlighted_rows = rows;
} }
pub fn highlighted_row(&mut self) -> Option<u32> { pub fn highlighted_rows(&self) -> Option<Range<u32>> {
self.highlighted_row self.highlighted_rows.clone()
} }
fn next_blink_epoch(&mut self) -> usize { fn next_blink_epoch(&mut self) -> usize {

View file

@ -263,12 +263,16 @@ impl EditorElement {
} }
} }
if let Some(highlighted_row) = layout.highlighted_row { if let Some(highlighted_rows) = &layout.highlighted_rows {
let origin = vec2f( let origin = vec2f(
bounds.origin_x(), bounds.origin_x(),
bounds.origin_y() + (layout.line_height * highlighted_row as f32) - scroll_top, bounds.origin_y() + (layout.line_height * highlighted_rows.start as f32)
- scroll_top,
);
let size = vec2f(
bounds.width(),
layout.line_height * highlighted_rows.len() as f32,
); );
let size = vec2f(bounds.width(), layout.line_height);
cx.scene.push_quad(Quad { cx.scene.push_quad(Quad {
bounds: RectF::new(origin, size), bounds: RectF::new(origin, size),
background: Some(style.highlighted_line_background), background: Some(style.highlighted_line_background),
@ -640,7 +644,8 @@ impl EditorElement {
.to_display_point(snapshot) .to_display_point(snapshot)
.row(); .row();
let anchor_x = text_x + if rows.contains(&anchor_row) { let anchor_x = text_x
+ if rows.contains(&anchor_row) {
line_layouts[(anchor_row - rows.start) as usize] line_layouts[(anchor_row - rows.start) as usize]
.x_for_index(block.column() as usize) .x_for_index(block.column() as usize)
} else { } else {
@ -648,7 +653,11 @@ impl EditorElement {
.x_for_index(block.column() as usize) .x_for_index(block.column() as usize)
}; };
let mut element = block.render(&BlockContext { cx, anchor_x, line_number_x, }); let mut element = block.render(&BlockContext {
cx,
anchor_x,
line_number_x,
});
element.layout( element.layout(
SizeConstraint { SizeConstraint {
min: Vector2F::zero(), min: Vector2F::zero(),
@ -750,9 +759,9 @@ impl Element for EditorElement {
let mut selections = HashMap::default(); let mut selections = HashMap::default();
let mut active_rows = BTreeMap::new(); let mut active_rows = BTreeMap::new();
let mut highlighted_row = None; let mut highlighted_rows = None;
self.update_view(cx.app, |view, cx| { self.update_view(cx.app, |view, cx| {
highlighted_row = view.highlighted_row(); highlighted_rows = view.highlighted_rows();
let display_map = view.display_map.update(cx, |map, cx| map.snapshot(cx)); let display_map = view.display_map.update(cx, |map, cx| map.snapshot(cx));
let local_selections = view let local_selections = view
@ -831,7 +840,7 @@ impl Element for EditorElement {
snapshot, snapshot,
style: self.settings.style.clone(), style: self.settings.style.clone(),
active_rows, active_rows,
highlighted_row, highlighted_rows,
line_layouts, line_layouts,
line_number_layouts, line_number_layouts,
blocks, blocks,
@ -962,7 +971,7 @@ pub struct LayoutState {
style: EditorStyle, style: EditorStyle,
snapshot: EditorSnapshot, snapshot: EditorSnapshot,
active_rows: BTreeMap<u32, bool>, active_rows: BTreeMap<u32, bool>,
highlighted_row: Option<u32>, highlighted_rows: Option<Range<u32>>,
line_layouts: Vec<text_layout::Line>, line_layouts: Vec<text_layout::Line>,
line_number_layouts: Vec<Option<text_layout::Line>>, line_number_layouts: Vec<Option<text_layout::Line>>,
blocks: Vec<(u32, ElementBox)>, blocks: Vec<(u32, ElementBox)>,

View file

@ -143,8 +143,9 @@ impl GoToLine {
let snapshot = active_editor.snapshot(cx).display_snapshot; let snapshot = active_editor.snapshot(cx).display_snapshot;
let point = snapshot.buffer_snapshot.clip_point(point, Bias::Left); let point = snapshot.buffer_snapshot.clip_point(point, Bias::Left);
let display_point = point.to_display_point(&snapshot); let display_point = point.to_display_point(&snapshot);
let row = display_point.row();
active_editor.select_ranges([point..point], Some(Autoscroll::Center), cx); active_editor.select_ranges([point..point], Some(Autoscroll::Center), cx);
active_editor.set_highlighted_row(Some(display_point.row())); active_editor.set_highlighted_rows(Some(row..row + 1));
Some(active_editor.newest_selection(&snapshot.buffer_snapshot)) Some(active_editor.newest_selection(&snapshot.buffer_snapshot))
}); });
cx.notify(); cx.notify();
@ -162,7 +163,7 @@ impl Entity for GoToLine {
let line_selection = self.line_selection.take(); let line_selection = self.line_selection.take();
let restore_state = self.restore_state.take(); let restore_state = self.restore_state.take();
self.active_editor.update(cx, |editor, cx| { self.active_editor.update(cx, |editor, cx| {
editor.set_highlighted_row(None); editor.set_highlighted_rows(None);
if let Some((line_selection, restore_state)) = line_selection.zip(restore_state) { if let Some((line_selection, restore_state)) = line_selection.zip(restore_state) {
let newest_selection = let newest_selection =
editor.newest_selection::<usize>(&editor.buffer().read(cx).read(cx)); editor.newest_selection::<usize>(&editor.buffer().read(cx).read(cx));