label.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. use kahlo::{colour::Colour, math::PixelBox, prelude::*};
  2. use crate::{
  3. component::Component,
  4. layout::{LayoutNode, LayoutNodeAccess, LeafLayoutNode, SizePolicy},
  5. theme::Theme,
  6. ui::UIHandle,
  7. };
  8. use super::Widget;
  9. pub struct Label<C: Component> {
  10. lnode: LeafLayoutNode,
  11. text: Option<String>,
  12. _ghost: std::marker::PhantomData<C>,
  13. }
  14. impl<C: Component> Label<C> {
  15. pub fn new(uih: &UIHandle) -> Self {
  16. let mut node = uih.new_layout_node();
  17. node.set_width_policy(SizePolicy::expands(1))
  18. .set_height_policy(SizePolicy {
  19. minimum: 20,
  20. desired: 20,
  21. slack_weight: 0,
  22. });
  23. Self {
  24. lnode: LeafLayoutNode::new(node),
  25. text: None,
  26. _ghost: Default::default(),
  27. }
  28. }
  29. pub fn set_text(&mut self, text: String) {
  30. self.text = Some(text);
  31. }
  32. }
  33. impl<C: Component> Widget<C> for Label<C> {
  34. fn poll(
  35. &mut self,
  36. _uih: &mut UIHandle,
  37. _input_state: Option<&crate::input::InputState>,
  38. ) -> Vec<<C as Component>::Msg> {
  39. vec![]
  40. }
  41. fn layout_node(&self) -> LayoutNodeAccess {
  42. LayoutNodeAccess::new(&self.lnode)
  43. }
  44. fn layout_node_mut(&mut self) -> &mut LayoutNode {
  45. &mut self.lnode
  46. }
  47. fn render(&self, theme: &Theme, surface: &mut kahlo::RgbaBitmap) {
  48. let Some(text) = self.text.as_ref() else { return };
  49. let line = theme.make_line(text.as_str());
  50. let rendered = line.render_line();
  51. let render_location = self.layout_node().cached_rect().unwrap();
  52. surface.fill_masked(
  53. &rendered,
  54. &PixelBox::from_size(rendered.size()),
  55. &render_location.origin,
  56. theme.foreground,
  57. kahlo::colour::BlendMode::SourceAlpha,
  58. );
  59. }
  60. }