storybook2.rs

  1#![allow(dead_code, unused_variables)]
  2
  3mod assets;
  4mod stories;
  5mod story_selector;
  6
  7use std::sync::Arc;
  8
  9use clap::Parser;
 10use gpui::{
 11    div, px, size, AnyView, AppContext, Bounds, Div, Render, ViewContext, VisualContext,
 12    WindowBounds, WindowOptions,
 13};
 14use log::LevelFilter;
 15use settings2::{default_settings, Settings, SettingsStore};
 16use simplelog::SimpleLogger;
 17use theme2::{ThemeRegistry, ThemeSettings};
 18use ui::prelude::*;
 19
 20use crate::assets::Assets;
 21use crate::story_selector::StorySelector;
 22
 23// gpui::actions! {
 24//     storybook,
 25//     [ToggleInspector]
 26// }
 27
 28#[derive(Parser)]
 29#[command(author, version, about, long_about = None)]
 30struct Args {
 31    #[arg(value_enum)]
 32    story: Option<StorySelector>,
 33
 34    /// The name of the theme to use in the storybook.
 35    ///
 36    /// If not provided, the default theme will be used.
 37    #[arg(long)]
 38    theme: Option<String>,
 39}
 40
 41fn main() {
 42    // unsafe { backtrace_on_stack_overflow::enable() };
 43
 44    SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger");
 45
 46    let args = Args::parse();
 47
 48    let story_selector = args.story.clone();
 49    let theme_name = args.theme.unwrap_or("One Dark".to_string());
 50
 51    let asset_source = Arc::new(Assets);
 52    gpui::App::production(asset_source).run(move |cx| {
 53        load_embedded_fonts(cx).unwrap();
 54
 55        let mut store = SettingsStore::default();
 56        store
 57            .set_default_settings(default_settings().as_ref(), cx)
 58            .unwrap();
 59        cx.set_global(store);
 60
 61        theme2::init(theme2::LoadThemes::All, cx);
 62
 63        let selector = story_selector.unwrap_or(StorySelector::KitchenSink);
 64
 65        let theme_registry = cx.global::<ThemeRegistry>();
 66        let mut theme_settings = ThemeSettings::get_global(cx).clone();
 67        theme_settings.active_theme = theme_registry.get(&theme_name).unwrap();
 68        ThemeSettings::override_global(theme_settings, cx);
 69
 70        language::init(cx);
 71        editor::init(cx);
 72
 73        let window = cx.open_window(
 74            WindowOptions {
 75                bounds: WindowBounds::Fixed(Bounds {
 76                    origin: Default::default(),
 77                    size: size(px(1500.), px(780.)).into(),
 78                }),
 79                ..Default::default()
 80            },
 81            move |cx| {
 82                let ui_font_size = ThemeSettings::get_global(cx).ui_font_size;
 83                cx.set_rem_size(ui_font_size);
 84
 85                cx.build_view(|cx| StoryWrapper::new(selector.story(cx)))
 86            },
 87        );
 88
 89        cx.activate(true);
 90    });
 91}
 92
 93#[derive(Clone)]
 94pub struct StoryWrapper {
 95    story: AnyView,
 96}
 97
 98impl StoryWrapper {
 99    pub(crate) fn new(story: AnyView) -> Self {
100        Self { story }
101    }
102}
103
104impl Render for StoryWrapper {
105    type Element = Div;
106
107    fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
108        div()
109            .flex()
110            .flex_col()
111            .size_full()
112            .font("Zed Mono")
113            .child(self.story.clone())
114    }
115}
116
117fn load_embedded_fonts(cx: &AppContext) -> gpui::Result<()> {
118    let font_paths = cx.asset_source().list("fonts")?;
119    let mut embedded_fonts = Vec::new();
120    for font_path in font_paths {
121        if font_path.ends_with(".ttf") {
122            let font_bytes = cx.asset_source().load(&font_path)?.to_vec();
123            embedded_fonts.push(Arc::from(font_bytes));
124        }
125    }
126
127    cx.text_system().add_fonts(&embedded_fonts)
128}