Implementation
static WidgetModel? fromXml(WidgetModel parent, XmlElement node)
{
// clone node?
node = cloneNode(node, parent.scope);
// exclude this element?
if (excludeFromTemplate(node, parent.scope)) return null;
// element local name is the element name without the namespace prefix (if one exists)
String elementLocalName = node.localName.toLowerCase();
// build the element model
WidgetModel? model;
switch (elementLocalName) {
case "alarm":
model = AlarmModel.fromXml(parent, node);
break;
case "animate": // Preferred Case
case "animation": // Animation may be deprecated
model = AnimationModel.fromXml(parent, node);
break;
case "autocomplete":
model = InputModel.fromXml(parent, node, type: "autocomplete");
break;
case "barcode":
model = BarcodeDetectorModel.fromXml(parent, node);
break;
case "beacon":
model = BeaconModel.fromXml(parent, node);
break;
case "biometic":
model = BiometricsDetectorModel.fromXml(parent, node);
break;
case "box": // Preferred Case
case "container": // Container may be deprecated
model = BoxModel.fromXml(parent, node);
break;
case "breadcrumb":
model = BreadcrumbModel.fromXml(parent, node);
break;
case "busy":
model = BusyModel.fromXml(parent, node);
break;
case "button":
case "btn":
model = ButtonModel.fromXml(parent, node);
break;
case "buttonstate":
model = ButtonModel.fromXml(parent, node);
break;
case "calc":
if (parent is IDataSource) model = Calc.fromXml(model, node);
break;
case "camera":
model = CameraModel.fromXml(parent, node);
break;
case "card":
model = CardModel.fromXml(parent, node);
break;
case "center":
model = CenterModel.fromXml(parent, node);
break;
case "chart":
model = ChartModel.fromXml(parent, node);
break;
// case "sfchart":
// model = SFCHART.ChartModel.fromXml(parent, node);
// break;
case "html":
model = HtmlModel.fromXml(parent, node);
break;
case "checkbox":
case "check":
model = CheckboxModel.fromXml(parent, node);
break;
case "const":
case "constant":
model = VariableModel.fromXml(parent, node, constant: true);
break;
case "crop":
if (parent is IDataSource) model = Crop.fromXml(parent, node);
break;
case "column":
case "col": //shorthand case
model = ColumnModel.fromXml(parent, node);
break;
case "condition":
case "case":
if (parent is TriggerModel)
model = TriggerConditionModel.fromXml(parent, node);
break;
case "data":
model = DataModel.fromXml(parent, node);
break;
case "datepicker":
model = DatepickerModel.fromXml(parent, node);
break;
case "delete":
model = HttpDeleteModel.fromXml(parent, node);
break;
case "distinct":
if (parent is IDataSource) model = Distinct.fromXml(model, node);
break;
case "drag": // Preferred case.
case "draggable": // draggable may be deprecated
model = DraggableModel.fromXml(parent, node);
break;
case "drop": // Preferred case.
case "droppable": // droppable may be deprecated.
model = DroppableModel.fromXml(parent, node);
break;
case "editor":
model = EditorModel.fromXml(parent, node);
break;
case "expand": // Preferred CaFooterModel
case "expanded": // Expanded may be deprecated
model = ExpandedModel.fromXml(parent, node);
break;
case "eval":
if (parent is IDataSource) model = Eval.fromXml(model, node);
break;
case "filepicker":
model = FilepickerModel.fromXml(parent, node);
break;
case "filter":
if (parent is IDataSource)
model = Filter.fromXml(model, node);
break;
case "flip":
if (parent is IDataSource) model = Flip.fromXml(parent, node);
else if (parent is AnimationModel) model = FlipCardModel.fromXml(parent, node);
else model = FlipCardModel.fromXml(parent, node);
break;
case "fml":
model = FrameworkModel.fromXml(parent, node);
break;
case "footer":
if (parent is FrameworkModel)
model = FooterModel.fromXml(parent, node);
break;
case "form":
model = FormModel.fromXml(parent, node);
break;
case "format":
if (parent is IDataSource)
model = Format.fromXml(parent, node);
break;
case "gesture":
model = GestureModel.fromXml(parent, node);
break;
case "get":
model = HttpGetModel.fromXml(parent, node);
break;
case "greyscale":
case "grayscale":
if (parent is IDataSource)
model = Grayscale.fromXml(parent, node);
break;
case "gps":
model = GpsModel.fromXml(parent, node);
break;
case "grid":
model = GridModel.fromXml(parent, node);
break;
case "header":
if (parent is FrameworkModel)
model = HeaderModel.fromXml(parent, node);
break;
case "http":
model = HttpModel.fromXml(parent, node);
break;
case "icon":
model = IconModel.fromXml(parent, node);
break;
case "iframe":
model = InlineFrameModel.fromXml(parent, node);
break;
case "image":
case "img":
model = ImageModel.fromXml(parent, node);
break;
case "item":
if (parent is MenuModel)
model = MenuItemModel.fromXml(parent, node);
if (parent is ListModel)
model = ListItemModel.fromXml(parent, node);
if (parent is GridModel)
model = GridItemModel.fromXml(parent, node);
break;
case "input":
model = InputModel.fromXml(parent, node);
break;
case "link":
model = LinkModel.fromXml(parent, node);
break;
case "list":
model = ListModel.fromXml(parent, node);
break;
case "log":
model = LogModel.fromXml(parent, node);
break;
case "map":
model = MapModel.fromXml(parent, node);
break;
case "menu":
model = MenuModel.fromXml(parent, node);
break;
case "modal":
model = ModalModel.fromXml(parent, node);
break;
case "mqtt":
model = MqttModel.fromXml(parent, node);
break;
case "nfc":
model = NcfModel.fromXml(parent, node);
break;
case "node":
model = TreeNodeModel.fromXml(parent, node);
break;
case "ocr":
model = TextDetectorModel.fromXml(parent, node);
break;
case "option":
if (parent is SelectModel || parent is CheckboxModel || parent is RadioModel || parent is TypeaheadModel) model = OptionModel.fromXml(parent, node);
break;
case "fade":
if (parent is AnimationModel) model = FadeTransitionModel.fromXml(parent, node);
else model = FadeTransitionModel.fromXml(parent, node);
break;
case "rotate":
if (parent is AnimationModel) model = RotateTransitionModel.fromXml(parent, node);
else model = RotateTransitionModel.fromXml(parent, node);
break;
case "size":
if (parent is AnimationModel) model = SizeTransitionModel.fromXml(parent, node);
else model = SizeTransitionModel.fromXml(parent, node);
break;
case "slide":
if (parent is AnimationModel) model = SlideTransitionModel.fromXml(parent, node,);
else model = SlideTransitionModel.fromXml(parent, node);
break;
case "scale":
if (parent is AnimationModel) model = ScaleTransitionModel.fromXml(parent, node);
else model = ScaleTransitionModel.fromXml(parent, node);
break;
case "transform":
if (parent is AnimationModel) model = TransformModel.fromXml(parent, node);
else model = TransformModel.fromXml(parent, node);
break;
case "tween":
if (parent is AnimationModel) model = TweenModel.fromXml(parent, node);
else model = TweenModel.fromXml(parent, node);
break;
case "pad": // Preferred Case.
case "padding": // Padding could be deprecated.
model = PaddingModel.fromXml(parent, node);
break;
case "page":
if (parent is PagerModel)
model = PagerPageModel.fromXml(parent, node);
break;
case "pager":
model = PagerModel.fromXml(parent, node);
break;
case "pivot":
if (parent is IDataSource) model = Pivot.fromXml(model, node);
break;
case "put":
model = HttpPutModel.fromXml(parent, node);
break;
case "popover":
model = PopoverModel.fromXml(parent, node);
break;
case "popoveritem":
model = PopoverItemModel.fromXml(parent, node);
break;
case "position": // Preferred case
case "pos": // Shorthand case
case "positioned": // Positioned may be deprecated
model = PositionedModel.fromXml(parent, node);
break;
case "marker":
if (parent is MapModel)
model = MapMarkerModel.fromXml(parent, node);
break;
case "post":
model = HttpPostModel.fromXml(parent, node);
break;
case "radio":
model = RadioModel.fromXml(parent, node);
break;
case "resize":
if (parent is IDataSource) model = Resize.fromXml(parent, node);
break;
case "row":
model = RowModel.fromXml(parent, node);
break;
case "scope":
model = ScopeModel.fromXml(parent, node);
break;
case "scribble":
model = ScribbleModel.fromXml(parent, node);
break;
case "scroll": // Preferred Case
case "scroller": // Scroller may be deprecated.
model = ScrollerModel.fromXml(parent, node);
break;
case "select":
model = SelectModel.fromXml(parent, node);
break;
case "series":
if (parent is ChartModel) model = ChartSeriesModel.fromXml(parent, node);
// else if (parent is SFCHART.ChartModel) model = SFCHART.ChartSeriesModel.fromXml(parent, node);
break;
case "slider":
model = SliderModel.fromXml(parent, node);
break;
case "socket":
model = SocketModel.fromXml(parent, node);
break;
case "sort":
if (parent is IDataSource) model = Sort.fromXml(model, node);
break;
case "span":
model = SpanModel.fromXml(parent, node);
break;
case "sse":
model = SseModel.fromXml(parent, node);
break;
case "stack":
model = StackModel.fromXml(parent, node);
break;
case "splitview":
model = SplitModel.fromXml(parent, node);
break;
case "table":
model = TableModel.fromXml(parent, node);
break;
case "th":
case "tableheader":
model = TableHeaderModel.fromXml(parent, node);
break;
case "tr":
case "tablerow":
model = TableRowModel.fromXml(parent, node);
break;
case "tf":
case "tablefooter":
model = TableFooterModel.fromXml(parent, node);
break;
case "td":
case "tabledata":
case "cell":
if (parent is TableHeaderModel)
model = TableHeaderCellModel.fromXml(parent, node);
if (parent is TableRowModel)
model = TableRowCellModel.fromXml(parent, node);
break;
case "tabview":
model = TabModel.fromXml(parent, node);
break;
case "text":
case "txt":
model = TextModel.fromXml(parent, node);
break;
case "theme":
model = ThemeModel.fromXml(parent, node);
break;
case "timer":
model = TimerModel.fromXml(parent, node);
break;
case "toggle":
case "switch":
model = SwitchModel.fromXml(parent, node);
break;
case "tip":
case "tooltip":
if (Xml.attribute(node: node, tag: "label") != null || Xml.attribute(node: node, tag: "text") != null)
model = v1.TooltipModel.fromXml(parent, node);
else model = v2.TooltipModel.fromXml(parent, node);
break;
case "treeview":
model = TreeModel.fromXml(parent, node);
break;
case "trigger":
model = TriggerModel.fromXml(parent, node);
break;
case "typeahead":
model = TypeaheadModel.fromXml(parent, node);
break;
case "variable":
case "var":
model = VariableModel.fromXml(parent, node);
break;
case "video":
model = VideoModel.fromXml(parent, node);
break;
case "view":
if (parent is SplitModel)
model = ViewModel.fromXml(parent, node);
break;
case "window":
model = FrameworkModel.fromXml(parent, node);
break;
case "xaxis":
if (parent is ChartModel)
model = ChartAxisModel.fromXml(parent, node, ChartAxis.X);
// else if (parent is SFCHART.ChartModel) model = SFCHART.ChartAxisModel.fromXml(parent, node, SFCHART.Axis.X);
break;
case "yaxis":
if (parent is ChartModel)
model = ChartAxisModel.fromXml(parent, node, ChartAxis.Y);
// else if (parent is SFCHART.ChartModel) model = SFCHART.ChartAxisModel.fromXml(parent, node, SFCHART.Axis.Y);
break;
case "zebra":
model = ZebraModel.fromXml(parent, node);
break;
default:
break;
}
return model;
}