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}