diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 1abe65d482..ee795bb0eb 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -451,6 +451,7 @@ pub struct Editor { leader_replica_id: Option, hover_state: HoverState, link_go_to_definition_state: LinkGoToDefinitionState, + lines: Option, _subscriptions: Vec, } @@ -1052,6 +1053,7 @@ impl Editor { leader_replica_id: None, hover_state: Default::default(), link_go_to_definition_state: Default::default(), + lines: None, _subscriptions: vec![ cx.observe(&buffer, Self::on_buffer_changed), cx.subscribe(&buffer, Self::on_buffer_event), @@ -1163,9 +1165,9 @@ impl Editor { ) { let map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); - if scroll_position.y() == 0. { + if scroll_position.y() <= 0. { self.scroll_top_anchor = Anchor::min(); - self.scroll_position = scroll_position; + self.scroll_position = scroll_position.max(vec2f(0., 0.)); } else { let scroll_top_buffer_offset = DisplayPoint::new(scroll_position.y() as u32, 0).to_offset(&map, Bias::Right); @@ -1186,6 +1188,10 @@ impl Editor { cx.notify(); } + fn set_lines(&mut self, lines: f32) { + self.lines = Some(lines) + } + fn set_scroll_top_anchor( &mut self, anchor: Anchor, @@ -5514,12 +5520,28 @@ impl Editor { } } - pub fn page_up(&mut self, _: &PageUp, _: &mut ViewContext) { + pub fn page_up(&mut self, _: &PageUp, cx: &mut ViewContext) { log::info!("Editor::page_up"); + let lines = match self.lines { + Some(lines) => lines, + None => return, + }; + + let cur_position = self.scroll_position(cx); + let new_pos = cur_position - vec2f(0., lines + 1.); + self.set_scroll_position(new_pos, cx); } - pub fn page_down(&mut self, _: &PageDown, _: &mut ViewContext) { - log::info!("Editor::page_down"); + pub fn page_down(&mut self, _: &PageDown, cx: &mut ViewContext) { + log::info!("Editor::page_up"); + let lines = match self.lines { + Some(lines) => lines, + None => return, + }; + + let cur_position = self.scroll_position(cx); + let new_pos = cur_position + vec2f(0., lines - 1.); + self.set_scroll_position(new_pos, cx); } pub fn fold(&mut self, _: &Fold, cx: &mut ViewContext) { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index acf2e5887c..d1ab64d7b7 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1495,6 +1495,8 @@ impl Element for EditorElement { let mut highlighted_rows = None; let mut highlighted_ranges = Vec::new(); self.update_view(cx.app, |view, cx| { + view.set_lines(size.y() / line_height); + let display_map = view.display_map.update(cx, |map, cx| map.snapshot(cx)); highlighted_rows = view.highlighted_rows();