static_data.rs

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