Singularity/Library/PackageCache/com.unity.collab-proxy@2.0.3/Editor/PlasticSCM/Views/PendingChanges/PendingChangesMultiColumnHe...

111 lines
3.6 KiB
C#
Raw Normal View History

2024-05-06 14:45:45 -04:00
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using PlasticGui;
using Unity.PlasticSCM.Editor.UI;
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<IPlasticTreeNode> nodes = mPendingChangesTree.GetNodes();
if (nodes == null || nodes.Count == 0)
return false;
foreach (IPlasticTreeNode node in nodes)
{
if (!(CheckedItems.GetIsCheckedValue(node) ?? false))
return false;
}
return true;
}
protected bool IsMixedCheckedState()
{
List<IPlasticTreeNode> nodes = mPendingChangesTree.GetNodes();
if (nodes == null)
return false;
bool hasCheckedNode = false;
bool hasUncheckedNode = false;
foreach (IPlasticTreeNode node in nodes)
{
if (CheckedItems.GetIsPartiallyCheckedValue(node))
return true;
if (CheckedItems.GetIsCheckedValue(node) ?? false)
hasCheckedNode = true;
else
hasUncheckedNode = true;
if (hasCheckedNode && hasUncheckedNode)
return true;
}
return false;
}
internal void UpdateCheckedState(bool isChecked)
{
List<IPlasticTreeNode> nodes = mPendingChangesTree.GetNodes();
if (nodes == null)
return;
foreach (IPlasticTreeNode node in nodes)
CheckedItems.SetCheckedValue(node, isChecked);
}
readonly PendingChangesTreeView mPendingChangesTreeView;
protected UnityPendingChangesTree mPendingChangesTree;
}
}