use kahlo::{colour::Colour, math::PixelBox, prelude::*}; use crate::{ component::Component, layout::{LayoutNode, LayoutNodeAccess, LeafLayoutNode, SizePolicy}, theme::Theme, ui::UIHandle, }; use super::Widget; pub struct Label { lnode: LeafLayoutNode, text: Option, _ghost: std::marker::PhantomData, } impl Label { pub fn new(uih: &UIHandle) -> Self { let mut node = uih.new_layout_node(); node.set_width_policy(SizePolicy::expands(1)) .set_height_policy(SizePolicy { minimum: 20, desired: 20, slack_weight: 0, }); Self { lnode: LeafLayoutNode::new(node), text: None, _ghost: Default::default(), } } pub fn set_text(&mut self, text: String) { self.text = Some(text); } } impl Widget for Label { fn poll( &mut self, _uih: &mut UIHandle, _input_state: Option<&crate::input::InputState>, ) -> Vec<::Msg> { vec![] } fn layout_node(&self) -> LayoutNodeAccess { LayoutNodeAccess::new(&self.lnode) } fn layout_node_mut(&mut self) -> &mut LayoutNode { &mut self.lnode } fn render(&self, theme: &Theme, surface: &mut kahlo::RgbaBitmap) { let Some(text) = self.text.as_ref() else { return }; let line = theme.make_line(text.as_str()); let rendered = line.render_line(); let render_location = self.layout_node().cached_rect().unwrap(); surface.fill_masked( &rendered, &PixelBox::from_size(rendered.size()), &render_location.origin, theme.foreground, kahlo::colour::BlendMode::SourceAlpha, ); } }