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