static_data.rs

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