Closes #ISSUE Initially, the `SettingsUi` trait was tied to `Settings`, however, given that the `Settings::FileContent` type (which may be the same as the type that implements `Settings`) will be the type that more directly maps to the JSON structure (and therefore have the documentation, correct field names (or `serde` rename attributes), etc) it makes more sense to have the deriving of `SettingsUi` occur on the `FileContent` type rather than the `Settings` type. In order for this to work a relatively important change had to be made to the derive macro, that being that it now "unwraps" options into their inner type, so a field with type `Option<Foo>` where `Foo: SettingsUi` will treat the field as if it were just `Foo`, expecting there to be a default set in `default.json`. This imposes some restrictions on what `Settings::FileContent` can be as seen in 1e19398 where `FileContent` itself can't be optional without manually implementing `SettingsUi`, as well as introducing some risk that if the `FileContent` type has `serde(default)`, the default value will override the default value from `default.json` in the UI even though it may differ (but it should!). A future PR should probably replace the other settings with `FileContent = Option<T>` (all of which currently have `T == bool`) with wrapper structs and have `KEY = None` so the further niceties `derive(SettingsUi)` will provide such as path renaming, custom UI, auto naming and doc comment extraction can be used. Release Notes: - N/A *or* Added/Fixed/Improved ...
109 lines
3.1 KiB
Rust
109 lines
3.1 KiB
Rust
use editor::ShowScrollbar;
|
|
use gpui::Pixels;
|
|
use schemars::JsonSchema;
|
|
use serde_derive::{Deserialize, Serialize};
|
|
use settings::{Settings, SettingsSources, SettingsUi};
|
|
use workspace::dock::DockPosition;
|
|
|
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
|
pub struct ScrollbarSettingsContent {
|
|
/// When to show the scrollbar in the git panel.
|
|
///
|
|
/// Default: inherits editor scrollbar settings
|
|
pub show: Option<Option<ShowScrollbar>>,
|
|
}
|
|
|
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
|
pub struct ScrollbarSettings {
|
|
pub show: Option<ShowScrollbar>,
|
|
}
|
|
|
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
|
#[serde(rename_all = "snake_case")]
|
|
// Style of the git status indicator in the panel.
|
|
//
|
|
// Default: icon
|
|
pub enum StatusStyleContent {
|
|
Icon,
|
|
LabelColor,
|
|
}
|
|
|
|
#[derive(Default, Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum StatusStyle {
|
|
#[default]
|
|
Icon,
|
|
LabelColor,
|
|
}
|
|
|
|
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi)]
|
|
pub struct GitPanelSettingsContent {
|
|
/// Whether to show the panel button in the status bar.
|
|
///
|
|
/// Default: true
|
|
pub button: Option<bool>,
|
|
/// Where to dock the panel.
|
|
///
|
|
/// Default: left
|
|
pub dock: Option<DockPosition>,
|
|
/// Default width of the panel in pixels.
|
|
///
|
|
/// Default: 360
|
|
pub default_width: Option<f32>,
|
|
/// How entry statuses are displayed.
|
|
///
|
|
/// Default: icon
|
|
pub status_style: Option<StatusStyle>,
|
|
/// How and when the scrollbar should be displayed.
|
|
///
|
|
/// Default: inherits editor scrollbar settings
|
|
pub scrollbar: Option<ScrollbarSettings>,
|
|
|
|
/// What the default branch name should be when
|
|
/// `init.defaultBranch` is not set in git
|
|
///
|
|
/// Default: main
|
|
pub fallback_branch_name: Option<String>,
|
|
|
|
/// Whether to sort entries in the panel by path
|
|
/// or by status (the default).
|
|
///
|
|
/// Default: false
|
|
pub sort_by_path: Option<bool>,
|
|
|
|
/// Whether to collapse untracked files in the diff panel.
|
|
///
|
|
/// Default: false
|
|
pub collapse_untracked_diff: Option<bool>,
|
|
}
|
|
|
|
#[derive(Deserialize, Debug, Clone, PartialEq)]
|
|
pub struct GitPanelSettings {
|
|
pub button: bool,
|
|
pub dock: DockPosition,
|
|
pub default_width: Pixels,
|
|
pub status_style: StatusStyle,
|
|
pub scrollbar: ScrollbarSettings,
|
|
pub fallback_branch_name: String,
|
|
pub sort_by_path: bool,
|
|
pub collapse_untracked_diff: bool,
|
|
}
|
|
|
|
impl Settings for GitPanelSettings {
|
|
const KEY: Option<&'static str> = Some("git_panel");
|
|
|
|
type FileContent = GitPanelSettingsContent;
|
|
|
|
fn load(
|
|
sources: SettingsSources<Self::FileContent>,
|
|
_: &mut gpui::App,
|
|
) -> anyhow::Result<Self> {
|
|
sources.json_merge()
|
|
}
|
|
|
|
fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) {
|
|
vscode.bool_setting("git.enabled", &mut current.button);
|
|
vscode.string_setting("git.defaultBranchName", &mut current.fallback_branch_name);
|
|
}
|
|
}
|