PendingChangesMultiColumnHeader.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System.Collections.Generic;
  2. using UnityEditor;
  3. using UnityEditor.IMGUI.Controls;
  4. using UnityEngine;
  5. using PlasticGui.WorkspaceWindow.PendingChanges;
  6. using Unity.PlasticSCM.Editor.UI;
  7. namespace Unity.PlasticSCM.Editor.Views.PendingChanges
  8. {
  9. internal class PendingChangesMultiColumnHeader : MultiColumnHeader
  10. {
  11. internal PendingChangesMultiColumnHeader(
  12. MultiColumnHeaderState headerState, UnityPendingChangesTree tree)
  13. : base(headerState)
  14. {
  15. mPendingChangesTree = tree;
  16. }
  17. protected override void ColumnHeaderGUI(MultiColumnHeaderState.Column column, Rect headerRect, int columnIndex)
  18. {
  19. if (columnIndex == 0)
  20. {
  21. bool checkAllWasMixed = IsMixedCheckedState();
  22. bool checkAllWasTrue = IsAllCheckedState();
  23. var checkRect = new Rect(
  24. headerRect.x + UnityConstants.TREEVIEW_BASE_INDENT,
  25. headerRect.y + 3 + UnityConstants.TREEVIEW_HEADER_CHECKBOX_Y_OFFSET, // Custom offset because header labels are not centered
  26. UnityConstants.TREEVIEW_CHECKBOX_SIZE,
  27. headerRect.height);
  28. EditorGUI.showMixedValue = checkAllWasMixed;
  29. bool checkAllIsTrue = EditorGUI.Toggle(
  30. checkRect,
  31. checkAllWasTrue);
  32. EditorGUI.showMixedValue = false;
  33. if (checkAllWasTrue != checkAllIsTrue)
  34. {
  35. UpdateCheckedState(checkAllIsTrue);
  36. }
  37. headerRect.x = checkRect.xMax;
  38. }
  39. base.ColumnHeaderGUI(column, headerRect, columnIndex);
  40. }
  41. internal bool IsAllCheckedState()
  42. {
  43. List<PendingChangeCategory> categories = mPendingChangesTree.GetNodes();
  44. if (categories == null)
  45. return false;
  46. foreach (PendingChangeCategory category in categories)
  47. {
  48. if (!category.IsChecked())
  49. return false;
  50. }
  51. return true;
  52. }
  53. protected bool IsMixedCheckedState()
  54. {
  55. List<PendingChangeCategory> categories = mPendingChangesTree.GetNodes();
  56. if (categories == null)
  57. return false;
  58. if (IsAllCheckedState())
  59. return false;
  60. foreach (PendingChangeCategory category in categories)
  61. {
  62. if (category.GetCheckedChangesCount() > 0)
  63. return true;
  64. }
  65. return false;
  66. }
  67. internal void UpdateCheckedState(bool isChecked)
  68. {
  69. List<PendingChangeCategory> categories = mPendingChangesTree.GetNodes();
  70. if (categories == null)
  71. return;
  72. foreach (PendingChangeCategory category in categories)
  73. category.UpdateCheckedState(isChecked);
  74. }
  75. protected UnityPendingChangesTree mPendingChangesTree;
  76. }
  77. }