From 000ae27affd0ebc08fbe1c50b988f47855941e65 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Mon, 9 Oct 2023 11:39:42 -0400 Subject: [PATCH] Add `LanguageSelector` component --- crates/storybook2/src/stories/components.rs | 1 + .../stories/components/language_selector.rs | 26 ++++++++++++ crates/storybook2/src/story_selector.rs | 4 ++ crates/ui2/src/components.rs | 2 + .../ui2/src/components/language_selector.rs | 40 +++++++++++++++++++ 5 files changed, 73 insertions(+) create mode 100644 crates/storybook2/src/stories/components/language_selector.rs create mode 100644 crates/ui2/src/components/language_selector.rs diff --git a/crates/storybook2/src/stories/components.rs b/crates/storybook2/src/stories/components.rs index 44d6f41c16ab629d882df12d6f2a1166ca5f0bb0..97ca15c0c40649201fe0145a0ef56c75c2e313ba 100644 --- a/crates/storybook2/src/stories/components.rs +++ b/crates/storybook2/src/stories/components.rs @@ -7,6 +7,7 @@ pub mod command_palette; pub mod context_menu; pub mod facepile; pub mod keybinding; +pub mod language_selector; pub mod multi_buffer; pub mod palette; pub mod panel; diff --git a/crates/storybook2/src/stories/components/language_selector.rs b/crates/storybook2/src/stories/components/language_selector.rs new file mode 100644 index 0000000000000000000000000000000000000000..cd167658dc532b96f1d4df8e9694c987dc91c7c5 --- /dev/null +++ b/crates/storybook2/src/stories/components/language_selector.rs @@ -0,0 +1,26 @@ +use std::marker::PhantomData; + +use ui::prelude::*; +use ui::LanguageSelector; + +use crate::story::Story; + +#[derive(Element)] +pub struct LanguageSelectorStory { + state_type: PhantomData, +} + +impl LanguageSelectorStory { + pub fn new() -> Self { + Self { + state_type: PhantomData, + } + } + + fn render(&mut self, cx: &mut ViewContext) -> impl Element { + Story::container(cx) + .child(Story::title_for::<_, LanguageSelector>(cx)) + .child(Story::label(cx, "Default")) + .child(LanguageSelector::new()) + } +} diff --git a/crates/storybook2/src/story_selector.rs b/crates/storybook2/src/story_selector.rs index 18c678fbec266c77ec55b1d433e3431c502664ca..9e8ae772f984cadd6b6ffd556335cb51d95cf431 100644 --- a/crates/storybook2/src/story_selector.rs +++ b/crates/storybook2/src/story_selector.rs @@ -45,6 +45,7 @@ pub enum ComponentStory { ContextMenu, Facepile, Keybinding, + LanguageSelector, MultiBuffer, Palette, Panel, @@ -77,6 +78,9 @@ impl ComponentStory { Self::ContextMenu => components::context_menu::ContextMenuStory::new().into_any(), Self::Facepile => components::facepile::FacepileStory::new().into_any(), Self::Keybinding => components::keybinding::KeybindingStory::new().into_any(), + Self::LanguageSelector => { + components::language_selector::LanguageSelectorStory::new().into_any() + } Self::MultiBuffer => components::multi_buffer::MultiBufferStory::new().into_any(), Self::Palette => components::palette::PaletteStory::new().into_any(), Self::Panel => components::panel::PanelStory::new().into_any(), diff --git a/crates/ui2/src/components.rs b/crates/ui2/src/components.rs index ec8dc73ced803f76139caef64128cb88bbd69a49..185e76e749d60cc64a8f7285ea12d16da16e8f55 100644 --- a/crates/ui2/src/components.rs +++ b/crates/ui2/src/components.rs @@ -9,6 +9,7 @@ mod editor_pane; mod facepile; mod icon_button; mod keybinding; +mod language_selector; mod list; mod multi_buffer; mod palette; @@ -37,6 +38,7 @@ pub use editor_pane::*; pub use facepile::*; pub use icon_button::*; pub use keybinding::*; +pub use language_selector::*; pub use list::*; pub use multi_buffer::*; pub use palette::*; diff --git a/crates/ui2/src/components/language_selector.rs b/crates/ui2/src/components/language_selector.rs new file mode 100644 index 0000000000000000000000000000000000000000..9de9f4e8ab2bf99b120b4d49c5a767dd1857dbfe --- /dev/null +++ b/crates/ui2/src/components/language_selector.rs @@ -0,0 +1,40 @@ +use std::marker::PhantomData; + +use crate::prelude::*; +use crate::{OrderMethod, Palette, PaletteItem}; + +#[derive(Element)] +pub struct LanguageSelector { + state_type: PhantomData, + scroll_state: ScrollState, +} + +impl LanguageSelector { + pub fn new() -> Self { + Self { + state_type: PhantomData, + scroll_state: ScrollState::default(), + } + } + + fn render(&mut self, cx: &mut ViewContext) -> impl Element { + div().child( + Palette::new(self.scroll_state.clone()) + .items(vec![ + PaletteItem::new("C"), + PaletteItem::new("C++"), + PaletteItem::new("CSS"), + PaletteItem::new("Elixir"), + PaletteItem::new("Elm"), + PaletteItem::new("ERB"), + PaletteItem::new("Rust (current)"), + PaletteItem::new("Scheme"), + PaletteItem::new("TOML"), + PaletteItem::new("TypeScript"), + ]) + .placeholder("Select a language...") + .empty_string("No matches") + .default_order(OrderMethod::Ascending), + ) + } +}