From 569a4e7262b260098edda2ccabda2377aeffa706 Mon Sep 17 00:00:00 2001 From: Floyd Wang Date: Fri, 17 Jan 2025 14:16:24 +0800 Subject: [PATCH] dropdown_button: Add new component (#551) ## Regular image ## Active image
image ## Break Change Move `ButtonGroup` into the `button`. --- crates/story/src/accordion_story.rs | 8 +- crates/story/src/button_story.rs | 25 ++++++- crates/ui/src/{ => button}/button.rs | 0 crates/ui/src/{ => button}/button_group.rs | 0 crates/ui/src/button/dropdown_button.rs | 85 ++++++++++++++++++++++ crates/ui/src/button/mod.rs | 7 ++ crates/ui/src/lib.rs | 1 - 7 files changed, 119 insertions(+), 7 deletions(-) rename crates/ui/src/{ => button}/button.rs (100%) rename crates/ui/src/{ => button}/button_group.rs (100%) create mode 100644 crates/ui/src/button/dropdown_button.rs create mode 100644 crates/ui/src/button/mod.rs diff --git a/crates/story/src/accordion_story.rs b/crates/story/src/accordion_story.rs index 8b1e11ca..3274ddfa 100644 --- a/crates/story/src/accordion_story.rs +++ b/crates/story/src/accordion_story.rs @@ -3,8 +3,12 @@ use gpui::{ VisualContext as _, WindowContext, }; use ui::{ - accordion::Accordion, button::Button, button_group::ButtonGroup, checkbox::Checkbox, h_flex, - switch::Switch, v_flex, IconName, Selectable, Sizable, Size, + accordion::Accordion, + button::{Button, ButtonGroup}, + checkbox::Checkbox, + h_flex, + switch::Switch, + v_flex, IconName, Selectable, Sizable, Size, }; pub struct AccordionStory { diff --git a/crates/story/src/button_story.rs b/crates/story/src/button_story.rs index d2d57b40..d5eee0c9 100644 --- a/crates/story/src/button_story.rs +++ b/crates/story/src/button_story.rs @@ -1,11 +1,10 @@ use gpui::{ - px, ClickEvent, FocusableView, IntoElement, ParentElement as _, Render, Styled as _, View, - ViewContext, VisualContext as _, WindowContext, + actions, px, ClickEvent, FocusableView, InteractiveElement, IntoElement, ParentElement as _, + Render, Styled as _, View, ViewContext, VisualContext as _, WindowContext, }; use ui::{ - button::{Button, ButtonCustomVariant, ButtonVariants as _}, - button_group::ButtonGroup, + button::{Button, ButtonCustomVariant, ButtonGroup, ButtonVariants as _, DropdownButton}, checkbox::Checkbox, h_flex, prelude::FluentBuilder, @@ -15,6 +14,8 @@ use ui::{ use crate::section; +actions!(button_story, [Disabled, Loading, Selected, Compact]); + pub struct ButtonStory { focus_handle: gpui::FocusHandle, disabled: bool, @@ -74,6 +75,10 @@ impl Render for ButtonStory { let toggle_multiple = self.toggle_multiple; v_flex() + .on_action(cx.listener(|this, _: &Disabled, _| this.disabled = !this.disabled)) + .on_action(cx.listener(|this, _: &Loading, _| this.loading = !this.loading)) + .on_action(cx.listener(|this, _: &Selected, _| this.selected = !this.selected)) + .on_action(cx.listener(|this, _: &Compact, _| this.compact = !this.compact)) .gap_6() .child( h_flex() @@ -546,6 +551,18 @@ impl Render for ButtonStory { ), ), ) + .child( + section("Dropdown Button", cx).child( + DropdownButton::new("dropdown-button") + .button(Button::new("dropdown-button-button").label("Click Me")) + .popup_menu(move |this, _| { + this.menu("Disabled", Box::new(Disabled)) + .menu("Loading", Box::new(Loading)) + .menu("Selected", Box::new(Selected)) + .menu("Compact", Box::new(Compact)) + }), + ), + ) .child( section("Icon Button", cx) .child( diff --git a/crates/ui/src/button.rs b/crates/ui/src/button/button.rs similarity index 100% rename from crates/ui/src/button.rs rename to crates/ui/src/button/button.rs diff --git a/crates/ui/src/button_group.rs b/crates/ui/src/button/button_group.rs similarity index 100% rename from crates/ui/src/button_group.rs rename to crates/ui/src/button/button_group.rs diff --git a/crates/ui/src/button/dropdown_button.rs b/crates/ui/src/button/dropdown_button.rs new file mode 100644 index 00000000..003898a9 --- /dev/null +++ b/crates/ui/src/button/dropdown_button.rs @@ -0,0 +1,85 @@ +use gpui::{ + prelude::FluentBuilder, Corner, Corners, Edges, ElementId, IntoElement, ParentElement, + RenderOnce, ViewContext, WindowContext, +}; + +use crate::{ + h_flex, + popup_menu::{PopupMenu, PopupMenuExt}, + IconName, +}; + +use super::Button; + +#[derive(IntoElement)] +pub struct DropdownButton { + id: ElementId, + button: Option