diff --git a/crates/gpui/src/elements/container.rs b/crates/gpui/src/elements/container.rs index 984742e818f82cc9a5be8310d1139ebb84a82e34..698100ab29647972ae37ec56ce2d3d7d114d8393 100644 --- a/crates/gpui/src/elements/container.rs +++ b/crates/gpui/src/elements/container.rs @@ -30,6 +30,7 @@ pub struct ContainerStyle { #[serde(default)] pub border: Border, #[serde(default)] + #[serde(alias = "corner_radius")] pub corner_radii: CornerRadii, #[serde(default)] pub shadow: Option, diff --git a/crates/gpui/src/scene.rs b/crates/gpui/src/scene.rs index 48649c57918b4f9bdef7fc8ab6b3d88b1b7d509f..d75a4bceff964206fe56fd31323fee07d9a055c8 100644 --- a/crates/gpui/src/scene.rs +++ b/crates/gpui/src/scene.rs @@ -70,7 +70,7 @@ pub struct Quad { pub corner_radii: CornerRadii, } -#[derive(Default, Debug, Mul, Clone, Copy, Deserialize, Serialize, JsonSchema)] +#[derive(Default, Debug, Mul, Clone, Copy, Serialize, JsonSchema)] pub struct CornerRadii { pub top_left: f32, pub top_right: f32, @@ -78,6 +78,47 @@ pub struct CornerRadii { pub bottom_left: f32, } +impl<'de> Deserialize<'de> for CornerRadii { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + #[derive(Deserialize)] + pub struct CornerRadiiHelper { + pub top_left: f32, + pub top_right: f32, + pub bottom_right: f32, + pub bottom_left: f32, + } + + #[derive(Deserialize)] + #[serde(untagged)] + enum RadiusOrRadii { + Radius(f32), + Radii(CornerRadiiHelper), + } + + let json = RadiusOrRadii::deserialize(deserializer)?; + + let result = match json { + RadiusOrRadii::Radius(radius) => CornerRadii::from(radius), + RadiusOrRadii::Radii(CornerRadiiHelper { + top_left, + top_right, + bottom_right, + bottom_left, + }) => CornerRadii { + top_left, + top_right, + bottom_right, + bottom_left, + }, + }; + + Ok(result) + } +} + impl From for CornerRadii { fn from(radius: f32) -> Self { Self {