diff --git a/crates/ui2/src/components/button/icon_button.rs b/crates/ui2/src/components/button/icon_button.rs index a62832059d..e405d2296c 100644 --- a/crates/ui2/src/components/button/icon_button.rs +++ b/crates/ui2/src/components/button/icon_button.rs @@ -9,6 +9,7 @@ pub struct IconButton { icon: Icon, icon_size: IconSize, icon_color: Color, + selected_icon: Option, } impl IconButton { @@ -18,6 +19,7 @@ impl IconButton { icon, icon_size: IconSize::default(), icon_color: Color::Default, + selected_icon: None, } } @@ -31,6 +33,11 @@ impl IconButton { self } + pub fn selected_icon(mut self, icon: impl Into>) -> Self { + self.selected_icon = icon.into(); + self + } + pub fn action(self, action: Box) -> Self { self.on_click(move |_event, cx| cx.dispatch_action(action.boxed_clone())) } @@ -85,6 +92,11 @@ impl RenderOnce for IconButton { type Rendered = ButtonLike; fn render(self, _cx: &mut WindowContext) -> Self::Rendered { + let icon = self + .selected_icon + .filter(|_| self.base.selected) + .unwrap_or(self.icon); + let icon_color = if self.base.disabled { Color::Disabled } else if self.base.selected { @@ -94,7 +106,7 @@ impl RenderOnce for IconButton { }; self.base.child( - IconElement::new(self.icon) + IconElement::new(icon) .size(self.icon_size) .color(icon_color), ) diff --git a/crates/ui2/src/components/stories/icon_button.rs b/crates/ui2/src/components/stories/icon_button.rs index 04f8ab7c16..3c4d68f8af 100644 --- a/crates/ui2/src/components/stories/icon_button.rs +++ b/crates/ui2/src/components/stories/icon_button.rs @@ -20,6 +20,14 @@ impl Render for IconButtonStory { .w_8() .child(IconButton::new("icon_a", Icon::Hash).selected(true)), ) + .child(Story::label("Selected with `selected_icon`")) + .child( + div().w_8().child( + IconButton::new("icon_a", Icon::AudioOn) + .selected(true) + .selected_icon(Icon::AudioOff), + ), + ) .child(Story::label("Disabled")) .child( div()