settings.rs

 1use anyhow::Result;
 2use gpui::font_cache::{FamilyId, FontCache};
 3use language::Language;
 4use std::{collections::HashMap, sync::Arc};
 5use theme::Theme;
 6
 7#[derive(Clone)]
 8pub struct Settings {
 9    pub buffer_font_family: FamilyId,
10    pub buffer_font_size: f32,
11    pub tab_size: usize,
12    soft_wrap: SoftWrap,
13    preferred_line_length: u32,
14    overrides: HashMap<Arc<str>, Override>,
15    pub theme: Arc<Theme>,
16}
17
18#[derive(Clone, Default)]
19pub struct Override {
20    pub soft_wrap: Option<SoftWrap>,
21    pub preferred_line_length: Option<u32>,
22}
23
24#[derive(Copy, Clone)]
25pub enum SoftWrap {
26    None,
27    EditorWidth,
28    PreferredLineLength,
29}
30
31impl Settings {
32    pub fn new(
33        buffer_font_family: &str,
34        font_cache: &FontCache,
35        theme: Arc<Theme>,
36    ) -> Result<Self> {
37        Ok(Self {
38            buffer_font_family: font_cache.load_family(&[buffer_font_family])?,
39            buffer_font_size: 15.,
40            tab_size: 4,
41            soft_wrap: SoftWrap::None,
42            preferred_line_length: 80,
43            overrides: Default::default(),
44            theme,
45        })
46    }
47
48    pub fn with_tab_size(mut self, tab_size: usize) -> Self {
49        self.tab_size = tab_size;
50        self
51    }
52
53    pub fn with_overrides(
54        mut self,
55        language_name: impl Into<Arc<str>>,
56        overrides: Override,
57    ) -> Self {
58        self.overrides.insert(language_name.into(), overrides);
59        self
60    }
61
62    pub fn soft_wrap(&self, language: Option<&Arc<Language>>) -> SoftWrap {
63        language
64            .and_then(|language| self.overrides.get(language.name().as_ref()))
65            .and_then(|settings| settings.soft_wrap)
66            .unwrap_or(self.soft_wrap)
67    }
68
69    pub fn preferred_line_length(&self, language: Option<&Arc<Language>>) -> u32 {
70        language
71            .and_then(|language| self.overrides.get(language.name().as_ref()))
72            .and_then(|settings| settings.preferred_line_length)
73            .unwrap_or(self.preferred_line_length)
74    }
75
76    #[cfg(any(test, feature = "test-support"))]
77    pub fn test(cx: &gpui::AppContext) -> Settings {
78        Settings {
79            buffer_font_family: cx.font_cache().load_family(&["Monaco"]).unwrap(),
80            buffer_font_size: 14.,
81            tab_size: 4,
82            soft_wrap: SoftWrap::None,
83            preferred_line_length: 80,
84            overrides: Default::default(),
85            theme: gpui::fonts::with_font_cache(cx.font_cache().clone(), || Default::default()),
86        }
87    }
88}