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;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using Artemis.Core.Events;
namespace Artemis.Core; namespace Artemis.Core;
@ -58,6 +59,26 @@ public interface INode : INotifyPropertyChanged
/// Called when the node resets /// Called when the node resets
/// </summary> /// </summary>
event EventHandler Resetting; 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> /// <summary>
/// Called when the node was loaded from storage or newly created /// 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.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Artemis.Core.Events;
using Ninject; using Ninject;
using Ninject.Parameters; using Ninject.Parameters;
@ -16,6 +17,18 @@ public abstract class Node : CorePropertyChanged, INode
/// <inheritdoc /> /// <inheritdoc />
public event EventHandler? Resetting; 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 #region Properties & Fields
private readonly List<OutputPin> _outputPinBucket = new(); private readonly List<OutputPin> _outputPinBucket = new();
@ -120,7 +133,7 @@ public abstract class Node : CorePropertyChanged, INode
{ {
InputPin<T> pin = new(this, name); InputPin<T> pin = new(this, name);
_pins.Add(pin); _pins.Add(pin);
OnPropertyChanged(nameof(Pins)); PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
return pin; return pin;
} }
@ -134,7 +147,7 @@ public abstract class Node : CorePropertyChanged, INode
{ {
InputPin pin = new(this, type, name); InputPin pin = new(this, type, name);
_pins.Add(pin); _pins.Add(pin);
OnPropertyChanged(nameof(Pins)); PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
return pin; return pin;
} }
@ -148,7 +161,7 @@ public abstract class Node : CorePropertyChanged, INode
{ {
OutputPin<T> pin = new(this, name); OutputPin<T> pin = new(this, name);
_pins.Add(pin); _pins.Add(pin);
OnPropertyChanged(nameof(Pins)); PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
return pin; return pin;
} }
@ -162,7 +175,7 @@ public abstract class Node : CorePropertyChanged, INode
{ {
OutputPin pin = new(this, type, name); OutputPin pin = new(this, type, name);
_pins.Add(pin); _pins.Add(pin);
OnPropertyChanged(nameof(Pins)); PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
return pin; return pin;
} }
@ -237,7 +250,7 @@ public abstract class Node : CorePropertyChanged, INode
if (isRemoved) if (isRemoved)
{ {
pin.DisconnectAll(); pin.DisconnectAll();
OnPropertyChanged(nameof(Pins)); PinRemoved?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
} }
return isRemoved; return isRemoved;
@ -255,7 +268,7 @@ public abstract class Node : CorePropertyChanged, INode
return; return;
_pins.Add(pin); _pins.Add(pin);
OnPropertyChanged(nameof(Pins)); PinAdded?.Invoke(this, new SingleValueEventArgs<IPin>(pin));
} }
/// <summary> /// <summary>
@ -269,7 +282,7 @@ public abstract class Node : CorePropertyChanged, INode
{ {
InputPinCollection<T> pin = new(this, name, initialCount); InputPinCollection<T> pin = new(this, name, initialCount);
_pinCollections.Add(pin); _pinCollections.Add(pin);
OnPropertyChanged(nameof(PinCollections)); PinCollectionAdded?.Invoke(this, new SingleValueEventArgs<IPinCollection>(pin));
return pin; return pin;
} }
@ -284,7 +297,7 @@ public abstract class Node : CorePropertyChanged, INode
{ {
InputPinCollection pin = new(this, type, name, initialCount); InputPinCollection pin = new(this, type, name, initialCount);
_pinCollections.Add(pin); _pinCollections.Add(pin);
OnPropertyChanged(nameof(PinCollections)); PinCollectionAdded?.Invoke(this, new SingleValueEventArgs<IPinCollection>(pin));
return pin; return pin;
} }
@ -299,7 +312,7 @@ public abstract class Node : CorePropertyChanged, INode
{ {
OutputPinCollection<T> pin = new(this, name, initialCount); OutputPinCollection<T> pin = new(this, name, initialCount);
_pinCollections.Add(pin); _pinCollections.Add(pin);
OnPropertyChanged(nameof(PinCollections)); PinCollectionAdded?.Invoke(this, new SingleValueEventArgs<IPinCollection>(pin));
return pin; return pin;
} }
@ -316,7 +329,7 @@ public abstract class Node : CorePropertyChanged, INode
{ {
foreach (IPin pin in pinCollection) foreach (IPin pin in pinCollection)
pin.DisconnectAll(); pin.DisconnectAll();
OnPropertyChanged(nameof(PinCollections)); PinCollectionRemoved?.Invoke(this, new SingleValueEventArgs<IPinCollection>(pinCollection));
} }
return isRemoved; return isRemoved;

View File

@ -66,7 +66,8 @@ public class NodeScriptViewModel : ActivatableViewModelBase
}); });
NodeViewModels = nodeViewModels; NodeViewModels = nodeViewModels;
NodeViewModels.ToObservableChangeSet().TransformMany(vm => vm.PinViewModels) NodeViewModels.ToObservableChangeSet()
.TransformMany(vm => vm.PinViewModels)
.Bind(out ReadOnlyObservableCollection<PinViewModel> pinViewModels) .Bind(out ReadOnlyObservableCollection<PinViewModel> pinViewModels)
.Subscribe(); .Subscribe();
PinViewModels = pinViewModels; PinViewModels = pinViewModels;

View File

@ -3,6 +3,7 @@ using System.Collections.ObjectModel;
using System.Reactive; using System.Reactive;
using System.Reactive.Linq; using System.Reactive.Linq;
using Artemis.Core; using Artemis.Core;
using Artemis.Core.Events;
using Artemis.UI.Ninject.Factories; using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.VisualScripting.Pins; using Artemis.UI.Screens.VisualScripting.Pins;
using Artemis.UI.Shared; using Artemis.UI.Shared;
@ -99,18 +100,31 @@ public class NodeViewModel : ActivatableViewModelBase
.DisposeWith(d); .DisposeWith(d);
// Subscribe to pin changes // 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(); l.Clear();
source.AddRange(p); l.AddRange(Node.Pins);
})).DisposeWith(d); });
// Subscribe to pin collection changes // 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(); l.Clear();
source.AddRange(c); l.AddRange(Node.PinCollections);
})).DisposeWith(d); });
if (Node is Node coreNode) if (Node is Node coreNode)
CustomNodeViewModel = coreNode.GetCustomViewModel(nodeScriptViewModel.NodeScript); CustomNodeViewModel = coreNode.GetCustomViewModel(nodeScriptViewModel.NodeScript);
}); });