static_data.rs

   1use std::path::PathBuf;
   2use std::str::FromStr;
   3
   4use gpui2::WindowContext;
   5use rand::Rng;
   6use theme2::Theme;
   7
   8use crate::{
   9    theme, 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<S: 'static + Send + Sync + Clone>() -> Vec<Tab<S>> {
  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<S: 'static + Send + Sync + Clone>() -> Vec<Tab<S>> {
  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<S: 'static + Send + Sync + Clone>() -> Vec<Tab<S>> {
  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<S: 'static + Send + Sync + Clone>() -> Vec<Tab<S>> {
 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<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
 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<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
 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<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
 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<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
 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<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
 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<S: 'static + Send + Sync>() -> Vec<ListItem<S>> {
 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<S: 'static + Send + Sync>() -> Vec<PaletteItem<S>> {
 577    vec![
 578        PaletteItem::new("New File").keybinding(Keybinding::new(
 579            "N".to_string(),
 580            ModifierKeys::new().command(true),
 581        )),
 582        PaletteItem::new("Open File").keybinding(Keybinding::new(
 583            "O".to_string(),
 584            ModifierKeys::new().command(true),
 585        )),
 586        PaletteItem::new("Save File").keybinding(Keybinding::new(
 587            "S".to_string(),
 588            ModifierKeys::new().command(true),
 589        )),
 590        PaletteItem::new("Cut").keybinding(Keybinding::new(
 591            "X".to_string(),
 592            ModifierKeys::new().command(true),
 593        )),
 594        PaletteItem::new("Copy").keybinding(Keybinding::new(
 595            "C".to_string(),
 596            ModifierKeys::new().command(true),
 597        )),
 598        PaletteItem::new("Paste").keybinding(Keybinding::new(
 599            "V".to_string(),
 600            ModifierKeys::new().command(true),
 601        )),
 602        PaletteItem::new("Undo").keybinding(Keybinding::new(
 603            "Z".to_string(),
 604            ModifierKeys::new().command(true),
 605        )),
 606        PaletteItem::new("Redo").keybinding(Keybinding::new(
 607            "Z".to_string(),
 608            ModifierKeys::new().command(true).shift(true),
 609        )),
 610        PaletteItem::new("Find").keybinding(Keybinding::new(
 611            "F".to_string(),
 612            ModifierKeys::new().command(true),
 613        )),
 614        PaletteItem::new("Replace").keybinding(Keybinding::new(
 615            "R".to_string(),
 616            ModifierKeys::new().command(true),
 617        )),
 618        PaletteItem::new("Jump to Line"),
 619        PaletteItem::new("Select All"),
 620        PaletteItem::new("Deselect All"),
 621        PaletteItem::new("Switch Document"),
 622        PaletteItem::new("Insert Line Below"),
 623        PaletteItem::new("Insert Line Above"),
 624        PaletteItem::new("Move Line Up"),
 625        PaletteItem::new("Move Line Down"),
 626        PaletteItem::new("Toggle Comment"),
 627        PaletteItem::new("Delete Line"),
 628    ]
 629}
 630
 631pub fn empty_editor_example(cx: &mut WindowContext) -> EditorPane {
 632    EditorPane::new(
 633        cx,
 634        static_tabs_example(),
 635        PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
 636        vec![],
 637        empty_buffer_example(),
 638    )
 639}
 640
 641pub fn empty_buffer_example<S: 'static + Send + Sync + Clone>() -> Buffer<S> {
 642    Buffer::new("empty-buffer").set_rows(Some(BufferRows::default()))
 643}
 644
 645pub fn hello_world_rust_editor_example(cx: &mut WindowContext) -> EditorPane {
 646    let theme = theme(cx);
 647
 648    EditorPane::new(
 649        cx,
 650        static_tabs_example(),
 651        PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
 652        vec![Symbol(vec![
 653            HighlightedText {
 654                text: "fn ".to_string(),
 655                color: theme.syntax.keyword,
 656            },
 657            HighlightedText {
 658                text: "main".to_string(),
 659                color: theme.syntax.function,
 660            },
 661        ])],
 662        hello_world_rust_buffer_example(&theme),
 663    )
 664}
 665
 666pub fn hello_world_rust_buffer_example<S: 'static + Send + Sync + Clone>(
 667    theme: &Theme,
 668) -> Buffer<S> {
 669    Buffer::new("hello-world-rust-buffer")
 670        .set_title("hello_world.rs".to_string())
 671        .set_path("src/hello_world.rs".to_string())
 672        .set_language("rust".to_string())
 673        .set_rows(Some(BufferRows {
 674            show_line_numbers: true,
 675            rows: hello_world_rust_buffer_rows(theme),
 676        }))
 677}
 678
 679pub fn hello_world_rust_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
 680    let show_line_number = true;
 681
 682    vec![
 683        BufferRow {
 684            line_number: 1,
 685            code_action: false,
 686            current: true,
 687            line: Some(HighlightedLine {
 688                highlighted_texts: vec![
 689                    HighlightedText {
 690                        text: "fn ".to_string(),
 691                        color: theme.syntax.keyword,
 692                    },
 693                    HighlightedText {
 694                        text: "main".to_string(),
 695                        color: theme.syntax.function,
 696                    },
 697                    HighlightedText {
 698                        text: "() {".to_string(),
 699                        color: theme.text,
 700                    },
 701                ],
 702            }),
 703            cursors: None,
 704            status: GitStatus::None,
 705            show_line_number,
 706        },
 707        BufferRow {
 708            line_number: 2,
 709            code_action: false,
 710            current: false,
 711            line: Some(HighlightedLine {
 712                highlighted_texts: vec![HighlightedText {
 713                    text: "    // Statements here are executed when the compiled binary is called."
 714                        .to_string(),
 715                    color: theme.syntax.comment,
 716                }],
 717            }),
 718            cursors: None,
 719            status: GitStatus::None,
 720            show_line_number,
 721        },
 722        BufferRow {
 723            line_number: 3,
 724            code_action: false,
 725            current: false,
 726            line: None,
 727            cursors: None,
 728            status: GitStatus::None,
 729            show_line_number,
 730        },
 731        BufferRow {
 732            line_number: 4,
 733            code_action: false,
 734            current: false,
 735            line: Some(HighlightedLine {
 736                highlighted_texts: vec![HighlightedText {
 737                    text: "    // Print text to the console.".to_string(),
 738                    color: theme.syntax.comment,
 739                }],
 740            }),
 741            cursors: None,
 742            status: GitStatus::None,
 743            show_line_number,
 744        },
 745        BufferRow {
 746            line_number: 5,
 747            code_action: false,
 748            current: false,
 749            line: Some(HighlightedLine {
 750                highlighted_texts: vec![
 751                    HighlightedText {
 752                        text: "    println!(".to_string(),
 753                        color: theme.text,
 754                    },
 755                    HighlightedText {
 756                        text: "\"Hello, world!\"".to_string(),
 757                        color: theme.syntax.string,
 758                    },
 759                    HighlightedText {
 760                        text: ");".to_string(),
 761                        color: theme.text,
 762                    },
 763                ],
 764            }),
 765            cursors: None,
 766            status: GitStatus::None,
 767            show_line_number,
 768        },
 769        BufferRow {
 770            line_number: 6,
 771            code_action: false,
 772            current: false,
 773            line: Some(HighlightedLine {
 774                highlighted_texts: vec![HighlightedText {
 775                    text: "}".to_string(),
 776                    color: theme.text,
 777                }],
 778            }),
 779            cursors: None,
 780            status: GitStatus::None,
 781            show_line_number,
 782        },
 783    ]
 784}
 785
 786pub fn hello_world_rust_editor_with_status_example(cx: &mut WindowContext) -> EditorPane {
 787    let theme = theme(cx);
 788
 789    EditorPane::new(
 790        cx,
 791        static_tabs_example(),
 792        PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
 793        vec![Symbol(vec![
 794            HighlightedText {
 795                text: "fn ".to_string(),
 796                color: theme.syntax.keyword,
 797            },
 798            HighlightedText {
 799                text: "main".to_string(),
 800                color: theme.syntax.function,
 801            },
 802        ])],
 803        hello_world_rust_buffer_with_status_example(&theme),
 804    )
 805}
 806
 807pub fn hello_world_rust_buffer_with_status_example<S: 'static + Send + Sync + Clone>(
 808    theme: &Theme,
 809) -> Buffer<S> {
 810    Buffer::new("hello-world-rust-buffer-with-status")
 811        .set_title("hello_world.rs".to_string())
 812        .set_path("src/hello_world.rs".to_string())
 813        .set_language("rust".to_string())
 814        .set_rows(Some(BufferRows {
 815            show_line_numbers: true,
 816            rows: hello_world_rust_with_status_buffer_rows(theme),
 817        }))
 818}
 819
 820pub fn hello_world_rust_with_status_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
 821    let show_line_number = true;
 822
 823    vec![
 824        BufferRow {
 825            line_number: 1,
 826            code_action: false,
 827            current: true,
 828            line: Some(HighlightedLine {
 829                highlighted_texts: vec![
 830                    HighlightedText {
 831                        text: "fn ".to_string(),
 832                        color: theme.syntax.keyword,
 833                    },
 834                    HighlightedText {
 835                        text: "main".to_string(),
 836                        color: theme.syntax.function,
 837                    },
 838                    HighlightedText {
 839                        text: "() {".to_string(),
 840                        color: theme.text,
 841                    },
 842                ],
 843            }),
 844            cursors: None,
 845            status: GitStatus::None,
 846            show_line_number,
 847        },
 848        BufferRow {
 849            line_number: 2,
 850            code_action: false,
 851            current: false,
 852            line: Some(HighlightedLine {
 853                highlighted_texts: vec![HighlightedText {
 854                    text: "// Statements here are executed when the compiled binary is called."
 855                        .to_string(),
 856                    color: theme.syntax.comment,
 857                }],
 858            }),
 859            cursors: None,
 860            status: GitStatus::Modified,
 861            show_line_number,
 862        },
 863        BufferRow {
 864            line_number: 3,
 865            code_action: false,
 866            current: false,
 867            line: None,
 868            cursors: None,
 869            status: GitStatus::None,
 870            show_line_number,
 871        },
 872        BufferRow {
 873            line_number: 4,
 874            code_action: false,
 875            current: false,
 876            line: Some(HighlightedLine {
 877                highlighted_texts: vec![HighlightedText {
 878                    text: "    // Print text to the console.".to_string(),
 879                    color: theme.syntax.comment,
 880                }],
 881            }),
 882            cursors: None,
 883            status: GitStatus::None,
 884            show_line_number,
 885        },
 886        BufferRow {
 887            line_number: 5,
 888            code_action: false,
 889            current: false,
 890            line: Some(HighlightedLine {
 891                highlighted_texts: vec![
 892                    HighlightedText {
 893                        text: "    println!(".to_string(),
 894                        color: theme.text,
 895                    },
 896                    HighlightedText {
 897                        text: "\"Hello, world!\"".to_string(),
 898                        color: theme.syntax.string,
 899                    },
 900                    HighlightedText {
 901                        text: ");".to_string(),
 902                        color: theme.text,
 903                    },
 904                ],
 905            }),
 906            cursors: None,
 907            status: GitStatus::None,
 908            show_line_number,
 909        },
 910        BufferRow {
 911            line_number: 6,
 912            code_action: false,
 913            current: false,
 914            line: Some(HighlightedLine {
 915                highlighted_texts: vec![HighlightedText {
 916                    text: "}".to_string(),
 917                    color: theme.text,
 918                }],
 919            }),
 920            cursors: None,
 921            status: GitStatus::None,
 922            show_line_number,
 923        },
 924        BufferRow {
 925            line_number: 7,
 926            code_action: false,
 927            current: false,
 928            line: Some(HighlightedLine {
 929                highlighted_texts: vec![HighlightedText {
 930                    text: "".to_string(),
 931                    color: theme.text,
 932                }],
 933            }),
 934            cursors: None,
 935            status: GitStatus::Created,
 936            show_line_number,
 937        },
 938        BufferRow {
 939            line_number: 8,
 940            code_action: false,
 941            current: false,
 942            line: Some(HighlightedLine {
 943                highlighted_texts: vec![HighlightedText {
 944                    text: "// Marshall and Nate were here".to_string(),
 945                    color: theme.syntax.comment,
 946                }],
 947            }),
 948            cursors: None,
 949            status: GitStatus::Created,
 950            show_line_number,
 951        },
 952    ]
 953}
 954
 955pub fn terminal_buffer<S: 'static + Send + Sync + Clone>(theme: &Theme) -> Buffer<S> {
 956    Buffer::new("terminal")
 957        .set_title("zed — fish".to_string())
 958        .set_rows(Some(BufferRows {
 959            show_line_numbers: false,
 960            rows: terminal_buffer_rows(theme),
 961        }))
 962}
 963
 964pub fn terminal_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
 965    let show_line_number = false;
 966
 967    vec![
 968        BufferRow {
 969            line_number: 1,
 970            code_action: false,
 971            current: false,
 972            line: Some(HighlightedLine {
 973                highlighted_texts: vec![
 974                    HighlightedText {
 975                        text: "maxdeviant ".to_string(),
 976                        color: theme.syntax.keyword,
 977                    },
 978                    HighlightedText {
 979                        text: "in ".to_string(),
 980                        color: theme.text,
 981                    },
 982                    HighlightedText {
 983                        text: "profaned-capital ".to_string(),
 984                        color: theme.syntax.function,
 985                    },
 986                    HighlightedText {
 987                        text: "in ".to_string(),
 988                        color: theme.text,
 989                    },
 990                    HighlightedText {
 991                        text: "~/p/zed ".to_string(),
 992                        color: theme.syntax.function,
 993                    },
 994                    HighlightedText {
 995                        text: "on ".to_string(),
 996                        color: theme.text,
 997                    },
 998                    HighlightedText {
 999                        text: " gpui2-ui ".to_string(),
1000                        color: theme.syntax.keyword,
1001                    },
1002                ],
1003            }),
1004            cursors: None,
1005            status: GitStatus::None,
1006            show_line_number,
1007        },
1008        BufferRow {
1009            line_number: 2,
1010            code_action: false,
1011            current: false,
1012            line: Some(HighlightedLine {
1013                highlighted_texts: vec![HighlightedText {
1014                    text: "λ ".to_string(),
1015                    color: theme.syntax.string,
1016                }],
1017            }),
1018            cursors: None,
1019            status: GitStatus::None,
1020            show_line_number,
1021        },
1022    ]
1023}