static_data.rs

   1use std::path::PathBuf;
   2use std::str::FromStr;
   3
   4use gpui3::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 + Clone>() -> Vec<ListItem<S>> {
 328    vec![
 329        ListEntry::new(Label::new(
 330            "maxdeviant invited you to join a stream in #design.",
 331        ))
 332        .set_left_icon(Icon::FileLock.into()),
 333        ListEntry::new(Label::new("nathansobo accepted your contact request."))
 334            .set_left_icon(Icon::FileToml.into()),
 335    ]
 336    .into_iter()
 337    .map(From::from)
 338    .collect()
 339}
 340
 341pub fn static_read_notification_items<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
 342    vec![
 343        ListDetailsEntry::new("mikaylamaki added you as a contact.")
 344            .actions(vec![Button::new("Decline"), Button::new("Accept")]),
 345        ListDetailsEntry::new("maxdeviant invited you to a stream in #design.")
 346            .seen(true)
 347            .meta("This stream has ended."),
 348        ListDetailsEntry::new("nathansobo accepted your contact request."),
 349    ]
 350    .into_iter()
 351    .map(From::from)
 352    .collect()
 353}
 354
 355pub fn static_project_panel_project_items<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
 356    vec![
 357        ListEntry::new(Label::new("zed"))
 358            .set_left_icon(Icon::FolderOpen.into())
 359            .set_indent_level(0)
 360            .set_toggle(ToggleState::Toggled),
 361        ListEntry::new(Label::new(".cargo"))
 362            .set_left_icon(Icon::Folder.into())
 363            .set_indent_level(1),
 364        ListEntry::new(Label::new(".config"))
 365            .set_left_icon(Icon::Folder.into())
 366            .set_indent_level(1),
 367        ListEntry::new(Label::new(".git").color(LabelColor::Hidden))
 368            .set_left_icon(Icon::Folder.into())
 369            .set_indent_level(1),
 370        ListEntry::new(Label::new(".cargo"))
 371            .set_left_icon(Icon::Folder.into())
 372            .set_indent_level(1),
 373        ListEntry::new(Label::new(".idea").color(LabelColor::Hidden))
 374            .set_left_icon(Icon::Folder.into())
 375            .set_indent_level(1),
 376        ListEntry::new(Label::new("assets"))
 377            .set_left_icon(Icon::Folder.into())
 378            .set_indent_level(1)
 379            .set_toggle(ToggleState::Toggled),
 380        ListEntry::new(Label::new("cargo-target").color(LabelColor::Hidden))
 381            .set_left_icon(Icon::Folder.into())
 382            .set_indent_level(1),
 383        ListEntry::new(Label::new("crates"))
 384            .set_left_icon(Icon::FolderOpen.into())
 385            .set_indent_level(1)
 386            .set_toggle(ToggleState::Toggled),
 387        ListEntry::new(Label::new("activity_indicator"))
 388            .set_left_icon(Icon::Folder.into())
 389            .set_indent_level(2),
 390        ListEntry::new(Label::new("ai"))
 391            .set_left_icon(Icon::Folder.into())
 392            .set_indent_level(2),
 393        ListEntry::new(Label::new("audio"))
 394            .set_left_icon(Icon::Folder.into())
 395            .set_indent_level(2),
 396        ListEntry::new(Label::new("auto_update"))
 397            .set_left_icon(Icon::Folder.into())
 398            .set_indent_level(2),
 399        ListEntry::new(Label::new("breadcrumbs"))
 400            .set_left_icon(Icon::Folder.into())
 401            .set_indent_level(2),
 402        ListEntry::new(Label::new("call"))
 403            .set_left_icon(Icon::Folder.into())
 404            .set_indent_level(2),
 405        ListEntry::new(Label::new("sqlez").color(LabelColor::Modified))
 406            .set_left_icon(Icon::Folder.into())
 407            .set_indent_level(2)
 408            .set_toggle(ToggleState::NotToggled),
 409        ListEntry::new(Label::new("gpui2"))
 410            .set_left_icon(Icon::FolderOpen.into())
 411            .set_indent_level(2)
 412            .set_toggle(ToggleState::Toggled),
 413        ListEntry::new(Label::new("src"))
 414            .set_left_icon(Icon::FolderOpen.into())
 415            .set_indent_level(3)
 416            .set_toggle(ToggleState::Toggled),
 417        ListEntry::new(Label::new("derive_element.rs"))
 418            .set_left_icon(Icon::FileRust.into())
 419            .set_indent_level(4),
 420        ListEntry::new(Label::new("storybook").color(LabelColor::Modified))
 421            .set_left_icon(Icon::FolderOpen.into())
 422            .set_indent_level(1)
 423            .set_toggle(ToggleState::Toggled),
 424        ListEntry::new(Label::new("docs").color(LabelColor::Default))
 425            .set_left_icon(Icon::Folder.into())
 426            .set_indent_level(2)
 427            .set_toggle(ToggleState::Toggled),
 428        ListEntry::new(Label::new("src").color(LabelColor::Modified))
 429            .set_left_icon(Icon::FolderOpen.into())
 430            .set_indent_level(3)
 431            .set_toggle(ToggleState::Toggled),
 432        ListEntry::new(Label::new("ui").color(LabelColor::Modified))
 433            .set_left_icon(Icon::FolderOpen.into())
 434            .set_indent_level(4)
 435            .set_toggle(ToggleState::Toggled),
 436        ListEntry::new(Label::new("component").color(LabelColor::Created))
 437            .set_left_icon(Icon::FolderOpen.into())
 438            .set_indent_level(5)
 439            .set_toggle(ToggleState::Toggled),
 440        ListEntry::new(Label::new("facepile.rs").color(LabelColor::Default))
 441            .set_left_icon(Icon::FileRust.into())
 442            .set_indent_level(6),
 443        ListEntry::new(Label::new("follow_group.rs").color(LabelColor::Default))
 444            .set_left_icon(Icon::FileRust.into())
 445            .set_indent_level(6),
 446        ListEntry::new(Label::new("list_item.rs").color(LabelColor::Created))
 447            .set_left_icon(Icon::FileRust.into())
 448            .set_indent_level(6),
 449        ListEntry::new(Label::new("tab.rs").color(LabelColor::Default))
 450            .set_left_icon(Icon::FileRust.into())
 451            .set_indent_level(6),
 452        ListEntry::new(Label::new("target").color(LabelColor::Hidden))
 453            .set_left_icon(Icon::Folder.into())
 454            .set_indent_level(1),
 455        ListEntry::new(Label::new(".dockerignore"))
 456            .set_left_icon(Icon::FileGeneric.into())
 457            .set_indent_level(1),
 458        ListEntry::new(Label::new(".DS_Store").color(LabelColor::Hidden))
 459            .set_left_icon(Icon::FileGeneric.into())
 460            .set_indent_level(1),
 461        ListEntry::new(Label::new("Cargo.lock"))
 462            .set_left_icon(Icon::FileLock.into())
 463            .set_indent_level(1),
 464        ListEntry::new(Label::new("Cargo.toml"))
 465            .set_left_icon(Icon::FileToml.into())
 466            .set_indent_level(1),
 467        ListEntry::new(Label::new("Dockerfile"))
 468            .set_left_icon(Icon::FileGeneric.into())
 469            .set_indent_level(1),
 470        ListEntry::new(Label::new("Procfile"))
 471            .set_left_icon(Icon::FileGeneric.into())
 472            .set_indent_level(1),
 473        ListEntry::new(Label::new("README.md"))
 474            .set_left_icon(Icon::FileDoc.into())
 475            .set_indent_level(1),
 476    ]
 477    .into_iter()
 478    .map(From::from)
 479    .collect()
 480}
 481
 482pub fn static_project_panel_single_items<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
 483    vec![
 484        ListEntry::new(Label::new("todo.md"))
 485            .set_left_icon(Icon::FileDoc.into())
 486            .set_indent_level(0),
 487        ListEntry::new(Label::new("README.md"))
 488            .set_left_icon(Icon::FileDoc.into())
 489            .set_indent_level(0),
 490        ListEntry::new(Label::new("config.json"))
 491            .set_left_icon(Icon::FileGeneric.into())
 492            .set_indent_level(0),
 493    ]
 494    .into_iter()
 495    .map(From::from)
 496    .collect()
 497}
 498
 499pub fn static_collab_panel_current_call<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
 500    vec![
 501        ListEntry::new(Label::new("as-cii")).set_left_avatar("http://github.com/as-cii.png?s=50"),
 502        ListEntry::new(Label::new("nathansobo"))
 503            .set_left_avatar("http://github.com/nathansobo.png?s=50"),
 504        ListEntry::new(Label::new("maxbrunsfeld"))
 505            .set_left_avatar("http://github.com/maxbrunsfeld.png?s=50"),
 506    ]
 507    .into_iter()
 508    .map(From::from)
 509    .collect()
 510}
 511
 512pub fn static_collab_panel_channels<S: 'static + Send + Sync + Clone>() -> Vec<ListItem<S>> {
 513    vec![
 514        ListEntry::new(Label::new("zed"))
 515            .set_left_icon(Icon::Hash.into())
 516            .set_size(ListEntrySize::Medium)
 517            .set_indent_level(0),
 518        ListEntry::new(Label::new("community"))
 519            .set_left_icon(Icon::Hash.into())
 520            .set_size(ListEntrySize::Medium)
 521            .set_indent_level(1),
 522        ListEntry::new(Label::new("dashboards"))
 523            .set_left_icon(Icon::Hash.into())
 524            .set_size(ListEntrySize::Medium)
 525            .set_indent_level(2),
 526        ListEntry::new(Label::new("feedback"))
 527            .set_left_icon(Icon::Hash.into())
 528            .set_size(ListEntrySize::Medium)
 529            .set_indent_level(2),
 530        ListEntry::new(Label::new("teams-in-channels-alpha"))
 531            .set_left_icon(Icon::Hash.into())
 532            .set_size(ListEntrySize::Medium)
 533            .set_indent_level(2),
 534        ListEntry::new(Label::new("current-projects"))
 535            .set_left_icon(Icon::Hash.into())
 536            .set_size(ListEntrySize::Medium)
 537            .set_indent_level(1),
 538        ListEntry::new(Label::new("codegen"))
 539            .set_left_icon(Icon::Hash.into())
 540            .set_size(ListEntrySize::Medium)
 541            .set_indent_level(2),
 542        ListEntry::new(Label::new("gpui2"))
 543            .set_left_icon(Icon::Hash.into())
 544            .set_size(ListEntrySize::Medium)
 545            .set_indent_level(2),
 546        ListEntry::new(Label::new("livestreaming"))
 547            .set_left_icon(Icon::Hash.into())
 548            .set_size(ListEntrySize::Medium)
 549            .set_indent_level(2),
 550        ListEntry::new(Label::new("open-source"))
 551            .set_left_icon(Icon::Hash.into())
 552            .set_size(ListEntrySize::Medium)
 553            .set_indent_level(2),
 554        ListEntry::new(Label::new("replace"))
 555            .set_left_icon(Icon::Hash.into())
 556            .set_size(ListEntrySize::Medium)
 557            .set_indent_level(2),
 558        ListEntry::new(Label::new("semantic-index"))
 559            .set_left_icon(Icon::Hash.into())
 560            .set_size(ListEntrySize::Medium)
 561            .set_indent_level(2),
 562        ListEntry::new(Label::new("vim"))
 563            .set_left_icon(Icon::Hash.into())
 564            .set_size(ListEntrySize::Medium)
 565            .set_indent_level(2),
 566        ListEntry::new(Label::new("web-tech"))
 567            .set_left_icon(Icon::Hash.into())
 568            .set_size(ListEntrySize::Medium)
 569            .set_indent_level(2),
 570    ]
 571    .into_iter()
 572    .map(From::from)
 573    .collect()
 574}
 575
 576pub fn example_editor_actions<S: 'static + Send + Sync + Clone>() -> Vec<PaletteItem<S>> {
 577    vec![
 578        PaletteItem::new("New File").keybinding(Keybinding::new(
 579            "N".to_string(),
 580            ModifierKeys::new().command(true),
 581        )),
 582        PaletteItem::new("Open File").keybinding(Keybinding::new(
 583            "O".to_string(),
 584            ModifierKeys::new().command(true),
 585        )),
 586        PaletteItem::new("Save File").keybinding(Keybinding::new(
 587            "S".to_string(),
 588            ModifierKeys::new().command(true),
 589        )),
 590        PaletteItem::new("Cut").keybinding(Keybinding::new(
 591            "X".to_string(),
 592            ModifierKeys::new().command(true),
 593        )),
 594        PaletteItem::new("Copy").keybinding(Keybinding::new(
 595            "C".to_string(),
 596            ModifierKeys::new().command(true),
 597        )),
 598        PaletteItem::new("Paste").keybinding(Keybinding::new(
 599            "V".to_string(),
 600            ModifierKeys::new().command(true),
 601        )),
 602        PaletteItem::new("Undo").keybinding(Keybinding::new(
 603            "Z".to_string(),
 604            ModifierKeys::new().command(true),
 605        )),
 606        PaletteItem::new("Redo").keybinding(Keybinding::new(
 607            "Z".to_string(),
 608            ModifierKeys::new().command(true).shift(true),
 609        )),
 610        PaletteItem::new("Find").keybinding(Keybinding::new(
 611            "F".to_string(),
 612            ModifierKeys::new().command(true),
 613        )),
 614        PaletteItem::new("Replace").keybinding(Keybinding::new(
 615            "R".to_string(),
 616            ModifierKeys::new().command(true),
 617        )),
 618        PaletteItem::new("Jump to Line"),
 619        PaletteItem::new("Select All"),
 620        PaletteItem::new("Deselect All"),
 621        PaletteItem::new("Switch Document"),
 622        PaletteItem::new("Insert Line Below"),
 623        PaletteItem::new("Insert Line Above"),
 624        PaletteItem::new("Move Line Up"),
 625        PaletteItem::new("Move Line Down"),
 626        PaletteItem::new("Toggle Comment"),
 627        PaletteItem::new("Delete Line"),
 628    ]
 629}
 630
 631pub fn empty_editor_example(cx: &mut WindowContext) -> EditorPane {
 632    EditorPane::new(
 633        cx,
 634        static_tabs_example(),
 635        PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
 636        vec![],
 637        empty_buffer_example(),
 638    )
 639}
 640
 641pub fn empty_buffer_example<S: 'static + Send + Sync + Clone>() -> Buffer<S> {
 642    Buffer::new().set_rows(Some(BufferRows::default()))
 643}
 644
 645pub fn hello_world_rust_editor_example(cx: &mut WindowContext) -> EditorPane {
 646    let color = ThemeColor::new(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: color.syntax.keyword,
 656            },
 657            HighlightedText {
 658                text: "main".to_string(),
 659                color: color.syntax.function,
 660            },
 661        ])],
 662        hello_world_rust_buffer_example(&color),
 663    )
 664}
 665
 666pub fn hello_world_rust_buffer_example<S: 'static + Send + Sync + Clone>(
 667    color: &ThemeColor,
 668) -> Buffer<S> {
 669    Buffer::new()
 670        .set_title("hello_world.rs".to_string())
 671        .set_path("src/hello_world.rs".to_string())
 672        .set_language("rust".to_string())
 673        .set_rows(Some(BufferRows {
 674            show_line_numbers: true,
 675            rows: hello_world_rust_buffer_rows(color),
 676        }))
 677}
 678
 679pub fn hello_world_rust_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
 680    let show_line_number = true;
 681
 682    vec![
 683        BufferRow {
 684            line_number: 1,
 685            code_action: false,
 686            current: true,
 687            line: Some(HighlightedLine {
 688                highlighted_texts: vec![
 689                    HighlightedText {
 690                        text: "fn ".to_string(),
 691                        color: color.syntax.keyword,
 692                    },
 693                    HighlightedText {
 694                        text: "main".to_string(),
 695                        color: color.syntax.function,
 696                    },
 697                    HighlightedText {
 698                        text: "() {".to_string(),
 699                        color: color.text,
 700                    },
 701                ],
 702            }),
 703            cursors: None,
 704            status: GitStatus::None,
 705            show_line_number,
 706        },
 707        BufferRow {
 708            line_number: 2,
 709            code_action: false,
 710            current: false,
 711            line: Some(HighlightedLine {
 712                highlighted_texts: vec![HighlightedText {
 713                    text: "    // Statements here are executed when the compiled binary is called."
 714                        .to_string(),
 715                    color: color.syntax.comment,
 716                }],
 717            }),
 718            cursors: None,
 719            status: GitStatus::None,
 720            show_line_number,
 721        },
 722        BufferRow {
 723            line_number: 3,
 724            code_action: false,
 725            current: false,
 726            line: None,
 727            cursors: None,
 728            status: GitStatus::None,
 729            show_line_number,
 730        },
 731        BufferRow {
 732            line_number: 4,
 733            code_action: false,
 734            current: false,
 735            line: Some(HighlightedLine {
 736                highlighted_texts: vec![HighlightedText {
 737                    text: "    // Print text to the console.".to_string(),
 738                    color: color.syntax.comment,
 739                }],
 740            }),
 741            cursors: None,
 742            status: GitStatus::None,
 743            show_line_number,
 744        },
 745        BufferRow {
 746            line_number: 5,
 747            code_action: false,
 748            current: false,
 749            line: Some(HighlightedLine {
 750                highlighted_texts: vec![
 751                    HighlightedText {
 752                        text: "    println!(".to_string(),
 753                        color: color.text,
 754                    },
 755                    HighlightedText {
 756                        text: "\"Hello, world!\"".to_string(),
 757                        color: color.syntax.string,
 758                    },
 759                    HighlightedText {
 760                        text: ");".to_string(),
 761                        color: color.text,
 762                    },
 763                ],
 764            }),
 765            cursors: None,
 766            status: GitStatus::None,
 767            show_line_number,
 768        },
 769        BufferRow {
 770            line_number: 6,
 771            code_action: false,
 772            current: false,
 773            line: Some(HighlightedLine {
 774                highlighted_texts: vec![HighlightedText {
 775                    text: "}".to_string(),
 776                    color: color.text,
 777                }],
 778            }),
 779            cursors: None,
 780            status: GitStatus::None,
 781            show_line_number,
 782        },
 783    ]
 784}
 785
 786pub fn hello_world_rust_editor_with_status_example(cx: &mut WindowContext) -> EditorPane {
 787    let color = ThemeColor::new(cx);
 788
 789    EditorPane::new(
 790        cx,
 791        static_tabs_example(),
 792        PathBuf::from_str("crates/ui/src/static_data.rs").unwrap(),
 793        vec![Symbol(vec![
 794            HighlightedText {
 795                text: "fn ".to_string(),
 796                color: color.syntax.keyword,
 797            },
 798            HighlightedText {
 799                text: "main".to_string(),
 800                color: color.syntax.function,
 801            },
 802        ])],
 803        hello_world_rust_buffer_with_status_example(&color),
 804    )
 805}
 806
 807pub fn hello_world_rust_buffer_with_status_example<S: 'static + Send + Sync + Clone>(
 808    color: &ThemeColor,
 809) -> Buffer<S> {
 810    Buffer::new()
 811        .set_title("hello_world.rs".to_string())
 812        .set_path("src/hello_world.rs".to_string())
 813        .set_language("rust".to_string())
 814        .set_rows(Some(BufferRows {
 815            show_line_numbers: true,
 816            rows: hello_world_rust_with_status_buffer_rows(color),
 817        }))
 818}
 819
 820pub fn hello_world_rust_with_status_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
 821    let show_line_number = true;
 822
 823    vec![
 824        BufferRow {
 825            line_number: 1,
 826            code_action: false,
 827            current: true,
 828            line: Some(HighlightedLine {
 829                highlighted_texts: vec![
 830                    HighlightedText {
 831                        text: "fn ".to_string(),
 832                        color: color.syntax.keyword,
 833                    },
 834                    HighlightedText {
 835                        text: "main".to_string(),
 836                        color: color.syntax.function,
 837                    },
 838                    HighlightedText {
 839                        text: "() {".to_string(),
 840                        color: color.text,
 841                    },
 842                ],
 843            }),
 844            cursors: None,
 845            status: GitStatus::None,
 846            show_line_number,
 847        },
 848        BufferRow {
 849            line_number: 2,
 850            code_action: false,
 851            current: false,
 852            line: Some(HighlightedLine {
 853                highlighted_texts: vec![HighlightedText {
 854                    text: "// Statements here are executed when the compiled binary is called."
 855                        .to_string(),
 856                    color: color.syntax.comment,
 857                }],
 858            }),
 859            cursors: None,
 860            status: GitStatus::Modified,
 861            show_line_number,
 862        },
 863        BufferRow {
 864            line_number: 3,
 865            code_action: false,
 866            current: false,
 867            line: None,
 868            cursors: None,
 869            status: GitStatus::None,
 870            show_line_number,
 871        },
 872        BufferRow {
 873            line_number: 4,
 874            code_action: false,
 875            current: false,
 876            line: Some(HighlightedLine {
 877                highlighted_texts: vec![HighlightedText {
 878                    text: "    // Print text to the console.".to_string(),
 879                    color: color.syntax.comment,
 880                }],
 881            }),
 882            cursors: None,
 883            status: GitStatus::None,
 884            show_line_number,
 885        },
 886        BufferRow {
 887            line_number: 5,
 888            code_action: false,
 889            current: false,
 890            line: Some(HighlightedLine {
 891                highlighted_texts: vec![
 892                    HighlightedText {
 893                        text: "    println!(".to_string(),
 894                        color: color.text,
 895                    },
 896                    HighlightedText {
 897                        text: "\"Hello, world!\"".to_string(),
 898                        color: color.syntax.string,
 899                    },
 900                    HighlightedText {
 901                        text: ");".to_string(),
 902                        color: color.text,
 903                    },
 904                ],
 905            }),
 906            cursors: None,
 907            status: GitStatus::None,
 908            show_line_number,
 909        },
 910        BufferRow {
 911            line_number: 6,
 912            code_action: false,
 913            current: false,
 914            line: Some(HighlightedLine {
 915                highlighted_texts: vec![HighlightedText {
 916                    text: "}".to_string(),
 917                    color: color.text,
 918                }],
 919            }),
 920            cursors: None,
 921            status: GitStatus::None,
 922            show_line_number,
 923        },
 924        BufferRow {
 925            line_number: 7,
 926            code_action: false,
 927            current: false,
 928            line: Some(HighlightedLine {
 929                highlighted_texts: vec![HighlightedText {
 930                    text: "".to_string(),
 931                    color: color.text,
 932                }],
 933            }),
 934            cursors: None,
 935            status: GitStatus::Created,
 936            show_line_number,
 937        },
 938        BufferRow {
 939            line_number: 8,
 940            code_action: false,
 941            current: false,
 942            line: Some(HighlightedLine {
 943                highlighted_texts: vec![HighlightedText {
 944                    text: "// Marshall and Nate were here".to_string(),
 945                    color: color.syntax.comment,
 946                }],
 947            }),
 948            cursors: None,
 949            status: GitStatus::Created,
 950            show_line_number,
 951        },
 952    ]
 953}
 954
 955pub fn terminal_buffer<S: 'static + Send + Sync + Clone>(color: &ThemeColor) -> Buffer<S> {
 956    Buffer::new()
 957        .set_title("zed — fish".to_string())
 958        .set_rows(Some(BufferRows {
 959            show_line_numbers: false,
 960            rows: terminal_buffer_rows(color),
 961        }))
 962}
 963
 964pub fn terminal_buffer_rows(color: &ThemeColor) -> Vec<BufferRow> {
 965    let show_line_number = false;
 966
 967    vec![
 968        BufferRow {
 969            line_number: 1,
 970            code_action: false,
 971            current: false,
 972            line: Some(HighlightedLine {
 973                highlighted_texts: vec![
 974                    HighlightedText {
 975                        text: "maxdeviant ".to_string(),
 976                        color: color.syntax.keyword,
 977                    },
 978                    HighlightedText {
 979                        text: "in ".to_string(),
 980                        color: color.text,
 981                    },
 982                    HighlightedText {
 983                        text: "profaned-capital ".to_string(),
 984                        color: color.syntax.function,
 985                    },
 986                    HighlightedText {
 987                        text: "in ".to_string(),
 988                        color: color.text,
 989                    },
 990                    HighlightedText {
 991                        text: "~/p/zed ".to_string(),
 992                        color: color.syntax.function,
 993                    },
 994                    HighlightedText {
 995                        text: "on ".to_string(),
 996                        color: color.text,
 997                    },
 998                    HighlightedText {
 999                        text: " gpui2-ui ".to_string(),
1000                        color: color.syntax.keyword,
1001                    },
1002                ],
1003            }),
1004            cursors: None,
1005            status: GitStatus::None,
1006            show_line_number,
1007        },
1008        BufferRow {
1009            line_number: 2,
1010            code_action: false,
1011            current: false,
1012            line: Some(HighlightedLine {
1013                highlighted_texts: vec![HighlightedText {
1014                    text: "λ ".to_string(),
1015                    color: color.syntax.string,
1016                }],
1017            }),
1018            cursors: None,
1019            status: GitStatus::None,
1020            show_line_number,
1021        },
1022    ]
1023}