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));
        }
Example #5
0
        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));
            }
        }
Example #12
0
        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));
 }
Example #15
0
 public bool CheckEdge(ItemsEdge edge)
 {
     return(!CheckItem(_itemsIndices[edge] + ItemsEdgeDesc.InflationSigns[edge]));
 }
Example #16
0
 public int GetEdgeIndex(ItemsEdge edge)
 {
     return(_itemsIndices[edge]);
 }