static_data.rs

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