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