< Summary

Class:ECSSystems.ECSUiPointerEventsSystem.ECSUiPointerEventsSystem
Assembly:ECS7.System.UiPointerEvents
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/Systems/UiPointerEvents/ECSUiPointerEventsSystem.cs
Covered lines:84
Uncovered lines:3
Coverable lines:87
Total lines:275
Line coverage:96.5% (84 of 87)
Covered branches:0
Total branches:0
Covered methods:10
Total methods:10
Method coverage:100% (10 of 10)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ECSUiPointerEventsSystem(...)0%110100%
Update()0%110100%
HandleUiWithoutRegisteredPointerEvents(...)0%330100%
HandlePointerEventComponentUpdate(...)0%440100%
HandleUiContainerRemoval(...)0%220100%
HandlePointerEventsRemoval(...)0%220100%
CreateUiPointerEvents(...)0%770100%
RegisterUiPointerEvents(...)0%550100%
UnregisterUiPointerEvents(...)0%5.935066.67%
SetInputResult(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/Systems/UiPointerEvents/ECSUiPointerEventsSystem.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.ECS7.InternalComponents;
 3using DCL.ECSComponents;
 4using DCL.ECSRuntime;
 5using DCL.Models;
 6using UnityEngine;
 7using UnityEngine.UIElements;
 8using RaycastHit = DCL.ECSComponents.RaycastHit;
 9
 10namespace ECSSystems.ECSUiPointerEventsSystem
 11{
 12    public class ECSUiPointerEventsSystem
 13    {
 14        private readonly IECSReadOnlyComponentsGroup<InternalUiContainer, InternalPointerEvents> unregisteredUiPointerEv
 15        private readonly IECSReadOnlyComponentsGroup<InternalUiContainer, InternalPointerEvents, InternalRegisteredUiPoi
 16        private readonly IECSReadOnlyComponentsGroup<InternalRegisteredUiPointerEvents> registeredUiPointerEventsWithUiR
 17        private readonly IECSReadOnlyComponentsGroup<InternalUiContainer, InternalRegisteredUiPointerEvents> registeredU
 18
 19        private readonly IInternalECSComponent<InternalRegisteredUiPointerEvents> registeredUiPointerEventsComponent;
 20        private readonly IInternalECSComponent<InternalInputEventResults> inputResultsComponent;
 21
 222        public ECSUiPointerEventsSystem(
 23            IInternalECSComponent<InternalRegisteredUiPointerEvents> registeredUiPointerEventsComponent,
 24            IInternalECSComponent<InternalInputEventResults> inputResultsComponent,
 25            IECSReadOnlyComponentsGroup<InternalUiContainer, InternalPointerEvents> unregisteredUiPointerEventsGroup,
 26            IECSReadOnlyComponentsGroup<InternalUiContainer, InternalPointerEvents, InternalRegisteredUiPointerEvents> r
 27            IECSReadOnlyComponentsGroup<InternalRegisteredUiPointerEvents> registeredUiPointerEventsWithUiRemovedGroup,
 28            IECSReadOnlyComponentsGroup<InternalUiContainer, InternalRegisteredUiPointerEvents> registeredUiPointerEvent
 29        {
 230            this.registeredUiPointerEventsComponent = registeredUiPointerEventsComponent;
 231            this.unregisteredUiPointerEventsGroup = unregisteredUiPointerEventsGroup;
 232            this.registeredUiPointerEventsGroup = registeredUiPointerEventsGroup;
 233            this.registeredUiPointerEventsWithUiRemovedGroup = registeredUiPointerEventsWithUiRemovedGroup;
 234            this.registeredUiPointerEventsWithPointerEventsRemovedGroup = registeredUiPointerEventsWithPointerEventsRemo
 235            this.inputResultsComponent = inputResultsComponent;
 236        }
 37
 38        public void Update()
 39        {
 40            // adds `InternalRegisteredUiPointerEvents` component to entities that contains
 41            // `InternalUiContainer` and `InternalPointerEvents` components
 142            HandleUiWithoutRegisteredPointerEvents(
 43                unregisteredUiPointerEventsGroup,
 44                registeredUiPointerEventsComponent,
 45                inputResultsComponent);
 46
 47            // updates `InternalRegisteredUiPointerEvents` component when
 48            // `InternalPointerEvents` is updated
 149            HandlePointerEventComponentUpdate(
 50                registeredUiPointerEventsGroup,
 51                registeredUiPointerEventsComponent,
 52                inputResultsComponent);
 53
 54            // removes `InternalRegisteredUiPointerEvents` component from entities from which
 55            // `InternalUiContainer` component was removed
 156            HandleUiContainerRemoval(
 57                registeredUiPointerEventsWithUiRemovedGroup,
 58                registeredUiPointerEventsComponent);
 59
 60            // removes `InternalRegisteredUiPointerEvents` component from entities from which
 61            // `InternalPointerEvents` component was removed
 162            HandlePointerEventsRemoval(
 63                registeredUiPointerEventsWithPointerEventsRemovedGroup,
 64                registeredUiPointerEventsComponent);
 165        }
 66
 67        internal static void HandleUiWithoutRegisteredPointerEvents(
 68            IECSReadOnlyComponentsGroup<InternalUiContainer, InternalPointerEvents> unregisteredUiPointerEventsGroup,
 69            IInternalECSComponent<InternalRegisteredUiPointerEvents> registeredUiPointerEventsComponent,
 70            IInternalECSComponent<InternalInputEventResults> inputResultsComponent)
 71        {
 272            var unregisteredUiPointerEvents = unregisteredUiPointerEventsGroup.group;
 73
 874            for (int i = unregisteredUiPointerEvents.Count - 1; i >= 0; i--)
 75            {
 276                var unregisteredGroupElement = unregisteredUiPointerEvents[i];
 277                IParcelScene scene = unregisteredGroupElement.scene;
 278                IDCLEntity entity = unregisteredGroupElement.entity;
 279                VisualElement visualElement = unregisteredGroupElement.componentData1.model.rootElement;
 80
 81                // Force pointer blocking
 282                visualElement.pickingMode = PickingMode.Position;
 83
 84                InternalRegisteredUiPointerEvents uiPointerEvents;
 85
 86                // if `InternalPointerEvents` is dirty we delegate the callback setup to "InternalPointerEvents dirty" h
 287                if (!unregisteredGroupElement.componentData2.model.dirty)
 88                {
 189                    InternalPointerEvents events = unregisteredGroupElement.componentData2.model;
 190                    uiPointerEvents = CreateUiPointerEvents(scene, entity, inputResultsComponent, events);
 191                    RegisterUiPointerEvents(visualElement, uiPointerEvents);
 92                }
 93                else
 94                {
 195                    uiPointerEvents = new InternalRegisteredUiPointerEvents();
 96                }
 97
 298                registeredUiPointerEventsComponent.PutFor(scene, entity, uiPointerEvents);
 99            }
 2100        }
 101
 102        internal static void HandlePointerEventComponentUpdate(
 103            IECSReadOnlyComponentsGroup<InternalUiContainer, InternalPointerEvents, InternalRegisteredUiPointerEvents> r
 104            IInternalECSComponent<InternalRegisteredUiPointerEvents> registeredUiPointerEventsComponent,
 105            IInternalECSComponent<InternalInputEventResults> inputResultsComponent)
 106        {
 3107            var group = registeredUiPointerEventsGroup.group;
 108
 12109            for (int i = 0; i < group.Count; i++)
 110            {
 3111                var groupElement = group[i];
 3112                VisualElement visualElement = groupElement.componentData1.model.rootElement;
 113
 114                // Force pointer blocking
 3115                visualElement.pickingMode = PickingMode.Position;
 116
 3117                if (!groupElement.componentData2.model.dirty)
 118                    continue;
 119
 3120                IParcelScene scene = groupElement.scene;
 3121                IDCLEntity entity = groupElement.entity;
 122
 3123                var registeredEventsData = registeredUiPointerEventsComponent.GetFor(scene, entity);
 124
 3125                if (registeredEventsData != null)
 126                {
 3127                    UnregisterUiPointerEvents(visualElement, registeredEventsData.Value.model);
 128                }
 129
 3130                InternalPointerEvents events = groupElement.componentData2.model;
 3131                InternalRegisteredUiPointerEvents uiPointerEvents = CreateUiPointerEvents(scene, entity, inputResultsCom
 3132                RegisterUiPointerEvents(visualElement, uiPointerEvents);
 3133                registeredUiPointerEventsComponent.PutFor(scene, entity, uiPointerEvents);
 134            }
 3135        }
 136
 137        internal static void HandleUiContainerRemoval(
 138            IECSReadOnlyComponentsGroup<InternalRegisteredUiPointerEvents> registeredUiPointerEventsWithUiRemovedGroup,
 139            IInternalECSComponent<InternalRegisteredUiPointerEvents> registeredUiPointerEventsComponent)
 140        {
 2141            var removedUiContainers = registeredUiPointerEventsWithUiRemovedGroup.group;
 142
 6143            for (int i = removedUiContainers.Count - 1; i >= 0; i--)
 144            {
 1145                var removedElement = removedUiContainers[i];
 1146                registeredUiPointerEventsComponent.RemoveFor(removedElement.scene, removedElement.entity);
 147            }
 2148        }
 149
 150        internal static void HandlePointerEventsRemoval(
 151            IECSReadOnlyComponentsGroup<InternalUiContainer, InternalRegisteredUiPointerEvents> registeredUiPointerEvent
 152            IInternalECSComponent<InternalRegisteredUiPointerEvents> registeredUiPointerEventsComponent)
 153        {
 2154            var removedPointerEvents = registeredUiPointerEventsWithPointerEventsRemovedGroup.group;
 155
 6156            for (int i = removedPointerEvents.Count - 1; i >= 0; i--)
 157            {
 1158                var removedElement = removedPointerEvents[i];
 1159                registeredUiPointerEventsComponent.RemoveFor(removedElement.scene, removedElement.entity);
 160            }
 2161        }
 162
 163        internal static InternalRegisteredUiPointerEvents CreateUiPointerEvents(
 164            IParcelScene scene,
 165            IDCLEntity entity,
 166            IInternalECSComponent<InternalInputEventResults> inputResultsComponent,
 167            InternalPointerEvents events)
 168        {
 6169            InternalRegisteredUiPointerEvents model = new InternalRegisteredUiPointerEvents();
 170
 40171            for (int i = 0; i < events.PointerEvents.Count; i++)
 172            {
 14173                var pointerEvent = events.PointerEvents[i];
 174
 14175                if (pointerEvent.EventInfo.Button != InputAction.IaPointer)
 176                    continue;
 177
 12178                switch (pointerEvent.EventType)
 179                {
 180                    case PointerEventType.PetUp:
 2181                        model.OnPointerUpCallback += evt => SetInputResult(
 182                            scene,
 183                            entity,
 184                            inputResultsComponent,
 185                            InputAction.IaPointer,
 186                            pointerEvent.EventType,
 187                            evt.position);
 188
 1189                        break;
 190                    case PointerEventType.PetDown:
 6191                        model.OnPointerDownCallback += evt => SetInputResult(
 192                            scene,
 193                            entity,
 194                            inputResultsComponent,
 195                            InputAction.IaPointer,
 196                            pointerEvent.EventType,
 197                            evt.position);
 198
 5199                        break;
 200                    case PointerEventType.PetHoverEnter:
 2201                        model.OnPointerEnterCallback += evt => SetInputResult(
 202                            scene,
 203                            entity,
 204                            inputResultsComponent,
 205                            InputAction.IaPointer,
 206                            pointerEvent.EventType,
 207                            evt.position);
 208
 1209                        break;
 210                    case PointerEventType.PetHoverLeave:
 6211                        model.OnPointerLeaveCallback += evt => SetInputResult(
 212                            scene,
 213                            entity,
 214                            inputResultsComponent,
 215                            InputAction.IaPointer,
 216                            pointerEvent.EventType,
 217                            evt.position);
 218
 219                        break;
 220                }
 221            }
 222
 6223            return model;
 224        }
 225
 226        internal static void RegisterUiPointerEvents(VisualElement visualElement, InternalRegisteredUiPointerEvents uiEv
 227        {
 6228            if (uiEvents.OnPointerDownCallback != null)
 6229                visualElement.RegisterCallback(uiEvents.OnPointerDownCallback);
 230
 6231            if (uiEvents.OnPointerUpCallback != null)
 1232                visualElement.RegisterCallback(uiEvents.OnPointerUpCallback);
 233
 6234            if (uiEvents.OnPointerEnterCallback != null)
 1235                visualElement.RegisterCallback(uiEvents.OnPointerEnterCallback);
 236
 6237            if (uiEvents.OnPointerLeaveCallback != null)
 4238                visualElement.RegisterCallback(uiEvents.OnPointerLeaveCallback);
 6239        }
 240
 241        internal static void UnregisterUiPointerEvents(VisualElement visualElement, InternalRegisteredUiPointerEvents ui
 242        {
 4243            if (uiEvents.OnPointerDownCallback != null)
 1244                visualElement.UnregisterCallback(uiEvents.OnPointerDownCallback);
 245
 4246            if (uiEvents.OnPointerUpCallback != null)
 0247                visualElement.UnregisterCallback(uiEvents.OnPointerUpCallback);
 248
 4249            if (uiEvents.OnPointerEnterCallback != null)
 0250                visualElement.UnregisterCallback(uiEvents.OnPointerEnterCallback);
 251
 4252            if (uiEvents.OnPointerLeaveCallback != null)
 0253                visualElement.UnregisterCallback(uiEvents.OnPointerLeaveCallback);
 4254        }
 255
 256        private static void SetInputResult(IParcelScene scene, IDCLEntity entity,
 257            IInternalECSComponent<InternalInputEventResults> inputResultsComponent,
 258            InputAction button, PointerEventType pointerEventType, Vector3 position)
 259        {
 4260            var eventData = new InternalInputEventResults.EventData
 261            {
 262                button = button,
 263                type = pointerEventType,
 264                hit = new RaycastHit
 265                {
 266                    EntityId = (uint)entity.entityId,
 267                    Length = 0,
 268                    Position = ProtoConvertUtils.UnityVectorToPBVector(position)
 269                }
 270            };
 271
 4272            inputResultsComponent.AddEvent(scene, eventData);
 4273        }
 274    }
 275}

Methods/Properties

ECSUiPointerEventsSystem(.IInternalECSComponent[InternalRegisteredUiPointerEvents], .IInternalECSComponent[InternalInputEventResults], DCL.ECSRuntime.IECSReadOnlyComponentsGroup[InternalUiContainer,InternalPointerEvents], DCL.ECSRuntime.IECSReadOnlyComponentsGroup[InternalUiContainer,InternalPointerEvents,InternalRegisteredUiPointerEvents], DCL.ECSRuntime.IECSReadOnlyComponentsGroup[InternalRegisteredUiPointerEvents], DCL.ECSRuntime.IECSReadOnlyComponentsGroup[InternalUiContainer,InternalRegisteredUiPointerEvents])
Update()
HandleUiWithoutRegisteredPointerEvents(DCL.ECSRuntime.IECSReadOnlyComponentsGroup[InternalUiContainer,InternalPointerEvents], .IInternalECSComponent[InternalRegisteredUiPointerEvents], .IInternalECSComponent[InternalInputEventResults])
HandlePointerEventComponentUpdate(DCL.ECSRuntime.IECSReadOnlyComponentsGroup[InternalUiContainer,InternalPointerEvents,InternalRegisteredUiPointerEvents], .IInternalECSComponent[InternalRegisteredUiPointerEvents], .IInternalECSComponent[InternalInputEventResults])
HandleUiContainerRemoval(DCL.ECSRuntime.IECSReadOnlyComponentsGroup[InternalRegisteredUiPointerEvents], .IInternalECSComponent[InternalRegisteredUiPointerEvents])
HandlePointerEventsRemoval(DCL.ECSRuntime.IECSReadOnlyComponentsGroup[InternalUiContainer,InternalRegisteredUiPointerEvents], .IInternalECSComponent[InternalRegisteredUiPointerEvents])
CreateUiPointerEvents(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, .IInternalECSComponent[InternalInputEventResults], DCL.ECS7.InternalComponents.InternalPointerEvents)
RegisterUiPointerEvents(UnityEngine.UIElements.VisualElement, DCL.ECS7.InternalComponents.InternalRegisteredUiPointerEvents)
UnregisterUiPointerEvents(UnityEngine.UIElements.VisualElement, DCL.ECS7.InternalComponents.InternalRegisteredUiPointerEvents)
SetInputResult(DCL.Controllers.IParcelScene, DCL.Models.IDCLEntity, .IInternalECSComponent[InternalInputEventResults], DCL.ECSComponents.InputAction, DCL.ECSComponents.PointerEventType, UnityEngine.Vector3)