diff --git a/crates/engine/src/component_codegen_tests.rs b/crates/engine/src/component_codegen_tests.rs
index 176ee474..2c3706f8 100644
--- a/crates/engine/src/component_codegen_tests.rs
+++ b/crates/engine/src/component_codegen_tests.rs
@@ -224,10 +224,6 @@ fn variant_sets_share_one_definition() {
let kt = code(&mut s, set, "compose");
assert!(kt.contains("enum class ButtonState { Default, Hover }"), "{kt}");
assert!(kt.contains(" state: ButtonState = ButtonState.Default,"), "{kt}");
- let dart = code(&mut s, set, "flutter");
- assert!(dart.contains("enum ButtonState { defaultValue, hover }\n"), "{dart}");
- assert!(dart.contains(" this.state = ButtonState.defaultValue,\n"), "{dart}");
- assert!(dart.contains(" final ButtonState state;\n"), "{dart}");
let ark = code(&mut s, set, "arkui");
assert!(ark.contains("export enum ButtonState { Default, Hover }"), "{ark}");
assert!(ark.contains(" @Prop state: ButtonState = ButtonState.Default"), "{ark}");
@@ -247,11 +243,23 @@ fn variant_sets_share_one_definition() {
assert_eq!(component_code(&mut s, i, "react")["usage"], "\n");
assert_eq!(component_code(&mut s, i, "swiftui")["usage"], "Button(state: .hover)\n");
assert_eq!(component_code(&mut s, i, "compose")["usage"], "Button(state = ButtonState.Hover)\n");
- assert_eq!(component_code(&mut s, i, "flutter")["usage"], "Button(state: ButtonState.hover)\n");
assert_eq!(component_code(&mut s, i, "arkui")["usage"], "Button({ state: ButtonState.Hover })\n");
assert_eq!(component_code(&mut s, i, "leptos")["usage"], "\n");
}
+#[test]
+fn flutter_variant_sets_share_one_enum() {
+ let mut s = Session::new();
+ let (set, _, _) = button_set(&mut s);
+ let dart = code(&mut s, set, "flutter");
+ assert!(dart.contains("enum ButtonState { defaultValue, hover }\n"), "{dart}");
+ assert!(dart.contains(" this.state = ButtonState.defaultValue,\n"), "{dart}");
+ assert!(dart.contains(" final ButtonState state;\n"), "{dart}");
+ let i = idv(&ex(&mut s, "instance.create", json!({"component": set, "x": 0, "y": 600})));
+ ex(&mut s, "instance.setProperties", json!({"ids": [i], "properties": {"State": "Hover"}}));
+ assert_eq!(component_code(&mut s, i, "flutter")["usage"], "Button(state: ButtonState.hover)\n");
+}
+
#[test]
fn instance_swap_properties_take_views() {
let mut s = Session::new();
diff --git a/crates/engine/src/dev/codegen.rs b/crates/engine/src/dev/codegen.rs
index 8c365288..8a72c201 100644
--- a/crates/engine/src/dev/codegen.rs
+++ b/crates/engine/src/dev/codegen.rs
@@ -608,6 +608,20 @@ mod tests {
assert!(dart.contains("const SizedBox()"), "a capped layer is still a widget in the list: {dart}");
}
+ #[test]
+ fn flutter_keeps_a_capped_layers_name_on_its_comment_line() {
+ let mut s = Session::new();
+ let root = id_of(&s.execute("frame.create", &json!({"x": 0, "y": 0, "width": 50, "height": 50})).unwrap()["id"]).unwrap();
+ let mut parent = root;
+ for _ in 0..20 {
+ let p = json!({"x": 1, "y": 1, "width": 40, "height": 40, "parent": parent, "name": "deep\nvoid main() {}"});
+ parent = id_of(&s.execute("frame.create", &p).unwrap()["id"]).unwrap();
+ }
+ let dart = code_for(s.doc().unwrap(), root, CodeLang::Flutter);
+ assert!(dart.contains("…"), "the depth is capped: {dart}");
+ assert!(!dart.lines().any(|l| l.trim_start().starts_with("void main()")), "a name never leaves its comment: {dart}");
+ }
+
#[test]
fn flutter_expands_and_stretches_fill_children() {
let mut s = Session::new();
diff --git a/crates/engine/src/dev/codegen/flutter.rs b/crates/engine/src/dev/codegen/flutter.rs
index df300abd..98f280ea 100644
--- a/crates/engine/src/dev/codegen/flutter.rs
+++ b/crates/engine/src/dev/codegen/flutter.rs
@@ -1,4 +1,10 @@
-use super::*;
+use figcraft_doc::AutoLayout;
+
+use super::swift::one_line;
+use super::{
+ CodeLang, CrossAlign, Ctx, LayoutMode, LetterSpacing, LineHeight, MainAlign, Node, NodeId, NodeKind, Param, Sizing, TextAlignH, TextDecoration,
+ drop_shadow, first_fill, kotlin_color, literal, num, radius, stroke_color,
+};
// ------------------------------------------------------------------ Flutter (Dart)
@@ -118,7 +124,7 @@ pub(crate) fn flutter(ctx: &Ctx, id: NodeId, depth: usize, out: &mut String, pla
fn flutter_placed(ctx: &Ctx, n: &Node, depth: usize, out: &mut String, place: Place) {
if ctx.too_deep(depth) {
let pad = flutter_indent(depth);
- out.push_str(&format!("{pad}// {} …\n{pad}const SizedBox()", n.name));
+ out.push_str(&format!("{pad}// {} …\n{pad}const SizedBox()", one_line(&n.name)));
return;
}
let mut depth = depth;
diff --git a/crates/ui-egui/locales/ar.toml b/crates/ui-egui/locales/ar.toml
index f252e114..c56abcc1 100644
--- a/crates/ui-egui/locales/ar.toml
+++ b/crates/ui-egui/locales/ar.toml
@@ -258,7 +258,7 @@ status = "draft — needs native review"
"Changes on main" = "التغييرات في الملف الرئيسي"
"Changes on the branch" = "التغييرات في الفرع"
"Changes unknown" = "التغييرات غير معروفة"
-"Choose React, Leptos, Vue, SwiftUI, Compose or ArkUI above to connect this component to its code." = "اختر React أو Leptos أو Vue أو SwiftUI أو Compose أو ArkUI أعلاه لربط هذا المكوّن بكوده."
+"Choose React, Leptos, Vue, SwiftUI, Compose, ArkUI or Flutter above to connect this component to its code." = "اختر React أو Leptos أو Vue أو SwiftUI أو Compose أو ArkUI أو Flutter أعلاه لربط هذا المكوّن بكوده."
"Choose another profile to change it." = "اختر ملف تعريف آخر لتغييره."
"Choose collection" = "اختيار مجموعة"
"Choose image" = "اختيار صورة"