setting.rs

  1use gpui::View;
  2
  3use crate::prelude::*;
  4
  5use crate::{
  6    SecondarySettingType, SettingLayout, SettingType, SettingsGroup, SettingsItem, SettingsMenu,
  7    ToggleType,
  8};
  9
 10pub struct SettingStory {
 11    menus: Vec<(SharedString, View<SettingsMenu>)>,
 12}
 13
 14impl SettingStory {
 15    pub fn new() -> Self {
 16        Self { menus: Vec::new() }
 17    }
 18
 19    pub fn init(cx: &mut ViewContext<Self>) -> Self {
 20        let mut story = Self::new();
 21        story.empty_menu(cx);
 22        story.editor_example(cx);
 23        story.menu_single_group(cx);
 24        story
 25    }
 26}
 27
 28impl SettingStory {
 29    pub fn empty_menu(&mut self, cx: &mut ViewContext<Self>) {
 30        let menu = cx.new_view(|_cx| SettingsMenu::new("Empty Menu"));
 31
 32        self.menus.push(("Empty Menu".into(), menu));
 33    }
 34
 35    pub fn menu_single_group(&mut self, cx: &mut ViewContext<Self>) {
 36        let theme_setting = SettingsItem::new(
 37            "theme-setting",
 38            "Theme".into(),
 39            SettingType::Dropdown,
 40            Some(cx.theme().name.clone().into()),
 41        )
 42        .layout(SettingLayout::Stacked);
 43        let high_contrast_setting = SettingsItem::new(
 44            "theme-contrast",
 45            "Use high contrast theme".into(),
 46            SettingType::Toggle(ToggleType::Checkbox),
 47            None,
 48        )
 49        .toggled(false);
 50        let appearance_setting = SettingsItem::new(
 51            "switch-appearance",
 52            "Match system appearance".into(),
 53            SettingType::ToggleAnd(SecondarySettingType::Dropdown),
 54            Some("When Dark".to_string().into()),
 55        )
 56        .layout(SettingLayout::FullLineJustified);
 57
 58        let group = SettingsGroup::new("Appearance")
 59            .add_setting(theme_setting)
 60            .add_setting(appearance_setting)
 61            .add_setting(high_contrast_setting);
 62
 63        let menu = cx.new_view(|_cx| SettingsMenu::new("Appearance").add_group(group));
 64
 65        self.menus.push(("Single Group".into(), menu));
 66    }
 67
 68    pub fn editor_example(&mut self, cx: &mut ViewContext<Self>) {
 69        let font_group = SettingsGroup::new("Font")
 70            .add_setting(
 71                SettingsItem::new(
 72                    "font-family",
 73                    "Font".into(),
 74                    SettingType::Dropdown,
 75                    Some("Berkeley Mono".to_string().into()),
 76                )
 77                .icon(IconName::Font)
 78                .layout(SettingLayout::AutoWidth),
 79            )
 80            .add_setting(
 81                SettingsItem::new(
 82                    "font-weight",
 83                    "Font Weight".into(),
 84                    SettingType::Dropdown,
 85                    Some("400".to_string().into()),
 86                )
 87                .icon(IconName::FontWeight)
 88                .layout(SettingLayout::AutoWidth),
 89            )
 90            .add_setting(
 91                SettingsItem::new(
 92                    "font-size",
 93                    "Font Size".into(),
 94                    SettingType::Dropdown,
 95                    Some("14".to_string().into()),
 96                )
 97                .icon(IconName::FontSize)
 98                .layout(SettingLayout::AutoWidth),
 99            )
100            .add_setting(
101                SettingsItem::new(
102                    "line-height",
103                    "Line Height".into(),
104                    SettingType::Dropdown,
105                    Some("1.35".to_string().into()),
106                )
107                .icon(IconName::LineHeight)
108                .layout(SettingLayout::AutoWidth),
109            )
110            .add_setting(
111                SettingsItem::new(
112                    "enable-ligatures",
113                    "Enable Ligatures".into(),
114                    SettingType::Toggle(ToggleType::Checkbox),
115                    None,
116                )
117                .toggled(true),
118            );
119
120        let editor_group = SettingsGroup::new("Editor")
121            .add_setting(
122                SettingsItem::new(
123                    "show-indent-guides",
124                    "Indent Guides".into(),
125                    SettingType::Toggle(ToggleType::Checkbox),
126                    None,
127                )
128                .toggled(true),
129            )
130            .add_setting(
131                SettingsItem::new(
132                    "show-git-blame",
133                    "Git Blame".into(),
134                    SettingType::Toggle(ToggleType::Checkbox),
135                    None,
136                )
137                .toggled(false),
138            );
139
140        let gutter_group = SettingsGroup::new("Gutter")
141            .add_setting(
142                SettingsItem::new(
143                    "enable-git-hunks",
144                    "Show Git Hunks".into(),
145                    SettingType::Toggle(ToggleType::Checkbox),
146                    None,
147                )
148                .toggled(true),
149            )
150            .add_setting(
151                SettingsItem::new(
152                    "show-line-numbers",
153                    "Line Numbers".into(),
154                    SettingType::ToggleAnd(SecondarySettingType::Dropdown),
155                    Some("Ascending".to_string().into()),
156                )
157                .toggled(true)
158                .layout(SettingLayout::FullLineJustified),
159            );
160
161        let scrollbar_group = SettingsGroup::new("Scrollbar")
162            .add_setting(
163                SettingsItem::new(
164                    "scrollbar-visibility",
165                    "Show scrollbar when:".into(),
166                    SettingType::Dropdown,
167                    Some("Always Visible".to_string().into()),
168                )
169                .layout(SettingLayout::AutoWidth)
170                .icon(IconName::Visible),
171            )
172            .add_setting(
173                SettingsItem::new(
174                    "show-diagnostic-markers",
175                    "Diagnostic Markers".into(),
176                    SettingType::Toggle(ToggleType::Checkbox),
177                    None,
178                )
179                .toggled(true),
180            )
181            .add_setting(
182                SettingsItem::new(
183                    "show-git-markers",
184                    "Git Status Markers".into(),
185                    SettingType::Toggle(ToggleType::Checkbox),
186                    None,
187                )
188                .toggled(false),
189            )
190            .add_setting(
191                SettingsItem::new(
192                    "show-selection-markers",
193                    "Selection & Match Markers".into(),
194                    SettingType::Toggle(ToggleType::Checkbox),
195                    None,
196                )
197                .toggled(true),
198            );
199
200        let menu = cx.new_view(|_cx| {
201            SettingsMenu::new("Editor")
202                .add_group(font_group)
203                .add_group(editor_group)
204                .add_group(gutter_group)
205                .add_group(scrollbar_group)
206        });
207
208        self.menus.push(("Editor Example".into(), menu));
209    }
210}
211
212impl Render for SettingStory {
213    fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
214        div()
215            .bg(cx.theme().colors().background)
216            .text_color(cx.theme().colors().text)
217            .children(self.menus.iter().map(|(name, menu)| {
218                v_flex()
219                    .p_2()
220                    .gap_2()
221                    .child(Headline::new(name.clone()).size(HeadlineSize::Medium))
222                    .child(menu.clone())
223            }))
224    }
225}