use crate::{ css, Bus, Color, Css, Element, Font, HorizontalAlignment, Length, VerticalAlignment, Widget, }; use dodrio::bumpalo; /// A paragraph of text. /// /// # Example /// /// ``` /// # use iced_web::Text; /// /// Text::new("I <3 iced!") /// .size(40); /// ``` #[derive(Debug, Clone)] pub struct Text { content: String, size: Option, color: Option, font: Font, width: Length, height: Length, horizontal_alignment: HorizontalAlignment, vertical_alignment: VerticalAlignment, } impl Text { /// Create a new fragment of [`Text`] with the given contents. /// /// [`Text`]: struct.Text.html pub fn new>(label: T) -> Self { Text { content: label.into(), size: None, color: None, font: Font::Default, width: Length::Shrink, height: Length::Shrink, horizontal_alignment: HorizontalAlignment::Left, vertical_alignment: VerticalAlignment::Top, } } /// Sets the size of the [`Text`]. /// /// [`Text`]: struct.Text.html pub fn size(mut self, size: u16) -> Self { self.size = Some(size); self } /// Sets the [`Color`] of the [`Text`]. /// /// [`Text`]: struct.Text.html /// [`Color`]: ../../struct.Color.html pub fn color>(mut self, color: C) -> Self { self.color = Some(color.into()); self } /// Sets the [`Font`] of the [`Text`]. /// /// [`Text`]: struct.Text.html /// [`Font`]: ../../struct.Font.html pub fn font(mut self, font: Font) -> Self { self.font = font; self } /// Sets the width of the [`Text`] boundaries. /// /// [`Text`]: struct.Text.html pub fn width(mut self, width: Length) -> Self { self.width = width; self } /// Sets the height of the [`Text`] boundaries. /// /// [`Text`]: struct.Text.html pub fn height(mut self, height: Length) -> Self { self.height = height; self } /// Sets the [`HorizontalAlignment`] of the [`Text`]. /// /// [`Text`]: struct.Text.html /// [`HorizontalAlignment`]: enum.HorizontalAlignment.html pub fn horizontal_alignment( mut self, alignment: HorizontalAlignment, ) -> Self { self.horizontal_alignment = alignment; self } /// Sets the [`VerticalAlignment`] of the [`Text`]. /// /// [`Text`]: struct.Text.html /// [`VerticalAlignment`]: enum.VerticalAlignment.html pub fn vertical_alignment(mut self, alignment: VerticalAlignment) -> Self { self.vertical_alignment = alignment; self } } impl<'a, Message> Widget for Text { fn node<'b>( &self, bump: &'b bumpalo::Bump, _publish: &Bus, _style_sheet: &mut Css<'b>, ) -> dodrio::Node<'b> { use dodrio::builder::*; let content = { use dodrio::bumpalo::collections::String; String::from_str_in(&self.content, bump) }; let color = self .color .map(css::color) .unwrap_or(String::from("inherit")); let width = css::length(self.width); let height = css::length(self.height); let text_align = match self.horizontal_alignment { HorizontalAlignment::Left => "left", HorizontalAlignment::Center => "center", HorizontalAlignment::Right => "right", }; let style = bumpalo::format!( in bump, "width: {}; height: {}; font-size: {}px; color: {}; \ text-align: {}; font-family: {}", width, height, self.size.unwrap_or(20), color, text_align, match self.font { Font::Default => "inherit", Font::External { name, .. } => name, } ); // TODO: Complete styling p(bump) .attr("style", style.into_bump_str()) .children(vec![text(content.into_bump_str())]) .finish() } } impl<'a, Message> From for Element<'a, Message> { fn from(text: Text) -> Element<'a, Message> { Element::new(text) } }