diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 1abe65d482..38ca82b0d2 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, + visible_line_count: Option, _subscriptions: Vec, } @@ -1052,6 +1053,7 @@ impl Editor { leader_replica_id: None, hover_state: Default::default(), link_go_to_definition_state: Default::default(), + visible_line_count: 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_visible_line_count(&mut self, lines: f32) { + self.visible_line_count = Some(lines) + } + fn set_scroll_top_anchor( &mut self, anchor: Anchor, @@ -5514,12 +5520,26 @@ impl Editor { } } - pub fn page_up(&mut self, _: &PageUp, _: &mut ViewContext) { - log::info!("Editor::page_up"); + pub fn page_up(&mut self, _: &PageUp, cx: &mut ViewContext) { + let lines = match self.visible_line_count { + 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) { + let lines = match self.visible_line_count { + 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..587133e9dd 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1422,6 +1422,8 @@ impl Element for EditorElement { let em_advance = style.text.em_advance(cx.font_cache); let overscroll = vec2f(em_width, 0.); let snapshot = self.update_view(cx.app, |view, cx| { + view.set_visible_line_count(size.y() / line_height); + let wrap_width = match view.soft_wrap_mode(cx) { SoftWrap::None => Some((MAX_LINE_LEN / 2) as f32 * em_advance), SoftWrap::EditorWidth => {