public static int GenerateNewId(VisualTreeAsset vta, VisualElementAsset vea) { int parentHash; if (!vea.HasParent()) { parentHash = vta.GetHashCode(); } else { parentHash = vea.parentId; } var guid = System.Guid.NewGuid().GetHashCode(); return((vta.GetNextChildSerialNumber() + 585386304) * -1521134295 + parentHash + guid); }
void LoadXml(XElement elt, VisualElementAsset parent, VisualTreeAsset vta, int orderInDocument) { VisualElementAsset vea = ResolveType(elt, vta); if (vea == null) { return; } int parentHash; if (parent == null) { vea.parentId = 0; parentHash = vta.GetHashCode(); } else { vea.parentId = parent.id; parentHash = parent.id; } // id includes the parent id, meaning it's dependent on the whole direct hierarchy vea.id = (vta.GetNextChildSerialNumber() + 585386304) * -1521134295 + parentHash; vea.orderInDocument = orderInDocument; bool startedRule = ParseAttributes(elt, vea, vta, parent); // each vea will creates 0 or 1 style rule, with one or more properties // they don't have selectors and are directly referenced by index // it's then applied during tree cloning vea.ruleIndex = startedRule ? m_Builder.EndRule() : -1; var templateAsset = vea as TemplateAsset; if (templateAsset != null) { vta.templateAssets.Add(templateAsset); } else { vta.visualElementAssets.Add(vea); } if (elt.HasElements) { foreach (XElement child in elt.Elements()) { if (child.Name.LocalName == k_StyleReferenceNode) { LoadStyleReferenceNode(vea, child); } else if (templateAsset != null && child.Name.LocalName == k_AttributeOverridesNode) { LoadAttributeOverridesNode(templateAsset, child); } else { ++orderInDocument; LoadXml(child, vea, vta, orderInDocument); } } } }