using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UIElements;
namespace Unity.Cinemachine.Samples
{
///
/// Runtime UI script that can create toggles and buttons.
///
[RequireComponent(typeof(UIDocument))]
public class SamplesDynamicUI : MonoBehaviour
{
[Serializable]
public class Item
{
[Tooltip("Text displayed on button")]
public string Name = "Text";
[Serializable]
public class ToggleSettings
{
public bool Enabled;
[Tooltip("Initial value of the toggle")]
public bool Value;
[Tooltip("Event sent when toggle button is clicked")]
public UnityEvent OnValueChanged = new();
}
[Tooltip("Set this to true to create a toggle button")]
[FoldoutWithEnabledButton]
public ToggleSettings IsToggle = new();
[Tooltip("Event sent when button is clicked")]
public UnityEvent OnClick = new();
}
[Tooltip("The buttons to be displayed")]
public List- Buttons = new();
VisualElement m_Root;
readonly List m_DynamicElements = new ();
void OnEnable()
{
var uiDocument = GetComponent();
m_Root = uiDocument.rootVisualElement.Q("TogglesAndButtons"); // Should be justified - flex grow 1
if (m_Root == null)
{
Debug.LogError("Cannot find TogglesAndButtons. Is the source asset set in the UIDocument?");
return;
}
for (int i = 0; i < Buttons.Count; ++i)
{
var item = Buttons[i];
if (item.IsToggle.Enabled)
{
var toggle = new Toggle
{
label = item.Name,
value = item.IsToggle.Value,
focusable = false,
};
toggle.AddToClassList("dynamicToggle");
toggle.RegisterValueChangedCallback(e => item.IsToggle.OnValueChanged.Invoke(e.newValue));
m_Root.Add(toggle);
m_DynamicElements.Add(toggle);
}
else
{
var button = new Button
{
text = item.Name,
focusable = false
};
button.AddToClassList("dynamicButton");
button.clickable.clicked += item.OnClick.Invoke;
m_Root.Add(button);
m_DynamicElements.Add(button);
}
}
m_Root.visible = Buttons.Count > 0;
}
void OnDisable()
{
for (int i = 0; i < m_DynamicElements.Count; ++i)
m_Root.Remove(m_DynamicElements[i]);
m_DynamicElements.Clear();
}
}
}