internal void AddToListAndToVisualTree(UIDocument uiDocument, VisualElement visualTree, int firstInsertIndex = 0) { int index = 0; foreach (var sibling in m_AttachedUIDocuments) { if (uiDocument.sortingOrder > sibling.sortingOrder) { index++; continue; } if (uiDocument.sortingOrder < sibling.sortingOrder) { break; } // They're the same value, compare their count (UIDocuments created first show up first). if (uiDocument.m_UIDocumentCount > sibling.m_UIDocumentCount) { index++; continue; } break; } if (index < m_AttachedUIDocuments.Count) { m_AttachedUIDocuments.Insert(index, uiDocument); if (visualTree == null || uiDocument.rootVisualElement == null) { return; } // Not every UIDocument is in the tree already (because their root is null, for example), so we need // to figure out the insertion point. if (index > 0) { VisualElement previousInTree = null; int i = 1; while (previousInTree == null && index - i >= 0) { var previousUIDocument = m_AttachedUIDocuments[index - i++]; previousInTree = previousUIDocument.rootVisualElement; } if (previousInTree != null) { index = visualTree.IndexOf(previousInTree) + 1; } } if (index > visualTree.childCount) { index = visualTree.childCount; } } else { // Add in the end. m_AttachedUIDocuments.Add(uiDocument); } if (visualTree == null || uiDocument.rootVisualElement == null) { return; } int insertionIndex = firstInsertIndex + index; if (insertionIndex < visualTree.childCount) { visualTree.Insert(insertionIndex, uiDocument.rootVisualElement); } else { visualTree.Add(uiDocument.rootVisualElement); } }