language_selector.rs

 1use crate::prelude::*;
 2use crate::{OrderMethod, Palette, PaletteItem};
 3
 4#[derive(RenderOnce)]
 5pub struct LanguageSelector {
 6    id: ElementId,
 7}
 8
 9impl<V: 'static> Component<V> for LanguageSelector {
10    type Rendered = Stateful<V, Div<V>>;
11
12    fn render(self, view: &mut V, cx: &mut ViewContext<V>) -> Self::Rendered {
13        div().id(self.id.clone()).child(
14            Palette::new("palette")
15                .items(vec![
16                    PaletteItem::new("C"),
17                    PaletteItem::new("C++"),
18                    PaletteItem::new("CSS"),
19                    PaletteItem::new("Elixir"),
20                    PaletteItem::new("Elm"),
21                    PaletteItem::new("ERB"),
22                    PaletteItem::new("Rust (current)"),
23                    PaletteItem::new("Scheme"),
24                    PaletteItem::new("TOML"),
25                    PaletteItem::new("TypeScript"),
26                ])
27                .placeholder("Select a language...")
28                .empty_string("No matches")
29                .default_order(OrderMethod::Ascending),
30        )
31    }
32}
33
34impl LanguageSelector {
35    pub fn new(id: impl Into<ElementId>) -> Self {
36        Self { id: id.into() }
37    }
38
39    fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Element<V> {
40        div().id(self.id.clone()).child(
41            Palette::new("palette")
42                .items(vec![
43                    PaletteItem::new("C"),
44                    PaletteItem::new("C++"),
45                    PaletteItem::new("CSS"),
46                    PaletteItem::new("Elixir"),
47                    PaletteItem::new("Elm"),
48                    PaletteItem::new("ERB"),
49                    PaletteItem::new("Rust (current)"),
50                    PaletteItem::new("Scheme"),
51                    PaletteItem::new("TOML"),
52                    PaletteItem::new("TypeScript"),
53                ])
54                .placeholder("Select a language...")
55                .empty_string("No matches")
56                .default_order(OrderMethod::Ascending),
57        )
58    }
59}
60
61use gpui::{Div, RenderOnce, Stateful};
62#[cfg(feature = "stories")]
63pub use stories::*;
64
65#[cfg(feature = "stories")]
66mod stories {
67    use super::*;
68    use crate::Story;
69    use gpui::{Div, Render};
70
71    pub struct LanguageSelectorStory;
72
73    impl Render<Self> for LanguageSelectorStory {
74        type Element = Div<Self>;
75
76        fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
77            Story::container(cx)
78                .child(Story::title_for::<_, LanguageSelector>(cx))
79                .child(Story::label(cx, "Default"))
80                .child(LanguageSelector::new("language-selector"))
81        }
82    }
83}