aura-gui 0.2.1

UI nativa acelerada por GPU para escritorio, Android e iOS, en un solo crate: estilo tipo Tailwind, componentes, sombras, animaciones y agentes de IA. Reposo a cero. Licencia AGPL-3.0 o comercial.
//! Iconos SVG teñibles e imágenes PNG como elementos.

use crate::view::context::ElementContext;
use crate::view::element::Element;
use crate::view::style::{Length, Style};
use crate::view::styled::Styled;
use crate::core::px;
use crate::gpu::ImageSource;
use taffy::NodeId;

/// Icono vectorial que toma el color del texto heredado (o el de `text_color`).
pub struct Svg {
    name: &'static str,
    bytes: &'static [u8],
    style: Style,
    node: Option<NodeId>,
}

pub fn svg(name: &'static str, bytes: &'static [u8]) -> Svg {
    let side = Some(Length::Px(px(16.0)));
    Svg {
        name,
        bytes,
        style: Style { width: side, height: side, flex_shrink: Some(0.0), ..Default::default() },
        node: None,
    }
}

impl Styled for Svg {
    fn style(&mut self) -> &mut Style {
        &mut self.style
    }
}

impl Element for Svg {
    fn request_layout(&mut self, cx: &mut ElementContext) -> NodeId {
        let node = cx.request_node(&self.style, &[]);
        self.node = Some(node);
        node
    }

    fn prepaint(&mut self, _cx: &mut ElementContext) {}

    fn paint(&mut self, cx: &mut ElementContext) {
        let Some(node) = self.node else { return };
        let bounds = cx.node_bounds(node);
        let spec = self.style.text_color.unwrap_or(cx.text_style().color);
        let color = cx.theme.resolve(spec);
        cx.paint_icon(self.name, self.bytes, bounds, color);
    }
}

pub struct Img {
    source: ImageSource,
    style: Style,
    node: Option<NodeId>,
}

pub fn img(source: ImageSource) -> Img {
    Img { source, style: Style::default(), node: None }
}

impl Styled for Img {
    fn style(&mut self) -> &mut Style {
        &mut self.style
    }
}

impl Element for Img {
    fn request_layout(&mut self, cx: &mut ElementContext) -> NodeId {
        let node = cx.request_node(&self.style, &[]);
        self.node = Some(node);
        node
    }

    fn prepaint(&mut self, _cx: &mut ElementContext) {}

    fn paint(&mut self, cx: &mut ElementContext) {
        let Some(node) = self.node else { return };
        let bounds = cx.node_bounds(node);
        cx.paint_image(&self.source, bounds);
    }
}