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