ui: Track changes to UI font size made via actions with settings (#23265)
Fixes #5380 Closes #5380 Release Notes: - Font size changes made with actions are now persisted in user settings
This commit is contained in:
parent
24495f09f9
commit
795376cb07
11 changed files with 89 additions and 156 deletions
|
@ -7,7 +7,7 @@ use anyhow::Result;
|
|||
use derive_more::{Deref, DerefMut};
|
||||
use gpui::{
|
||||
px, AppContext, Font, FontFallbacks, FontFeatures, FontStyle, FontWeight, Global, Pixels,
|
||||
Subscription, ViewContext, WindowContext,
|
||||
WindowContext,
|
||||
};
|
||||
use refineable::Refineable;
|
||||
use schemars::{
|
||||
|
@ -207,16 +207,6 @@ impl SystemAppearance {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub(crate) struct AdjustedBufferFontSize(Pixels);
|
||||
|
||||
impl Global for AdjustedBufferFontSize {}
|
||||
|
||||
#[derive(Default)]
|
||||
pub(crate) struct AdjustedUiFontSize(Pixels);
|
||||
|
||||
impl Global for AdjustedUiFontSize {}
|
||||
|
||||
/// Represents the selection of a theme, which can be either static or dynamic.
|
||||
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||
#[serde(untagged)]
|
||||
|
@ -440,10 +430,13 @@ impl BufferLineHeight {
|
|||
|
||||
impl ThemeSettings {
|
||||
/// Returns the [AdjustedBufferFontSize].
|
||||
pub fn buffer_font_size(&self, cx: &AppContext) -> Pixels {
|
||||
cx.try_global::<AdjustedBufferFontSize>()
|
||||
.map_or(self.buffer_font_size, |size| size.0)
|
||||
.max(MIN_FONT_SIZE)
|
||||
pub fn buffer_font_size(&self) -> Pixels {
|
||||
Self::clamp_font_size(self.buffer_font_size)
|
||||
}
|
||||
|
||||
/// Ensures that the font size is within the valid range.
|
||||
pub fn clamp_font_size(size: Pixels) -> Pixels {
|
||||
size.max(MIN_FONT_SIZE)
|
||||
}
|
||||
|
||||
// TODO: Rename: `line_height` -> `buffer_line_height`
|
||||
|
@ -500,105 +493,19 @@ impl ThemeSettings {
|
|||
}
|
||||
}
|
||||
|
||||
/// Observe changes to the adjusted buffer font size.
|
||||
pub fn observe_buffer_font_size_adjustment<V: 'static>(
|
||||
cx: &mut ViewContext<V>,
|
||||
f: impl 'static + Fn(&mut V, &mut ViewContext<V>),
|
||||
) -> Subscription {
|
||||
cx.observe_global::<AdjustedBufferFontSize>(f)
|
||||
}
|
||||
|
||||
/// Sets the adjusted buffer font size.
|
||||
pub fn adjusted_font_size(size: Pixels, cx: &AppContext) -> Pixels {
|
||||
if let Some(AdjustedBufferFontSize(adjusted_size)) = cx.try_global::<AdjustedBufferFontSize>() {
|
||||
let buffer_font_size = ThemeSettings::get_global(cx).buffer_font_size;
|
||||
let delta = *adjusted_size - buffer_font_size;
|
||||
size + delta
|
||||
} else {
|
||||
size
|
||||
}
|
||||
.max(MIN_FONT_SIZE)
|
||||
}
|
||||
|
||||
/// Returns the adjusted buffer font size.
|
||||
pub fn get_buffer_font_size(cx: &AppContext) -> Pixels {
|
||||
let buffer_font_size = ThemeSettings::get_global(cx).buffer_font_size;
|
||||
cx.try_global::<AdjustedBufferFontSize>()
|
||||
.map_or(buffer_font_size, |adjusted_size| adjusted_size.0)
|
||||
}
|
||||
|
||||
/// Adjusts the buffer font size.
|
||||
pub fn adjust_buffer_font_size(cx: &mut AppContext, f: fn(&mut Pixels)) {
|
||||
let buffer_font_size = ThemeSettings::get_global(cx).buffer_font_size;
|
||||
let mut adjusted_size = cx
|
||||
.try_global::<AdjustedBufferFontSize>()
|
||||
.map_or(buffer_font_size, |adjusted_size| adjusted_size.0);
|
||||
|
||||
f(&mut adjusted_size);
|
||||
adjusted_size = adjusted_size.max(MIN_FONT_SIZE);
|
||||
cx.set_global(AdjustedBufferFontSize(adjusted_size));
|
||||
cx.refresh();
|
||||
}
|
||||
|
||||
/// Returns whether the buffer font size has been adjusted.
|
||||
pub fn has_adjusted_buffer_font_size(cx: &AppContext) -> bool {
|
||||
cx.has_global::<AdjustedBufferFontSize>()
|
||||
}
|
||||
|
||||
/// Resets the buffer font size to the default value.
|
||||
pub fn reset_buffer_font_size(cx: &mut AppContext) {
|
||||
if cx.has_global::<AdjustedBufferFontSize>() {
|
||||
cx.remove_global::<AdjustedBufferFontSize>();
|
||||
cx.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Make private, change usages to use `get_ui_font_size` instead.
|
||||
#[allow(missing_docs)]
|
||||
pub fn setup_ui_font(cx: &mut WindowContext) -> gpui::Font {
|
||||
let (ui_font, ui_font_size) = {
|
||||
let theme_settings = ThemeSettings::get_global(cx);
|
||||
let font = theme_settings.ui_font.clone();
|
||||
(font, get_ui_font_size(cx))
|
||||
(font, theme_settings.ui_font_size)
|
||||
};
|
||||
|
||||
cx.set_rem_size(ui_font_size);
|
||||
ui_font
|
||||
}
|
||||
|
||||
/// Gets the adjusted UI font size.
|
||||
pub fn get_ui_font_size(cx: &AppContext) -> Pixels {
|
||||
let ui_font_size = ThemeSettings::get_global(cx).ui_font_size;
|
||||
cx.try_global::<AdjustedUiFontSize>()
|
||||
.map_or(ui_font_size, |adjusted_size| adjusted_size.0)
|
||||
}
|
||||
|
||||
/// Sets the adjusted UI font size.
|
||||
pub fn adjust_ui_font_size(cx: &mut AppContext, f: fn(&mut Pixels)) {
|
||||
let ui_font_size = ThemeSettings::get_global(cx).ui_font_size;
|
||||
let mut adjusted_size = cx
|
||||
.try_global::<AdjustedUiFontSize>()
|
||||
.map_or(ui_font_size, |adjusted_size| adjusted_size.0);
|
||||
|
||||
f(&mut adjusted_size);
|
||||
adjusted_size = adjusted_size.max(MIN_FONT_SIZE);
|
||||
cx.set_global(AdjustedUiFontSize(adjusted_size));
|
||||
cx.refresh();
|
||||
}
|
||||
|
||||
/// Returns whether the UI font size has been adjusted.
|
||||
pub fn has_adjusted_ui_font_size(cx: &AppContext) -> bool {
|
||||
cx.has_global::<AdjustedUiFontSize>()
|
||||
}
|
||||
|
||||
/// Resets the UI font size to the default value.
|
||||
pub fn reset_ui_font_size(cx: &mut AppContext) {
|
||||
if cx.has_global::<AdjustedUiFontSize>() {
|
||||
cx.remove_global::<AdjustedUiFontSize>();
|
||||
cx.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
fn clamp_font_weight(weight: f32) -> FontWeight {
|
||||
FontWeight(weight.clamp(100., 950.))
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ mod styles;
|
|||
use std::path::Path;
|
||||
use std::sync::Arc;
|
||||
|
||||
use ::settings::{Settings, SettingsStore};
|
||||
use ::settings::Settings;
|
||||
use anyhow::Result;
|
||||
use fs::Fs;
|
||||
use gpui::{
|
||||
|
@ -100,16 +100,6 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut AppContext) {
|
|||
|
||||
ThemeSettings::register(cx);
|
||||
FontFamilyCache::init_global(cx);
|
||||
|
||||
let mut prev_buffer_font_size = ThemeSettings::get_global(cx).buffer_font_size;
|
||||
cx.observe_global::<SettingsStore>(move |cx| {
|
||||
let buffer_font_size = ThemeSettings::get_global(cx).buffer_font_size;
|
||||
if buffer_font_size != prev_buffer_font_size {
|
||||
prev_buffer_font_size = buffer_font_size;
|
||||
reset_buffer_font_size(cx);
|
||||
}
|
||||
})
|
||||
.detach();
|
||||
}
|
||||
|
||||
/// Implementing this trait allows accessing the active theme.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue