Skip to content

Commit afef362

Browse files
canewsinbernaferrari
authored andcommitted
flutter: Wrap Support (#204)
1 parent 4c18982 commit afef362

File tree

2 files changed

+64
-14
lines changed

2 files changed

+64
-14
lines changed

packages/backend/src/flutter/builderImpl/flutterAutoLayout.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,40 @@ export const getCrossAxisAlignment = (
3030
}
3131
};
3232

33+
export const getWrapAlignment = (
34+
node: InferredAutoLayoutResult,
35+
): string => {
36+
switch (node.primaryAxisAlignItems) {
37+
case undefined:
38+
case "MIN":
39+
return "WrapAlignment.start";
40+
case "CENTER":
41+
return "WrapAlignment.center";
42+
case "MAX":
43+
return "WrapAlignment.end";
44+
case "SPACE_BETWEEN":
45+
return "WrapAlignment.spaceBetween";
46+
}
47+
};
48+
49+
export const getWrapRunAlignment = (
50+
node: InferredAutoLayoutResult,
51+
): string => {
52+
if (node.counterAxisAlignContent == "SPACE_BETWEEN") {
53+
return "WrapAlignment.spaceBetween";
54+
}
55+
switch (node.counterAxisAlignItems) {
56+
case undefined:
57+
case "MIN":
58+
return "WrapAlignment.start";
59+
case "CENTER":
60+
case "BASELINE":
61+
return "WrapAlignment.center";
62+
case "MAX":
63+
return "WrapAlignment.end";
64+
}
65+
};
66+
3367
const getFlex = (
3468
node: SceneNode,
3569
autoLayout: InferredAutoLayoutResult,

packages/backend/src/flutter/flutterMain.ts

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { indentString } from "../common/indentString";
1010
import {
1111
getCrossAxisAlignment,
1212
getMainAxisAlignment,
13+
getWrapAlignment,
14+
getWrapRunAlignment,
1315
} from "./builderImpl/flutterAutoLayout";
1416
import { PluginSettings } from "types";
1517
import { addWarning } from "../common/commonConversionWarnings";
@@ -193,12 +195,12 @@ const flutterFrame = (
193195
}
194196

195197
if (node.layoutMode !== "NONE") {
196-
const rowColumn = makeRowColumn(node, children);
197-
return flutterContainer(node, rowColumn);
198+
const rowColumnWrap = makeRowColumnWrap(node, children);
199+
return flutterContainer(node, rowColumnWrap);
198200
} else {
199201
if (node.inferredAutoLayout) {
200-
const rowColumn = makeRowColumn(node.inferredAutoLayout, children);
201-
return flutterContainer(node, rowColumn);
202+
const rowColumnWrap = makeRowColumnWrap(node.inferredAutoLayout, children);
203+
return flutterContainer(node, rowColumnWrap);
202204
}
203205

204206
if (node.isAsset) {
@@ -215,21 +217,35 @@ const flutterFrame = (
215217
}
216218
};
217219

218-
const makeRowColumn = (
220+
const makeRowColumnWrap = (
219221
autoLayout: InferredAutoLayoutResult,
220222
children: string,
221223
): string => {
222-
const rowOrColumn = autoLayout.layoutMode === "HORIZONTAL" ? "Row" : "Column";
223-
224-
const widgetProps: Record<string, any> = {
225-
mainAxisSize: "MainAxisSize.min",
226-
// mainAxisSize: getFlex(node, autoLayout),
227-
mainAxisAlignment: getMainAxisAlignment(autoLayout),
228-
crossAxisAlignment: getCrossAxisAlignment(autoLayout),
229-
};
224+
const rowOrColumn = autoLayout.layoutWrap == "WRAP" && autoLayout.primaryAxisSizingMode == "FIXED" ?
225+
"Wrap" : autoLayout.layoutMode === "HORIZONTAL" ? "Row" : "Column";
226+
227+
const widgetProps: Record<string, any> = autoLayout.layoutWrap == "WRAP"
228+
? {
229+
alignment: getWrapAlignment(autoLayout),
230+
runAlignment: getWrapRunAlignment(autoLayout),
231+
} :
232+
{
233+
mainAxisSize: "MainAxisSize.min",
234+
// mainAxisSize: getFlex(node, autoLayout),
235+
mainAxisAlignment: getMainAxisAlignment(autoLayout),
236+
crossAxisAlignment: getCrossAxisAlignment(autoLayout),
237+
238+
};
230239

231240
// Add spacing parameter if itemSpacing is set
232-
if (autoLayout.itemSpacing > 0) {
241+
if (autoLayout.layoutWrap == "WRAP") {
242+
if (autoLayout.primaryAxisAlignItems != "SPACE_BETWEEN" && autoLayout.itemSpacing != undefined) {
243+
widgetProps.spacing = autoLayout.itemSpacing;
244+
}
245+
if (autoLayout.counterAxisAlignContent != "SPACE_BETWEEN" && autoLayout.counterAxisSpacing != undefined) {
246+
widgetProps.runSpacing = autoLayout.counterAxisSpacing;
247+
}
248+
} else if (autoLayout.itemSpacing > 0) {
233249
widgetProps.spacing = autoLayout.itemSpacing;
234250
} else if (autoLayout.itemSpacing < 0) {
235251
addWarning("Flutter doesn't support negative itemSpacing");

0 commit comments

Comments
 (0)