1use std::path::PathBuf;
2use std::str::FromStr;
3
4use gpui3::WindowContext;
5use rand::Rng;
6
7use crate::HighlightedText;
8use crate::{
9 Buffer, BufferRow, BufferRows, EditorPane, FileSystemStatus, GitStatus, HighlightedLine, Icon,
10 Keybinding, Label, LabelColor, ListEntry, ListEntrySize, ListItem, Livestream, MicStatus,
11 ModifierKeys, PaletteItem, Player, PlayerCallStatus, PlayerWithCallStatus, ScreenShareStatus,
12 Symbol, Tab, ThemeColor, ToggleState, VideoStatus,
13};
14
15pub fn static_tabs_example<S: 'static + Send + Sync + Clone>() -> Vec<Tab<S>> {
16 vec![
17 Tab::new("wip.rs")
18 .title("wip.rs".to_string())
19 .icon(Icon::FileRust)
20 .current(false)
21 .fs_status(FileSystemStatus::Deleted),
22 Tab::new("Cargo.toml")
23 .title("Cargo.toml".to_string())
24 .icon(Icon::FileToml)
25 .current(false)
26 .git_status(GitStatus::Modified),
27 Tab::new("Channels Panel")
28 .title("Channels Panel".to_string())
29 .icon(Icon::Hash)
30 .current(false),
31 Tab::new("channels_panel.rs")
32 .title("channels_panel.rs".to_string())
33 .icon(Icon::FileRust)
34 .current(true)
35 .git_status(GitStatus::Modified),
36 Tab::new("workspace.rs")
37 .title("workspace.rs".to_string())
38 .current(false)
39 .icon(Icon::FileRust)
40 .git_status(GitStatus::Modified),
41 Tab::new("icon_button.rs")
42 .title("icon_button.rs".to_string())
43 .icon(Icon::FileRust)
44 .current(false),
45 Tab::new("storybook.rs")
46 .title("storybook.rs".to_string())
47 .icon(Icon::FileRust)
48 .current(false)
49 .git_status(GitStatus::Created),
50 Tab::new("theme.rs")
51 .title("theme.rs".to_string())
52 .icon(Icon::FileRust)
53 .current(false),
54 Tab::new("theme_registry.rs")
55 .title("theme_registry.rs".to_string())
56 .icon(Icon::FileRust)
57 .current(false),
58 Tab::new("styleable_helpers.rs")
59 .title("styleable_helpers.rs".to_string())
60 .icon(Icon::FileRust)
61 .current(false),
62 ]
63}
64
65pub fn static_tabs_1<S: 'static + Send + Sync + Clone>() -> Vec<Tab<S>> {
66 vec![
67 Tab::new("project_panel.rs")
68 .title("project_panel.rs".to_string())
69 .icon(Icon::FileRust)
70 .current(false)
71 .fs_status(FileSystemStatus::Deleted),
72 Tab::new("tab_bar.rs")
73 .title("tab_bar.rs".to_string())
74 .icon(Icon::FileRust)
75 .current(false)
76 .git_status(GitStatus::Modified),
77 Tab::new("workspace.rs")
78 .title("workspace.rs".to_string())
79 .icon(Icon::FileRust)
80 .current(false),
81 Tab::new("tab.rs")
82 .title("tab.rs".to_string())
83 .icon(Icon::FileRust)
84 .current(true)
85 .git_status(GitStatus::Modified),
86 ]
87}
88
89pub fn static_tabs_2<S: 'static + Send + Sync + Clone>() -> Vec<Tab<S>> {
90 vec![
91 Tab::new("tab_bar.rs")
92 .title("tab_bar.rs".to_string())
93 .icon(Icon::FileRust)
94 .current(false)
95 .fs_status(FileSystemStatus::Deleted),
96 Tab::new("static_data.rs")
97 .title("static_data.rs".to_string())
98 .icon(Icon::FileRust)
99 .current(true)
100 .git_status(GitStatus::Modified),
101 ]
102}
103
104pub fn static_tabs_3<S: 'static + Send + Sync + Clone>() -> Vec<Tab<S>> {
105 vec![Tab::new("static_tabs_3")
106 .git_status(GitStatus::Created)
107 .current(true)]
108}
109
110pub fn static_players() -> Vec<Player> {
111 vec![
112 Player::new(
113 0,
114 "https://avatars.githubusercontent.com/u/1714999?v=4".into(),
115 "nathansobo".into(),
116 ),
117 Player::new(
118 1,
119 "https://avatars.githubusercontent.com/u/326587?v=4".into(),
120 "maxbrunsfeld".into(),
121 ),
122 Player::new(
123 2,
124 "https://avatars.githubusercontent.com/u/482957?v=4".into(),
125 "as-cii".into(),
126 ),
127 Player::new(
128 3,
129 "https://avatars.githubusercontent.com/u/1714999?v=4".into(),
130 "iamnbutler".into(),
131 ),
132 Player::new(
133 4,
134 "https://avatars.githubusercontent.com/u/1486634?v=4".into(),
135 "maxdeviant".into(),
136 ),
137 ]
138}
139
140#[derive(Debug)]
141pub struct PlayerData {
142 pub url: String,
143 pub name: String,
144}
145
146pub fn static_player_data() -> Vec<PlayerData> {
147 vec![
148 PlayerData {
149 url: "https://avatars.githubusercontent.com/u/1714999?v=4".into(),
150 name: "iamnbutler".into(),
151 },
152 PlayerData {
153 url: "https://avatars.githubusercontent.com/u/326587?v=4".into(),
154 name: "maxbrunsfeld".into(),
155 },
156 PlayerData {
157 url: "https://avatars.githubusercontent.com/u/482957?v=4".into(),
158 name: "as-cii".into(),
159 },
160 PlayerData {
161 url: "https://avatars.githubusercontent.com/u/1789?v=4".into(),
162 name: "nathansobo".into(),
163 },
164 PlayerData {
165 url: "https://avatars.githubusercontent.com/u/1486634?v=4".into(),
166 name: "ForLoveOfCats".into(),
167 },
168 PlayerData {
169 url: "https://avatars.githubusercontent.com/u/2690773?v=4".into(),
170 name: "SomeoneToIgnore".into(),
171 },
172 PlayerData {
173 url: "https://avatars.githubusercontent.com/u/19867440?v=4".into(),
174 name: "JosephTLyons".into(),
175 },
176 PlayerData {
177 url: "https://avatars.githubusercontent.com/u/24362066?v=4".into(),
178 name: "osiewicz".into(),
179 },
180 PlayerData {
181 url: "https://avatars.githubusercontent.com/u/22121886?v=4".into(),
182 name: "KCaverly".into(),
183 },
184 PlayerData {
185 url: "https://avatars.githubusercontent.com/u/1486634?v=4".into(),
186 name: "maxdeviant".into(),
187 },
188 ]
189}
190
191pub fn create_static_players(player_data: Vec<PlayerData>) -> Vec<Player> {
192 let mut players = Vec::new();
193 for data in player_data {
194 players.push(Player::new(players.len(), data.url, data.name));
195 }
196 players
197}
198
199pub fn static_player_1(data: &Vec<PlayerData>) -> Player {
200 Player::new(1, data[0].url.clone(), data[0].name.clone())
201}
202
203pub fn static_player_2(data: &Vec<PlayerData>) -> Player {
204 Player::new(2, data[1].url.clone(), data[1].name.clone())
205}
206
207pub fn static_player_3(data: &Vec<PlayerData>) -> Player {
208 Player::new(3, data[2].url.clone(), data[2].name.clone())
209}
210
211pub fn static_player_4(data: &Vec<PlayerData>) -> Player {
212 Player::new(4, data[3].url.clone(), data[3].name.clone())
213}
214
215pub fn static_player_5(data: &Vec<PlayerData>) -> Player {
216 Player::new(5, data[4].url.clone(), data[4].name.clone())
217}
218
219pub fn static_player_6(data: &Vec<PlayerData>) -> Player {
220 Player::new(6, data[5].url.clone(), data[5].name.clone())
221}
222
223pub fn static_player_7(data: &Vec<PlayerData>) -> Player {
224 Player::new(7, data[6].url.clone(), data[6].name.clone())
225}
226
227pub fn static_player_8(data: &Vec<PlayerData>) -> Player {
228 Player::new(8, data[7].url.clone(), data[7].name.clone())
229}
230
231pub fn static_player_9(data: &Vec<PlayerData>) -> Player {
232 Player::new(9, data[8].url.clone(), data[8].name.clone())
233}
234
235pub fn static_player_10(data: &Vec<PlayerData>) -> Player {
236 Player::new(10, data[9].url.clone(), data[9].name.clone())
237}
238
239pub fn static_livestream() -> Livestream {
240 Livestream {
241 players: random_players_with_call_status(7),
242 channel: Some("gpui2-ui".to_string()),
243 }
244}
245
246pub fn populate_player_call_status(
247 player: Player,
248 followers: Option<Vec<Player>>,
249) -> PlayerCallStatus {
250 let mut rng = rand::thread_rng();
251 let in_current_project: bool = rng.gen();
252 let disconnected: bool = rng.gen();
253 let voice_activity: f32 = rng.gen();
254 let mic_status = if rng.gen_bool(0.5) {
255 MicStatus::Muted
256 } else {
257 MicStatus::Unmuted
258 };
259 let video_status = if rng.gen_bool(0.5) {
260 VideoStatus::On
261 } else {
262 VideoStatus::Off
263 };
264 let screen_share_status = if rng.gen_bool(0.5) {
265 ScreenShareStatus::Shared
266 } else {
267 ScreenShareStatus::NotShared
268 };
269 PlayerCallStatus {
270 mic_status,
271 voice_activity,
272 video_status,
273 screen_share_status,
274 in_current_project,
275 disconnected,
276 following: None,
277 followers,
278 }
279}
280
281pub fn random_players_with_call_status(number_of_players: usize) -> Vec<PlayerWithCallStatus> {
282 let players = create_static_players(static_player_data());
283 let mut player_status = vec![];
284 for i in 0..number_of_players {
285 let followers = if i == 0 {
286 Some(vec![
287 players[1].clone(),
288 players[3].clone(),
289 players[5].clone(),
290 players[6].clone(),
291 ])
292 } else if i == 1 {
293 Some(vec![players[2].clone(), players[6].clone()])
294 } else {
295 None
296 };
297 let call_status = populate_player_call_status(players[i].clone(), followers);
298 player_status.push(PlayerWithCallStatus::new(players[i].clone(), call_status));
299 }
300 player_status
301}
302
303pub fn static_players_with_call_status() -> Vec<PlayerWithCallStatus> {
304 let players = static_players();
305 let mut player_0_status = PlayerCallStatus::new();
306 let player_1_status = PlayerCallStatus::new();
307 let player_2_status = PlayerCallStatus::new();
308 let mut player_3_status = PlayerCallStatus::new();
309 let mut player_4_status = PlayerCallStatus::new();
310
311 player_0_status.screen_share_status = ScreenShareStatus::Shared;
312 player_0_status.followers = Some(vec![players[1].clone(), players[3].clone()]);
313
314 player_3_status.voice_activity = 0.5;
315 player_4_status.mic_status = MicStatus::Muted;
316 player_4_status.in_current_project = false;
317
318 vec![
319 PlayerWithCallStatus::new(players[0].clone(), player_0_status),
320 PlayerWithCallStatus::new(players[1].clone(), player_1_status),
321 PlayerWithCallStatus::new(players[2].clone(), player_2_status),
322 PlayerWithCallStatus::new(players[3].clone(), player_3_status),
323 PlayerWithCallStatus::new(players[4].clone(), player_4_status),
324 ]
325}
326
327pub fn static_project_panel_project_items<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
328 vec![
329 ListEntry::new(Label::new("zed"))
330 .set_left_icon(Icon::FolderOpen.into())
331 .set_indent_level(0)
332 .set_toggle(ToggleState::Toggled),
333 ListEntry::new(Label::new(".cargo"))
334 .set_left_icon(Icon::Folder.into())
335 .set_indent_level(1),
336 ListEntry::new(Label::new(".config"))
337 .set_left_icon(Icon::Folder.into())
338 .set_indent_level(1),
339 ListEntry::new(Label::new(".git").color(LabelColor::Hidden))
340 .set_left_icon(Icon::Folder.into())
341 .set_indent_level(1),
342 ListEntry::new(Label::new(".cargo"))
343 .set_left_icon(Icon::Folder.into())
344 .set_indent_level(1),
345 ListEntry::new(Label::new(".idea").color(LabelColor::Hidden))
346 .set_left_icon(Icon::Folder.into())
347 .set_indent_level(1),
348 ListEntry::new(Label::new("assets"))
349 .set_left_icon(Icon::Folder.into())
350 .set_indent_level(1)
351 .set_toggle(ToggleState::Toggled),
352 ListEntry::new(Label::new("cargo-target").color(LabelColor::Hidden))
353 .set_left_icon(Icon::Folder.into())
354 .set_indent_level(1),
355 ListEntry::new(Label::new("crates"))
356 .set_left_icon(Icon::FolderOpen.into())
357 .set_indent_level(1)
358 .set_toggle(ToggleState::Toggled),
359 ListEntry::new(Label::new("activity_indicator"))
360 .set_left_icon(Icon::Folder.into())
361 .set_indent_level(2),
362 ListEntry::new(Label::new("ai"))
363 .set_left_icon(Icon::Folder.into())
364 .set_indent_level(2),
365 ListEntry::new(Label::new("audio"))
366 .set_left_icon(Icon::Folder.into())
367 .set_indent_level(2),
368 ListEntry::new(Label::new("auto_update"))
369 .set_left_icon(Icon::Folder.into())
370 .set_indent_level(2),
371 ListEntry::new(Label::new("breadcrumbs"))
372 .set_left_icon(Icon::Folder.into())
373 .set_indent_level(2),
374 ListEntry::new(Label::new("call"))
375 .set_left_icon(Icon::Folder.into())
376 .set_indent_level(2),
377 ListEntry::new(Label::new("sqlez").color(LabelColor::Modified))
378 .set_left_icon(Icon::Folder.into())
379 .set_indent_level(2)
380 .set_toggle(ToggleState::NotToggled),
381 ListEntry::new(Label::new("gpui2"))
382 .set_left_icon(Icon::FolderOpen.into())
383 .set_indent_level(2)
384 .set_toggle(ToggleState::Toggled),
385 ListEntry::new(Label::new("src"))
386 .set_left_icon(Icon::FolderOpen.into())
387 .set_indent_level(3)
388 .set_toggle(ToggleState::Toggled),
389 ListEntry::new(Label::new("derive_element.rs"))
390 .set_left_icon(Icon::FileRust.into())
391 .set_indent_level(4),
392 ListEntry::new(Label::new("storybook").color(LabelColor::Modified))
393 .set_left_icon(Icon::FolderOpen.into())
394 .set_indent_level(1)
395 .set_toggle(ToggleState::Toggled),
396 ListEntry::new(Label::new("docs").color(LabelColor::Default))
397 .set_left_icon(Icon::Folder.into())
398 .set_indent_level(2)
399 .set_toggle(ToggleState::Toggled),
400 ListEntry::new(Label::new("src").color(LabelColor::Modified))
401 .set_left_icon(Icon::FolderOpen.into())
402 .set_indent_level(3)
403 .set_toggle(ToggleState::Toggled),
404 ListEntry::new(Label::new("ui").color(LabelColor::Modified))
405 .set_left_icon(Icon::FolderOpen.into())
406 .set_indent_level(4)
407 .set_toggle(ToggleState::Toggled),
408 ListEntry::new(Label::new("component").color(LabelColor::Created))
409 .set_left_icon(Icon::FolderOpen.into())
410 .set_indent_level(5)
411 .set_toggle(ToggleState::Toggled),
412 ListEntry::new(Label::new("facepile.rs").color(LabelColor::Default))
413 .set_left_icon(Icon::FileRust.into())
414 .set_indent_level(6),
415 ListEntry::new(Label::new("follow_group.rs").color(LabelColor::Default))
416 .set_left_icon(Icon::FileRust.into())
417 .set_indent_level(6),
418 ListEntry::new(Label::new("list_item.rs").color(LabelColor::Created))
419 .set_left_icon(Icon::FileRust.into())
420 .set_indent_level(6),
421 ListEntry::new(Label::new("tab.rs").color(LabelColor::Default))
422 .set_left_icon(Icon::FileRust.into())
423 .set_indent_level(6),
424 ListEntry::new(Label::new("target").color(LabelColor::Hidden))
425 .set_left_icon(Icon::Folder.into())
426 .set_indent_level(1),
427 ListEntry::new(Label::new(".dockerignore"))
428 .set_left_icon(Icon::FileGeneric.into())
429 .set_indent_level(1),
430 ListEntry::new(Label::new(".DS_Store").color(LabelColor::Hidden))
431 .set_left_icon(Icon::FileGeneric.into())
432 .set_indent_level(1),
433 ListEntry::new(Label::new("Cargo.lock"))
434 .set_left_icon(Icon::FileLock.into())
435 .set_indent_level(1),
436 ListEntry::new(Label::new("Cargo.toml"))
437 .set_left_icon(Icon::FileToml.into())
438 .set_indent_level(1),
439 ListEntry::new(Label::new("Dockerfile"))
440 .set_left_icon(Icon::FileGeneric.into())
441 .set_indent_level(1),
442 ListEntry::new(Label::new("Procfile"))
443 .set_left_icon(Icon::FileGeneric.into())
444 .set_indent_level(1),
445 ListEntry::new(Label::new("README.md"))
446 .set_left_icon(Icon::FileDoc.into())
447 .set_indent_level(1),
448 ]
449 .into_iter()
450 .map(From::from)
451 .collect()
452}
453
454pub fn static_project_panel_single_items<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
455 vec![
456 ListEntry::new(Label::new("todo.md"))
457 .set_left_icon(Icon::FileDoc.into())
458 .set_indent_level(0),
459 ListEntry::new(Label::new("README.md"))
460 .set_left_icon(Icon::FileDoc.into())
461 .set_indent_level(0),
462 ListEntry::new(Label::new("config.json"))
463 .set_left_icon(Icon::FileGeneric.into())
464 .set_indent_level(0),
465 ]
466 .into_iter()
467 .map(From::from)
468 .collect()
469}
470
471pub fn static_collab_panel_current_call<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
472 vec![
473 ListEntry::new(Label::new("as-cii")).set_left_avatar("http://github.com/as-cii.png?s=50"),
474 ListEntry::new(Label::new("nathansobo"))
475 .set_left_avatar("http://github.com/nathansobo.png?s=50"),
476 ListEntry::new(Label::new("maxbrunsfeld"))
477 .set_left_avatar("http://github.com/maxbrunsfeld.png?s=50"),
478 ]
479 .into_iter()
480 .map(From::from)
481 .collect()
482}
483
484pub fn static_collab_panel_channels<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
485 vec![
486 ListEntry::new(Label::new("zed"))
487 .set_left_icon(Icon::Hash.into())
488 .set_size(ListEntrySize::Medium)
489 .set_indent_level(0),
490 ListEntry::new(Label::new("community"))
491 .set_left_icon(Icon::Hash.into())
492 .set_size(ListEntrySize::Medium)
493 .set_indent_level(1),
494 ListEntry::new(Label::new("dashboards"))
495 .set_left_icon(Icon::Hash.into())
496 .set_size(ListEntrySize::Medium)
497 .set_indent_level(2),
498 ListEntry::new(Label::new("feedback"))
499 .set_left_icon(Icon::Hash.into())
500 .set_size(ListEntrySize::Medium)
501 .set_indent_level(2),
502 ListEntry::new(Label::new("teams-in-channels-alpha"))
503 .set_left_icon(Icon::Hash.into())
504 .set_size(ListEntrySize::Medium)
505 .set_indent_level(2),
506 ListEntry::new(Label::new("current-projects"))
507 .set_left_icon(Icon::Hash.into())
508 .set_size(ListEntrySize::Medium)
509 .set_indent_level(1),
510 ListEntry::new(Label::new("codegen"))
511 .set_left_icon(Icon::Hash.into())
512 .set_size(ListEntrySize::Medium)
513 .set_indent_level(2),
514 ListEntry::new(Label::new("gpui2"))
515 .set_left_icon(Icon::Hash.into())
516 .set_size(ListEntrySize::Medium)
517 .set_indent_level(2),
518 ListEntry::new(Label::new("livestreaming"))
519 .set_left_icon(Icon::Hash.into())
520 .set_size(ListEntrySize::Medium)
521 .set_indent_level(2),
522 ListEntry::new(Label::new("open-source"))
523 .set_left_icon(Icon::Hash.into())
524 .set_size(ListEntrySize::Medium)
525 .set_indent_level(2),
526 ListEntry::new(Label::new("replace"))
527 .set_left_icon(Icon::Hash.into())
528 .set_size(ListEntrySize::Medium)
529 .set_indent_level(2),
530 ListEntry::new(Label::new("semantic-index"))
531 .set_left_icon(Icon::Hash.into())
532 .set_size(ListEntrySize::Medium)
533 .set_indent_level(2),
534 ListEntry::new(Label::new("vim"))
535 .set_left_icon(Icon::Hash.into())
536 .set_size(ListEntrySize::Medium)
537 .set_indent_level(2),
538 ListEntry::new(Label::new("web-tech"))
539 .set_left_icon(Icon::Hash.into())
540 .set_size(ListEntrySize::Medium)
541 .set_indent_level(2),
542 ]
543 .into_iter()
544 .map(From::from)
545 .collect()
546}
547
548pub fn example_editor_actions<S: 'static + Send + Sync + Clone>() -> Vec<PaletteItem<S>> {
549 vec![
550 PaletteItem::new("New File").keybinding(Keybinding::new(
551 "N".to_string(),
552 ModifierKeys::new().command(true),
553 )),
554 PaletteItem::new("Open File").keybinding(Keybinding::new(
555 "O".to_string(),
556 ModifierKeys::new().command(true),
557 )),
558 PaletteItem::new("Save File").keybinding(Keybinding::new(
559 "S".to_string(),
560 ModifierKeys::new().command(true),
561 )),
562 PaletteItem::new("Cut").keybinding(Keybinding::new(
563 "X".to_string(),
564 ModifierKeys::new().command(true),
565 )),
566 PaletteItem::new("Copy").keybinding(Keybinding::new(
567 "C".to_string(),
568 ModifierKeys::new().command(true),
569 )),
570 PaletteItem::new("Paste").keybinding(Keybinding::new(
571 "V".to_string(),
572 ModifierKeys::new().command(true),
573 )),
574 PaletteItem::new("Undo").keybinding(Keybinding::new(
575 "Z".to_string(),
576 ModifierKeys::new().command(true),
577 )),
578 PaletteItem::new("Redo").keybinding(Keybinding::new(
579 "Z".to_string(),
580 ModifierKeys::new().command(true).shift(true),
581 )),
582 PaletteItem::new("Find").keybinding(Keybinding::new(
583 "F".to_string(),
584 ModifierKeys::new().command(true),
585 )),
586 PaletteItem::new("Replace").keybinding(Keybinding::new(
587 "R".to_string(),
588 ModifierKeys::new().command(true),
589 )),
590 PaletteItem::new("Jump to Line"),
591 PaletteItem::new("Select All"),
592 PaletteItem::new("Deselect All"),
593 PaletteItem::new("Switch Document"),
594 PaletteItem::new("Insert Line Below"),
595 PaletteItem::new("Insert Line Above"),
596 PaletteItem::new("Move Line Up"),
597 PaletteItem::new("Move Line Down"),
598 PaletteItem::new("Toggle Comment"),
599 PaletteItem::new("Delete Line"),
600 ]
601}
602
603pub fn empty_editor_example(cx: &mut WindowContext) -> EditorPane {
604 EditorPane::new(
605 cx,
606 static_tabs_example(),
607 PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
608 vec![],
609 empty_buffer_example(),
610 )
611}
612
613pub fn empty_buffer_example<S: 'static + Send + Sync + Clone>() -> Buffer<S> {
614 Buffer::new().set_rows(Some(BufferRows::default()))
615}
616
617pub fn hello_world_rust_editor_example(cx: &mut WindowContext) -> EditorPane {
618 let color = ThemeColor::new(cx);
619
620 EditorPane::new(
621 cx,
622 static_tabs_example(),
623 PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
624 vec![Symbol(vec![
625 HighlightedText {
626 text: "fn ".to_string(),
627 color: color.syntax.keyword,
628 },
629 HighlightedText {
630 text: "main".to_string(),
631 color: color.syntax.function,
632 },
633 ])],
634 hello_world_rust_buffer_example(&color),
635 )
636}
637
638pub fn hello_world_rust_buffer_example<S: 'static + Send + Sync + Clone>(
639 color: &ThemeColor,
640) -> Buffer<S> {
641 Buffer::new()
642 .set_title("hello_world.rs".to_string())
643 .set_path("src/hello_world.rs".to_string())
644 .set_language("rust".to_string())
645 .set_rows(Some(BufferRows {
646 show_line_numbers: true,
647 rows: hello_world_rust_buffer_rows(color),
648 }))
649}
650
651pub fn hello_world_rust_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
652 let show_line_number = true;
653
654 vec![
655 BufferRow {
656 line_number: 1,
657 code_action: false,
658 current: true,
659 line: Some(HighlightedLine {
660 highlighted_texts: vec![
661 HighlightedText {
662 text: "fn ".to_string(),
663 color: color.syntax.keyword,
664 },
665 HighlightedText {
666 text: "main".to_string(),
667 color: color.syntax.function,
668 },
669 HighlightedText {
670 text: "() {".to_string(),
671 color: color.text,
672 },
673 ],
674 }),
675 cursors: None,
676 status: GitStatus::None,
677 show_line_number,
678 },
679 BufferRow {
680 line_number: 2,
681 code_action: false,
682 current: false,
683 line: Some(HighlightedLine {
684 highlighted_texts: vec![HighlightedText {
685 text: " // Statements here are executed when the compiled binary is called."
686 .to_string(),
687 color: color.syntax.comment,
688 }],
689 }),
690 cursors: None,
691 status: GitStatus::None,
692 show_line_number,
693 },
694 BufferRow {
695 line_number: 3,
696 code_action: false,
697 current: false,
698 line: None,
699 cursors: None,
700 status: GitStatus::None,
701 show_line_number,
702 },
703 BufferRow {
704 line_number: 4,
705 code_action: false,
706 current: false,
707 line: Some(HighlightedLine {
708 highlighted_texts: vec![HighlightedText {
709 text: " // Print text to the console.".to_string(),
710 color: color.syntax.comment,
711 }],
712 }),
713 cursors: None,
714 status: GitStatus::None,
715 show_line_number,
716 },
717 BufferRow {
718 line_number: 5,
719 code_action: false,
720 current: false,
721 line: Some(HighlightedLine {
722 highlighted_texts: vec![
723 HighlightedText {
724 text: " println!(".to_string(),
725 color: color.text,
726 },
727 HighlightedText {
728 text: "\"Hello, world!\"".to_string(),
729 color: color.syntax.string,
730 },
731 HighlightedText {
732 text: ");".to_string(),
733 color: color.text,
734 },
735 ],
736 }),
737 cursors: None,
738 status: GitStatus::None,
739 show_line_number,
740 },
741 BufferRow {
742 line_number: 6,
743 code_action: false,
744 current: false,
745 line: Some(HighlightedLine {
746 highlighted_texts: vec![HighlightedText {
747 text: "}".to_string(),
748 color: color.text,
749 }],
750 }),
751 cursors: None,
752 status: GitStatus::None,
753 show_line_number,
754 },
755 ]
756}
757
758pub fn hello_world_rust_editor_with_status_example(cx: &mut WindowContext) -> EditorPane {
759 let color = ThemeColor::new(cx);
760
761 EditorPane::new(
762 cx,
763 static_tabs_example(),
764 PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
765 vec![Symbol(vec![
766 HighlightedText {
767 text: "fn ".to_string(),
768 color: color.syntax.keyword,
769 },
770 HighlightedText {
771 text: "main".to_string(),
772 color: color.syntax.function,
773 },
774 ])],
775 hello_world_rust_buffer_with_status_example(&color),
776 )
777}
778
779pub fn hello_world_rust_buffer_with_status_example<S: 'static + Send + Sync + Clone>(
780 color: &ThemeColor,
781) -> Buffer<S> {
782 Buffer::new()
783 .set_title("hello_world.rs".to_string())
784 .set_path("src/hello_world.rs".to_string())
785 .set_language("rust".to_string())
786 .set_rows(Some(BufferRows {
787 show_line_numbers: true,
788 rows: hello_world_rust_with_status_buffer_rows(color),
789 }))
790}
791
792pub fn hello_world_rust_with_status_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
793 let show_line_number = true;
794
795 vec![
796 BufferRow {
797 line_number: 1,
798 code_action: false,
799 current: true,
800 line: Some(HighlightedLine {
801 highlighted_texts: vec![
802 HighlightedText {
803 text: "fn ".to_string(),
804 color: color.syntax.keyword,
805 },
806 HighlightedText {
807 text: "main".to_string(),
808 color: color.syntax.function,
809 },
810 HighlightedText {
811 text: "() {".to_string(),
812 color: color.text,
813 },
814 ],
815 }),
816 cursors: None,
817 status: GitStatus::None,
818 show_line_number,
819 },
820 BufferRow {
821 line_number: 2,
822 code_action: false,
823 current: false,
824 line: Some(HighlightedLine {
825 highlighted_texts: vec![HighlightedText {
826 text: "// Statements here are executed when the compiled binary is called."
827 .to_string(),
828 color: color.syntax.comment,
829 }],
830 }),
831 cursors: None,
832 status: GitStatus::Modified,
833 show_line_number,
834 },
835 BufferRow {
836 line_number: 3,
837 code_action: false,
838 current: false,
839 line: None,
840 cursors: None,
841 status: GitStatus::None,
842 show_line_number,
843 },
844 BufferRow {
845 line_number: 4,
846 code_action: false,
847 current: false,
848 line: Some(HighlightedLine {
849 highlighted_texts: vec![HighlightedText {
850 text: " // Print text to the console.".to_string(),
851 color: color.syntax.comment,
852 }],
853 }),
854 cursors: None,
855 status: GitStatus::None,
856 show_line_number,
857 },
858 BufferRow {
859 line_number: 5,
860 code_action: false,
861 current: false,
862 line: Some(HighlightedLine {
863 highlighted_texts: vec![
864 HighlightedText {
865 text: " println!(".to_string(),
866 color: color.text,
867 },
868 HighlightedText {
869 text: "\"Hello, world!\"".to_string(),
870 color: color.syntax.string,
871 },
872 HighlightedText {
873 text: ");".to_string(),
874 color: color.text,
875 },
876 ],
877 }),
878 cursors: None,
879 status: GitStatus::None,
880 show_line_number,
881 },
882 BufferRow {
883 line_number: 6,
884 code_action: false,
885 current: false,
886 line: Some(HighlightedLine {
887 highlighted_texts: vec![HighlightedText {
888 text: "}".to_string(),
889 color: color.text,
890 }],
891 }),
892 cursors: None,
893 status: GitStatus::None,
894 show_line_number,
895 },
896 BufferRow {
897 line_number: 7,
898 code_action: false,
899 current: false,
900 line: Some(HighlightedLine {
901 highlighted_texts: vec![HighlightedText {
902 text: "".to_string(),
903 color: color.text,
904 }],
905 }),
906 cursors: None,
907 status: GitStatus::Created,
908 show_line_number,
909 },
910 BufferRow {
911 line_number: 8,
912 code_action: false,
913 current: false,
914 line: Some(HighlightedLine {
915 highlighted_texts: vec![HighlightedText {
916 text: "// Marshall and Nate were here".to_string(),
917 color: color.syntax.comment,
918 }],
919 }),
920 cursors: None,
921 status: GitStatus::Created,
922 show_line_number,
923 },
924 ]
925}
926
927pub fn terminal_buffer<S: 'static + Send + Sync + Clone>(color: &ThemeColor) -> Buffer<S> {
928 Buffer::new()
929 .set_title("zed — fish".to_string())
930 .set_rows(Some(BufferRows {
931 show_line_numbers: false,
932 rows: terminal_buffer_rows(color),
933 }))
934}
935
936pub fn terminal_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
937 let show_line_number = false;
938
939 vec![
940 BufferRow {
941 line_number: 1,
942 code_action: false,
943 current: false,
944 line: Some(HighlightedLine {
945 highlighted_texts: vec![
946 HighlightedText {
947 text: "maxdeviant ".to_string(),
948 color: color.syntax.keyword,
949 },
950 HighlightedText {
951 text: "in ".to_string(),
952 color: color.text,
953 },
954 HighlightedText {
955 text: "profaned-capital ".to_string(),
956 color: color.syntax.function,
957 },
958 HighlightedText {
959 text: "in ".to_string(),
960 color: color.text,
961 },
962 HighlightedText {
963 text: "~/p/zed ".to_string(),
964 color: color.syntax.function,
965 },
966 HighlightedText {
967 text: "on ".to_string(),
968 color: color.text,
969 },
970 HighlightedText {
971 text: " gpui2-ui ".to_string(),
972 color: color.syntax.keyword,
973 },
974 ],
975 }),
976 cursors: None,
977 status: GitStatus::None,
978 show_line_number,
979 },
980 BufferRow {
981 line_number: 2,
982 code_action: false,
983 current: false,
984 line: Some(HighlightedLine {
985 highlighted_texts: vec![HighlightedText {
986 text: "λ ".to_string(),
987 color: color.syntax.string,
988 }],
989 }),
990 cursors: None,
991 status: GitStatus::None,
992 show_line_number,
993 },
994 ]
995}