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;
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);
}
}