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