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; } }
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"); }
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.."); }
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(); } }