use ui::{prelude::*, ContextMenu, NumericStepper, PopoverMenu, PopoverMenuHandle, Tooltip}; pub struct ApplicationMenu { context_menu_handle: PopoverMenuHandle<ContextMenu>,} impl ApplicationMenu { pub fn new(_: &mut ViewContext<Self>) -> Self { Self { context_menu_handle: PopoverMenuHandle::default(), } }} impl Render for ApplicationMenu { fn render(&mut self, _cx: &mut ViewContext<Self>) -> impl IntoElement { PopoverMenu::new("application-menu") .menu(move |cx| { ContextMenu::build(cx, move |menu, cx| { menu.header("Workspace") .action( "Open Command Palette", Box::new(zed_actions::command_palette::Toggle), ) .when_some(cx.focused(), |menu, focused| menu.context(focused)) .custom_row(move |cx| { h_flex() .gap_2() .w_full() .justify_between() .cursor(gpui::CursorStyle::Arrow) .child(Label::new("Buffer Font Size")) .child( NumericStepper::new( "buffer-font-size", theme::get_buffer_font_size(cx).to_string(), |_, cx| { cx.dispatch_action(Box::new( zed_actions::DecreaseBufferFontSize, )) }, |_, cx| { cx.dispatch_action(Box::new( zed_actions::IncreaseBufferFontSize, )) }, ) .reserve_space_for_reset(true) .when( theme::has_adjusted_buffer_font_size(cx), |stepper| { stepper.on_reset(|_, cx| { cx.dispatch_action(Box::new( zed_actions::ResetBufferFontSize, )) }) }, ), ) .into_any_element() }) .custom_row(move |cx| { h_flex() .gap_2() .w_full() .justify_between() .cursor(gpui::CursorStyle::Arrow) .child(Label::new("UI Font Size")) .child( NumericStepper::new( "ui-font-size", theme::get_ui_font_size(cx).to_string(), |_, cx| { cx.dispatch_action(Box::new( zed_actions::DecreaseUiFontSize, )) }, |_, cx| { cx.dispatch_action(Box::new( zed_actions::IncreaseUiFontSize, )) }, ) .reserve_space_for_reset(true) .when( theme::has_adjusted_ui_font_size(cx), |stepper| { stepper.on_reset(|_, cx| { cx.dispatch_action(Box::new( zed_actions::ResetUiFontSize, )) }) }, ), ) .into_any_element() }) .header("Project") .action( "Add Folder to Project...", Box::new(workspace::AddFolderToProject), ) .action("Open a new Project...", Box::new(workspace::Open)) .action( "Open Recent Projects...", Box::new(zed_actions::OpenRecent { create_new_window: false, }), ) .header("Help") .action("About Zed", Box::new(zed_actions::About)) .action("Welcome", Box::new(workspace::Welcome)) .link( "Documentation", Box::new(zed_actions::OpenBrowser { url: "https://zed.dev/docs".into(), }), ) .action( "Give Feedback", Box::new(zed_actions::feedback::GiveFeedback), ) .action("Check for Updates", Box::new(auto_update::Check)) .action("View Telemetry", Box::new(zed_actions::OpenTelemetryLog)) .action( "View Dependency Licenses", Box::new(zed_actions::OpenLicenses), ) .separator() .action("Quit", Box::new(zed_actions::Quit)) }) .into() }) .trigger( IconButton::new("application-menu", ui::IconName::Menu) .style(ButtonStyle::Subtle) .icon_size(IconSize::Small) .when(!self.context_menu_handle.is_deployed(), |this| { this.tooltip(|cx| Tooltip::text("Open Application Menu", cx)) }), ) .with_handle(self.context_menu_handle.clone()) .into_any_element() }}use ui::{prelude::*, ContextMenu, NumericStepper, PopoverMenu, PopoverMenuHandle, Tooltip};
pub struct ApplicationMenu {
context_menu_handle: PopoverMenuHandle<ContextMenu>,
}
impl ApplicationMenu {
pub fn new(_: &mut ViewContext<Self>) -> Self {
Self {
context_menu_handle: PopoverMenuHandle::default(),
}
}
}
impl Render for ApplicationMenu {
fn render(&mut self, _cx: &mut ViewContext<Self>) -> impl IntoElement {
PopoverMenu::new("application-menu")
.menu(move |cx| {
ContextMenu::build(cx, move |menu, cx| {
menu.header("Workspace")
.action(
"Open Command Palette",
Box::new(zed_actions::command_palette::Toggle),
)
.when_some(cx.focused(), |menu, focused| menu.context(focused))
.custom_row(move |cx| {
h_flex()
.gap_2()
.w_full()
.justify_between()
.cursor(gpui::CursorStyle::Arrow)
.child(Label::new("Buffer Font Size"))
.child(
NumericStepper::new(
"buffer-font-size",
theme::get_buffer_font_size(cx).to_string(),
|_, cx| {
cx.dispatch_action(Box::new(
zed_actions::DecreaseBufferFontSize,
))
},
|_, cx| {
cx.dispatch_action(Box::new(
zed_actions::IncreaseBufferFontSize,
))
},
)
.reserve_space_for_reset(true)
.when(
theme::has_adjusted_buffer_font_size(cx),
|stepper| {
stepper.on_reset(|_, cx| {
cx.dispatch_action(Box::new(
zed_actions::ResetBufferFontSize,
))
})
},
),
)
.into_any_element()
})
.custom_row(move |cx| {
h_flex()
.gap_2()
.w_full()
.justify_between()
.cursor(gpui::CursorStyle::Arrow)
.child(Label::new("UI Font Size"))
.child(
NumericStepper::new(
"ui-font-size",
theme::get_ui_font_size(cx).to_string(),
|_, cx| {
cx.dispatch_action(Box::new(
zed_actions::DecreaseUiFontSize,
))
},
|_, cx| {
cx.dispatch_action(Box::new(
zed_actions::IncreaseUiFontSize,
))
},
)
.reserve_space_for_reset(true)
.when(
theme::has_adjusted_ui_font_size(cx),
|stepper| {
stepper.on_reset(|_, cx| {
cx.dispatch_action(Box::new(
zed_actions::ResetUiFontSize,
))
})
},
),
)
.into_any_element()
})
.header("Project")
.action(
"Add Folder to Project...",
Box::new(workspace::AddFolderToProject),
)
.action("Open a new Project...", Box::new(workspace::Open))
.action(
"Open Recent Projects...",
Box::new(zed_actions::OpenRecent {
create_new_window: false,
}),
)
.header("Help")
.action("About Zed", Box::new(zed_actions::About))
.action("Welcome", Box::new(workspace::Welcome))
.link(
"Documentation",
Box::new(zed_actions::OpenBrowser {
url: "https://zed.dev/docs".into(),
}),
)
.action(
"Give Feedback",
Box::new(zed_actions::feedback::GiveFeedback),
)
.action("Check for Updates", Box::new(auto_update::Check))
.action("View Telemetry", Box::new(zed_actions::OpenTelemetryLog))
.action(
"View Dependency Licenses",
Box::new(zed_actions::OpenLicenses),
)
.separator()
.action("Quit", Box::new(zed_actions::Quit))
})
.into()
})
.trigger(
IconButton::new("application-menu", ui::IconName::Menu)
.style(ButtonStyle::Subtle)
.icon_size(IconSize::Small)
.when(!self.context_menu_handle.is_deployed(), |this| {
this.tooltip(|cx| Tooltip::text("Open Application Menu", cx))
}),
)
.with_handle(self.context_menu_handle.clone())
.into_any_element()
}
}