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);
        }
        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 WidgetsViewport(RectTransform node, IWidgetsProvider widgetsProvider, WidgetsAlignment alignment, float spacing)
        {
            _node               = node;
            _itemWidgetsPool    = new WidgetsPool(widgetsProvider, _node);
            _widgets            = new List <IWidget>();
            _alignment          = alignment;
            _spacing            = spacing;
            _axis               = AxisMaskDesc.WidgetsAlignmentAxis[_alignment];
            _edgesLastPositions = new Dictionary <WidgetsAlignment, float>();

            SetPivotAndAnchors(_node);
            Reset();
        }
        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];
        }
 public Vector2 GetRectEdge(Rect rect, WidgetsAlignment alignment)
 {
     return(WidgetsAlignmentDesc.RectPositions[alignment](rect) * AxisMaskDesc.AxisMasks[_axis]);
 }
        public float GetInflationSign(ItemsEdge itemsEdge)
        {
            WidgetsAlignment alignment = GetItemWidgetEdge(itemsEdge);

            return(WidgetsAlignmentDesc.HeadInflationSigns[alignment]);
        }