public void Inflate(ItemsEdge itemEdge, IItem item) { IWidget widget = _itemWidgetsPool.GetWidget(item); widget.Fill(item); RectTransform widgetRectTransform = widget.rectTransform; SetPivotAndAnchors(widgetRectTransform); widget.RecalcRect(); // Change edge last position WidgetsAlignment itemWidgetEdge = GetItemWidgetEdge(itemEdge); float inflationSign = WidgetsAlignmentDesc.HeadInflationSigns[itemWidgetEdge]; float nextPositionFloat = _edgesLastPositions[itemWidgetEdge] + _spacing * inflationSign; Vector2 axisMask = AxisMaskDesc.AxisMasks[_axis]; Vector2 nextWidgetPosition = nextPositionFloat * axisMask; Vector2 newEdgesLastPositions = nextWidgetPosition + widgetRectTransform.rect.size * axisMask * inflationSign; _edgesLastPositions[itemWidgetEdge] = Helpers.GetVectorComponent(newEdgesLastPositions, _axis); switch (itemEdge) { case ItemsEdge.Head: _widgets.Insert(0, widget); widgetRectTransform.anchoredPosition = newEdgesLastPositions; break; case ItemsEdge.Tail: _widgets.Add(widget); widgetRectTransform.anchoredPosition = nextWidgetPosition; break; } }
public float GetEdgeDelta(ItemsEdge itemEdge, Rect viewportWorldRect) { WidgetsAlignment itemWidgetEdge = GetItemWidgetEdge(itemEdge); float viewportEdgePosition = WidgetsAlignmentDesc.RectPositions[itemWidgetEdge](viewportWorldRect); Vector2 startPos = _node.TransformPoint(_edgesLastPositions[itemWidgetEdge] * AxisMaskDesc.AxisMasks[_axis]); float inflationSign = WidgetsAlignmentDesc.HeadInflationSigns[itemWidgetEdge]; var res = (viewportEdgePosition - Helpers.GetVectorComponent(startPos, _axis)) * inflationSign; return(res > 0f ? res * inflationSign / Helpers.GetVectorComponent(_node.lossyScale, _axis) : 0f); }
bool TryDeflate(ItemsEdge edge, Rect viewportWorldRect) { if (!_widgetsViewport.NeedDeflate(edge, viewportWorldRect)) { return(false); } _widgetsViewport.Deflate(edge); return(_itemsViewport.TryDeflate(edge)); }
public bool NeedInflate(ItemsEdge itemEdge, Rect viewportWorldRect) { WidgetsAlignment itemWidgetEdge = GetItemWidgetEdge(itemEdge); float viewportEdgePosition = WidgetsAlignmentDesc.RectPositions[itemWidgetEdge](viewportWorldRect); float inflationSign = WidgetsAlignmentDesc.HeadInflationSigns[itemWidgetEdge]; float nextPositionFloat = _edgesLastPositions[itemWidgetEdge] + _spacing * inflationSign; Vector2 startPos = _node.TransformPoint(nextPositionFloat * AxisMaskDesc.AxisMasks[_axis]); float widgetEdgePosition = Helpers.GetVectorComponent(startPos, _axis); return(WidgetsAlignmentDesc.ViewportHasSpace[itemWidgetEdge](viewportEdgePosition, widgetEdgePosition)); }
public bool TryDeflate(ItemsEdge edge) { if (IsEmpty()) { return(false); } _itemsIndices[edge] -= ItemsEdgeDesc.InflationSigns[edge]; CheckIndices(); return(true); }
public void Deflate(ItemsEdge itemEdge) { IWidget widget = GetEdgeWidget(itemEdge); _itemWidgetsPool.ReturnWidget(widget); _widgets.Remove(widget); // Change edge last position WidgetsAlignment itemWidgetEdge = GetItemWidgetEdge(itemEdge); _edgesLastPositions[itemWidgetEdge] -= (Helpers.GetVectorComponent(widget.rectTransform.rect.size, _axis) + _spacing) * WidgetsAlignmentDesc.HeadInflationSigns[itemWidgetEdge]; }
WidgetsAlignment GetItemWidgetEdge(ItemsEdge itemEdge) { switch (itemEdge) { case ItemsEdge.Head: return(_alignment); case ItemsEdge.Tail: return(WidgetsAlignmentDesc.OppositeEdges[_alignment]); default: throw new Exception("Unhandled item edge type " + itemEdge); } }
IWidget GetEdgeWidget(ItemsEdge edge) { switch (edge) { case ItemsEdge.Head: return(_widgets[0]); case ItemsEdge.Tail: return(_widgets[_widgets.Count - 1]); default: throw new Exception("Unhandled edge type " + edge); } }
void RefreshViewport(ItemsEdge inflationEdge, bool adjustEdgeImmediate) { Rect viewportWorldRect = Helpers.GetWorldRect(_viewportNode); while (TryDeflate(ItemsEdgeDesc.Opposites[inflationEdge], viewportWorldRect)) { ; } while (TryInflate(inflationEdge, viewportWorldRect)) { ; } _scroller.SetEdgeDelta(GetEdgeDelta(viewportWorldRect), adjustEdgeImmediate); }
bool TryInflate(ItemsEdge edge, Rect viewportWorldRect) { if (!_widgetsViewport.NeedInflate(edge, viewportWorldRect) || !_itemsViewport.TryInflate(edge)) { return(false); } int index = _itemsViewport.GetEdgeIndex(edge); _widgetsViewport.Inflate(edge, _itemsProvider.GetItemByIndex(index)); // Remove unnecessary element if the list was scrolled too much on this frame TryDeflate(ItemsEdgeDesc.Opposites[edge], viewportWorldRect); return(true); }
public void CenterOnIndex(int index, Rect viewportWorldRect, bool immediate) { TryFinishScrollProcess(); onScrollStarted?.Invoke(); bool needShift = !_itemsViewport.IsItemInsideViewport(index); int prevHeadIndex = _itemsViewport.GetEdgeIndex(ItemsEdge.Head); if (needShift) { _itemsViewport.ResetToIndex(index); _widgetsViewport.Reset(); _refreshViewportFunc(); } int relativeIndex = _itemsViewport.GetItemRelativeIndex(index); Rect widgetWorldRect = _widgetsViewport.GetWidgetWorldRectByRelativeIndex(relativeIndex); bool alignToEdge = Helpers.GetVectorComponent(widgetWorldRect.size, _axis) > Helpers.GetVectorComponent(viewportWorldRect.size, _axis); Vector2 viewportWorldPosition = GetRectPosition(viewportWorldRect, alignToEdge); Vector2 widgetWorldPosition = GetRectPosition(widgetWorldRect, alignToEdge); float shiftDelta = 0f; if (needShift) { // Set position of needed index to appropriate viewport edge int deltaHeadIndex = index - prevHeadIndex; ItemsEdge itemsEdgeDirection = deltaHeadIndex < 0 ? ItemsEdge.Head : ItemsEdge.Tail; float sign = _widgetsViewport.GetInflationSign(itemsEdgeDirection); Vector2 shiftWorldSize = (itemsEdgeDirection == ItemsEdge.Head ? widgetWorldRect : viewportWorldRect).size; shiftDelta = _widgetsViewport.GetLocalCoordinate(shiftWorldSize) * sign; OnScroll(shiftDelta); } float totalDelta = _widgetsViewport.GetLocalCoordinate(viewportWorldPosition - widgetWorldPosition) - shiftDelta; if (immediate) { OnScroll(totalDelta); onScrollFinished?.Invoke(); } else { _centerOnIndexCo = StartCoroutine(ScrollProcess(totalDelta)); } }
public bool TryInflate(ItemsEdge edge) { int newIndex = _itemsIndices[edge] + ItemsEdgeDesc.InflationSigns[edge]; if (!CheckItem(newIndex)) { return(false); } _itemsIndices[edge] = newIndex; if (IsEmpty()) { _itemsIndices[ItemsEdgeDesc.Opposites[edge]] = newIndex; } CheckIndices(); return(true); }
public float GetInflationSign(ItemsEdge itemsEdge) { WidgetsAlignment alignment = GetItemWidgetEdge(itemsEdge); return(WidgetsAlignmentDesc.HeadInflationSigns[alignment]); }
public bool NeedDeflate(ItemsEdge edge, Rect viewportWorldRect) { return(!IsEmpty() && !Helpers.GetWorldRect(GetEdgeWidget(edge).rectTransform).Overlaps(viewportWorldRect)); }
public bool CheckEdge(ItemsEdge edge) { return(!CheckItem(_itemsIndices[edge] + ItemsEdgeDesc.InflationSigns[edge])); }
public int GetEdgeIndex(ItemsEdge edge) { return(_itemsIndices[edge]); }