暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

PendingChangesMultiColumnHeader.cs 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System.Collections.Generic;
  2. using UnityEditor;
  3. using UnityEditor.IMGUI.Controls;
  4. using UnityEngine;
  5. using PlasticGui;
  6. using Unity.PlasticSCM.Editor.UI;
  7. namespace Unity.PlasticSCM.Editor.Views.PendingChanges
  8. {
  9. internal class PendingChangesMultiColumnHeader : MultiColumnHeader
  10. {
  11. internal PendingChangesMultiColumnHeader(
  12. PendingChangesTreeView treeView,
  13. MultiColumnHeaderState headerState,
  14. UnityPendingChangesTree tree)
  15. : base(headerState)
  16. {
  17. mPendingChangesTreeView = treeView;
  18. mPendingChangesTree = tree;
  19. }
  20. protected override void ColumnHeaderGUI(MultiColumnHeaderState.Column column, Rect headerRect, int columnIndex)
  21. {
  22. if (columnIndex == 0)
  23. {
  24. bool checkAllWasMixed = IsMixedCheckedState();
  25. bool checkAllWasTrue = IsAllCheckedState();
  26. var checkRect = new Rect(
  27. headerRect.x + UnityConstants.TREEVIEW_BASE_INDENT,
  28. headerRect.y + 3 + UnityConstants.TREEVIEW_HEADER_CHECKBOX_Y_OFFSET, // Custom offset because header labels are not centered
  29. UnityConstants.TREEVIEW_CHECKBOX_SIZE,
  30. headerRect.height);
  31. EditorGUI.showMixedValue = checkAllWasMixed;
  32. bool checkAllIsTrue = EditorGUI.Toggle(
  33. checkRect,
  34. checkAllWasTrue);
  35. EditorGUI.showMixedValue = false;
  36. if (checkAllWasTrue != checkAllIsTrue)
  37. {
  38. UpdateCheckedState(checkAllIsTrue);
  39. ((PendingChangesTreeHeaderState)state).UpdateItemColumnHeader(mPendingChangesTreeView);
  40. }
  41. headerRect.x = checkRect.xMax;
  42. headerRect.xMax = column.width;
  43. }
  44. base.ColumnHeaderGUI(column, headerRect, columnIndex);
  45. }
  46. internal bool IsAllCheckedState()
  47. {
  48. IEnumerable<IPlasticTreeNode> nodes = mPendingChangesTree.GetNodes();
  49. if (nodes == null)
  50. return false;
  51. foreach (IPlasticTreeNode node in nodes)
  52. {
  53. if (!(CheckableItems.GetIsCheckedValue(node) ?? false))
  54. return false;
  55. }
  56. return true;
  57. }
  58. protected bool IsMixedCheckedState()
  59. {
  60. IEnumerable<IPlasticTreeNode> nodes = mPendingChangesTree.GetNodes();
  61. if (nodes == null)
  62. return false;
  63. bool hasCheckedNode = false;
  64. bool hasUncheckedNode = false;
  65. foreach (IPlasticTreeNode node in nodes)
  66. {
  67. if (CheckableItems.GetIsPartiallyCheckedValue(node))
  68. return true;
  69. if (CheckableItems.GetIsCheckedValue(node) ?? false)
  70. hasCheckedNode = true;
  71. else
  72. hasUncheckedNode = true;
  73. if (hasCheckedNode && hasUncheckedNode)
  74. return true;
  75. }
  76. return false;
  77. }
  78. internal void UpdateCheckedState(bool isChecked)
  79. {
  80. IEnumerable<IPlasticTreeNode> nodes = mPendingChangesTree.GetNodes();
  81. if (nodes == null)
  82. return;
  83. foreach (IPlasticTreeNode node in nodes)
  84. CheckableItems.SetCheckedValue(node, isChecked);
  85. }
  86. readonly PendingChangesTreeView mPendingChangesTreeView;
  87. protected UnityPendingChangesTree mPendingChangesTree;
  88. }
  89. }