#[derive(Debug, Clone, Copy, PartialEq)]
pub struct HoverInfo {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct SelectionBus {
pub hover: Option<HoverInfo>,
pub brush: Option<(f64, f64)>,
pub generation: u64,
}
impl SelectionBus {
pub fn set_hover(&mut self, hover: Option<HoverInfo>) -> bool {
if self.hover == hover {
return false;
}
self.hover = hover;
self.generation += 1;
true
}
pub fn set_brush(&mut self, brush: Option<(f64, f64)>) -> bool {
if self.brush == brush {
return false;
}
self.brush = brush;
self.generation += 1;
true
}
pub fn clear(&mut self) -> bool {
if self.hover.is_none() && self.brush.is_none() {
return false;
}
self.hover = None;
self.brush = None;
self.generation += 1;
true
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn set_hover_bumps_generation_only_on_change() {
let mut bus = SelectionBus::default();
assert!(bus.set_hover(Some(HoverInfo { x: 1.0, y: 2.0 })));
assert_eq!(bus.generation, 1);
assert!(!bus.set_hover(Some(HoverInfo { x: 1.0, y: 2.0 })));
assert_eq!(bus.generation, 1);
assert!(bus.set_hover(None));
assert_eq!(bus.generation, 2);
}
#[test]
fn set_brush_bumps_generation_only_on_change() {
let mut bus = SelectionBus::default();
assert!(bus.set_brush(Some((10.0, 20.0))));
assert!(!bus.set_brush(Some((10.0, 20.0))));
assert!(bus.set_brush(Some((10.0, 25.0))));
assert_eq!(bus.generation, 2);
}
#[test]
fn clear_resets_both_fields_and_reports_whether_anything_changed() {
let mut bus = SelectionBus::default();
assert!(!bus.clear());
bus.set_hover(Some(HoverInfo { x: 0.0, y: 0.0 }));
bus.set_brush(Some((0.0, 1.0)));
assert!(bus.clear());
assert!(bus.hover.is_none());
assert!(bus.brush.is_none());
}
}