1use std::path::PathBuf;
2use std::str::FromStr;
3
4use gpui2::WindowContext;
5use rand::Rng;
6
7use crate::{
8 Buffer, BufferRow, BufferRows, Button, EditorPane, FileSystemStatus, GitStatus,
9 HighlightedLine, Icon, Keybinding, Label, LabelColor, ListEntry, ListEntrySize, ListItem,
10 Livestream, MicStatus, ModifierKeys, PaletteItem, Player, PlayerCallStatus,
11 PlayerWithCallStatus, ScreenShareStatus, Symbol, Tab, ThemeColor, ToggleState, VideoStatus,
12};
13use crate::{HighlightedText, ListDetailsEntry};
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_new_notification_items<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
328 vec![
329 ListDetailsEntry::new("maxdeviant invited you to join a stream in #design.")
330 .meta("4 people in stream."),
331 ListDetailsEntry::new("nathansobo accepted your contact request."),
332 ]
333 .into_iter()
334 .map(From::from)
335 .collect()
336}
337
338pub fn static_read_notification_items<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
339 vec![
340 ListDetailsEntry::new("mikaylamaki added you as a contact.").actions(vec![
341 Button::new("Decline"),
342 Button::new("Accept").variant(crate::ButtonVariant::Filled),
343 ]),
344 ListDetailsEntry::new("maxdeviant invited you to a stream in #design.")
345 .seen(true)
346 .meta("This stream has ended."),
347 ListDetailsEntry::new("as-cii accepted your contact request."),
348 ]
349 .into_iter()
350 .map(From::from)
351 .collect()
352}
353
354pub fn static_project_panel_project_items<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
355 vec![
356 ListEntry::new(Label::new("zed"))
357 .left_icon(Icon::FolderOpen.into())
358 .indent_level(0)
359 .toggle(ToggleState::Toggled),
360 ListEntry::new(Label::new(".cargo"))
361 .left_icon(Icon::Folder.into())
362 .indent_level(1),
363 ListEntry::new(Label::new(".config"))
364 .left_icon(Icon::Folder.into())
365 .indent_level(1),
366 ListEntry::new(Label::new(".git").color(LabelColor::Hidden))
367 .left_icon(Icon::Folder.into())
368 .indent_level(1),
369 ListEntry::new(Label::new(".cargo"))
370 .left_icon(Icon::Folder.into())
371 .indent_level(1),
372 ListEntry::new(Label::new(".idea").color(LabelColor::Hidden))
373 .left_icon(Icon::Folder.into())
374 .indent_level(1),
375 ListEntry::new(Label::new("assets"))
376 .left_icon(Icon::Folder.into())
377 .indent_level(1)
378 .toggle(ToggleState::Toggled),
379 ListEntry::new(Label::new("cargo-target").color(LabelColor::Hidden))
380 .left_icon(Icon::Folder.into())
381 .indent_level(1),
382 ListEntry::new(Label::new("crates"))
383 .left_icon(Icon::FolderOpen.into())
384 .indent_level(1)
385 .toggle(ToggleState::Toggled),
386 ListEntry::new(Label::new("activity_indicator"))
387 .left_icon(Icon::Folder.into())
388 .indent_level(2),
389 ListEntry::new(Label::new("ai"))
390 .left_icon(Icon::Folder.into())
391 .indent_level(2),
392 ListEntry::new(Label::new("audio"))
393 .left_icon(Icon::Folder.into())
394 .indent_level(2),
395 ListEntry::new(Label::new("auto_update"))
396 .left_icon(Icon::Folder.into())
397 .indent_level(2),
398 ListEntry::new(Label::new("breadcrumbs"))
399 .left_icon(Icon::Folder.into())
400 .indent_level(2),
401 ListEntry::new(Label::new("call"))
402 .left_icon(Icon::Folder.into())
403 .indent_level(2),
404 ListEntry::new(Label::new("sqlez").color(LabelColor::Modified))
405 .left_icon(Icon::Folder.into())
406 .indent_level(2)
407 .toggle(ToggleState::NotToggled),
408 ListEntry::new(Label::new("gpui2"))
409 .left_icon(Icon::FolderOpen.into())
410 .indent_level(2)
411 .toggle(ToggleState::Toggled),
412 ListEntry::new(Label::new("src"))
413 .left_icon(Icon::FolderOpen.into())
414 .indent_level(3)
415 .toggle(ToggleState::Toggled),
416 ListEntry::new(Label::new("derive_element.rs"))
417 .left_icon(Icon::FileRust.into())
418 .indent_level(4),
419 ListEntry::new(Label::new("storybook").color(LabelColor::Modified))
420 .left_icon(Icon::FolderOpen.into())
421 .indent_level(1)
422 .toggle(ToggleState::Toggled),
423 ListEntry::new(Label::new("docs").color(LabelColor::Default))
424 .left_icon(Icon::Folder.into())
425 .indent_level(2)
426 .toggle(ToggleState::Toggled),
427 ListEntry::new(Label::new("src").color(LabelColor::Modified))
428 .left_icon(Icon::FolderOpen.into())
429 .indent_level(3)
430 .toggle(ToggleState::Toggled),
431 ListEntry::new(Label::new("ui").color(LabelColor::Modified))
432 .left_icon(Icon::FolderOpen.into())
433 .indent_level(4)
434 .toggle(ToggleState::Toggled),
435 ListEntry::new(Label::new("component").color(LabelColor::Created))
436 .left_icon(Icon::FolderOpen.into())
437 .indent_level(5)
438 .toggle(ToggleState::Toggled),
439 ListEntry::new(Label::new("facepile.rs").color(LabelColor::Default))
440 .left_icon(Icon::FileRust.into())
441 .indent_level(6),
442 ListEntry::new(Label::new("follow_group.rs").color(LabelColor::Default))
443 .left_icon(Icon::FileRust.into())
444 .indent_level(6),
445 ListEntry::new(Label::new("list_item.rs").color(LabelColor::Created))
446 .left_icon(Icon::FileRust.into())
447 .indent_level(6),
448 ListEntry::new(Label::new("tab.rs").color(LabelColor::Default))
449 .left_icon(Icon::FileRust.into())
450 .indent_level(6),
451 ListEntry::new(Label::new("target").color(LabelColor::Hidden))
452 .left_icon(Icon::Folder.into())
453 .indent_level(1),
454 ListEntry::new(Label::new(".dockerignore"))
455 .left_icon(Icon::FileGeneric.into())
456 .indent_level(1),
457 ListEntry::new(Label::new(".DS_Store").color(LabelColor::Hidden))
458 .left_icon(Icon::FileGeneric.into())
459 .indent_level(1),
460 ListEntry::new(Label::new("Cargo.lock"))
461 .left_icon(Icon::FileLock.into())
462 .indent_level(1),
463 ListEntry::new(Label::new("Cargo.toml"))
464 .left_icon(Icon::FileToml.into())
465 .indent_level(1),
466 ListEntry::new(Label::new("Dockerfile"))
467 .left_icon(Icon::FileGeneric.into())
468 .indent_level(1),
469 ListEntry::new(Label::new("Procfile"))
470 .left_icon(Icon::FileGeneric.into())
471 .indent_level(1),
472 ListEntry::new(Label::new("README.md"))
473 .left_icon(Icon::FileDoc.into())
474 .indent_level(1),
475 ]
476 .into_iter()
477 .map(From::from)
478 .collect()
479}
480
481pub fn static_project_panel_single_items<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
482 vec![
483 ListEntry::new(Label::new("todo.md"))
484 .left_icon(Icon::FileDoc.into())
485 .indent_level(0),
486 ListEntry::new(Label::new("README.md"))
487 .left_icon(Icon::FileDoc.into())
488 .indent_level(0),
489 ListEntry::new(Label::new("config.json"))
490 .left_icon(Icon::FileGeneric.into())
491 .indent_level(0),
492 ]
493 .into_iter()
494 .map(From::from)
495 .collect()
496}
497
498pub fn static_collab_panel_current_call<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
499 vec![
500 ListEntry::new(Label::new("as-cii")).left_avatar("http://github.com/as-cii.png?s=50"),
501 ListEntry::new(Label::new("nathansobo"))
502 .left_avatar("http://github.com/nathansobo.png?s=50"),
503 ListEntry::new(Label::new("maxbrunsfeld"))
504 .left_avatar("http://github.com/maxbrunsfeld.png?s=50"),
505 ]
506 .into_iter()
507 .map(From::from)
508 .collect()
509}
510
511pub fn static_collab_panel_channels<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
512 vec![
513 ListEntry::new(Label::new("zed"))
514 .left_icon(Icon::Hash.into())
515 .size(ListEntrySize::Medium)
516 .indent_level(0),
517 ListEntry::new(Label::new("community"))
518 .left_icon(Icon::Hash.into())
519 .size(ListEntrySize::Medium)
520 .indent_level(1),
521 ListEntry::new(Label::new("dashboards"))
522 .left_icon(Icon::Hash.into())
523 .size(ListEntrySize::Medium)
524 .indent_level(2),
525 ListEntry::new(Label::new("feedback"))
526 .left_icon(Icon::Hash.into())
527 .size(ListEntrySize::Medium)
528 .indent_level(2),
529 ListEntry::new(Label::new("teams-in-channels-alpha"))
530 .left_icon(Icon::Hash.into())
531 .size(ListEntrySize::Medium)
532 .indent_level(2),
533 ListEntry::new(Label::new("current-projects"))
534 .left_icon(Icon::Hash.into())
535 .size(ListEntrySize::Medium)
536 .indent_level(1),
537 ListEntry::new(Label::new("codegen"))
538 .left_icon(Icon::Hash.into())
539 .size(ListEntrySize::Medium)
540 .indent_level(2),
541 ListEntry::new(Label::new("gpui2"))
542 .left_icon(Icon::Hash.into())
543 .size(ListEntrySize::Medium)
544 .indent_level(2),
545 ListEntry::new(Label::new("livestreaming"))
546 .left_icon(Icon::Hash.into())
547 .size(ListEntrySize::Medium)
548 .indent_level(2),
549 ListEntry::new(Label::new("open-source"))
550 .left_icon(Icon::Hash.into())
551 .size(ListEntrySize::Medium)
552 .indent_level(2),
553 ListEntry::new(Label::new("replace"))
554 .left_icon(Icon::Hash.into())
555 .size(ListEntrySize::Medium)
556 .indent_level(2),
557 ListEntry::new(Label::new("semantic-index"))
558 .left_icon(Icon::Hash.into())
559 .size(ListEntrySize::Medium)
560 .indent_level(2),
561 ListEntry::new(Label::new("vim"))
562 .left_icon(Icon::Hash.into())
563 .size(ListEntrySize::Medium)
564 .indent_level(2),
565 ListEntry::new(Label::new("web-tech"))
566 .left_icon(Icon::Hash.into())
567 .size(ListEntrySize::Medium)
568 .indent_level(2),
569 ]
570 .into_iter()
571 .map(From::from)
572 .collect()
573}
574
575pub fn example_editor_actions<S: 'static + Send + Sync>() -> Vec<PaletteItem<S>> {
576 vec![
577 PaletteItem::new("New File").keybinding(Keybinding::new(
578 "N".to_string(),
579 ModifierKeys::new().command(true),
580 )),
581 PaletteItem::new("Open File").keybinding(Keybinding::new(
582 "O".to_string(),
583 ModifierKeys::new().command(true),
584 )),
585 PaletteItem::new("Save File").keybinding(Keybinding::new(
586 "S".to_string(),
587 ModifierKeys::new().command(true),
588 )),
589 PaletteItem::new("Cut").keybinding(Keybinding::new(
590 "X".to_string(),
591 ModifierKeys::new().command(true),
592 )),
593 PaletteItem::new("Copy").keybinding(Keybinding::new(
594 "C".to_string(),
595 ModifierKeys::new().command(true),
596 )),
597 PaletteItem::new("Paste").keybinding(Keybinding::new(
598 "V".to_string(),
599 ModifierKeys::new().command(true),
600 )),
601 PaletteItem::new("Undo").keybinding(Keybinding::new(
602 "Z".to_string(),
603 ModifierKeys::new().command(true),
604 )),
605 PaletteItem::new("Redo").keybinding(Keybinding::new(
606 "Z".to_string(),
607 ModifierKeys::new().command(true).shift(true),
608 )),
609 PaletteItem::new("Find").keybinding(Keybinding::new(
610 "F".to_string(),
611 ModifierKeys::new().command(true),
612 )),
613 PaletteItem::new("Replace").keybinding(Keybinding::new(
614 "R".to_string(),
615 ModifierKeys::new().command(true),
616 )),
617 PaletteItem::new("Jump to Line"),
618 PaletteItem::new("Select All"),
619 PaletteItem::new("Deselect All"),
620 PaletteItem::new("Switch Document"),
621 PaletteItem::new("Insert Line Below"),
622 PaletteItem::new("Insert Line Above"),
623 PaletteItem::new("Move Line Up"),
624 PaletteItem::new("Move Line Down"),
625 PaletteItem::new("Toggle Comment"),
626 PaletteItem::new("Delete Line"),
627 ]
628}
629
630pub fn empty_editor_example(cx: &mut WindowContext) -> EditorPane {
631 EditorPane::new(
632 cx,
633 static_tabs_example(),
634 PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
635 vec![],
636 empty_buffer_example(),
637 )
638}
639
640pub fn empty_buffer_example<S: 'static + Send + Sync + Clone>() -> Buffer<S> {
641 Buffer::new("empty-buffer").set_rows(Some(BufferRows::default()))
642}
643
644pub fn hello_world_rust_editor_example(cx: &mut WindowContext) -> EditorPane {
645 let color = ThemeColor::new(cx);
646
647 EditorPane::new(
648 cx,
649 static_tabs_example(),
650 PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
651 vec![Symbol(vec![
652 HighlightedText {
653 text: "fn ".to_string(),
654 color: color.syntax.keyword,
655 },
656 HighlightedText {
657 text: "main".to_string(),
658 color: color.syntax.function,
659 },
660 ])],
661 hello_world_rust_buffer_example(&color),
662 )
663}
664
665pub fn hello_world_rust_buffer_example<S: 'static + Send + Sync + Clone>(
666 color: &ThemeColor,
667) -> Buffer<S> {
668 Buffer::new("hello-world-rust-buffer")
669 .set_title("hello_world.rs".to_string())
670 .set_path("src/hello_world.rs".to_string())
671 .set_language("rust".to_string())
672 .set_rows(Some(BufferRows {
673 show_line_numbers: true,
674 rows: hello_world_rust_buffer_rows(color),
675 }))
676}
677
678pub fn hello_world_rust_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
679 let show_line_number = true;
680
681 vec![
682 BufferRow {
683 line_number: 1,
684 code_action: false,
685 current: true,
686 line: Some(HighlightedLine {
687 highlighted_texts: vec![
688 HighlightedText {
689 text: "fn ".to_string(),
690 color: color.syntax.keyword,
691 },
692 HighlightedText {
693 text: "main".to_string(),
694 color: color.syntax.function,
695 },
696 HighlightedText {
697 text: "() {".to_string(),
698 color: color.text,
699 },
700 ],
701 }),
702 cursors: None,
703 status: GitStatus::None,
704 show_line_number,
705 },
706 BufferRow {
707 line_number: 2,
708 code_action: false,
709 current: false,
710 line: Some(HighlightedLine {
711 highlighted_texts: vec![HighlightedText {
712 text: " // Statements here are executed when the compiled binary is called."
713 .to_string(),
714 color: color.syntax.comment,
715 }],
716 }),
717 cursors: None,
718 status: GitStatus::None,
719 show_line_number,
720 },
721 BufferRow {
722 line_number: 3,
723 code_action: false,
724 current: false,
725 line: None,
726 cursors: None,
727 status: GitStatus::None,
728 show_line_number,
729 },
730 BufferRow {
731 line_number: 4,
732 code_action: false,
733 current: false,
734 line: Some(HighlightedLine {
735 highlighted_texts: vec![HighlightedText {
736 text: " // Print text to the console.".to_string(),
737 color: color.syntax.comment,
738 }],
739 }),
740 cursors: None,
741 status: GitStatus::None,
742 show_line_number,
743 },
744 BufferRow {
745 line_number: 5,
746 code_action: false,
747 current: false,
748 line: Some(HighlightedLine {
749 highlighted_texts: vec![
750 HighlightedText {
751 text: " println!(".to_string(),
752 color: color.text,
753 },
754 HighlightedText {
755 text: "\"Hello, world!\"".to_string(),
756 color: color.syntax.string,
757 },
758 HighlightedText {
759 text: ");".to_string(),
760 color: color.text,
761 },
762 ],
763 }),
764 cursors: None,
765 status: GitStatus::None,
766 show_line_number,
767 },
768 BufferRow {
769 line_number: 6,
770 code_action: false,
771 current: false,
772 line: Some(HighlightedLine {
773 highlighted_texts: vec![HighlightedText {
774 text: "}".to_string(),
775 color: color.text,
776 }],
777 }),
778 cursors: None,
779 status: GitStatus::None,
780 show_line_number,
781 },
782 ]
783}
784
785pub fn hello_world_rust_editor_with_status_example(cx: &mut WindowContext) -> EditorPane {
786 let color = ThemeColor::new(cx);
787
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: color.syntax.keyword,
796 },
797 HighlightedText {
798 text: "main".to_string(),
799 color: color.syntax.function,
800 },
801 ])],
802 hello_world_rust_buffer_with_status_example(&color),
803 )
804}
805
806pub fn hello_world_rust_buffer_with_status_example<S: 'static + Send + Sync + Clone>(
807 color: &ThemeColor,
808) -> Buffer<S> {
809 Buffer::new("hello-world-rust-buffer-with-status")
810 .set_title("hello_world.rs".to_string())
811 .set_path("src/hello_world.rs".to_string())
812 .set_language("rust".to_string())
813 .set_rows(Some(BufferRows {
814 show_line_numbers: true,
815 rows: hello_world_rust_with_status_buffer_rows(color),
816 }))
817}
818
819pub fn hello_world_rust_with_status_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
820 let show_line_number = true;
821
822 vec![
823 BufferRow {
824 line_number: 1,
825 code_action: false,
826 current: true,
827 line: Some(HighlightedLine {
828 highlighted_texts: vec![
829 HighlightedText {
830 text: "fn ".to_string(),
831 color: color.syntax.keyword,
832 },
833 HighlightedText {
834 text: "main".to_string(),
835 color: color.syntax.function,
836 },
837 HighlightedText {
838 text: "() {".to_string(),
839 color: color.text,
840 },
841 ],
842 }),
843 cursors: None,
844 status: GitStatus::None,
845 show_line_number,
846 },
847 BufferRow {
848 line_number: 2,
849 code_action: false,
850 current: false,
851 line: Some(HighlightedLine {
852 highlighted_texts: vec![HighlightedText {
853 text: "// Statements here are executed when the compiled binary is called."
854 .to_string(),
855 color: color.syntax.comment,
856 }],
857 }),
858 cursors: None,
859 status: GitStatus::Modified,
860 show_line_number,
861 },
862 BufferRow {
863 line_number: 3,
864 code_action: false,
865 current: false,
866 line: None,
867 cursors: None,
868 status: GitStatus::None,
869 show_line_number,
870 },
871 BufferRow {
872 line_number: 4,
873 code_action: false,
874 current: false,
875 line: Some(HighlightedLine {
876 highlighted_texts: vec![HighlightedText {
877 text: " // Print text to the console.".to_string(),
878 color: color.syntax.comment,
879 }],
880 }),
881 cursors: None,
882 status: GitStatus::None,
883 show_line_number,
884 },
885 BufferRow {
886 line_number: 5,
887 code_action: false,
888 current: false,
889 line: Some(HighlightedLine {
890 highlighted_texts: vec![
891 HighlightedText {
892 text: " println!(".to_string(),
893 color: color.text,
894 },
895 HighlightedText {
896 text: "\"Hello, world!\"".to_string(),
897 color: color.syntax.string,
898 },
899 HighlightedText {
900 text: ");".to_string(),
901 color: color.text,
902 },
903 ],
904 }),
905 cursors: None,
906 status: GitStatus::None,
907 show_line_number,
908 },
909 BufferRow {
910 line_number: 6,
911 code_action: false,
912 current: false,
913 line: Some(HighlightedLine {
914 highlighted_texts: vec![HighlightedText {
915 text: "}".to_string(),
916 color: color.text,
917 }],
918 }),
919 cursors: None,
920 status: GitStatus::None,
921 show_line_number,
922 },
923 BufferRow {
924 line_number: 7,
925 code_action: false,
926 current: false,
927 line: Some(HighlightedLine {
928 highlighted_texts: vec![HighlightedText {
929 text: "".to_string(),
930 color: color.text,
931 }],
932 }),
933 cursors: None,
934 status: GitStatus::Created,
935 show_line_number,
936 },
937 BufferRow {
938 line_number: 8,
939 code_action: false,
940 current: false,
941 line: Some(HighlightedLine {
942 highlighted_texts: vec![HighlightedText {
943 text: "// Marshall and Nate were here".to_string(),
944 color: color.syntax.comment,
945 }],
946 }),
947 cursors: None,
948 status: GitStatus::Created,
949 show_line_number,
950 },
951 ]
952}
953
954pub fn terminal_buffer<S: 'static + Send + Sync + Clone>(color: &ThemeColor) -> Buffer<S> {
955 Buffer::new("terminal")
956 .set_title("zed — fish".to_string())
957 .set_rows(Some(BufferRows {
958 show_line_numbers: false,
959 rows: terminal_buffer_rows(color),
960 }))
961}
962
963pub fn terminal_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
964 let show_line_number = false;
965
966 vec![
967 BufferRow {
968 line_number: 1,
969 code_action: false,
970 current: false,
971 line: Some(HighlightedLine {
972 highlighted_texts: vec![
973 HighlightedText {
974 text: "maxdeviant ".to_string(),
975 color: color.syntax.keyword,
976 },
977 HighlightedText {
978 text: "in ".to_string(),
979 color: color.text,
980 },
981 HighlightedText {
982 text: "profaned-capital ".to_string(),
983 color: color.syntax.function,
984 },
985 HighlightedText {
986 text: "in ".to_string(),
987 color: color.text,
988 },
989 HighlightedText {
990 text: "~/p/zed ".to_string(),
991 color: color.syntax.function,
992 },
993 HighlightedText {
994 text: "on ".to_string(),
995 color: color.text,
996 },
997 HighlightedText {
998 text: " gpui2-ui ".to_string(),
999 color: color.syntax.keyword,
1000 },
1001 ],
1002 }),
1003 cursors: None,
1004 status: GitStatus::None,
1005 show_line_number,
1006 },
1007 BufferRow {
1008 line_number: 2,
1009 code_action: false,
1010 current: false,
1011 line: Some(HighlightedLine {
1012 highlighted_texts: vec![HighlightedText {
1013 text: "λ ".to_string(),
1014 color: color.syntax.string,
1015 }],
1016 }),
1017 cursors: None,
1018 status: GitStatus::None,
1019 show_line_number,
1020 },
1021 ]
1022}