diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index c7bbfca2d7ee639ba3cb22ac2093bea33e6fd478..0cb8cace92369063865688ed08b9c417cd725ede 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -438,7 +438,32 @@ pub struct Editor { keymap_context_layers: BTreeMap, input_enabled: bool, leader_replica_id: Option, - hover_popover: (Option, std::time::Instant, std::time::Instant), + hover_popover: HoverState, +} + +pub struct HoverState { + popover: Option, + 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)) }