Clean up impl a bit

This commit is contained in:
Isaac Clayton 2022-05-31 18:18:52 +02:00 committed by Keith Simmons
parent d529a1deb4
commit 863a3b1886

View file

@ -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))
}