< Summary

Class:DCL.ECSComponents.UIInput.UIInputHandler
Assembly:DCL.ECSComponents.UIInput
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/UIInput/UIInputHandler.cs
Covered lines:41
Uncovered lines:9
Coverable lines:50
Total lines:138
Line coverage:82% (41 of 50)
Covered branches:0
Total branches:0
Covered methods:9
Total methods:10
Method coverage:90% (9 of 10)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
UIInputHandler(...)0%110100%
OnComponentCreated(...)0%110100%
CreateOnChangeInputResult(...)0%110100%
CreateOnSubmitInputResult(...)0%56700%
OnComponentRemoved(...)0%110100%
OnComponentModelUpdated(...)0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/UIInput/UIInputHandler.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.ECS7.ComponentWrapper;
 3using DCL.ECS7.ComponentWrapper.Generic;
 4using DCL.ECS7.InternalComponents;
 5using DCL.ECSComponents.UIAbstractElements;
 6using DCL.ECSComponents.Utils;
 7using DCL.ECSRuntime;
 8using DCL.Models;
 9using DCL.UIElements;
 10using UnityEngine;
 11using UnityEngine.UIElements;
 12
 13namespace DCL.ECSComponents.UIInput
 14{
 15    public class UIInputHandler : UIElementHandlerBase, IECSComponentHandler<PBUiInput>
 16    {
 17        // The 'DCL.UIInput.uss' stylesheet loaded in DCLDefaultRuntimeTheme scriptable object uses this class
 18        private const string USS_CLASS = "dcl-input";
 19
 20        private UIFontUpdater fontUpdater;
 21        private readonly int resultComponentId;
 22        private readonly IInternalECSComponent<InternalUIInputResults> inputResults;
 23        private readonly AssetPromiseKeeper_Font fontPromiseKeeper;
 24        private readonly WrappedComponentPool<IWrappedComponent<PBUiInputResult>> componentPool;
 25
 26        private EventCallback<ChangeEvent<string>> onValueChanged;
 27        private EventCallback<NavigationSubmitEvent> onSubmit;
 28
 7429        public TextField uiElement { get; private set; }
 30
 2031        internal TextFieldPlaceholder placeholder { get; private set; }
 32
 33        public UIInputHandler(IInternalECSComponent<InternalUiContainer> internalUiContainer,
 34            int resultComponentId,
 35            IInternalECSComponent<InternalUIInputResults> inputResults,
 36            AssetPromiseKeeper_Font fontPromiseKeeper, int componentId,
 437            WrappedComponentPool<IWrappedComponent<PBUiInputResult>> componentPool) : base(internalUiContainer, componen
 38        {
 439            this.resultComponentId = resultComponentId;
 440            this.inputResults = inputResults;
 441            this.fontPromiseKeeper = fontPromiseKeeper;
 442            this.componentPool = componentPool;
 443        }
 44
 45        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 46        {
 47            // `TextField` contains a label as well but
 48            // passing a null string will actually make it invisible
 449            uiElement = new TextField();
 450            uiElement.AddToClassList(USS_CLASS);
 51
 452            placeholder = new TextFieldPlaceholder(uiElement);
 53
 454            AddElementToRoot(scene, entity, uiElement);
 455            uiElement.pickingMode = PickingMode.Position; // force pointer blocking
 456            fontUpdater = new UIFontUpdater(uiElement, fontPromiseKeeper);
 57
 458            onValueChanged = UIPointerEventsUtils
 59               .RegisterFeedback<ChangeEvent<string>>
 60                (inputResults,
 61                    CreateOnChangeInputResult,
 62                    scene,
 63                    entity,
 64                    uiElement,
 65                    resultComponentId);
 66
 67            // We don't use <KeyDownEvent> because that one is called a lot more and is
 68            // triggered twice for some reason (probably a unity bug)
 469            onSubmit = UIPointerEventsUtils
 70               .RegisterFeedback<NavigationSubmitEvent>
 71                (inputResults,
 72                    CreateOnSubmitInputResult,
 73                    scene,
 74                    entity,
 75                    uiElement,
 76                    resultComponentId);
 477        }
 78
 79        private IPooledWrappedComponent CreateOnChangeInputResult(ChangeEvent<string> evt)
 80        {
 181            evt.StopPropagation();
 82
 183            var componentPooled = componentPool.Get();
 184            var componentModel = componentPooled.WrappedComponent.Model;
 185            componentModel.Value = uiElement.value;
 186            componentModel.IsSubmit = false;
 187            return componentPooled;
 88        }
 89
 90        private IPooledWrappedComponent CreateOnSubmitInputResult(NavigationSubmitEvent evt)
 91        {
 092            evt.StopPropagation();
 93
 94            // Space-bar is also detected as a navigation "submit" event
 095            if (evt.shiftKey || evt.altKey || evt.ctrlKey || evt.commandKey
 96                || (!Input.GetKeyDown(KeyCode.Return) && !Input.GetKeyDown(KeyCode.KeypadEnter)))
 097                return null;
 98
 099            var componentPooled = componentPool.Get();
 0100            var componentModel = componentPooled.WrappedComponent.Model;
 0101            componentModel.Value = uiElement.value;
 0102            componentModel.IsSubmit = true;
 103
 104            // Clear text field without triggering its onChange event
 0105            uiElement.SetValueWithoutNotify(string.Empty);
 106
 0107            return componentPooled;
 108        }
 109
 110        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 111        {
 4112            uiElement.UnregisterFeedback(onValueChanged);
 4113            uiElement.UnregisterFeedback(onSubmit);
 4114            RemoveElementFromRoot(scene, entity, uiElement);
 4115            uiElement = null;
 4116            fontUpdater.Dispose();
 4117        }
 118
 119        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBUiInput model)
 120        {
 4121            placeholder.SetPlaceholder(model.Placeholder);
 4122            placeholder.SetPlaceholderColor(model.GetPlaceholderColor());
 4123            placeholder.SetNormalColor(model.GetColor());
 124
 4125            var isReadonly = !model.IsInteractable();
 126
 4127            placeholder.SetReadOnly(isReadonly);
 4128            uiElement.isReadOnly = isReadonly;
 4129            uiElement.style.fontSize = model.GetFontSize();
 4130            uiElement.style.unityTextAlign = model.GetTextAlign().ToUnityTextAlign();
 131
 4132            if (model.HasValue)
 1133                uiElement.SetValueWithoutNotify(model.Value);
 134
 4135            fontUpdater.Update(model.GetFont());
 4136        }
 137    }
 138}