use crate::color::conv::IntoLinSrgba;
use crate::draw::primitive::polygon::{self, PolygonInit, PolygonOptions, SetPolygon};
use crate::draw::primitive::Primitive;
use crate::draw::properties::spatial::{dimension, orientation, position};
use crate::draw::properties::{
ColorScalar, LinSrgba, SetColor, SetDimensions, SetOrientation, SetPosition, SetStroke,
};
use crate::draw::{self, Drawing};
use crate::geom;
use crate::glam::Vec2;
use lyon::tessellation::StrokeOptions;
#[derive(Clone, Debug)]
pub struct Rect {
dimensions: dimension::Properties,
polygon: PolygonInit,
}
pub type DrawingRect<'a> = Drawing<'a, Rect>;
impl Rect {
pub fn stroke<C>(self, color: C) -> Self
where
C: IntoLinSrgba<ColorScalar>,
{
self.stroke_color(color)
}
}
impl<'a> DrawingRect<'a> {
pub fn stroke<C>(self, color: C) -> Self
where
C: IntoLinSrgba<ColorScalar>,
{
self.map_ty(|ty| ty.stroke(color))
}
}
impl draw::renderer::RenderPrimitive for Rect {
fn render_primitive(
self,
ctxt: draw::renderer::RenderContext,
mesh: &mut draw::Mesh,
) -> draw::renderer::PrimitiveRender {
let Rect {
polygon,
dimensions,
} = self;
let (maybe_x, maybe_y, maybe_z) = (dimensions.x, dimensions.y, dimensions.z);
assert!(
maybe_z.is_none(),
"z dimension support for rect is unimplemented"
);
let w = maybe_x.unwrap_or(100.0);
let h = maybe_y.unwrap_or(100.0);
let rect = geom::Rect::from_wh([w, h].into());
let points = rect.corners().vertices().map(Vec2::from);
polygon::render_points_themed(
polygon.opts,
points,
ctxt,
&draw::theme::Primitive::Rect,
mesh,
);
draw::renderer::PrimitiveRender::default()
}
}
impl From<geom::Rect<f32>> for Rect {
fn from(r: geom::Rect<f32>) -> Self {
let (x, y, w, h) = r.x_y_w_h();
Self::default().x_y(x, y).w_h(w, h)
}
}
impl Default for Rect {
fn default() -> Self {
let dimensions = <_>::default();
let polygon = <_>::default();
Rect {
dimensions,
polygon,
}
}
}
impl SetOrientation for Rect {
fn properties(&mut self) -> &mut orientation::Properties {
SetOrientation::properties(&mut self.polygon)
}
}
impl SetPosition for Rect {
fn properties(&mut self) -> &mut position::Properties {
SetPosition::properties(&mut self.polygon)
}
}
impl SetDimensions for Rect {
fn properties(&mut self) -> &mut dimension::Properties {
SetDimensions::properties(&mut self.dimensions)
}
}
impl SetColor<ColorScalar> for Rect {
fn rgba_mut(&mut self) -> &mut Option<LinSrgba> {
SetColor::rgba_mut(&mut self.polygon)
}
}
impl SetStroke for Rect {
fn stroke_options_mut(&mut self) -> &mut StrokeOptions {
SetStroke::stroke_options_mut(&mut self.polygon)
}
}
impl SetPolygon for Rect {
fn polygon_options_mut(&mut self) -> &mut PolygonOptions {
SetPolygon::polygon_options_mut(&mut self.polygon)
}
}
impl From<Rect> for Primitive {
fn from(prim: Rect) -> Self {
Primitive::Rect(prim)
}
}
impl Into<Option<Rect>> for Primitive {
fn into(self) -> Option<Rect> {
match self {
Primitive::Rect(prim) => Some(prim),
_ => None,
}
}
}