using System; using System.Collections; using System.Collections.Generic; using BITKit; using BITKit.Tween; using BITKit.UX; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UIElements; namespace Net.BITKit.UX.SnackBar { public static class UXSnackBarStatic { public static int Count; } public class UXSnackBar : UIToolkitSubPanel,IDisposable,ISnackBar where TPanel :IUXPanel { [UXBindPath("snack_bar-container")] private VisualElement _snackBarContainer; private VisualTreeAsset _template; private readonly ValidHandle _waitHandle = new ValidHandle(); private readonly Queue<(string message,Severity severity)> _queue=new(); public UXSnackBar(IServiceProvider serviceProvider) : base(serviceProvider) { if (UXSnackBarStatic.Count > 0) { throw new Exception("SnackBar can only be created once"); } UXSnackBarStatic.Count++; } protected override void OnInitiated() { base.OnInitiated(); _template = _snackBarContainer.Q().templateSource; _snackBarContainer.Clear(); BITAppForUnity.AllowCursor.AddListener(OnAllowCursor); while (_queue.TryDequeue(out var temp )) { Add(temp.message,temp.severity); } } private void OnAllowCursor(bool obj) { if (obj) { _waitHandle.AddElement(this); } else { _waitHandle.RemoveElement(this); } } public void Add(string message, Severity severity = Severity.Normal) { if (_snackBarContainer is null) { _queue.Enqueue(new ValueTuple(message,severity)); return; } var ve = _snackBarContainer.Create(_template); ve.AddToClassList($"severity-{severity.ToString().ToLower()}"); ve.Get