A game about forced loneliness, made by TACStudios
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}