Documentation
use crate::render::WrcParam;
use crate::size::rect::Rect;
use crate::style::ClickStyle;

#[repr(C)]
#[derive(Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)]
pub struct CircleDrawParam {
    center: [f32; 2],          // ⬅️ 圆心坐标(像素坐标)
    radius: f32,               // ⬅️ 圆半径
    border_thickness: f32,     // ⬅️ 边框宽度
    fill_color: [f32; 4],      // ⬅️ 填充颜色
    border_color: [f32; 4],    // ⬅️ 边框颜色
}

pub struct CircleParam {
    pub(crate) rect: Rect,
    pub(crate) style: ClickStyle,
    draw: CircleDrawParam,
}

impl CircleParam {
    pub fn new(rect: Rect, style: ClickStyle) -> Self {
        let fill_color = style.dyn_fill(false, false).as_gamma_rgba();
        let border = style.dyn_border(false, false);
        let center = [rect.dx().center(), rect.dy().center()];
        let radius = rect.height() / 2.0;
        let draw = CircleDrawParam {
            center,
            radius,
            border_thickness: border.width,
            fill_color,
            border_color: border.color.as_gamma_rgba(),
        };
        Self {
            rect,
            style,
            draw,
        }
    }
}

impl WrcParam for CircleParam {
    fn as_draw_param(&mut self, hovered: bool, mouse_down: bool) -> &[u8] {
        let fill_color = self.style.dyn_fill(mouse_down, hovered).as_gamma_rgba();
        let border = self.style.dyn_border(mouse_down, hovered);
        let center = [self.rect.dx().center(), self.rect.dy().center()];
        let radius = self.rect.height() / 2.0;
        self.draw.center = center;
        self.draw.radius = radius;
        self.draw.border_thickness = border.width;
        self.draw.fill_color = fill_color;
        self.draw.border_color = border.color.as_gamma_rgba();
        bytemuck::bytes_of(&self.draw)
    }
}