1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
use super::*; pub struct Text<'a, T: AsRef<str>> { core: WidgetCore, text: T, font: &'a Font, size: f32, color: Color<f32>, } pub fn text<'a, T: AsRef<str>>( text: T, font: &'a Font, size: f32, color: Color<f32>, ) -> Text<'a, T> { Text { core: WidgetCore::void(), text, font, size, color, } } impl<'a, T: AsRef<str>> Widget for Text<'a, T> { fn core(&self) -> &WidgetCore { &self.core } fn core_mut(&mut self) -> &mut WidgetCore { &mut self.core } fn calc_constraints(&mut self) { self.core_mut().constraints = widget::Constraints { min_size: vec2( self.font.measure(self.text.as_ref(), self.size).width() as f64, self.size as f64, ), flex: vec2(0.0, 0.0), }; } fn draw(&mut self, framebuffer: &mut ugli::Framebuffer) { if self.text.as_ref().is_empty() { return; } let size = partial_min( self.core().position.height() as f32, self.size * self.core().position.width() as f32 / self.font.measure(self.text.as_ref(), self.size).width(), ); self.font.draw( framebuffer, self.text.as_ref(), self.core().position.bottom_left().map(|x| x as f32), size, self.color, ); } }