diff --git a/crates/language2/src/language2.rs b/crates/language2/src/language2.rs index 6f267c802f8e69829153cef9ace80d9aa76abbe4..d21ebd572a315debc4a98331a2de007d2e771e4c 100644 --- a/crates/language2/src/language2.rs +++ b/crates/language2/src/language2.rs @@ -765,7 +765,7 @@ impl LanguageRegistry { let mut state = self.state.write(); state.theme = Some(theme.clone()); for language in &state.languages { - language.set_theme(&theme.editor.syntax); + language.set_theme(&theme.syntax); } } @@ -1066,7 +1066,7 @@ impl LanguageRegistryState { fn add(&mut self, language: Arc) { if let Some(theme) = self.theme.as_ref() { - language.set_theme(&theme.editor.syntax); + language.set_theme(&theme.syntax); } self.languages.push(language); self.version += 1; diff --git a/crates/theme2/src/settings.rs b/crates/theme2/src/settings.rs index 1cb6f285a2901f7091e30b28e1271c16a28ed5e4..5251f29107442f55bf53acac92b1042dff64b1c3 100644 --- a/crates/theme2/src/settings.rs +++ b/crates/theme2/src/settings.rs @@ -1,6 +1,6 @@ use crate::{Theme, ThemeRegistry}; use anyhow::Result; -use gpui2::{FontFeatures, SharedString, Font, AppContext, Pixels, px, FontWeight, FontStyle}; +use gpui2::{px, AppContext, Font, FontFeatures, FontStyle, FontWeight, Pixels}; use schemars::{ gen::SchemaGenerator, schema::{InstanceType, Schema, SchemaObject}, @@ -15,21 +15,21 @@ use util::ResultExt as _; const MIN_FONT_SIZE: Pixels = px(6.0); const MIN_LINE_HEIGHT: f32 = 1.0; -#[derive(Clone, JsonSchema)] +#[derive(Clone)] pub struct ThemeSettings { pub buffer_font: Font, pub buffer_font_size: Pixels, pub buffer_line_height: BufferLineHeight, - #[serde(skip)] pub theme: Arc, } -pub struct AdjustedBufferFontSize(pub f32); +#[derive(Default)] +pub struct AdjustedBufferFontSize(Option); #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] pub struct ThemeSettingsContent { #[serde(default)] - pub buffer_font_family: Option, + pub buffer_font_family: Option, #[serde(default)] pub buffer_font_size: Option, #[serde(default)] @@ -37,7 +37,7 @@ pub struct ThemeSettingsContent { #[serde(default)] pub buffer_font_features: Option, #[serde(default)] - pub theme: Option, + pub theme: Option, } #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, JsonSchema, Default)] @@ -60,13 +60,12 @@ impl BufferLineHeight { } impl ThemeSettings { - pub fn buffer_font_size(&self, cx: &AppContext) -> f32 { - if cx.has_global::() { - cx.global::().0 - } else { - self.buffer_font_size - } - .max(MIN_FONT_SIZE) + pub fn buffer_font_size(&self, cx: &mut AppContext) -> Pixels { + let font_size = *cx + .default_global_mut::() + .0 + .get_or_insert(self.buffer_font_size.into()); + font_size.max(MIN_FONT_SIZE) } pub fn line_height(&self) -> f32 { @@ -74,33 +73,32 @@ impl ThemeSettings { } } -pub fn adjusted_font_size(size: f32, cx: &AppContext) -> f32 { - if let Some(adjusted_size) = cx.try_global::() { +pub fn adjusted_font_size(size: Pixels, cx: &mut AppContext) -> Pixels { + if let Some(adjusted_size) = cx.default_global_mut::().0 { let buffer_font_size = settings2::get::(cx).buffer_font_size; let delta = adjusted_size - buffer_font_size; size + delta } else { size - }.max(MIN_FONT_SIZE) + } + .max(MIN_FONT_SIZE) } pub fn adjust_font_size(cx: &mut AppContext, f: fn(&mut Pixels)) { - if !cx.has_global::() { - let buffer_font_size = settings2::get::(cx).buffer_font_size; - cx.set_global(AdjustedBufferFontSize(buffer_font_size)); - } - let mut delta = cx.global_mut::(); - f(&mut delta.0); - delta.0 = delta + let buffer_font_size = settings2::get::(cx).buffer_font_size; + let adjusted_size = cx + .default_global_mut::() .0 - .max(MIN_FONT_SIZE - settings2::get::(cx).buffer_font_size); - cx.refresh_windows(); + .get_or_insert(buffer_font_size); + f(adjusted_size); + *adjusted_size = (*adjusted_size).max(MIN_FONT_SIZE - buffer_font_size); + cx.refresh(); } pub fn reset_font_size(cx: &mut AppContext) { if cx.has_global::() { - cx.remove_global::(); - cx.refresh_windows(); + cx.global_mut::().0 = None; + cx.refresh(); } } @@ -118,43 +116,31 @@ impl settings2::Setting for ThemeSettings { let mut this = Self { buffer_font: Font { - family: defaults.buffer_font_family.clone().unwrap(), + family: defaults.buffer_font_family.clone().unwrap().into(), features: defaults.buffer_font_features.clone().unwrap(), weight: FontWeight::default(), style: FontStyle::default(), }, - buffer_font_size: defaults.buffer_font_size.unwrap(), + buffer_font_size: defaults.buffer_font_size.unwrap().into(), buffer_line_height: defaults.buffer_line_height.unwrap(), - theme: themes.get(defaults.theme.as_ref().unwrap()).unwrap(), + theme: themes.get(defaults.theme.as_ref().unwrap().clone()).unwrap(), }; for value in user_values.into_iter().copied().cloned() { - let font_cache = cx.font_cache(); - let mut family_changed = false; if let Some(value) = value.buffer_font_family { - this.buffer_font_family_name = value; - family_changed = true; + this.buffer_font.family = value.into(); } if let Some(value) = value.buffer_font_features { - this.buffer_font_features = value; - family_changed = true; - } - if family_changed { - if let Some(id) = font_cache - .load_family(&[&this.buffer_font_family_name], &this.buffer_font_features) - .log_err() - { - this.buffer_font_family = id; - } + this.buffer_font.features = value; } if let Some(value) = &value.theme { - if let Some(theme) = themes.get(value).log_err() { + if let Some(theme) = themes.get(value.clone()).log_err() { this.theme = theme; } } - merge(&mut this.buffer_font_size, value.buffer_font_size); + merge(&mut this.buffer_font_size, value.buffer_font_size.map(Into::into)); merge(&mut this.buffer_line_height, value.buffer_line_height); } diff --git a/crates/theme2/src/theme2.rs b/crates/theme2/src/theme2.rs index 0c5943c4968237c8889a9a2fcaa9b81f0239b4f2..48738ac40ca8f0b000e2a12e3a3df4d07c71b531 100644 --- a/crates/theme2/src/theme2.rs +++ b/crates/theme2/src/theme2.rs @@ -5,7 +5,7 @@ mod themes; pub use registry::*; pub use settings::*; -use gpui2::{Hsla, SharedString}; +use gpui2::{HighlightStyle, Hsla, SharedString}; use std::sync::Arc; pub struct Theme { @@ -78,12 +78,13 @@ pub struct Theme { pub player: [PlayerTheme; 8], } -#[derive(Clone, Copy)] +#[derive(Clone)] pub struct SyntaxTheme { pub comment: Hsla, pub string: Hsla, pub function: Hsla, pub keyword: Hsla, + pub highlights: Vec<(String, HighlightStyle)>, } #[derive(Clone, Copy)] @@ -93,7 +94,6 @@ pub struct PlayerTheme { } pub struct ThemeMetadata { - pub id: usize, pub name: SharedString, pub is_light: bool, } diff --git a/crates/theme2/src/themes/one_dark.rs b/crates/theme2/src/themes/one_dark.rs index 8201c39a2f339c25b6078553ef815c5e9f303356..50f9b3922a56e5b73a52f54d28c339ce5d303a25 100644 --- a/crates/theme2/src/themes/one_dark.rs +++ b/crates/theme2/src/themes/one_dark.rs @@ -1,9 +1,13 @@ use gpui2::rgba; -use crate::{PlayerTheme, SyntaxTheme, Theme}; +use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata}; pub fn one_dark() -> Theme { Theme { + metadata: ThemeMetadata { + name: "One Dark".into(), + is_light: false, + }, transparent: rgba(0x00000000).into(), mac_os_traffic_light_red: rgba(0xec695eff).into(), mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(), @@ -36,6 +40,7 @@ pub fn one_dark() -> Theme { string: rgba(0xa1c181ff).into(), function: rgba(0x73ade9ff).into(), keyword: rgba(0xb477cfff).into(), + highlights: Vec::new(), }, status_bar: rgba(0x3b414dff).into(), title_bar: rgba(0x3b414dff).into(),