123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- using UnityEngine;
- using UnityEngine.EventSystems;
- namespace HQFPSWeapons.UserInterface
- {
- public abstract class ContainerInterface<T> : UserInterfaceBehaviour where T: Slot
- {
- public T[] SlotInterfaces { get { return m_SlotInterfaces; } }
-
- public readonly Message<T> SlotInterfaceRefresh = new Message<T>();
- //public readonly Message AllSlotsDeselected = new Message();
- public readonly Message<T, PointerEventData> SlotPointerDown = new Message<T, PointerEventData>();
- public readonly Message<T, PointerEventData> SlotPointerUp = new Message<T, PointerEventData>();
- public readonly Message<PointerEventData, T> SlotBeginDrag = new Message<PointerEventData, T>();
- public readonly Message<PointerEventData, T> SlotDrag = new Message<PointerEventData, T>();
- public readonly Message<PointerEventData, T> SlotEndDrag = new Message<PointerEventData, T> ();
- [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<T>())
- 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<RectTransform>().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);
- }
- }
- }
|