From db73d831c774cd6174d780aedc131f3e70f04db7 Mon Sep 17 00:00:00 2001 From: Petros Amoiridis Date: Mon, 13 Mar 2023 12:50:12 +0200 Subject: [PATCH] Use local overlay position mode and alignment When we show the context menu, we don't specify an explicit position other than the default one which is equal to the origin in the context of a local overlay position mode. We then rely on `AnchorCorner` and aligning the context menu child view in the stack with `top().right()` for pop-ups that need to appear at the top of the icon/button. Co-Authored-By: Antonio Scandurra --- crates/terminal_view/src/terminal_button.rs | 40 ++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/crates/terminal_view/src/terminal_button.rs b/crates/terminal_view/src/terminal_button.rs index c4f4c0571f..8c723ad4d4 100644 --- a/crates/terminal_view/src/terminal_button.rs +++ b/crates/terminal_view/src/terminal_button.rs @@ -1,8 +1,8 @@ use context_menu::{ContextMenu, ContextMenuItem}; use gpui::{ - elements::*, geometry::vector::Vector2F, impl_internal_actions, CursorStyle, Element, - ElementBox, Entity, MouseButton, MutableAppContext, RenderContext, View, ViewContext, - ViewHandle, WeakModelHandle, WeakViewHandle, + elements::*, impl_internal_actions, CursorStyle, Element, ElementBox, Entity, MouseButton, + MutableAppContext, RenderContext, View, ViewContext, ViewHandle, WeakModelHandle, + WeakViewHandle, }; use settings::Settings; use std::any::TypeId; @@ -11,16 +11,15 @@ use workspace::{dock::FocusDock, item::ItemHandle, NewTerminal, StatusItemView, use crate::TerminalView; +#[derive(Clone, PartialEq)] +pub struct DeployTerminalMenu; + #[derive(Clone, PartialEq)] pub struct FocusTerminal { terminal_handle: WeakModelHandle, } -#[derive(Clone, PartialEq)] -pub struct DeployTerminalMenu { - position: Vector2F, -} - +//actions!(terminal, [DeployTerminalMenu]); impl_internal_actions!(terminal, [FocusTerminal, DeployTerminalMenu]); pub fn init(cx: &mut MutableAppContext) { @@ -82,11 +81,9 @@ impl View for TerminalButton { } }) .with_cursor_style(CursorStyle::PointingHand) - .on_click(MouseButton::Left, move |e, cx| { + .on_click(MouseButton::Left, move |_, cx| { if has_terminals { - cx.dispatch_action(DeployTerminalMenu { - position: e.region.upper_right(), - }); + cx.dispatch_action(DeployTerminalMenu); } else { if !active { cx.dispatch_action(FocusDock); @@ -102,7 +99,13 @@ impl View for TerminalButton { ) .boxed(), ) - .with_child(ChildView::new(&self.popup_menu, cx).boxed()) + .with_child( + ChildView::new(&self.popup_menu, cx) + .aligned() + .top() + .right() + .boxed(), + ) .boxed() } } @@ -115,7 +118,7 @@ impl TerminalButton { workspace: workspace.downgrade(), popup_menu: cx.add_view(|cx| { let mut menu = ContextMenu::new(cx); - menu.set_position_mode(OverlayPositionMode::Window); + menu.set_position_mode(OverlayPositionMode::Local); menu }), } @@ -123,7 +126,7 @@ impl TerminalButton { pub fn deploy_terminal_menu( &mut self, - action: &DeployTerminalMenu, + _action: &DeployTerminalMenu, cx: &mut ViewContext, ) { let mut menu_options = vec![ContextMenuItem::item("New Terminal", NewTerminal)]; @@ -149,7 +152,12 @@ impl TerminalButton { } self.popup_menu.update(cx, |menu, cx| { - menu.show(action.position, AnchorCorner::BottomRight, menu_options, cx); + menu.show( + Default::default(), + AnchorCorner::BottomRight, + menu_options, + cx, + ); }); }