use uzor::render::{RenderContext, TextAlign, TextBaseline};
use crate::coord::PlotArea;
use crate::scale::Scale;
use crate::theme::FigureTheme;
const DASH_PATTERN: [f64; 2] = [4.0, 3.0];
const LABEL_PAD: f64 = 3.0;
fn axis_step(scale: &dyn Scale) -> f64 {
let ticks = scale.ticks(5);
if ticks.len() >= 2 {
(ticks[1].value - ticks[0].value).abs().max(f64::EPSILON)
} else {
1.0
}
}
pub fn draw_crosshair(ctx: &mut dyn RenderContext, area: &PlotArea, theme: &FigureTheme, data_x: f64, data_y: f64, xscale: &dyn Scale, yscale: &dyn Scale) {
let x = area.x(xscale, data_x);
let y = area.y(yscale, data_y);
if x < area.rect.x || x > area.rect.right() || y < area.rect.y || y > area.rect.bottom() {
return;
}
ctx.set_stroke_color(&theme.label_color);
ctx.set_stroke_width(1.0);
ctx.set_line_dash(&DASH_PATTERN);
ctx.begin_path();
ctx.move_to(x, area.rect.y);
ctx.line_to(x, area.rect.bottom());
ctx.stroke();
ctx.begin_path();
ctx.move_to(area.rect.x, y);
ctx.line_to(area.rect.right(), y);
ctx.stroke();
ctx.set_line_dash(&[]);
let x_label = xscale.format_value(data_x);
let y_label = crate::scale::linear::format_value(data_y, axis_step(yscale));
ctx.set_font(&theme.label_font);
ctx.set_fill_color(&theme.label_color);
ctx.set_text_align(TextAlign::Center);
ctx.set_text_baseline(TextBaseline::Top);
ctx.fill_text(&x_label, x, area.rect.bottom() + LABEL_PAD);
ctx.set_text_align(TextAlign::Right);
ctx.set_text_baseline(TextBaseline::Middle);
ctx.fill_text(&y_label, area.rect.x - LABEL_PAD, y);
}