コード例 #1
0
        public static void CloneTree(
            VisualTreeAsset vta, VisualElement target,
            Dictionary <string, VisualElement> slotInsertionPoints,
            List <TemplateAsset.AttributeOverride> attributeOverrides)
        {
            if (target == null)
            {
                throw new ArgumentNullException(nameof(target));
            }

            if ((vta.visualElementAssets == null || vta.visualElementAssets.Count <= 0) &&
                (vta.templateAssets == null || vta.templateAssets.Count <= 0))
            {
                return;
            }

            var idToChildren = VisualTreeAssetUtilities.GenerateIdToChildren(vta);

            List <VisualElementAsset> rootAssets;

            // Tree root has parentId == 0
            idToChildren.TryGetValue(0, out rootAssets);
            if (rootAssets == null || rootAssets.Count == 0)
            {
                return;
            }

#if !UNITY_2019_4
            var uxmlRootAsset = rootAssets[0];

            vta.AssignClassListFromAssetToElement(uxmlRootAsset, target);
            vta.AssignStyleSheetFromAssetToElement(uxmlRootAsset, target);

            // Get the first-level elements. These will be instantiated and added to target.
            idToChildren.TryGetValue(uxmlRootAsset.id, out rootAssets);
            if (rootAssets == null || rootAssets.Count == 0)
            {
                return;
            }
#endif

            rootAssets.Sort(VisualTreeAssetUtilities.CompareForOrder);
            foreach (VisualElementAsset rootElement in rootAssets)
            {
                Assert.IsNotNull(rootElement);

                // Don't try to instatiate the special selection tracking element.
                if (rootElement.fullTypeName == BuilderConstants.SelectedVisualTreeAssetSpecialElementTypeName)
                {
                    continue;
                }

                VisualElement rootVe = CloneSetupRecursively(vta, rootElement, idToChildren,
                                                             new CreationContext(slotInsertionPoints, attributeOverrides, vta, target));

                // if contentContainer == this, the shadow and the logical hierarchy are identical
                // otherwise, if there is a CC, we want to insert in the shadow
                target.hierarchy.Add(rootVe);
            }
        }