r2mods/ilspy_dump/ror2_csproj/RoR2.UI/ColumnLayoutGroupElement.cs

94 lines
2.5 KiB
C#
Raw Normal View History

2024-10-04 07:26:37 +00:00
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace RoR2.UI;
[RequireComponent(typeof(RectTransform))]
[RequireComponent(typeof(LayoutElement))]
[ExecuteAlways]
public class ColumnLayoutGroupElement : MonoBehaviour, IBeginDragHandler, IEventSystemHandler, IDragHandler
{
private enum ClickLocation
{
None,
Middle,
RightHandle,
LeftHandle
}
private RectTransform rectTransform;
private LayoutElement layoutElement;
public RectTransform rectTransformToLayoutInvalidate;
private float handleWidth = 4f;
private ClickLocation lastClickLocation;
private void Awake()
{
rectTransform = (RectTransform)base.transform;
layoutElement = GetComponent<LayoutElement>();
}
public void OnBeginDrag(PointerEventData eventData)
{
ClickLocation clickLocation = ClickLocation.None;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out var localPoint))
{
Rect rect = rectTransform.rect;
float width = rect.width;
Vector2 vector = new Vector2(localPoint.x * rect.width, localPoint.y * rect.height);
clickLocation = ClickLocation.Middle;
if (vector.x < handleWidth)
{
clickLocation = ClickLocation.LeftHandle;
}
if (vector.x > width - handleWidth)
{
clickLocation = ClickLocation.RightHandle;
}
}
lastClickLocation = clickLocation;
}
public void OnDrag(PointerEventData eventData)
{
Transform parent = rectTransform.parent;
int siblingIndex = rectTransform.GetSiblingIndex();
if (lastClickLocation == ClickLocation.LeftHandle && siblingIndex != 0)
{
AdjustWidth(parent.GetChild(siblingIndex - 1)?.GetComponent<LayoutElement>(), layoutElement, eventData.delta.x);
}
if (lastClickLocation == ClickLocation.RightHandle && siblingIndex != parent.childCount - 1)
{
AdjustWidth(layoutElement, parent.GetChild(siblingIndex + 1)?.GetComponent<LayoutElement>(), eventData.delta.x);
}
void AdjustWidth(LayoutElement lhs, LayoutElement rhs, float change)
{
if ((bool)lhs && (bool)rhs)
{
if (lhs.preferredWidth + change < lhs.minWidth)
{
change = lhs.minWidth - lhs.preferredWidth;
}
if (rhs.preferredWidth - change < rhs.minWidth)
{
change = rhs.preferredWidth - rhs.minWidth;
}
if (change != 0f)
{
lhs.preferredWidth += change;
rhs.preferredWidth -= change;
if ((bool)rectTransformToLayoutInvalidate)
{
LayoutRebuilder.MarkLayoutForRebuild(rectTransformToLayoutInvalidate);
}
}
}
}
}
}