1use std::path::PathBuf;
2use std::str::FromStr;
3
4use gpui3::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 + Clone>() -> Vec<ListItem<S>> {
328 vec![
329 ListEntry::new(Label::new(
330 "maxdeviant invited you to join a stream in #design.",
331 ))
332 .set_left_icon(Icon::FileLock.into()),
333 ListEntry::new(Label::new("nathansobo accepted your contact request."))
334 .set_left_icon(Icon::FileToml.into()),
335 ]
336 .into_iter()
337 .map(From::from)
338 .collect()
339}
340
341pub fn static_read_notification_items<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
342 vec![
343 ListDetailsEntry::new("mikaylamaki added you as a contact.")
344 .actions(vec![Button::new("Decline"), Button::new("Accept")]),
345 ListDetailsEntry::new("maxdeviant invited you to a stream in #design.")
346 .seen(true)
347 .meta("This stream has ended."),
348 ListDetailsEntry::new("nathansobo 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 + Clone>() -> Vec<ListItem<S>> {
356 vec![
357 ListEntry::new(Label::new("zed"))
358 .set_left_icon(Icon::FolderOpen.into())
359 .set_indent_level(0)
360 .set_toggle(ToggleState::Toggled),
361 ListEntry::new(Label::new(".cargo"))
362 .set_left_icon(Icon::Folder.into())
363 .set_indent_level(1),
364 ListEntry::new(Label::new(".config"))
365 .set_left_icon(Icon::Folder.into())
366 .set_indent_level(1),
367 ListEntry::new(Label::new(".git").color(LabelColor::Hidden))
368 .set_left_icon(Icon::Folder.into())
369 .set_indent_level(1),
370 ListEntry::new(Label::new(".cargo"))
371 .set_left_icon(Icon::Folder.into())
372 .set_indent_level(1),
373 ListEntry::new(Label::new(".idea").color(LabelColor::Hidden))
374 .set_left_icon(Icon::Folder.into())
375 .set_indent_level(1),
376 ListEntry::new(Label::new("assets"))
377 .set_left_icon(Icon::Folder.into())
378 .set_indent_level(1)
379 .set_toggle(ToggleState::Toggled),
380 ListEntry::new(Label::new("cargo-target").color(LabelColor::Hidden))
381 .set_left_icon(Icon::Folder.into())
382 .set_indent_level(1),
383 ListEntry::new(Label::new("crates"))
384 .set_left_icon(Icon::FolderOpen.into())
385 .set_indent_level(1)
386 .set_toggle(ToggleState::Toggled),
387 ListEntry::new(Label::new("activity_indicator"))
388 .set_left_icon(Icon::Folder.into())
389 .set_indent_level(2),
390 ListEntry::new(Label::new("ai"))
391 .set_left_icon(Icon::Folder.into())
392 .set_indent_level(2),
393 ListEntry::new(Label::new("audio"))
394 .set_left_icon(Icon::Folder.into())
395 .set_indent_level(2),
396 ListEntry::new(Label::new("auto_update"))
397 .set_left_icon(Icon::Folder.into())
398 .set_indent_level(2),
399 ListEntry::new(Label::new("breadcrumbs"))
400 .set_left_icon(Icon::Folder.into())
401 .set_indent_level(2),
402 ListEntry::new(Label::new("call"))
403 .set_left_icon(Icon::Folder.into())
404 .set_indent_level(2),
405 ListEntry::new(Label::new("sqlez").color(LabelColor::Modified))
406 .set_left_icon(Icon::Folder.into())
407 .set_indent_level(2)
408 .set_toggle(ToggleState::NotToggled),
409 ListEntry::new(Label::new("gpui2"))
410 .set_left_icon(Icon::FolderOpen.into())
411 .set_indent_level(2)
412 .set_toggle(ToggleState::Toggled),
413 ListEntry::new(Label::new("src"))
414 .set_left_icon(Icon::FolderOpen.into())
415 .set_indent_level(3)
416 .set_toggle(ToggleState::Toggled),
417 ListEntry::new(Label::new("derive_element.rs"))
418 .set_left_icon(Icon::FileRust.into())
419 .set_indent_level(4),
420 ListEntry::new(Label::new("storybook").color(LabelColor::Modified))
421 .set_left_icon(Icon::FolderOpen.into())
422 .set_indent_level(1)
423 .set_toggle(ToggleState::Toggled),
424 ListEntry::new(Label::new("docs").color(LabelColor::Default))
425 .set_left_icon(Icon::Folder.into())
426 .set_indent_level(2)
427 .set_toggle(ToggleState::Toggled),
428 ListEntry::new(Label::new("src").color(LabelColor::Modified))
429 .set_left_icon(Icon::FolderOpen.into())
430 .set_indent_level(3)
431 .set_toggle(ToggleState::Toggled),
432 ListEntry::new(Label::new("ui").color(LabelColor::Modified))
433 .set_left_icon(Icon::FolderOpen.into())
434 .set_indent_level(4)
435 .set_toggle(ToggleState::Toggled),
436 ListEntry::new(Label::new("component").color(LabelColor::Created))
437 .set_left_icon(Icon::FolderOpen.into())
438 .set_indent_level(5)
439 .set_toggle(ToggleState::Toggled),
440 ListEntry::new(Label::new("facepile.rs").color(LabelColor::Default))
441 .set_left_icon(Icon::FileRust.into())
442 .set_indent_level(6),
443 ListEntry::new(Label::new("follow_group.rs").color(LabelColor::Default))
444 .set_left_icon(Icon::FileRust.into())
445 .set_indent_level(6),
446 ListEntry::new(Label::new("list_item.rs").color(LabelColor::Created))
447 .set_left_icon(Icon::FileRust.into())
448 .set_indent_level(6),
449 ListEntry::new(Label::new("tab.rs").color(LabelColor::Default))
450 .set_left_icon(Icon::FileRust.into())
451 .set_indent_level(6),
452 ListEntry::new(Label::new("target").color(LabelColor::Hidden))
453 .set_left_icon(Icon::Folder.into())
454 .set_indent_level(1),
455 ListEntry::new(Label::new(".dockerignore"))
456 .set_left_icon(Icon::FileGeneric.into())
457 .set_indent_level(1),
458 ListEntry::new(Label::new(".DS_Store").color(LabelColor::Hidden))
459 .set_left_icon(Icon::FileGeneric.into())
460 .set_indent_level(1),
461 ListEntry::new(Label::new("Cargo.lock"))
462 .set_left_icon(Icon::FileLock.into())
463 .set_indent_level(1),
464 ListEntry::new(Label::new("Cargo.toml"))
465 .set_left_icon(Icon::FileToml.into())
466 .set_indent_level(1),
467 ListEntry::new(Label::new("Dockerfile"))
468 .set_left_icon(Icon::FileGeneric.into())
469 .set_indent_level(1),
470 ListEntry::new(Label::new("Procfile"))
471 .set_left_icon(Icon::FileGeneric.into())
472 .set_indent_level(1),
473 ListEntry::new(Label::new("README.md"))
474 .set_left_icon(Icon::FileDoc.into())
475 .set_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 + Clone>() -> Vec<ListItem<S>> {
483 vec![
484 ListEntry::new(Label::new("todo.md"))
485 .set_left_icon(Icon::FileDoc.into())
486 .set_indent_level(0),
487 ListEntry::new(Label::new("README.md"))
488 .set_left_icon(Icon::FileDoc.into())
489 .set_indent_level(0),
490 ListEntry::new(Label::new("config.json"))
491 .set_left_icon(Icon::FileGeneric.into())
492 .set_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 + Clone>() -> Vec<ListItem<S>> {
500 vec![
501 ListEntry::new(Label::new("as-cii")).set_left_avatar("http://github.com/as-cii.png?s=50"),
502 ListEntry::new(Label::new("nathansobo"))
503 .set_left_avatar("http://github.com/nathansobo.png?s=50"),
504 ListEntry::new(Label::new("maxbrunsfeld"))
505 .set_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 + Clone>() -> Vec<ListItem<S>> {
513 vec![
514 ListEntry::new(Label::new("zed"))
515 .set_left_icon(Icon::Hash.into())
516 .set_size(ListEntrySize::Medium)
517 .set_indent_level(0),
518 ListEntry::new(Label::new("community"))
519 .set_left_icon(Icon::Hash.into())
520 .set_size(ListEntrySize::Medium)
521 .set_indent_level(1),
522 ListEntry::new(Label::new("dashboards"))
523 .set_left_icon(Icon::Hash.into())
524 .set_size(ListEntrySize::Medium)
525 .set_indent_level(2),
526 ListEntry::new(Label::new("feedback"))
527 .set_left_icon(Icon::Hash.into())
528 .set_size(ListEntrySize::Medium)
529 .set_indent_level(2),
530 ListEntry::new(Label::new("teams-in-channels-alpha"))
531 .set_left_icon(Icon::Hash.into())
532 .set_size(ListEntrySize::Medium)
533 .set_indent_level(2),
534 ListEntry::new(Label::new("current-projects"))
535 .set_left_icon(Icon::Hash.into())
536 .set_size(ListEntrySize::Medium)
537 .set_indent_level(1),
538 ListEntry::new(Label::new("codegen"))
539 .set_left_icon(Icon::Hash.into())
540 .set_size(ListEntrySize::Medium)
541 .set_indent_level(2),
542 ListEntry::new(Label::new("gpui2"))
543 .set_left_icon(Icon::Hash.into())
544 .set_size(ListEntrySize::Medium)
545 .set_indent_level(2),
546 ListEntry::new(Label::new("livestreaming"))
547 .set_left_icon(Icon::Hash.into())
548 .set_size(ListEntrySize::Medium)
549 .set_indent_level(2),
550 ListEntry::new(Label::new("open-source"))
551 .set_left_icon(Icon::Hash.into())
552 .set_size(ListEntrySize::Medium)
553 .set_indent_level(2),
554 ListEntry::new(Label::new("replace"))
555 .set_left_icon(Icon::Hash.into())
556 .set_size(ListEntrySize::Medium)
557 .set_indent_level(2),
558 ListEntry::new(Label::new("semantic-index"))
559 .set_left_icon(Icon::Hash.into())
560 .set_size(ListEntrySize::Medium)
561 .set_indent_level(2),
562 ListEntry::new(Label::new("vim"))
563 .set_left_icon(Icon::Hash.into())
564 .set_size(ListEntrySize::Medium)
565 .set_indent_level(2),
566 ListEntry::new(Label::new("web-tech"))
567 .set_left_icon(Icon::Hash.into())
568 .set_size(ListEntrySize::Medium)
569 .set_indent_level(2),
570 ]
571 .into_iter()
572 .map(From::from)
573 .collect()
574}
575
576pub fn example_editor_actions<S: 'static + Send + Sync + Clone>() -> 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().set_rows(Some(BufferRows::default()))
643}
644
645pub fn hello_world_rust_editor_example(cx: &mut WindowContext) -> EditorPane {
646 let color = ThemeColor::new(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: color.syntax.keyword,
656 },
657 HighlightedText {
658 text: "main".to_string(),
659 color: color.syntax.function,
660 },
661 ])],
662 hello_world_rust_buffer_example(&color),
663 )
664}
665
666pub fn hello_world_rust_buffer_example<S: 'static + Send + Sync + Clone>(
667 color: &ThemeColor,
668) -> Buffer<S> {
669 Buffer::new()
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(color),
676 }))
677}
678
679pub fn hello_world_rust_buffer_rows(color: &ThemeColor) -> 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: color.syntax.keyword,
692 },
693 HighlightedText {
694 text: "main".to_string(),
695 color: color.syntax.function,
696 },
697 HighlightedText {
698 text: "() {".to_string(),
699 color: color.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: color.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: color.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: color.text,
754 },
755 HighlightedText {
756 text: "\"Hello, world!\"".to_string(),
757 color: color.syntax.string,
758 },
759 HighlightedText {
760 text: ");".to_string(),
761 color: color.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: color.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 color = ThemeColor::new(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: color.syntax.keyword,
797 },
798 HighlightedText {
799 text: "main".to_string(),
800 color: color.syntax.function,
801 },
802 ])],
803 hello_world_rust_buffer_with_status_example(&color),
804 )
805}
806
807pub fn hello_world_rust_buffer_with_status_example<S: 'static + Send + Sync + Clone>(
808 color: &ThemeColor,
809) -> Buffer<S> {
810 Buffer::new()
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(color),
817 }))
818}
819
820pub fn hello_world_rust_with_status_buffer_rows(color: &ThemeColor) -> 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: color.syntax.keyword,
833 },
834 HighlightedText {
835 text: "main".to_string(),
836 color: color.syntax.function,
837 },
838 HighlightedText {
839 text: "() {".to_string(),
840 color: color.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: color.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: color.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: color.text,
895 },
896 HighlightedText {
897 text: "\"Hello, world!\"".to_string(),
898 color: color.syntax.string,
899 },
900 HighlightedText {
901 text: ");".to_string(),
902 color: color.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: color.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: color.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: color.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>(color: &ThemeColor) -> Buffer<S> {
956 Buffer::new()
957 .set_title("zed — fish".to_string())
958 .set_rows(Some(BufferRows {
959 show_line_numbers: false,
960 rows: terminal_buffer_rows(color),
961 }))
962}
963
964pub fn terminal_buffer_rows(color: &ThemeColor) -> 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: color.syntax.keyword,
977 },
978 HighlightedText {
979 text: "in ".to_string(),
980 color: color.text,
981 },
982 HighlightedText {
983 text: "profaned-capital ".to_string(),
984 color: color.syntax.function,
985 },
986 HighlightedText {
987 text: "in ".to_string(),
988 color: color.text,
989 },
990 HighlightedText {
991 text: "~/p/zed ".to_string(),
992 color: color.syntax.function,
993 },
994 HighlightedText {
995 text: "on ".to_string(),
996 color: color.text,
997 },
998 HighlightedText {
999 text: " gpui2-ui ".to_string(),
1000 color: color.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: color.syntax.string,
1016 }],
1017 }),
1018 cursors: None,
1019 status: GitStatus::None,
1020 show_line_number,
1021 },
1022 ]
1023}