From 2e080b83decd98557ea5a20c63a4c054dcb1b1ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Wed, 7 Oct 2026 00:31:08 -0400 Subject: [PATCH] =?UTF-8?q?Buttons=20=C2=B7=20SegmentedControl:=20each=20s?= =?UTF-8?q?egment=20is=20a=20radio=20button=20with=20its=20label=20and=20s?= =?UTF-8?q?tate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/buttons/segmented.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/buttons/segmented.rs b/src/buttons/segmented.rs index 3210230..dec7407 100644 --- a/src/buttons/segmented.rs +++ b/src/buttons/segmented.rs @@ -2,7 +2,7 @@ use std::rc::Rc; use gpui::{ Animation, AnimationExt, AnyElement, App, ElementId, FocusHandle, FontWeight, - InteractiveElement, IntoElement, MouseButton, ParentElement, RenderOnce, ScrollHandle, + InteractiveElement, IntoElement, MouseButton, ParentElement, RenderOnce, Role, ScrollHandle, SharedString, StatefulInteractiveElement, Styled, Window, div, prelude::*, }; @@ -134,9 +134,17 @@ impl RenderOnce for SegmentedControl { let fg = if on { colors.fg } else { colors.fg_muted }; let (focus, reveal) = stops.remove(0); let (named, labeled) = (value.clone(), value.clone()); + let spoken = if label.is_empty() { + value.clone() + } else { + label.clone() + }; let (change, measure) = (self.on_change.clone(), state.clone()); let segment = div() .id(("segment", ix)) + .role(Role::RadioButton) + .aria_toggled(on.into()) + .aria_label(spoken) .relative() .flex() .flex_auto()