using UnityEngine; using UnityEngine.EventSystems; namespace HQFPSWeapons.UserInterface { public abstract class ContainerInterface : UserInterfaceBehaviour where T: Slot { public T[] SlotInterfaces { get { return m_SlotInterfaces; } } public readonly Message SlotInterfaceRefresh = new Message(); //public readonly Message AllSlotsDeselected = new Message(); public readonly Message SlotPointerDown = new Message(); public readonly Message SlotPointerUp = new Message(); public readonly Message SlotBeginDrag = new Message(); public readonly Message SlotDrag = new Message(); public readonly Message SlotEndDrag = new Message (); [SerializeField] protected ItemSlotInterface m_SlotTemplate = null; [SerializeField] private RectTransform m_SlotsParent = null; [SerializeField] private int m_DefaultSlotCount = 1; [SerializeField] [Tooltip("If enabled, the template will be disabled after the slots are generated.")] private bool m_DisableTemplateAfterGen = false; protected T[] m_SlotInterfaces; protected T m_Selected; public virtual bool GenerateSlots() { return GenerateSlots(m_DefaultSlotCount); } public virtual bool GenerateSlots(int count) { if(m_SlotTemplate == null) { Debug.LogError("No slot template is provided, can't generate any slots.", gameObject); return false; } if(m_SlotsParent == null) Debug.LogWarning("The slots parent is not assigned. Will parent them under this object.", gameObject); // Remove listeners from the old slots RemoveListeners(m_SlotInterfaces); var parent = m_SlotsParent == null ? transform : m_SlotsParent; int childCount = parent.childCount; // Destroy the old slots for(int i = 0;i < childCount;i ++) { var child = parent.GetChild(parent.childCount - 1); if(child != m_SlotTemplate.transform && child.GetComponent()) DestroyImmediate(child.gameObject); } // Make sure the slot template is active, so we don't spawn disabled slots bool slotTemplateActive = m_SlotTemplate.gameObject.activeSelf; m_SlotTemplate.gameObject.SetActive(true); // Create the new slots m_SlotInterfaces = new T[count]; for(int i = 0;i < count;i ++) m_SlotInterfaces[i] = Instantiate(m_SlotTemplate, parent) as T; // Add listeners to the new slots AddListeners(m_SlotInterfaces); m_SlotTemplate.GetComponent().anchoredPosition = Vector2.zero; m_SlotTemplate.gameObject.SetActive(m_DisableTemplateAfterGen ? false : slotTemplateActive); return true; } public void Select(int index) { if(index >= m_SlotInterfaces.Length || (m_Selected != null && m_SlotInterfaces[index] == m_Selected)) return; if(m_Selected != null) m_Selected.Deselect(); m_Selected = m_SlotInterfaces[index]; m_Selected.Select(); //SelectedSlotChanged.Send(m_Selected); } public void Select(Slot slot) { if((m_Selected != null && slot == m_Selected)) return; for(int i = 0;i < m_SlotInterfaces.Length;i++) if(m_SlotInterfaces[i] == slot) { Select(i); return; } } public void DeselectAll() { for(int i = 0;i < m_SlotInterfaces.Length;i++) m_SlotInterfaces[i].Deselect(); if(m_Selected != null) { m_Selected = null; //AllSlotsDeselected.Send(); } } private void On_PointerDown() { // if(m_Selected != null && m_PanelBody != null && !Manager.RectangleContainsScreenPoint(m_PanelBody)) // { // m_Selected.Deselect(); // m_Selected = null; // // //AllSlotsDeselected.Send(); // } } private void RemoveListeners(Slot[] slotInterfaces) { if(!Application.isPlaying || slotInterfaces == null) return; for(int i = 0;i < slotInterfaces.Length;i ++) { slotInterfaces[i].Refresh.RemoveListener(OnSlotInterfaceRefresh); slotInterfaces[i].PointerDown.RemoveListener(OnPointerDownOnSlot); slotInterfaces[i].PointerUp.RemoveListener(OnPointerUpOnSlot); } } private void AddListeners(Slot[] slotInterfaces) { if(!Application.isPlaying || slotInterfaces == null) return; for(int i = 0;i < slotInterfaces.Length;i ++) { slotInterfaces[i].Refresh.AddListener(OnSlotInterfaceRefresh); slotInterfaces[i].PointerDown.AddListener(OnPointerDownOnSlot); slotInterfaces[i].PointerUp.AddListener(OnPointerUpOnSlot); slotInterfaces[i].BeginDrag.AddListener(OnSlotBeginDrag); slotInterfaces[i].Drag.AddListener(OnSlotDrag); slotInterfaces[i].EndDrag.AddListener(OnSlotEndDrag); } } private void OnSlotBeginDrag(PointerEventData data, Slot slotInterface) { SlotBeginDrag.Send(data, slotInterface as T); } private void OnSlotDrag(PointerEventData data, Slot slotInterface) { SlotDrag.Send(data, slotInterface as T); } private void OnSlotEndDrag(PointerEventData data, Slot slotInterface) { SlotEndDrag.Send(data, slotInterface as T); } private void OnSlotInterfaceRefresh(Slot slotInterface) { SlotInterfaceRefresh.Send(slotInterface as T); } private void OnPointerDownOnSlot(Slot slotInterface, PointerEventData data) { SlotPointerDown.Send(slotInterface as T, data); } private void OnPointerUpOnSlot(Slot slotInterface, PointerEventData data) { // if(data.pointerCurrentRaycast.gameObject != null && data.pointerCurrentRaycast.gameObject == slotInterface.gameObject) // Inventory.CurrentSelectedSlot.Set(slotInterface); SlotPointerUp.Send(slotInterface as T, data); } } }