use ribir_core::prelude::*;
use crate::prelude::*;
#[derive(Default, Query, Declare)]
pub struct Divider {
#[declare(default = 1.)]
pub extent: f32,
#[declare(default=Palette::of(ctx!()).outline_variant())]
pub color: Brush,
#[declare(default=Direction::Horizontal)]
pub direction: Direction,
#[declare(default = 1.)]
pub thickness: f32,
#[declare(default = 0.)]
pub indent: f32,
#[declare(default = 0.)]
pub end_indent: f32,
}
impl Render for Divider {
fn perform_layout(&self, clamp: BoxClamp, _: &mut LayoutCtx) -> Size {
if self.direction.is_horizontal() {
Size::new(clamp.max.width, self.extent)
} else {
Size::new(self.extent, clamp.max.height)
}
}
fn paint(&self, ctx: &mut PaintingCtx) {
let mut size = ctx.box_size().unwrap();
let (origin, size) = if self.direction.is_horizontal() {
size.width -= self.indent + self.end_indent;
size.height = self.thickness;
let y = (self.extent - self.thickness) / 2.;
(Point::new(self.indent, y), size)
} else {
size.width = self.thickness;
size.height -= self.indent + self.end_indent;
let x = (self.extent - self.thickness) / 2.;
(Point::new(x, self.indent), size)
};
let painter = ctx.painter();
painter.set_brush(self.color.clone());
painter.rect(&Rect::new(origin, size));
painter.fill();
}
}