| | 1 | | using System; |
| | 2 | | using System.Collections; |
| | 3 | | using System.Collections.Generic; |
| | 4 | | using System.Threading; |
| | 5 | | using Cysharp.Threading.Tasks; |
| | 6 | | using TMPro; |
| | 7 | | using UnityEngine; |
| | 8 | | using UnityEngine.EventSystems; |
| | 9 | |
|
| | 10 | | namespace DCL.AvatarModifierAreaFeedback |
| | 11 | | { |
| | 12 | | public class AvatarModifierAreaFeedbackView : MonoBehaviour, IAvatarModifierAreaFeedbackView, IPointerEnterHandler, |
| | 13 | | { |
| | 14 | |
|
| | 15 | | internal enum AvatarModifierAreaFeedbackState { NEVER_SHOWN, ICON_VISIBLE, WARNING_MESSAGE_VISIBLE, NONE_VISIBLE |
| | 16 | |
|
| | 17 | | private const string PATH = "_AvatarModifierAreaFeedbackHUD"; |
| | 18 | | private const string PATH_TO_WARNING_MESSAGE = "_WarningMessageAreaFeedbackHUD"; |
| | 19 | | private BaseRefCounter<AvatarModifierAreaID> avatarAreaWarningsCounter; |
| | 20 | | private HUDCanvasCameraModeController hudCanvasCameraModeController; |
| | 21 | |
|
| | 22 | |
|
| | 23 | | [SerializeField] internal RectTransform warningContainer; |
| | 24 | | [SerializeField] private CanvasGroup pointerEnterTriggerArea; |
| | 25 | | [SerializeField] private Animator messageAnimator; |
| | 26 | |
|
| | 27 | | internal bool isVisible; |
| | 28 | | internal AvatarModifierAreaFeedbackState currentState; |
| | 29 | | internal Dictionary<AvatarModifierAreaID, GameObject> warningMessagesDictionary; |
| 5 | 30 | | internal CancellationTokenSource deactivatePreviewCancellationToken = new CancellationTokenSource(); |
| | 31 | |
|
| 5 | 32 | | private string msgOutAnimationTrigger = "MsgOut"; |
| 5 | 33 | | private string msgInAnimationTrigger = "MsgIn"; |
| 5 | 34 | | private string iconInAnimationTrigger = "IconIn"; |
| 5 | 35 | | private string iconOutAnimationTrigger = "IconOut"; |
| | 36 | |
|
| 4 | 37 | | public static AvatarModifierAreaFeedbackView Create() { return Instantiate(Resources.Load<GameObject>(PATH)).Get |
| | 38 | |
|
| | 39 | | public void Awake() |
| | 40 | | { |
| 4 | 41 | | currentState = AvatarModifierAreaFeedbackState.NEVER_SHOWN; |
| 4 | 42 | | hudCanvasCameraModeController = new HUDCanvasCameraModeController(GetComponent<Canvas>(), DataStore.i.camera |
| 4 | 43 | | } |
| | 44 | |
|
| | 45 | | public void SetUp(BaseRefCounter<AvatarModifierAreaID> avatarAreaWarnings) |
| | 46 | | { |
| 4 | 47 | | avatarAreaWarningsCounter = avatarAreaWarnings; |
| 4 | 48 | | avatarAreaWarningsCounter.OnAdded += AddedNewWarning; |
| 4 | 49 | | avatarAreaWarningsCounter.OnRemoved += RemovedWarning; |
| | 50 | |
|
| 4 | 51 | | warningMessagesDictionary = new Dictionary<AvatarModifierAreaID, GameObject>(); |
| | 52 | |
|
| 24 | 53 | | foreach (AvatarModifierAreaID warningMessageEnum in Enum.GetValues(typeof(AvatarModifierAreaID))) |
| | 54 | | { |
| 8 | 55 | | GameObject newWarningMessage = Instantiate(Resources.Load<GameObject>(PATH_TO_WARNING_MESSAGE), warningC |
| 8 | 56 | | newWarningMessage.GetComponent<TMP_Text>().text = GetWarningMessage(warningMessageEnum); |
| 8 | 57 | | newWarningMessage.SetActive(false); |
| 8 | 58 | | warningMessagesDictionary.Add(warningMessageEnum, newWarningMessage); |
| | 59 | | } |
| 4 | 60 | | } |
| | 61 | |
|
| | 62 | | private void RemovedWarning(AvatarModifierAreaID obj) |
| | 63 | | { |
| 2 | 64 | | warningMessagesDictionary[obj].gameObject.SetActive(false); |
| 2 | 65 | | if (avatarAreaWarningsCounter.Count().Equals(0)) |
| | 66 | | { |
| 1 | 67 | | Hide(); |
| | 68 | | } |
| 2 | 69 | | } |
| | 70 | | private void AddedNewWarning(AvatarModifierAreaID obj) |
| | 71 | | { |
| 5 | 72 | | warningMessagesDictionary[obj].gameObject.SetActive(true); |
| 5 | 73 | | Show(); |
| 5 | 74 | | } |
| | 75 | |
|
| | 76 | | private void Show() |
| | 77 | | { |
| 6 | 78 | | if (isVisible) return; |
| 4 | 79 | | isVisible = true; |
| 4 | 80 | | ResetAllTriggers(); |
| | 81 | |
|
| 4 | 82 | | if (currentState.Equals(AvatarModifierAreaFeedbackState.NEVER_SHOWN)) |
| | 83 | | { |
| 4 | 84 | | messageAnimator.SetTrigger(msgInAnimationTrigger); |
| 4 | 85 | | HideFirstTimeWarningMessageUniTask(deactivatePreviewCancellationToken.Token).Forget(); |
| 4 | 86 | | currentState = AvatarModifierAreaFeedbackState.WARNING_MESSAGE_VISIBLE; |
| 4 | 87 | | } |
| | 88 | | else |
| | 89 | | { |
| 0 | 90 | | messageAnimator.SetTrigger(iconInAnimationTrigger); |
| 0 | 91 | | pointerEnterTriggerArea.blocksRaycasts = true; |
| 0 | 92 | | currentState = AvatarModifierAreaFeedbackState.ICON_VISIBLE; |
| | 93 | | } |
| 0 | 94 | | } |
| | 95 | |
|
| | 96 | | private void Hide() |
| | 97 | | { |
| 1 | 98 | | isVisible = false; |
| | 99 | |
|
| 1 | 100 | | deactivatePreviewCancellationToken.Cancel(); |
| | 101 | |
|
| 1 | 102 | | pointerEnterTriggerArea.blocksRaycasts = false; |
| | 103 | |
|
| 1 | 104 | | if (currentState.Equals(AvatarModifierAreaFeedbackState.WARNING_MESSAGE_VISIBLE)) |
| | 105 | | { |
| 1 | 106 | | messageAnimator.SetTrigger(msgOutAnimationTrigger); |
| 1 | 107 | | } |
| | 108 | | else |
| | 109 | | { |
| 0 | 110 | | messageAnimator.SetTrigger(iconOutAnimationTrigger); |
| | 111 | | } |
| 1 | 112 | | currentState = AvatarModifierAreaFeedbackState.NONE_VISIBLE; |
| 1 | 113 | | } |
| | 114 | |
|
| | 115 | | public void OnPointerEnter(PointerEventData eventData) |
| | 116 | | { |
| 1 | 117 | | if (!isVisible) return; |
| | 118 | |
|
| 1 | 119 | | messageAnimator.SetTrigger(msgInAnimationTrigger); |
| 1 | 120 | | currentState = AvatarModifierAreaFeedbackState.WARNING_MESSAGE_VISIBLE; |
| 1 | 121 | | } |
| | 122 | |
|
| | 123 | | public void OnPointerExit(PointerEventData eventData) |
| | 124 | | { |
| 1 | 125 | | if (!isVisible) return; |
| | 126 | |
|
| 1 | 127 | | messageAnimator.SetTrigger(iconInAnimationTrigger); |
| 1 | 128 | | currentState = AvatarModifierAreaFeedbackState.ICON_VISIBLE; |
| 1 | 129 | | } |
| | 130 | |
|
| | 131 | |
|
| | 132 | | async UniTaskVoid HideFirstTimeWarningMessageUniTask(CancellationToken cancellationToken) |
| | 133 | | { |
| 12 | 134 | | await UniTask.Delay(5000, cancellationToken: cancellationToken); |
| 0 | 135 | | await UniTask.SwitchToMainThread(cancellationToken); |
| 0 | 136 | | if (cancellationToken.IsCancellationRequested) return; |
| 0 | 137 | | messageAnimator.SetTrigger(iconInAnimationTrigger); |
| | 138 | |
|
| 0 | 139 | | currentState = AvatarModifierAreaFeedbackState.ICON_VISIBLE; |
| 0 | 140 | | pointerEnterTriggerArea.blocksRaycasts = true; |
| 0 | 141 | | } |
| | 142 | |
|
| | 143 | | public void Dispose() |
| | 144 | | { |
| 4 | 145 | | deactivatePreviewCancellationToken?.Cancel(); |
| 4 | 146 | | deactivatePreviewCancellationToken?.Dispose(); |
| 4 | 147 | | avatarAreaWarningsCounter.OnAdded -= AddedNewWarning; |
| 4 | 148 | | avatarAreaWarningsCounter.OnRemoved -= RemovedWarning; |
| 4 | 149 | | hudCanvasCameraModeController?.Dispose(); |
| 4 | 150 | | } |
| | 151 | |
|
| | 152 | | private string GetWarningMessage(AvatarModifierAreaID idToSet) |
| | 153 | | { |
| | 154 | | switch (idToSet) |
| | 155 | | { |
| | 156 | | case AvatarModifierAreaID.HIDE_AVATAR: |
| 4 | 157 | | return "\u2022 The avatars are hidden"; |
| | 158 | | case AvatarModifierAreaID.DISABLE_PASSPORT: |
| 4 | 159 | | return "\u2022 Your passport is disable for\n other players"; |
| | 160 | | default: |
| 0 | 161 | | throw new NotImplementedException(); |
| | 162 | | } |
| | 163 | | } |
| | 164 | |
|
| | 165 | | private void ResetAllTriggers() |
| | 166 | | { |
| 4 | 167 | | messageAnimator.ResetTrigger(msgOutAnimationTrigger); |
| 4 | 168 | | messageAnimator.ResetTrigger(msgInAnimationTrigger); |
| 4 | 169 | | messageAnimator.ResetTrigger(iconInAnimationTrigger); |
| 4 | 170 | | messageAnimator.ResetTrigger(iconOutAnimationTrigger); |
| 4 | 171 | | } |
| | 172 | |
|
| | 173 | |
|
| | 174 | | } |
| | 175 | | } |