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