use slate_renderer::Lpx;
use slate_renderer::scene::{RectInstance, Scene};
use crate::types::Bounds;
#[derive(Clone, Copy, Debug)]
pub(crate) struct FocusBounds {
pub bounds: Bounds,
pub corner_radius: f32,
}
const FOCUS_RING_COLOR: [f32; 4] = [0.247, 0.518, 1.0, 1.0];
const FOCUS_RING_WIDTH: f32 = 2.0;
const FOCUS_RING_OUTSET: f32 = 1.0;
pub(crate) fn emit_focus_ring(scene: &mut Scene, info: FocusBounds) {
let total = FOCUS_RING_OUTSET + FOCUS_RING_WIDTH;
let x = info.bounds.origin.x - total;
let y = info.bounds.origin.y - total;
let w = info.bounds.size.width + 2.0 * total;
let h = info.bounds.size.height + 2.0 * total;
let outer_radius = if info.corner_radius > 0.0 {
info.corner_radius + total
} else {
0.0
};
let pad = [0.0_f32; 3];
let stroke = FOCUS_RING_WIDTH;
scene.push_rect(RectInstance {
rect: [Lpx(x), Lpx(y), Lpx(w), Lpx(stroke)],
color: FOCUS_RING_COLOR,
corner_radius: Lpx(0.0),
_pad: pad,
});
scene.push_rect(RectInstance {
rect: [Lpx(x), Lpx(y + h - stroke), Lpx(w), Lpx(stroke)],
color: FOCUS_RING_COLOR,
corner_radius: Lpx(0.0),
_pad: pad,
});
scene.push_rect(RectInstance {
rect: [Lpx(x), Lpx(y + stroke), Lpx(stroke), Lpx(h - 2.0 * stroke)],
color: FOCUS_RING_COLOR,
corner_radius: Lpx(0.0),
_pad: pad,
});
scene.push_rect(RectInstance {
rect: [
Lpx(x + w - stroke),
Lpx(y + stroke),
Lpx(stroke),
Lpx(h - 2.0 * stroke),
],
color: FOCUS_RING_COLOR,
corner_radius: Lpx(0.0),
_pad: pad,
});
let _ = outer_radius;
}