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