mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Nodes editor - Fixed cables not connecting with dynamic pins in some cases
This commit is contained in:
parent
ddfdbee340
commit
7e39a64fdf
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using Artemis.Core.Events;
|
||||
|
||||
namespace Artemis.Core;
|
||||
|
||||
@ -58,6 +59,26 @@ public interface INode : INotifyPropertyChanged
|
||||
/// Called when the node resets
|
||||
/// </summary>
|
||||
event EventHandler Resetting;
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when a pin was added to the node
|
||||
/// </summary>
|
||||
event EventHandler<SingleValueEventArgs<IPin>> PinAdded;
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when a pin was removed from the node
|
||||
/// </summary>
|
||||
event EventHandler<SingleValueEventArgs<IPin>> PinRemoved;
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when a pin collection was added to the node
|
||||
/// </summary>
|
||||
event EventHandler<SingleValueEventArgs<IPinCollection>> PinCollectionAdded;
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when a pin was removed from the node
|
||||
/// </summary>
|
||||
event EventHandler<SingleValueEventArgs<IPinCollection>> PinCollectionRemoved;
|
||||
|
||||
/// <summary>
|
||||
/// Called when the node was loaded from storage or newly created
|
||||
|
||||
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Artemis.Core.Events;
|
||||
using Ninject;
|
||||
using Ninject.Parameters;
|
||||
|
||||
@ -16,6 +17,18 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
/// <inheritdoc />
|
||||
public event EventHandler? Resetting;
|
||||
|
||||
/// <inheritdoc />
|
||||
public event EventHandler<SingleValueEventArgs<IPin>>? PinAdded;
|
||||
|
||||
/// <inheritdoc />
|
||||
public event EventHandler<SingleValueEventArgs<IPin>>? PinRemoved;
|
||||
|
||||
/// <inheritdoc />
|
||||
public event EventHandler<SingleValueEventArgs<IPinCollection>>? PinCollectionAdded;
|
||||
|
||||
/// <inheritdoc />
|
||||
public event EventHandler<SingleValueEventArgs<IPinCollection>>? PinCollectionRemoved;
|
||||
|
||||
#region Properties & Fields
|
||||
|
||||
private readonly List<OutputPin> _outputPinBucket = new();
|
||||
@ -120,7 +133,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
{
|
||||
InputPin<T> pin = new(this, name);
|
||||
_pins.Add(pin);
|
||||
OnPropertyChanged(nameof(Pins));
|
||||
PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
|
||||
return pin;
|
||||
}
|
||||
|
||||
@ -134,7 +147,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
{
|
||||
InputPin pin = new(this, type, name);
|
||||
_pins.Add(pin);
|
||||
OnPropertyChanged(nameof(Pins));
|
||||
PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
|
||||
return pin;
|
||||
}
|
||||
|
||||
@ -148,7 +161,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
{
|
||||
OutputPin<T> pin = new(this, name);
|
||||
_pins.Add(pin);
|
||||
OnPropertyChanged(nameof(Pins));
|
||||
PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
|
||||
return pin;
|
||||
}
|
||||
|
||||
@ -162,7 +175,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
{
|
||||
OutputPin pin = new(this, type, name);
|
||||
_pins.Add(pin);
|
||||
OnPropertyChanged(nameof(Pins));
|
||||
PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
|
||||
return pin;
|
||||
}
|
||||
|
||||
@ -237,7 +250,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
if (isRemoved)
|
||||
{
|
||||
pin.DisconnectAll();
|
||||
OnPropertyChanged(nameof(Pins));
|
||||
PinRemoved?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
|
||||
}
|
||||
|
||||
return isRemoved;
|
||||
@ -255,7 +268,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
return;
|
||||
|
||||
_pins.Add(pin);
|
||||
OnPropertyChanged(nameof(Pins));
|
||||
PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -269,7 +282,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
{
|
||||
InputPinCollection<T> pin = new(this, name, initialCount);
|
||||
_pinCollections.Add(pin);
|
||||
OnPropertyChanged(nameof(PinCollections));
|
||||
PinCollectionAdded?.Invoke(this, new SingleValueEventArgs<IPinCollection>(pin));
|
||||
return pin;
|
||||
}
|
||||
|
||||
@ -284,7 +297,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
{
|
||||
InputPinCollection pin = new(this, type, name, initialCount);
|
||||
_pinCollections.Add(pin);
|
||||
OnPropertyChanged(nameof(PinCollections));
|
||||
PinCollectionAdded?.Invoke(this, new SingleValueEventArgs<IPinCollection>(pin));
|
||||
return pin;
|
||||
}
|
||||
|
||||
@ -299,7 +312,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
{
|
||||
OutputPinCollection<T> pin = new(this, name, initialCount);
|
||||
_pinCollections.Add(pin);
|
||||
OnPropertyChanged(nameof(PinCollections));
|
||||
PinCollectionAdded?.Invoke(this, new SingleValueEventArgs<IPinCollection>(pin));
|
||||
return pin;
|
||||
}
|
||||
|
||||
@ -316,7 +329,7 @@ public abstract class Node : CorePropertyChanged, INode
|
||||
{
|
||||
foreach (IPin pin in pinCollection)
|
||||
pin.DisconnectAll();
|
||||
OnPropertyChanged(nameof(PinCollections));
|
||||
PinCollectionRemoved?.Invoke(this, new SingleValueEventArgs<IPinCollection>(pinCollection));
|
||||
}
|
||||
|
||||
return isRemoved;
|
||||
|
||||
@ -66,7 +66,8 @@ public class NodeScriptViewModel : ActivatableViewModelBase
|
||||
});
|
||||
NodeViewModels = nodeViewModels;
|
||||
|
||||
NodeViewModels.ToObservableChangeSet().TransformMany(vm => vm.PinViewModels)
|
||||
NodeViewModels.ToObservableChangeSet()
|
||||
.TransformMany(vm => vm.PinViewModels)
|
||||
.Bind(out ReadOnlyObservableCollection<PinViewModel> pinViewModels)
|
||||
.Subscribe();
|
||||
PinViewModels = pinViewModels;
|
||||
|
||||
@ -3,6 +3,7 @@ using System.Collections.ObjectModel;
|
||||
using System.Reactive;
|
||||
using System.Reactive.Linq;
|
||||
using Artemis.Core;
|
||||
using Artemis.Core.Events;
|
||||
using Artemis.UI.Ninject.Factories;
|
||||
using Artemis.UI.Screens.VisualScripting.Pins;
|
||||
using Artemis.UI.Shared;
|
||||
@ -99,18 +100,31 @@ public class NodeViewModel : ActivatableViewModelBase
|
||||
.DisposeWith(d);
|
||||
|
||||
// Subscribe to pin changes
|
||||
Node.WhenAnyValue(n => n.Pins).Subscribe(p => nodePins.Edit(source =>
|
||||
Observable.FromEventPattern<SingleValueEventArgs<IPin>>(x => Node.PinAdded += x, x => Node.PinAdded -= x)
|
||||
.Subscribe(p => nodePins.Add(p.EventArgs.Value))
|
||||
.DisposeWith(d);
|
||||
Observable.FromEventPattern<SingleValueEventArgs<IPin>>(x => Node.PinRemoved += x, x => Node.PinRemoved -= x)
|
||||
.Subscribe(p => nodePins.Remove(p.EventArgs.Value))
|
||||
.DisposeWith(d);
|
||||
nodePins.Edit(l =>
|
||||
{
|
||||
source.Clear();
|
||||
source.AddRange(p);
|
||||
})).DisposeWith(d);
|
||||
l.Clear();
|
||||
l.AddRange(Node.Pins);
|
||||
});
|
||||
|
||||
// Subscribe to pin collection changes
|
||||
Node.WhenAnyValue(n => n.PinCollections).Subscribe(c => nodePinCollections.Edit(source =>
|
||||
Observable.FromEventPattern<SingleValueEventArgs<IPinCollection>>(x => Node.PinCollectionAdded += x, x => Node.PinCollectionAdded -= x)
|
||||
.Subscribe(p => nodePinCollections.Add(p.EventArgs.Value))
|
||||
.DisposeWith(d);
|
||||
Observable.FromEventPattern<SingleValueEventArgs<IPinCollection>>(x => Node.PinCollectionRemoved += x, x => Node.PinCollectionRemoved -= x)
|
||||
.Subscribe(p => nodePinCollections.Remove(p.EventArgs.Value))
|
||||
.DisposeWith(d);
|
||||
nodePinCollections.Edit(l =>
|
||||
{
|
||||
source.Clear();
|
||||
source.AddRange(c);
|
||||
})).DisposeWith(d);
|
||||
|
||||
l.Clear();
|
||||
l.AddRange(Node.PinCollections);
|
||||
});
|
||||
|
||||
if (Node is Node coreNode)
|
||||
CustomNodeViewModel = coreNode.GetCustomViewModel(nodeScriptViewModel.NodeScript);
|
||||
});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user