use std::time::Instant;
use super::CURSOR_BLINK_INTERVAL;
use super::invalidation::{InvalidationKey, InvalidationRequest};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CursorBlink {
visible: bool,
last_toggle: Instant,
}
impl CursorBlink {
const INVALIDATION_KEY: &'static str = "composer-cursor";
#[must_use]
pub fn new() -> Self {
Self {
visible: true,
last_toggle: Instant::now(),
}
}
#[must_use]
pub const fn visible(&self) -> bool {
self.visible
}
pub fn wake(&mut self) {
self.visible = true;
self.last_toggle = Instant::now();
}
#[must_use]
pub fn invalidation_request(&self) -> InvalidationRequest {
InvalidationRequest::new(
InvalidationKey::new(Self::INVALIDATION_KEY),
self.last_toggle + CURSOR_BLINK_INTERVAL,
)
}
pub fn handle_invalidation(&mut self, key: &InvalidationKey, now: Instant) -> bool {
if key.as_str() != Self::INVALIDATION_KEY {
return false;
}
self.toggle(now);
true
}
const fn toggle(&mut self, now: Instant) {
self.visible = !self.visible;
self.last_toggle = now;
}
}