@@ -6407,169 +6407,169 @@ async fn test_extra_newline_insertion(cx: &mut gpui::TestAppContext) {
// }
// todo!(following)
-// #[gpui::test]
-// async fn test_following(cx: &mut gpui::TestAppContext) {
-// init_test(cx, |_| {});
-
-// let fs = FakeFs::new(cx.executor());
-// let project = Project::test(fs, ["/file.rs".as_ref()], cx).await;
+#[gpui::test]
+async fn test_following(cx: &mut gpui::TestAppContext) {
+ init_test(cx, |_| {});
-// let buffer = project.update(cx, |project, cx| {
-// let buffer = project
-// .create_buffer(&sample_text(16, 8, 'a'), None, cx)
-// .unwrap();
-// cx.build_model(|cx| MultiBuffer::singleton(buffer, cx))
-// });
-// let leader = cx.add_window(|cx| build_editor(buffer.clone(), cx));
-// let follower = cx.update(|cx| {
-// cx.open_window(
-// WindowOptions {
-// bounds: WindowBounds::Fixed(Bounds::from_corners(
-// gpui::Point::new((0. as f64).into(), (0. as f64).into()),
-// gpui::Point::new((10. as f64).into(), (80. as f64).into()),
-// )),
-// ..Default::default()
-// },
-// |cx| cx.build_view(|cx| build_editor(buffer.clone(), cx)),
-// )
-// });
+ let fs = FakeFs::new(cx.executor());
+ let project = Project::test(fs, ["/file.rs".as_ref()], cx).await;
-// let is_still_following = Rc::new(RefCell::new(true));
-// let follower_edit_event_count = Rc::new(RefCell::new(0));
-// let pending_update = Rc::new(RefCell::new(None));
-// follower.update(cx, {
-// let update = pending_update.clone();
-// let is_still_following = is_still_following.clone();
-// let follower_edit_event_count = follower_edit_event_count.clone();
-// |_, cx| {
-// cx.subscribe(
-// &leader.root_view(cx).unwrap(),
-// move |_, leader, event, cx| {
-// leader
-// .read(cx)
-// .add_event_to_update_proto(event, &mut *update.borrow_mut(), cx);
-// },
-// )
-// .detach();
+ let buffer = project.update(cx, |project, cx| {
+ let buffer = project
+ .create_buffer(&sample_text(16, 8, 'a'), None, cx)
+ .unwrap();
+ cx.build_model(|cx| MultiBuffer::singleton(buffer, cx))
+ });
+ let leader = cx.add_window(|cx| build_editor(buffer.clone(), cx));
+ let follower = cx.update(|cx| {
+ cx.open_window(
+ WindowOptions {
+ bounds: WindowBounds::Fixed(Bounds::from_corners(
+ gpui::Point::new((0. as f64).into(), (0. as f64).into()),
+ gpui::Point::new((10. as f64).into(), (80. as f64).into()),
+ )),
+ ..Default::default()
+ },
+ |cx| cx.build_view(|cx| build_editor(buffer.clone(), cx)),
+ )
+ });
-// cx.subscribe(
-// &follower.root_view(cx).unwrap(),
-// move |_, _, event: &Event, cx| {
-// if matches!(event.to_follow_event(), Some(FollowEvent::Unfollow)) {
-// *is_still_following.borrow_mut() = false;
-// }
+ let is_still_following = Rc::new(RefCell::new(true));
+ let follower_edit_event_count = Rc::new(RefCell::new(0));
+ let pending_update = Rc::new(RefCell::new(None));
+ follower.update(cx, {
+ let update = pending_update.clone();
+ let is_still_following = is_still_following.clone();
+ let follower_edit_event_count = follower_edit_event_count.clone();
+ |_, cx| {
+ cx.subscribe(
+ &leader.root_view(cx).unwrap(),
+ move |_, leader, event, cx| {
+ leader
+ .read(cx)
+ .add_event_to_update_proto(event, &mut *update.borrow_mut(), cx);
+ },
+ )
+ .detach();
-// if let Event::BufferEdited = event {
-// *follower_edit_event_count.borrow_mut() += 1;
-// }
-// },
-// )
-// .detach();
-// }
-// });
+ cx.subscribe(
+ &follower.root_view(cx).unwrap(),
+ move |_, _, event: &EditorEvent, cx| {
+ if matches!(event.to_follow_event(), Some(FollowEvent::Unfollow)) {
+ *is_still_following.borrow_mut() = false;
+ }
-// // Update the selections only
-// leader.update(cx, |leader, cx| {
-// leader.change_selections(None, cx, |s| s.select_ranges([1..1]));
-// });
-// follower
-// .update(cx, |follower, cx| {
-// follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
-// })
-// .unwrap()
-// .await
-// .unwrap();
-// follower.update(cx, |follower, cx| {
-// assert_eq!(follower.selections.ranges(cx), vec![1..1]);
-// });
-// assert_eq!(*is_still_following.borrow(), true);
-// assert_eq!(*follower_edit_event_count.borrow(), 0);
+ if let EditorEvent::BufferEdited = event {
+ *follower_edit_event_count.borrow_mut() += 1;
+ }
+ },
+ )
+ .detach();
+ }
+ });
-// // Update the scroll position only
-// leader.update(cx, |leader, cx| {
-// leader.set_scroll_position(gpui::Point::new(1.5, 3.5), cx);
-// });
-// follower
-// .update(cx, |follower, cx| {
-// follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
-// })
-// .unwrap()
-// .await
-// .unwrap();
-// assert_eq!(
-// follower
-// .update(cx, |follower, cx| follower.scroll_position(cx))
-// .unwrap(),
-// gpui::Point::new(1.5, 3.5)
-// );
-// assert_eq!(*is_still_following.borrow(), true);
-// assert_eq!(*follower_edit_event_count.borrow(), 0);
+ // Update the selections only
+ leader.update(cx, |leader, cx| {
+ leader.change_selections(None, cx, |s| s.select_ranges([1..1]));
+ });
+ follower
+ .update(cx, |follower, cx| {
+ follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
+ })
+ .unwrap()
+ .await
+ .unwrap();
+ follower.update(cx, |follower, cx| {
+ assert_eq!(follower.selections.ranges(cx), vec![1..1]);
+ });
+ assert_eq!(*is_still_following.borrow(), true);
+ assert_eq!(*follower_edit_event_count.borrow(), 0);
-// // Update the selections and scroll position. The follower's scroll position is updated
-// // via autoscroll, not via the leader's exact scroll position.
-// leader.update(cx, |leader, cx| {
-// leader.change_selections(None, cx, |s| s.select_ranges([0..0]));
-// leader.request_autoscroll(Autoscroll::newest(), cx);
-// leader.set_scroll_position(gpui::Point::new(1.5, 3.5), cx);
-// });
-// follower
-// .update(cx, |follower, cx| {
-// follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
-// })
-// .unwrap()
-// .await
-// .unwrap();
-// follower.update(cx, |follower, cx| {
-// assert_eq!(follower.scroll_position(cx), gpui::Point::new(1.5, 0.0));
-// assert_eq!(follower.selections.ranges(cx), vec![0..0]);
-// });
-// assert_eq!(*is_still_following.borrow(), true);
+ // Update the scroll position only
+ leader.update(cx, |leader, cx| {
+ leader.set_scroll_position(gpui::Point::new(1.5, 3.5), cx);
+ });
+ follower
+ .update(cx, |follower, cx| {
+ follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
+ })
+ .unwrap()
+ .await
+ .unwrap();
+ assert_eq!(
+ follower
+ .update(cx, |follower, cx| follower.scroll_position(cx))
+ .unwrap(),
+ gpui::Point::new(1.5, 3.5)
+ );
+ assert_eq!(*is_still_following.borrow(), true);
+ assert_eq!(*follower_edit_event_count.borrow(), 0);
+
+ // Update the selections and scroll position. The follower's scroll position is updated
+ // via autoscroll, not via the leader's exact scroll position.
+ leader.update(cx, |leader, cx| {
+ leader.change_selections(None, cx, |s| s.select_ranges([0..0]));
+ leader.request_autoscroll(Autoscroll::newest(), cx);
+ leader.set_scroll_position(gpui::Point::new(1.5, 3.5), cx);
+ });
+ follower
+ .update(cx, |follower, cx| {
+ follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
+ })
+ .unwrap()
+ .await
+ .unwrap();
+ follower.update(cx, |follower, cx| {
+ assert_eq!(follower.scroll_position(cx), gpui::Point::new(1.5, 0.0));
+ assert_eq!(follower.selections.ranges(cx), vec![0..0]);
+ });
+ assert_eq!(*is_still_following.borrow(), true);
-// // Creating a pending selection that precedes another selection
-// leader.update(cx, |leader, cx| {
-// leader.change_selections(None, cx, |s| s.select_ranges([1..1]));
-// leader.begin_selection(DisplayPoint::new(0, 0), true, 1, cx);
-// });
-// follower
-// .update(cx, |follower, cx| {
-// follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
-// })
-// .unwrap()
-// .await
-// .unwrap();
-// follower.update(cx, |follower, cx| {
-// assert_eq!(follower.selections.ranges(cx), vec![0..0, 1..1]);
-// });
-// assert_eq!(*is_still_following.borrow(), true);
+ // Creating a pending selection that precedes another selection
+ leader.update(cx, |leader, cx| {
+ leader.change_selections(None, cx, |s| s.select_ranges([1..1]));
+ leader.begin_selection(DisplayPoint::new(0, 0), true, 1, cx);
+ });
+ follower
+ .update(cx, |follower, cx| {
+ follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
+ })
+ .unwrap()
+ .await
+ .unwrap();
+ follower.update(cx, |follower, cx| {
+ assert_eq!(follower.selections.ranges(cx), vec![0..0, 1..1]);
+ });
+ assert_eq!(*is_still_following.borrow(), true);
-// // Extend the pending selection so that it surrounds another selection
-// leader.update(cx, |leader, cx| {
-// leader.extend_selection(DisplayPoint::new(0, 2), 1, cx);
-// });
-// follower
-// .update(cx, |follower, cx| {
-// follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
-// })
-// .unwrap()
-// .await
-// .unwrap();
-// follower.update(cx, |follower, cx| {
-// assert_eq!(follower.selections.ranges(cx), vec![0..2]);
-// });
+ // Extend the pending selection so that it surrounds another selection
+ leader.update(cx, |leader, cx| {
+ leader.extend_selection(DisplayPoint::new(0, 2), 1, cx);
+ });
+ follower
+ .update(cx, |follower, cx| {
+ follower.apply_update_proto(&project, pending_update.borrow_mut().take().unwrap(), cx)
+ })
+ .unwrap()
+ .await
+ .unwrap();
+ follower.update(cx, |follower, cx| {
+ assert_eq!(follower.selections.ranges(cx), vec![0..2]);
+ });
-// // Scrolling locally breaks the follow
-// follower.update(cx, |follower, cx| {
-// let top_anchor = follower.buffer().read(cx).read(cx).anchor_after(0);
-// follower.set_scroll_anchor(
-// ScrollAnchor {
-// anchor: top_anchor,
-// offset: gpui::Point::new(0.0, 0.5),
-// },
-// cx,
-// );
-// });
-// assert_eq!(*is_still_following.borrow(), false);
-// }
+ // Scrolling locally breaks the follow
+ follower.update(cx, |follower, cx| {
+ let top_anchor = follower.buffer().read(cx).read(cx).anchor_after(0);
+ follower.set_scroll_anchor(
+ ScrollAnchor {
+ anchor: top_anchor,
+ offset: gpui::Point::new(0.0, 0.5),
+ },
+ cx,
+ );
+ });
+ assert_eq!(*is_still_following.borrow(), false);
+}
// #[gpui::test]
// async fn test_following_with_multiple_excerpts(cx: &mut gpui::TestAppContext) {