use crate::figure::Figure;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MouseButton {
Left,
Middle,
Right,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Event {
MouseDown {
x: f64,
y: f64,
button: MouseButton,
},
MouseUp {
x: f64,
y: f64,
button: MouseButton,
},
MouseMove {
x: f64,
y: f64,
},
Wheel {
x: f64,
y: f64,
dy: f64,
},
DoubleClick {
x: f64,
y: f64,
},
Leave,
Resize {
width_px: f64,
height_px: f64,
},
}
impl Figure {
#[must_use]
pub fn axes_at(&self, px: f64, py: f64) -> Option<usize> {
let (fig_w_px, fig_h_px) = self.size_px();
let display_y = fig_h_px - py;
self.axes()
.iter()
.enumerate()
.rev()
.find(|&(i, ax)| {
let (rect, _) = ax.pixel_rect_and_trans_data_in(
fig_w_px,
fig_h_px,
self.xlim_override_for(i),
self.layout_rect_for(i, fig_w_px, fig_h_px),
);
rect.contains_point(px, display_y)
})
.map(|(i, _)| i)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn axes_at_hits_the_right_axes_and_misses_gaps() {
let mut fig = Figure::new(4.0, 2.0);
fig.add_axes(0.1, 0.1, 0.35, 0.8); fig.add_axes(0.55, 0.1, 0.35, 0.8);
assert_eq!(fig.axes_at(100.0, 100.0), Some(0));
assert_eq!(fig.axes_at(300.0, 100.0), Some(1));
assert_eq!(fig.axes_at(200.0, 100.0), None);
assert_eq!(fig.axes_at(-5.0, 100.0), None);
assert_eq!(fig.axes_at(100.0, 500.0), None);
}
#[test]
fn axes_at_prefers_the_topmost_overlapping_axes() {
let mut fig = Figure::new(2.0, 2.0);
fig.add_axes(0.1, 0.1, 0.8, 0.8);
fig.add_axes(0.3, 0.3, 0.4, 0.4); assert_eq!(fig.axes_at(100.0, 100.0), Some(1));
assert_eq!(fig.axes_at(30.0, 100.0), Some(0));
}
}