Add wiring for UI density (#11260)
Note: You shouldn't use the `unstable.ui_density` setting – it is only being added for testing and to enable new UI components to be built with density in mind. Don't expect this to work well, or at all right now. Adds some of the basic wiring we'll need to start scaling UI elements throughout the app based on a desired density setting. Release Notes: - N/A
This commit is contained in:
parent
0fce20d8da
commit
97512be378
13 changed files with 209 additions and 78 deletions
|
@ -21,6 +21,65 @@ use util::ResultExt as _;
|
|||
const MIN_FONT_SIZE: Pixels = px(6.0);
|
||||
const MIN_LINE_HEIGHT: f32 = 1.0;
|
||||
|
||||
#[derive(
|
||||
Debug,
|
||||
Default,
|
||||
PartialEq,
|
||||
Eq,
|
||||
PartialOrd,
|
||||
Ord,
|
||||
Hash,
|
||||
Clone,
|
||||
Copy,
|
||||
Serialize,
|
||||
Deserialize,
|
||||
JsonSchema,
|
||||
)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum UiDensity {
|
||||
/// A denser UI with tighter spacing and smaller elements.
|
||||
#[serde(alias = "compact")]
|
||||
Compact,
|
||||
#[default]
|
||||
#[serde(alias = "default")]
|
||||
/// The default UI density.
|
||||
Default,
|
||||
#[serde(alias = "comfortable")]
|
||||
/// A looser UI with more spacing and larger elements.
|
||||
Comfortable,
|
||||
}
|
||||
|
||||
impl UiDensity {
|
||||
pub fn spacing_ratio(self) -> f32 {
|
||||
match self {
|
||||
UiDensity::Compact => 0.75,
|
||||
UiDensity::Default => 1.0,
|
||||
UiDensity::Comfortable => 1.25,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<String> for UiDensity {
|
||||
fn from(s: String) -> Self {
|
||||
match s.as_str() {
|
||||
"compact" => Self::Compact,
|
||||
"default" => Self::Default,
|
||||
"comfortable" => Self::Comfortable,
|
||||
_ => Self::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<String> for UiDensity {
|
||||
fn into(self) -> String {
|
||||
match self {
|
||||
UiDensity::Compact => "compact".to_string(),
|
||||
UiDensity::Default => "default".to_string(),
|
||||
UiDensity::Comfortable => "comfortable".to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ThemeSettings {
|
||||
pub ui_font_size: Pixels,
|
||||
|
@ -31,6 +90,7 @@ pub struct ThemeSettings {
|
|||
pub theme_selection: Option<ThemeSelection>,
|
||||
pub active_theme: Arc<Theme>,
|
||||
pub theme_overrides: Option<ThemeStyleContent>,
|
||||
pub ui_density: UiDensity,
|
||||
}
|
||||
|
||||
impl ThemeSettings {
|
||||
|
@ -183,6 +243,12 @@ pub struct ThemeSettingsContent {
|
|||
#[serde(default)]
|
||||
pub theme: Option<ThemeSelection>,
|
||||
|
||||
/// UNSTABLE: Expect many elements to be broken.
|
||||
///
|
||||
// Controls the density of the UI.
|
||||
#[serde(rename = "unstable.ui_density", default)]
|
||||
pub ui_density: Option<UiDensity>,
|
||||
|
||||
/// EXPERIMENTAL: Overrides for the current theme.
|
||||
///
|
||||
/// These values will override the ones on the current theme specified in `theme`.
|
||||
|
@ -343,9 +409,14 @@ impl settings::Settings for ThemeSettings {
|
|||
.or(themes.get(&one_dark().name))
|
||||
.unwrap(),
|
||||
theme_overrides: None,
|
||||
ui_density: defaults.ui_density.unwrap_or(UiDensity::Default),
|
||||
};
|
||||
|
||||
for value in sources.user.into_iter().chain(sources.release_channel) {
|
||||
if let Some(value) = value.ui_density {
|
||||
this.ui_density = value;
|
||||
}
|
||||
|
||||
if let Some(value) = value.buffer_font_family.clone() {
|
||||
this.buffer_font.family = value.into();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue