static_data.rs

   1use std::path::PathBuf;
   2use std::str::FromStr;
   3
   4use gpui2::{AppContext, 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() -> 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 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() -> Buffer {
 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.color("keyword"),
 656            },
 657            HighlightedText {
 658                text: "main".to_string(),
 659                color: theme.syntax.color("function"),
 660            },
 661        ])],
 662        hello_world_rust_buffer_example(&theme),
 663    )
 664}
 665
 666pub fn hello_world_rust_buffer_example(theme: &Theme) -> Buffer {
 667    Buffer::new("hello-world-rust-buffer")
 668        .set_title("hello_world.rs".to_string())
 669        .set_path("src/hello_world.rs".to_string())
 670        .set_language("rust".to_string())
 671        .set_rows(Some(BufferRows {
 672            show_line_numbers: true,
 673            rows: hello_world_rust_buffer_rows(theme),
 674        }))
 675}
 676
 677pub fn hello_world_rust_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
 678    let show_line_number = true;
 679
 680    vec![
 681        BufferRow {
 682            line_number: 1,
 683            code_action: false,
 684            current: true,
 685            line: Some(HighlightedLine {
 686                highlighted_texts: vec![
 687                    HighlightedText {
 688                        text: "fn ".to_string(),
 689                        color: theme.syntax.color("keyword"),
 690                    },
 691                    HighlightedText {
 692                        text: "main".to_string(),
 693                        color: theme.syntax.color("function"),
 694                    },
 695                    HighlightedText {
 696                        text: "() {".to_string(),
 697                        color: theme.text,
 698                    },
 699                ],
 700            }),
 701            cursors: None,
 702            status: GitStatus::None,
 703            show_line_number,
 704        },
 705        BufferRow {
 706            line_number: 2,
 707            code_action: false,
 708            current: false,
 709            line: Some(HighlightedLine {
 710                highlighted_texts: vec![HighlightedText {
 711                    text: "    // Statements here are executed when the compiled binary is called."
 712                        .to_string(),
 713                    color: theme.syntax.color("comment"),
 714                }],
 715            }),
 716            cursors: None,
 717            status: GitStatus::None,
 718            show_line_number,
 719        },
 720        BufferRow {
 721            line_number: 3,
 722            code_action: false,
 723            current: false,
 724            line: None,
 725            cursors: None,
 726            status: GitStatus::None,
 727            show_line_number,
 728        },
 729        BufferRow {
 730            line_number: 4,
 731            code_action: false,
 732            current: false,
 733            line: Some(HighlightedLine {
 734                highlighted_texts: vec![HighlightedText {
 735                    text: "    // Print text to the console.".to_string(),
 736                    color: theme.syntax.color("comment"),
 737                }],
 738            }),
 739            cursors: None,
 740            status: GitStatus::None,
 741            show_line_number,
 742        },
 743        BufferRow {
 744            line_number: 5,
 745            code_action: false,
 746            current: false,
 747            line: Some(HighlightedLine {
 748                highlighted_texts: vec![
 749                    HighlightedText {
 750                        text: "    println!(".to_string(),
 751                        color: theme.text,
 752                    },
 753                    HighlightedText {
 754                        text: "\"Hello, world!\"".to_string(),
 755                        color: theme.syntax.color("string"),
 756                    },
 757                    HighlightedText {
 758                        text: ");".to_string(),
 759                        color: theme.text,
 760                    },
 761                ],
 762            }),
 763            cursors: None,
 764            status: GitStatus::None,
 765            show_line_number,
 766        },
 767        BufferRow {
 768            line_number: 6,
 769            code_action: false,
 770            current: false,
 771            line: Some(HighlightedLine {
 772                highlighted_texts: vec![HighlightedText {
 773                    text: "}".to_string(),
 774                    color: theme.text,
 775                }],
 776            }),
 777            cursors: None,
 778            status: GitStatus::None,
 779            show_line_number,
 780        },
 781    ]
 782}
 783
 784pub fn hello_world_rust_editor_with_status_example(cx: &mut AppContext) -> EditorPane {
 785    let theme = theme(cx);
 786
 787    EditorPane::new(
 788        cx,
 789        static_tabs_example(),
 790        PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
 791        vec![Symbol(vec![
 792            HighlightedText {
 793                text: "fn ".to_string(),
 794                color: theme.syntax.color("keyword"),
 795            },
 796            HighlightedText {
 797                text: "main".to_string(),
 798                color: theme.syntax.color("function"),
 799            },
 800        ])],
 801        hello_world_rust_buffer_with_status_example(&theme),
 802    )
 803}
 804
 805pub fn hello_world_rust_buffer_with_status_example(theme: &Theme) -> Buffer {
 806    Buffer::new("hello-world-rust-buffer-with-status")
 807        .set_title("hello_world.rs".to_string())
 808        .set_path("src/hello_world.rs".to_string())
 809        .set_language("rust".to_string())
 810        .set_rows(Some(BufferRows {
 811            show_line_numbers: true,
 812            rows: hello_world_rust_with_status_buffer_rows(theme),
 813        }))
 814}
 815
 816pub fn hello_world_rust_with_status_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
 817    let show_line_number = true;
 818
 819    vec![
 820        BufferRow {
 821            line_number: 1,
 822            code_action: false,
 823            current: true,
 824            line: Some(HighlightedLine {
 825                highlighted_texts: vec![
 826                    HighlightedText {
 827                        text: "fn ".to_string(),
 828                        color: theme.syntax.color("keyword"),
 829                    },
 830                    HighlightedText {
 831                        text: "main".to_string(),
 832                        color: theme.syntax.color("function"),
 833                    },
 834                    HighlightedText {
 835                        text: "() {".to_string(),
 836                        color: theme.text,
 837                    },
 838                ],
 839            }),
 840            cursors: None,
 841            status: GitStatus::None,
 842            show_line_number,
 843        },
 844        BufferRow {
 845            line_number: 2,
 846            code_action: false,
 847            current: false,
 848            line: Some(HighlightedLine {
 849                highlighted_texts: vec![HighlightedText {
 850                    text: "// Statements here are executed when the compiled binary is called."
 851                        .to_string(),
 852                    color: theme.syntax.color("comment"),
 853                }],
 854            }),
 855            cursors: None,
 856            status: GitStatus::Modified,
 857            show_line_number,
 858        },
 859        BufferRow {
 860            line_number: 3,
 861            code_action: false,
 862            current: false,
 863            line: None,
 864            cursors: None,
 865            status: GitStatus::None,
 866            show_line_number,
 867        },
 868        BufferRow {
 869            line_number: 4,
 870            code_action: false,
 871            current: false,
 872            line: Some(HighlightedLine {
 873                highlighted_texts: vec![HighlightedText {
 874                    text: "    // Print text to the console.".to_string(),
 875                    color: theme.syntax.color("comment"),
 876                }],
 877            }),
 878            cursors: None,
 879            status: GitStatus::None,
 880            show_line_number,
 881        },
 882        BufferRow {
 883            line_number: 5,
 884            code_action: false,
 885            current: false,
 886            line: Some(HighlightedLine {
 887                highlighted_texts: vec![
 888                    HighlightedText {
 889                        text: "    println!(".to_string(),
 890                        color: theme.text,
 891                    },
 892                    HighlightedText {
 893                        text: "\"Hello, world!\"".to_string(),
 894                        color: theme.syntax.color("string"),
 895                    },
 896                    HighlightedText {
 897                        text: ");".to_string(),
 898                        color: theme.text,
 899                    },
 900                ],
 901            }),
 902            cursors: None,
 903            status: GitStatus::None,
 904            show_line_number,
 905        },
 906        BufferRow {
 907            line_number: 6,
 908            code_action: false,
 909            current: false,
 910            line: Some(HighlightedLine {
 911                highlighted_texts: vec![HighlightedText {
 912                    text: "}".to_string(),
 913                    color: theme.text,
 914                }],
 915            }),
 916            cursors: None,
 917            status: GitStatus::None,
 918            show_line_number,
 919        },
 920        BufferRow {
 921            line_number: 7,
 922            code_action: false,
 923            current: false,
 924            line: Some(HighlightedLine {
 925                highlighted_texts: vec![HighlightedText {
 926                    text: "".to_string(),
 927                    color: theme.text,
 928                }],
 929            }),
 930            cursors: None,
 931            status: GitStatus::Created,
 932            show_line_number,
 933        },
 934        BufferRow {
 935            line_number: 8,
 936            code_action: false,
 937            current: false,
 938            line: Some(HighlightedLine {
 939                highlighted_texts: vec![HighlightedText {
 940                    text: "// Marshall and Nate were here".to_string(),
 941                    color: theme.syntax.color("comment"),
 942                }],
 943            }),
 944            cursors: None,
 945            status: GitStatus::Created,
 946            show_line_number,
 947        },
 948    ]
 949}
 950
 951pub fn terminal_buffer(theme: &Theme) -> Buffer {
 952    Buffer::new("terminal")
 953        .set_title("zed — fish".to_string())
 954        .set_rows(Some(BufferRows {
 955            show_line_numbers: false,
 956            rows: terminal_buffer_rows(theme),
 957        }))
 958}
 959
 960pub fn terminal_buffer_rows(theme: &Theme) -> Vec<BufferRow> {
 961    let show_line_number = false;
 962
 963    vec![
 964        BufferRow {
 965            line_number: 1,
 966            code_action: false,
 967            current: false,
 968            line: Some(HighlightedLine {
 969                highlighted_texts: vec![
 970                    HighlightedText {
 971                        text: "maxdeviant ".to_string(),
 972                        color: theme.syntax.color("keyword"),
 973                    },
 974                    HighlightedText {
 975                        text: "in ".to_string(),
 976                        color: theme.text,
 977                    },
 978                    HighlightedText {
 979                        text: "profaned-capital ".to_string(),
 980                        color: theme.syntax.color("function"),
 981                    },
 982                    HighlightedText {
 983                        text: "in ".to_string(),
 984                        color: theme.text,
 985                    },
 986                    HighlightedText {
 987                        text: "~/p/zed ".to_string(),
 988                        color: theme.syntax.color("function"),
 989                    },
 990                    HighlightedText {
 991                        text: "on ".to_string(),
 992                        color: theme.text,
 993                    },
 994                    HighlightedText {
 995                        text: " gpui2-ui ".to_string(),
 996                        color: theme.syntax.color("keyword"),
 997                    },
 998                ],
 999            }),
1000            cursors: None,
1001            status: GitStatus::None,
1002            show_line_number,
1003        },
1004        BufferRow {
1005            line_number: 2,
1006            code_action: false,
1007            current: false,
1008            line: Some(HighlightedLine {
1009                highlighted_texts: vec![HighlightedText {
1010                    text: "λ ".to_string(),
1011                    color: theme.syntax.color("string"),
1012                }],
1013            }),
1014            cursors: None,
1015            status: GitStatus::None,
1016            show_line_number,
1017        },
1018    ]
1019}