@@ -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();
}))
}
- })
+ }))
}
}
@@ -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::*;
@@ -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
+ }
+}
@@ -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()