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