// /*=============================================================================== // Copyright (C) 2020 PhantomsXR Ltd. All Rights Reserved. // // This file is part of the AR-MOD SDK. // // The AR-MOD SDK cannot be copied, distributed, or made available to // third-parties for commercial purposes without written permission of PhantomsXR Ltd. // // Contact info@phantomsxr.com for licensing requests. // ===============================================================================*/ using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEditor.IMGUI.Controls; using UnityEngine; using UnityEngine.UIElements; namespace Phantom.XRMOD.XRMODPackageTools.Editor { public class ContentView : VisualElement { public static ContentTreeRenderer treeRenderer; private List nameColumnList = new List(); internal float height = 0; public new class UxmlFactory : UxmlFactory { } public ContentView() { BuildTreeView(); DrawContentList(); } internal void DrawContentList() { IMGUIContainer tmp_IMGUIContainer = new IMGUIContainer(() => { var tmp_Rect = EditorGUILayout.GetControlRect(false, layout.height); treeRenderer.OnGUI(tmp_Rect); }); Add(tmp_IMGUIContainer); AddToClassList("full-vertical-view"); tmp_IMGUIContainer.AddToClassList("full-vertical-view"); } internal void BuildTreeView() { var tmp_IconColumn = new MultiColumnHeaderState.Column() { headerContent = new GUIContent(EditorGUIUtility.FindTexture("AlphabeticalSorting"), ""), contextMenuText = "AssetType", headerTextAlignment = TextAlignment.Left, sortedAscending = true, sortingArrowAlignment = TextAlignment.Right, width = 30, minWidth = 30, maxWidth = 30, autoResize = false, allowToggleVisibility = true, canSort = true, }; var tmp_NameColumn = new MultiColumnHeaderState.Column() { headerContent = new GUIContent("Asset Name"), headerTextAlignment = TextAlignment.Left, sortedAscending = true, sortingArrowAlignment = TextAlignment.Right, width = 200, minWidth = 60, autoResize = false, allowToggleVisibility = false, canSort = false }; var tmp_FullPathColumn = new MultiColumnHeaderState.Column() { headerContent = new GUIContent("Asset Path"), headerTextAlignment = TextAlignment.Left, sortedAscending = false, sortingArrowAlignment = TextAlignment.Left, width = 1000, minWidth = 60, autoResize = true }; nameColumnList.Add(tmp_IconColumn); nameColumnList.Add(tmp_NameColumn); nameColumnList.Add(tmp_FullPathColumn); var headerState = new MultiColumnHeaderState(nameColumnList.ToArray()); var multiColumnHeader = new MultiColumnHeader(headerState); multiColumnHeader.sortingChanged += _header => { var tmp_DetailCacheData = PackageToolsEditor.ALL_PROJECT_CACHE.GetEditingProjectData().DetailCacheData; switch (_header.sortedColumnIndex) { // Sort with AssetType case 0 when _header.IsSortedAscending(0): tmp_DetailCacheData.Contents.Sort((a, b) => { int tmp_TypeComparison = string.Compare(a.Type.Split(".").Last(), b.Type.Split(".").Last(), StringComparison.Ordinal); if (tmp_TypeComparison != 0) return tmp_TypeComparison; // Type不同,直接用Type的比较结果 // Type相同,再比较AssetPathInUnity return string.Compare(a.DisplayName, b.DisplayName, StringComparison.Ordinal); }); break; case 0: tmp_DetailCacheData.Contents.Sort((a, b) => { int tmp_TypeComparison = string.Compare(a.Type.Split(".").Last(), b.Type.Split(".").Last(), StringComparison.Ordinal); if (tmp_TypeComparison != 0) return tmp_TypeComparison; // Type不同,直接用Type的比较结果 // Type相同,再比较AssetPathInUnity return string.Compare(b.DisplayName, a.DisplayName, StringComparison.Ordinal); }); break; } int tmp_StartId = 0; foreach (ContentModel tmp_Content in tmp_DetailCacheData.Contents) { tmp_Content.Id = tmp_StartId; tmp_StartId++; } treeRenderer.Reload(); treeRenderer.Repaint(); }; var treeViewState = new TreeViewState(); treeRenderer = new ContentTreeRenderer(treeViewState, multiColumnHeader, PackageToolsEditor.ALL_PROJECT_CACHE); ReBuildContentsType(); treeRenderer.Reload(); } private void ReBuildContentsType() { var tmp_Contents = PackageToolsEditor.ALL_PROJECT_CACHE.GetEditingProjectData().DetailCacheData .Contents; foreach (ContentModel tmp_ContentModel in tmp_Contents) { var tmp_ContentObj = AssetDatabase.LoadAssetAtPath(tmp_ContentModel.AssetPathInUnity, typeof(object)); if (tmp_ContentObj != null) { if (!EditorUtility.IsPersistent(tmp_ContentObj)) continue; // 传入进来的是Object,用GetType会把Sprite认为是Texture2D导致类型拿错。 string tmp_TypeName = tmp_ContentObj.GetType().FullName; var tmp_Assets = AssetDatabase.LoadAllAssetRepresentationsAtPath(tmp_ContentModel.AssetPathInUnity); foreach (var tmp_Asset in tmp_Assets) { if (tmp_Asset is not Sprite) continue; tmp_TypeName = typeof(Sprite).FullName; } tmp_ContentModel.Type = tmp_TypeName; } else { Debug.LogWarning($"Content not found: {tmp_ContentModel.AssetPathInUnity}"); } } } } }