No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PSDImporterMultiColumnTreeViewUI.cs 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEditor.AssetImporters;
  5. using UnityEngine;
  6. using UnityEngine.UIElements;
  7. namespace UnityEditor.U2D.PSD
  8. {
  9. internal class LayerManagementTreeViewData
  10. {
  11. public string assetName;
  12. public PSDImportData importData;
  13. public SerializedProperty layerImportSettings;
  14. public SerializedProperty mosaicLayers;
  15. public SerializedProperty importHiddenLayers;
  16. public SerializedProperty importFileNodeState;
  17. public IPSDLayerMappingStrategy mappingStrategy;
  18. public LayerManagementTreeViewData(SerializedObject so)
  19. {
  20. Update(so);
  21. }
  22. public void Update(SerializedObject so)
  23. {
  24. mosaicLayers = so.FindProperty("m_MosaicLayers");
  25. importHiddenLayers = so.FindProperty("m_ImportHiddenLayers");
  26. importFileNodeState = so.FindProperty("m_ImportFileNodeState");
  27. assetName = Path.GetFileNameWithoutExtension(((ScriptedImporter)so.targetObject).assetPath);
  28. importData = ((PSDImporter)so.targetObject).importData;
  29. mappingStrategy = ((PSDImporter)so.targetObject).GetLayerMappingStrategy();
  30. layerImportSettings = so.FindProperty("m_PSDLayerImportSetting");
  31. }
  32. }
  33. [Serializable]
  34. internal class PSDImporterLayerManagementMultiColumnTreeView : MultiColumnTreeView
  35. {
  36. int m_LastArraySize;
  37. LayerManagementTreeViewData m_LayerManagementTreeViewData;
  38. PSDTreeViewNode[] m_Data;
  39. UILayerImportColumn m_LayerImportColumn;
  40. public void UpdateTreeView(SerializedObject so)
  41. {
  42. m_LayerManagementTreeViewData.Update(so);
  43. SetupColumns();
  44. RebuildTree();
  45. }
  46. void SetupColumns()
  47. {
  48. columns.Clear();
  49. m_LayerImportColumn = new UILayerImportColumn(this)
  50. {
  51. name = "UILayerImportColumn",
  52. };
  53. columns.Add(m_LayerImportColumn);
  54. Column col;
  55. col = new UILayerNameColumn(this)
  56. {
  57. name = "UILayerNameColumn",
  58. };
  59. columns.Add(col);
  60. columns.primaryColumnName = "UILayerNameColumn";
  61. }
  62. public PSDImporterLayerManagementMultiColumnTreeView(SerializedObject so)
  63. {
  64. viewDataKey = "PSDImporterLayerManagementMultiColumnTreeView-ViewDataKey";
  65. m_LayerManagementTreeViewData = new LayerManagementTreeViewData(so);
  66. showAlternatingRowBackgrounds = AlternatingRowBackground.All;
  67. showBorder = true;
  68. UpdateTreeView(so);
  69. }
  70. public PSDTreeViewNode[] data => m_Data;
  71. public bool importHidden => m_LayerManagementTreeViewData.importHiddenLayers.boolValue;
  72. SerializedProperty layerImportSetting => m_LayerManagementTreeViewData.layerImportSettings;
  73. IList<PSDLayerData> importLayerData => m_LayerManagementTreeViewData.importData.psdLayerData;
  74. IPSDLayerMappingStrategy layerMappingStrategy => m_LayerManagementTreeViewData.mappingStrategy;
  75. void RebuildTree()
  76. {
  77. SetRootItems(BuildTree());
  78. Rebuild();
  79. }
  80. public void Update()
  81. {
  82. foreach (var c in columns)
  83. {
  84. if (c is IColumnUpdate)
  85. {
  86. ((IColumnUpdate)c).Update();
  87. }
  88. }
  89. }
  90. List<TreeViewItemData<int>> BuildTree()
  91. {
  92. var treeViewData = new List<TreeViewItemData<int>>();
  93. layerImportSetting.serializedObject.Update();
  94. m_LastArraySize = layerImportSetting.arraySize;
  95. var fileRoot = new PSDFileTreeViewNode(m_LayerManagementTreeViewData)
  96. {
  97. id = 0, displayName = m_LayerManagementTreeViewData.assetName
  98. };
  99. //fileRoot.icon = EditorGUIUtility.IconContent("Texture Icon").image as Texture2D;
  100. var spWrapper = new List<PSDLayerImportSettingSerializedPropertyWrapper>();
  101. if (layerImportSetting.arraySize > 0)
  102. {
  103. var firstElement = layerImportSetting.GetArrayElementAtIndex(0);
  104. for (int i = 0; i < layerImportSetting.arraySize; ++i)
  105. {
  106. spWrapper.Add(new PSDLayerImportSettingSerializedPropertyWrapper(firstElement, layerImportSetting, null, i));
  107. firstElement.Next(false);
  108. }
  109. }
  110. if (importLayerData != null)
  111. {
  112. PSDTreeViewNode[] nodes = new PSDTreeViewNode[importLayerData.Count+1];
  113. nodes[0] = fileRoot;
  114. for(int i = 1; i <= importLayerData.Count; ++i)
  115. {
  116. var l = importLayerData[i-1];
  117. var importSettingIndex = spWrapper.FindIndex(x => layerMappingStrategy.Compare(x, l));
  118. PSDLayerImportSettingSerializedPropertyWrapper importSetting = null;
  119. if (importSettingIndex < 0)
  120. {
  121. importSetting = new PSDLayerImportSettingSerializedPropertyWrapper(null, layerImportSetting, l, layerImportSetting.arraySize)
  122. {
  123. wasLayerImported = l.isVisible || m_LayerManagementTreeViewData.importHiddenLayers.boolValue
  124. };
  125. }
  126. else
  127. {
  128. importSetting = spWrapper[importSettingIndex];
  129. spWrapper.RemoveAt(importSettingIndex);
  130. }
  131. if (l != null && l.isGroup)
  132. nodes[i] = new PSDGroupTreeViewNode(l, i, importSetting);
  133. else
  134. nodes[i] = new PSDLayerTreeViewNode(l, i, importSetting);
  135. var node = nodes[i];
  136. node.disable = !node.layer.isVisible;
  137. while (node.layer.parentIndex != -1 && nodes[i].disable == false)
  138. {
  139. if (!node.layer.isVisible || !nodes[node.layer.parentIndex + 1].layer.isVisible)
  140. {
  141. nodes[i].disable = true;
  142. }
  143. node = nodes[node.layer.parentIndex+1];
  144. }
  145. }
  146. foreach (var node in nodes)
  147. {
  148. PSDTreeViewNode rootTreeViewNode = null;
  149. if (node.layer == null)
  150. continue;
  151. if (node.layer.parentIndex == -1)
  152. {
  153. rootTreeViewNode = fileRoot;
  154. }
  155. else
  156. {
  157. rootTreeViewNode = nodes[node.layer.parentIndex+1];
  158. }
  159. rootTreeViewNode.AddChild(node);
  160. }
  161. m_Data = nodes;
  162. }
  163. else
  164. {
  165. m_Data = new[] { fileRoot };
  166. }
  167. treeViewData.Add(fileRoot.BuildTreeViewItemData());
  168. return treeViewData;
  169. }
  170. public PSDTreeViewNode GetFromIndex(int i)
  171. {
  172. var e = GetItemDataForIndex<int>(i);
  173. return m_Data[e];
  174. }
  175. }
  176. }