using System; using Cysharp.Threading.Tasks; using UnityEngine.UIElements; namespace DanieleMarotta.RiversongCodeShowcase { [UIView("speed-controls-panel")] public class SpeedControlsPanelUIView : UIView { private VisualElement _normalSpeedButton; private VisualElement _fastSpeedButton; private VisualElement _veryFastSpeedButton; public event Action SpeedChanged; public override UniTask InitializeAsync(UIService uiService, VisualElement rootElement) { base.InitializeAsync(uiService, rootElement); _normalSpeedButton = rootElement.Q(className: "speed-controls-panel__normal-speed"); _fastSpeedButton = rootElement.Q(className: "speed-controls-panel__fast-speed"); _veryFastSpeedButton = rootElement.Q(className: "speed-controls-panel__very-fast-speed"); _normalSpeedButton.RegisterCallback(OnNormalSpeedClick); _fastSpeedButton.RegisterCallback(OnFastSpeedClick); _veryFastSpeedButton.RegisterCallback(OnVeryFastSpeedClick); return UniTask.CompletedTask; } protected override void OnNewModel(SpeedControlsPanelModel model) { base.OnNewModel(model); UpdateSelected(model.SpeedLevel); } protected override void OnModelPropertyChanged(object sender, BindablePropertyChangedEventArgs e) { base.OnModelPropertyChanged(sender, e); UpdateSelected(Model.SpeedLevel); } private void OnNormalSpeedClick(ClickEvent evt) { SpeedChanged?.Invoke(0); } private void OnFastSpeedClick(ClickEvent evt) { SpeedChanged?.Invoke(1); } private void OnVeryFastSpeedClick(ClickEvent evt) { SpeedChanged?.Invoke(2); } public void UpdateSelected(int speedLevel) { UpdateSelected(_normalSpeedButton, speedLevel == 0); UpdateSelected(_fastSpeedButton, speedLevel == 1); UpdateSelected(_veryFastSpeedButton, speedLevel == 2); } private static void UpdateSelected(VisualElement element, bool isSelected) { if (isSelected) element.AddToClassList("selected"); else element.RemoveFromClassList("selected"); } } }