12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- 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<C: Component> {
- lnode: LeafLayoutNode,
- text: Option<String>,
- _ghost: std::marker::PhantomData<C>,
- }
- impl<C: Component> Label<C> {
- 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<C: Component> Widget<C> for Label<C> {
- fn poll(
- &mut self,
- _uih: &mut UIHandle,
- _input_state: Option<&crate::input::InputState>,
- ) -> Vec<<C as Component>::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,
- );
- }
- }
|