diff --git a/crates/settings/src/settings_content/editor.rs b/crates/settings/src/settings_content/editor.rs index 171cb874fcdea23bd51ffa453b30c6d96587fe6a..7bc447346c8a20e53640928a6ba0ca28e10d92e7 100644 --- a/crates/settings/src/settings_content/editor.rs +++ b/crates/settings/src/settings_content/editor.rs @@ -803,3 +803,28 @@ impl Display for MinimumContrast { write!(f, "{:.1}", self.0) } } + +/// Opacity of the inactive panes. 0 means transparent, 1 means opaque. +/// +/// Valid range: 0.0 to 1.0 +/// Default: 1.0 +#[derive( + Clone, + Copy, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + PartialOrd, + derive_more::FromStr, +)] +#[serde(transparent)] +pub struct InactiveOpacity(pub f32); + +impl Display for InactiveOpacity { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:.1}", self.0) + } +} diff --git a/crates/settings/src/settings_content/workspace.rs b/crates/settings/src/settings_content/workspace.rs index 21b25d6d3c47fb76e4de638519a145b5d916e555..7ebb468f79bf195fb9d97b8d52dd6e728d8c8f99 100644 --- a/crates/settings/src/settings_content/workspace.rs +++ b/crates/settings/src/settings_content/workspace.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; use settings_macros::MergeFrom; -use crate::{DockPosition, DockSide, ScrollbarSettingsContent, ShowIndentGuides}; +use crate::{DockPosition, DockSide, InactiveOpacity, ScrollbarSettingsContent, ShowIndentGuides}; #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] @@ -256,7 +256,8 @@ pub struct ActivePaneModifiers { /// Values are clamped to the [0.0, 1.0] range. /// /// Default: `1.0` - pub inactive_opacity: Option, + #[schemars(range(min = 0.0, max = 1.0))] + pub inactive_opacity: Option, } #[derive( diff --git a/crates/settings/src/vscode_import.rs b/crates/settings/src/vscode_import.rs index cc55613c63ef7d21b5f4830b0f5c6496ac1930f2..e1cce43f6227bb26a36be871c31cf1143aab5c70 100644 --- a/crates/settings/src/vscode_import.rs +++ b/crates/settings/src/vscode_import.rs @@ -843,7 +843,7 @@ impl VsCodeSettings { { Some(ActivePaneModifiers { border_size: None, - inactive_opacity: Some(opacity), + inactive_opacity: Some(InactiveOpacity(opacity)), }) } else { None diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index 2cd18d0a3da34f5fb6f42b84f14972d1eb9e0503..7856164a12a34643b9a223023a8ab27922c68906 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -418,6 +418,7 @@ fn init_renderers(cx: &mut App) { .add_basic_renderer::(render_number_field) .add_basic_renderer::(render_number_field) .add_basic_renderer::(render_number_field) + .add_basic_renderer::(render_number_field) .add_basic_renderer::(render_number_field) .add_basic_renderer::(render_dropdown) .add_basic_renderer::(render_dropdown) diff --git a/crates/ui_input/src/number_field.rs b/crates/ui_input/src/number_field.rs index 37ef4db53b2620e217618413f95a92f892fe4993..b72566947771be6411ce879a48092f508909b18f 100644 --- a/crates/ui_input/src/number_field.rs +++ b/crates/ui_input/src/number_field.rs @@ -8,7 +8,7 @@ use std::{ use editor::{Editor, EditorStyle}; use gpui::{ClickEvent, Entity, FocusHandle, Focusable, FontWeight, Modifiers}; -use settings::{CodeFade, MinimumContrast}; +use settings::{CodeFade, InactiveOpacity, MinimumContrast}; use ui::prelude::*; #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] @@ -79,6 +79,30 @@ impl NumberFieldType for settings::CodeFade { } } +impl NumberFieldType for settings::InactiveOpacity { + fn default_step() -> Self { + InactiveOpacity(0.10) + } + fn large_step() -> Self { + InactiveOpacity(0.20) + } + fn small_step() -> Self { + InactiveOpacity(0.05) + } + fn min_value() -> Self { + InactiveOpacity(0.0) + } + fn max_value() -> Self { + InactiveOpacity(1.0) + } + fn saturating_add(self, rhs: Self) -> Self { + InactiveOpacity((self.0 + rhs.0).min(Self::max_value().0)) + } + fn saturating_sub(self, rhs: Self) -> Self { + InactiveOpacity((self.0 - rhs.0).max(Self::min_value().0)) + } +} + impl NumberFieldType for settings::MinimumContrast { fn default_step() -> Self { MinimumContrast(1.0) diff --git a/crates/workspace/src/pane_group.rs b/crates/workspace/src/pane_group.rs index 88ec56de6fa2e890d11afbda58cc3a69ab1d6a60..36898b127bdd749a9c1867a97bd72dfd6f4e15ea 100644 --- a/crates/workspace/src/pane_group.rs +++ b/crates/workspace/src/pane_group.rs @@ -1306,7 +1306,7 @@ mod element { let overlay_opacity = WorkspaceSettings::get(None, cx) .active_pane_modifiers .inactive_opacity - .map(|val| val.clamp(0.0, 1.0)) + .map(|val| val.0.clamp(0.0, 1.0)) .and_then(|val| (val <= 1.).then_some(val)); let mut overlay_background = cx.theme().colors().editor_background; diff --git a/crates/workspace/src/workspace_settings.rs b/crates/workspace/src/workspace_settings.rs index ffa6767427d150d59b7f9f66575e3e385cca9564..6ed2aeb5cb85ae5728f683b3c3d7dfbdf86f0c6a 100644 --- a/crates/workspace/src/workspace_settings.rs +++ b/crates/workspace/src/workspace_settings.rs @@ -4,11 +4,11 @@ use crate::DockPosition; use collections::HashMap; use serde::Deserialize; pub use settings::AutosaveSetting; -use settings::Settings; pub use settings::{ BottomDockLayout, PaneSplitDirectionHorizontal, PaneSplitDirectionVertical, RestoreOnStartupBehavior, }; +use settings::{InactiveOpacity, Settings}; pub struct WorkspaceSettings { pub active_pane_modifiers: ActivePanelModifiers, @@ -50,7 +50,7 @@ pub struct ActivePanelModifiers { /// /// Default: `1.0` // TODO: make this not an option, it is never None - pub inactive_opacity: Option, + pub inactive_opacity: Option, } #[derive(Deserialize)]