void PasteUXML(string copyBuffer) { var importer = new BuilderVisualTreeAssetImporter(); // Cannot be cached because the StyleBuilder never gets reset. importer.ImportXmlFromString(copyBuffer, out var pasteVta); VisualElementAsset parent = null; if (!m_Selection.isEmpty) { parent = m_Selection.selection.First().parent?.GetVisualElementAsset(); } BuilderAssetUtilities.TransferAssetToAsset(m_PaneWindow.document, parent, pasteVta); m_PaneWindow.document.AddStyleSheetToAllRootElements(); var selectionParentId = parent?.id ?? m_PaneWindow.document.visualTreeAsset.GetRootUXMLElementId(); VisualElementAsset newSelectedItem = pasteVta.templateAssets.FirstOrDefault(tpl => tpl.parentId == selectionParentId); if (newSelectedItem == null) { newSelectedItem = pasteVta.visualElementAssets.FirstOrDefault(asset => asset.parentId == selectionParentId); } m_Selection.ClearSelection(null); newSelectedItem.Select(); ScriptableObject.DestroyImmediate(pasteVta); }
public void UnpackTemplateContainer(VisualElement templateContainer, bool unpackCompletely = false) { if (templateContainer == null) { Debug.LogError("Template to unpack is null"); return; } var elementsToUnpack = new List <VisualElement>(); var rootVEA = templateContainer.GetVisualElementAsset(); var isRootElement = true; VisualElementAsset rootUnpackedVEA = null; elementsToUnpack.Add(templateContainer); while (elementsToUnpack.Count > 0) { var elementToUnpack = elementsToUnpack[0]; var unpackedVE = new VisualElement(); var templateContainerParent = elementToUnpack.parent; var templateContainerIndex = templateContainerParent.IndexOf(elementToUnpack); // Create new unpacked element and add it in the hierarchy templateContainerParent.Add(unpackedVE); BuilderAssetUtilities.AddElementToAsset(m_PaneWindow.document, unpackedVE, templateContainerIndex + 1); var linkedInstancedVTA = elementToUnpack.GetProperty(BuilderConstants.ElementLinkedInstancedVisualTreeAssetVEPropertyName) as VisualTreeAsset; var linkedTA = elementToUnpack.GetVisualElementAsset() as TemplateAsset; var linkedVTACopy = linkedInstancedVTA.DeepCopy(); var unpackedVEA = unpackedVE.GetVisualElementAsset(); var templateContainerVEA = elementToUnpack.GetVisualElementAsset(); var attributeOverrides = linkedTA.attributeOverrides; var attributes = elementToUnpack.GetOverriddenAttributes(); foreach (var attribute in attributes) { unpackedVEA.SetAttributeValue(attribute.Key, attribute.Value); } if (isRootElement) { rootUnpackedVEA = unpackedVEA; } // Apply attribute overrides to elements in the unpacked element BuilderAssetUtilities.ApplyAttributeOverridesToTreeAsset(attributeOverrides, linkedVTACopy); // Move attribute overrides to new template containers BuilderAssetUtilities.CopyAttributeOverridesToChildTemplateAssets(attributeOverrides, linkedVTACopy); // Apply stylesheets to new element + inline rules BuilderAssetUtilities.AddStyleSheetsFromTreeAsset(unpackedVEA, linkedInstancedVTA); unpackedVEA.ruleIndex = templateContainerVEA.ruleIndex; BuilderAssetUtilities.TransferAssetToAsset(m_PaneWindow.document, unpackedVEA, linkedVTACopy, false); elementsToUnpack.Remove(elementToUnpack); if (elementToUnpack != templateContainer) { BuilderAssetUtilities.DeleteElementFromAsset(m_PaneWindow.document, elementToUnpack, false); elementToUnpack.RemoveFromHierarchy(); } if (unpackCompletely && elementsToUnpack.Count == 0) { VisualElement tree = new VisualElement(); m_PaneWindow.document.activeOpenUXMLFile.visualTreeAsset.LinkedCloneTree(tree); var newElement = tree.Query <VisualElement>().Where(x => x.GetVisualElementAsset() == rootUnpackedVEA).First(); var newTemplates = newElement.Query <TemplateContainer>().Where(x => x.GetVisualElementAsset() != null).ToList(); elementsToUnpack.AddRange(newTemplates); isRootElement = false; } } m_Selection.NotifyOfHierarchyChange(); m_PaneWindow.OnEnableAfterAllSerialization(); // Keep hierarchy tree state in the new unpacked element var hierarchy = Builder.ActiveWindow.hierarchy; hierarchy.elementHierarchyView.CopyTreeViewItemStates(rootVEA, rootUnpackedVEA); // Delete old template element BuilderAssetUtilities.DeleteElementFromAsset(m_PaneWindow.document, templateContainer, false); templateContainer.RemoveFromHierarchy(); m_Selection.ClearSelection(null); rootUnpackedVEA.Select(); m_Selection.NotifyOfHierarchyChange(); m_PaneWindow.OnEnableAfterAllSerialization(); }