Skip to content
Snippets Groups Projects
text.rs 1.92 KiB
Newer Older
StarArawn's avatar
StarArawn committed
use kayak_core::{styles::Units, Binding, Bound};
use kayak_font::{CoordinateSystem, KayakFont};

StarArawn's avatar
StarArawn committed
    render_command::RenderCommand,
    styles::{Style, StyleProp},
    widget,
};

#[widget]
StarArawn's avatar
StarArawn committed
pub fn Text(
    size: f32,
    line_height: Option<f32>,
    content: String,
    styles: Option<Style>,
    font: Option<String>,
) {
StarArawn's avatar
StarArawn committed
    let font_name = font;
    let font: Binding<Option<KayakFont>> =
        context.get_asset(font_name.clone().unwrap_or("Roboto".into()));

    context.bind(&font);

    // TODO: It might be worth caching the measurement here until content changes.
    let (layout_size, parent_size) =
        if let Some(parent_id) = context.get_valid_parent(parent_id.unwrap()) {
            if let Some(layout) = context.get_layout(&parent_id) {
StarArawn's avatar
StarArawn committed
                if let Some(font) = font.get() {
                    let measurement = font.measure(
                        CoordinateSystem::PositiveYDown,
                        &content,
                        size,
StarArawn's avatar
StarArawn committed
                        line_height.unwrap_or(size * 1.2),
StarArawn's avatar
StarArawn committed
                        (layout.width, layout.height),
                    );

                    (measurement, (layout.width, layout.height))
                } else {
                    ((0.0, 0.0), (layout.width, layout.height))
                }
            } else {
                ((0.0, 0.0), (0.0, 0.0))
            }
        } else {
            ((0.0, 0.0), (0.0, 0.0))
        };

StarArawn's avatar
StarArawn committed
    let render_command = RenderCommand::Text {
StarArawn's avatar
StarArawn committed
        content: content.clone(),
StarArawn's avatar
StarArawn committed
        parent_size,
StarArawn's avatar
StarArawn committed
        line_height: line_height.unwrap_or(size * 1.2),
StarArawn's avatar
StarArawn committed
        font: font_name.clone().unwrap_or("Roboto".into()),
StarArawn's avatar
StarArawn committed
    };
StarArawn's avatar
StarArawn committed

StarArawn's avatar
StarArawn committed
    *styles = Some(Style {
        render_command: StyleProp::Value(render_command),
StarArawn's avatar
StarArawn committed
        width: StyleProp::Value(Units::Pixels(layout_size.0)),
        height: StyleProp::Value(Units::Pixels(layout_size.1)),
StarArawn's avatar
StarArawn committed
        ..styles.clone().unwrap_or_default()
    });
}