From 15f634f8cc3d4a9960eb14184f6d0325181920d4 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 26 Aug 2025 12:00:10 -0400 Subject: [PATCH] Move keymap editor into it's own crate and create settings ui crate We also change the structure of the settings ui macro. The trait is still a requirement on the Settings trait implementation, but it returns a SettingUIItemVariant now, which the settings ui crate will take adventage of to generate UI This allows us to get around circular dependency errors and still get the type system to ensure all settings fulfill the settings UI crate Co-authored-by: Ben Kunkle --- Cargo.lock | 66 ++++++++++------- Cargo.toml | 8 ++- crates/agent_servers/src/settings.rs | 2 +- crates/agent_settings/src/agent_settings.rs | 2 +- crates/agent_ui/src/slash_command_settings.rs | 2 +- crates/audio/src/audio_settings.rs | 2 +- crates/auto_update/src/auto_update.rs | 2 +- crates/call/src/call_settings.rs | 2 +- crates/client/src/client.rs | 2 +- crates/collab_ui/src/panel_settings.rs | 2 +- crates/dap/src/debugger_settings.rs | 2 +- crates/editor/src/editor_settings.rs | 2 +- .../extension_host/src/extension_settings.rs | 2 +- .../file_finder/src/file_finder_settings.rs | 2 +- crates/git_hosting_providers/src/settings.rs | 2 +- crates/git_ui/src/git_panel_settings.rs | 2 +- crates/go_to_line/src/cursor_position.rs | 2 +- .../image_viewer/src/image_viewer_settings.rs | 2 +- crates/journal/src/journal.rs | 2 +- crates/keymap_editor/Cargo.toml | 55 ++++++++++++++ crates/keymap_editor/LICENSE-GPL | 1 + .../src/keymap_editor.rs} | 4 +- .../src/ui_components/keystroke_input.rs | 0 .../src/ui_components/mod.rs | 0 .../src/ui_components/table.rs | 0 crates/language/src/language_settings.rs | 3 +- crates/language_models/src/settings.rs | 2 +- .../src/outline_panel_settings.rs | 2 +- crates/project/src/project.rs | 2 +- crates/project/src/project_settings.rs | 2 +- .../src/project_panel_settings.rs | 2 +- crates/recent_projects/src/ssh_connections.rs | 2 +- crates/repl/src/jupyter_settings.rs | 2 +- crates/settings/src/settings.rs | 6 +- crates/settings/src/settings_store.rs | 4 +- crates/settings/src/settings_ui.rs | 72 +++++++++++++++++++ crates/settings_ui/Cargo.toml | 39 +++------- crates/settings_ui/src/settings_ui.rs | 4 -- crates/terminal/src/terminal_settings.rs | 2 +- crates/theme/src/settings.rs | 4 +- crates/title_bar/Cargo.toml | 2 +- crates/title_bar/src/title_bar.rs | 6 +- crates/title_bar/src/title_bar_settings.rs | 2 +- crates/vim/src/vim.rs | 2 +- .../vim_mode_setting/src/vim_mode_setting.rs | 2 +- crates/workspace/src/item.rs | 2 +- crates/workspace/src/workspace_settings.rs | 2 +- crates/worktree/src/worktree_settings.rs | 2 +- crates/zed/Cargo.toml | 1 + crates/zed/src/main.rs | 1 + crates/zed/src/zed.rs | 2 +- crates/zed/src/zed/app_menus.rs | 3 +- crates/zlog_settings/src/zlog_settings.rs | 2 +- 53 files changed, 234 insertions(+), 111 deletions(-) create mode 100644 crates/keymap_editor/Cargo.toml create mode 120000 crates/keymap_editor/LICENSE-GPL rename crates/{settings_ui/src/keybindings.rs => keymap_editor/src/keymap_editor.rs} (99%) rename crates/{settings_ui => keymap_editor}/src/ui_components/keystroke_input.rs (100%) rename crates/{settings_ui => keymap_editor}/src/ui_components/mod.rs (100%) rename crates/{settings_ui => keymap_editor}/src/ui_components/table.rs (100%) create mode 100644 crates/settings/src/settings_ui.rs diff --git a/Cargo.lock b/Cargo.lock index 5b3ac97f36..ffbc1d7ee1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8953,6 +8953,46 @@ dependencies = [ "uuid", ] +[[package]] +name = "keymap_editor" +version = "0.1.0" +dependencies = [ + "anyhow", + "collections", + "command_palette", + "command_palette_hooks", + "component", + "db", + "editor", + "feature_flags", + "fs", + "fuzzy", + "gpui", + "itertools 0.14.0", + "language", + "log", + "menu", + "notifications", + "paths", + "project", + "search", + "serde", + "serde_json", + "settings", + "telemetry", + "tempfile", + "theme", + "tree-sitter-json", + "tree-sitter-rust", + "ui", + "ui_input", + "util", + "vim", + "workspace", + "workspace-hack", + "zed_actions", +] + [[package]] name = "khronos-egl" version = "6.0.0" @@ -14892,39 +14932,16 @@ name = "settings_ui" version = "0.1.0" dependencies = [ "anyhow", - "collections", "command_palette", "command_palette_hooks", - "component", - "db", "editor", "feature_flags", - "fs", - "fuzzy", "gpui", - "itertools 0.14.0", - "language", - "log", - "menu", - "notifications", - "paths", - "project", - "search", - "serde", - "serde_json", "settings", - "telemetry", - "tempfile", "theme", - "tree-sitter-json", - "tree-sitter-rust", "ui", - "ui_input", "util", - "vim", "workspace", - "workspace-hack", - "zed_actions", ] [[package]] @@ -16749,6 +16766,7 @@ dependencies = [ "db", "gpui", "http_client", + "keymap_editor", "notifications", "pretty_assertions", "project", @@ -16757,7 +16775,6 @@ dependencies = [ "schemars", "serde", "settings", - "settings_ui", "smallvec", "story", "telemetry", @@ -20469,6 +20486,7 @@ dependencies = [ "itertools 0.14.0", "jj_ui", "journal", + "keymap_editor", "language", "language_extension", "language_model", diff --git a/Cargo.toml b/Cargo.toml index 6ecca122a9..7be525cd6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,6 +54,8 @@ members = [ "crates/deepseek", "crates/diagnostics", "crates/docs_preprocessor", + "crates/edit_prediction", + "crates/edit_prediction_button", "crates/editor", "crates/eval", "crates/explorer_command_injector", @@ -82,13 +84,12 @@ members = [ "crates/http_client_tls", "crates/icons", "crates/image_viewer", - "crates/edit_prediction", - "crates/edit_prediction_button", "crates/inspector_ui", "crates/install_cli", "crates/jj", "crates/jj_ui", "crates/journal", + "crates/keymap_editor", "crates/language", "crates/language_extension", "crates/language_model", @@ -157,9 +158,9 @@ members = [ "crates/streaming_diff", "crates/sum_tree", "crates/supermaven", - "crates/system_specs", "crates/supermaven_api", "crates/svg_preview", + "crates/system_specs", "crates/tab_switcher", "crates/task", "crates/tasks_ui", @@ -315,6 +316,7 @@ install_cli = { path = "crates/install_cli" } jj = { path = "crates/jj" } jj_ui = { path = "crates/jj_ui" } journal = { path = "crates/journal" } +keymap_editor = { path = "crates/keymap_editor" } language = { path = "crates/language" } language_extension = { path = "crates/language_extension" } language_model = { path = "crates/language_model" } diff --git a/crates/agent_servers/src/settings.rs b/crates/agent_servers/src/settings.rs index c89d2b54a6..916ff72baf 100644 --- a/crates/agent_servers/src/settings.rs +++ b/crates/agent_servers/src/settings.rs @@ -4,7 +4,7 @@ use collections::HashMap; use gpui::{App, SharedString}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; pub fn init(cx: &mut App) { AllAgentServersSettings::register(cx); diff --git a/crates/agent_settings/src/agent_settings.rs b/crates/agent_settings/src/agent_settings.rs index dc57d6ebf0..82be85be07 100644 --- a/crates/agent_settings/src/agent_settings.rs +++ b/crates/agent_settings/src/agent_settings.rs @@ -8,7 +8,7 @@ use gpui::{App, Pixels, SharedString}; use language_model::LanguageModel; use schemars::{JsonSchema, json_schema}; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use std::borrow::Cow; pub use crate::agent_profile::*; diff --git a/crates/agent_ui/src/slash_command_settings.rs b/crates/agent_ui/src/slash_command_settings.rs index a81188b7f2..dbc4c9c27c 100644 --- a/crates/agent_ui/src/slash_command_settings.rs +++ b/crates/agent_ui/src/slash_command_settings.rs @@ -2,7 +2,7 @@ use anyhow::Result; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; /// Settings for slash commands. #[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema, SettingsUI)] diff --git a/crates/audio/src/audio_settings.rs b/crates/audio/src/audio_settings.rs index 9eb61d537f..bb5f975c3c 100644 --- a/crates/audio/src/audio_settings.rs +++ b/crates/audio/src/audio_settings.rs @@ -2,7 +2,7 @@ use anyhow::Result; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUI)] pub struct AudioSettings { diff --git a/crates/auto_update/src/auto_update.rs b/crates/auto_update/src/auto_update.rs index b7824f1ae9..58522d3941 100644 --- a/crates/auto_update/src/auto_update.rs +++ b/crates/auto_update/src/auto_update.rs @@ -10,7 +10,7 @@ use paths::remote_servers_dir; use release_channel::{AppCommitSha, ReleaseChannel}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources, SettingsStore}; +use settings::{SettingsUI, Settings, SettingsSources, SettingsStore}; use smol::{fs, io::AsyncReadExt}; use smol::{fs::File, process::Command}; use std::{ diff --git a/crates/call/src/call_settings.rs b/crates/call/src/call_settings.rs index 4280134c6e..d3c867b199 100644 --- a/crates/call/src/call_settings.rs +++ b/crates/call/src/call_settings.rs @@ -2,7 +2,7 @@ use anyhow::Result; use gpui::App; use schemars::JsonSchema; use serde_derive::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Deserialize, Debug, SettingsUI)] pub struct CallSettings { diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index 4f3e7cfd4e..dc106382a0 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -31,7 +31,7 @@ use release_channel::{AppVersion, ReleaseChannel}; use rpc::proto::{AnyTypedEnvelope, EnvelopedMessage, PeerId, RequestMessage}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use std::{ any::TypeId, convert::TryFrom, diff --git a/crates/collab_ui/src/panel_settings.rs b/crates/collab_ui/src/panel_settings.rs index 7952e950b3..92815dcf9f 100644 --- a/crates/collab_ui/src/panel_settings.rs +++ b/crates/collab_ui/src/panel_settings.rs @@ -1,7 +1,7 @@ use gpui::Pixels; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use workspace::dock::DockPosition; #[derive(Deserialize, Debug, SettingsUI)] diff --git a/crates/dap/src/debugger_settings.rs b/crates/dap/src/debugger_settings.rs index ee7b7b47f6..bef7157eba 100644 --- a/crates/dap/src/debugger_settings.rs +++ b/crates/dap/src/debugger_settings.rs @@ -2,7 +2,7 @@ use dap_types::SteppingGranularity; use gpui::{App, Global}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[serde(rename_all = "snake_case")] diff --git a/crates/editor/src/editor_settings.rs b/crates/editor/src/editor_settings.rs index 4641dbe7fa..5e1675d23e 100644 --- a/crates/editor/src/editor_settings.rs +++ b/crates/editor/src/editor_settings.rs @@ -6,7 +6,7 @@ use language::CursorShape; use project::project_settings::DiagnosticSeverity; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources, VsCodeSettings}; +use settings::{SettingsUI, Settings, SettingsSources, VsCodeSettings}; use util::serde::default_true; /// Imports from the VSCode settings at diff --git a/crates/extension_host/src/extension_settings.rs b/crates/extension_host/src/extension_settings.rs index e6246311d1..51ac489ef7 100644 --- a/crates/extension_host/src/extension_settings.rs +++ b/crates/extension_host/src/extension_settings.rs @@ -3,7 +3,7 @@ use collections::HashMap; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use std::sync::Arc; #[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema, SettingsUI)] diff --git a/crates/file_finder/src/file_finder_settings.rs b/crates/file_finder/src/file_finder_settings.rs index cb08c04156..6066397e52 100644 --- a/crates/file_finder/src/file_finder_settings.rs +++ b/crates/file_finder/src/file_finder_settings.rs @@ -1,7 +1,7 @@ use anyhow::Result; use schemars::JsonSchema; use serde_derive::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Deserialize, Debug, Clone, Copy, PartialEq, SettingsUI)] pub struct FileFinderSettings { diff --git a/crates/git_hosting_providers/src/settings.rs b/crates/git_hosting_providers/src/settings.rs index 64265f4d35..76fd386d5b 100644 --- a/crates/git_hosting_providers/src/settings.rs +++ b/crates/git_hosting_providers/src/settings.rs @@ -5,7 +5,7 @@ use git::GitHostingProviderRegistry; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsStore}; +use settings::{SettingsUI, Settings, SettingsStore}; use url::Url; use util::ResultExt as _; diff --git a/crates/git_ui/src/git_panel_settings.rs b/crates/git_ui/src/git_panel_settings.rs index 0d8b852663..21f40f4a34 100644 --- a/crates/git_ui/src/git_panel_settings.rs +++ b/crates/git_ui/src/git_panel_settings.rs @@ -2,7 +2,7 @@ use editor::ShowScrollbar; use gpui::Pixels; use schemars::JsonSchema; use serde_derive::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use workspace::dock::DockPosition; #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] diff --git a/crates/go_to_line/src/cursor_position.rs b/crates/go_to_line/src/cursor_position.rs index 4537dfe7cc..4913b4901f 100644 --- a/crates/go_to_line/src/cursor_position.rs +++ b/crates/go_to_line/src/cursor_position.rs @@ -2,7 +2,7 @@ use editor::{Editor, EditorSettings, MultiBufferSnapshot}; use gpui::{App, Entity, FocusHandle, Focusable, Subscription, Task, WeakEntity}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use std::{fmt::Write, num::NonZeroU32, time::Duration}; use text::{Point, Selection}; use ui::{ diff --git a/crates/image_viewer/src/image_viewer_settings.rs b/crates/image_viewer/src/image_viewer_settings.rs index 1ce9971f9d..2adeb5d616 100644 --- a/crates/image_viewer/src/image_viewer_settings.rs +++ b/crates/image_viewer/src/image_viewer_settings.rs @@ -1,7 +1,7 @@ use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; /// The settings for the image viewer. #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, Default, SettingsUI)] diff --git a/crates/journal/src/journal.rs b/crates/journal/src/journal.rs index 38545c3b7c..6d18b304b2 100644 --- a/crates/journal/src/journal.rs +++ b/crates/journal/src/journal.rs @@ -5,7 +5,7 @@ use editor::{Editor, SelectionEffects}; use gpui::{App, AppContext as _, Context, Window, actions}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use std::{ fs::OpenOptions, path::{Path, PathBuf}, diff --git a/crates/keymap_editor/Cargo.toml b/crates/keymap_editor/Cargo.toml new file mode 100644 index 0000000000..03098d5506 --- /dev/null +++ b/crates/keymap_editor/Cargo.toml @@ -0,0 +1,55 @@ +[package] +name = "keymap_editor" +version = "0.1.0" +edition.workspace = true +publish.workspace = true +license = "GPL-3.0-or-later" + +[lints] +workspace = true + +[lib] +path = "src/keymap_editor.rs" + +[dependencies] +anyhow.workspace = true +collections.workspace = true +command_palette.workspace = true +command_palette_hooks.workspace = true +component.workspace = true +db.workspace = true +editor.workspace = true +feature_flags.workspace = true +fs.workspace = true +fuzzy.workspace = true +gpui.workspace = true +itertools.workspace = true +language.workspace = true +log.workspace = true +menu.workspace = true +notifications.workspace = true +paths.workspace = true +project.workspace = true +search.workspace = true +serde.workspace = true +serde_json.workspace = true +settings.workspace = true +telemetry.workspace = true +tempfile.workspace = true +theme.workspace = true +tree-sitter-json.workspace = true +tree-sitter-rust.workspace = true +ui.workspace = true +ui_input.workspace = true +util.workspace = true +vim.workspace = true +workspace-hack.workspace = true +workspace.workspace = true +zed_actions.workspace = true + +[dev-dependencies] +db = {"workspace"= true, "features" = ["test-support"]} +fs = { workspace = true, features = ["test-support"] } +gpui = { workspace = true, features = ["test-support"] } +project = { workspace = true, features = ["test-support"] } +workspace = { workspace = true, features = ["test-support"] } diff --git a/crates/keymap_editor/LICENSE-GPL b/crates/keymap_editor/LICENSE-GPL new file mode 120000 index 0000000000..89e542f750 --- /dev/null +++ b/crates/keymap_editor/LICENSE-GPL @@ -0,0 +1 @@ +../../LICENSE-GPL \ No newline at end of file diff --git a/crates/settings_ui/src/keybindings.rs b/crates/keymap_editor/src/keymap_editor.rs similarity index 99% rename from crates/settings_ui/src/keybindings.rs rename to crates/keymap_editor/src/keymap_editor.rs index 9c76725972..3c67610aeb 100644 --- a/crates/settings_ui/src/keybindings.rs +++ b/crates/keymap_editor/src/keymap_editor.rs @@ -1,3 +1,5 @@ +mod ui_components; + use std::{ cmp::{self}, ops::{Not as _, Range}, @@ -35,7 +37,7 @@ use workspace::{ }; use crate::{ - keybindings::persistence::KEYBINDING_EDITORS, + persistence::KEYBINDING_EDITORS, ui_components::{ keystroke_input::{ClearKeystrokes, KeystrokeInput, StartRecording, StopRecording}, table::{ColumnWidths, ResizeBehavior, Table, TableInteractionState}, diff --git a/crates/settings_ui/src/ui_components/keystroke_input.rs b/crates/keymap_editor/src/ui_components/keystroke_input.rs similarity index 100% rename from crates/settings_ui/src/ui_components/keystroke_input.rs rename to crates/keymap_editor/src/ui_components/keystroke_input.rs diff --git a/crates/settings_ui/src/ui_components/mod.rs b/crates/keymap_editor/src/ui_components/mod.rs similarity index 100% rename from crates/settings_ui/src/ui_components/mod.rs rename to crates/keymap_editor/src/ui_components/mod.rs diff --git a/crates/settings_ui/src/ui_components/table.rs b/crates/keymap_editor/src/ui_components/table.rs similarity index 100% rename from crates/settings_ui/src/ui_components/table.rs rename to crates/keymap_editor/src/ui_components/table.rs diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index ab4ee967b8..6e08ca49e1 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -17,8 +17,7 @@ use serde::{ }; use settings::{ - DeriveSettingsUI as SettingsUI, ParameterizedJsonSchema, Settings, SettingsLocation, - SettingsSources, SettingsStore, + ParameterizedJsonSchema, Settings, SettingsLocation, SettingsSources, SettingsStore, SettingsUI, }; use shellexpand; use std::{borrow::Cow, num::NonZeroU32, path::Path, slice, sync::Arc}; diff --git a/crates/language_models/src/settings.rs b/crates/language_models/src/settings.rs index 147d4bee5d..172fcf6446 100644 --- a/crates/language_models/src/settings.rs +++ b/crates/language_models/src/settings.rs @@ -5,7 +5,7 @@ use collections::HashMap; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use crate::provider::{ self, diff --git a/crates/outline_panel/src/outline_panel_settings.rs b/crates/outline_panel/src/outline_panel_settings.rs index b34946e643..9d46fac0c4 100644 --- a/crates/outline_panel/src/outline_panel_settings.rs +++ b/crates/outline_panel/src/outline_panel_settings.rs @@ -2,7 +2,7 @@ use editor::ShowScrollbar; use gpui::Pixels; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, Copy, PartialEq)] #[serde(rename_all = "snake_case")] diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 9d34feb9e0..48e75c8095 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -948,7 +948,7 @@ pub enum PulledDiagnostics { /// Whether to disable all AI features in Zed. /// /// Default: false -#[derive(Copy, Clone, Debug, settings::DeriveSettingsUI)] +#[derive(Copy, Clone, Debug, settings::SettingsUI)] pub struct DisableAiSettings { pub disable_ai: bool, } diff --git a/crates/project/src/project_settings.rs b/crates/project/src/project_settings.rs index beab54cd2d..132c3cc5ab 100644 --- a/crates/project/src/project_settings.rs +++ b/crates/project/src/project_settings.rs @@ -18,7 +18,7 @@ use rpc::{ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::{ - DeriveSettingsUI as SettingsUI, InvalidSettingsError, LocalSettingsKind, Settings, + SettingsUI, InvalidSettingsError, LocalSettingsKind, Settings, SettingsLocation, SettingsSources, SettingsStore, parse_json_with_comments, watch_config_file, }; use std::{ diff --git a/crates/project_panel/src/project_panel_settings.rs b/crates/project_panel/src/project_panel_settings.rs index a64fe41191..531136e699 100644 --- a/crates/project_panel/src/project_panel_settings.rs +++ b/crates/project_panel/src/project_panel_settings.rs @@ -2,7 +2,7 @@ use editor::ShowScrollbar; use gpui::Pixels; use schemars::JsonSchema; use serde_derive::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, Copy, PartialEq)] #[serde(rename_all = "snake_case")] diff --git a/crates/recent_projects/src/ssh_connections.rs b/crates/recent_projects/src/ssh_connections.rs index fa82536f57..9544d1aae1 100644 --- a/crates/recent_projects/src/ssh_connections.rs +++ b/crates/recent_projects/src/ssh_connections.rs @@ -19,7 +19,7 @@ use remote::ssh_session::{ConnectionIdentifier, SshPortForwardOption}; use remote::{SshConnectionOptions, SshPlatform, SshRemoteClient}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use theme::ThemeSettings; use ui::{ ActiveTheme, Color, Context, Icon, IconName, IconSize, InteractiveElement, IntoElement, Label, diff --git a/crates/repl/src/jupyter_settings.rs b/crates/repl/src/jupyter_settings.rs index 2d1ee7bd84..4dcb3bb603 100644 --- a/crates/repl/src/jupyter_settings.rs +++ b/crates/repl/src/jupyter_settings.rs @@ -4,7 +4,7 @@ use editor::EditorSettings; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Debug, Default, SettingsUI)] pub struct JupyterSettings { diff --git a/crates/settings/src/settings.rs b/crates/settings/src/settings.rs index 7df274d23d..aa2af3ac99 100644 --- a/crates/settings/src/settings.rs +++ b/crates/settings/src/settings.rs @@ -5,6 +5,7 @@ mod keymap_file; mod settings_file; mod settings_json; mod settings_store; +mod settings_ui; mod vscode_import; use gpui::{App, Global}; @@ -23,10 +24,11 @@ pub use settings_file::*; pub use settings_json::*; pub use settings_store::{ InvalidSettingsError, LocalSettingsKind, Settings, SettingsLocation, SettingsSources, - SettingsStore, SettingsUI, + SettingsStore, }; +pub use settings_ui::*; // Re-export the derive macro -pub use settings_ui_macros::SettingsUI as DeriveSettingsUI; +pub use settings_ui_macros::SettingsUI; pub use vscode_import::{VsCodeSettings, VsCodeSettingsSource}; #[derive(Clone, Debug, PartialEq)] diff --git a/crates/settings/src/settings_store.rs b/crates/settings/src/settings_store.rs index 58da654b0e..fe921112b8 100644 --- a/crates/settings/src/settings_store.rs +++ b/crates/settings/src/settings_store.rs @@ -32,11 +32,9 @@ pub type EditorconfigProperties = ec4rs::Properties; use crate::{ ActiveSettingsProfileName, ParameterizedJsonSchema, SettingsJsonSchemaParams, VsCodeSettings, - WorktreeId, parse_json_with_comments, update_value_in_json_text, + WorktreeId, parse_json_with_comments, settings_ui::SettingsUI, update_value_in_json_text, }; -pub trait SettingsUI {} - /// A value that can be defined as a user setting. /// /// Settings can be loaded from a combination of multiple JSON files. diff --git a/crates/settings/src/settings_ui.rs b/crates/settings/src/settings_ui.rs new file mode 100644 index 0000000000..5150e41cf0 --- /dev/null +++ b/crates/settings/src/settings_ui.rs @@ -0,0 +1,72 @@ +use std::any::Any; + +use gpui::{AnyElement, App, Window}; + +pub trait SettingsUI { + fn ui_item() -> SettingsUIItem { + SettingsUIItem { + item: SettingsUIItemVariant::None, + } + } +} + +pub struct SettingsUIItem { + // TODO: + // path: SmallVec<[&'static str; 8]>, + pub item: SettingsUIItemVariant, +} + +pub enum SettingsUIItemVariant { + Group(SettingsUIItemGroup), + Item(SettingsUIItemSingle), + // TODO: remove + None, +} + +pub struct SettingsUIItemGroup { + pub items: Vec, +} + +pub enum SettingsUIItemSingle { + // TODO: default/builtin variants + Custom(Box AnyElement>), +} + +/* NOTES: + +# Root Group +some_setting: { + # First Item + # this shouldn't be a group + # it should just be item with path "some_bool.enabled" and title "Some Bool" + "some_bool": { + # this should + enabled: true | false + } + # Second Item + "some_other_thing": "foo" | "bar" | "baz" +} + +Structure: +Group { + path: "some_item", + items: [ + Item( + path: ["some_bool", "enabled"], + ), + Item( + path: ["some_other_thing"], + ) + ] +} + +is the following better than "foo.enabled"? +- for objects with single key "enabled", should just be a bool, with no "enabled" +for objects with enabled and other settings, enabled should be implicit, +so +"vim": false, # disabled +"vim": true, # enabled with default settings +"vim": { + "default_mode": "HelixNormal" +} # enabled with custom settings +*/ diff --git a/crates/settings_ui/Cargo.toml b/crates/settings_ui/Cargo.toml index 8a151359ec..9c3866e228 100644 --- a/crates/settings_ui/Cargo.toml +++ b/crates/settings_ui/Cargo.toml @@ -11,45 +11,24 @@ workspace = true [lib] path = "src/settings_ui.rs" +[features] +default = [] + [dependencies] anyhow.workspace = true -collections.workspace = true command_palette.workspace = true command_palette_hooks.workspace = true -component.workspace = true -db.workspace = true editor.workspace = true feature_flags.workspace = true -fs.workspace = true -fuzzy.workspace = true gpui.workspace = true -itertools.workspace = true -language.workspace = true -log.workspace = true -menu.workspace = true -notifications.workspace = true -paths.workspace = true -project.workspace = true -search.workspace = true -serde.workspace = true -serde_json.workspace = true -settings.workspace = true -telemetry.workspace = true -tempfile.workspace = true theme.workspace = true -tree-sitter-json.workspace = true -tree-sitter-rust.workspace = true +settings.workspace = true ui.workspace = true -ui_input.workspace = true util.workspace = true -vim.workspace = true -workspace-hack.workspace = true workspace.workspace = true -zed_actions.workspace = true -[dev-dependencies] -db = {"workspace"= true, "features" = ["test-support"]} -fs = { workspace = true, features = ["test-support"] } -gpui = { workspace = true, features = ["test-support"] } -project = { workspace = true, features = ["test-support"] } -workspace = { workspace = true, features = ["test-support"] } +# Uncomment other workspace dependencies as needed +# assistant.workspace = true +# client.workspace = true +# project.workspace = true +# settings.workspace = true diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index 3022cc7142..546f948d16 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -12,9 +12,6 @@ use workspace::{Workspace, with_active_or_new_workspace}; use crate::appearance_settings_controls::AppearanceSettingsControls; -pub mod keybindings; -pub mod ui_components; - pub struct SettingsUiFeatureFlag; impl FeatureFlag for SettingsUiFeatureFlag { @@ -76,7 +73,6 @@ pub fn init(cx: &mut App) { }) .detach(); - keybindings::init(cx); } pub struct SettingsPage { diff --git a/crates/terminal/src/terminal_settings.rs b/crates/terminal/src/terminal_settings.rs index b412c84088..7993fdef49 100644 --- a/crates/terminal/src/terminal_settings.rs +++ b/crates/terminal/src/terminal_settings.rs @@ -6,7 +6,7 @@ use gpui::{AbsoluteLength, App, FontFallbacks, FontFeatures, FontWeight, Pixels, use schemars::JsonSchema; use serde_derive::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, SettingsSources}; +use settings::{SettingsSources, SettingsUI}; use std::path::PathBuf; use task::Shell; use theme::FontFamilyName; diff --git a/crates/theme/src/settings.rs b/crates/theme/src/settings.rs index e54ee893db..339589f99e 100644 --- a/crates/theme/src/settings.rs +++ b/crates/theme/src/settings.rs @@ -13,9 +13,7 @@ use gpui::{ use refineable::Refineable; use schemars::{JsonSchema, json_schema}; use serde::{Deserialize, Serialize}; -use settings::{ - DeriveSettingsUI as SettingsUI, ParameterizedJsonSchema, Settings, SettingsSources, -}; +use settings::{ParameterizedJsonSchema, Settings, SettingsSources, SettingsUI}; use std::sync::Arc; use util::ResultExt as _; use util::schemars::replace_subschema; diff --git a/crates/title_bar/Cargo.toml b/crates/title_bar/Cargo.toml index cf178e2850..f60ac7c301 100644 --- a/crates/title_bar/Cargo.toml +++ b/crates/title_bar/Cargo.toml @@ -42,7 +42,7 @@ rpc.workspace = true schemars.workspace = true serde.workspace = true settings.workspace = true -settings_ui.workspace = true +keymap_editor.workspace = true smallvec.workspace = true story = { workspace = true, optional = true } telemetry.workspace = true diff --git a/crates/title_bar/src/title_bar.rs b/crates/title_bar/src/title_bar.rs index b84a2800b6..35e5feabfb 100644 --- a/crates/title_bar/src/title_bar.rs +++ b/crates/title_bar/src/title_bar.rs @@ -27,10 +27,10 @@ use gpui::{ IntoElement, MouseButton, ParentElement, Render, StatefulInteractiveElement, Styled, Subscription, WeakEntity, Window, actions, div, }; +use keymap_editor; use onboarding_banner::OnboardingBanner; use project::Project; use settings::Settings as _; -use settings_ui::keybindings; use std::sync::Arc; use theme::ActiveTheme; use title_bar_settings::TitleBarSettings; @@ -681,7 +681,7 @@ impl TitleBar { "Settings Profiles", zed_actions::settings_profile_selector::Toggle.boxed_clone(), ) - .action("Key Bindings", Box::new(keybindings::OpenKeymapEditor)) + .action("Key Bindings", Box::new(keymap_editor::OpenKeymapEditor)) .action( "Themes…", zed_actions::theme_selector::Toggle::default().boxed_clone(), @@ -729,7 +729,7 @@ impl TitleBar { "Settings Profiles", zed_actions::settings_profile_selector::Toggle.boxed_clone(), ) - .action("Key Bindings", Box::new(keybindings::OpenKeymapEditor)) + .action("Key Bindings", Box::new(keymap_editor::OpenKeymapEditor)) .action( "Themes…", zed_actions::theme_selector::Toggle::default().boxed_clone(), diff --git a/crates/title_bar/src/title_bar_settings.rs b/crates/title_bar/src/title_bar_settings.rs index e393ecdc9d..781900cea6 100644 --- a/crates/title_bar/src/title_bar_settings.rs +++ b/crates/title_bar/src/title_bar_settings.rs @@ -1,7 +1,7 @@ use db::anyhow; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Copy, Clone, Deserialize, Debug, SettingsUI)] pub struct TitleBarSettings { diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index fb5b5d36ff..e3ec2d414c 100644 --- a/crates/vim/src/vim.rs +++ b/crates/vim/src/vim.rs @@ -40,7 +40,7 @@ use schemars::JsonSchema; use serde::Deserialize; use serde_derive::Serialize; use settings::{ - DeriveSettingsUI as SettingsUI, Settings, SettingsSources, SettingsStore, update_settings_file, + SettingsUI, Settings, SettingsSources, SettingsStore, update_settings_file, }; use state::{Mode, Operator, RecordedSelection, SearchState, VimGlobals}; use std::{mem, ops::Range, sync::Arc}; diff --git a/crates/vim_mode_setting/src/vim_mode_setting.rs b/crates/vim_mode_setting/src/vim_mode_setting.rs index 3b25a56795..dd9f122161 100644 --- a/crates/vim_mode_setting/src/vim_mode_setting.rs +++ b/crates/vim_mode_setting/src/vim_mode_setting.rs @@ -6,7 +6,7 @@ use anyhow::Result; use gpui::App; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{Settings, SettingsSources, SettingsUI}; /// Initializes the `vim_mode_setting` crate. pub fn init(cx: &mut App) { diff --git a/crates/workspace/src/item.rs b/crates/workspace/src/item.rs index 7e52e95e68..18af720a74 100644 --- a/crates/workspace/src/item.rs +++ b/crates/workspace/src/item.rs @@ -17,7 +17,7 @@ use gpui::{ use project::{Project, ProjectEntryId, ProjectPath}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsLocation, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsLocation, SettingsSources}; use smallvec::SmallVec; use std::{ any::{Any, TypeId}, diff --git a/crates/workspace/src/workspace_settings.rs b/crates/workspace/src/workspace_settings.rs index 87d592ac54..b564ac23ad 100644 --- a/crates/workspace/src/workspace_settings.rs +++ b/crates/workspace/src/workspace_settings.rs @@ -6,7 +6,7 @@ use collections::HashMap; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; #[derive(Deserialize, SettingsUI)] pub struct WorkspaceSettings { diff --git a/crates/worktree/src/worktree_settings.rs b/crates/worktree/src/worktree_settings.rs index 4f9f7af1d4..6110b13dc1 100644 --- a/crates/worktree/src/worktree_settings.rs +++ b/crates/worktree/src/worktree_settings.rs @@ -4,7 +4,7 @@ use anyhow::Context as _; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsSources}; +use settings::{SettingsUI, Settings, SettingsSources}; use util::paths::PathMatcher; #[derive(Clone, PartialEq, Eq, SettingsUI)] diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index 6f4ead9ebb..62910089f2 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -131,6 +131,7 @@ serde_json.workspace = true session.workspace = true settings.workspace = true settings_ui.workspace = true +keymap_editor.workspace = true shellexpand.workspace = true smol.workspace = true snippet_provider.workspace = true diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index e99c8b564b..6f40b975b6 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -632,6 +632,7 @@ pub fn main() { svg_preview::init(cx); onboarding::init(cx); settings_ui::init(cx); + keymap_editor::init(cx); extensions_ui::init(cx); zeta::init(cx); inspector_ui::init(app_state.clone(), cx); diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index 1b9657dcc6..f237a17d97 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -1482,7 +1482,7 @@ fn reload_keymaps(cx: &mut App, mut user_key_bindings: Vec) { workspace::NewWindow, )]); // todo: nicer api here? - settings_ui::keybindings::KeymapEventChannel::trigger_keymap_changed(cx); + keymap_editor::KeymapEventChannel::trigger_keymap_changed(cx); } pub fn load_default_keymap(cx: &mut App) { diff --git a/crates/zed/src/zed/app_menus.rs b/crates/zed/src/zed/app_menus.rs index 6c7ab0b374..342fd26cb7 100644 --- a/crates/zed/src/zed/app_menus.rs +++ b/crates/zed/src/zed/app_menus.rs @@ -1,6 +1,5 @@ use collab_ui::collab_panel; use gpui::{Menu, MenuItem, OsAction}; -use settings_ui::keybindings; use terminal_view::terminal_panel; pub fn app_menus() -> Vec { @@ -17,7 +16,7 @@ pub fn app_menus() -> Vec { name: "Settings".into(), items: vec![ MenuItem::action("Open Settings", super::OpenSettings), - MenuItem::action("Open Key Bindings", keybindings::OpenKeymapEditor), + MenuItem::action("Open Key Bindings", keymap_editor::OpenKeymapEditor), MenuItem::action("Open Default Settings", super::OpenDefaultSettings), MenuItem::action( "Open Default Key Bindings", diff --git a/crates/zlog_settings/src/zlog_settings.rs b/crates/zlog_settings/src/zlog_settings.rs index 5aad945b9b..b75ab29d8b 100644 --- a/crates/zlog_settings/src/zlog_settings.rs +++ b/crates/zlog_settings/src/zlog_settings.rs @@ -3,7 +3,7 @@ use anyhow::Result; use gpui::App; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DeriveSettingsUI as SettingsUI, Settings, SettingsStore}; +use settings::{SettingsUI, Settings, SettingsStore}; pub fn init(cx: &mut App) { ZlogSettings::register(cx);