Skip to content
Snippets Groups Projects
render_primitive.rs 4.52 KiB
Newer Older
StarArawn's avatar
StarArawn committed
use crate::{
StarToaster's avatar
StarToaster committed
    layout::Rect,
    styles::{Corner, Edge, KStyle, RenderCommand},
StarArawn's avatar
StarArawn committed
};
use bevy::{
    prelude::{Color, Handle, Image, Vec2},
    reflect::Reflect,
};
Gino Valente's avatar
Gino Valente committed
use kayak_font::{TextLayout, TextProperties};
StarArawn's avatar
StarArawn committed

#[derive(Debug, Reflect, Clone, PartialEq)]
StarArawn's avatar
StarArawn committed
pub enum RenderPrimitive {
    Empty,
    Clip {
        layout: Rect,
    },
    Quad {
        layout: Rect,
        background_color: Color,
        border_color: Color,
MrGVSV's avatar
MrGVSV committed
        border: Edge<f32>,
MrGVSV's avatar
MrGVSV committed
        border_radius: Corner<f32>,
StarArawn's avatar
StarArawn committed
    },
    Text {
        color: Color,
        content: String,
StarArawn's avatar
StarArawn committed
        font: String,
        text_layout: TextLayout,
StarArawn's avatar
StarArawn committed
        layout: Rect,
        properties: TextProperties,
StarToaster's avatar
StarToaster committed
        word_wrap: bool,
StarArawn's avatar
StarArawn committed
    },
MrGVSV's avatar
MrGVSV committed
        border_radius: Corner<f32>,
StarArawn's avatar
StarArawn committed
        layout: Rect,
StarToaster's avatar
StarToaster committed
        handle: Handle<Image>,
Matthew's avatar
Matthew committed
    TextureAtlas {
StarToaster's avatar
StarToaster committed
        size: Vec2,
        position: Vec2,
Matthew's avatar
Matthew committed
        layout: Rect,
StarToaster's avatar
StarToaster committed
        handle: Handle<Image>,
Matthew's avatar
Matthew committed
    },
StarArawn's avatar
StarArawn committed
    NinePatch {
MrGVSV's avatar
MrGVSV committed
        border: Edge<f32>,
StarArawn's avatar
StarArawn committed
        layout: Rect,
StarToaster's avatar
StarToaster committed
        handle: Handle<Image>,
StarArawn's avatar
StarArawn committed
    },
StarArawn's avatar
StarArawn committed
}

impl RenderPrimitive {
    pub fn set_layout(&mut self, new_layout: Rect) {
        match self {
            RenderPrimitive::Clip { layout, .. } => *layout = new_layout,
            RenderPrimitive::Quad { layout, .. } => *layout = new_layout,
            RenderPrimitive::Text { layout, .. } => *layout = new_layout,
StarArawn's avatar
StarArawn committed
            RenderPrimitive::Image { layout, .. } => *layout = new_layout,
StarArawn's avatar
StarArawn committed
            RenderPrimitive::NinePatch { layout, .. } => *layout = new_layout,
Matthew's avatar
Matthew committed
            RenderPrimitive::TextureAtlas { layout, .. } => *layout = new_layout,
StarArawn's avatar
StarArawn committed
            _ => (),
        }
    }

    pub fn to_string(&self) -> String {
        match self {
            RenderPrimitive::Clip { .. } => "Clip".into(),
            RenderPrimitive::Quad { .. } => "Quad".into(),
            RenderPrimitive::Text { .. } => "Text".into(),
            RenderPrimitive::Image { .. } => "Image".into(),
            RenderPrimitive::NinePatch { .. } => "NinePatch".into(),
            RenderPrimitive::TextureAtlas { .. } => "TextureAtlas".into(),
            RenderPrimitive::Empty { .. } => "Empty".into(),
        }
    }
StarArawn's avatar
StarArawn committed
}

StarToaster's avatar
StarToaster committed
impl From<&KStyle> for RenderPrimitive {
    fn from(style: &KStyle) -> Self {
StarArawn's avatar
StarArawn committed
        let render_command = style.render_command.resolve();

StarToaster's avatar
StarToaster committed
        let background_color = style
            .background_color
            .resolve_or(Color::rgba(1.0, 1.0, 1.0, 0.0));
StarToaster's avatar
StarToaster committed
        let border_color = style
            .border_color
            .resolve_or(Color::rgba(1.0, 1.0, 1.0, 0.0));
        let font = style
            .font
            .resolve_or_else(|| String::from(crate::DEFAULT_FONT));
        let font_size = style.font_size.resolve_or(14.0);
        let line_height = style.line_height.resolve_or(font_size * 1.2);
StarArawn's avatar
StarArawn committed
        match render_command {
            RenderCommand::Empty => Self::Empty,
StarArawn's avatar
StarArawn committed
            RenderCommand::Clip => Self::Clip {
                layout: Rect::default(),
            },
            RenderCommand::Quad => Self::Quad {
                background_color,
                border_color,
                border_radius: style.border_radius.resolve(),
                border: style.border.resolve(),
StarArawn's avatar
StarArawn committed
                layout: Rect::default(),
            },
StarToaster's avatar
StarToaster committed
            RenderCommand::Text {
                content,
                alignment,
                word_wrap,
StarToaster's avatar
StarToaster committed
            } => Self::Text {
StarArawn's avatar
StarArawn committed
                color: style.color.resolve(),
                content,
                font,
                text_layout: TextLayout::default(),
StarArawn's avatar
StarArawn committed
                layout: Rect::default(),
                properties: TextProperties {
                    font_size,
                    line_height,
StarToaster's avatar
StarToaster committed
                    alignment,
                    ..Default::default()
                },
StarToaster's avatar
StarToaster committed
                word_wrap,
StarArawn's avatar
StarArawn committed
            },
StarArawn's avatar
StarArawn committed
            RenderCommand::Image { handle } => Self::Image {
                border_radius: style.border_radius.resolve(),
StarArawn's avatar
StarArawn committed
                layout: Rect::default(),
                handle,
            },
StarToaster's avatar
StarToaster committed
            RenderCommand::TextureAtlas {
                handle,
                size,
                position,
            } => Self::TextureAtlas {
Matthew's avatar
Matthew committed
                handle,
                layout: Rect::default(),
                size,
                position,
            },
StarArawn's avatar
StarArawn committed
            RenderCommand::NinePatch { handle, border } => Self::NinePatch {
                border,
                layout: Rect::default(),
                handle,
            },
StarArawn's avatar
StarArawn committed
        }
    }
}