1use std::path::PathBuf;
2use std::str::FromStr;
3
4use gpui2::ViewContext;
5use rand::Rng;
6use theme2::Theme;
7
8use crate::{
9 theme, 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 let theme = theme(cx);
647
648 EditorPane::new(
649 cx,
650 static_tabs_example(),
651 PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
652 vec![Symbol(vec![
653 HighlightedText {
654 text: "fn ".to_string(),
655 color: theme.syntax.color("keyword"),
656 },
657 HighlightedText {
658 text: "main".to_string(),
659 color: theme.syntax.color("function"),
660 },
661 ])],
662 hello_world_rust_buffer_example(&theme),
663 )
664}
665
666pub fn hello_world_rust_buffer_example(theme: &Theme) -> Buffer {
667 Buffer::new("hello-world-rust-buffer")
668 .set_title("hello_world.rs".to_string())
669 .set_path("src/hello_world.rs".to_string())
670 .set_language("rust".to_string())
671 .set_rows(Some(BufferRows {
672 show_line_numbers: true,
673 rows: hello_world_rust_buffer_rows(theme),
674 }))
675}
676
677pub fn hello_world_rust_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
678 let show_line_number = true;
679
680 vec![
681 BufferRow {
682 line_number: 1,
683 code_action: false,
684 current: true,
685 line: Some(HighlightedLine {
686 highlighted_texts: vec![
687 HighlightedText {
688 text: "fn ".to_string(),
689 color: theme.syntax.color("keyword"),
690 },
691 HighlightedText {
692 text: "main".to_string(),
693 color: theme.syntax.color("function"),
694 },
695 HighlightedText {
696 text: "() {".to_string(),
697 color: theme.text,
698 },
699 ],
700 }),
701 cursors: None,
702 status: GitStatus::None,
703 show_line_number,
704 },
705 BufferRow {
706 line_number: 2,
707 code_action: false,
708 current: false,
709 line: Some(HighlightedLine {
710 highlighted_texts: vec![HighlightedText {
711 text: " // Statements here are executed when the compiled binary is called."
712 .to_string(),
713 color: theme.syntax.color("comment"),
714 }],
715 }),
716 cursors: None,
717 status: GitStatus::None,
718 show_line_number,
719 },
720 BufferRow {
721 line_number: 3,
722 code_action: false,
723 current: false,
724 line: None,
725 cursors: None,
726 status: GitStatus::None,
727 show_line_number,
728 },
729 BufferRow {
730 line_number: 4,
731 code_action: false,
732 current: false,
733 line: Some(HighlightedLine {
734 highlighted_texts: vec![HighlightedText {
735 text: " // Print text to the console.".to_string(),
736 color: theme.syntax.color("comment"),
737 }],
738 }),
739 cursors: None,
740 status: GitStatus::None,
741 show_line_number,
742 },
743 BufferRow {
744 line_number: 5,
745 code_action: false,
746 current: false,
747 line: Some(HighlightedLine {
748 highlighted_texts: vec![
749 HighlightedText {
750 text: " println!(".to_string(),
751 color: theme.text,
752 },
753 HighlightedText {
754 text: "\"Hello, world!\"".to_string(),
755 color: theme.syntax.color("string"),
756 },
757 HighlightedText {
758 text: ");".to_string(),
759 color: theme.text,
760 },
761 ],
762 }),
763 cursors: None,
764 status: GitStatus::None,
765 show_line_number,
766 },
767 BufferRow {
768 line_number: 6,
769 code_action: false,
770 current: false,
771 line: Some(HighlightedLine {
772 highlighted_texts: vec![HighlightedText {
773 text: "}".to_string(),
774 color: theme.text,
775 }],
776 }),
777 cursors: None,
778 status: GitStatus::None,
779 show_line_number,
780 },
781 ]
782}
783
784pub fn hello_world_rust_editor_with_status_example(cx: &mut ViewContext<EditorPane>) -> EditorPane {
785 let theme = theme(cx);
786
787 EditorPane::new(
788 cx,
789 static_tabs_example(),
790 PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
791 vec![Symbol(vec![
792 HighlightedText {
793 text: "fn ".to_string(),
794 color: theme.syntax.color("keyword"),
795 },
796 HighlightedText {
797 text: "main".to_string(),
798 color: theme.syntax.color("function"),
799 },
800 ])],
801 hello_world_rust_buffer_with_status_example(&theme),
802 )
803}
804
805pub fn hello_world_rust_buffer_with_status_example(theme: &Theme) -> Buffer {
806 Buffer::new("hello-world-rust-buffer-with-status")
807 .set_title("hello_world.rs".to_string())
808 .set_path("src/hello_world.rs".to_string())
809 .set_language("rust".to_string())
810 .set_rows(Some(BufferRows {
811 show_line_numbers: true,
812 rows: hello_world_rust_with_status_buffer_rows(theme),
813 }))
814}
815
816pub fn hello_world_rust_with_status_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
817 let show_line_number = true;
818
819 vec![
820 BufferRow {
821 line_number: 1,
822 code_action: false,
823 current: true,
824 line: Some(HighlightedLine {
825 highlighted_texts: vec![
826 HighlightedText {
827 text: "fn ".to_string(),
828 color: theme.syntax.color("keyword"),
829 },
830 HighlightedText {
831 text: "main".to_string(),
832 color: theme.syntax.color("function"),
833 },
834 HighlightedText {
835 text: "() {".to_string(),
836 color: theme.text,
837 },
838 ],
839 }),
840 cursors: None,
841 status: GitStatus::None,
842 show_line_number,
843 },
844 BufferRow {
845 line_number: 2,
846 code_action: false,
847 current: false,
848 line: Some(HighlightedLine {
849 highlighted_texts: vec![HighlightedText {
850 text: "// Statements here are executed when the compiled binary is called."
851 .to_string(),
852 color: theme.syntax.color("comment"),
853 }],
854 }),
855 cursors: None,
856 status: GitStatus::Modified,
857 show_line_number,
858 },
859 BufferRow {
860 line_number: 3,
861 code_action: false,
862 current: false,
863 line: None,
864 cursors: None,
865 status: GitStatus::None,
866 show_line_number,
867 },
868 BufferRow {
869 line_number: 4,
870 code_action: false,
871 current: false,
872 line: Some(HighlightedLine {
873 highlighted_texts: vec![HighlightedText {
874 text: " // Print text to the console.".to_string(),
875 color: theme.syntax.color("comment"),
876 }],
877 }),
878 cursors: None,
879 status: GitStatus::None,
880 show_line_number,
881 },
882 BufferRow {
883 line_number: 5,
884 code_action: false,
885 current: false,
886 line: Some(HighlightedLine {
887 highlighted_texts: vec![
888 HighlightedText {
889 text: " println!(".to_string(),
890 color: theme.text,
891 },
892 HighlightedText {
893 text: "\"Hello, world!\"".to_string(),
894 color: theme.syntax.color("string"),
895 },
896 HighlightedText {
897 text: ");".to_string(),
898 color: theme.text,
899 },
900 ],
901 }),
902 cursors: None,
903 status: GitStatus::None,
904 show_line_number,
905 },
906 BufferRow {
907 line_number: 6,
908 code_action: false,
909 current: false,
910 line: Some(HighlightedLine {
911 highlighted_texts: vec![HighlightedText {
912 text: "}".to_string(),
913 color: theme.text,
914 }],
915 }),
916 cursors: None,
917 status: GitStatus::None,
918 show_line_number,
919 },
920 BufferRow {
921 line_number: 7,
922 code_action: false,
923 current: false,
924 line: Some(HighlightedLine {
925 highlighted_texts: vec![HighlightedText {
926 text: "".to_string(),
927 color: theme.text,
928 }],
929 }),
930 cursors: None,
931 status: GitStatus::Created,
932 show_line_number,
933 },
934 BufferRow {
935 line_number: 8,
936 code_action: false,
937 current: false,
938 line: Some(HighlightedLine {
939 highlighted_texts: vec![HighlightedText {
940 text: "// Marshall and Nate were here".to_string(),
941 color: theme.syntax.color("comment"),
942 }],
943 }),
944 cursors: None,
945 status: GitStatus::Created,
946 show_line_number,
947 },
948 ]
949}
950
951pub fn terminal_buffer(theme: &Theme) -> Buffer {
952 Buffer::new("terminal")
953 .set_title("zed — fish".to_string())
954 .set_rows(Some(BufferRows {
955 show_line_numbers: false,
956 rows: terminal_buffer_rows(theme),
957 }))
958}
959
960pub fn terminal_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
961 let show_line_number = false;
962
963 vec![
964 BufferRow {
965 line_number: 1,
966 code_action: false,
967 current: false,
968 line: Some(HighlightedLine {
969 highlighted_texts: vec![
970 HighlightedText {
971 text: "maxdeviant ".to_string(),
972 color: theme.syntax.color("keyword"),
973 },
974 HighlightedText {
975 text: "in ".to_string(),
976 color: theme.text,
977 },
978 HighlightedText {
979 text: "profaned-capital ".to_string(),
980 color: theme.syntax.color("function"),
981 },
982 HighlightedText {
983 text: "in ".to_string(),
984 color: theme.text,
985 },
986 HighlightedText {
987 text: "~/p/zed ".to_string(),
988 color: theme.syntax.color("function"),
989 },
990 HighlightedText {
991 text: "on ".to_string(),
992 color: theme.text,
993 },
994 HighlightedText {
995 text: " gpui2-ui ".to_string(),
996 color: theme.syntax.color("keyword"),
997 },
998 ],
999 }),
1000 cursors: None,
1001 status: GitStatus::None,
1002 show_line_number,
1003 },
1004 BufferRow {
1005 line_number: 2,
1006 code_action: false,
1007 current: false,
1008 line: Some(HighlightedLine {
1009 highlighted_texts: vec![HighlightedText {
1010 text: "λ ".to_string(),
1011 color: theme.syntax.color("string"),
1012 }],
1013 }),
1014 cursors: None,
1015 status: GitStatus::None,
1016 show_line_number,
1017 },
1018 ]
1019}