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}