ui: Ensure `Label` with `single_line` set does not wrap (#21444)

Jason Lee and Marshall Bowers created

Release Notes:

- N/A

---

Split from #21438, this change for make sure the `single_line` mode
Label will not be wrap.

---------

Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>

Change summary

crates/ui/src/components/label/highlighted_label.rs |  5 +++
crates/ui/src/components/label/label.rs             | 20 ++++----------
crates/ui/src/components/label/label_like.rs        | 11 ++++++++
3 files changed, 22 insertions(+), 14 deletions(-)

Detailed changes

crates/ui/src/components/label/highlighted_label.rs 🔗

@@ -65,6 +65,11 @@ impl LabelCommon for HighlightedLabel {
         self.base = self.base.underline(underline);
         self
     }
+
+    fn single_line(mut self) -> Self {
+        self.base = self.base.single_line();
+        self
+    }
 }
 
 pub fn highlight_ranges(

crates/ui/src/components/label/label.rs 🔗

@@ -56,20 +56,6 @@ impl Label {
             single_line: false,
         }
     }
-
-    /// Make the label display in a single line mode
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use ui::prelude::*;
-    ///
-    /// let my_label = Label::new("Hello, World!").single_line();
-    /// ```
-    pub fn single_line(mut self) -> Self {
-        self.single_line = true;
-        self
-    }
 }
 
 // Style methods.
@@ -177,6 +163,12 @@ impl LabelCommon for Label {
         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 {

crates/ui/src/components/label/label_like.rs 🔗

@@ -49,6 +49,9 @@ pub trait LabelCommon {
 
     /// Sets the alpha property of the label, overwriting the alpha value of the color.
     fn alpha(self, alpha: f32) -> Self;
+
+    /// Sets the label to render as a single line.
+    fn single_line(self) -> Self;
 }
 
 #[derive(IntoElement)]
@@ -63,6 +66,7 @@ pub struct LabelLike {
     children: SmallVec<[AnyElement; 2]>,
     alpha: Option<f32>,
     underline: bool,
+    single_line: bool,
 }
 
 impl Default for LabelLike {
@@ -84,6 +88,7 @@ impl LabelLike {
             children: SmallVec::new(),
             alpha: None,
             underline: false,
+            single_line: false,
         }
     }
 }
@@ -139,6 +144,11 @@ impl LabelCommon for LabelLike {
         self.alpha = Some(alpha);
         self
     }
+
+    fn single_line(mut self) -> Self {
+        self.single_line = true;
+        self
+    }
 }
 
 impl ParentElement for LabelLike {
@@ -178,6 +188,7 @@ impl RenderOnce for LabelLike {
                 this
             })
             .when(self.strikethrough, |this| this.line_through())
+            .when(self.single_line, |this| this.whitespace_nowrap())
             .text_color(color)
             .font_weight(self.weight.unwrap_or(settings.ui_font.weight))
             .children(self.children)