diff --git a/assets/settings/default.json b/assets/settings/default.json index ca782b5c8e8..17f35962a8f 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -71,6 +71,8 @@ "agent_ui_font_size": null, // The default font size for user messages in the agent panel. "agent_buffer_font_size": 12, + // The default font size for the commit editor in the git panel and commit modal. + "git_commit_buffer_font_size": 12, // How much to fade out unused code. "unnecessary_code_fade": 0.3, // Active pane styling settings. diff --git a/crates/git_ui/src/commit_modal.rs b/crates/git_ui/src/commit_modal.rs index 5da2f670f31..4631d781bf0 100644 --- a/crates/git_ui/src/commit_modal.rs +++ b/crates/git_ui/src/commit_modal.rs @@ -1,6 +1,6 @@ use crate::branch_picker::{self, BranchList}; use crate::git_panel::{ - GitPanel, commit_message_editor, commit_title_exceeds_limit, panel_editor_style, + GitPanel, commit_message_editor, commit_title_exceeds_limit, git_commit_editor_style, }; use crate::git_panel_settings::GitPanelSettings; use git::repository::CommitOptions; @@ -10,6 +10,7 @@ use settings::Settings; use ui::{ ContextMenu, KeybindingHint, PopoverMenu, PopoverMenuHandle, SplitButton, Tooltip, prelude::*, }; +use zed_actions::{DecreaseBufferFontSize, IncreaseBufferFontSize, ResetBufferFontSize}; use editor::{Editor, EditorElement}; use gpui::*; @@ -228,8 +229,9 @@ impl CommitModal { } } - fn commit_editor_element(&self, window: &mut Window, cx: &mut Context) -> EditorElement { - let editor_style = panel_editor_style(true, window, cx); + fn commit_editor_element(&self, _window: &mut Window, cx: &mut Context) -> EditorElement { + let settings = theme_settings::ThemeSettings::get_global(cx); + let editor_style = git_commit_editor_style(settings.git_commit_buffer_font_size(cx), cx); EditorElement::new(&self.commit_editor, editor_style) } @@ -533,6 +535,39 @@ impl CommitModal { self.branch_list_handle.toggle(window, cx); } } + + fn increase_font_size( + &mut self, + action: &IncreaseBufferFontSize, + window: &mut Window, + cx: &mut Context, + ) { + self.git_panel.update(cx, |git_panel, cx| { + git_panel.increase_font_size(action, window, cx); + }); + } + + fn decrease_font_size( + &mut self, + action: &DecreaseBufferFontSize, + window: &mut Window, + cx: &mut Context, + ) { + self.git_panel.update(cx, |git_panel, cx| { + git_panel.decrease_font_size(action, window, cx); + }); + } + + fn reset_font_size( + &mut self, + action: &ResetBufferFontSize, + window: &mut Window, + cx: &mut Context, + ) { + self.git_panel.update(cx, |git_panel, cx| { + git_panel.reset_font_size(action, window, cx); + }); + } } impl Render for CommitModal { @@ -561,6 +596,9 @@ impl Render for CommitModal { .on_action(cx.listener(Self::dismiss)) .on_action(cx.listener(Self::on_commit)) .on_action(cx.listener(Self::on_amend)) + .on_action(cx.listener(Self::increase_font_size)) + .on_action(cx.listener(Self::decrease_font_size)) + .on_action(cx.listener(Self::reset_font_size)) .when(!DisableAiSettings::get_global(cx).disable_ai, |this| { this.on_action(cx.listener(|this, _: &GenerateCommitMessage, _, cx| { this.git_panel.update(cx, |panel, cx| { diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index 1eee2d818b0..ef17b15cdea 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -65,7 +65,7 @@ use project::{ use prompt_store::{BuiltInPrompt, PromptId, PromptStore, RULES_FILE_NAMES}; use proto::RpcError; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore, StatusStyle}; +use settings::{Settings, SettingsStore, StatusStyle, update_settings_file}; use smallvec::SmallVec; use std::future::Future; use std::ops::Range; @@ -87,6 +87,7 @@ use workspace::{ dock::{DockPosition, Panel, PanelEvent}, notifications::{DetachAndPromptErr, ErrorMessagePrompt, NotificationId, NotifyResultExt}, }; +use zed_actions::{DecreaseBufferFontSize, IncreaseBufferFontSize, ResetBufferFontSize}; actions!( git_panel, @@ -3456,6 +3457,54 @@ impl GitPanel { } } + pub(crate) fn increase_font_size( + &mut self, + action: &IncreaseBufferFontSize, + _: &mut Window, + cx: &mut Context, + ) { + self.handle_font_size_action(action.persist, px(1.0), cx); + } + + pub(crate) fn decrease_font_size( + &mut self, + action: &DecreaseBufferFontSize, + _: &mut Window, + cx: &mut Context, + ) { + self.handle_font_size_action(action.persist, px(-1.0), cx); + } + + fn handle_font_size_action(&mut self, persist: bool, delta: Pixels, cx: &mut Context) { + if persist { + update_settings_file(self.fs.clone(), cx, move |settings, cx| { + let git_commit_buffer_font_size = + ThemeSettings::get_global(cx).git_commit_buffer_font_size(cx) + delta; + + let _ = settings.theme.git_commit_buffer_font_size.insert( + f32::from(theme_settings::clamp_font_size(git_commit_buffer_font_size)).into(), + ); + }); + } else { + theme_settings::adjust_git_commit_buffer_font_size(cx, |size| size + delta); + } + } + + pub(crate) fn reset_font_size( + &mut self, + action: &ResetBufferFontSize, + _: &mut Window, + cx: &mut Context, + ) { + if action.persist { + update_settings_file(self.fs.clone(), cx, move |settings, _| { + settings.theme.git_commit_buffer_font_size = None; + }); + } else { + theme_settings::reset_git_commit_buffer_font_size(cx); + } + } + fn toggle_directory(&mut self, key: &TreeKey, window: &mut Window, cx: &mut Context) { if let Some(state) = self.view_mode.tree_state_mut() { let expanded = state.expanded_dirs.entry(key.clone()).or_insert(true); @@ -4555,7 +4604,9 @@ impl GitPanel { cx: &mut Context, ) -> Option { let active_repository = self.active_repository.clone()?; - let panel_editor_style = panel_editor_style(true, window, cx); + let settings = ThemeSettings::get_global(cx); + let panel_editor_style = + git_commit_editor_style(settings.git_commit_buffer_font_size(cx), cx); let enable_coauthors = self.render_co_authors(cx); let editor_focus_handle = self.commit_editor.focus_handle(cx); let branch = active_repository.read(cx).branch.clone(); @@ -6626,6 +6677,9 @@ impl Render for GitPanel { }) .on_action(cx.listener(Self::toggle_sort_by_path)) .on_action(cx.listener(Self::toggle_tree_view)) + .on_action(cx.listener(Self::increase_font_size)) + .on_action(cx.listener(Self::decrease_font_size)) + .on_action(cx.listener(Self::reset_font_size)) .on_action(cx.listener(Self::activate_changes_tab)) .on_action(cx.listener(Self::activate_history_tab)) .size_full() @@ -6790,42 +6844,20 @@ pub fn panel_editor_container(_window: &mut Window, cx: &mut App) -> Div { .bg(cx.theme().colors().editor_background) } -pub(crate) fn panel_editor_style(monospace: bool, window: &Window, cx: &App) -> EditorStyle { +pub(crate) fn git_commit_editor_style(font_size: gpui::Pixels, cx: &App) -> EditorStyle { let settings = ThemeSettings::get_global(cx); - let (font_family, font_fallbacks, font_features, font_size, font_weight, line_height) = - if monospace { - let font_size = settings.buffer_font_size(cx); - ( - settings.buffer_font.family.clone(), - settings.buffer_font.fallbacks.clone(), - settings.buffer_font.features.clone(), - AbsoluteLength::from(font_size), - settings.buffer_font.weight, - font_size * settings.buffer_line_height.value(), - ) - } else { - ( - settings.ui_font.family.clone(), - settings.ui_font.fallbacks.clone(), - settings.ui_font.features.clone(), - AbsoluteLength::from(TextSize::Small.rems(cx)), - settings.ui_font.weight, - window.line_height(), - ) - }; - EditorStyle { background: cx.theme().colors().editor_background, local_player: cx.theme().players().local(), text: TextStyle { color: cx.theme().colors().text, - font_family, - font_fallbacks, - font_features, - font_size, - font_weight, - line_height: line_height.into(), + font_family: settings.buffer_font.family.clone(), + font_fallbacks: settings.buffer_font.fallbacks.clone(), + font_features: settings.buffer_font.features.clone(), + font_size: AbsoluteLength::from(font_size), + font_weight: settings.buffer_font.weight, + line_height: (font_size * settings.buffer_line_height.value()).into(), ..Default::default() }, syntax: cx.theme().syntax().clone(), @@ -9150,25 +9182,4 @@ mod tests { )); }); } - - #[gpui::test] - async fn test_panel_editor_style_uses_buffer_font_size(cx: &mut TestAppContext) { - init_test(cx); - - cx.update(|cx| { - SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings(cx, |settings| { - settings.theme.buffer_font_size = Some(20.0.into()); - }); - }); - }); - - cx.add_window(|window, cx| { - let style = panel_editor_style(true, window, cx); - - assert_eq!(style.text.font_size.to_pixels(window.rem_size()), px(20.0)); - - Editor::single_line(window, cx) - }); - } } diff --git a/crates/settings/src/vscode_import.rs b/crates/settings/src/vscode_import.rs index 236f0da3403..43808c7b153 100644 --- a/crates/settings/src/vscode_import.rs +++ b/crates/settings/src/vscode_import.rs @@ -977,6 +977,7 @@ impl VsCodeSettings { buffer_font_features: None, agent_ui_font_size: None, agent_buffer_font_size: None, + git_commit_buffer_font_size: None, markdown_preview_font_family: None, markdown_preview_code_font_family: None, markdown_preview_theme: None, diff --git a/crates/settings_content/src/theme.rs b/crates/settings_content/src/theme.rs index 4d33d0d9b9d..305e1d40530 100644 --- a/crates/settings_content/src/theme.rs +++ b/crates/settings_content/src/theme.rs @@ -149,6 +149,7 @@ pub struct ThemeSettingsContent { pub agent_ui_font_size: Option, /// The font size for user messages in the agent panel. pub agent_buffer_font_size: Option, + pub git_commit_buffer_font_size: Option, /// The name of a font to use for rendering in the markdown preview. /// Falls back to the UI font if unset. pub markdown_preview_font_family: Option, diff --git a/crates/theme_settings/src/settings.rs b/crates/theme_settings/src/settings.rs index c9f220a923c..3d36f08aa58 100644 --- a/crates/theme_settings/src/settings.rs +++ b/crates/theme_settings/src/settings.rs @@ -56,6 +56,7 @@ pub struct ThemeSettings { agent_ui_font_size: Option, /// The agent buffer font size. Determines the size of user messages in the agent panel. agent_buffer_font_size: Option, + git_commit_buffer_font_size: Option, /// The font family to use for rendering in the markdown preview. /// Falls back to the UI font family if unset. markdown_preview_font_family: Option, @@ -118,6 +119,11 @@ pub struct AgentBufferFontSize(Pixels); impl Global for AgentBufferFontSize {} +#[derive(Default)] +pub struct GitCommitBufferFontSize(Pixels); + +impl Global for GitCommitBufferFontSize {} + /// Represents the selection of a theme, which can be either static or dynamic. #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[serde(untagged)] @@ -410,6 +416,14 @@ impl ThemeSettings { .unwrap_or_else(|| self.buffer_font_size(cx)) } + pub fn git_commit_buffer_font_size(&self, cx: &App) -> Pixels { + cx.try_global::() + .map(|size| size.0) + .or(self.git_commit_buffer_font_size) + .map(clamp_font_size) + .unwrap_or_else(|| self.buffer_font_size(cx)) + } + /// Returns the font family to use in the markdown preview, /// falling back to the UI font family when unset. pub fn markdown_preview_font_family(&self) -> &SharedString { @@ -458,6 +472,10 @@ impl ThemeSettings { self.agent_buffer_font_size } + pub fn git_commit_buffer_font_size_settings(&self) -> Option { + self.git_commit_buffer_font_size + } + /// Returns the buffer's line height. pub fn line_height(&self) -> f32 { f32::max(self.buffer_line_height.value(), MIN_LINE_HEIGHT) @@ -609,6 +627,22 @@ pub fn reset_agent_buffer_font_size(cx: &mut App) { } } +pub fn adjust_git_commit_buffer_font_size(cx: &mut App, f: impl FnOnce(Pixels) -> Pixels) { + let git_commit_buffer_font_size = ThemeSettings::get_global(cx).git_commit_buffer_font_size(cx); + let adjusted_size = cx + .try_global::() + .map_or(git_commit_buffer_font_size, |adjusted_size| adjusted_size.0); + cx.set_global(GitCommitBufferFontSize(clamp_font_size(f(adjusted_size)))); + cx.refresh_windows(); +} + +pub fn reset_git_commit_buffer_font_size(cx: &mut App) { + if cx.has_global::() { + cx.remove_global::(); + cx.refresh_windows(); + } +} + /// Ensures font size is within the valid range. pub fn clamp_font_size(size: Pixels) -> Pixels { size.clamp(MIN_FONT_SIZE, MAX_FONT_SIZE) @@ -658,6 +692,7 @@ impl settings::Settings for ThemeSettings { buffer_line_height: content.buffer_line_height.unwrap().into(), agent_ui_font_size: content.agent_ui_font_size.map(|s| s.into_gpui()), agent_buffer_font_size: content.agent_buffer_font_size.map(|s| s.into_gpui()), + git_commit_buffer_font_size: content.git_commit_buffer_font_size.map(|s| s.into_gpui()), markdown_preview_font_family: content .markdown_preview_font_family .as_ref() diff --git a/crates/theme_settings/src/theme_settings.rs b/crates/theme_settings/src/theme_settings.rs index b5bf1a60283..192dfa54c47 100644 --- a/crates/theme_settings/src/theme_settings.rs +++ b/crates/theme_settings/src/theme_settings.rs @@ -28,12 +28,14 @@ pub use crate::schema::{ }; use crate::settings::adjust_buffer_font_size; pub use crate::settings::{ - AgentBufferFontSize, AgentUiFontSize, BufferLineHeight, FontFamilyName, IconThemeName, - IconThemeSelection, ThemeAppearanceMode, ThemeName, ThemeSelection, ThemeSettings, - adjust_agent_buffer_font_size, adjust_agent_ui_font_size, adjust_ui_font_size, - adjusted_font_size, appearance_to_mode, clamp_font_size, default_theme, - observe_buffer_font_size_adjustment, reset_agent_buffer_font_size, reset_agent_ui_font_size, - reset_buffer_font_size, reset_ui_font_size, set_icon_theme, set_mode, set_theme, setup_ui_font, + AgentBufferFontSize, AgentUiFontSize, BufferLineHeight, FontFamilyName, + GitCommitBufferFontSize, IconThemeName, IconThemeSelection, ThemeAppearanceMode, ThemeName, + ThemeSelection, ThemeSettings, adjust_agent_buffer_font_size, adjust_agent_ui_font_size, + adjust_git_commit_buffer_font_size, adjust_ui_font_size, adjusted_font_size, + appearance_to_mode, clamp_font_size, default_theme, observe_buffer_font_size_adjustment, + reset_agent_buffer_font_size, reset_agent_ui_font_size, reset_buffer_font_size, + reset_git_commit_buffer_font_size, reset_ui_font_size, set_icon_theme, set_mode, set_theme, + setup_ui_font, }; pub use theme::UiDensity; @@ -87,6 +89,8 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut App) { let mut prev_ui_font_size_settings = settings.ui_font_size_settings(); let mut prev_agent_ui_font_size_settings = settings.agent_ui_font_size_settings(); let mut prev_agent_buffer_font_size_settings = settings.agent_buffer_font_size_settings(); + let mut prev_git_commit_buffer_font_size_settings = + settings.git_commit_buffer_font_size_settings(); let mut prev_theme_name = settings.theme.name(SystemAppearance::global(cx).0); let mut prev_icon_theme_name = settings.icon_theme.name(SystemAppearance::global(cx).0); let mut prev_theme_overrides = ( @@ -101,6 +105,7 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut App) { let ui_font_size_settings = settings.ui_font_size_settings(); let agent_ui_font_size_settings = settings.agent_ui_font_size_settings(); let agent_buffer_font_size_settings = settings.agent_buffer_font_size_settings(); + let git_commit_buffer_font_size_settings = settings.git_commit_buffer_font_size_settings(); let theme_name = settings.theme.name(SystemAppearance::global(cx).0); let icon_theme_name = settings.icon_theme.name(SystemAppearance::global(cx).0); let theme_overrides = ( @@ -128,6 +133,11 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut App) { reset_agent_buffer_font_size(cx); } + if git_commit_buffer_font_size_settings != prev_git_commit_buffer_font_size_settings { + prev_git_commit_buffer_font_size_settings = git_commit_buffer_font_size_settings; + reset_git_commit_buffer_font_size(cx); + } + if theme_name != prev_theme_name || theme_overrides != prev_theme_overrides { prev_theme_name = theme_name; prev_theme_overrides = theme_overrides;