Determine whether the gutter was hovered

Antonio Scandurra created

Change summary

crates/editor2/src/editor.rs  | 20 ++++++--------------
crates/editor2/src/element.rs | 12 ++++++++----
2 files changed, 14 insertions(+), 18 deletions(-)

Detailed changes

crates/editor2/src/editor.rs 🔗

@@ -249,11 +249,6 @@ pub struct UnfoldAt {
     pub buffer_row: u32,
 }
 
-#[action]
-pub struct GutterHover {
-    pub hovered: bool,
-}
-
 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub enum InlayId {
     Suggestion(usize),
@@ -8309,15 +8304,12 @@ impl Editor {
         }
     }
 
-    //     todo!()
-    //     pub fn gutter_hover(
-    //         &mut self,
-    //         GutterHover { hovered }: &GutterHover,
-    //         cx: &mut ViewContext<Self>,
-    //     ) {
-    //         self.gutter_hovered = *hovered;
-    //         cx.notify();
-    //     }
+    pub fn set_gutter_hovered(&mut self, hovered: bool, cx: &mut ViewContext<Self>) {
+        if hovered != self.gutter_hovered {
+            self.gutter_hovered = hovered;
+            cx.notify();
+        }
+    }
 
     pub fn insert_blocks(
         &mut self,

crates/editor2/src/element.rs 🔗

@@ -351,6 +351,7 @@ impl EditorElement {
         event: &MouseMoveEvent,
         position_map: &PositionMap,
         text_bounds: Bounds<Pixels>,
+        gutter_bounds: Bounds<Pixels>,
         cx: &mut ViewContext<Editor>,
     ) -> bool {
         let modifiers = event.modifiers;
@@ -388,9 +389,12 @@ impl EditorElement {
             );
         }
 
-        // This will be handled more correctly once https://github.com/zed-industries/zed/issues/1218 is completed
+        let text_hovered = text_bounds.contains_point(&event.position);
+        let gutter_hovered = gutter_bounds.contains_point(&event.position);
+        editor.set_gutter_hovered(gutter_hovered, cx);
+
         // Don't trigger hover popover if mouse is hovering over context menu
-        if text_bounds.contains_point(&event.position) {
+        if text_hovered {
             let point_for_position = position_map.point_for_position(text_bounds, event.position);
 
             match point_for_position.as_valid() {
@@ -420,7 +424,7 @@ impl EditorElement {
         } else {
             update_go_to_definition_link(editor, None, modifiers.command, modifiers.shift, cx);
             hover_at(editor, None, cx);
-            false
+            gutter_hovered
         }
     }
 
@@ -2349,7 +2353,7 @@ impl EditorElement {
                     return;
                 }
 
-                if Self::mouse_moved(editor, event, &position_map, text_bounds, cx) {
+                if Self::mouse_moved(editor, event, &position_map, text_bounds, gutter_bounds, cx) {
                     cx.stop_propagation()
                 }
             }