use super::Widget;
use agape_core::GlobalId;
use agape_layout::{EmptyLayout, IntrinsicSize, Layout};
use agape_renderer::Renderer;
#[derive(Clone, PartialEq, Debug)]
pub struct Text {
id: GlobalId,
pub value: String,
pub font_size: u8,
}
impl Default for Text {
fn default() -> Text {
Text {
id: GlobalId::new(),
value: String::new(),
font_size: 16,
}
}
}
impl Text {
pub fn new(text: &str) -> Self {
Self {
value: text.to_owned(),
..Default::default()
}
}
pub fn font_size(mut self, font_size: u8) -> Self {
self.font_size = font_size;
self
}
}
impl Widget for Text {
fn children(&self) -> Vec<&dyn Widget> {
vec![]
}
fn layout(&self, renderer: &mut Renderer) -> Box<dyn Layout> {
let size = renderer.text_size(&self.value, self.font_size as f32);
let layout = EmptyLayout {
id: self.id,
intrinsic_size: IntrinsicSize::from(size),
..Default::default()
};
Box::new(layout)
}
fn traverse(&mut self, _: &mut dyn FnMut(&mut dyn Widget)) {}
fn render(&self, renderer: &mut Renderer, layout: &dyn Layout) {
if self.value.is_empty() {
return;
}
let layout = layout.get(self.id).unwrap();
let position = layout.position();
let mut text = agape_renderer::Text::new(self.value.as_str());
text.font_size = self.font_size as f32;
text.position = position;
renderer.draw_text(text)
}
fn id(&self) -> GlobalId {
self.id
}
}