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 <me@as-cii.com>
This commit is contained in:
parent
d2411a6c86
commit
db73d831c7
1 changed files with 24 additions and 16 deletions
|
@ -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<Terminal>,
|
||||
}
|
||||
|
||||
#[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<Self>,
|
||||
) {
|
||||
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,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue