using System; using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.Pool; using UnityEngine.UIElements; namespace BITKit.UX { public class UXAllowInput : MonoBehaviour { [RuntimeInitializeOnLoadMethod] private static void Reload() { Allow.Clear(); } internal static readonly ValidHandle Allow=new(); [SerializeField] private UIDocument document; private IPanel _panel; [SerializeField, ReadOnly] private bool isAllow; [SerializeField, ReadOnly] private bool globalAllow; [SerializeField, ReadOnly] private string blockBy; private bool isLocked; private void Start() { _panel = document.rootVisualElement.panel; } private void OnEnable() { Allow.AddElement(this); } private void OnDisable() { Allow.RemoveElement(this); } private void Update() { var mousePos = Mouse.current.position.ReadValue(); mousePos.y = Screen.height - mousePos.y; var ve =_panel.Pick(RuntimePanelUtils.ScreenToPanel(_panel,mousePos )); if (ve is not null) { var list = ListPool.Get(); var v = ve; { while (true) { list.Add(v.name); if (v.parent is not null) { v = v.parent; continue; } break; } } blockBy = string.Join("\\", list); list.Clear(); ListPool.Release(list); } else { blockBy = "unblocked"; } switch (ve,Mouse.current.press.isPressed) { case (null,false) when isLocked is false: Allow.AddElement(this); Allow.RemoveDisableElements(this); break; case (not null,false): Allow.RemoveElement(this); Allow.AddDisableElements(this); break; case (not null,true): isLocked = true; break; case (null,false): isLocked = false; break; } isAllow = ve is null; globalAllow = Allow.Allow; } } }