#[derive(Debug)]
pub struct IdleCursor {
enabled: bool,
hidden: bool,
}
impl IdleCursor {
#[must_use]
pub fn new(enabled: bool) -> Self {
Self {
enabled,
hidden: false,
}
}
pub fn configure(&mut self, enabled: bool) -> Option<bool> {
self.enabled = enabled;
if enabled { None } else { self.show() }
}
pub fn ended_driven(&mut self) -> Option<bool> {
self.set_hidden(self.enabled)
}
pub fn show(&mut self) -> Option<bool> {
self.set_hidden(false)
}
fn set_hidden(&mut self, hidden: bool) -> Option<bool> {
if self.hidden == hidden {
return None;
}
self.hidden = hidden;
Some(hidden)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ended_driven_enabled_hides_once() {
let mut cursor = IdleCursor::new(true);
let changes = [cursor.ended_driven(), cursor.ended_driven()];
assert_eq!(changes, [Some(true), None]);
}
#[test]
fn show_motion_or_new_driver_restores_cursor() {
let mut cursor = IdleCursor::new(true);
cursor.ended_driven();
let changes = [cursor.show(), cursor.show()];
assert_eq!(changes, [Some(false), None]);
}
#[test]
fn configure_disabled_restores_and_never_hides() {
let mut cursor = IdleCursor::new(true);
cursor.ended_driven();
let changes = [cursor.configure(false), cursor.ended_driven()];
assert_eq!(changes, [Some(false), None]);
}
}