using System; using System.Collections.Generic; using UnityEngine; [AddComponentMenu("NGUI/Interaction/Grid")] public class UIGrid : UIWidgetContainer { public delegate void OnReposition(); public enum Arrangement { Horizontal, Vertical, CellSnap } public enum Sorting { None, Alphabetic, Horizontal, Vertical, Custom } public Arrangement arrangement; public Sorting sorting; public UIWidget.Pivot pivot; public int maxPerLine; public float cellWidth = 200f; public float cellHeight = 200f; public bool animateSmoothly; public bool hideInactive; public bool keepWithinPanel; public OnReposition onReposition; public Comparison onCustomSort; [HideInInspector] [SerializeField] private bool sorted; protected bool mReposition; protected UIPanel mPanel; protected bool mInitDone; public bool repositionNow { set { if (value) { mReposition = true; base.enabled = true; } } } public List GetChildList() { Transform transform = base.transform; List list = new List(); for (int i = 0; i < transform.childCount; i++) { Transform child = transform.GetChild(i); if (!hideInactive || ((bool)child && NGUITools.GetActive(child.gameObject))) { list.Add(child); } } if (sorting != Sorting.None && arrangement != Arrangement.CellSnap) { if (sorting == Sorting.Alphabetic) { list.Sort(SortByName); } else if (sorting == Sorting.Horizontal) { list.Sort(SortHorizontal); } else if (sorting == Sorting.Vertical) { list.Sort(SortVertical); } else if (onCustomSort != null) { list.Sort(onCustomSort); } else { Sort(list); } } return list; } public Transform GetChild(int index) { List childList = GetChildList(); if (index >= childList.Count) { return null; } return childList[index]; } public int GetIndex(Transform trans) { return GetChildList().IndexOf(trans); } public void AddChild(Transform trans) { AddChild(trans, sort: true); } public void AddChild(Transform trans, bool sort) { if (trans != null) { trans.parent = base.transform; ResetPosition(GetChildList()); } } public bool RemoveChild(Transform t) { List childList = GetChildList(); if (childList.Remove(t)) { ResetPosition(childList); return true; } return false; } protected virtual void Init() { mInitDone = true; mPanel = NGUITools.FindInParents(base.gameObject); } protected virtual void Start() { if (!mInitDone) { Init(); } bool flag = animateSmoothly; animateSmoothly = false; Reposition(); animateSmoothly = flag; base.enabled = false; } protected virtual void Update() { Reposition(); base.enabled = false; } private void OnValidate() { if (!Application.isPlaying && NGUITools.GetActive(this)) { Reposition(); } } public static int SortByName(Transform a, Transform b) { return string.Compare(a.name, b.name); } public static int SortHorizontal(Transform a, Transform b) { return a.localPosition.x.CompareTo(b.localPosition.x); } public static int SortVertical(Transform a, Transform b) { return b.localPosition.y.CompareTo(a.localPosition.y); } protected virtual void Sort(List list) { } [ContextMenu("Execute")] public virtual void Reposition() { if (Application.isPlaying && !mInitDone && NGUITools.GetActive(base.gameObject)) { Init(); } if (sorted) { sorted = false; if (sorting == Sorting.None) { sorting = Sorting.Alphabetic; } NGUITools.SetDirty(this); } List childList = GetChildList(); ResetPosition(childList); if (keepWithinPanel) { ConstrainWithinPanel(); } if (onReposition != null) { onReposition(); } } public void ConstrainWithinPanel() { if (mPanel != null) { mPanel.ConstrainTargetToBounds(base.transform, immediate: true); UIScrollView component = mPanel.GetComponent(); if (component != null) { component.UpdateScrollbars(recalculateBounds: true); } } } protected virtual void ResetPosition(List list) { mReposition = false; int num = 0; int num2 = 0; int num3 = 0; int num4 = 0; Transform transform = base.transform; int i = 0; for (int count = list.Count; i < count; i++) { Transform transform2 = list[i]; Vector3 vector = transform2.localPosition; float z = vector.z; if (arrangement == Arrangement.CellSnap) { if (cellWidth > 0f) { vector.x = Mathf.Round(vector.x / cellWidth) * cellWidth; } if (cellHeight > 0f) { vector.y = Mathf.Round(vector.y / cellHeight) * cellHeight; } } else { vector = ((arrangement == Arrangement.Horizontal) ? new Vector3(cellWidth * (float)num, (0f - cellHeight) * (float)num2, z) : new Vector3(cellWidth * (float)num2, (0f - cellHeight) * (float)num, z)); } if (animateSmoothly && Application.isPlaying && Vector3.SqrMagnitude(transform2.localPosition - vector) >= 0.0001f) { SpringPosition springPosition = SpringPosition.Begin(transform2.gameObject, vector, 15f); springPosition.updateScrollView = true; springPosition.ignoreTimeScale = true; } else { transform2.localPosition = vector; } num3 = Mathf.Max(num3, num); num4 = Mathf.Max(num4, num2); if (++num >= maxPerLine && maxPerLine > 0) { num = 0; num2++; } } if (pivot == UIWidget.Pivot.TopLeft) { return; } Vector2 pivotOffset = NGUIMath.GetPivotOffset(pivot); float num5; float num6; if (arrangement == Arrangement.Horizontal) { num5 = Mathf.Lerp(0f, (float)num3 * cellWidth, pivotOffset.x); num6 = Mathf.Lerp((float)(-num4) * cellHeight, 0f, pivotOffset.y); } else { num5 = Mathf.Lerp(0f, (float)num4 * cellWidth, pivotOffset.x); num6 = Mathf.Lerp((float)(-num3) * cellHeight, 0f, pivotOffset.y); } for (int j = 0; j < transform.childCount; j++) { Transform child = transform.GetChild(j); SpringPosition component = child.GetComponent(); if (component != null) { component.target.x -= num5; component.target.y -= num6; continue; } Vector3 localPosition = child.localPosition; localPosition.x -= num5; localPosition.y -= num6; child.localPosition = localPosition; } } }