1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use crate::figure::canvas::pixelcanvas::PixelCanvas;
use ab_glyph::FontRef;
/// A trait for plots that support hover functionality, allowing interactive
/// features like highlighting and displaying information about data points.
pub trait Hover {
/// Finds the closest point to the mouse position on the plot.
///
/// # Parameters
/// - `mouse_x`: The x-coordinate of the mouse position in canvas space.
/// - `mouse_y`: The y-coordinate of the mouse position in canvas space.
/// - `canvas`: The `PixelCanvas` being used for rendering the plot.
///
/// # Returns
/// An optional tuple containing:
/// - `((f64, f64), f64)`:
/// - The `(x, y)` coordinates of the closest point.
/// - The distance from the mouse position to the point.
///
/// Returns `None` if no points are found.
fn find_closest_point(
&self,
mouse_x: u32,
mouse_y: u32,
canvas: &PixelCanvas,
) -> Option<((f64, f64), f64)>;
/// Converts plot coordinates into canvas pixel coordinates.
///
/// # Parameters
/// - `x`: The x-coordinate in the plot's coordinate system.
/// - `y`: The y-coordinate in the plot's coordinate system.
/// - `canvas`: The `PixelCanvas` being used for rendering the plot.
///
/// # Returns
/// A tuple `(u32, u32)` representing the corresponding pixel coordinates on the canvas.
fn to_canvas_coordinates(&self, x: f64, y: f64, canvas: &PixelCanvas) -> (u32, u32);
/// Retrieves the font used for hover text rendering.
///
/// # Parameters
/// - `font_data`: A slice containing the font data (e.g., bytes of a TTF file).
///
/// # Returns
/// A `FontRef` representing the parsed font, tied to the lifetime of the `font_data`.
///
/// # Panics
/// Panics if the font data cannot be parsed.
fn get_font<'a>(&self, font_data: &'a [u8]) -> FontRef<'a>;
/// Handles hover functionality and returns an updated buffer if applicable.
///
/// This method is used to modify the canvas buffer in response to hover events,
/// such as highlighting a data point or displaying additional information.
///
/// # Parameters
/// - `mouse_x`: The x-coordinate of the mouse position in canvas space.
/// - `mouse_y`: The y-coordinate of the mouse position in canvas space.
/// - `canvas`: The `PixelCanvas` being used for rendering the plot.
///
/// # Returns
/// An optional vector of `u32` representing the updated pixel buffer.
/// If no changes are made, returns `None`.
fn handle_hover(&self, mouse_x: u32, mouse_y: u32, canvas: &PixelCanvas) -> Option<Vec<u32>>;
}