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<String, 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(mut self, language_name: impl Into<String>, overrides: Override) -> Self {
54        self.overrides.insert(language_name.into(), overrides);
55        self
56    }
57
58    pub fn soft_wrap(&self, language: Option<&Arc<Language>>) -> SoftWrap {
59        language
60            .and_then(|language| self.overrides.get(language.name()))
61            .and_then(|settings| settings.soft_wrap)
62            .unwrap_or(self.soft_wrap)
63    }
64
65    pub fn preferred_line_length(&self, language: Option<&Arc<Language>>) -> u32 {
66        language
67            .and_then(|language| self.overrides.get(language.name()))
68            .and_then(|settings| settings.preferred_line_length)
69            .unwrap_or(self.preferred_line_length)
70    }
71}