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