1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Visual Scripting: Fixed cables not beeing shown after changing the script

This commit is contained in:
Darth Affe 2021-07-16 16:21:10 +02:00
parent 1e67c1c567
commit 51541b4e6e
5 changed files with 61 additions and 15 deletions

View File

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Artemis.VisualScripting.Model;
namespace Artemis.Core.VisualScripting
@ -12,6 +13,8 @@ namespace Artemis.Core.VisualScripting
Type Type { get; }
object PinValue { get; }
IReadOnlyList<IPin> ConnectedTo { get; }
bool IsEvaluated { get; set; }
void ConnectTo(IPin pin);

View File

@ -213,12 +213,15 @@ namespace Artemis.VisualScripting.Editor.Controls
InitializeNode(node);
}
VisualScript?.RecreateCables();
CenterAt(new Vector(0, 0));
}
private void OnVisualScriptPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == nameof(VisualScript.Cables))
if (_cableList != null)
_cableList.ItemsSource = VisualScript.Cables;
}

View File

@ -44,10 +44,10 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
public ObservableCollection<VisualScriptNode> Nodes { get; } = new();
public IEnumerable<VisualScriptCable> Cables => Nodes.SelectMany(n => n.InputPins.SelectMany(p => p.Connections))
.Concat(Nodes.SelectMany(n => n.OutputPins.SelectMany(p => p.Connections)))
.Concat(Nodes.SelectMany(n => n.InputPinCollections.SelectMany(p => p.Pins).SelectMany(p => p.Connections)))
.Concat(Nodes.SelectMany(n => n.OutputPinCollections.SelectMany(p => p.Pins).SelectMany(p => p.Connections)))
public IEnumerable<VisualScriptCable> Cables => Nodes.SelectMany(n => n.InputPins.SelectMany(p => p.InternalConnections))
.Concat(Nodes.SelectMany(n => n.OutputPins.SelectMany(p => p.InternalConnections)))
.Concat(Nodes.SelectMany(n => n.InputPinCollections.SelectMany(p => p.Pins).SelectMany(p => p.InternalConnections)))
.Concat(Nodes.SelectMany(n => n.OutputPinCollections.SelectMany(p => p.Pins).SelectMany(p => p.InternalConnections)))
.Distinct();
public bool IsConnecting => IsConnectingPin != null;
@ -184,6 +184,36 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
Script.RemoveNode(node.Node);
}
internal void RecreateCables()
{
Dictionary<IPin, VisualScriptPin> pinMapping = Nodes.SelectMany(n => n.InputPins)
.Concat(Nodes.SelectMany(n => n.OutputPins))
.Concat(Nodes.SelectMany(n => n.InputPinCollections.SelectMany(p => p.Pins)))
.Concat(Nodes.SelectMany(n => n.OutputPinCollections.SelectMany(p => p.Pins)))
.ToDictionary(p => p.Pin, p => p);
foreach (VisualScriptPin pin in pinMapping.Values)
pin.InternalConnections.Clear();
HashSet<IPin> connectedPins = new();
foreach (IPin pin in pinMapping.Keys)
{
foreach (IPin connectedPin in pin.ConnectedTo)
if (!connectedPins.Contains(connectedPin))
{
VisualScriptPin pin1 = pinMapping[pin];
VisualScriptPin pin2 = pinMapping[connectedPin];
VisualScriptCable cable = new(pin1, pin2, false);
pin1.InternalConnections.Add(cable);
pin2.InternalConnections.Add(cable);
}
connectedPins.Add(pin);
}
OnPropertyChanged(nameof(Cables));
}
#endregion
}
}

View File

@ -28,6 +28,10 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
#region Constructors
public VisualScriptCable(VisualScriptPin pin1, VisualScriptPin pin2)
: this(pin1, pin2, true)
{ }
internal VisualScriptCable(VisualScriptPin pin1, VisualScriptPin pin2, bool connect)
{
if ((pin1.Pin.Direction == PinDirection.Input) && (pin2.Pin.Direction == PinDirection.Input))
throw new ArgumentException("Can't connect two input pins.");
@ -38,9 +42,12 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
From = pin1.Pin.Direction == PinDirection.Output ? pin1 : pin2;
To = pin1.Pin.Direction == PinDirection.Input ? pin1 : pin2;
if (connect)
{
From.ConnectTo(this);
To.ConnectTo(this);
}
}
#endregion

View File

@ -26,7 +26,8 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
public VisualScriptNode Node { get; }
public IPin Pin { get; }
public ObservableCollection<VisualScriptCable> Connections { get; } = new();
public IReadOnlyCollection<VisualScriptCable> Connections => new ReadOnlyCollection<VisualScriptCable>(InternalConnections);
internal ObservableCollection<VisualScriptCable> InternalConnections { get; } = new();
private Point _absolutePosition;
public Point AbsolutePosition
@ -39,7 +40,8 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
}
}
public Point AbsoluteCableTargetPosition => Pin.Direction == PinDirection.Input ? new Point(AbsolutePosition.X - CABLE_OFFSET, AbsolutePosition.Y) : new Point(AbsolutePosition.X + CABLE_OFFSET, AbsolutePosition.Y);
public Point AbsoluteCableTargetPosition => Pin.Direction == PinDirection.Input ? new Point(AbsolutePosition.X - CABLE_OFFSET, AbsolutePosition.Y)
: new Point(AbsolutePosition.X + CABLE_OFFSET, AbsolutePosition.Y);
#endregion
@ -62,7 +64,8 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
if (_isConnectingCable != null)
SetConnecting(false);
_isConnectingPin = new VisualScriptPin(null, new IsConnectingPin(Pin.Direction == PinDirection.Input ? PinDirection.Output : PinDirection.Input)) { AbsolutePosition = AbsolutePosition };
_isConnectingPin = new VisualScriptPin(null, new IsConnectingPin(Pin.Direction == PinDirection.Input ? PinDirection.Output : PinDirection.Input, Pin.Type))
{ AbsolutePosition = AbsolutePosition };
_isConnectingCable = new VisualScriptCable(this, _isConnectingPin);
Node.OnIsConnectingPinChanged(_isConnectingPin);
}
@ -77,16 +80,16 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
internal void ConnectTo(VisualScriptCable cable)
{
if (Connections.Contains(cable)) return;
if (InternalConnections.Contains(cable)) return;
if (Pin.Direction == PinDirection.Input)
{
List<VisualScriptCable> cables = Connections.ToList();
List<VisualScriptCable> cables = InternalConnections.ToList();
foreach (VisualScriptCable c in cables)
c.Disconnect();
}
Connections.Add(cable);
InternalConnections.Add(cable);
Pin.ConnectTo(cable.GetConnectedPin(Pin));
Node?.OnPinConnected(new PinConnectedEventArgs(this, cable));
@ -94,14 +97,14 @@ namespace Artemis.VisualScripting.Editor.Controls.Wrapper
public void DisconnectAll()
{
List<VisualScriptCable> cables = Connections.ToList();
List<VisualScriptCable> cables = InternalConnections.ToList();
foreach (VisualScriptCable cable in cables)
cable.Disconnect();
}
internal void Disconnect(VisualScriptCable cable)
{
Connections.Remove(cable);
InternalConnections.Remove(cable);
Pin.DisconnectFrom(cable.GetConnectedPin(Pin));
Node?.OnPinDisconnected(new PinDisconnectedEventArgs(this, cable));