public static Rect DrawElementStackVertical <T>(Rect rect, float rowHeight, List <T> elements, StackElementDrawer <T> drawer, StackElementWidthGetter <T> widthGetter, float elementMargin = 5f) { tmpRects.Clear(); for (int i = 0; i < elements.Count; i++) { tmpRects.Add(new StackedElementRect(new Rect(0f, 0f, widthGetter(elements[i]), rowHeight), i)); } int elem = Mathf.FloorToInt(rect.height / rowHeight); spacingCache.Reset(elem); int num = 0; float num2 = 0f; float num3 = 0f; for (int j = 0; j < tmpRects.Count; j++) { StackedElementRect stackedElementRect = tmpRects[j]; if (num3 + stackedElementRect.rect.height > rect.height) { num3 = 0f; num = 0; } drawer(new Rect(rect.x + spacingCache.GetSpaceFor(num), rect.y + num3, stackedElementRect.rect.width, stackedElementRect.rect.height), elements[stackedElementRect.elementIndex]); num3 += stackedElementRect.rect.height + elementMargin; spacingCache.AddSpace(num, stackedElementRect.rect.width + elementMargin); num2 = Mathf.Max(num2, spacingCache.GetSpaceFor(num)); num++; } return(new Rect(rect.x, rect.y, num2, num3 + rowHeight)); }
public static Rect DrawElementStack <T>(Rect rect, float rowHeight, List <T> elements, StackElementDrawer <T> drawer, StackElementWidthGetter <T> widthGetter, float rowMargin = 4f, float elementMargin = 5f, bool allowOrderOptimization = true) { tmpRects.Clear(); tmpRects2.Clear(); for (int i = 0; i < elements.Count; i++) { tmpRects.Add(new StackedElementRect(new Rect(0f, 0f, widthGetter(elements[i]), rowHeight), i)); } int num = Mathf.FloorToInt(rect.height / rowHeight); List <StackedElementRect> list = tmpRects; float num3; float num2; if (allowOrderOptimization) { num3 = (num2 = 0f); while (num2 < (float)num) { StackedElementRect item = default(StackedElementRect); int num4 = -1; for (int j = 0; j < list.Count; j++) { StackedElementRect stackedElementRect = list[j]; if (num4 == -1 || (item.rect.width < stackedElementRect.rect.width && stackedElementRect.rect.width < rect.width - num3)) { num4 = j; item = stackedElementRect; } } if (num4 == -1) { if (num3 == 0f) { break; } num3 = 0f; num2 += 1f; } else { num3 += item.rect.width + elementMargin; tmpRects2.Add(item); } list.RemoveAt(num4); if (list.Count <= 0) { break; } } list = tmpRects2; } num3 = (num2 = 0f); while (list.Count > 0) { StackedElementRect stackedElementRect2 = list[0]; if (num3 + stackedElementRect2.rect.width > rect.width) { num3 = 0f; num2 += rowHeight + rowMargin; } drawer(new Rect(rect.x + num3, rect.y + num2, stackedElementRect2.rect.width, stackedElementRect2.rect.height), elements[stackedElementRect2.elementIndex]); num3 += stackedElementRect2.rect.width + elementMargin; list.RemoveAt(0); } return(new Rect(rect.x, rect.y, rect.width, num2 + rowHeight)); }