clay_layout/
render_commands.rs

1use crate::{
2    bindings::*,
3    elements::{
4        containers::border::BorderContainer, custom::Custom, image::Image, rectangle::Rectangle,
5        text::Text,
6    },
7    math::BoundingBox,
8};
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11#[repr(u8)]
12pub enum RenderCommandType {
13    None = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_NONE,
14    Rectangle = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_RECTANGLE,
15    Border = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_BORDER,
16    Text = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_TEXT,
17    Image = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_IMAGE,
18    ScissorStart = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_SCISSOR_START,
19    ScissorEnd = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_SCISSOR_END,
20    Custom = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_CUSTOM,
21}
22
23#[derive(Debug, Clone)]
24pub enum RenderCommandConfig<'a> {
25    None(),
26    Rectangle(Rectangle),
27    Border(BorderContainer),
28    Text(&'a str, Text),
29    Image(Image),
30    ScissorStart(),
31    ScissorEnd(),
32    Custom(Custom),
33}
34
35impl From<&Clay_RenderCommand> for RenderCommandConfig<'_> {
36    fn from(value: &Clay_RenderCommand) -> Self {
37        match unsafe { core::mem::transmute::<u8, RenderCommandType>(value.commandType) } {
38            RenderCommandType::None => Self::None(),
39            RenderCommandType::Rectangle => Self::Rectangle(Rectangle::from(*unsafe {
40                &mut *(value.config.rectangleElementConfig)
41            })),
42            RenderCommandType::Border => Self::Border(BorderContainer::from(*unsafe {
43                &mut *(value.config.borderElementConfig)
44            })),
45            RenderCommandType::Text => Self::Text(
46                <Clay_String as Into<&str>>::into(value.text),
47                Text::from(*unsafe { &mut *(value.config.textElementConfig) }),
48            ),
49            RenderCommandType::Image => Self::Image(Image::from(*unsafe {
50                &mut *(value.config.imageElementConfig)
51            })),
52            RenderCommandType::ScissorStart => Self::ScissorStart(),
53            RenderCommandType::ScissorEnd => Self::ScissorEnd(),
54            RenderCommandType::Custom => Self::Custom(Custom::from(*unsafe {
55                &mut *(value.config.customElementConfig)
56            })),
57        }
58    }
59}
60
61#[derive(Debug, Clone)]
62pub struct RenderCommand<'a> {
63    pub id: u32,
64    pub bounding_box: BoundingBox,
65    pub config: RenderCommandConfig<'a>,
66}
67
68impl From<Clay_RenderCommand> for RenderCommand<'_> {
69    fn from(value: Clay_RenderCommand) -> Self {
70        Self {
71            id: value.id,
72            bounding_box: value.boundingBox.into(),
73            config: (&value).into(),
74        }
75    }
76}