Revert buggy pr (#28554)

Mikayla Maki created

Earlier, I merged #24723

Before merging it, I made a change that was incorrect and fast followed
with a fix: #28548

Following that fix, @bennetbo discovered that the modals where no longer
highlighting correctly, particularly the outline modal.

So I'm going to revert it all.

Release Notes:

- N/A

Change summary

crates/gpui/examples/text_layout.rs | 20 ------------
crates/gpui/src/elements/div.rs     |  4 +-
crates/gpui/src/elements/text.rs    | 18 +++--------
crates/gpui/src/text_system/line.rs | 49 ++++++++----------------------
4 files changed, 21 insertions(+), 70 deletions(-)

Detailed changes

crates/gpui/examples/text_style.rs → crates/gpui/examples/text_layout.rs 🔗

@@ -8,13 +8,11 @@ struct HelloWorld {}
 impl Render for HelloWorld {
     fn render(&mut self, _window: &mut Window, _cx: &mut Context<Self>) -> impl IntoElement {
         div()
-            .font_family(".SystemUIFont")
             .bg(gpui::white())
             .flex()
             .flex_col()
             .gap_2()
             .p_4()
-            .gap_4()
             .size_full()
             .child(div().child("Text left"))
             .child(div().text_center().child("Text center"))
@@ -73,24 +71,6 @@ impl Render for HelloWorld {
                             .child("100%"),
                     ),
             )
-            .child(
-                div()
-                    .id("Text Link")
-                    .text_color(gpui::blue())
-                    .cursor_pointer()
-                    .active(|this| {
-                        this.text_color(gpui::white())
-                            .bg(gpui::blue())
-                            .text_decoration_1()
-                            .text_decoration_wavy()
-                    })
-                    .hover(|this| {
-                        this.text_color(gpui::rgb(0x973717))
-                            .bg(gpui::yellow())
-                            .text_decoration_1()
-                    })
-                    .child("Text with hover, active styles"),
-            )
     }
 }
 

crates/gpui/src/elements/div.rs 🔗

@@ -1666,7 +1666,7 @@ impl Interactivity {
         window: &mut Window,
         cx: &mut App,
     ) {
-        use crate::BorderStyle;
+        use crate::{BorderStyle, TextAlign};
 
         if global_id.is_some()
             && (style.debug || style.debug_below || cx.has_global::<crate::DebugBelow>())
@@ -1689,7 +1689,7 @@ impl Interactivity {
                     .ok()
                     .and_then(|mut text| text.pop())
                 {
-                    text.paint(hitbox.origin, FONT_SIZE, None, None, window, cx)
+                    text.paint(hitbox.origin, FONT_SIZE, TextAlign::Left, None, window, cx)
                         .ok();
 
                     let text_bounds = crate::Bounds {

crates/gpui/src/elements/text.rs 🔗

@@ -1,12 +1,10 @@
 use crate::{
     ActiveTooltip, AnyView, App, Bounds, DispatchPhase, Element, ElementId, GlobalElementId,
     HighlightStyle, Hitbox, IntoElement, LayoutId, MouseDownEvent, MouseMoveEvent, MouseUpEvent,
-    Pixels, Point, SharedString, Size, TextAlign, TextOverflow, TextRun, TextStyle,
-    TextStyleRefinement, TooltipId, WhiteSpace, Window, WrappedLine, WrappedLineLayout,
-    register_tooltip_mouse_handlers, set_tooltip_on_window,
+    Pixels, Point, SharedString, Size, TextOverflow, TextRun, TextStyle, TooltipId, WhiteSpace,
+    Window, WrappedLine, WrappedLineLayout, register_tooltip_mouse_handlers, set_tooltip_on_window,
 };
 use anyhow::anyhow;
-use refineable::Refineable as _;
 use smallvec::SmallVec;
 use std::{
     cell::{Cell, RefCell},
@@ -417,18 +415,12 @@ impl TextLayout {
 
         let line_height = element_state.line_height;
         let mut line_origin = bounds.origin;
-
-        // Get current text_style refinements
-        let mut text_style = TextStyleRefinement::default();
-        for style in window.text_style_stack.iter().as_ref() {
-            text_style.refine(&style);
-        }
-
+        let text_style = window.text_style();
         for line in &element_state.lines {
             line.paint_background(
                 line_origin,
                 line_height,
-                text_style.text_align.unwrap_or(TextAlign::Left),
+                text_style.text_align,
                 Some(bounds),
                 window,
                 cx,
@@ -437,7 +429,7 @@ impl TextLayout {
             line.paint(
                 line_origin,
                 line_height,
-                Some(&text_style),
+                text_style.text_align,
                 Some(bounds),
                 window,
                 cx,

crates/gpui/src/text_system/line.rs 🔗

@@ -1,7 +1,7 @@
 use crate::{
     App, Bounds, Half, Hsla, LineLayout, Pixels, Point, Result, SharedString, StrikethroughStyle,
-    TextAlign, TextStyleRefinement, UnderlineStyle, Window, WrapBoundary, WrappedLineLayout, black,
-    fill, point, px, size,
+    TextAlign, UnderlineStyle, Window, WrapBoundary, WrappedLineLayout, black, fill, point, px,
+    size,
 };
 use derive_more::{Deref, DerefMut};
 use smallvec::SmallVec;
@@ -71,7 +71,7 @@ impl ShapedLine {
             origin,
             &self.layout,
             line_height,
-            None,
+            TextAlign::default(),
             None,
             &self.decoration_runs,
             &[],
@@ -125,12 +125,11 @@ impl WrappedLine {
     }
 
     /// Paint this line of text to the window.
-    #[allow(clippy::too_many_arguments)]
     pub fn paint(
         &self,
         origin: Point<Pixels>,
         line_height: Pixels,
-        text_style: Option<&TextStyleRefinement>,
+        align: TextAlign,
         bounds: Option<Bounds<Pixels>>,
         window: &mut Window,
         cx: &mut App,
@@ -144,7 +143,7 @@ impl WrappedLine {
             origin,
             &self.layout.unwrapped_layout,
             line_height,
-            text_style,
+            align,
             align_width,
             &self.decoration_runs,
             &self.wrap_boundaries,
@@ -190,7 +189,7 @@ fn paint_line(
     origin: Point<Pixels>,
     layout: &LineLayout,
     line_height: Pixels,
-    text_style: Option<&TextStyleRefinement>,
+    align: TextAlign,
     align_width: Option<Pixels>,
     decoration_runs: &[DecorationRun],
     wrap_boundaries: &[WrapBoundary],
@@ -204,12 +203,6 @@ fn paint_line(
             line_height * (wrap_boundaries.len() as f32 + 1.),
         ),
     );
-
-    // TODO: text_align and line_height need to inherit from normal style when is hovered or activated.
-    let mut text_align = text_style
-        .and_then(|s| s.text_align)
-        .unwrap_or(TextAlign::Left);
-
     window.paint_layer(line_bounds, |window| {
         let padding_top = (line_height - layout.ascent - layout.descent) / 2.;
         let baseline_offset = point(px(0.), padding_top + layout.ascent);
@@ -225,7 +218,7 @@ fn paint_line(
                 origin,
                 align_width.unwrap_or(layout.width),
                 px(0.0),
-                &text_align,
+                &align,
                 layout,
                 wraps.peek(),
             ),
@@ -276,7 +269,7 @@ fn paint_line(
                         origin,
                         align_width.unwrap_or(layout.width),
                         glyph.position.x,
-                        &text_align,
+                        &align,
                         layout,
                         wraps.peek(),
                     );
@@ -299,44 +292,30 @@ fn paint_line(
                     }
 
                     if let Some(style_run) = style_run {
-                        let mut run_color = style_run.color;
-                        let mut run_underline = style_run.underline.as_ref();
-                        let mut run_strikethrough = style_run.strikethrough;
-                        // Override by text run by current style when hovered or activated.
-                        if let Some(val) = text_style.and_then(|s| s.color) {
-                            run_color = val;
-                        }
-                        if let Some(val) = text_style.and_then(|s| s.underline.as_ref()) {
-                            run_underline = Some(val);
-                        }
-                        if let Some(val) = text_style.and_then(|s| s.strikethrough) {
-                            run_strikethrough = Some(val);
-                        }
-
                         if let Some((_, underline_style)) = &mut current_underline {
                             if style_run.underline.as_ref() != Some(underline_style) {
                                 finished_underline = current_underline.take();
                             }
                         }
-                        if let Some(run_underline) = run_underline.as_ref() {
+                        if let Some(run_underline) = style_run.underline.as_ref() {
                             current_underline.get_or_insert((
                                 point(
                                     glyph_origin.x,
                                     glyph_origin.y + baseline_offset.y + (layout.descent * 0.618),
                                 ),
                                 UnderlineStyle {
-                                    color: Some(run_underline.color.unwrap_or(run_color)),
+                                    color: Some(run_underline.color.unwrap_or(style_run.color)),
                                     thickness: run_underline.thickness,
                                     wavy: run_underline.wavy,
                                 },
                             ));
                         }
                         if let Some((_, strikethrough_style)) = &mut current_strikethrough {
-                            if run_strikethrough.as_ref() != Some(strikethrough_style) {
+                            if style_run.strikethrough.as_ref() != Some(strikethrough_style) {
                                 finished_strikethrough = current_strikethrough.take();
                             }
                         }
-                        if let Some(mut run_strikethrough) = run_strikethrough.as_ref() {
+                        if let Some(run_strikethrough) = style_run.strikethrough.as_ref() {
                             current_strikethrough.get_or_insert((
                                 point(
                                     glyph_origin.x,
@@ -344,14 +323,14 @@ fn paint_line(
                                         + (((layout.ascent * 0.5) + baseline_offset.y) * 0.5),
                                 ),
                                 StrikethroughStyle {
-                                    color: Some(run_strikethrough.color.unwrap_or(run_color)),
+                                    color: Some(run_strikethrough.color.unwrap_or(style_run.color)),
                                     thickness: run_strikethrough.thickness,
                                 },
                             ));
                         }
 
                         run_end += style_run.len as usize;
-                        color = run_color;
+                        color = style_run.color;
                     } else {
                         run_end = layout.len;
                         finished_underline = current_underline.take();