gpui: Fix text hover & active style (#24723)

Release Notes:

- N/A

---

Fix this long-standing issue so that we can support Link hover colors.

And renamed `text_layout` example to `text_style`.

---

I spent some time studying the process of this text style change and
found it a bit complicated.

At first, I thought there was a problem with refine and it was not
passed properly. After changing it, I found that it was not the problem.

Then I found that it was because `TextRun` had already stored the
`color`, `background`, `underline`, `strikethrough` in TextRun in the
`request_layout` stage. They area calculate at the `request_layout`
stage, but request_layout stage there was no `hitbox`, so the hover
state was not obtained.

```bash
cargo run -p gpui --example text_style
```


https://github.com/user-attachments/assets/24f88f73-775e-41d3-a502-75a7a39ac82b

---------

Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
This commit is contained in:
Jason Lee 2025-04-11 06:34:47 +08:00 committed by GitHub
parent 8ee6a2b454
commit ffdf725f32
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 58 additions and 17 deletions

View file

@ -8,11 +8,13 @@ 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"))
@ -71,6 +73,24 @@ 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"),
)
}
}