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-weifht",
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}