Clean up impl a bit
This commit is contained in:
parent
d529a1deb4
commit
863a3b1886
1 changed files with 42 additions and 29 deletions
|
@ -438,7 +438,32 @@ pub struct Editor {
|
||||||
keymap_context_layers: BTreeMap<TypeId, gpui::keymap::Context>,
|
keymap_context_layers: BTreeMap<TypeId, gpui::keymap::Context>,
|
||||||
input_enabled: bool,
|
input_enabled: bool,
|
||||||
leader_replica_id: Option<u16>,
|
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 {
|
pub struct EditorSnapshot {
|
||||||
|
@ -1053,7 +1078,11 @@ impl Editor {
|
||||||
keymap_context_layers: Default::default(),
|
keymap_context_layers: Default::default(),
|
||||||
input_enabled: true,
|
input_enabled: true,
|
||||||
leader_replica_id: None,
|
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);
|
this.end_selection(cx);
|
||||||
|
|
||||||
|
@ -2442,10 +2471,9 @@ impl Editor {
|
||||||
async move {
|
async move {
|
||||||
if let Some(this) = this.upgrade(&cx) {
|
if let Some(this) = this.upgrade(&cx) {
|
||||||
this.update(&mut cx, |this, cx| {
|
this.update(&mut cx, |this, cx| {
|
||||||
if this.hover_popover.0.is_some() {
|
let (recent_hover, in_grace) = this.hover_popover.determine_state(false);
|
||||||
// dbg!("hidden");
|
if this.hover_popover.popover.is_some() {
|
||||||
this.hover_popover.0 = None;
|
this.hover_popover.popover = None;
|
||||||
this.hover_popover.1 = std::time::Instant::now();
|
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -2534,31 +2562,16 @@ impl Editor {
|
||||||
|
|
||||||
if let Some(this) = this.upgrade(&cx) {
|
if let Some(this) = this.upgrade(&cx) {
|
||||||
this.update(&mut cx, |this, cx| {
|
this.update(&mut cx, |this, cx| {
|
||||||
let item_hovered_recently =
|
let (recent_hover, in_grace) =
|
||||||
this.hover_popover.1.elapsed() < std::time::Duration::from_millis(200);
|
this.hover_popover.determine_state(hover_popover.is_some());
|
||||||
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 smooth_handoff =
|
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();
|
if (smooth_handoff || !recent_hover || in_grace) && visible {
|
||||||
|
this.hover_popover.popover = hover_popover;
|
||||||
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;
|
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -2819,7 +2832,7 @@ impl Editor {
|
||||||
|
|
||||||
pub fn render_hover_popover(&self, style: EditorStyle) -> Option<(DisplayPoint, ElementBox)> {
|
pub fn render_hover_popover(&self, style: EditorStyle) -> Option<(DisplayPoint, ElementBox)> {
|
||||||
self.hover_popover
|
self.hover_popover
|
||||||
.0
|
.popover
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|hover| hover.render(style))
|
.map(|hover| hover.render(style))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue