diff --git a/src/Artemis.Core/VisualScripting/Events/SingleValueEventArgs.cs b/src/Artemis.Core/VisualScripting/Events/SingleValueEventArgs.cs new file mode 100644 index 000000000..80fe7f092 --- /dev/null +++ b/src/Artemis.Core/VisualScripting/Events/SingleValueEventArgs.cs @@ -0,0 +1,22 @@ +using System; + +namespace Artemis.Core.Events +{ + public class SingleValueEventArgs : EventArgs + { + #region Properties & Fields + + public T Value { get; } + + #endregion + + #region Constructors + + public SingleValueEventArgs(T value) + { + this.Value = value; + } + + #endregion + } +} diff --git a/src/Artemis.Core/VisualScripting/InputPin.cs b/src/Artemis.Core/VisualScripting/InputPin.cs index 39849a105..1179a1885 100644 --- a/src/Artemis.Core/VisualScripting/InputPin.cs +++ b/src/Artemis.Core/VisualScripting/InputPin.cs @@ -42,10 +42,12 @@ namespace Artemis.Core #endregion #region Methods - + private void Evaluate() { - Value = ConnectedTo.Count > 0 ? (T)ConnectedTo[0].PinValue : default; + if (ConnectedTo.Count > 0) + if (ConnectedTo[0].PinValue is T value) + Value = value; } #endregion diff --git a/src/Artemis.Core/VisualScripting/Interfaces/INodeScript.cs b/src/Artemis.Core/VisualScripting/Interfaces/INodeScript.cs index dec3cab46..10c80548d 100644 --- a/src/Artemis.Core/VisualScripting/Interfaces/INodeScript.cs +++ b/src/Artemis.Core/VisualScripting/Interfaces/INodeScript.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using Artemis.Core.Events; namespace Artemis.Core { @@ -16,8 +17,8 @@ namespace Artemis.Core object? Context { get; set; } - event EventHandler? NodeAdded; - event EventHandler? NodeRemoved; + event EventHandler>? NodeAdded; + event EventHandler>? NodeRemoved; void Run(); void AddNode(INode node); diff --git a/src/Artemis.Core/VisualScripting/Interfaces/IPin.cs b/src/Artemis.Core/VisualScripting/Interfaces/IPin.cs index 0ea3179e4..8f7f1f93e 100644 --- a/src/Artemis.Core/VisualScripting/Interfaces/IPin.cs +++ b/src/Artemis.Core/VisualScripting/Interfaces/IPin.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Artemis.Core.Events; namespace Artemis.Core { @@ -16,8 +17,8 @@ namespace Artemis.Core bool IsEvaluated { get; set; } - event EventHandler PinConnected; - event EventHandler PinDisconnected; + event EventHandler> PinConnected; + event EventHandler> PinDisconnected; void ConnectTo(IPin pin); void DisconnectFrom(IPin pin); diff --git a/src/Artemis.Core/VisualScripting/Interfaces/IPinCollection.cs b/src/Artemis.Core/VisualScripting/Interfaces/IPinCollection.cs index 266c31338..c5f382807 100644 --- a/src/Artemis.Core/VisualScripting/Interfaces/IPinCollection.cs +++ b/src/Artemis.Core/VisualScripting/Interfaces/IPinCollection.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Artemis.Core.Events; namespace Artemis.Core { @@ -9,8 +10,8 @@ namespace Artemis.Core PinDirection Direction { get; } Type Type { get; } - event EventHandler PinAdded; - event EventHandler PinRemoved; + event EventHandler> PinAdded; + event EventHandler> PinRemoved; IPin AddPin(); bool Remove(IPin pin); diff --git a/src/Artemis.Core/VisualScripting/NodeScript.cs b/src/Artemis.Core/VisualScripting/NodeScript.cs index 2f367bd7c..30d227a86 100644 --- a/src/Artemis.Core/VisualScripting/NodeScript.cs +++ b/src/Artemis.Core/VisualScripting/NodeScript.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using Artemis.Core.Events; using Artemis.Core.Internal; using Artemis.Core.Properties; using Artemis.Storage.Entities.Profile.Nodes; @@ -15,8 +16,8 @@ namespace Artemis.Core Load(); } - public event EventHandler? NodeAdded; - public event EventHandler? NodeRemoved; + public event EventHandler>? NodeAdded; + public event EventHandler>? NodeRemoved; #region Properties & Fields @@ -76,7 +77,7 @@ namespace Artemis.Core { _nodes.Add(node); - NodeAdded?.Invoke(this, node); + NodeAdded?.Invoke(this, new SingleValueEventArgs(node)); } public void RemoveNode(INode node) @@ -86,7 +87,7 @@ namespace Artemis.Core if (node is IDisposable disposable) disposable.Dispose(); - NodeRemoved?.Invoke(this, node); + NodeRemoved?.Invoke(this, new SingleValueEventArgs(node)); } public void Dispose() @@ -109,7 +110,7 @@ namespace Artemis.Core public void Load() { List removeNodes = _nodes.Where(n => !n.IsExitNode).ToList(); - foreach (INode removeNode in removeNodes) + foreach (INode removeNode in removeNodes) RemoveNode(removeNode); // Create nodes @@ -148,7 +149,7 @@ namespace Artemis.Core { IPinCollection? collection = node.PinCollections.FirstOrDefault(c => c.Name == entityNodePinCollection.Name && c.Type.Name == entityNodePinCollection.Type && - (int) c.Direction == entityNodePinCollection.Direction); + (int)c.Direction == entityNodePinCollection.Direction); if (collection == null) continue; @@ -230,7 +231,7 @@ namespace Artemis.Core { Name = nodePinCollection.Name, Type = nodePinCollection.Type.Name, - Direction = (int) nodePinCollection.Direction, + Direction = (int)nodePinCollection.Direction, Amount = nodePinCollection.Count() }); } @@ -300,7 +301,7 @@ namespace Artemis.Core { #region Properties & Fields - public T Result => ((ExitNode) ExitNode).Value; + public T Result => ((ExitNode)ExitNode).Value; public override Type ResultType => typeof(T); diff --git a/src/Artemis.Core/VisualScripting/Pin.cs b/src/Artemis.Core/VisualScripting/Pin.cs index be8f3f63d..43f5c0e35 100644 --- a/src/Artemis.Core/VisualScripting/Pin.cs +++ b/src/Artemis.Core/VisualScripting/Pin.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using Artemis.Core.Events; namespace Artemis.Core { @@ -29,8 +30,8 @@ namespace Artemis.Core #region Events - public event EventHandler PinConnected; - public event EventHandler PinDisconnected; + public event EventHandler> PinConnected; + public event EventHandler> PinDisconnected; #endregion @@ -54,7 +55,7 @@ namespace Artemis.Core _connectedTo.Add(pin); OnPropertyChanged(nameof(ConnectedTo)); - PinConnected?.Invoke(this, pin); + PinConnected?.Invoke(this, new SingleValueEventArgs(pin)); } public void DisconnectFrom(IPin pin) @@ -62,7 +63,7 @@ namespace Artemis.Core _connectedTo.Remove(pin); OnPropertyChanged(nameof(ConnectedTo)); - PinDisconnected?.Invoke(this, pin); + PinDisconnected?.Invoke(this, new SingleValueEventArgs(pin)); } public void DisconnectAll() @@ -73,7 +74,7 @@ namespace Artemis.Core OnPropertyChanged(nameof(ConnectedTo)); foreach (IPin pin in connectedPins) - PinDisconnected?.Invoke(this, pin); + PinDisconnected?.Invoke(this, new SingleValueEventArgs(pin)); } private void OnNodeResetting(object sender, EventArgs e) diff --git a/src/Artemis.Core/VisualScripting/PinCollection.cs b/src/Artemis.Core/VisualScripting/PinCollection.cs index 4bce68cc1..754461851 100644 --- a/src/Artemis.Core/VisualScripting/PinCollection.cs +++ b/src/Artemis.Core/VisualScripting/PinCollection.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; +using Artemis.Core.Events; namespace Artemis.Core { @@ -22,8 +23,8 @@ namespace Artemis.Core #region Events - public event EventHandler PinAdded; - public event EventHandler PinRemoved; + public event EventHandler> PinAdded; + public event EventHandler> PinRemoved; #endregion @@ -48,7 +49,7 @@ namespace Artemis.Core IPin pin = CreatePin(); _pins.Add(pin); - PinAdded?.Invoke(this, pin); + PinAdded?.Invoke(this, new SingleValueEventArgs(pin)); return pin; } @@ -58,7 +59,7 @@ namespace Artemis.Core bool removed = _pins.Remove(pin); if (removed) - PinRemoved?.Invoke(this, pin); + PinRemoved?.Invoke(this, new SingleValueEventArgs(pin)); return removed; } diff --git a/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScript.cs b/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScript.cs index b63125a2b..804e9872b 100644 --- a/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScript.cs +++ b/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScript.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Windows; using System.Windows.Threading; using Artemis.Core; +using Artemis.Core.Events; using Artemis.VisualScripting.Events; using Artemis.VisualScripting.ViewModel; @@ -78,10 +79,9 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper LocationOffset = SurfaceSize / 2.0; - Nodes.CollectionChanged += OnNodeCollectionChanged; - - script.NodeAdded += OnScriptNodeAdded; - script.NodeRemoved += OnScriptRemovedAdded; + CollectionChangedEventManager.AddHandler(Nodes, OnNodeCollectionChanged); + NodeAddedEventManager.AddHandler(script, OnScriptNodeAdded); + NodeRemovedEventManager.AddHandler(script, OnScriptNodeRemoved); foreach (INode node in Script.Nodes) InitializeNode(node); @@ -107,16 +107,16 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper RegisterNodes(args.NewItems.Cast()); } - private void OnScriptNodeAdded(object sender, INode node) + private void OnScriptNodeAdded(object sender, SingleValueEventArgs args) { - if (_nodeMapping.ContainsKey(node)) return; + if (_nodeMapping.ContainsKey(args.Value)) return; - InitializeNode(node); + InitializeNode(args.Value); } - private void OnScriptRemovedAdded(object sender, INode node) + private void OnScriptNodeRemoved(object sender, SingleValueEventArgs args) { - if (!_nodeMapping.TryGetValue(node, out VisualScriptNode visualScriptNode)) return; + if (!_nodeMapping.TryGetValue(args.Value, out VisualScriptNode visualScriptNode)) return; Nodes.Remove(visualScriptNode); } diff --git a/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptNode.cs b/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptNode.cs index 778bdc0b9..fb642fa13 100644 --- a/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptNode.cs +++ b/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptNode.cs @@ -98,7 +98,10 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper this.Script = script; this.Node = node; - Node.PropertyChanged += OnNodePropertyChanged; + PropertyChangedEventManager.AddHandler(Node, OnNodePropertyChanged, nameof(Node.Pins)); + PropertyChangedEventManager.AddHandler(Node, OnNodePropertyChanged, nameof(Node.PinCollections)); + PropertyChangedEventManager.AddHandler(Node, OnNodePropertyChanged, nameof(Node.X)); + PropertyChangedEventManager.AddHandler(Node, OnNodePropertyChanged, nameof(Node.Y)); ValidatePins(); } diff --git a/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPin.cs b/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPin.cs index a3720cbf4..a0e8706fc 100644 --- a/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPin.cs +++ b/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPin.cs @@ -3,6 +3,7 @@ using System.Collections.ObjectModel; using System.Linq; using System.Windows; using Artemis.Core; +using Artemis.Core.Events; using Artemis.VisualScripting.Events; using Artemis.VisualScripting.Internal; using Artemis.VisualScripting.ViewModel; @@ -52,15 +53,15 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper this.Node = node; this.Pin = pin; - pin.PinConnected += PinConnectionChanged; - pin.PinDisconnected += PinConnectionChanged; + PinConnectedEventManager.AddHandler(pin, PinConnectionChanged); + PinDisconnectedEventManager.AddHandler(pin, PinConnectionChanged); } #endregion #region Methods - private void PinConnectionChanged(object sender, IPin pin) + private void PinConnectionChanged(object sender, SingleValueEventArgs pin) { if (_isConnectionUpdated) return; diff --git a/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPinCollection.cs b/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPinCollection.cs index d9a1ac838..9aa6a3681 100644 --- a/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPinCollection.cs +++ b/src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPinCollection.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using Artemis.Core; +using Artemis.Core.Events; +using Artemis.VisualScripting.Events; using Artemis.VisualScripting.ViewModel; namespace Artemis.VisualScripting.Editor.Controls.Wrapper @@ -34,8 +36,8 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper this.Node = node; this.PinCollection = pinCollection; - pinCollection.PinAdded += OnPinCollectionPinAdded; - pinCollection.PinRemoved += OnPinCollectionPinRemoved; + PinAddedEventManager.AddHandler(pinCollection, OnPinCollectionPinAdded); + PinRemovedEventManager.AddHandler(pinCollection, OnPinCollectionPinRemoved); foreach (IPin pin in PinCollection) { @@ -49,32 +51,27 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper #region Methods - private void OnPinCollectionPinRemoved(object sender, IPin pin) + private void OnPinCollectionPinRemoved(object sender, SingleValueEventArgs args) { - if (!_pinMapping.TryGetValue(pin, out VisualScriptPin visualScriptPin)) return; + if (!_pinMapping.TryGetValue(args.Value, out VisualScriptPin visualScriptPin)) return; visualScriptPin.DisconnectAll(); Pins.Remove(visualScriptPin); } - private void OnPinCollectionPinAdded(object sender, IPin pin) + private void OnPinCollectionPinAdded(object sender, SingleValueEventArgs args) { - if (_pinMapping.ContainsKey(pin)) return; + if (_pinMapping.ContainsKey(args.Value)) return; - VisualScriptPin visualScriptPin = new(Node, pin); - _pinMapping.Add(pin, visualScriptPin); + VisualScriptPin visualScriptPin = new(Node, args.Value); + _pinMapping.Add(args.Value, visualScriptPin); Pins.Add(visualScriptPin); } - public void AddPin() - { - PinCollection.AddPin(); - } + public void AddPin() => PinCollection.AddPin(); + + public void RemovePin(VisualScriptPin pin) => PinCollection.Remove(pin.Pin); - public void RemovePin(VisualScriptPin pin) - { - PinCollection.Remove(pin.Pin); - } public void RemoveAll() { List pins = new(Pins); diff --git a/src/Artemis.VisualScripting/Events/NodeAddedEventManager.cs b/src/Artemis.VisualScripting/Events/NodeAddedEventManager.cs new file mode 100644 index 000000000..d74fa5fec --- /dev/null +++ b/src/Artemis.VisualScripting/Events/NodeAddedEventManager.cs @@ -0,0 +1,77 @@ +using System; +using System.Windows; +using Artemis.Core; +using Artemis.Core.Events; + +namespace Artemis.VisualScripting.Events +{ + public class NodeAddedEventManager : WeakEventManager + { + #region Properties & Fields + + private static NodeAddedEventManager CurrentManager + { + get + { + Type type = typeof(NodeAddedEventManager); + NodeAddedEventManager changedEventManager = (NodeAddedEventManager)GetCurrentManager(type); + if (changedEventManager == null) + { + changedEventManager = new NodeAddedEventManager(); + SetCurrentManager(type, changedEventManager); + } + return changedEventManager; + } + } + + #endregion + + #region Constructors + + private NodeAddedEventManager() + { } + + #endregion + + #region Methods + + public static void AddListener(INodeScript source, IWeakEventListener listener) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedAddListener(source, listener); + } + + public static void RemoveListener(INodeScript source, IWeakEventListener listener) + { + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedRemoveListener(source, listener); + } + + public static void AddHandler(INodeScript source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedAddHandler(source, handler); + } + + public static void RemoveHandler(INodeScript source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedRemoveHandler(source, handler); + } + + protected override ListenerList NewListenerList() => new ListenerList>(); + + protected override void StartListening(object source) => ((INodeScript)source).NodeAdded += OnNodeAdded; + + protected override void StopListening(object source) => ((INodeScript)source).NodeAdded -= OnNodeAdded; + + private void OnNodeAdded(object sender, SingleValueEventArgs args) => DeliverEvent(sender, args); + + #endregion + } +} diff --git a/src/Artemis.VisualScripting/Events/NodeRemovedEventManager.cs b/src/Artemis.VisualScripting/Events/NodeRemovedEventManager.cs new file mode 100644 index 000000000..e5efe6678 --- /dev/null +++ b/src/Artemis.VisualScripting/Events/NodeRemovedEventManager.cs @@ -0,0 +1,77 @@ +using System; +using System.Windows; +using Artemis.Core; +using Artemis.Core.Events; + +namespace Artemis.VisualScripting.Events +{ + public class NodeRemovedEventManager : WeakEventManager + { + #region Properties & Fields + + private static NodeRemovedEventManager CurrentManager + { + get + { + Type type = typeof(NodeRemovedEventManager); + NodeRemovedEventManager changedEventManager = (NodeRemovedEventManager)GetCurrentManager(type); + if (changedEventManager == null) + { + changedEventManager = new NodeRemovedEventManager(); + SetCurrentManager(type, changedEventManager); + } + return changedEventManager; + } + } + + #endregion + + #region Constructors + + private NodeRemovedEventManager() + { } + + #endregion + + #region Methods + + public static void AddListener(INodeScript source, IWeakEventListener listener) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedAddListener(source, listener); + } + + public static void RemoveListener(INodeScript source, IWeakEventListener listener) + { + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedRemoveListener(source, listener); + } + + public static void AddHandler(INodeScript source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedAddHandler(source, handler); + } + + public static void RemoveHandler(INodeScript source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedRemoveHandler(source, handler); + } + + protected override ListenerList NewListenerList() => new ListenerList>(); + + protected override void StartListening(object source) => ((INodeScript)source).NodeRemoved += OnNodeRemoved; + + protected override void StopListening(object source) => ((INodeScript)source).NodeRemoved -= OnNodeRemoved; + + private void OnNodeRemoved(object sender, SingleValueEventArgs args) => DeliverEvent(sender, args); + + #endregion + } +} diff --git a/src/Artemis.VisualScripting/Events/PinAddedEventManager.cs b/src/Artemis.VisualScripting/Events/PinAddedEventManager.cs new file mode 100644 index 000000000..790cbdfe3 --- /dev/null +++ b/src/Artemis.VisualScripting/Events/PinAddedEventManager.cs @@ -0,0 +1,77 @@ +using System; +using System.Windows; +using Artemis.Core; +using Artemis.Core.Events; + +namespace Artemis.VisualScripting.Events +{ + public class PinAddedEventManager : WeakEventManager + { + #region Properties & Fields + + private static PinAddedEventManager CurrentManager + { + get + { + Type type = typeof(PinAddedEventManager); + PinAddedEventManager changedEventManager = (PinAddedEventManager)GetCurrentManager(type); + if (changedEventManager == null) + { + changedEventManager = new PinAddedEventManager(); + SetCurrentManager(type, changedEventManager); + } + return changedEventManager; + } + } + + #endregion + + #region Constructors + + private PinAddedEventManager() + { } + + #endregion + + #region Methods + + public static void AddListener(IPinCollection source, IWeakEventListener listener) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedAddListener(source, listener); + } + + public static void RemoveListener(IPinCollection source, IWeakEventListener listener) + { + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedRemoveListener(source, listener); + } + + public static void AddHandler(IPinCollection source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedAddHandler(source, handler); + } + + public static void RemoveHandler(IPinCollection source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedRemoveHandler(source, handler); + } + + protected override ListenerList NewListenerList() => new ListenerList>(); + + protected override void StartListening(object source) => ((IPinCollection)source).PinAdded += OnPinAdded; + + protected override void StopListening(object source) => ((IPinCollection)source).PinAdded -= OnPinAdded; + + private void OnPinAdded(object sender, SingleValueEventArgs args) => DeliverEvent(sender, args); + + #endregion + } +} diff --git a/src/Artemis.VisualScripting/Events/PinConnectedEventManager.cs b/src/Artemis.VisualScripting/Events/PinConnectedEventManager.cs new file mode 100644 index 000000000..442e9763f --- /dev/null +++ b/src/Artemis.VisualScripting/Events/PinConnectedEventManager.cs @@ -0,0 +1,77 @@ +using System; +using System.Windows; +using Artemis.Core; +using Artemis.Core.Events; + +namespace Artemis.VisualScripting.Events +{ + public class PinConnectedEventManager : WeakEventManager + { + #region Properties & Fields + + private static PinConnectedEventManager CurrentManager + { + get + { + Type type = typeof(PinConnectedEventManager); + PinConnectedEventManager changedEventManager = (PinConnectedEventManager)GetCurrentManager(type); + if (changedEventManager == null) + { + changedEventManager = new PinConnectedEventManager(); + SetCurrentManager(type, changedEventManager); + } + return changedEventManager; + } + } + + #endregion + + #region Constructors + + private PinConnectedEventManager() + { } + + #endregion + + #region Methods + + public static void AddListener(IPin source, IWeakEventListener listener) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedAddListener(source, listener); + } + + public static void RemoveListener(IPin source, IWeakEventListener listener) + { + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedRemoveListener(source, listener); + } + + public static void AddHandler(IPin source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedAddHandler(source, handler); + } + + public static void RemoveHandler(IPin source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedRemoveHandler(source, handler); + } + + protected override ListenerList NewListenerList() => new ListenerList>(); + + protected override void StartListening(object source) => ((IPin)source).PinConnected += OnPinConnected; + + protected override void StopListening(object source) => ((IPin)source).PinConnected -= OnPinConnected; + + private void OnPinConnected(object sender, SingleValueEventArgs args) => DeliverEvent(sender, args); + + #endregion + } +} diff --git a/src/Artemis.VisualScripting/Events/PinDisconnectedEventManager.cs b/src/Artemis.VisualScripting/Events/PinDisconnectedEventManager.cs new file mode 100644 index 000000000..821c22bdc --- /dev/null +++ b/src/Artemis.VisualScripting/Events/PinDisconnectedEventManager.cs @@ -0,0 +1,77 @@ +using System; +using System.Windows; +using Artemis.Core; +using Artemis.Core.Events; + +namespace Artemis.VisualScripting.Events +{ + public class PinDisconnectedEventManager : WeakEventManager + { + #region Properties & Fields + + private static PinDisconnectedEventManager CurrentManager + { + get + { + Type type = typeof(PinDisconnectedEventManager); + PinDisconnectedEventManager changedEventManager = (PinDisconnectedEventManager)GetCurrentManager(type); + if (changedEventManager == null) + { + changedEventManager = new PinDisconnectedEventManager(); + SetCurrentManager(type, changedEventManager); + } + return changedEventManager; + } + } + + #endregion + + #region Constructors + + private PinDisconnectedEventManager() + { } + + #endregion + + #region Methods + + public static void AddListener(IPin source, IWeakEventListener listener) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedAddListener(source, listener); + } + + public static void RemoveListener(IPin source, IWeakEventListener listener) + { + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedRemoveListener(source, listener); + } + + public static void AddHandler(IPin source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedAddHandler(source, handler); + } + + public static void RemoveHandler(IPin source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedRemoveHandler(source, handler); + } + + protected override ListenerList NewListenerList() => new ListenerList>(); + + protected override void StartListening(object source) => ((IPin)source).PinDisconnected += OnPinDisconnected; + + protected override void StopListening(object source) => ((IPin)source).PinDisconnected -= OnPinDisconnected; + + private void OnPinDisconnected(object sender, SingleValueEventArgs args) => DeliverEvent(sender, args); + + #endregion + } +} diff --git a/src/Artemis.VisualScripting/Events/PinRemovedEventManager.cs b/src/Artemis.VisualScripting/Events/PinRemovedEventManager.cs new file mode 100644 index 000000000..d610f9232 --- /dev/null +++ b/src/Artemis.VisualScripting/Events/PinRemovedEventManager.cs @@ -0,0 +1,77 @@ +using System; +using System.Windows; +using Artemis.Core; +using Artemis.Core.Events; + +namespace Artemis.VisualScripting.Events +{ + public class PinRemovedEventManager : WeakEventManager + { + #region Properties & Fields + + private static PinRemovedEventManager CurrentManager + { + get + { + Type type = typeof(PinRemovedEventManager); + PinRemovedEventManager changedEventManager = (PinRemovedEventManager)GetCurrentManager(type); + if (changedEventManager == null) + { + changedEventManager = new PinRemovedEventManager(); + SetCurrentManager(type, changedEventManager); + } + return changedEventManager; + } + } + + #endregion + + #region Constructors + + private PinRemovedEventManager() + { } + + #endregion + + #region Methods + + public static void AddListener(IPinCollection source, IWeakEventListener listener) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedAddListener(source, listener); + } + + public static void RemoveListener(IPinCollection source, IWeakEventListener listener) + { + if (listener == null) throw new ArgumentNullException(nameof(listener)); + + CurrentManager.ProtectedRemoveListener(source, listener); + } + + public static void AddHandler(IPinCollection source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedAddHandler(source, handler); + } + + public static void RemoveHandler(IPinCollection source, EventHandler> handler) + { + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedRemoveHandler(source, handler); + } + + protected override ListenerList NewListenerList() => new ListenerList>(); + + protected override void StartListening(object source) => ((IPinCollection)source).PinRemoved += OnPinRemoved; + + protected override void StopListening(object source) => ((IPinCollection)source).PinRemoved -= OnPinRemoved; + + private void OnPinRemoved(object sender, SingleValueEventArgs args) => DeliverEvent(sender, args); + + #endregion + } +}