using System.Collections.Generic; using UnityEngine.Assertions; using UnityEngine.UI; namespace UnityEngine.Rendering.UI { /// /// DebugUIHandler for RenderingLayerField widget. /// public class DebugUIHandlerRenderingLayerField : DebugUIHandlerWidget { /// Name of the widget. public Text nameLabel; /// Value toggle. public UIFoldout valueToggle; /// Toggles for the RenderingLayerField. public List toggles; DebugUI.RenderingLayerField m_Field; DebugUIHandlerContainer m_Container; internal override void SetWidget(DebugUI.Widget widget) { base.SetWidget(widget); m_Field = CastWidget(); m_Container = GetComponent(); nameLabel.text = m_Field.displayName; int toggleIndex = 0; var count = m_Field.renderingLayersNames.Length - 1; foreach (var layerName in m_Field.renderingLayersNames) { if (toggleIndex >= toggles.Count) continue; var toggle = toggles[toggleIndex]; toggle.getter = GetValue; toggle.setter = SetValue; toggle.nextUIHandler = toggleIndex < count ? toggles[toggleIndex + 1] : null; toggle.previousUIHandler = toggleIndex > 0 ? toggles[toggleIndex - 1] : null; toggle.parentUIHandler = this; toggle.index = toggleIndex; toggle.nameLabel.text = layerName; toggle.Init(); toggleIndex++; } // Destroy the remaining toggles outside of the range of the displayed enum. for (; toggleIndex < toggles.Count; ++toggleIndex) { CoreUtils.Destroy(toggles[toggleIndex].gameObject); toggles[toggleIndex] = null; } } bool GetValue(int index) { var mask = m_Field.GetValue(); return (mask & (1u << index)) != 0; } void SetValue(int index, bool value) { var mask = m_Field.GetValue(); if (value) mask |= 1 << index; else mask &= ~(1 << index); m_Field.SetValue(mask); } /// /// OnSelection implementation. /// /// True if the selection wrapped around. /// Previous widget. /// True if the selection is allowed. public override bool OnSelection(bool fromNext, DebugUIHandlerWidget previous) { if (fromNext || valueToggle.isOn == false) { nameLabel.color = colorSelected; } else if (valueToggle.isOn) { if (m_Container.IsDirectChild(previous)) { nameLabel.color = colorSelected; } else { var lastItem = m_Container.GetLastItem(); DebugManager.instance.ChangeSelection(lastItem, false); } } return true; } /// /// OnDeselection implementation. /// public override void OnDeselection() { nameLabel.color = colorDefault; } /// /// OnIncrement implementation. /// /// True if incrementing fast. public override void OnIncrement(bool fast) { valueToggle.isOn = true; } /// /// OnDecrement implementation. /// /// Trye if decrementing fast. public override void OnDecrement(bool fast) { valueToggle.isOn = false; } /// /// OnAction implementation. /// public override void OnAction() { valueToggle.isOn = !valueToggle.isOn; } /// /// Next implementation. /// /// Next widget UI handler, parent if there is none. public override DebugUIHandlerWidget Next() { if (!valueToggle.isOn || m_Container == null) return base.Next(); var firstChild = m_Container.GetFirstItem(); if (firstChild == null) return base.Next(); return firstChild; } } }