183 lines · 4.3 KB · Rust
RawDownload
#![allow(missing_docs)] use gpui::{StyleRefinement, WindowContext}; use crate::{prelude::*, LabelCommon, LabelLike, LabelSize, LineHeightStyle}; /// A struct representing a label element in the UI.////// The `Label` struct stores the label text and common properties for a label element./// It provides methods for modifying these properties.////// # Examples////// ```/// use ui::prelude::*;////// Label::new("Hello, World!");/// ```////// **A colored label**, for example labeling a dangerous action:////// ```/// use ui::prelude::*;////// let my_label = Label::new("Delete").color(Color::Error);/// ```////// **A label with a strikethrough**, for example labeling something that has been deleted:////// ```/// use ui::prelude::*;////// let my_label = Label::new("Deleted").strikethrough(true);/// ```#[derive(IntoElement)]pub struct Label {    base: LabelLike,    label: SharedString,    single_line: bool,} impl Label {    /// Creates a new [`Label`] with the given text.    ///    /// # Examples    ///    /// ```    /// use ui::prelude::*;    ///    /// let my_label = Label::new("Hello, World!");    /// ```    pub fn new(label: impl Into<SharedString>) -> Self {        Self {            base: LabelLike::new(),            label: label.into(),            single_line: false,        }    }} // Style methods.impl Label {    fn style(&mut self) -> &mut StyleRefinement {        self.base.base.style()    }     gpui::margin_style_methods!({        visibility: pub    });} impl LabelCommon for Label {    /// Sets the size of the label using a [`LabelSize`].    ///    /// # Examples    ///    /// ```    /// use ui::prelude::*;    ///    /// let my_label = Label::new("Hello, World!").size(LabelSize::Small);    /// ```    fn size(mut self, size: LabelSize) -> Self {        self.base = self.base.size(size);        self    }     fn weight(mut self, weight: gpui::FontWeight) -> Self {        self.base = self.base.weight(weight);        self    }     /// Sets the line height style of the label using a [`LineHeightStyle`].    ///    /// # Examples    ///    /// ```    /// use ui::prelude::*;    ///    /// let my_label = Label::new("Hello, World!").line_height_style(LineHeightStyle::UiLabel);    /// ```    fn line_height_style(mut self, line_height_style: LineHeightStyle) -> Self {        self.base = self.base.line_height_style(line_height_style);        self    }     /// Sets the color of the label using a [`Color`].    ///    /// # Examples    ///    /// ```    /// use ui::prelude::*;    ///    /// let my_label = Label::new("Hello, World!").color(Color::Accent);    /// ```    fn color(mut self, color: Color) -> Self {        self.base = self.base.color(color);        self    }     /// Sets the strikethrough property of the label.    ///    /// # Examples    ///    /// ```    /// use ui::prelude::*;    ///    /// let my_label = Label::new("Hello, World!").strikethrough(true);    /// ```    fn strikethrough(mut self, strikethrough: bool) -> Self {        self.base = self.base.strikethrough(strikethrough);        self    }     /// Sets the italic property of the label.    ///    /// # Examples    ///    /// ```    /// use ui::prelude::*;    ///    /// let my_label = Label::new("Hello, World!").italic(true);    /// ```    fn italic(mut self, italic: bool) -> Self {        self.base = self.base.italic(italic);        self    }     /// Sets the alpha property of the color of label.    ///    /// # Examples    ///    /// ```    /// use ui::prelude::*;    ///    /// let my_label = Label::new("Hello, World!").alpha(0.5);    /// ```    fn alpha(mut self, alpha: f32) -> Self {        self.base = self.base.alpha(alpha);        self    }     fn underline(mut self, underline: bool) -> Self {        self.base = self.base.underline(underline);        self    }     fn single_line(mut self) -> Self {        self.single_line = true;        self.base = self.base.single_line();        self    }} impl RenderOnce for Label {    fn render(self, _cx: &mut WindowContext) -> impl IntoElement {        let target_label = if self.single_line {            SharedString::from(self.label.replace('\n', "␤"))        } else {            self.label        };        self.base.child(target_label)    }}