Files
VOIDRPG/Assets/92 - UserInterface/Generic/Game/ActionBarSlotsUI.cs
T
2026-07-09 21:33:33 +02:00

148 lines
5.2 KiB
C#

using UnityEngine;
using UnityEngine.UIElements;
using VOID.Generic.Dict;
using VOID.Generic.Objects.Unit;
using VOID.Generic.Objects.Unit.Events;
using VOID.Generic.Player;
using VOID.Generic.Player.Input;
using VOID.UserInterface.Game.Util;
namespace VOID.UserInterface.Game
{
public class ActionBarSlotsUI : MonoBehaviour
{
public static ActionBarSlotsUI current {get; private set;}
// ActionBar for this unit
private UnitObject _unit;
private UnitObjectActionBar _actionBar;
// Visual Elements - Slots
private VisualElement _slotListElement;
private VisualElement[] _slotElements;
private Button _slotsLockerButton;
private Button _slotsChangerNextButton;
private Button _slotsChangerPreviousButton;
private Label _slotsChangerNumberLabel;
public SlotUI[] slotsUI { get; private set; }
private int _slotsPage = 1;
private int _slotsPageCount = 4;
private int _slotsPerPage;
// References
private ShortcutsInputManager _shortcutsInputManager;
private PlayerController _playerController;
private void Awake()
{
current = this;
var uiDocument = gameObject.GetComponent<UIDocument>();
var templateElement = uiDocument.rootVisualElement;
// Find all important elements
_slotListElement = templateElement.Q("slots");
_slotsChangerNextButton = templateElement.Q("slots-changer").Q<Button>("next");
_slotsChangerPreviousButton = templateElement.Q("slots-changer").Q<Button>("previous");
_slotsChangerNumberLabel = templateElement.Q("slots-changer").Q<Label>("number");
_slotsLockerButton = templateElement.Q<Button>("slots-locker");
// Get all SlotUI used by ActionBar
_slotElements = _slotListElement.Query(className: "slot").ToList().ToArray();
_slotsPerPage = _slotElements.Length;
slotsUI = new SlotUI[_slotsPerPage];
for (var i = 0; i < _slotsPerPage; i++)
{
var slotUI = new SlotUI();
slotUI.Init(_slotElements[i], SlotType.ActionBarSlot, i);
slotsUI[i] = slotUI;
}
_slotListElement.dataSource = this;
_slotListElement.pickingMode = PickingMode.Position;
}
private void Start()
{
_shortcutsInputManager = ShortcutsInputManager.current;
_playerController = PlayerController.current;
// Bind events to action bar page changers
_slotsChangerNextButton.clicked += OnSlotPageNextButton;
_slotsChangerPreviousButton.clicked += OnSlotPagePreviousButton;
_shortcutsInputManager.actionBarNext.performed += _ => OnSlotPageNextButton();
_shortcutsInputManager.actionBarPrevious.performed += _ => OnSlotPagePreviousButton();
_playerController.OnActiveUnitChange += OnActiveUnitChange;
}
private void OnActiveUnitChange(UnitObject unitObject)
{
// Remove listeners from old unit
if (_unit)
{
_unit.unitEvents.onActionBarSet.RemoveListener(OnSlotSet);
_unit.unitEvents.onActionBarUnSet.RemoveListener(OnSlotUnSet);
}
_slotsPage = 1;
_unit = unitObject;
_actionBar = unitObject.unitActionBar;
_slotsChangerNumberLabel.text = _slotsPage.ToString();
UpdateAllSlots();
// Rebind listeners to new unit
_unit.unitEvents.onActionBarSet.AddListener(OnSlotSet);
_unit.unitEvents.onActionBarUnSet.AddListener(OnSlotUnSet);
}
private void OnSlotPageNextButton()
{
_slotsPage++;
if (_slotsPage > _slotsPageCount) _slotsPage = 1;
_slotsChangerNumberLabel.text = _slotsPage.ToString();
UpdateAllSlots();
}
private void OnSlotPagePreviousButton()
{
_slotsPage--;
if (_slotsPage < 1) _slotsPage = _slotsPageCount;
_slotsChangerNumberLabel.text = _slotsPage.ToString();
UpdateAllSlots();
}
private void OnSlotSet(ActionBarSetEvent actionBarSetEvent)
{
UpdateSlot(actionBarSetEvent.index % _slotsPerPage);
}
private void OnSlotUnSet(ActionBarUnSetEvent actionBarUnSetEvent)
{
UpdateSlot(actionBarUnSetEvent.index % _slotsPerPage);
}
private void UpdateAllSlots()
{
for (var i = 0; i < _slotsPerPage; i++)
UpdateSlot(i);
}
private void UpdateSlot(int index)
{
var sourceIndex = (_slotsPage - 1) * _slotsPerPage + index;
var usable = _actionBar.slots[sourceIndex].usable;
var ability = _actionBar.slots[sourceIndex].ability;
if (usable) slotsUI[index].Set(usable);
else if (ability) slotsUI[index].Set(ability);
else slotsUI[index].Clear();
slotsUI[index].ChangeIndex(sourceIndex);
}
}
}