fromXmlList static method

DrawerModel? fromXmlList(
  1. WidgetModel parent,
  2. List<XmlElement> elements
)

Implementation

static DrawerModel? fromXmlList(
    WidgetModel parent, List<XmlElement> elements) {
  DrawerModel? model;
  try {
    bool handleLeft = false;
    bool handleRight = false;
    bool handleTop = false;
    bool handleBottom = false;
    double? sizeLeft;
    double? sizeRight;
    double? sizeTop;
    double? sizeBottom;
    String? idLeft;
    String? idRight;
    String? idTop;
    String? idBottom;

    XmlElement xml = XmlElement(
        XmlName.fromString('DRAWER')); // create a single drawer element
    for (var element in elements) {
      XmlElement node = element.copy();

      String? side =
          Xml.attribute(node: node, tag: 'side')?.trim().toLowerCase();
      if (side != null) {
        // build the drawer elements
        XmlElement drawer = XmlElement(
            XmlName(side.toUpperCase())); // create a sidedrawer from template

        // add attributes
        for (var attribute in node.attributes) {
          var name = attribute.localName.toLowerCase();
          if (name != "width" && name != "height" && name != "side") {
            drawer.attributes
                .add(XmlAttribute(XmlName(name), attribute.value));
          }
        }

        // Assign ids
        switch (toEnum(side, Drawers.values)) {
          case Drawers.left:
            idLeft = Xml.attribute(node: node, tag: 'id');
            handleLeft =
                toBool(Xml.attribute(node: node, tag: 'handle')) == true;
            sizeLeft = toDouble(Xml.attribute(node: node, tag: 'size'));
            break;

          case Drawers.right:
            idRight = Xml.attribute(node: node, tag: 'id');
            handleRight =
                toBool(Xml.attribute(node: node, tag: 'handle')) == true;
            sizeRight = toDouble(Xml.attribute(node: node, tag: 'size'));
            break;

          case Drawers.top:
            idTop = Xml.attribute(node: node, tag: 'id');
            handleTop =
                toBool(Xml.attribute(node: node, tag: 'handle')) == true;
            sizeTop = toDouble(Xml.attribute(node: node, tag: 'size'));
            break;

          case Drawers.bottom:
            idBottom = Xml.attribute(node: node, tag: 'id');
            handleBottom =
                toBool(Xml.attribute(node: node, tag: 'handle')) == true;
            sizeBottom = toDouble(Xml.attribute(node: node, tag: 'size'));
            break;

          default:
            break;
        }

        List<XmlElement> nodes = [];
        for (var node in node.children) {
          if (node.nodeType == XmlNodeType.ELEMENT) {
            nodes.add(node.copy() as XmlElement);
          }
        }

        drawer.children.addAll(nodes);
        xml.children.add(drawer);
      } else {
        Log().error('Unable to parse a drawer attributes',
            caller: 'drawer.Model => Model.fromXmlList()');
      }
    }

    // Create View Model
    model = DrawerModel(parent, Xml.get(node: xml, tag: 'id'),
        handleLeft: handleLeft,
        handleRight: handleRight,
        handleTop: handleTop,
        handleBottom: handleBottom,
        sizeLeft: sizeLeft,
        sizeRight: sizeRight,
        sizeTop: sizeTop,
        sizeBottom: sizeBottom,
        idLeft: idLeft,
        idRight: idRight,
        idTop: idTop,
        idBottom: idBottom);

    // Deserialize
    model.deserialize(xml);
  } catch (e) {
    Log().error('Unable to parse a drawer element',
        caller: 'drawer.Model => Model.fromXmlList()');
    Log().exception(e, caller: 'drawer.Model');
    model = null;
  }
  return model;
}