diff --git a/crates/settings_content/src/background_image.rs b/crates/settings_content/src/background_image.rs index 87f8081971..f40c102c96 100644 --- a/crates/settings_content/src/background_image.rs +++ b/crates/settings_content/src/background_image.rs @@ -4,9 +4,9 @@ use settings_macros::MergeFrom; /// Determines how the workspace background image is fitted into the window bounds. /// -/// Default: cover #[derive( Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom, + strum::VariantArray, strum::VariantNames, )] #[serde(rename_all = "snake_case")] pub enum BackgroundImageFit { diff --git a/crates/settings_ui/src/page_data.rs b/crates/settings_ui/src/page_data.rs index 5d3a5f7ce9..62ce3b3230 100644 --- a/crates/settings_ui/src/page_data.rs +++ b/crates/settings_ui/src/page_data.rs @@ -1530,6 +1530,69 @@ fn appearance_page() -> SettingsPage { ] } + fn background_image_section() -> [SettingsPageItem; 4] { + [ + SettingsPageItem::SectionHeader("Background Image"), + SettingsPageItem::SettingItem(SettingItem { + title: "Image Path", + description: "Path to the image displayed behind the workspace UI. `~` and environment variables are expanded. Leave empty to disable.", + field: Box::new(SettingField { + organization_override: None, + json_path: Some("background.path"), + pick: |settings_content| { + settings_content.background.as_ref()?.path.as_ref() + }, + write: |settings_content, value, _| { + settings_content + .background + .get_or_insert_default() + .path = value; + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Fit", + description: "How the image is fitted into the workspace bounds.", + field: Box::new(SettingField { + organization_override: None, + json_path: Some("background.fit"), + pick: |settings_content| { + settings_content.background.as_ref()?.fit.as_ref() + }, + write: |settings_content, value, _| { + settings_content + .background + .get_or_insert_default() + .fit = value; + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Opacity", + description: "Opacity of the background image, between 0.0 (fully transparent) and 1.0 (fully opaque).", + field: Box::new(SettingField { + organization_override: None, + json_path: Some("background.opacity"), + pick: |settings_content| { + settings_content.background.as_ref()?.opacity.as_ref() + }, + write: |settings_content, value, _| { + settings_content + .background + .get_or_insert_default() + .opacity = value; + }, + }), + metadata: None, + files: USER, + }), + ] + } + let items: Box<[SettingsPageItem]> = concat_sections!( theme_section(), buffer_font_section(), @@ -1540,6 +1603,7 @@ fn appearance_page() -> SettingsPage { cursor_section(), highlighting_section(), guides_section(), + background_image_section(), ); SettingsPage { diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index eee5c6e3ec..ed0e6403cc 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -674,6 +674,7 @@ fn init_renderers(cx: &mut App) { .add_basic_renderer::(render_input_audio_device_dropdown) .add_basic_renderer::(render_output_audio_device_dropdown) .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) // please semicolon stay on next line ; }