diff --git a/crates/storybook2/src/stories/components.rs b/crates/storybook2/src/stories/components.rs index d4f3ae10b9..44d6f41c16 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 multi_buffer; pub mod palette; pub mod panel; pub mod project_panel; diff --git a/crates/storybook2/src/stories/components/multi_buffer.rs b/crates/storybook2/src/stories/components/multi_buffer.rs new file mode 100644 index 0000000000..d4b0c7fdb5 --- /dev/null +++ b/crates/storybook2/src/stories/components/multi_buffer.rs @@ -0,0 +1,34 @@ +use std::marker::PhantomData; + +use ui::prelude::*; +use ui::{hello_world_rust_buffer_example, MultiBuffer}; + +use crate::story::Story; + +#[derive(Element)] +pub struct MultiBufferStory { + state_type: PhantomData, +} + +impl MultiBufferStory { + pub fn new() -> Self { + Self { + state_type: PhantomData, + } + } + + fn render(&mut self, cx: &mut ViewContext) -> impl Element { + let theme = theme(cx); + + Story::container(cx) + .child(Story::title_for::<_, MultiBuffer>(cx)) + .child(Story::label(cx, "Default")) + .child(MultiBuffer::new(vec![ + hello_world_rust_buffer_example(&theme), + hello_world_rust_buffer_example(&theme), + hello_world_rust_buffer_example(&theme), + hello_world_rust_buffer_example(&theme), + hello_world_rust_buffer_example(&theme), + ])) + } +} diff --git a/crates/storybook2/src/story_selector.rs b/crates/storybook2/src/story_selector.rs index 89c762316e..18c678fbec 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, + MultiBuffer, Palette, Panel, ProjectPanel, @@ -76,6 +77,7 @@ 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::MultiBuffer => components::multi_buffer::MultiBufferStory::new().into_any(), Self::Palette => components::palette::PaletteStory::new().into_any(), Self::Panel => components::panel::PanelStory::new().into_any(), Self::ProjectPanel => components::project_panel::ProjectPanelStory::new().into_any(), diff --git a/crates/ui2/src/components.rs b/crates/ui2/src/components.rs index a913a9e2f8..ec8dc73ced 100644 --- a/crates/ui2/src/components.rs +++ b/crates/ui2/src/components.rs @@ -10,6 +10,7 @@ mod facepile; mod icon_button; mod keybinding; mod list; +mod multi_buffer; mod palette; mod panel; mod panes; @@ -37,6 +38,7 @@ pub use facepile::*; pub use icon_button::*; pub use keybinding::*; pub use list::*; +pub use multi_buffer::*; pub use palette::*; pub use panel::*; pub use panes::*; diff --git a/crates/ui2/src/components/multi_buffer.rs b/crates/ui2/src/components/multi_buffer.rs new file mode 100644 index 0000000000..8c6fac0601 --- /dev/null +++ b/crates/ui2/src/components/multi_buffer.rs @@ -0,0 +1,42 @@ +use std::marker::PhantomData; + +use crate::prelude::*; +use crate::{v_stack, Buffer, Icon, IconButton, Label, LabelSize}; + +#[derive(Element)] +pub struct MultiBuffer { + state_type: PhantomData, + buffers: Vec>, +} + +impl MultiBuffer { + pub fn new(buffers: Vec>) -> Self { + Self { + state_type: PhantomData, + buffers, + } + } + + fn render(&mut self, cx: &mut ViewContext) -> impl Element { + let theme = theme(cx); + + v_stack() + .w_full() + .h_full() + .flex_1() + .children(self.buffers.clone().into_iter().map(|buffer| { + v_stack() + .child( + div() + .flex() + .items_center() + .justify_between() + .p_4() + .fill(theme.lowest.base.default.background) + .child(Label::new("main.rs").size(LabelSize::Small)) + .child(IconButton::new(Icon::ArrowUpRight)), + ) + .child(buffer) + })) + } +}