Skip to content

Commit 7b6be9d

Browse files
committed
add support for top-level properties e.g. <if>
1 parent c80d4ee commit 7b6be9d

3 files changed

Lines changed: 51 additions & 18 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"displayName": "XML Layout for Flutter",
44
"description": "XML Layout for Flutter. Brings Angular's style to Flutter!",
55
"publisher": "WaseemDev",
6-
"version": "0.0.27",
6+
"version": "0.0.28",
77
"icon": "images/logo.png",
88
"repository": {
99
"type": "github",

src/property-handlers/switch.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,13 @@ export class SwitchHandler extends CustomPropertyHandler {
9494
generatePropertyCode: (widget: WidgetModel, property: PropertyModel, tabsLevel: number) => string): string {
9595
const tabs = makeTabs(tabsLevel);
9696
const tempData = widget.tempData;
97-
const casesWidgets = tempData.casesWidgets as WidgetModel[];
97+
const casesWidgets = (tempData.casesWidgets instanceof Array ? tempData.casesWidgets : [tempData.casesWidgets]) as WidgetModel[];
9898
const defaultWidget = 'Container(width: 0, height: 0)';
9999
let cases = '';
100100
let code = '';
101101

102102
if (casesWidgets) {
103-
casesWidgets.forEach(w => {
103+
casesWidgets.filter(a => !!a).forEach(w => {
104104
const caseProp = w.properties.filter(a => a.name === ':switchCase')[0];
105105
if (caseProp) {
106106
cases += `\n${tabs} new SwitchCase(${caseProp.value}, \n${tabs} () => ${generateChildWidgetCode(w, tabsLevel + 3)}\n${tabs} ),`;

src/resolvers/widget-resolver.ts

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,30 @@ export class WidgetResolver {
1515
const rootElement = xmlDoc.children[0] as parseXml.Element;
1616
const rootElementAttrs = JSON.parse(JSON.stringify(rootElement.attributes));
1717
const rootChild = this.getChildWidget(rootElement);
18-
const rootChildWidget = this.resolveWidget(rootChild, null);
18+
let rootChildWidget = this.resolveWidget(rootChild, null);
19+
20+
// check for top-level properties, specially for <if>
21+
if (rootChildWidget.isPropertyElement) {
22+
const propertyHandler = this.propertyHandlerProvider.get(rootChildWidget.propertyElement);
23+
if (propertyHandler && propertyHandler.canResolvePropertyElement()) {
24+
const childrenElements = rootElement.children.filter(a => a.type === 'element').map(a => a as parseXml.Element);
25+
const child = childrenElements.filter(a => a.name === rootChildWidget.propertyElement)[0];
26+
const widget = this.resolvePropertyElement(rootChildWidget, rootElement, childrenElements, child);
27+
if (widget) {
28+
rootChildWidget = {
29+
widget: widget,
30+
isPropertyElement: false,
31+
propertyElement: null,
32+
propertyElementProperties: []
33+
};
34+
}
35+
}
36+
// no need for now
37+
// else {
38+
// // this child is a property element <title>...</title>
39+
// this.addElementAsAttribute(rootElement, rootChildWidget);
40+
// }
41+
}
1942

2043
removeDuplicatedBuilders(rootChildWidget.widget, null, 'wrappedWidgets', { });
2144
this.callOnResolved(rootChildWidget.widget);
@@ -222,20 +245,9 @@ export class WidgetResolver {
222245
}
223246

224247
if (childResult.isPropertyElement) {
225-
// check if we want to treat it as a custom element and not a property <if>...</if>
226-
const propertyHandler = this.propertyHandlerProvider.get(childResult.propertyElement);
227-
if (propertyHandler && propertyHandler.canResolvePropertyElement()) {
228-
const propertyElementWidget: WidgetModel | null = propertyHandler.resolvePropertyElement(
229-
child, childResult, element, childrenElements,
230-
(el, parent) => this.resolveWidget(el, parent));
231-
if (propertyElementWidget) {
232-
childResult.isPropertyElement = false;
233-
childrenWidgets.push(propertyElementWidget);
234-
}
235-
}
236-
else {
237-
// this child is a property element <title>...</title>
238-
this.addElementAsAttribute(element, childResult);
248+
const widget = this.resolvePropertyElement(childResult, element, childrenElements, child);
249+
if (widget) {
250+
childrenWidgets.push(widget);
239251
}
240252
}
241253
else {
@@ -262,6 +274,27 @@ export class WidgetResolver {
262274
}
263275
}
264276

277+
private resolvePropertyElement(resolvedWidget: WidgetResolveResult,
278+
parentElement: parseXml.Element, parentChildrenElements: parseXml.Element[],
279+
childElement: parseXml.Element): WidgetModel | null {
280+
// check if we want to treat it as a custom element and not a property <if>...</if>
281+
const propertyHandler = this.propertyHandlerProvider.get(resolvedWidget.propertyElement);
282+
if (propertyHandler && propertyHandler.canResolvePropertyElement()) {
283+
const propertyElementWidget: WidgetModel | null = propertyHandler.resolvePropertyElement(
284+
childElement, resolvedWidget, parentElement, parentChildrenElements,
285+
(el, parent) => this.resolveWidget(el, parent));
286+
if (propertyElementWidget) {
287+
resolvedWidget.isPropertyElement = false;
288+
return propertyElementWidget;
289+
}
290+
}
291+
else {
292+
// this child is a property element <title>...</title>
293+
this.addElementAsAttribute(parentElement, resolvedWidget);
294+
}
295+
return null;
296+
}
297+
265298
private resolveContentChildData(element: parseXml.Element, widget: WidgetModel) {
266299
//e.g. <Text>content goes here</Text>
267300

0 commit comments

Comments
 (0)