static_data.rs

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