-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPort.xaml.cs
120 lines (111 loc) · 3.18 KB
/
Port.xaml.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GraphView
{
/// <summary>
/// Interaction logic for Port.xaml
/// </summary>
public enum PortMode { Input, Output };
public enum PortValue
{
BOOL,
INT,
STRING,
}
public partial class Port : UserControl
{
public PortMode Mode;
public PortValue ValueType;
public object value;
public Node ParentNode;
private List<NodeConnection> connections = new List<NodeConnection>();
public Port(string name, PortValue pv, PortMode mode)
{
InitializeComponent();
Mode = mode;
NameLabel.Content = name;
NameLabel.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
ValueType = pv;
Connection.Stroke = new SolidColorBrush(PortColor());
SetupPort();
}
public bool HasConnections { get { return connections.Count > 0; } }
public void UpdatePortValue(object val)
{
SetPortValue(val);
foreach (var c in connections)
{
c.UpdateValue(value);
}
}
public void SetPortValue(object val)
{
value = val;
}
public virtual void SetValueProp(object value) { }
public void SetupPort()
{
switch (Mode)
{
case PortMode.Output:
Canvas.SetLeft(NameLabel, Canvas.GetLeft(NameLabel) - NameLabel.DesiredSize.Width - (Connection.Width * 0.5f));
break;
}
}
public Color PortColor()
{
switch (Mode)
{
case PortMode.Input:
return Colors.DeepSkyBlue;
case PortMode.Output:
return Colors.Orchid;
default:
return Colors.White;
}
}
public Point GlobalPos()
{
return ParentNode.PortPosition(this);
}
public void BreakConnection()
{
foreach (var conn in connections)
{
if (conn.from == this) conn.from = default;
if (conn.to == this) conn.from = default;
}
}
public void RemoveConnection(NodeConnection connection)
{
connections.Remove(connection);
}
public void AddConnection(NodeConnection connection)
{
connections.Add(connection);
}
public void UpdatePosition()
{
foreach (var conn in connections) conn.UpdatePosition();
}
}
public partial class Int32Port: Port
{
public Int32Port(string name, PortMode mode) : base(name, PortValue.INT, mode)
{
}
}
}