component_preview.rs

  1//! Component Preview Example
  2//!
  3//! Run with: `cargo run -p component_preview --example component_preview"`
  4use fs::RealFs;
  5use gpui::{AppContext as _, Bounds, KeyBinding, WindowBounds, WindowOptions, actions, size};
  6
  7use client::{Client, UserStore};
  8use language::LanguageRegistry;
  9use node_runtime::NodeRuntime;
 10use project::Project;
 11use reqwest_client::ReqwestClient;
 12use session::{AppSession, Session};
 13use std::sync::Arc;
 14use ui::{App, px};
 15use workspace::{AppState, Workspace, WorkspaceStore};
 16
 17use component_preview::{ComponentPreview, init};
 18
 19actions!(zed, [Quit]);
 20
 21fn quit(_: &Quit, cx: &mut App) {
 22    cx.quit();
 23}
 24
 25fn main() {
 26    gpui_platform::application().run(|cx| {
 27        component::init();
 28
 29        cx.on_action(quit);
 30        cx.bind_keys([KeyBinding::new("cmd-q", Quit, None)]);
 31        let version = release_channel::AppVersion::load(env!("CARGO_PKG_VERSION"), None, None);
 32        release_channel::init(version, cx);
 33
 34        let http_client =
 35            ReqwestClient::user_agent("component_preview").expect("Failed to create HTTP client");
 36        cx.set_http_client(Arc::new(http_client));
 37
 38        let fs = Arc::new(RealFs::new(None, cx.background_executor().clone()));
 39        <dyn fs::Fs>::set_global(fs.clone(), cx);
 40
 41        settings::init(cx);
 42        theme_settings::init(theme::LoadThemes::JustBase, cx);
 43
 44        let languages = Arc::new(LanguageRegistry::new(cx.background_executor().clone()));
 45        let client = Client::production(cx);
 46        client::init(&client, cx);
 47
 48        let user_store = cx.new(|cx| UserStore::new(client.clone(), cx));
 49        let workspace_store = cx.new(|cx| WorkspaceStore::new(client.clone(), cx));
 50        let session_id = uuid::Uuid::new_v4().to_string();
 51        let kvp = db::kvp::KeyValueStore::global(cx);
 52        let session = cx
 53            .foreground_executor()
 54            .block_on(Session::new(session_id, kvp));
 55        let session = cx.new(|cx| AppSession::new(session, cx));
 56        let node_runtime = NodeRuntime::unavailable();
 57
 58        let app_state = Arc::new(AppState {
 59            languages,
 60            client,
 61            user_store,
 62            workspace_store,
 63            fs,
 64            build_window_options: |_, _| Default::default(),
 65            node_runtime,
 66            session,
 67        });
 68        AppState::set_global(app_state.clone(), cx);
 69
 70        workspace::init(app_state.clone(), cx);
 71        init(app_state.clone(), cx);
 72
 73        let size = size(px(1200.), px(800.));
 74        let bounds = Bounds::centered(None, size, cx);
 75
 76        cx.open_window(
 77            WindowOptions {
 78                window_bounds: Some(WindowBounds::Windowed(bounds)),
 79                ..Default::default()
 80            },
 81            {
 82                move |window, cx| {
 83                    let app_state = app_state;
 84                    theme_settings::setup_ui_font(window, cx);
 85
 86                    let project = Project::local(
 87                        app_state.client.clone(),
 88                        app_state.node_runtime.clone(),
 89                        app_state.user_store.clone(),
 90                        app_state.languages.clone(),
 91                        app_state.fs.clone(),
 92                        None,
 93                        project::LocalProjectFlags {
 94                            init_worktree_trust: false,
 95                            ..Default::default()
 96                        },
 97                        cx,
 98                    );
 99
100                    let workspace = cx.new(|cx| {
101                        Workspace::new(
102                            Default::default(),
103                            project.clone(),
104                            app_state.clone(),
105                            window,
106                            cx,
107                        )
108                    });
109
110                    workspace.update(cx, |workspace, cx| {
111                        let weak_workspace = cx.entity().downgrade();
112                        let language_registry = app_state.languages.clone();
113                        let user_store = app_state.user_store.clone();
114
115                        let component_preview = cx.new(|cx| {
116                            ComponentPreview::new(
117                                weak_workspace,
118                                project,
119                                language_registry,
120                                user_store,
121                                None,
122                                None,
123                                window,
124                                cx,
125                            )
126                            .expect("Failed to create component preview")
127                        });
128
129                        workspace.add_item_to_active_pane(
130                            Box::new(component_preview),
131                            None,
132                            true,
133                            window,
134                            cx,
135                        );
136                    });
137
138                    workspace
139                }
140            },
141        )
142        .expect("Failed to open component preview window");
143
144        cx.activate(true);
145    });
146}