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;
|
||||||
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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user