/// <summary> /// CONVERSION: Creates a NodeGraphLink, given an XML Serialized copy of the link and a view /// </summary> /// <param name="p_TreeNode"></param> /// <param name="p_View"></param> public NodeGraphLink(ConnectionDescriptor connection, NodeGraphView p_View) { int v_InputNodeId = connection.sourceModule; int v_OutputNodeId = connection.destinationModule; int v_InputNodeConnectorIdx = connection.sourcePort; int v_OutputNodeConnectorIdx = connection.destinationPort; if (v_InputNodeId != 0x0FFFFFFF) { //this.m_InputConnector = p_View.NodeCollection[v_InputNodeId].Connectors[v_InputNodeConnectorIdx]; this.m_InputConnector = p_View.NodeCollection[v_InputNodeId].GetConnector(v_InputNodeConnectorIdx, ConnectorType.OutputConnector); } else { this.m_InputConnector = p_View.NodeConnectorCollection[v_InputNodeConnectorIdx]; } if (v_OutputNodeId != 0x0FFFFFFF) { //this.m_OutputConnector = p_View.NodeCollection[v_OutputNodeId].Connectors[v_OutputNodeConnectorIdx]; this.m_OutputConnector = p_View.NodeCollection[v_OutputNodeId].GetConnector(v_OutputNodeConnectorIdx, ConnectorType.InputConnector); } else { this.m_OutputConnector = p_View.NodeConnectorCollection[v_OutputNodeConnectorIdx]; } }
/// <summary> /// CONVERSION: Creates a NodeGraphLink, given an XML Serialized copy of the link and a view /// </summary> /// <param name="p_TreeNode"></param> /// <param name="p_View"></param> public NodeGraphLink(ConnectionDescriptor connection, NodeGraphView p_View) { int v_InputNodeId = connection.sourceModule; int v_OutputNodeId = connection.destinationModule; int v_InputNodeConnectorIdx = connection.sourceModule; int v_OutputNodeConnectorIdx = connection.sourcePort; this.m_InputConnector = p_View.NodeCollection[v_InputNodeId].Connectors[v_InputNodeConnectorIdx]; this.m_OutputConnector = p_View.NodeCollection[v_OutputNodeId].Connectors[v_OutputNodeConnectorIdx]; }
/// <summary> /// SERIALIZATION: Creates a NodeGraphLink, given an XML Serialized copy of the link and a view /// </summary> /// <param name="p_TreeNode"></param> /// <param name="p_View"></param> public NodeGraphLink(XmlTreeNode p_TreeNode, NodeGraphView p_View) { int v_InputNodeId = int.Parse(p_TreeNode.m_attributes["InputNodeId"]); int v_OutputNodeId = int.Parse(p_TreeNode.m_attributes["OutputNodeId"]); int v_InputNodeConnectorIdx = int.Parse(p_TreeNode.m_attributes["InputNodeConnectorIdx"]); int v_OutputNodeConnectorIdx = int.Parse(p_TreeNode.m_attributes["OutputNodeConnectorIdx"]); this.m_InputConnector = p_View.NodeCollection[v_InputNodeId].Connectors[v_InputNodeConnectorIdx]; this.m_OutputConnector = p_View.NodeCollection[v_OutputNodeId].Connectors[v_OutputNodeConnectorIdx]; }
/// <summary> /// SERIALIZATION: Creates a NodeGraphLink, given an XML Serialized copy of the link and a view /// </summary> /// <param name="p_TreeNode"></param> /// <param name="p_View"></param> public NodeGraphLink(XmlTreeNode p_TreeNode, NodeGraphView p_View) { int v_InputNodeId = int.Parse(p_TreeNode.m_attributes["InputNodeId"]); int v_OutputNodeId = int.Parse(p_TreeNode.m_attributes["OutputNodeId"]); int v_InputNodeConnectorIdx = int.Parse(p_TreeNode.m_attributes["InputNodeConnectorIdx"]); int v_OutputNodeConnectorIdx = int.Parse(p_TreeNode.m_attributes["OutputNodeConnectorIdx"]); this.m_InputConnector = p_View.NodeCollection[v_InputNodeId].Connectors[v_InputNodeConnectorIdx]; this.m_OutputConnector = p_View.NodeCollection[v_OutputNodeId].Connectors[v_OutputNodeConnectorIdx]; this.m_NodeGraphDataType = p_View.NodeCollection[v_InputNodeId].Connectors[v_InputNodeConnectorIdx].DataType; }
/// <summary> /// Gets the connector index, given the connector object reference /// </summary> /// <param name="p_Connector">the connector reference</param> /// <returns>the connector index</returns> public int GetConnectorIndex(NodeGraphConnector p_Connector) { for (int i = 0; i < this.m_Connectors.Count; i++) { if (this.m_Connectors[i] == p_Connector) { return(i); } } return(-1); }
/// <summary> /// Returns whether the node can be processed or not /// </summary> /// <returns></returns> public bool CanProcess() { if (this.m_oConnectorType == ConnectorType.OutputConnector) { return(true); } else { NodeGraphConnector v_Connector = m_oView.ParentPanel.GetLink(this); if (v_Connector == null) { return(false); } else { return(true); } } }
/// <summary> /// Virtual: Sample Process for a node, must be overriden in child class, processes only unlinked inputs. /// </summary> /// <returns>NodeGraphData depending of the validity</returns> public virtual NodeGraphData Process() { if (this.m_oConnectorType == ConnectorType.OutputConnector) { return(m_oParentNode.Process()); } else { NodeGraphConnector v_Connector = m_oView.ParentPanel.GetLink(this); if (v_Connector == null) { return(new NodeGraphInvalidData(this.m_oParentNode, "Connector:" + this.Name + " NOT LINKED")); } else { return(v_Connector.Process()); } } }
/// <summary> /// CONVERSION: Creates a NodeGraphLink, given an XML Serialized copy of the link and a view /// </summary> /// <param name="p_TreeNode"></param> /// <param name="p_View"></param> public NodeGraphLink(ConnectionDescriptor connection, NodeGraphView p_View) { int v_InputNodeId = connection.sourceModule; int v_OutputNodeId = connection.destinationModule; int v_InputNodeConnectorIdx = connection.sourcePort; int v_OutputNodeConnectorIdx = connection.destinationPort; if (v_InputNodeId != 0x0FFFFFFF) { //this.m_InputConnector = p_View.NodeCollection[v_InputNodeId].Connectors[v_InputNodeConnectorIdx]; this.m_InputConnector = p_View.NodeCollection[v_InputNodeId].GetConnector(v_InputNodeConnectorIdx, ConnectorType.OutputConnector); } else this.m_InputConnector = p_View.NodeConnectorCollection[v_InputNodeConnectorIdx]; if (v_OutputNodeId != 0x0FFFFFFF) { //this.m_OutputConnector = p_View.NodeCollection[v_OutputNodeId].Connectors[v_OutputNodeConnectorIdx]; this.m_OutputConnector = p_View.NodeCollection[v_OutputNodeId].GetConnector(v_OutputNodeConnectorIdx, ConnectorType.InputConnector); } else this.m_OutputConnector = p_View.NodeConnectorCollection[v_OutputNodeConnectorIdx]; }
/// <summary> /// Deletes a link, given a connector /// </summary> /// <param name="p_Connector"></param> private void DeleteLinkConnectors(NodeGraphConnector p_Connector) { List<NodeGraphLink> v_LinksToDelete = new List<NodeGraphLink>(); foreach (NodeGraphLink i_Link in this.View.Links) { if (i_Link.Input == p_Connector || i_Link.Output == p_Connector) { v_LinksToDelete.Add(i_Link); } } foreach (NodeGraphLink i_LinkToDelete in v_LinksToDelete) { this.View.Links.Remove(i_LinkToDelete); } Refresh(); }
/// <summary> /// Returns whether a connector is already linked /// </summary> /// <param name="p_Node"></param> /// <returns></returns> public bool IsLinked(NodeGraphConnector p_Node) { foreach (NodeGraphLink i_Link in this.View.Links) { if (i_Link.Input == p_Node || i_Link.Output == p_Node) return true; } return false; }
/// <summary> /// Returns the other end of a connector /// </summary> /// <param name="p_LinkOutConnector"></param> /// <returns></returns> public NodeGraphConnector GetLink(NodeGraphConnector p_LinkOutConnector) { foreach (NodeGraphLink i_Link in this.View.Links) { if (i_Link.Output == p_LinkOutConnector) return i_Link.Input; } return null; }
/// <summary> /// Creates a UserControl component that displays NodeGraphViews and let interact with NodeGraphNodes & NodeGraphLinks /// </summary> public NodeGraphPanel() { InitializeComponent(); this.m_oView = new NodeGraphView(this); this.m_oDebugFont = new Font("Tahoma", 8.0f); this.m_ScrollMargins = 32; this.m_ScrollMarginsValue = 10; this.m_eEditMode = NodeGraphEditMode.Idle; this.m_ViewSpaceCursorLocation = new Point(); this.m_bAltPressed = false; this.m_bCtrlPressed = false; this.m_NodeText = new SolidBrush(Color.White); this.m_NodeTextShadow = new SolidBrush(Color.Black); this.NodeTitleZoomThreshold = 0.5f; this.NodeConnectorTextZoomTreshold = 0.8f; this.NodeHeaderSize = 24; this.NodeTextColor = Color.FromArgb(255, 255, 255, 255); this.NodeTextShadowColor = Color.FromArgb(128, 0, 0, 0); this.NodeFillColor = Color.FromArgb(255, 128, 128, 128); this.NodeFillSelectedColor = Color.FromArgb(255, 160, 128, 100); this.NodeOutlineColor = Color.FromArgb(255, 180, 180, 180); this.NodeOutlineSelectedColor = Color.FromArgb(255, 192, 160, 128); this.ConnectorTextColor = Color.FromArgb(255, 64, 64, 64); this.ConnectorFillColor = Color.FromArgb(255, 0, 0, 0); this.ConnectorFillSelectedColor = Color.FromArgb(255, 32, 32, 32); this.ConnectorOutlineColor = Color.FromArgb(255, 32, 32, 32); this.ConnectorOutlineSelectedColor = Color.FromArgb(255, 64, 64, 64); this.SelectionFillColor = Color.FromArgb(64, 128, 90, 30); this.SelectionOutlineColor = Color.FromArgb(192, 255, 180, 60); this.NodeHeaderColor = Color.FromArgb(128, 0, 0, 0); this.LinkColor = Color.FromArgb(255, 180, 180, 180); this.LinkEditableColor = Color.FromArgb(255, 64, 255, 0); this.NodeSignalValidColor = Color.FromArgb(255, 0, 255, 0); this.NodeSignalInvalidColor = Color.FromArgb(255, 255, 0, 0); this.m_NodeTitleFont = new Font("Tahoma", 8.0f); this.m_NodeConnectorFont = new Font("Tahoma", 7.0f); this.m_NodeScaledTitleFont = new Font(m_NodeTitleFont.Name, m_NodeTitleFont.Size); this.m_NodeScaledConnectorFont = new Font(m_NodeConnectorFont.Name, m_NodeConnectorFont.Size); this.m_LinkVisualStyle = LinkVisualStyle.Curve; this.ConnectorHitZoneBleed = 2; this.m_SelectBoxOrigin = new Point(); this.m_SelectBoxCurrent = new Point(); this.LinkHardness = 2.0f; this.m_iScrollLastX = 0; this.m_iScrollLastY = 0; this.EnableDrawDebug = true; this.Dock = DockStyle.Fill; this.DoubleBuffered = true; this.m_InputLink = null; this.m_OutputLink = null; this.m_bShowGrid = false; this.m_iGridPadding = 256; this.m_iGridAlpha = 32; this.m_bDrawShadow = true; this.m_bSmoothBehavior = false; }
/// <summary> /// Validates a link being edited /// </summary> private void ValidateLink() { if (this.m_InputLink != null && this.m_OutputLink != null && this.m_InputLink != this.m_OutputLink && this.m_InputLink.Type != this.m_OutputLink.Type) { if (m_InputLink.Type == ConnectorType.OutputConnector) { if (IsLinked(m_OutputLink)) DeleteLinkConnectors(m_OutputLink); this.View.Links.Add(new NodeGraphLink(m_InputLink, m_OutputLink)); } else { if (IsLinked(m_InputLink)) DeleteLinkConnectors(m_InputLink); this.View.Links.Add(new NodeGraphLink( m_OutputLink, m_InputLink)); } } m_InputLink = null; m_OutputLink = null; }
/// <summary> /// Behavior when Mouse Click is released /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void NodeGraphPanel_MouseUp(object sender, MouseEventArgs e) { switch (this.m_eEditMode) { case NodeGraphEditMode.Scrolling: if (e.Button == MouseButtons.Middle) this.m_eEditMode = NodeGraphEditMode.Idle; break; case NodeGraphEditMode.Selecting: case NodeGraphEditMode.SelectingBox: if (e.Button == MouseButtons.Left) { this.CreateSelection(); this.m_eEditMode = NodeGraphEditMode.Idle; } break; case NodeGraphEditMode.MovingSelection: if (e.Button == MouseButtons.Left) { this.m_eEditMode = NodeGraphEditMode.Idle; } break; case NodeGraphEditMode.Linking: this.m_OutputLink = GetHitConnector(e.Location); ValidateLink(); this.m_eEditMode = NodeGraphEditMode.Idle; break; default: break; } }
/// <summary> /// Behavior when Mouse is Clicked /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void NodeGraphPanel_MouseDown(object sender, MouseEventArgs e) { switch(this.m_eEditMode) { case NodeGraphEditMode.Idle: switch (e.Button) { case MouseButtons.Middle: this.m_eEditMode = NodeGraphEditMode.Scrolling; this.m_iScrollLastX = e.Location.X; this.m_iScrollLastY = e.Location.Y; break; case MouseButtons.Left: if (this.HitAll(e.Location) == HitType.Connector) { if (!m_bAltPressed) { this.m_eEditMode = NodeGraphEditMode.Linking; this.m_InputLink = GetHitConnector(e.Location); this.m_OutputLink = null; } else { NodeGraphConnector v_Connector = GetHitConnector(e.Location); this.DeleteLinkConnectors(v_Connector); } } else if (this.View.SelectedItems.Count > 0 && this.HitSelected(e.Location)== HitType.Node) { this.m_eEditMode = NodeGraphEditMode.MovingSelection; this.m_MoveLastPosition = this.ControlToView(e.Location); } else { this.m_eEditMode = NodeGraphEditMode.Selecting; this.m_SelectBoxCurrent = this.ControlToView(new Point(e.X, e.Y)); this.m_SelectBoxOrigin = this.ControlToView(new Point(e.X, e.Y)); this.UpdateHighlights(); this.CreateSelection(); if (this.View.SelectedItems.Count > 0) { this.m_eEditMode = NodeGraphEditMode.MovingSelection; this.m_MoveLastPosition = this.ControlToView(e.Location); } } break; default: break; } break; default: break; } this.Refresh(); }
/// <summary> /// Gets the connector index, given the connector object reference /// </summary> /// <param name="p_Connector">the connector reference</param> /// <returns>the connector index</returns> public int GetConnectorIndex(NodeGraphConnector p_Connector) { for (int i = 0; i < this.m_Connectors.Count; i++) { if (this.m_Connectors[i] == p_Connector) return i; } return -1; }
/// <summary> /// Creates a new NodeGraphLink, given input and output Connectors /// </summary> /// <param name="p_Input"></param> /// <param name="p_Output"></param> public NodeGraphLink(NodeGraphConnector p_Input, NodeGraphConnector p_Output) { this.m_InputConnector = p_Input; this.m_OutputConnector = p_Output; }
/// <summary> /// Creates a new NodeGraphLink, given input and output Connectors /// </summary> /// <param name="p_Input"></param> /// <param name="p_Output"></param> public NodeGraphLink(NodeGraphConnector p_Input, NodeGraphConnector p_Output) { this.m_InputConnector = p_Input; this.m_OutputConnector = p_Output; }
/// <summary> /// Creates a new NodeGraphLink, given input and output Connectors /// </summary> /// <param name="p_Input"></param> /// <param name="p_Output"></param> public NodeGraphLink(NodeGraphConnector p_Input, NodeGraphConnector p_Output, NodeGraphDataType p_DataType) { this.m_InputConnector = p_Input; this.m_OutputConnector = p_Output; this.m_NodeGraphDataType = p_DataType; }
/// <summary> /// Creates a new NodeGraphLink, given input and output Connectors /// </summary> /// <param name="p_Input"></param> /// <param name="p_Output"></param> public NodeGraphLink(NodeGraphConnector p_Input, NodeGraphConnector p_Output, NodeGraphDataType p_DataType) { this.m_InputConnector = p_Input; this.m_OutputConnector = p_Output; this.m_NodeGraphDataType = p_DataType; }