use super::types::TooltipConfig;
pub const CHROME_SHOW_DELAY_MS: f64 = 500.0;
pub const TOOLBAR_SHOW_DELAY_MS: f64 = 700.0;
pub const CROSSHAIR_SHOW_DELAY_MS: f64 = 0.0;
pub const FADE_IN_DURATION_MS: f64 = 150.0;
#[derive(Debug, Clone)]
pub struct TooltipState {
pub active: Option<TooltipConfig>,
pub hover_start_ms: f64,
pub show_delay_ms: f64,
pub fade_in_progress: f32,
}
impl Default for TooltipState {
fn default() -> Self {
Self {
active: None,
hover_start_ms: 0.0,
show_delay_ms: CHROME_SHOW_DELAY_MS,
fade_in_progress: 0.0,
}
}
}
impl TooltipState {
pub fn with_delay(show_delay_ms: f64) -> Self {
Self { show_delay_ms, ..Self::default() }
}
pub fn for_chrome() -> Self {
Self::with_delay(CHROME_SHOW_DELAY_MS)
}
pub fn for_toolbar() -> Self {
Self::with_delay(TOOLBAR_SHOW_DELAY_MS)
}
pub fn for_crosshair() -> Self {
Self::with_delay(CROSSHAIR_SHOW_DELAY_MS)
}
pub fn set_hover(&mut self, config: TooltipConfig, now_ms: f64) {
if self.active.is_none() {
self.hover_start_ms = now_ms;
self.fade_in_progress = 0.0;
}
self.active = Some(config);
}
pub fn clear_hover(&mut self) {
self.active = None;
self.fade_in_progress = 0.0;
self.hover_start_ms = 0.0;
}
pub fn tick(&mut self, now_ms: f64, fade_duration_ms: f64) {
if self.active.is_none() {
self.fade_in_progress = 0.0;
return;
}
let elapsed = now_ms - self.hover_start_ms - self.show_delay_ms;
if elapsed <= 0.0 {
self.fade_in_progress = 0.0;
} else if fade_duration_ms > 0.0 {
self.fade_in_progress = ((elapsed / fade_duration_ms) as f32).clamp(0.0, 1.0);
} else {
self.fade_in_progress = 1.0;
}
}
pub fn should_show(&self) -> bool {
self.active.is_some() && self.fade_in_progress > 0.0
}
}