Checkpoint

This commit is contained in:
Marshall Bowers 2023-10-24 17:29:03 +02:00
parent 09866ec3e9
commit 4740d6ed61
4 changed files with 43 additions and 52 deletions

View file

@ -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<Language>) {
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;

View file

@ -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<Theme>,
}
pub struct AdjustedBufferFontSize(pub f32);
#[derive(Default)]
pub struct AdjustedBufferFontSize(Option<Pixels>);
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
pub struct ThemeSettingsContent {
#[serde(default)]
pub buffer_font_family: Option<SharedString>,
pub buffer_font_family: Option<String>,
#[serde(default)]
pub buffer_font_size: Option<f32>,
#[serde(default)]
@ -37,7 +37,7 @@ pub struct ThemeSettingsContent {
#[serde(default)]
pub buffer_font_features: Option<FontFeatures>,
#[serde(default)]
pub theme: Option<SharedString>,
pub theme: Option<String>,
}
#[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::<AdjustedBufferFontSize>() {
cx.global::<AdjustedBufferFontSize>().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::<AdjustedBufferFontSize>()
.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::<AdjustedBufferFontSize>() {
pub fn adjusted_font_size(size: Pixels, cx: &mut AppContext) -> Pixels {
if let Some(adjusted_size) = cx.default_global_mut::<AdjustedBufferFontSize>().0 {
let buffer_font_size = settings2::get::<ThemeSettings>(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::<AdjustedBufferFontSize>() {
let buffer_font_size = settings2::get::<ThemeSettings>(cx).buffer_font_size;
cx.set_global(AdjustedBufferFontSize(buffer_font_size));
}
let mut delta = cx.global_mut::<AdjustedBufferFontSize>();
f(&mut delta.0);
delta.0 = delta
let buffer_font_size = settings2::get::<ThemeSettings>(cx).buffer_font_size;
let adjusted_size = cx
.default_global_mut::<AdjustedBufferFontSize>()
.0
.max(MIN_FONT_SIZE - settings2::get::<ThemeSettings>(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::<AdjustedBufferFontSize>() {
cx.remove_global::<AdjustedBufferFontSize>();
cx.refresh_windows();
cx.global_mut::<AdjustedBufferFontSize>().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);
}

View file

@ -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,
}

View file

@ -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(),