< Summary

Class:DCL.ECSComponents.UIDropdown.UIDropdownHandler
Assembly:DCL.ECSComponents.UIDropdown
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/UIDropdown/UIDropdownHandler.cs
Covered lines:0
Uncovered lines:36
Coverable lines:36
Total lines:114
Line coverage:0% (0 of 36)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
UIDropdownHandler(...)0%2100%
OnComponentCreated(...)0%2100%
CreateInputResult(...)0%2100%
OnComponentRemoved(...)0%2100%
OnComponentModelUpdated(...)0%20400%
ApplyTextElementStyle(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/UIDropdown/UIDropdownHandler.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.ECS7.InternalComponents;
 3using DCL.ECSComponents.UIAbstractElements;
 4using DCL.ECSComponents.Utils;
 5using DCL.ECSRuntime;
 6using DCL.Models;
 7using System.Linq;
 8using UnityEngine;
 9using UnityEngine.UIElements;
 10
 11namespace DCL.ECSComponents.UIDropdown
 12{
 13    public class UIDropdownHandler : UIElementHandlerBase, IECSComponentHandler<PBUiDropdown>
 14    {
 15        private const string READONLY_CLASS = "dcl-dropdown-readonly";
 16        private const string CLASS = "dcl-dropdown";
 17
 18        private const string TEXT_ELEMENT_CLASS = "unity-base-popup-field__text";
 19
 20        private UIFontUpdater fontUpdater;
 21        private readonly int resultComponentId;
 22        private readonly IInternalECSComponent<InternalUIInputResults> inputResults;
 23        private readonly AssetPromiseKeeper_Font fontPromiseKeeper;
 24        private StyleSheet styleSheet;
 25
 26        private EventCallback<ChangeEvent<string>> onValueChanged;
 27
 28        // In the future iteration we may want to create our own DropdownField to be able to fully customize
 29        // it according to the user provided styles
 030        internal DropdownField uiElement { get; private set; }
 31
 032        internal TextElement textField { get; private set; }
 33
 34        public UIDropdownHandler(IInternalECSComponent<InternalUiContainer> internalUiContainer,
 35            int resultComponentId,
 36            IInternalECSComponent<InternalUIInputResults> inputResults,
 37            AssetPromiseKeeper_Font fontPromiseKeeper,
 38            int componentId)
 039            : base(internalUiContainer, componentId)
 40        {
 041            this.resultComponentId = resultComponentId;
 042            this.inputResults = inputResults;
 043            this.fontPromiseKeeper = fontPromiseKeeper;
 44
 45            // it is temporary until we decide on how to handle styles properly
 046            styleSheet = Resources.Load<StyleSheet>("DCL.UIDropdown");
 047        }
 48
 49        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 50        {
 51            // `DropdownField` contains a label as well but
 52            // passing a null string will actually make it invisible
 053            uiElement = new DropdownField(null);
 054            textField = uiElement.Q<TextElement>(className: TEXT_ELEMENT_CLASS);
 055            uiElement.styleSheets.Add(styleSheet);
 056            uiElement.AddToClassList(CLASS);
 57
 058            uiElement.style.flexGrow = 1;
 59
 060            AddElementToRoot(scene, entity, uiElement);
 061            fontUpdater = new UIFontUpdater(uiElement, fontPromiseKeeper);
 62
 63            // it seems strange but `DropdownField` notifies with `string`, not `int`
 064            onValueChanged = UIPointerEventsUtils
 65               .RegisterFeedback<ChangeEvent<string>, PBUiDropdownResult>
 66                (inputResults,
 67                    CreateInputResult,
 68                    scene,
 69                    entity,
 70                    uiElement,
 71                    resultComponentId);
 072        }
 73
 74        private PBUiDropdownResult CreateInputResult(ChangeEvent<string> onValueChange) =>
 075            new() { Value = uiElement.index };
 76
 77        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 78        {
 079            uiElement.UnregisterFeedback(onValueChanged);
 080            RemoveElementFromRoot(scene, entity, uiElement);
 081            uiElement = null;
 082            fontUpdater.Dispose();
 083        }
 84
 85        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBUiDropdown model)
 86        {
 087            fontUpdater.Update(model.GetFont());
 88
 089            uiElement.style.fontSize = model.GetFontSize();
 090            uiElement.style.color = model.GetColor().ToUnityColor();
 91
 092            uiElement.choices.Clear();
 093            uiElement.choices.AddRange(model.Options);
 94
 095            int selectedIndex = model.GetSelectedIndex();
 96
 97            // Don't report the value back to the scene
 98            // there is no `SetIndexWithoutNotify`
 099            uiElement.SetValueWithoutNotify(uiElement.choices.ElementAtOrDefault(selectedIndex) ?? model.EmptyLabel);
 100
 101            // it is controlled from the style sheet
 0102            uiElement.EnableInClassList(READONLY_CLASS, model.Disabled);
 103            // TODO it's not fully correct
 0104            uiElement.pickingMode = model.Disabled ? PickingMode.Ignore : PickingMode.Position;
 105
 0106            ApplyTextElementStyle(model);
 0107        }
 108
 109        private void ApplyTextElementStyle(PBUiDropdown dropdown)
 110        {
 0111            textField.style.unityTextAlign = dropdown.GetTextAlign().ToUnityTextAlign();
 0112        }
 113    }
 114}