Ei kuvausta
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.

ImportColumn.cs 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.U2D.Common;
  5. using UnityEngine.UIElements;
  6. namespace UnityEditor.U2D.PSD
  7. {
  8. /// <summary>
  9. /// Import Cell
  10. /// </summary>
  11. internal class UICellImportElement : UICellElement
  12. {
  13. VisualElement m_WarningIcon;
  14. Toggle m_ImportToggle;
  15. Toggle m_CollapseToggle;
  16. VisualElement m_CollapseToggleCheckMark;
  17. public UICellImportElement()
  18. {
  19. m_WarningIcon = new VisualElement()
  20. {
  21. name = "WarningIcon",
  22. tooltip = Tooltips.hiddenLayerNotImportWarning
  23. };
  24. m_ImportToggle = new Toggle()
  25. {
  26. name = "UICellImportToggle"
  27. };
  28. m_CollapseToggle = new Toggle()
  29. {
  30. name = "UICellCollapseToggle"
  31. };
  32. m_CollapseToggle.tooltip = Tooltips.groupSeparatedToolTip;
  33. m_CollapseToggleCheckMark = m_CollapseToggle.Q("unity-checkmark");
  34. m_ImportToggle.RegisterValueChangedCallback(ToggleImportChange);
  35. m_CollapseToggle.RegisterValueChangedCallback(ToggleCollapseChange);
  36. m_CollapseToggle.RegisterCallback<MouseEnterEvent>(CollapseToggleMouseEnter);
  37. m_CollapseToggle.RegisterCallback<MouseOutEvent>(CollapseToggleMouseOut);
  38. Add(m_ImportToggle);
  39. Add(m_WarningIcon);
  40. Add(m_CollapseToggle);
  41. }
  42. void CollapseToggleMouseOut(MouseOutEvent evt)
  43. {
  44. if (m_CollapseToggle.enabledSelf)
  45. {
  46. if (m_CollapseToggle.showMixedValue && m_CollapseToggle.value == false)
  47. {
  48. m_CollapseToggleCheckMark.visible = true;
  49. }
  50. }
  51. }
  52. void CollapseToggleMouseEnter(MouseEnterEvent evt)
  53. {
  54. if (m_CollapseToggle.enabledSelf)
  55. {
  56. if (m_CollapseToggle.showMixedValue && m_CollapseToggle.value == false)
  57. {
  58. m_CollapseToggleCheckMark.visible = false;
  59. }
  60. }
  61. }
  62. void ShowHideCollapseToggleCheckMark()
  63. {
  64. if (m_CollapseToggle.showMixedValue && m_CollapseToggle.value == false)
  65. {
  66. if(!m_CollapseToggle.IsHovered())
  67. m_CollapseToggleCheckMark.visible = true;
  68. }
  69. else
  70. {
  71. m_CollapseToggleCheckMark.visible = false;
  72. }
  73. }
  74. public override void BindPSDNode(int index, PSDImporterLayerManagementMultiColumnTreeView treeView)
  75. {
  76. base.BindPSDNode(index, treeView);
  77. var node = psdTreeViewNode;
  78. m_WarningIcon.visible = node.disable;
  79. if (node is PSDFoldoutTreeViewNode)
  80. {
  81. var collapsable = (PSDFoldoutTreeViewNode)node;
  82. SetToggleActive(m_CollapseToggle, true);
  83. m_CollapseToggle.tooltip = collapsable.flatten ? Tooltips.groupMergedToolTip : Tooltips.groupSeparatedToolTip;
  84. }
  85. else
  86. {
  87. SetToggleActive(m_CollapseToggle, false);
  88. }
  89. if (node is PSDFileTreeViewNode)
  90. {
  91. SetToggleActive(m_ImportToggle, false);
  92. }
  93. else
  94. {
  95. SetToggleActive(m_ImportToggle, true);
  96. }
  97. Update();
  98. }
  99. void SetToggleActive(Toggle t, bool b)
  100. {
  101. t.visible = b;
  102. t.SetEnabled(b);
  103. }
  104. public void Update()
  105. {
  106. var node = psdTreeViewNode;
  107. if (node != null)
  108. {
  109. m_WarningIcon.visible = node.disable && treeView.importHidden == false;
  110. if(m_ImportToggle.value != node.importLayer)
  111. m_ImportToggle.SetValueWithoutNotify(node.importLayer);
  112. if (node is PSDFoldoutTreeViewNode)
  113. {
  114. var group = (PSDFoldoutTreeViewNode)node;
  115. if (m_CollapseToggle.value != group.flatten)
  116. {
  117. m_CollapseToggle.SetValueWithoutNotify(group.flatten);
  118. m_CollapseToggle.showMixedValue = false;
  119. }
  120. // check if any child nodes are collapse
  121. var showMix = ChildrenIsCollapsed(node);
  122. if (group.flatten == false && m_CollapseToggle.showMixedValue != showMix)
  123. {
  124. m_CollapseToggle.showMixedValue = showMix;
  125. if (showMix)
  126. m_CollapseToggle.tooltip = Tooltips.groupMixedToolTip;
  127. ShowHideCollapseToggleCheckMark();
  128. }
  129. }
  130. }
  131. }
  132. bool ChildrenIsCollapsed(PSDTreeViewNode treeViewNode)
  133. {
  134. for (int i = 0; i < treeViewNode?.children?.Count; ++i)
  135. {
  136. var c = treeViewNode.children[i] as PSDTreeViewNode;
  137. if (c != null && c is PSDFoldoutTreeViewNode)
  138. {
  139. var b = ((PSDFoldoutTreeViewNode)c);
  140. if (b.flatten || ChildrenIsCollapsed(c))
  141. return true;
  142. }
  143. }
  144. return false;
  145. }
  146. void ToggleImportChange(ChangeEvent<bool> e)
  147. {
  148. var value = e.newValue;
  149. psdTreeViewNode.importLayer = value;
  150. SetChildrenNodeImport(psdTreeViewNode, value);
  151. var parent = psdTreeViewNode.parent as PSDFoldoutTreeViewNode;
  152. if (value)
  153. {
  154. while (parent != null)
  155. {
  156. parent.importLayer = true;
  157. parent = parent.parent as PSDFoldoutTreeViewNode;
  158. }
  159. }
  160. else
  161. {
  162. // if parent's children are all off, we turn off parent
  163. while (parent != null)
  164. {
  165. var import = false;
  166. foreach(var c in parent.children)
  167. {
  168. var n = (PSDTreeViewNode)c;
  169. if (n.importLayer)
  170. {
  171. import = true;
  172. break;
  173. }
  174. }
  175. parent.importLayer = import;
  176. parent = parent.parent as PSDFoldoutTreeViewNode;
  177. }
  178. }
  179. }
  180. internal static void SetChildrenNodeImport(PSDTreeViewNode treeViewNode, bool value)
  181. {
  182. treeViewNode.importLayer = value;
  183. if (treeViewNode.children != null)
  184. {
  185. foreach (var c in treeViewNode.children)
  186. {
  187. var p = (PSDTreeViewNode)c;
  188. p.importLayer = value;
  189. SetChildrenNodeImport(p, value);
  190. }
  191. }
  192. }
  193. void ToggleCollapseChange(ChangeEvent<bool> e)
  194. {
  195. if (psdTreeViewNode != null)
  196. {
  197. var newValue = e.newValue;
  198. if (psdTreeViewNode is PSDFoldoutTreeViewNode )
  199. {
  200. var group = (PSDFoldoutTreeViewNode)psdTreeViewNode;
  201. group.flatten = newValue;
  202. if(newValue)
  203. m_CollapseToggle.showMixedValue = false;
  204. m_CollapseToggle.tooltip = newValue ? Tooltips.groupMergedToolTip : Tooltips.groupSeparatedToolTip;
  205. }
  206. }
  207. }
  208. }
  209. internal interface ILayerImportColumnField
  210. {
  211. VisualElement MakeHeader();
  212. VisualElement MakeCell();
  213. void UnBindCell(VisualElement e, PSDTreeViewNode node);
  214. void BindCell(VisualElement e, PSDTreeViewNode node, SerializedProperty module);
  215. void UpdateCell(VisualElement e, PSDTreeViewNode node);
  216. }
  217. /// <summary>
  218. /// Import Column
  219. /// </summary>
  220. internal class UILayerImportColumn : UIColumn, IColumnUpdate
  221. {
  222. ImportColumnHeaderToggle m_ImportHeaderToggle;
  223. IList<SerializedProperty> m_ImportColumnFieldsSP;
  224. ILayerImportColumnField[] m_ImportColumnFields;
  225. Action ImportSelectionMenu = null;
  226. public UILayerImportColumn(PSDImporterLayerManagementMultiColumnTreeView treeView): base(treeView)
  227. {
  228. makeCell = () =>
  229. {
  230. var cell = new UICellImportElement()
  231. {
  232. name = "UICellImportElement"
  233. };
  234. if (m_ImportColumnFields != null)
  235. {
  236. foreach (var module in m_ImportColumnFields)
  237. {
  238. var v = module.MakeCell();
  239. if(v != null)
  240. cell.Add(v);
  241. }
  242. }
  243. return cell;
  244. };
  245. bindCell = BindCell;
  246. destroyCell = DestroyCell;
  247. unbindCell = UnBindCell;
  248. makeHeader = MakeHeader;
  249. title = "Import Settings";
  250. optional = false;
  251. stretchable = false;
  252. sortable = false;
  253. resizable = false;
  254. width = 70;
  255. minWidth = 70;
  256. maxWidth = 70;
  257. }
  258. public virtual void DestroyCell(VisualElement e)
  259. { }
  260. public virtual void UnBindCell(VisualElement e, int index)
  261. {
  262. var toggle = (UICellImportElement)e;
  263. toggle.UnbindPSDNode();
  264. if (m_ImportColumnFields != null)
  265. {
  266. foreach (var module in m_ImportColumnFields)
  267. {
  268. module.UnBindCell(e, treeView.GetFromIndex(index));
  269. }
  270. }
  271. }
  272. public virtual void BindCell(VisualElement e, int index)
  273. {
  274. var toggle = (UICellImportElement)e;
  275. toggle.BindPSDNode(index, treeView);
  276. if (m_ImportColumnFields != null)
  277. {
  278. for(int i = 0; i < m_ImportColumnFields.Length; ++i)
  279. {
  280. m_ImportColumnFields[i].BindCell(e, treeView.GetFromIndex(index), m_ImportColumnFieldsSP[i]);
  281. }
  282. }
  283. }
  284. void IColumnUpdate.Update()
  285. {
  286. if (ImportSelectionMenu != null)
  287. {
  288. ImportSelectionMenu.Invoke();
  289. ImportSelectionMenu = null;
  290. }
  291. m_ImportHeaderToggle.SetHeaderImportToggleValue(treeView.data[0].importLayer);
  292. for (int i = 0; i < treeView.itemsSource.Count; ++i)
  293. {
  294. var v = treeView.GetRootElementForIndex(i)?.Q<UICellImportElement>();
  295. v?.Update();
  296. if (m_ImportColumnFields != null)
  297. {
  298. var node = treeView.GetFromIndex(i);
  299. foreach (var module in m_ImportColumnFields)
  300. {
  301. module.UpdateCell(v, node);
  302. }
  303. }
  304. }
  305. }
  306. VisualElement MakeHeader()
  307. {
  308. var ve = new VisualElement()
  309. {
  310. name = "ImportHeaderToggle"
  311. };
  312. m_ImportHeaderToggle = new ImportColumnHeaderToggle(ShowContextMenu, HeaderImportToggleChange);
  313. ve.Add(m_ImportHeaderToggle);
  314. var collapseHeader = new VisualElement()
  315. {
  316. name = "CollapseHeader"
  317. };
  318. var collapseHeaderIcon = new VisualElement()
  319. {
  320. name = "CollapseHeaderIcon",
  321. tooltip = Tooltips.collapseToggleTooltip
  322. };
  323. collapseHeader.Add(collapseHeaderIcon);
  324. ve.Add(collapseHeader);
  325. if (m_ImportColumnFields != null)
  326. {
  327. foreach (var i in m_ImportColumnFields)
  328. {
  329. var v = i.MakeHeader();
  330. if(v != null)
  331. ve.Add(v);
  332. }
  333. }
  334. return ve;
  335. }
  336. void ShowContextMenu()
  337. {
  338. var menu = new GenericMenu();
  339. menu.AddItem(new GUIContent("Select All Visible Layers"), false, () => ImportSelectionMenu = SelectAllVisibleLayers);
  340. menu.AddItem(new GUIContent("Deselect All Visible Layers"), false, () => ImportSelectionMenu = DeselectAllVisibleLayers);
  341. menu.AddItem(new GUIContent("Select All Hidden Layers"), false, () => ImportSelectionMenu = SelectAllHiddenLayers);
  342. menu.AddItem(new GUIContent("Deselect All Hidden Layers"), false, () => ImportSelectionMenu =DeselectAllHiddenLayers);
  343. menu.DropDown(m_ImportHeaderToggle.worldBound);
  344. }
  345. void HeaderImportToggleChange(bool b)
  346. {
  347. // Should always be the first one
  348. treeView.data[0].importLayer = b;
  349. UICellImportElement.SetChildrenNodeImport(treeView.data[0], b);
  350. }
  351. internal void SelectAllVisibleLayers()
  352. {
  353. foreach (var d in treeView.data)
  354. {
  355. if (!d.disable)
  356. d.importLayer = true;
  357. }
  358. }
  359. internal void DeselectAllVisibleLayers()
  360. {
  361. foreach (var d in treeView.data)
  362. {
  363. if (!d.disable)
  364. d.importLayer = false;
  365. }
  366. }
  367. internal void SelectAllHiddenLayers()
  368. {
  369. foreach (var d in treeView.data)
  370. {
  371. if (d.disable)
  372. d.importLayer = true;
  373. }
  374. }
  375. internal void DeselectAllHiddenLayers()
  376. {
  377. foreach (var d in treeView.data)
  378. {
  379. if (d.disable)
  380. d.importLayer = false;
  381. }
  382. }
  383. }
  384. }