From 92d2048aa4315713b46c7c731b51430e5989393f Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Thu, 30 Nov 2023 00:28:05 -0500 Subject: [PATCH] WIP --- crates/collab_ui2/src/collab_titlebar_item.rs | 26 +++++++++++-- crates/ui2/src/components.rs | 2 + crates/ui2/src/components/popover_menu.rs | 39 +++++++++++++++++++ crates/workspace2/src/workspace2.rs | 2 + 4 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 crates/ui2/src/components/popover_menu.rs diff --git a/crates/collab_ui2/src/collab_titlebar_item.rs b/crates/collab_ui2/src/collab_titlebar_item.rs index d76242afa32e766ce5b885870e0fd20006ff6517..fc743585f53027fa8abf1670e9f0eafebe61b17b 100644 --- a/crates/collab_ui2/src/collab_titlebar_item.rs +++ b/crates/collab_ui2/src/collab_titlebar_item.rs @@ -37,7 +37,10 @@ use gpui::{ }; use project::Project; use theme::ActiveTheme; -use ui::{h_stack, prelude::*, Avatar, Button, ButtonStyle2, IconButton, KeyBinding, Tooltip}; +use ui::{ + h_stack, prelude::*, v_stack, Avatar, Button, ButtonLike, ButtonStyle2, Icon, IconButton, + IconElement, KeyBinding, List, ListItem, PopoverMenu, Tooltip, +}; use util::ResultExt; use workspace::{notifications::NotifyResultExt, Workspace}; @@ -288,10 +291,25 @@ impl Render for CollabTitlebarItem { ), ) }) - .map(|this| { + .child(h_stack().px_1p5().map(|this| { if let Some(user) = current_user { this.when_some(user.avatar.clone(), |this, avatar| { - this.child(ui::Avatar::data(avatar)) + this.child( + PopoverMenu::new( + ButtonLike::new("user-menu") + .child(h_stack().gap_0p5().child(Avatar::data(avatar)).child( + IconElement::new(Icon::ChevronDown).color(Color::Muted), + )) + .style(ButtonStyle2::Subtle) + .tooltip(move |cx| Tooltip::text("Toggle User Menu", cx)) + .into_any_element(), + ) + .children(vec![ + ListItem::new("foo"), + ListItem::new("bar"), + ListItem::new("baz"), + ]), + ) }) } else { this.child(Button::new("sign_in", "Sign in").on_click(move |_, cx| { @@ -305,7 +323,7 @@ impl Render for CollabTitlebarItem { .detach(); })) } - }) + })) } } diff --git a/crates/ui2/src/components.rs b/crates/ui2/src/components.rs index be95fc1fab6cc66edaef96f1a74622a01457e0f1..28dc8f3f06a65f9e091ca49146e320c741c162f6 100644 --- a/crates/ui2/src/components.rs +++ b/crates/ui2/src/components.rs @@ -9,6 +9,7 @@ mod keybinding; mod label; mod list; mod popover; +mod popover_menu; mod stack; mod tooltip; @@ -26,6 +27,7 @@ pub use keybinding::*; pub use label::*; pub use list::*; pub use popover::*; +pub use popover_menu::*; pub use stack::*; pub use tooltip::*; diff --git a/crates/ui2/src/components/popover_menu.rs b/crates/ui2/src/components/popover_menu.rs new file mode 100644 index 0000000000000000000000000000000000000000..a0431c57b326fa4be2c3adcdd421cc52bd7269ac --- /dev/null +++ b/crates/ui2/src/components/popover_menu.rs @@ -0,0 +1,39 @@ +use gpui::{ + div, overlay, AnyElement, Div, Element, ElementId, IntoElement, ParentElement, RenderOnce, + Styled, WindowContext, +}; +use smallvec::SmallVec; + +use crate::{prelude::*, ElevationIndex, List, Popover}; + +#[derive(IntoElement)] +pub struct PopoverMenu { + trigger: AnyElement, + children: SmallVec<[AnyElement; 2]>, +} + +impl RenderOnce for PopoverMenu { + type Rendered = Div; + + fn render(self, cx: &mut WindowContext) -> Self::Rendered { + div() + .relative() + .child(self.trigger) + .child(overlay().child(Popover::new().children(self.children))) + } +} + +impl PopoverMenu { + pub fn new(trigger: AnyElement) -> Self { + Self { + trigger, + children: SmallVec::new(), + } + } +} + +impl ParentElement for PopoverMenu { + fn children_mut(&mut self) -> &mut SmallVec<[AnyElement; 2]> { + &mut self.children + } +} diff --git a/crates/workspace2/src/workspace2.rs b/crates/workspace2/src/workspace2.rs index 23907f8dae882f0780e5a8ad351a96f74129c363..2f7d95c34437f9b571ebea9aeb9939c49d5d4e8c 100644 --- a/crates/workspace2/src/workspace2.rs +++ b/crates/workspace2/src/workspace2.rs @@ -3711,6 +3711,8 @@ impl Render for Workspace { .items_start() .text_color(cx.theme().colors().text) .bg(cx.theme().colors().background) + .border() + .border_color(cx.theme().colors().border) .children(self.titlebar_item.clone()) .child( div()