Files
zed/crates/settings_ui/examples/ui.rs
Mikayla Maki 0e0f48d8e1 Introduce SettingsField type to the settings UI (#38921)
Release Notes:

- N/A

---------

Co-authored-by: Nathan Sobo <nathan@zed.dev>
Co-authored-by: Anthony Eid <hello@anthonyeid.me>
Co-authored-by: Ben Kunkle <ben@zed.dev>
2025-09-26 01:08:55 +00:00

114 lines
3.5 KiB
Rust

use std::sync::Arc;
use futures::StreamExt;
use gpui::AppContext as _;
use settings::{DEFAULT_KEYMAP_PATH, KeymapFile, SettingsStore, watch_config_file};
use settings_ui::open_settings_editor;
use ui::BorrowAppContext;
fn merge_paths(a: &std::path::Path, b: &std::path::Path) -> std::path::PathBuf {
let a_parts: Vec<_> = a.components().collect();
let b_parts: Vec<_> = b.components().collect();
let mut overlap = 0;
for i in 0..=a_parts.len().min(b_parts.len()) {
if a_parts[a_parts.len() - i..] == b_parts[..i] {
overlap = i;
}
}
let mut result = std::path::PathBuf::new();
for part in &a_parts {
result.push(part.as_os_str());
}
for part in &b_parts[overlap..] {
result.push(part.as_os_str());
}
result
}
fn main() {
zlog::init();
zlog::init_output_stderr();
let [crate_path, file_path] = [env!("CARGO_MANIFEST_DIR"), file!()].map(std::path::Path::new);
let example_dir_abs_path = merge_paths(crate_path, file_path)
.parent()
.unwrap()
.to_path_buf();
let app = gpui::Application::new().with_assets(assets::Assets);
let fs = Arc::new(fs::RealFs::new(None, app.background_executor()));
let mut user_settings_file_rx = watch_config_file(
&app.background_executor(),
fs.clone(),
paths::settings_file().clone(),
);
app.run(move |cx| {
<dyn fs::Fs>::set_global(fs.clone(), cx);
settings::init(cx);
settings_ui::init(cx);
theme::init(theme::LoadThemes::JustBase, cx);
client::init_settings(cx);
workspace::init_settings(cx);
// production client because fake client requires gpui/test-support
// and that causes issues with the real stuff we want to do
let client = client::Client::production(cx);
let user_store = cx.new(|cx| client::UserStore::new(client.clone(), cx));
let languages = Arc::new(language::LanguageRegistry::new(
cx.background_executor().clone(),
));
client::init(&client, cx);
project::Project::init(&client, cx);
zlog::info!(
"Creating fake worktree in {}",
example_dir_abs_path.display(),
);
let project = project::Project::local(
client.clone(),
node_runtime::NodeRuntime::unavailable(),
user_store,
languages,
fs.clone(),
Some(Default::default()), // WARN: if None is passed here, prepare to be process bombed
cx,
);
let worktree_task = project.update(cx, |project, cx| {
project.create_worktree(example_dir_abs_path, true, cx)
});
cx.spawn(async move |_| {
let worktree = worktree_task.await.unwrap();
std::mem::forget(worktree);
})
.detach();
std::mem::forget(project);
language::init(cx);
editor::init(cx);
menu::init();
let keybindings =
KeymapFile::load_asset_allow_partial_failure(DEFAULT_KEYMAP_PATH, cx).unwrap();
cx.bind_keys(keybindings);
cx.spawn(async move |cx| {
while let Some(content) = user_settings_file_rx.next().await {
cx.update(|cx| {
cx.update_global(|store: &mut SettingsStore, cx| {
store.set_user_settings(&content, cx).unwrap()
})
})
.ok();
}
})
.detach();
open_settings_editor(cx).unwrap();
cx.activate(true);
});
}