Clean up impl a bit

Isaac Clayton created

Change summary

crates/editor/src/editor.rs | 71 +++++++++++++++++++++++---------------
1 file changed, 42 insertions(+), 29 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -438,7 +438,32 @@ pub struct Editor {
     keymap_context_layers: BTreeMap<TypeId, gpui::keymap::Context>,
     input_enabled: bool,
     leader_replica_id: Option<u16>,
-    hover_popover: (Option<HoverPopover>, std::time::Instant, std::time::Instant),
+    hover_popover: HoverState,
+}
+
+pub struct HoverState {
+    popover: Option<HoverPopover>,
+    last_hover: std::time::Instant,
+    start_grace: std::time::Instant,
+}
+
+impl HoverState {
+    /// Takes whether the cursor is currently hovering over a symbol,
+    /// and returns a tuple containing whether there was a recent hover,
+    /// and whether the hover is still in the grace period.
+    pub fn determine_state(&mut self, hovering: bool) -> (bool, bool) {
+        let recent_hover = self.last_hover.elapsed() < std::time::Duration::from_millis(200);
+        if !hovering {
+            self.last_hover = std::time::Instant::now();
+        }
+
+        let in_grace = self.start_grace.elapsed() < std::time::Duration::from_millis(100);
+        if hovering && !recent_hover {
+            self.start_grace = std::time::Instant::now();
+        }
+
+        return (recent_hover, in_grace);
+    }
 }
 
 pub struct EditorSnapshot {
@@ -1053,7 +1078,11 @@ impl Editor {
             keymap_context_layers: Default::default(),
             input_enabled: true,
             leader_replica_id: None,
-            hover_popover: (None, std::time::Instant::now(), std::time::Instant::now()),
+            hover_popover: HoverState {
+                popover: None,
+                last_hover: std::time::Instant::now(),
+                start_grace: std::time::Instant::now(),
+            },
         };
         this.end_selection(cx);
 
@@ -2442,10 +2471,9 @@ impl Editor {
             async move {
                 if let Some(this) = this.upgrade(&cx) {
                     this.update(&mut cx, |this, cx| {
-                        if this.hover_popover.0.is_some() {
-                            // dbg!("hidden");
-                            this.hover_popover.0 = None;
-                            this.hover_popover.1 = std::time::Instant::now();
+                        let (recent_hover, in_grace) = this.hover_popover.determine_state(false);
+                        if this.hover_popover.popover.is_some() {
+                            this.hover_popover.popover = None;
                             cx.notify();
                         }
                     });
@@ -2534,31 +2562,16 @@ impl Editor {
 
                 if let Some(this) = this.upgrade(&cx) {
                     this.update(&mut cx, |this, cx| {
-                        let item_hovered_recently =
-                            this.hover_popover.1.elapsed() < std::time::Duration::from_millis(200);
-                        if hover_popover.is_none() {
-                            this.hover_popover.1 = std::time::Instant::now();
-                        }
-
-                        let in_grace_period =
-                            this.hover_popover.2.elapsed() < std::time::Duration::from_millis(100);
-                        if hover_popover.is_some() && !item_hovered_recently {
-                            this.hover_popover.2 = std::time::Instant::now();
-                        }
+                        let (recent_hover, in_grace) =
+                            this.hover_popover.determine_state(hover_popover.is_some());
 
                         let smooth_handoff =
-                            this.hover_popover.0.is_some() && hover_popover.is_some();
+                            this.hover_popover.popover.is_some() && hover_popover.is_some();
+                        let visible =
+                            this.hover_popover.popover.is_some() || hover_popover.is_some();
 
-                        let visible = this.hover_popover.0.is_some() || hover_popover.is_some();
-
-                        println!(
-                            "grace:    {}\nrecently: {}",
-                            in_grace_period, item_hovered_recently
-                        );
-
-                        if (smooth_handoff || !item_hovered_recently || in_grace_period) && visible
-                        {
-                            this.hover_popover.0 = hover_popover;
+                        if (smooth_handoff || !recent_hover || in_grace) && visible {
+                            this.hover_popover.popover = hover_popover;
                             cx.notify();
                         }
                     });
@@ -2819,7 +2832,7 @@ impl Editor {
 
     pub fn render_hover_popover(&self, style: EditorStyle) -> Option<(DisplayPoint, ElementBox)> {
         self.hover_popover
-            .0
+            .popover
             .as_ref()
             .map(|hover| hover.render(style))
     }