From e84b8747a14f9d386e4a49ab0faa8cefc5b44b44 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Wed, 4 Oct 2023 13:33:28 -0400 Subject: [PATCH] Add storybook CLI --- crates/storybook2/src/storybook2.rs | 103 +++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 18 deletions(-) diff --git a/crates/storybook2/src/storybook2.rs b/crates/storybook2/src/storybook2.rs index 5745f209cf..16a3e04fe0 100644 --- a/crates/storybook2/src/storybook2.rs +++ b/crates/storybook2/src/storybook2.rs @@ -1,12 +1,5 @@ #![allow(dead_code, unused_variables)] -use assets::Assets; -use gpui3::{px, size, Bounds, WindowBounds, WindowOptions}; -use log::LevelFilter; -use simplelog::SimpleLogger; -use std::sync::Arc; -use workspace::workspace; - mod assets; mod collab_panel; mod stories; @@ -17,33 +10,107 @@ mod themes; mod ui; mod workspace; +use std::sync::Arc; + +use clap::Parser; +use gpui3::{ + div, px, size, view, Bounds, Context, Element, ViewContext, WindowBounds, WindowOptions, +}; +use log::LevelFilter; +use simplelog::SimpleLogger; + +use crate::assets::Assets; +use crate::story_selector::StorySelector; +use crate::theme::themed; +use crate::themes::rose_pine_dawn; +use crate::ui::prelude::*; +use crate::workspace::workspace; + // gpui2::actions! { // storybook, // [ToggleInspector] // } +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +struct Args { + #[arg(value_enum)] + story: Option, + + /// The name of the theme to use in the storybook. + /// + /// If not provided, the default theme will be used. + #[arg(long)] + theme: Option, +} + fn main() { // unsafe { backtrace_on_stack_overflow::enable() }; SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger"); + let args = Args::parse(); + + let story_selector = args.story.clone(); + let asset_source = Arc::new(Assets); - gpui3::App::production(asset_source).run(|cx| { - let window = cx.open_window( - WindowOptions { - bounds: WindowBounds::Fixed(Bounds { - origin: Default::default(), - size: size(px(800.), px(600.)), - }), - ..Default::default() - }, - |cx| workspace(cx), - ); + gpui3::App::production(asset_source).run(move |cx| { + match story_selector { + Some(selector) => { + let window = cx.open_window( + WindowOptions { + bounds: WindowBounds::Fixed(Bounds { + origin: Default::default(), + size: size(px(800.), px(600.)), + }), + ..Default::default() + }, + move |cx| { + view( + cx.entity(|cx| StoryWrapper::new(selector)), + StoryWrapper::render, + ) + }, + ); + } + None => { + let window = cx.open_window( + WindowOptions { + bounds: WindowBounds::Fixed(Bounds { + origin: Default::default(), + size: size(px(800.), px(600.)), + }), + ..Default::default() + }, + |cx| workspace(cx), + ); + } + }; cx.activate(true); }); } +pub struct StoryWrapper { + selector: StorySelector, +} + +impl StoryWrapper { + pub(crate) fn new(selector: StorySelector) -> Self { + Self { selector } + } + + fn render(&mut self, cx: &mut ViewContext) -> impl Element { + themed(rose_pine_dawn(), cx, |cx| { + div() + .flex() + .flex_col() + .h_full() + .child_any(self.selector.story()) + }) + } +} + // fn load_embedded_fonts(platform: &dyn gpui2::Platform) { // let font_paths = Assets.list("fonts"); // let mut embedded_fonts = Vec::new();