use crate::app; use gpui::{ParentElement, Refineable as _, Styled, div}; #[derive(gpui::IntoElement)] pub(crate) struct Text { content: gpui::AnyElement, font_weight: gpui::FontWeight, opacity: f32, text_align: gpui::TextAlign, line_height: gpui::DefiniteLength, style: gpui::StyleRefinement, } pub(crate) trait TextContent: gpui::IntoElement {} impl TextContent for &'static str {} impl TextContent for String {} impl TextContent for gpui::SharedString {} pub(crate) fn text(content: impl TextContent) -> Text { Text { content: content.into_any_element(), font_weight: gpui::FontWeight::NORMAL, opacity: 1., text_align: gpui::TextAlign::Left, line_height: gpui::relative(1.5), style: gpui::StyleRefinement::default(), } } impl Styled for Text { fn style(&mut self) -> &mut gpui::StyleRefinement { &mut self.style } } impl Text { pub(crate) fn light(mut self) -> Self { self.font_weight = gpui::FontWeight::LIGHT; self } pub(crate) fn medium(mut self) -> Self { self.font_weight = gpui::FontWeight::MEDIUM; self } pub(crate) fn bold(mut self) -> Self { self.font_weight = gpui::FontWeight::BOLD; self } pub(crate) fn opacity(mut self, opacity: f32) -> Self { self.opacity = opacity; self } pub(crate) fn line_height(mut self, line_height: impl Into) -> Self { self.line_height = line_height.into(); self } pub(crate) fn leading_none(self) -> Self { self.line_height(gpui::relative(1.0)) } pub(crate) fn leading_tight(self) -> Self { self.line_height(gpui::relative(1.25)) } pub(crate) fn leading_snug(self) -> Self { self.line_height(gpui::relative(1.375)) } pub(crate) fn leading_normal(self) -> Self { self.line_height(gpui::relative(1.5)) } pub(crate) fn leading_relaxed(self) -> Self { self.line_height(gpui::relative(1.625)) } pub(crate) fn leading_loose(self) -> Self { self.line_height(gpui::relative(2.0)) } pub(crate) fn leading_3(self) -> Self { self.line_height(gpui::rems(0.75)) } pub(crate) fn leading_4(self) -> Self { self.line_height(gpui::rems(1.0)) } pub(crate) fn leading_5(self) -> Self { self.line_height(gpui::rems(1.25)) } pub(crate) fn leading_6(self) -> Self { self.line_height(gpui::rems(1.5)) } pub(crate) fn leading_7(self) -> Self { self.line_height(gpui::rems(1.75)) } pub(crate) fn leading_8(self) -> Self { self.line_height(gpui::rems(2.0)) } pub(crate) fn leading_9(self) -> Self { self.line_height(gpui::rems(2.25)) } pub(crate) fn leading_10(self) -> Self { self.line_height(gpui::rems(2.5)) } pub(crate) fn centered(mut self) -> Self { self.text_align = gpui::TextAlign::Center; self } } impl gpui::RenderOnce for Text { fn render(self, _window: &mut gpui::Window, cx: &mut gpui::App) -> impl gpui::IntoElement { let theme = app::current_theme(cx); let mut div = div() .font_weight(self.font_weight) .opacity(self.opacity) .text_align(self.text_align) .line_height(self.line_height) .child(self.content); div.style().refine(&self.style); if div.style().text.as_ref().and_then(|it| it.color).is_none() { // if no text color override, use theme text color div = div.text_color(theme.colors.text); } div } }