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