Пример #1
0
        protected virtual void OnCollectionChanged(ICollection <T> before, ICollection <T> after)
        {
            if (before != null)
            {
                before.OnSlotsChanged -= OnCollectionSlotsChanged;
                before.OnSizeChanged  -= OnCollectionSizeChanged;
            }

            // Completely new collection; Remove all slots and re-generate.
            if (after != null)
            {
                // Get rid of the old
                foreach (var t in repaintableElements)
                {
                    Destroy(t?.gameObject);
                }

                repaintableElements = new CollectionSlotUIBase[after.slotCount];
                for (int i = 0; i < after.slotCount; i++)
                {
                    repaintableElements[i] = CreateUIElement(i);
                    Repaint(i);
                }

                after.OnSlotsChanged += OnCollectionSlotsChanged;
                after.OnSizeChanged  += OnCollectionSizeChanged;
            }
        }
Пример #2
0
        private void Awake()
        {
            _slot = GetComponent <CollectionSlotUIBase <IVendorProduct <IItemInstance> > >();
            Assert.IsNotNull(_slot, "No SlotUI found on input handler!");

            _vendorUI = GetComponentInParent <VendorUIBase <IItemInstance> >();
            Assert.IsNotNull(_vendorUI, "No VendorUI found in parent of ItemVendorCollectionSlotInputHandler");
        }
Пример #3
0
 private void Awake()
 {
     _slot = GetComponent <CollectionSlotUIBase <IItemInstance> >();
     Assert.IsNotNull(_slot, "No SlotUI found on input handler!");
 }
 protected virtual void Awake()
 {
     slot = GetComponent <CollectionSlotUIBase <T> >();
     Assert.IsNotNull(slot, "Slot InputHandler couldn't find itemGuid..");
 }
Пример #5
0
        public override void OnEndDrag(PointerEventData eventData)
        {
            if (eventData.button == dragButton && DragAndDropUtility.isDragging)
            {
                PointerEventData newEventData = new PointerEventData(EventSystem.current);

                RectTransform collectionWindow = null;
                foreach (GameObject hoveredObject in eventData.hovered)
                {
                    if (hoveredObject.GetComponent <ItemCollectionSlotUI>() != null)
                    {
                        collectionWindow = hoveredObject.transform.parent.GetComponent <RectTransform>();
                        break;
                    }
                }
                if (collectionWindow == null)
                {
                    return;
                }

                float         scale                         = 30f * DragAndDropUtility.currentDragModel.source.transform.lossyScale.x;
                IItemInstance item                          = (IItemInstance)DragAndDropUtility.currentDragModel.dataObject;
                Vector2       upperLeftPosition             = eventData.position + (new Vector2(1 - item.layoutShape.convexX, item.layoutShape.convexY - 1)) * scale / 2f;
                Vector2       bottomRightPosition           = eventData.position - (new Vector2(1 - item.layoutShape.convexX, item.layoutShape.convexY - 1)) * scale / 2f;
                Vector2       collectionUpperLeftPosition   = (Vector2)collectionWindow.position + new Vector2(-1, 1) * collectionWindow.sizeDelta * (Vector2)collectionWindow.lossyScale / 2f;
                Vector2       collectionBottomRightPosition = (Vector2)collectionWindow.position - new Vector2(-1, 1) * collectionWindow.sizeDelta * (Vector2)collectionWindow.lossyScale / 2f;
                while (upperLeftPosition.x < collectionUpperLeftPosition.x)
                {
                    upperLeftPosition.x   += scale;
                    bottomRightPosition.x += scale;
                }
                while (bottomRightPosition.x > collectionBottomRightPosition.x)
                {
                    upperLeftPosition.x   -= scale;
                    bottomRightPosition.x -= scale;
                }
                while (upperLeftPosition.y > collectionUpperLeftPosition.y)
                {
                    upperLeftPosition.y   -= scale;
                    bottomRightPosition.y -= scale;
                }
                while (bottomRightPosition.y < collectionBottomRightPosition.y)
                {
                    upperLeftPosition.y   += scale;
                    bottomRightPosition.y += scale;
                }

                if (collectionWindow.GetComponent <LayoutItemCollectionUI>() != null)
                {
                    Vector2 index       = (collectionUpperLeftPosition - upperLeftPosition) * new Vector2(-1, 1) / scale;
                    int     columnCount = collectionWindow.GetComponent <LayoutItemCollectionUI>().columnCount;
                    newEventData.hovered = new List <GameObject>()
                    {
                        collectionWindow.GetChild(Mathf.FloorToInt(index.x) + Mathf.FloorToInt(index.y) * columnCount).gameObject
                    };
                }
                else
                {
                    newEventData.hovered = eventData.hovered;
                }

                HashSet <IItemInstance> coveredItems    = new HashSet <IItemInstance>();
                CollectionSlotUIBase    coveredItemSlot = null;
                List <RaycastResult>    objectsHit      = new List <RaycastResult>();
                for (int i = 0; i < item.layoutShape.convexX; i++)
                {
                    for (int j = 0; j < item.layoutShape.convexY; j++)
                    {
                        newEventData.position = upperLeftPosition + new Vector2(i, -j) * scale;
                        EventSystem.current.RaycastAll(newEventData, objectsHit);
                        foreach (RaycastResult hit in objectsHit)
                        {
                            IItemInstance coveredItem = hit.gameObject.GetComponent <ItemCollectionSlotUI>()?.current;
                            if (coveredItem != null)
                            {
                                coveredItems.Add(coveredItem);
                                coveredItemSlot = hit.gameObject.GetComponent <ItemCollectionSlotUI>();
                            }
                        }
                    }
                }

                if (coveredItems.Count > 1)
                {
                    return;
                }
                else if (coveredItems.Count == 1)
                {
                    coveredItemSlot.collection.SwapOrMerge(coveredItemSlot.collectionIndex, TempCollection.tempCollections[1], 0, coveredItemSlot.collection.GetAmount(coveredItemSlot.collectionIndex));
                }

                Result <bool> success = DragAndDropUtility.EndDrag(newEventData);

                if (success.result)
                {
                    WorkshopController.workshopController.ResetBorders();
                    if (coveredItems.Count == 1)
                    {
                        TempCollection.tempCollections[1].SwapOrMerge(0, TempCollection.tempCollections[0], 0, TempCollection.tempCollections[1].GetAmount(0));
                        TempCollection.staticTempCollecion1UI.GetComponentInChildren <ImprovedDrag>().OnBeginDrag(eventData);
                        WorkshopController.workshopController.UpdateBorders((UnityEquippableItemInstance)TempCollection.tempCollections[0][0]);
                    }
                }
                else
                {
                    if (coveredItems.Count == 1)
                    {
                        TempCollection.tempCollections[1].SwapOrMerge(0, coveredItemSlot.collection, coveredItemSlot.collectionIndex, TempCollection.tempCollections[1].GetAmount(0));
                    }
                    TempCollection.staticTempCollecion1UI.GetComponentInChildren <ImprovedDrag>().OnBeginDrag(eventData);
                }

                collectionWindow.GetComponent <DynamicLayoutGroup>()?.ForceRebuildNow();

                if (activeCoroutine != null)
                {
                    StopCoroutine(activeCoroutine);
                }

                if (consumeEvent)
                {
                    eventData.Use();
                }

                TooltipController.ManualUpdate();
            }
        }