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}