debugger: Add actions and keybindings for opening the thread and session menus (#31135)
Makes it possible to open and navigate these menus from the keyboard. I also removed the eager previewing behavior for the thread picker, which was buggy and came with a jarring layout shift. Release Notes: - Debugger Beta: Added the `debugger: open thread picker` and `debugger: open session picker` actions.
This commit is contained in:
parent
eb35d25a7d
commit
b2a92097ee
8 changed files with 76 additions and 68 deletions
|
@ -154,7 +154,6 @@ pub struct ContextMenu {
|
|||
key_context: SharedString,
|
||||
_on_blur_subscription: Subscription,
|
||||
keep_open_on_confirm: bool,
|
||||
eager: bool,
|
||||
documentation_aside: Option<(usize, DocumentationAside)>,
|
||||
fixed_width: Option<DefiniteLength>,
|
||||
}
|
||||
|
@ -207,7 +206,6 @@ impl ContextMenu {
|
|||
key_context: "menu".into(),
|
||||
_on_blur_subscription,
|
||||
keep_open_on_confirm: false,
|
||||
eager: false,
|
||||
documentation_aside: None,
|
||||
fixed_width: None,
|
||||
end_slot_action: None,
|
||||
|
@ -250,43 +248,6 @@ impl ContextMenu {
|
|||
key_context: "menu".into(),
|
||||
_on_blur_subscription,
|
||||
keep_open_on_confirm: true,
|
||||
eager: false,
|
||||
documentation_aside: None,
|
||||
fixed_width: None,
|
||||
end_slot_action: None,
|
||||
},
|
||||
window,
|
||||
cx,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn build_eager(
|
||||
window: &mut Window,
|
||||
cx: &mut App,
|
||||
f: impl FnOnce(Self, &mut Window, &mut Context<Self>) -> Self,
|
||||
) -> Entity<Self> {
|
||||
cx.new(|cx| {
|
||||
let focus_handle = cx.focus_handle();
|
||||
let _on_blur_subscription = cx.on_blur(
|
||||
&focus_handle,
|
||||
window,
|
||||
|this: &mut ContextMenu, window, cx| this.cancel(&menu::Cancel, window, cx),
|
||||
);
|
||||
window.refresh();
|
||||
f(
|
||||
Self {
|
||||
builder: None,
|
||||
items: Default::default(),
|
||||
focus_handle,
|
||||
action_context: None,
|
||||
selected_index: None,
|
||||
delayed: false,
|
||||
clicked: false,
|
||||
key_context: "menu".into(),
|
||||
_on_blur_subscription,
|
||||
keep_open_on_confirm: false,
|
||||
eager: true,
|
||||
documentation_aside: None,
|
||||
fixed_width: None,
|
||||
end_slot_action: None,
|
||||
|
@ -327,7 +288,6 @@ impl ContextMenu {
|
|||
|this: &mut ContextMenu, window, cx| this.cancel(&menu::Cancel, window, cx),
|
||||
),
|
||||
keep_open_on_confirm: false,
|
||||
eager: false,
|
||||
documentation_aside: None,
|
||||
fixed_width: None,
|
||||
end_slot_action: None,
|
||||
|
@ -634,10 +594,7 @@ impl ContextMenu {
|
|||
..
|
||||
})
|
||||
| ContextMenuItem::CustomEntry { handler, .. },
|
||||
) = self
|
||||
.selected_index
|
||||
.and_then(|ix| self.items.get(ix))
|
||||
.filter(|_| !self.eager)
|
||||
) = self.selected_index.and_then(|ix| self.items.get(ix))
|
||||
{
|
||||
(handler)(context, window, cx)
|
||||
}
|
||||
|
@ -740,10 +697,9 @@ impl ContextMenu {
|
|||
fn select_index(
|
||||
&mut self,
|
||||
ix: usize,
|
||||
window: &mut Window,
|
||||
cx: &mut Context<Self>,
|
||||
_window: &mut Window,
|
||||
_cx: &mut Context<Self>,
|
||||
) -> Option<usize> {
|
||||
let context = self.action_context.as_ref();
|
||||
self.documentation_aside = None;
|
||||
let item = self.items.get(ix)?;
|
||||
if item.is_selectable() {
|
||||
|
@ -752,9 +708,6 @@ impl ContextMenu {
|
|||
if let Some(callback) = &entry.documentation_aside {
|
||||
self.documentation_aside = Some((ix, callback.clone()));
|
||||
}
|
||||
if self.eager && !entry.disabled {
|
||||
(entry.handler)(context, window, cx)
|
||||
}
|
||||
}
|
||||
}
|
||||
Some(ix)
|
||||
|
|
|
@ -2,6 +2,8 @@ use gpui::{ClickEvent, Corner, CursorStyle, Entity, Hsla, MouseButton};
|
|||
|
||||
use crate::{ContextMenu, PopoverMenu, prelude::*};
|
||||
|
||||
use super::PopoverMenuHandle;
|
||||
|
||||
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub enum DropdownStyle {
|
||||
#[default]
|
||||
|
@ -22,6 +24,7 @@ pub struct DropdownMenu {
|
|||
menu: Entity<ContextMenu>,
|
||||
full_width: bool,
|
||||
disabled: bool,
|
||||
handle: Option<PopoverMenuHandle<ContextMenu>>,
|
||||
}
|
||||
|
||||
impl DropdownMenu {
|
||||
|
@ -37,6 +40,7 @@ impl DropdownMenu {
|
|||
menu,
|
||||
full_width: false,
|
||||
disabled: false,
|
||||
handle: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -52,6 +56,7 @@ impl DropdownMenu {
|
|||
menu,
|
||||
full_width: false,
|
||||
disabled: false,
|
||||
handle: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -64,6 +69,11 @@ impl DropdownMenu {
|
|||
self.full_width = full_width;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn handle(mut self, handle: PopoverMenuHandle<ContextMenu>) -> Self {
|
||||
self.handle = Some(handle);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl Disableable for DropdownMenu {
|
||||
|
@ -85,6 +95,7 @@ impl RenderOnce for DropdownMenu {
|
|||
.style(self.style),
|
||||
)
|
||||
.attach(Corner::BottomLeft)
|
||||
.when_some(self.handle.clone(), |el, handle| el.with_handle(handle))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,17 +170,11 @@ pub struct DropdownTriggerStyle {
|
|||
impl DropdownTriggerStyle {
|
||||
pub fn for_style(style: DropdownStyle, cx: &App) -> Self {
|
||||
let colors = cx.theme().colors();
|
||||
|
||||
if style == DropdownStyle::Solid {
|
||||
Self {
|
||||
// why is this editor_background?
|
||||
bg: colors.editor_background,
|
||||
}
|
||||
} else {
|
||||
Self {
|
||||
bg: colors.ghost_element_background,
|
||||
}
|
||||
}
|
||||
let bg = match style {
|
||||
DropdownStyle::Solid => colors.editor_background,
|
||||
DropdownStyle::Ghost => colors.ghost_element_background,
|
||||
};
|
||||
Self { bg }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue