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::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 session = cx.foreground_executor().block_on(Session::new(session_id));
 52        let session = cx.new(|cx| AppSession::new(session, cx));
 53        let node_runtime = NodeRuntime::unavailable();
 54
 55        let app_state = Arc::new(AppState {
 56            languages,
 57            client,
 58            user_store,
 59            workspace_store,
 60            fs,
 61            build_window_options: |_, _| Default::default(),
 62            node_runtime,
 63            session,
 64        });
 65        AppState::set_global(Arc::downgrade(&app_state), cx);
 66
 67        workspace::init(app_state.clone(), cx);
 68        init(app_state.clone(), cx);
 69
 70        let size = size(px(1200.), px(800.));
 71        let bounds = Bounds::centered(None, size, cx);
 72
 73        cx.open_window(
 74            WindowOptions {
 75                window_bounds: Some(WindowBounds::Windowed(bounds)),
 76                ..Default::default()
 77            },
 78            {
 79                move |window, cx| {
 80                    let app_state = app_state;
 81                    theme::setup_ui_font(window, cx);
 82
 83                    let project = Project::local(
 84                        app_state.client.clone(),
 85                        app_state.node_runtime.clone(),
 86                        app_state.user_store.clone(),
 87                        app_state.languages.clone(),
 88                        app_state.fs.clone(),
 89                        None,
 90                        project::LocalProjectFlags {
 91                            init_worktree_trust: false,
 92                            ..Default::default()
 93                        },
 94                        cx,
 95                    );
 96
 97                    let workspace = cx.new(|cx| {
 98                        Workspace::new(
 99                            Default::default(),
100                            project.clone(),
101                            app_state.clone(),
102                            window,
103                            cx,
104                        )
105                    });
106
107                    workspace.update(cx, |workspace, cx| {
108                        let weak_workspace = cx.entity().downgrade();
109                        let language_registry = app_state.languages.clone();
110                        let user_store = app_state.user_store.clone();
111
112                        let component_preview = cx.new(|cx| {
113                            ComponentPreview::new(
114                                weak_workspace,
115                                project,
116                                language_registry,
117                                user_store,
118                                None,
119                                None,
120                                window,
121                                cx,
122                            )
123                            .expect("Failed to create component preview")
124                        });
125
126                        workspace.add_item_to_active_pane(
127                            Box::new(component_preview),
128                            None,
129                            true,
130                            window,
131                            cx,
132                        );
133                    });
134
135                    workspace
136                }
137            },
138        )
139        .expect("Failed to open component preview window");
140
141        cx.activate(true);
142    });
143}