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