Merge pull request #1699 from zed-industries/page-up

Mikayla Maki created

Implemented page up and page down for the editor

Change summary

crates/editor/src/editor.rs  | 32 ++++++++++++++++++++++++++------
crates/editor/src/element.rs |  2 ++
2 files changed, 28 insertions(+), 6 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -451,6 +451,7 @@ pub struct Editor {
     leader_replica_id: Option<u16>,
     hover_state: HoverState,
     link_go_to_definition_state: LinkGoToDefinitionState,
+    visible_line_count: Option<f32>,
     _subscriptions: Vec<Subscription>,
 }
 
@@ -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<Self>) {
-        log::info!("Editor::page_up");
+    pub fn page_up(&mut self, _: &PageUp, cx: &mut ViewContext<Self>) {
+        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<Self>) {
-        log::info!("Editor::page_down");
+    pub fn page_down(&mut self, _: &PageDown, cx: &mut ViewContext<Self>) {
+        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<Self>) {

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 => {