From 3bc306a4b1a5bb1deeacab340c6daa2b941920d0 Mon Sep 17 00:00:00 2001 From: rylin8 Date: Mon, 11 Nov 2024 16:16:51 -0800 Subject: [PATCH] Support parsing corner radius from Figma as a variable hash map --- crates/figma_import/src/figma_schema.rs | 13 ++++++ crates/figma_import/src/transform_flexbox.rs | 43 +++++++++++++++--- crates/figma_import/src/variable_utils.rs | 29 ++++++++++++ ...ariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf | Bin 57487 -> 58311 bytes 4 files changed, 79 insertions(+), 6 deletions(-) diff --git a/crates/figma_import/src/figma_schema.rs b/crates/figma_import/src/figma_schema.rs index bed1fa832..fb767a8ec 100644 --- a/crates/figma_import/src/figma_schema.rs +++ b/crates/figma_import/src/figma_schema.rs @@ -1274,6 +1274,19 @@ impl BoundVariables { } None } + + pub(crate) fn get_var_from_hash(&self, hash_name: &str, var_name: &str) -> Option { + let var_hash = self.variables.get(hash_name); + if let Some(var) = var_hash { + if let VariableAliasOrList::Map(map) = var { + let var = map.get(var_name); + if let Some(var) = var { + return Some(var.id.clone()); + } + } + } + None + } } // We use the "untagged" serde attribute because the value of a variable is diff --git a/crates/figma_import/src/transform_flexbox.rs b/crates/figma_import/src/transform_flexbox.rs index 11e997740..2232254a3 100644 --- a/crates/figma_import/src/transform_flexbox.rs +++ b/crates/figma_import/src/transform_flexbox.rs @@ -1464,19 +1464,50 @@ fn visit_node( // Collect the corner radii values to be saved into the view. If the corner radii are set // to variables, they will be set to NumOrVar::Var. Otherwise they will be set to NumOrVar::Num. let corner_radius = if let Some(vars) = &node.bound_variables { - let top_left = NumOrVarType::from_var(vars, "topLeftRadius", corner_radius_values[0]); - let top_right = NumOrVarType::from_var(vars, "topRightRadius", corner_radius_values[1]); - let bottom_right = - NumOrVarType::from_var(vars, "bottomRightRadius", corner_radius_values[2]); - let bottom_left = NumOrVarType::from_var(vars, "bottomLeftRadius", corner_radius_values[3]); + let corner_values = if vars.has_var("rectangleCornerRadii") { + ( + NumOrVarType::from_var_hash( + vars, + "rectangleCornerRadii", + "RECTANGLE_TOP_LEFT_CORNER_RADIUS", + corner_radius_values[0], + ), + NumOrVarType::from_var_hash( + vars, + "rectangleCornerRadii", + "RECTANGLE_TOP_RIGHT_CORNER_RADIUS", + corner_radius_values[1], + ), + NumOrVarType::from_var_hash( + vars, + "rectangleCornerRadii", + "RECTANGLE_BOTTOM_LEFT_CORNER_RADIUS", + corner_radius_values[2], + ), + NumOrVarType::from_var_hash( + vars, + "rectangleCornerRadii", + "RECTANGLE_BOTTOM_RIGHT_CORNER_RADIUS", + corner_radius_values[3], + ), + ) + } else { + ( + NumOrVarType::from_var(vars, "topLeftRadius", corner_radius_values[0]), + NumOrVarType::from_var(vars, "topRightRadius", corner_radius_values[1]), + NumOrVarType::from_var(vars, "bottomRightRadius", corner_radius_values[2]), + NumOrVarType::from_var(vars, "bottomLeftRadius", corner_radius_values[3]), + ) + }; if vars.has_var("topLeftRadius") || vars.has_var("topRightRadius") || vars.has_var("bottomRightRadius") || vars.has_var("bottomLeftRadius") + || vars.has_var("rectangleCornerRadii") { has_corner_radius = true; } - [top_left, top_right, bottom_right, bottom_left] + [corner_values.0, corner_values.1, corner_values.2, corner_values.3] } else { [ NumOrVarType::Num(corner_radius_values[0]), diff --git a/crates/figma_import/src/variable_utils.rs b/crates/figma_import/src/variable_utils.rs index 13ce3faed..d6814c733 100644 --- a/crates/figma_import/src/variable_utils.rs +++ b/crates/figma_import/src/variable_utils.rs @@ -31,6 +31,13 @@ pub(crate) trait FromFigmaVar { var_name: &str, var_value: VarType, ) -> Self; + + fn from_var_hash( + bound_variables: &figma_schema::BoundVariables, + hash_name: &str, + var_name: &str, + var_value: VarType, + ) -> Self; } // Create a NumOrVar from Figma variable name and number value impl FromFigmaVar for NumOrVarType { @@ -46,6 +53,19 @@ impl FromFigmaVar for NumOrVarType { NumOrVarType::Num(var_value) } } + fn from_var_hash( + bound_variables: &figma_schema::BoundVariables, + hash_name: &str, + var_name: &str, + var_value: f32, + ) -> Self { + let var = bound_variables.get_var_from_hash(hash_name, var_name); + if let Some(var) = var { + NumOrVarType::Var(NumVar { id: var, fallback: var_value }) + } else { + NumOrVarType::Num(var_value) + } + } } // Create a ColorOrVar from Figma variable name and color value impl FromFigmaVar<&FloatColor> for ColorOrVar { @@ -61,6 +81,15 @@ impl FromFigmaVar<&FloatColor> for ColorOrVar { ColorOrVar::new_color(color.into()) } } + fn from_var_hash( + _bound_variables: &figma_schema::BoundVariables, + _hash_name: &str, + _var_name: &str, + color: &FloatColor, + ) -> Self { + // Currently, no color variables from a hash are yet supported + ColorOrVar::new_color(color.into()) + } } // Create a VariableValue from figma_schema::VariableValue diff --git a/integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf b/integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf index a981e43945ebb720ed39ae6622788d7e9f743a32..f74732053626bff2d292095373708dca786a995d 100644 GIT binary patch delta 1122 zcmb_aZAg<*6u$Sqo6b$$ru%sJVQ!<)$mM+Zp|hZb0=3AmQd7txkc7xGw5T9$_@k1X zJ0blj&_6~&VjZ&&f;2*NX(~<`P0aeypCI}hg7t0^DMSQ$xR-OzAmrzG^WBcFbQ6mw4|k4ICL<_e+ZjtB=#nflP-&B-RIF0L z$2~fQD@s8BIoHJS(Hau1iJF|CH9mu53WCM*o)|y8R`7A|e6PnzU|3=PbI7j(R!M%- zB@+CexWZVH=#>Iv$pq~w-`IM|Jq7C}|1FP7?kR}1`6XFNutYn=F%`jhgNHFS!Cj{M zjbBX)!NIiqjHMDhYH9fI)o2KYZB~v+2`+Crvhi}`2%gAPa4K(}+v#+AJg!`Kp5PQb z;M?{I>~J2!IIFL1Eg~C29_Lo#q8v9Y$eSo7dpfh4extXG=tcu1E zcPpAHc2}OGXg+j-;^o6W3NPO&VBDv~jOrSSlG=I=)Yj?n^Jx*;+E_~AOMw<^nl2{e zzAI-b&b6MWIP5zvhwM2i_I8>mX546|fm#W^@Mqef@|70P4DP28&eh}cqhl22`VBb$ z_`Qbep)II`iEbIJ1Pw3{%%-WZG+~6%2_B2z+N6|+k&1M<7UG##59(C?D4~easEchd|mxAS% z4*c`_H8U8(T29DaouDwR!|;4Hg}U%=aD=nr!5tZFomApb_&I|QQ#`asbP$ZFp*3QL dmOd3kB3IW;GQ6M<6!CCrVN-M*Twb`z{RAMEH?RNz delta 759 zcmZusT}YE*6yAB~P!>6d+qZ9M9X06#A1c z(jCeEtfh6+jmiNPgV2H|g$pcQOW4e=f{37uh>+H@qS1l#$8(-@o)ZizFV8A1fzrcG*#AFD;auHL~m}c6l6*ev6r1;p01>02}0#!ipHX%E^%uWts#95>cVJ#%Vk? zPsy%xdaVv5fj2m1r>`@1GoH0FV?&(0nID<_iyNreSn|K(pCh+8y$~jp>^7%MCMRP7 zPLH#WB^|rNY0h$=v0+X=ej*7R;nbaLRkFLBM)Dhyz+ZZOHPMNk{!+x zy9*x_t%@ldk5)CcHUF;VVoxa!*^Csjy|ZFfsz_z~8Q`o=pm}dCpu0t&_5%k2*QWGT zU1J4Wsr3OpJJbnOQ+Ebvu0G!GIno2XPK%X(6IHq*(FM}@YS1;4*Af{50j$zQF)^{~iFx8T^K8H+BcaeYAqCu;Xuuy;XV zB@$YKxit2&8E|wm8&5A8Asbs4t+;C`3$=rpn6avf?-Q}2jH4Jf;?t!=L7*h3L#qIsAZ>rKf08Z*G(Hx5SykT55>jfz(Wls^Eh-|?FO