diff --git a/assets/icons/info.svg b/assets/icons/info.svg
new file mode 100644
index 0000000000..7016cfe4d1
--- /dev/null
+++ b/assets/icons/info.svg
@@ -0,0 +1,12 @@
+
diff --git a/crates/ui/src/components/icon.rs b/crates/ui/src/components/icon.rs
index 03000f0638..ed7c294db9 100644
--- a/crates/ui/src/components/icon.rs
+++ b/crates/ui/src/components/icon.rs
@@ -202,6 +202,7 @@ pub enum IconName {
HistoryRerun,
Indicator,
IndicatorX,
+ Info,
InlayHint,
Keyboard,
Library,
diff --git a/crates/ui/src/components/tooltip.rs b/crates/ui/src/components/tooltip.rs
index 89b89786b0..5460966189 100644
--- a/crates/ui/src/components/tooltip.rs
+++ b/crates/ui/src/components/tooltip.rs
@@ -88,7 +88,7 @@ impl Render for Tooltip {
el.child(
h_flex()
.gap_4()
- .child(self.title.clone())
+ .child(div().max_w_72().child(self.title.clone()))
.when_some(self.key_binding.clone(), |this, key_binding| {
this.justify_between().child(key_binding)
}),
diff --git a/crates/welcome/src/welcome.rs b/crates/welcome/src/welcome.rs
index 8dcb26bcc1..f6953b944c 100644
--- a/crates/welcome/src/welcome.rs
+++ b/crates/welcome/src/welcome.rs
@@ -11,7 +11,7 @@ use gpui::{
};
use settings::{Settings, SettingsStore};
use std::sync::Arc;
-use ui::{prelude::*, CheckboxWithLabel};
+use ui::{prelude::*, CheckboxWithLabel, Tooltip};
use vim_mode_setting::VimModeSetting;
use workspace::{
dock::DockPosition,
@@ -266,24 +266,34 @@ impl Render for WelcomePage {
.child(
v_group()
.gap_2()
- .child(CheckboxWithLabel::new(
- "enable-vim",
- Label::new("Enable Vim Mode"),
- if VimModeSetting::get_global(cx).0 {
- ui::Selection::Selected
- } else {
- ui::Selection::Unselected
- },
- cx.listener(move |this, selection, cx| {
- this.telemetry
- .report_app_event("welcome page: toggle vim".to_string());
- this.update_settings::(
- selection,
- cx,
- |setting, value| *setting = Some(value),
- );
- }),
- ))
+ .child(
+ h_flex()
+ .justify_between()
+ .child(CheckboxWithLabel::new(
+ "enable-vim",
+ Label::new("Enable Vim Mode"),
+ if VimModeSetting::get_global(cx).0 {
+ ui::Selection::Selected
+ } else {
+ ui::Selection::Unselected
+ },
+ cx.listener(move |this, selection, cx| {
+ this.telemetry
+ .report_app_event("welcome page: toggle vim".to_string());
+ this.update_settings::(
+ selection,
+ cx,
+ |setting, value| *setting = Some(value),
+ );
+ }),
+ ))
+ .child(
+ IconButton::new("vim-mode", IconName::Info)
+ .icon_size(IconSize::XSmall)
+ .icon_color(Color::Muted)
+ .tooltip(|cx| Tooltip::text("You can also toggle Vim Mode via the command palette or Editor Controls menu.", cx)),
+ )
+ )
.child(CheckboxWithLabel::new(
"enable-crash",
Label::new("Send Crash Reports"),
diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs
index 2adb287b4d..a52c8ec405 100644
--- a/crates/zed/src/zed.rs
+++ b/crates/zed/src/zed.rs
@@ -3447,6 +3447,7 @@ mod tests {
app_state.languages.add(markdown_language());
+ vim_mode_setting::init(cx);
theme::init(theme::LoadThemes::JustBase, cx);
audio::init((), cx);
channel::init(&app_state.client, app_state.user_store.clone(), cx);
diff --git a/crates/zed/src/zed/quick_action_bar.rs b/crates/zed/src/zed/quick_action_bar.rs
index bfcd3fa391..be38502566 100644
--- a/crates/zed/src/zed/quick_action_bar.rs
+++ b/crates/zed/src/zed/quick_action_bar.rs
@@ -19,6 +19,7 @@ use ui::{
prelude::*, ButtonStyle, ContextMenu, IconButton, IconButtonShape, IconName, IconSize,
PopoverMenu, PopoverMenuHandle, Tooltip,
};
+use vim_mode_setting::VimModeSetting;
use workspace::{
item::ItemHandle, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace,
};
@@ -154,6 +155,7 @@ impl Render for QuickActionBar {
let editor_selections_dropdown = selection_menu_enabled.then(|| {
let focus = editor.focus_handle(cx);
+
PopoverMenu::new("editor-selections-dropdown")
.trigger(
IconButton::new("toggle_editor_selections_icon", IconName::CursorIBeam)
@@ -201,34 +203,78 @@ impl Render for QuickActionBar {
});
let editor = editor.downgrade();
- let editor_settings_dropdown = PopoverMenu::new("editor-settings")
- .trigger(
- IconButton::new("toggle_editor_settings_icon", IconName::Sliders)
- .shape(IconButtonShape::Square)
- .icon_size(IconSize::Small)
- .style(ButtonStyle::Subtle)
- .selected(self.toggle_settings_handle.is_deployed())
- .when(!self.toggle_settings_handle.is_deployed(), |this| {
- this.tooltip(|cx| Tooltip::text("Editor Controls", cx))
- }),
- )
- .anchor(AnchorCorner::TopRight)
- .with_handle(self.toggle_settings_handle.clone())
- .menu(move |cx| {
- let menu = ContextMenu::build(cx, |mut menu, _| {
- if supports_inlay_hints {
+ let editor_settings_dropdown = {
+ let vim_mode_enabled = VimModeSetting::get_global(cx).0;
+
+ PopoverMenu::new("editor-settings")
+ .trigger(
+ IconButton::new("toggle_editor_settings_icon", IconName::Sliders)
+ .shape(IconButtonShape::Square)
+ .icon_size(IconSize::Small)
+ .style(ButtonStyle::Subtle)
+ .selected(self.toggle_settings_handle.is_deployed())
+ .when(!self.toggle_settings_handle.is_deployed(), |this| {
+ this.tooltip(|cx| Tooltip::text("Editor Controls", cx))
+ }),
+ )
+ .anchor(AnchorCorner::TopRight)
+ .with_handle(self.toggle_settings_handle.clone())
+ .menu(move |cx| {
+ let menu = ContextMenu::build(cx, |mut menu, _| {
+ if supports_inlay_hints {
+ menu = menu.toggleable_entry(
+ "Inlay Hints",
+ inlay_hints_enabled,
+ IconPosition::Start,
+ Some(editor::actions::ToggleInlayHints.boxed_clone()),
+ {
+ let editor = editor.clone();
+ move |cx| {
+ editor
+ .update(cx, |editor, cx| {
+ editor.toggle_inlay_hints(
+ &editor::actions::ToggleInlayHints,
+ cx,
+ );
+ })
+ .ok();
+ }
+ },
+ );
+ }
+
menu = menu.toggleable_entry(
- "Inlay Hints",
- inlay_hints_enabled,
+ "Selection Menu",
+ selection_menu_enabled,
IconPosition::Start,
- Some(editor::actions::ToggleInlayHints.boxed_clone()),
+ Some(editor::actions::ToggleSelectionMenu.boxed_clone()),
{
let editor = editor.clone();
move |cx| {
editor
.update(cx, |editor, cx| {
- editor.toggle_inlay_hints(
- &editor::actions::ToggleInlayHints,
+ editor.toggle_selection_menu(
+ &editor::actions::ToggleSelectionMenu,
+ cx,
+ )
+ })
+ .ok();
+ }
+ },
+ );
+
+ menu = menu.toggleable_entry(
+ "Auto Signature Help",
+ auto_signature_help_enabled,
+ IconPosition::Start,
+ Some(editor::actions::ToggleAutoSignatureHelp.boxed_clone()),
+ {
+ let editor = editor.clone();
+ move |cx| {
+ editor
+ .update(cx, |editor, cx| {
+ editor.toggle_auto_signature_help_menu(
+ &editor::actions::ToggleAutoSignatureHelp,
cx,
);
})
@@ -236,92 +282,70 @@ impl Render for QuickActionBar {
}
},
);
- }
- menu = menu.toggleable_entry(
- "Selection Menu",
- selection_menu_enabled,
- IconPosition::Start,
- Some(editor::actions::ToggleSelectionMenu.boxed_clone()),
- {
- let editor = editor.clone();
- move |cx| {
- editor
- .update(cx, |editor, cx| {
- editor.toggle_selection_menu(
- &editor::actions::ToggleSelectionMenu,
- cx,
- )
- })
- .ok();
- }
- },
- );
+ menu = menu.separator();
- menu = menu.toggleable_entry(
- "Auto Signature Help",
- auto_signature_help_enabled,
- IconPosition::Start,
- Some(editor::actions::ToggleAutoSignatureHelp.boxed_clone()),
- {
- let editor = editor.clone();
- move |cx| {
- editor
- .update(cx, |editor, cx| {
- editor.toggle_auto_signature_help_menu(
- &editor::actions::ToggleAutoSignatureHelp,
- cx,
- );
- })
- .ok();
- }
- },
- );
+ menu = menu.toggleable_entry(
+ "Inline Git Blame",
+ git_blame_inline_enabled,
+ IconPosition::Start,
+ Some(editor::actions::ToggleGitBlameInline.boxed_clone()),
+ {
+ let editor = editor.clone();
+ move |cx| {
+ editor
+ .update(cx, |editor, cx| {
+ editor.toggle_git_blame_inline(
+ &editor::actions::ToggleGitBlameInline,
+ cx,
+ )
+ })
+ .ok();
+ }
+ },
+ );
- menu = menu.separator();
+ menu = menu.toggleable_entry(
+ "Column Git Blame",
+ show_git_blame_gutter,
+ IconPosition::Start,
+ Some(editor::actions::ToggleGitBlame.boxed_clone()),
+ {
+ let editor = editor.clone();
+ move |cx| {
+ editor
+ .update(cx, |editor, cx| {
+ editor.toggle_git_blame(
+ &editor::actions::ToggleGitBlame,
+ cx,
+ )
+ })
+ .ok();
+ }
+ },
+ );
- menu = menu.toggleable_entry(
- "Inline Git Blame",
- git_blame_inline_enabled,
- IconPosition::Start,
- Some(editor::actions::ToggleGitBlameInline.boxed_clone()),
- {
- let editor = editor.clone();
- move |cx| {
- editor
- .update(cx, |editor, cx| {
- editor.toggle_git_blame_inline(
- &editor::actions::ToggleGitBlameInline,
- cx,
- )
- })
- .ok();
- }
- },
- );
+ menu = menu.separator();
- menu = menu.toggleable_entry(
- "Column Git Blame",
- show_git_blame_gutter,
- IconPosition::Start,
- Some(editor::actions::ToggleGitBlame.boxed_clone()),
- {
- let editor = editor.clone();
- move |cx| {
- editor
- .update(cx, |editor, cx| {
- editor
- .toggle_git_blame(&editor::actions::ToggleGitBlame, cx)
- })
- .ok();
- }
- },
- );
+ menu = menu.toggleable_entry(
+ "Vim Mode",
+ vim_mode_enabled,
+ IconPosition::Start,
+ None,
+ {
+ move |cx| {
+ let new_value = !vim_mode_enabled;
+ VimModeSetting::override_global(VimModeSetting(new_value), cx);
+ cx.refresh();
+ }
+ },
+ );
- menu
- });
- Some(menu)
- });
+ menu
+ });
+ Some(menu)
+ })
+ };
h_flex()
.id("quick action bar")