using System.Collections.ObjectModel; using System.Reactive.Linq; using Artemis.Core; using Artemis.Core.Events; using Artemis.UI.Shared.Services.NodeEditor; using Artemis.UI.Shared.Services.NodeEditor.Commands; using Artemis.UI.Shared.VisualScripting; using Avalonia.Controls.Mixins; using DynamicData; using ReactiveUI; namespace Artemis.VisualScripting.Nodes.Operators.Screens; public class EnumEqualsNodeCustomViewModel : CustomNodeViewModel { private readonly EnumEqualsNode _node; private readonly INodeEditorService _nodeEditorService; public EnumEqualsNodeCustomViewModel(EnumEqualsNode node, INodeScript script, INodeEditorService nodeEditorService) : base(node, script) { _node = node; _nodeEditorService = nodeEditorService; NodeModified += (_, _) => this.RaisePropertyChanged(nameof(CurrentValue)); this.WhenActivated(d => { if (_node.InputPin.ConnectedTo.Any()) { EnumValues.Clear(); EnumValues.AddRange(Enum.GetValues(_node.InputPin.ConnectedTo.First().Type).Cast()); this.RaisePropertyChanged(nameof(CurrentValue)); } Observable.FromEventPattern>(x => _node.InputPin.PinConnected += x, x => _node.InputPin.PinConnected -= x) .Subscribe(p => EnumValues.AddRange(Enum.GetValues(p.EventArgs.Value.Type).Cast())) .DisposeWith(d); Observable.FromEventPattern>(x => _node.InputPin.PinDisconnected += x, x => _node.InputPin.PinDisconnected -= x) .Subscribe(_ => EnumValues.Clear()) .DisposeWith(d); }); } public ObservableCollection EnumValues { get; } = new(); public int CurrentValue { get => _node.Storage; set { if (!Equals(_node.Storage, value)) _nodeEditorService.ExecuteCommand(Script, new UpdateStorage(_node, value)); } } }