using System.Collections.Generic; using System.IO; using System.Xml.Linq; using UnityEditor; using UnityEngine; namespace Wwise.Wooduan.Tools { internal enum ComponentBackupStatus { Unhandled, Saved, Reverted, Removed } internal class ComponentComparisonData { internal string AssetPath; internal ComponentBackupStatus BackupStatus; internal XElement ComponentData; internal string AssetName { get { return Path.GetFileNameWithoutExtension(AssetPath); } } } internal abstract class AsCompareWindow : AkWooduanAssetSearcher { internal static readonly List MissingComponents = new List(); internal static readonly List ModifiedComponents = new List(); internal static readonly List EmptyComponents = new List(); private Vector2 _scrollPosition1, _scrollPosition2, _scrollPosition3; private void OnDestroy() { MissingComponents.Clear(); ModifiedComponents.Clear(); EmptyComponents.Clear(); } private void OnGUI() { DrawComponentList(MissingComponents, "Missing", ref _scrollPosition1); DrawComponentList(ModifiedComponents, "Modified", ref _scrollPosition2); DrawComponentList(EmptyComponents, "Empty", ref _scrollPosition3); } protected virtual void DrawComponentList(List dataList, string description, ref Vector2 scrollPosition) { if (dataList.Count > 0) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(description + " Components", EditorStyles.boldLabel); if (dataList == MissingComponents && GUILayout.Button("Remove All", GUILayout.Width(110))) RemoveAll(dataList); EditorGUILayout.EndHorizontal(); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, GUILayout.Height(150)); foreach (var data in dataList) { EditorGUILayout.BeginHorizontal(); DisplayData(data); if (data.BackupStatus != ComponentBackupStatus.Removed) { GUI.contentColor = Color.yellow; if (GUILayout.Button("Locate", EditorStyles.toolbarButton, GUILayout.Width(50))) LocateComponent(data); GUI.contentColor = Color.red; if (dataList == MissingComponents && GUILayout.Button("Remove", EditorStyles.toolbarButton, GUILayout.Width(50))) { RemoveComponent(data); data.BackupStatus = ComponentBackupStatus.Removed; AssetDatabase.SaveAssets(); } GUI.contentColor = Color.white; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); } } else EditorGUILayout.LabelField("No " + description + " Components Found", EditorStyles.boldLabel); EditorGUILayout.Separator(); } protected void RemoveAll(IEnumerable dataList) { foreach (var data in dataList) { RemoveComponent(data); data.BackupStatus = ComponentBackupStatus.Removed; } AssetDatabase.SaveAssets(); } protected abstract void DisplayData(ComponentComparisonData data); protected abstract void LocateComponent(ComponentComparisonData data); protected abstract void RemoveComponent(ComponentComparisonData data); } internal class AsXmlInfo : EditorWindow { private XElement _xComponent; private static AsXmlInfo _instance; private int _lines; private int _maxChar = 20; internal static void Init(XElement node) { var position = GUIUtility.GUIToScreenPoint(Event.current.mousePosition); position.y += 10; _instance = CreateInstance(); _instance.ShowAsDropDown(new Rect(position, Vector2.zero), Vector2.zero); _instance.titleContent = new GUIContent("Original"); _instance._xComponent = node; } private void OnGUI() { _instance.minSize = new Vector2(_maxChar * 7, _lines * 22); _lines = _maxChar = 0; foreach (var child in _xComponent.Elements()) { DisplayXml(child); } } private void DisplayXml(XElement node) { if (node.HasAttributes) { EditorGUILayout.LabelField(node.Name + ": ", EditorStyles.boldLabel); _lines++; using (new GUILayout.VerticalScope("box")) { foreach (var attribute in node.Attributes()) { var label = " " + attribute.Name + ": " + attribute.Value; EditorGUILayout.LabelField(label); _maxChar = Mathf.Max(_maxChar, label.Length); _lines++; } } } foreach (var child in node.Elements()) { DisplayXml(child); } } } }