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}