1
0
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:
Robert 2022-08-28 21:55:51 +02:00
parent ddfdbee340
commit 7e39a64fdf
4 changed files with 69 additions and 20 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);
});