using System; using System.Collections.Generic; using TMPro; namespace UnityEngine.UI { public sealed class UXBindingPropertyMetadata { public UXBindingPropertyMetadata( UXBindingProperty property, string displayName, UXBindingValueKind valueKind, Type objectReferenceType) { Property = property; DisplayName = displayName; ValueKind = valueKind; ObjectReferenceType = objectReferenceType; } public UXBindingProperty Property { get; } public string DisplayName { get; } public UXBindingValueKind ValueKind { get; } public Type ObjectReferenceType { get; } } public static class UXBindingPropertyUtility { private static readonly UXBindingPropertyMetadata[] Metadata = { new UXBindingPropertyMetadata(UXBindingProperty.GameObjectActive, "GameObject/Active", UXBindingValueKind.Boolean, null), new UXBindingPropertyMetadata(UXBindingProperty.CanvasGroupAlpha, "CanvasGroup/Alpha", UXBindingValueKind.Float, null), new UXBindingPropertyMetadata(UXBindingProperty.CanvasGroupInteractable, "CanvasGroup/Interactable", UXBindingValueKind.Boolean, null), new UXBindingPropertyMetadata(UXBindingProperty.CanvasGroupBlocksRaycasts, "CanvasGroup/Blocks Raycasts", UXBindingValueKind.Boolean, null), new UXBindingPropertyMetadata(UXBindingProperty.GraphicColor, "Graphic/Color", UXBindingValueKind.Color, null), new UXBindingPropertyMetadata(UXBindingProperty.GraphicMaterial, "Graphic/Material", UXBindingValueKind.ObjectReference, typeof(Material)), new UXBindingPropertyMetadata(UXBindingProperty.ImageSprite, "Image/Sprite", UXBindingValueKind.ObjectReference, typeof(Sprite)), new UXBindingPropertyMetadata(UXBindingProperty.TextContent, "Text/Content", UXBindingValueKind.String, null), new UXBindingPropertyMetadata(UXBindingProperty.TextColor, "Text/Color", UXBindingValueKind.Color, null), new UXBindingPropertyMetadata(UXBindingProperty.RectTransformAnchoredPosition, "RectTransform/Anchored Position", UXBindingValueKind.Vector2, null), new UXBindingPropertyMetadata(UXBindingProperty.TransformLocalScale, "Transform/Local Scale", UXBindingValueKind.Vector3, null), new UXBindingPropertyMetadata(UXBindingProperty.TransformLocalEulerAngles, "Transform/Local Rotation", UXBindingValueKind.Vector3, null) }; public static IReadOnlyList AllMetadata => Metadata; public static UXBindingPropertyMetadata GetMetadata(UXBindingProperty property) { for (int i = 0; i < Metadata.Length; i++) { if (Metadata[i].Property == property) { return Metadata[i]; } } return Metadata[0]; } public static bool IsSupported(GameObject target, UXBindingProperty property) { if (target == null) { return false; } switch (property) { case UXBindingProperty.GameObjectActive: case UXBindingProperty.TransformLocalScale: case UXBindingProperty.TransformLocalEulerAngles: return true; case UXBindingProperty.CanvasGroupAlpha: case UXBindingProperty.CanvasGroupInteractable: case UXBindingProperty.CanvasGroupBlocksRaycasts: return target.GetComponent() != null; case UXBindingProperty.GraphicColor: case UXBindingProperty.GraphicMaterial: return target.GetComponent() != null; case UXBindingProperty.ImageSprite: return target.GetComponent() != null; case UXBindingProperty.TextContent: case UXBindingProperty.TextColor: return target.GetComponent() != null || target.GetComponent() != null; case UXBindingProperty.RectTransformAnchoredPosition: return target.GetComponent() != null; default: return false; } } public static void GetSupportedProperties(GameObject target, List output) { output.Clear(); if (target == null) { return; } for (int i = 0; i < Metadata.Length; i++) { UXBindingProperty property = Metadata[i].Property; if (IsSupported(target, property)) { output.Add(property); } } } public static void CaptureValue(GameObject target, UXBindingProperty property, UXBindingValue destination) { if (target == null || destination == null) { return; } switch (property) { case UXBindingProperty.GameObjectActive: destination.BoolValue = target.activeSelf; return; case UXBindingProperty.CanvasGroupAlpha: destination.FloatValue = target.GetComponent().alpha; return; case UXBindingProperty.CanvasGroupInteractable: destination.BoolValue = target.GetComponent().interactable; return; case UXBindingProperty.CanvasGroupBlocksRaycasts: destination.BoolValue = target.GetComponent().blocksRaycasts; return; case UXBindingProperty.GraphicColor: destination.ColorValue = target.GetComponent().color; return; case UXBindingProperty.GraphicMaterial: destination.ObjectValue = target.GetComponent().material; return; case UXBindingProperty.ImageSprite: destination.ObjectValue = target.GetComponent().sprite; return; case UXBindingProperty.TextContent: if (target.TryGetComponent(out Text text)) { destination.StringValue = text.text; } else if (target.TryGetComponent(out TextMeshProUGUI tmp)) { destination.StringValue = tmp.text; } return; case UXBindingProperty.TextColor: if (target.TryGetComponent(out Text legacyText)) { destination.ColorValue = legacyText.color; } else if (target.TryGetComponent(out TextMeshProUGUI tmpText)) { destination.ColorValue = tmpText.color; } return; case UXBindingProperty.RectTransformAnchoredPosition: destination.Vector2Value = target.GetComponent().anchoredPosition; return; case UXBindingProperty.TransformLocalScale: destination.Vector3Value = target.transform.localScale; return; case UXBindingProperty.TransformLocalEulerAngles: destination.Vector3Value = target.transform.localEulerAngles; return; } } public static void ApplyValue(GameObject target, UXBindingProperty property, UXBindingValue value) { if (target == null || value == null) { return; } switch (property) { case UXBindingProperty.GameObjectActive: target.SetActive(value.BoolValue); return; case UXBindingProperty.CanvasGroupAlpha: target.GetComponent().alpha = value.FloatValue; return; case UXBindingProperty.CanvasGroupInteractable: target.GetComponent().interactable = value.BoolValue; return; case UXBindingProperty.CanvasGroupBlocksRaycasts: target.GetComponent().blocksRaycasts = value.BoolValue; return; case UXBindingProperty.GraphicColor: target.GetComponent().color = value.ColorValue; return; case UXBindingProperty.GraphicMaterial: target.GetComponent().material = value.ObjectValue as Material; return; case UXBindingProperty.ImageSprite: target.GetComponent().sprite = value.ObjectValue as Sprite; return; case UXBindingProperty.TextContent: if (target.TryGetComponent(out Text text)) { text.text = value.StringValue; } else if (target.TryGetComponent(out TextMeshProUGUI tmp)) { tmp.text = value.StringValue; } return; case UXBindingProperty.TextColor: if (target.TryGetComponent(out Text legacyText)) { legacyText.color = value.ColorValue; } else if (target.TryGetComponent(out TextMeshProUGUI tmpText)) { tmpText.color = value.ColorValue; } return; case UXBindingProperty.RectTransformAnchoredPosition: target.GetComponent().anchoredPosition = value.Vector2Value; return; case UXBindingProperty.TransformLocalScale: target.transform.localScale = value.Vector3Value; return; case UXBindingProperty.TransformLocalEulerAngles: target.transform.localEulerAngles = value.Vector3Value; return; } } } }