< Summary

Class:MainScripts.DCL.Controllers.HUD.CharacterPreview.PreviewCameraPanningController
Assembly:CharacterPreviewController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/CharacterPreview/PreviewCameraPanningController.cs
Covered lines:0
Uncovered lines:51
Coverable lines:51
Total lines:115
Line coverage:0% (0 of 51)
Covered branches:0
Total branches:0
Covered methods:0
Total methods:7
Method coverage:0% (0 of 7)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PreviewCameraPanningController()0%2100%
Configure(...)0%2100%
OnBeginDrag(...)0%12300%
OnDrag(...)0%56700%
OnEndDrag(...)0%6200%
InertiaAsync()0%30500%
Dispose()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/CharacterPreview/PreviewCameraPanningController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL.Tasks;
 3using System;
 4using System.Threading;
 5using UnityEngine;
 6using UnityEngine.EventSystems;
 7using Vector3 = UnityEngine.Vector3;
 8
 9namespace MainScripts.DCL.Controllers.HUD.CharacterPreview
 10{
 11    public class PreviewCameraPanningController : IPreviewCameraPanningController
 12    {
 13        public event Action<Vector3> OnPanning;
 14
 15        private InputAction_Hold secondClickAction;
 16        private InputAction_Hold middleClickAction;
 17        private float panSpeed;
 18        private bool allowVerticalPanning;
 19        private bool allowHorizontalPanning;
 20        private float inertiaDuration;
 21        private ICharacterPreviewInputDetector characterPreviewInputDetector;
 22        private Vector3 lastMousePosition;
 23        private Vector3 lastPanningDeltaBeforeEndDrag;
 024        private CancellationTokenSource cts = new ();
 25        private Texture2D panningCursorTexture;
 26
 27        public void Configure(
 28            InputAction_Hold secondClickAction,
 29            InputAction_Hold middleClickAction,
 30            float panSpeed,
 31            bool allowVerticalPanning,
 32            bool allowHorizontalPanning,
 33            float inertiaDuration,
 34            ICharacterPreviewInputDetector characterPreviewInputDetector,
 35            Texture2D panningCursorTexture)
 36        {
 037            this.secondClickAction = secondClickAction;
 038            this.middleClickAction = middleClickAction;
 039            this.panSpeed = panSpeed;
 040            this.allowVerticalPanning = allowVerticalPanning;
 041            this.allowHorizontalPanning = allowHorizontalPanning;
 042            this.inertiaDuration = inertiaDuration;
 043            this.characterPreviewInputDetector = characterPreviewInputDetector;
 044            this.panningCursorTexture = panningCursorTexture;
 45
 046            characterPreviewInputDetector.OnDragStarted += OnBeginDrag;
 047            characterPreviewInputDetector.OnDragging += OnDrag;
 048            characterPreviewInputDetector.OnDragFinished += OnEndDrag;
 049        }
 50
 51        private void OnBeginDrag(PointerEventData eventData)
 52        {
 053            if (!middleClickAction.isOn && !secondClickAction.isOn)
 054                return;
 55
 056            cts = cts.SafeRestart();
 057            lastMousePosition = Input.mousePosition;
 058            AudioScriptableObjects.buttonClick.Play(true);
 059        }
 60
 61        private void OnDrag(PointerEventData eventData)
 62        {
 063            if (!middleClickAction.isOn && !secondClickAction.isOn)
 064                return;
 65
 066            var panningDelta = Input.mousePosition - lastMousePosition;
 067            panningDelta.y *= -1;
 68
 069            if (!allowVerticalPanning)
 070                panningDelta.y = 0f;
 71
 072            if (!allowHorizontalPanning)
 073                panningDelta.x = 0f;
 74
 075            panningDelta *= panSpeed * Time.deltaTime;
 076            lastPanningDeltaBeforeEndDrag = panningDelta;
 077            lastMousePosition = Input.mousePosition;
 78
 079            OnPanning?.Invoke(panningDelta);
 80
 081            if (panningCursorTexture != null)
 082                Cursor.SetCursor(panningCursorTexture, new Vector2(panningCursorTexture.width / 2f, panningCursorTexture
 083        }
 84
 85        private void OnEndDrag(PointerEventData eventData)
 86        {
 087            if (lastPanningDeltaBeforeEndDrag.magnitude >= 0.01f)
 088                InertiaAsync(cts.Token).Forget();
 89
 090            AudioScriptableObjects.buttonRelease.Play(true);
 091            Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
 092        }
 93
 94        private async UniTask InertiaAsync(CancellationToken ct)
 95        {
 096            float inverseTimer = 1f / inertiaDuration;
 097            float timeLeft = inertiaDuration;
 98
 099            while (timeLeft > 0)
 100            {
 0101                timeLeft -= Time.deltaTime;
 0102                OnPanning?.Invoke(Vector3.Lerp(lastPanningDeltaBeforeEndDrag, Vector3.zero, 1 - (timeLeft * inverseTimer
 0103                await UniTask.NextFrame(ct);
 104            }
 0105        }
 106
 107        public void Dispose()
 108        {
 0109            cts.SafeCancelAndDispose();
 0110            characterPreviewInputDetector.OnDragStarted -= OnBeginDrag;
 0111            characterPreviewInputDetector.OnDragging -= OnDrag;
 0112            characterPreviewInputDetector.OnDragFinished -= OnEndDrag;
 0113        }
 114    }
 115}