diff --git a/crates/story/examples/description_list.rs b/crates/story/src/description_list_story.rs similarity index 81% rename from crates/story/examples/description_list.rs rename to crates/story/src/description_list_story.rs index 9916923b..9fa292e1 100644 --- a/crates/story/examples/description_list.rs +++ b/crates/story/src/description_list_story.rs @@ -1,29 +1,33 @@ use gpui::*; +use gpui::{ + Action, App, AppContext, Axis, Context, Entity, FocusHandle, Focusable, IntoElement, + ParentElement, Render, Styled, Window, +}; use gpui_component::{ button::Button, checkbox::Checkbox, description_list::{DescriptionItem, DescriptionList}, - h_flex, - popup_menu::PopupMenuExt as _, + dock::PanelControl, text::TextView, - v_flex, AxisExt, Sizable as _, Size, + v_flex, Sizable as _, Size, }; +use gpui_component::{h_flex, popup_menu::PopupMenuExt as _, AxisExt}; use serde::Deserialize; -use story::Assets; #[derive(Action, Clone, PartialEq, Eq, Deserialize)] -#[action(namespace = example, no_json)] +#[action(namespace = description_list_story, no_json)] struct ChangeSize(Size); -pub struct Example { +pub struct DescriptionListStory { + focus_handle: gpui::FocusHandle, layout: Axis, bordered: bool, size: Size, items: Vec<(&'static str, &'static str, usize)>, } -impl Example { - pub fn new(_: &mut Window, _: &mut Context) -> Self { +impl DescriptionListStory { + fn new(_: &mut Window, cx: &mut Context) -> Self { let items = vec![ ("Name", "GPUI Component", 1), ( @@ -62,10 +66,11 @@ impl Example { bordered: true, size: Size::default(), layout: Axis::Horizontal, + focus_handle: cx.focus_handle(), } } - fn view(window: &mut Window, cx: &mut App) -> Entity { + pub fn view(window: &mut Window, cx: &mut App) -> Entity { cx.new(|cx| Self::new(window, cx)) } @@ -85,8 +90,32 @@ impl Example { } } -impl Render for Example { - fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { +impl super::Story for DescriptionListStory { + fn title() -> &'static str { + "DescriptionList" + } + + fn description() -> &'static str { + "Use to display details with a tidy layout." + } + + fn new_view(window: &mut Window, cx: &mut App) -> Entity { + Self::view(window, cx) + } + + fn zoomable() -> Option { + None + } +} + +impl Focusable for DescriptionListStory { + fn focus_handle(&self, _: &App) -> FocusHandle { + self.focus_handle.clone() + } +} + +impl Render for DescriptionListStory { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { v_flex() .id("example") .on_action(cx.listener(Self::on_change_size)) @@ -163,14 +192,3 @@ impl Render for Example { ) } } - -fn main() { - let app = Application::new().with_assets(Assets); - - app.run(move |cx| { - story::init(cx); - cx.activate(true); - - story::create_new_window("Description List Example", Example::view, cx); - }); -} diff --git a/crates/story/src/lib.rs b/crates/story/src/lib.rs index 8cdc4380..2c8c217f 100644 --- a/crates/story/src/lib.rs +++ b/crates/story/src/lib.rs @@ -10,6 +10,7 @@ mod checkbox_story; mod clipboard_story; mod color_picker_story; mod date_picker_story; +mod description_list_story; mod drawer_story; mod dropdown_story; mod form_story; @@ -62,6 +63,7 @@ pub use checkbox_story::CheckboxStory; pub use clipboard_story::ClipboardStory; pub use color_picker_story::ColorPickerStory; pub use date_picker_story::DatePickerStory; +pub use description_list_story::DescriptionListStory; pub use drawer_story::DrawerStory; pub use dropdown_story::DropdownStory; pub use form_story::FormStory; diff --git a/crates/story/src/main.rs b/crates/story/src/main.rs index 4cbf3b86..6a67da0c 100644 --- a/crates/story/src/main.rs +++ b/crates/story/src/main.rs @@ -48,6 +48,7 @@ impl Gallery { StoryContainer::panel::(window, cx), StoryContainer::panel::(window, cx), StoryContainer::panel::(window, cx), + StoryContainer::panel::(window, cx), StoryContainer::panel::(window, cx), StoryContainer::panel::(window, cx), StoryContainer::panel::(window, cx),