/// <summary> /// Resolves given node, resolving it all dependencies recursively. /// </summary> /// <param name="node"></param> private void Resolve(NodeVisual node) { var icontext = (node.GetNodeContext() as DynamicNodeContext); foreach (var input in node.GetInputs()) { var connection = GetConnection(node.GUID + input.Name); //graph.Connections.FirstOrDefault(x => x.InputNode == node && x.InputSocketName == input.Name); if (connection != null) { Resolve(connection.OutputNode); if (!connection.OutputNode.Callable) { connection.OutputNode.Execute(Context); } var ocontext = (connection.OutputNode.GetNodeContext() as DynamicNodeContext); icontext[connection.InputSocketName] = ocontext[connection.OutputSocketName]; } } }
private void ExecuteResolvingInternal(NodeVisual node) { var icontext = (node.GetNodeContext() as DynamicNodeContext); foreach (var input in node.GetInputs()) { var connection = graph.Connections.FirstOrDefault(x => x.InputNode == node && x.InputSocketName == input.Name); if (connection != null) { Resolve(connection.OutputNode); connection.OutputNode.Execute(Context); ExecuteResolvingInternal(connection.OutputNode); var ocontext = (connection.OutputNode.GetNodeContext() as DynamicNodeContext); icontext[connection.InputSocketName] = ocontext[connection.OutputSocketName]; } } }
private void NodesControl_MouseClick(object sender, MouseEventArgs e) { lastMouseLocation = e.Location; if (Context == null) { return; } if (e.Button == MouseButtons.Right) { var methods = Context.GetType().GetMethods(); var nodes = methods.Select( x => new NodeToken() { Method = x, Attribute = x.GetCustomAttributes(typeof(NodeAttribute), false) .Cast <NodeAttribute>() .FirstOrDefault() }).Where(x => x.Attribute != null); var context = new ContextMenuStrip(); if (graph.Nodes.Exists(x => x.IsSelected)) { context.Items.Add("Delete Node(s)", null, ((o, args) => { DeleteSelectedNodes(); })); context.Items.Add("Duplicate Node(s)", null, ((o, args) => { DuplicateSelectedNodes(); })); context.Items.Add("Change Color ...", null, ((o, args) => { ChangeSelectedNodesColor(); })); if (graph.Nodes.Count(x => x.IsSelected) == 2) { var sel = graph.Nodes.Where(x => x.IsSelected).ToArray(); context.Items.Add("Check Impact", null, ((o, args) => { if (HasImpact(sel[0], sel[1]) || HasImpact(sel[1], sel[0])) { MessageBox.Show("One node has impact on other.", "Impact detected.", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("These nodes not impacts themselves.", "No impact.", MessageBoxButtons.OK, MessageBoxIcon.Information); } })); } context.Items.Add(new ToolStripSeparator()); } if (allContextItems.Values.Any(x => x > 0)) { var handy = allContextItems.Where(x => x.Value > 0 && !string.IsNullOrEmpty(((x.Key.Tag) as NodeToken).Attribute.Menu)).OrderByDescending(x => x.Value).Take(8); foreach (var kv in handy) { context.Items.Add(kv.Key); } context.Items.Add(new ToolStripSeparator()); } foreach (var node in nodes.OrderBy(x => x.Attribute.Path)) { AddToMenu(context.Items, node, node.Attribute.Path, (s, ev) => { var tag = (s as ToolStripMenuItem).Tag as NodeToken; var nv = new NodeVisual(); nv.X = lastMouseLocation.X; nv.Y = lastMouseLocation.Y; nv.Type = node.Method; nv.Callable = node.Attribute.IsCallable; nv.Name = node.Attribute.Name; nv.Order = graph.Nodes.Count; nv.ExecInit = node.Attribute.IsExecutionInitiator; nv.XmlExportName = node.Attribute.XmlExportName; nv.CustomWidth = node.Attribute.Width; nv.CustomHeight = node.Attribute.Height; if (node.Attribute.CustomEditor != null) { Control ctrl = null; nv.CustomEditor = ctrl = Activator.CreateInstance(node.Attribute.CustomEditor) as Control; if (ctrl != null) { ctrl.Tag = nv; Controls.Add(ctrl); } nv.LayoutEditor(); } graph.Nodes.Add(nv); Refresh(); needRepaint = true; }); } context.Show(MousePosition); } }
private void NodesControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { selectionStart = PointF.Empty; Focus(); if ((ModifierKeys & Keys.Shift) != Keys.Shift) { graph.Nodes.ForEach(x => x.IsSelected = false); } var node = graph.Nodes.OrderBy(x => x.Order).FirstOrDefault( x => new RectangleF(new PointF(x.X, x.Y), x.GetHeaderSize()).Contains(e.Location)); if (node != null && !mdown) { node.IsSelected = true; node.Order = graph.Nodes.Min(x => x.Order) - 1; if (node.CustomEditor != null) { node.CustomEditor.BringToFront(); } mdown = true; lastmpos = PointToScreen(e.Location); Refresh(); } if (node == null && !mdown) { var nodeWhole = graph.Nodes.OrderBy(x => x.Order).FirstOrDefault( x => new RectangleF(new PointF(x.X, x.Y), x.GetNodeBounds()).Contains(e.Location)); if (nodeWhole != null) { node = nodeWhole; var socket = nodeWhole.GetSockets().FirstOrDefault(x => x.GetBounds().Contains(e.Location)); if (socket != null) { if ((ModifierKeys & Keys.Control) == Keys.Control) { var connection = graph.Connections.FirstOrDefault( x => x.InputNode == nodeWhole && x.InputSocketName == socket.Name); if (connection != null) { dragSocket = connection.OutputNode.GetSockets() .FirstOrDefault(x => x.Name == connection.OutputSocketName); dragSocketNode = connection.OutputNode; } else { connection = graph.Connections.FirstOrDefault( x => x.OutputNode == nodeWhole && x.OutputSocketName == socket.Name); if (connection != null) { dragSocket = connection.InputNode.GetSockets() .FirstOrDefault(x => x.Name == connection.InputSocketName); dragSocketNode = connection.InputNode; } } graph.Connections.Remove(connection); rebuildConnectionDictionary = true; } else { dragSocket = socket; dragSocketNode = nodeWhole; } dragConnectionBegin = e.Location; dragConnectionEnd = e.Location; mdown = true; lastmpos = PointToScreen(e.Location); } } else { selectionStart = selectionEnd = e.Location; } } if (node != null) { OnNodeContextSelected(node.GetNodeContext()); } } needRepaint = true; }