< Summary

Class:UIComponents.ContextMenu.ContextMenuComponentView
Assembly:UIComponents
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/ContextMenu/ContextMenuComponentView.cs
Covered lines:20
Uncovered lines:13
Coverable lines:33
Total lines:81
Line coverage:60.6% (20 of 33)
Covered branches:0
Total branches:0
Covered methods:5
Total methods:7
Method coverage:71.4% (5 of 7)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ContextMenuComponentView()0%110100%
Awake()0%110100%
Update()0%220100%
ClampPositionToScreenBorders(...)0%110100%
HideIfClickedOutside()0%6.83025%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/ContextMenu/ContextMenuComponentView.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using UnityEngine;
 4using UnityEngine.EventSystems;
 5
 6namespace UIComponents.ContextMenu
 7{
 8    [RequireComponent(typeof(RectTransform))]
 9    public abstract class ContextMenuComponentView : BaseComponentView
 10    {
 24611        [SerializeField] private bool hideWhenClickedOutsideArea = true;
 12
 24613        private readonly Vector3[] corners = new Vector3[4];
 14
 15        private RectTransform rectTransform;
 16
 017        public Transform[] HidingHierarchyTransforms { get; set; }
 18
 19        public override void Awake()
 20        {
 1621            base.Awake();
 22
 1623            rectTransform = GetComponent<RectTransform>();
 1624        }
 25
 26        public virtual void Update()
 27        {
 328            if (hideWhenClickedOutsideArea)
 329                HideIfClickedOutside();
 330        }
 31
 32        public void ClampPositionToScreenBorders(Vector2 position)
 33        {
 234            rectTransform.position = position;
 235            rectTransform.GetWorldCorners(corners);
 36
 237            Bounds bounds = new Bounds();
 238            bounds.SetMinMax(corners[1], corners[3]);
 39
 240            Vector3 offset = Vector3.zero;
 41
 242            offset.x -= Mathf.Min(0f, bounds.min.x);
 243            offset.y -= Mathf.Min(0f, bounds.max.y);
 244            offset.x -= Mathf.Max(0f, bounds.max.x - Screen.width);
 245            offset.y -= Mathf.Max(0f, bounds.min.y - Screen.height);
 46
 247            rectTransform.position += offset;
 248        }
 49
 50        private void HideIfClickedOutside()
 51        {
 652            if (!Input.GetMouseButtonDown(0)) return;
 53
 054            var pointerEventData = new PointerEventData(EventSystem.current)
 55            {
 56                position = Input.mousePosition,
 57            };
 58
 059            var raycastResults = new List<RaycastResult>();
 060            EventSystem.current.RaycastAll(pointerEventData, raycastResults);
 61
 062            if (raycastResults.All(result =>
 63                {
 064                    if (HidingHierarchyTransforms != null)
 65                    {
 066                        foreach (var t in HidingHierarchyTransforms)
 067                            if (t == result.gameObject.transform)
 068                                return false;
 69
 070                        return true;
 71                    }
 72
 073                    return result.gameObject.transform != rectTransform
 74                           && !result.gameObject.transform.IsChildOf(rectTransform);
 75                }))
 76            {
 077                Hide();
 78            }
 079        }
 80    }
 81}