This commit is contained in:
2026-07-09 21:33:33 +02:00
commit 84a2a365f3
2364 changed files with 950134 additions and 0 deletions
@@ -0,0 +1,157 @@
using Sirenix.Utilities;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UIElements;
using VOID.Generic.Objects.Usable;
using VOID.Generic.Objects.Weapon;
using VOID.Generic.Objects.Wearable;
using VOID.UserInterface.Game.Util;
using VOID.ScriptableObjects.Abilities;
namespace VOID.UserInterface.Game.Tooltip
{
public class TooltipManagerUI : MonoBehaviour
{
public static TooltipManagerUI current { get; private set; }
// Tooltip elements
private VisualElement _rootElement;
private WeaponTooltipUI _weaponTooltip;
private WearableTooltipUI _wearableTooltip;
private UsableTooltipUI _usableTooltip;
private ItemTooltipUI _itemTooltip;
private AbilityTooltipUI _abilityTooltip;
private StatusTooltipUI _statusTooltip;
// Size
private ITooltip _currentTooltip;
private void Awake()
{
current = this;
// Tooltip elements init
var uiDocument = gameObject.GetComponent<UIDocument>();
var templateElement = uiDocument.rootVisualElement;
// SAFEGUARD - tooltips should never be clickable, if somehow UI was built weird then this should fix it
templateElement.Query<VisualElement>().ForEach(element => element.pickingMode = PickingMode.Ignore);
_rootElement = templateElement.Q("root-tooltip");
_weaponTooltip = new WeaponTooltipUI(_rootElement.Q("weapon-tooltip"));
_wearableTooltip = new WearableTooltipUI(_rootElement.Q("wearable-tooltip"));
_usableTooltip = new UsableTooltipUI(_rootElement.Q("usable-tooltip"));
_itemTooltip = new ItemTooltipUI(_rootElement.Q("item-tooltip"));
_abilityTooltip = new AbilityTooltipUI(_rootElement.Q("ability-tooltip"));
_statusTooltip = new StatusTooltipUI(_rootElement.Q("status-tooltip"));
}
private void Start()
{
// Events - cursor entering and leaving slotUI
GameUI.current.ElementsUnderCursorChanged += OnElementsUnderCursorChanged;
Hide();
}
private void OnElementsUnderCursorChanged()
{
switch (GameUI.current.PickTopComponentUI())
{
case SlotUI slotUI:
Show(slotUI);
break;
case StatusUI statusUI:
Show(statusUI);
break;
default:
Hide();
break;
}
}
private void Update() => MoveTooltip();
private void MoveTooltip()
{
var size = _currentTooltip.GetSize() / GameUI.current.scale;
var minPos = Vector2.zero;
var maxPos = new Vector2(Screen.width - size.x, Screen.height - size.y);
var pos = Mouse.current.position.ReadValue().Clamp(minPos, maxPos);
var panelPos = RuntimePanelUtils.ScreenToPanel(_rootElement.panel, pos);
_rootElement.style.bottom = new StyleLength(panelPos.y);
_rootElement.style.left = new StyleLength(panelPos.x);
}
private void Show(SlotUI slotUI)
{
if (slotUI.isEmpty) return;
Hide();
_rootElement.style.display = DisplayStyle.Flex;
enabled = true;
switch (slotUI.item)
{
case WeaponObject weapon:
_weaponTooltip.Show(weapon);
_currentTooltip = _weaponTooltip;
return;
case WearableObject wearable:
_wearableTooltip.Show(wearable);
_currentTooltip = _wearableTooltip;
return;
case UsableObject usable:
_usableTooltip.Show(usable);
_currentTooltip = _usableTooltip;
return;
case { } item:
_itemTooltip.Show(item);
_currentTooltip = _itemTooltip;
return;
}
switch (slotUI.ability)
{
// TODO: tutaj może będzie inny tooltip dla podstawowego ataku
case BasicAttackAbility attackAbility:
_abilityTooltip.Show(attackAbility);
_currentTooltip = _abilityTooltip;
return;
case { } ability:
_abilityTooltip.Show(ability);
_currentTooltip = _abilityTooltip;
return;
}
Hide();
var itemType = slotUI.item ? slotUI.item.GetType().GetNiceName() : "-----";
var abilityType = slotUI.ability ? slotUI.ability.GetType().GetNiceName() : "-----";
Debug.LogWarning("No valid tooltip for '" + itemType + "' or '" + abilityType + "'.");
}
private void Show(StatusUI statusUI)
{
Hide();
_rootElement.style.display = DisplayStyle.Flex;
enabled = true;
_statusTooltip.Show(statusUI.status);
_currentTooltip = _statusTooltip;
}
private void Hide()
{
_weaponTooltip.Hide();
_wearableTooltip.Hide();
_usableTooltip.Hide();
_itemTooltip.Hide();
_abilityTooltip.Hide();
_statusTooltip.Hide();
_rootElement.style.display = DisplayStyle.None;
enabled = false;
}
}
}