-
Notifications
You must be signed in to change notification settings - Fork 170
Expand file tree
/
Copy pathAddEndpointDropPanelViewModel.cs
More file actions
121 lines (104 loc) · 4.39 KB
/
AddEndpointDropPanelViewModel.cs
File metadata and controls
121 lines (104 loc) · 4.39 KB
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
121
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reactive;
using System.Reactive.Linq;
using System.Text;
using DynamicData;
using NodeNetwork.ViewModels;
using ReactiveUI;
namespace NodeNetwork.Toolkit.Group.AddEndpointDropPanel
{
public class AddEndpointDropPanelViewModel : ReactiveObject
{
static AddEndpointDropPanelViewModel()
{
NNViewRegistrar.AddRegistration(() => new AddEndpointDropPanelView(), typeof(IViewFor<AddEndpointDropPanelViewModel>));
}
/// <summary>
/// Take the pending connection from the super- or subnetwork, whichever is non-null,
/// and add endpoints to NodeGroupIOBinding that match this connection.
/// </summary>
public ReactiveCommand<Unit, Unit> AddEndpointFromPendingConnection { get; }
#region IsDropZoneVisible
public bool IsDropZoneVisible => _isDropZoneVisible.Value;
private readonly ObservableAsPropertyHelper<bool> _isDropZoneVisible;
#endregion
#region NodeGroupIOBinding
public NodeGroupIOBinding NodeGroupIOBinding
{
get => _nodeGroupIoBinding;
set => this.RaiseAndSetIfChanged(ref _nodeGroupIoBinding, value);
}
private NodeGroupIOBinding _nodeGroupIoBinding;
#endregion
private readonly bool isOnSubnetEntrance;
private readonly bool isOnSubnetExit;
public AddEndpointDropPanelViewModel(bool isOnSubnetEntrance = false, bool isOnSubnetExit = false)
{
this.isOnSubnetEntrance = isOnSubnetEntrance;
this.isOnSubnetExit = isOnSubnetExit;
bool isOnSubnet = isOnSubnetEntrance || isOnSubnetExit;
AddEndpointFromPendingConnection = ReactiveCommand.Create(() =>
{
var network = isOnSubnet ? NodeGroupIOBinding.SubNetwork : NodeGroupIOBinding.SuperNetwork;
var pendingConn = network.PendingConnection;
network.RemovePendingConnection();
NodeInputViewModel input = null;
NodeOutputViewModel output = null;
if (!CanCreateEndpointFromPendingConnection(pendingConn))
{
return;
}
if (pendingConn.Input != null)
{
input = pendingConn.Input;
if (isOnSubnet)
{
output = NodeGroupIOBinding.AddNewSubnetInlet(pendingConn.Input);
}
else
{
output = NodeGroupIOBinding.AddNewGroupNodeOutput(pendingConn.Input);
}
}
else if (pendingConn.Output != null)
{
if (isOnSubnet)
{
input = NodeGroupIOBinding.AddNewSubnetOutlet(pendingConn.Output);
}
else
{
input = NodeGroupIOBinding.AddNewGroupNodeInput(pendingConn.Output);
}
output = pendingConn.Output;
}
network.Connections.Add(network.ConnectionFactory(input, output));
});
if (isOnSubnet)
{
this.WhenAnyValue(vm => vm.NodeGroupIOBinding.SubNetwork.PendingConnection)
.Select(CanCreateEndpointFromPendingConnection)
.ToProperty(this, vm => vm.IsDropZoneVisible, out _isDropZoneVisible);
}
else
{
this.WhenAnyValue(vm => vm.NodeGroupIOBinding.SuperNetwork.PendingConnection)
.Select(CanCreateEndpointFromPendingConnection)
.ToProperty(this, vm => vm.IsDropZoneVisible, out _isDropZoneVisible);
}
}
private bool CanCreateEndpointFromPendingConnection(PendingConnectionViewModel conn)
{
if (conn == null)
{
return false;
}
var sourceNode = conn.Input != null ? conn.Input.Parent : conn.Output.Parent;
return sourceNode != NodeGroupIOBinding.GroupNode
&& !(isOnSubnetEntrance && sourceNode == NodeGroupIOBinding.EntranceNode)
&& !(isOnSubnetExit && sourceNode == NodeGroupIOBinding.ExitNode);
}
}
}