diff --git a/crates/ui/src/menu/dropdown_menu.rs b/crates/ui/src/menu/dropdown_menu.rs index 8d701c24..d264dcf8 100644 --- a/crates/ui/src/menu/dropdown_menu.rs +++ b/crates/ui/src/menu/dropdown_menu.rs @@ -18,12 +18,12 @@ type MenuBuilder = dyn Fn(PopupMenu, &mut Window, &mut Context) -> Po /// A dropdown menu trait for buttons and other interactive elements pub trait DropdownMenu: Styled + Selectable + InteractiveElement + IntoElement + 'static { - /// Create a dropdown menu with the given items, anchored to the TopLeft corner + /// Create a dropdown menu with the given items, anchored to the TopRight corner fn dropdown_menu( self, f: impl Fn(PopupMenu, &mut Window, &mut Context) -> PopupMenu + 'static, ) -> DropdownMenuPopover { - self.dropdown_menu_with_anchor(Anchor::TopLeft, f) + self.dropdown_menu_with_anchor(Anchor::TopRight, f) } /// Create a dropdown menu with the given items, anchored to the given corner diff --git a/crates/workspace/src/sidebar/mod.rs b/crates/workspace/src/sidebar/mod.rs index b4206857..8a66c4f2 100644 --- a/crates/workspace/src/sidebar/mod.rs +++ b/crates/workspace/src/sidebar/mod.rs @@ -8,10 +8,10 @@ use chat::{ChatEvent, ChatRegistry, Room, RoomKind}; use common::TimestampExt; use gpui::prelude::FluentBuilder; use gpui::{ - Anchor, AnyElement, App, AppContext, ClipboardItem, Context, Div, Entity, EventEmitter, - FocusHandle, Focusable, InteractiveElement, IntoElement, ObjectFit, ParentElement, Render, - SharedString, Stateful, Styled, StyledImage, Subscription, Task, UniformListScrollHandle, - WeakEntity, Window, div, img, px, relative, retain_all, uniform_list, + AnyElement, App, AppContext, ClipboardItem, Context, Div, Entity, EventEmitter, FocusHandle, + Focusable, InteractiveElement, IntoElement, ObjectFit, ParentElement, Render, SharedString, + Stateful, Styled, StyledImage, Subscription, Task, UniformListScrollHandle, WeakEntity, Window, + div, img, px, relative, retain_all, uniform_list, }; use nip29::{Group, GroupKey, GroupsEvent, GroupsRegistry}; use nostr_sdk::prelude::*; @@ -389,6 +389,7 @@ impl Sidebar { } fn render_user(&self, current_user: &PublicKey, cx: &mut Context) -> Stateful
{ + let updater = AutoUpdater::try_global(cx); let persons = PersonRegistry::global(cx); let profile = persons.read(cx).get(current_user, cx); let avatar = profile.avatar(); @@ -466,10 +467,30 @@ impl Sidebar { ) }), ) - .child(div().flex_1()) - .when_some(AutoUpdater::try_global(cx), |this, updater| { + .when_some(updater, |this, updater| { this.child(self.render_updater(updater, cx)) }) + .child( + Button::new("sidebar-new") + .icon(IconName::PlusCircle) + .tooltip("New") + .ghost() + .small() + .dropdown_menu(|menu, _window, _cx| { + menu.menu_with_icon( + "New Chat", + IconName::Message, + Box::new(Command::NewChat), + ) + .menu_with_icon("New Group", IconName::Group, Box::new(Command::NewGroup)) + .separator() + .menu_with_icon( + "Join Group", + IconName::Door, + Box::new(Command::JoinGroup), + ) + }), + ) .when(self.group_open, |this| { this.child( Button::new("sidebar-back") @@ -548,28 +569,6 @@ impl Sidebar { v_flex() .px_2() .gap_1() - .child( - NavItem::new("new", "New", Icon::new(IconName::PlusCircle).small()) - .clickable(true) - .dropdown_menu_with_anchor(Anchor::TopRight, |menu, _window, _cx| { - menu.menu_with_icon( - "New Chat", - IconName::Message, - Box::new(Command::NewChat), - ) - .menu_with_icon( - "New Group", - IconName::Group, - Box::new(Command::NewGroup), - ) - .separator() - .menu_with_icon( - "Join Group", - IconName::Door, - Box::new(Command::JoinGroup), - ) - }), - ) .child( NavItem::new("browse", "Browse", Icon::new(IconName::Compass).small()) .on_click(|_, window, cx| {