#[derive(Debug, Clone)]
pub enum ChartEvent {
Pan { dx: f32, dy: f32 },
Zoom {
factor: f32,
center_x: f32,
center_y: f32,
},
MouseMove { x: f32, y: f32 },
Resize { width: u32, height: u32 },
DataUpdated,
}
#[derive(Clone)]
pub struct ChartState {
pan_dx: f32,
pan_dy: f32,
zoom_factor: f32,
zoom_center_x: f32,
zoom_center_y: f32,
dirty: bool,
}
impl Default for ChartState {
fn default() -> Self {
Self::new()
}
}
impl ChartState {
pub fn new() -> Self {
Self {
pan_dx: 0.0,
pan_dy: 0.0,
zoom_factor: 1.0,
zoom_center_x: 0.0,
zoom_center_y: 0.0,
dirty: true,
}
}
pub fn handle_event(&mut self, ev: ChartEvent) {
match ev {
ChartEvent::Pan { dx, dy } => {
self.pan_dx += dx;
self.pan_dy += dy;
self.dirty = true;
}
ChartEvent::Zoom {
factor,
center_x,
center_y,
} => {
self.zoom_factor *= factor;
self.zoom_center_x = center_x;
self.zoom_center_y = center_y;
self.dirty = true;
}
ChartEvent::MouseMove { .. } => {
self.dirty = true;
}
ChartEvent::Resize { .. } => {
self.dirty = true; }
ChartEvent::DataUpdated => {
self.dirty = true;
}
}
}
pub fn check_needs_redraw(&mut self) -> bool {
let d = self.dirty;
self.dirty = false;
d
}
pub fn take_pan(&mut self) -> (f32, f32) {
let pan = (self.pan_dx, self.pan_dy);
self.pan_dx = 0.0;
self.pan_dy = 0.0;
pan
}
pub fn zoom(&self) -> (f32, f32, f32) {
(self.zoom_factor, self.zoom_center_x, self.zoom_center_y)
}
pub fn reset_zoom(&mut self) {
self.zoom_factor = 1.0;
}
}