public override void RenderNodeReferences(Component_FlowGraph_DocumentWindow window, Component_FlowGraphNode node, Dictionary <Component, List <Component_FlowGraphNode> > objectToNodes, Dictionary <Component_FlowGraphNode.Representation.Item, EditorRenderSelectionState> referenceSelectionStates, out Component_FlowGraphNode.Representation.Item outMouseOverReference) { outMouseOverReference = null; var representation = node.GetRepresentation(); var renderer = window.ViewportControl.Viewport.CanvasRenderer; for (int nItem = 0; nItem < representation.Items.Count; nItem++) { var item = representation.Items[nItem]; //references from input if (item.Input != null) { var itemProperty = item as Component_FlowGraphNode.Representation.ItemProperty; if (itemProperty != null && ReferenceUtility.IsReferenceType(itemProperty.Property.Type.GetNetType()) && !MetadataManager.GetTypeOfNetType(typeof(FlowInput)).IsAssignableFrom(itemProperty.Property.TypeUnreferenced)) { Component obj = itemProperty.Owner.Owner.ControlledObject; if (obj != null) { var v = itemProperty.Property.GetValue(obj, null); IReference iReference = v as IReference; if (iReference != null && !string.IsNullOrEmpty(iReference.GetByReference)) { iReference.GetMember(obj, out object destObject, out Metadata.Member destMember); var destProperty = destMember as Metadata.Property; if (destProperty != null) { //reference to property //!!!!только компоненты? статичные свойства тоже нельзя? var destComponent = destObject as Component; if (destComponent != null && objectToNodes.TryGetValue(destComponent, out List <Component_FlowGraphNode> destNodes)) { foreach (var destNode in destNodes) { var destRep = destNode.GetRepresentation(); Component_FlowGraphNode.Representation.ItemProperty destSocket; if (destRep.ItemByProperty.TryGetValue(destProperty, out destSocket)) { if (destSocket.Output != null) { var from = GetSocketPositionInUnits(item, true); var to = GetSocketPositionInUnits(destSocket, false); if (!referenceSelectionStates.TryGetValue(item, out EditorRenderSelectionState state)) { state = EditorRenderSelectionState.None; } ColorValue color; if (state != EditorRenderSelectionState.None) { color = GetColorMultiplierSelectionState(state); } else { color = new ColorValue(0.5, 0.5, 0.5); } //ColorValue color = GetColorMultiplierSelectionState( state ); window.GetFlowGraphStyle().RenderReference(window, from, true, to, color, out bool mouseOver); if (mouseOver && outMouseOverReference == null) { outMouseOverReference = item; } } } } } } else { //reference to Component var unrefValue = ReferenceUtility.GetUnreferencedValue(iReference.GetValue(obj)); var destComponent = unrefValue as Component; if (destComponent != null && objectToNodes.TryGetValue(destComponent, out List <Component_FlowGraphNode> destNodes)) { foreach (var destNode in destNodes) { var destRep = destNode.GetRepresentation(); var destSocket = destRep.ItemObject; if (destSocket != null) { var from = GetSocketPositionInUnits(item, true); var to = GetSocketPositionInUnits(destSocket, false); if (!referenceSelectionStates.TryGetValue(item, out EditorRenderSelectionState state)) { state = EditorRenderSelectionState.None; } ColorValue color; if (state != EditorRenderSelectionState.None) { color = GetColorMultiplierSelectionState(state); } else { color = new ColorValue(0.5, 0.5, 0.5); } //ColorValue color = GetColorMultiplierSelectionState( state ); window.GetFlowGraphStyle().RenderReference(window, from, true, to, color, out bool mouseOver); if (mouseOver && outMouseOverReference == null) { outMouseOverReference = item; } } } } //!!!!invalid reference } } } } } //references from output (FlowInput) if (item.Output != null) { var itemProperty = item as Component_FlowGraphNode.Representation.ItemProperty; if (itemProperty != null && ReferenceUtility.IsReferenceType(itemProperty.Property.Type.GetNetType()) && MetadataManager.GetTypeOfNetType(typeof(FlowInput)).IsAssignableFrom(itemProperty.Property.TypeUnreferenced)) { Component obj = itemProperty.Owner.Owner.ControlledObject; if (obj != null) { var v = itemProperty.Property.GetValue(obj, null); IReference iReference = v as IReference; if (iReference != null && !string.IsNullOrEmpty(iReference.GetByReference)) { iReference.GetMember(obj, out object destObject, out Metadata.Member destMember); var destProperty = destMember as Metadata.Property; if (destProperty != null) { //!!!!только компоненты? статичные свойства тоже нельзя? var destComponent = destObject as Component; if (destComponent != null && objectToNodes.TryGetValue(destComponent, out List <Component_FlowGraphNode> destNodes)) { foreach (var destNode in destNodes) { var destRep = destNode.GetRepresentation(); Component_FlowGraphNode.Representation.ItemProperty destSocket; if (destRep.ItemByProperty.TryGetValue(destProperty, out destSocket)) { if (destSocket.Input != null) { var from = GetSocketPositionInUnits(item, false); var to = GetSocketPositionInUnits(destSocket, true); if (!referenceSelectionStates.TryGetValue(item, out EditorRenderSelectionState state)) { state = EditorRenderSelectionState.None; } ColorValue color; if (state != EditorRenderSelectionState.None) { color = GetColorMultiplierSelectionState(state); } else { color = new ColorValue(0.3, 0.3, 1); } //ColorValue color = GetColorMultiplierSelectionState( state ); window.GetFlowGraphStyle().RenderReference(window, from, false, to, color, out bool mouseOver); if (mouseOver && outMouseOverReference == null) { outMouseOverReference = item; } } } } } } else { //!!!!invalid reference } } } } } } }
public override void RenderNode(Component_FlowGraph_DocumentWindow window, Component_FlowGraphNode node, EditorRenderSelectionState selectionStateNode, EditorRenderSelectionState selectionStateControlledObject, object mouseOverObject, Component_FlowGraphNode.Representation.Connector referenceCreationSocketFrom, DragDropSetReferenceData dragDropSetReferenceData) { var representation = node.GetRepresentation(); var viewport = window.ViewportControl.Viewport; var mouse = viewport.MousePosition; var renderer = viewport.CanvasRenderer; FlowGraphRepresentationData representationData = new FlowGraphRepresentationData(); { var iRepresentationData = node.ControlledObject.Value as IFlowGraphRepresentationData; if (iRepresentationData != null) { iRepresentationData.GetFlowGraphRepresentationData(representationData); } } Vector2I nodeSize = representation.Size; RectangleI nodeRectWithOneBorder = new RectangleI(node.Position - new Vector2I(1, 1), node.Position + nodeSize + new Vector2I(1, 1)); //!!!!slowly var visibleCells = window.GetVisibleCells(); if (!visibleCells.Intersects(nodeRectWithOneBorder)) { return; } window.GetFontSizes(renderer, out var nodeFontSize, out var nodeFontSizeComment); Rectangle nodeRectInUnits = new RectangleI(node.Position, node.Position + nodeSize).ToRectangle(); Rectangle nodeRect = window.ConvertUnitToScreen(nodeRectInUnits); double cellHeight = window.ConvertUnitToScreenY(node.Position.Y + 1) - window.ConvertUnitToScreenY(node.Position.Y); //ColorValue totalNodeColorMultiplier = new ColorValue( 1, 1, 1 ); //{ // //if( settings.Error != null ) // // nodeColorMultiplier *= new ColorValue( 1, 0, 0 ); // //BlueprintGraphNodeObjectsEvent event_ = node as BlueprintGraphNodeObjectsEvent; // //if( event_ != null && !event_.Enabled ) // // nodeColorMultiplier = new ColorValue( .5f, .5f, .5f ); //} ColorValue nodeColorMultiplierWithSelection = /*totalNodeColorMultiplier*/ GetColorMultiplierSelectionState(selectionStateNode); ColorValue objColorMultiplierWithSelection = /*totalNodeColorMultiplier*/ GetColorMultiplierSelectionState(selectionStateControlledObject); //node selection if (selectionStateNode != EditorRenderSelectionState.None) { //node selection rectangle Rectangle nodeSelectionRectInUnits = nodeRectInUnits; nodeSelectionRectInUnits.Expand(.4); Rectangle nodeSelectionRect = window.ConvertUnitToScreen(nodeSelectionRectInUnits); renderer.AddQuad(nodeSelectionRect, new ColorValue(.3, .3, .3) * nodeColorMultiplierWithSelection); renderer.AddRectangle(nodeSelectionRect, new ColorValue(.6, .6, .6) * nodeColorMultiplierWithSelection); } //window { double titleHeight = cellHeight; //float titleHeight = ConvertUnitToScreenY( node.NodePosition.Y + 1 ) - ConvertUnitToScreenY( node.NodePosition.Y ); Rectangle titleRect = new Rectangle(nodeRect.Left, nodeRect.Top, nodeRect.Right, nodeRect.Top + titleHeight); Rectangle bodyRect = new Rectangle(nodeRect.Left, nodeRect.Top + titleHeight, nodeRect.Right, nodeRect.Bottom); //!!!! ColorValue contentTypeColor; ColorValue?titleColor = null; switch (representationData.NodeContentType) { case FlowGraphNodeContentType.Flow: contentTypeColor = new ColorValue(0.16 / 1.2, 0.34 / 1.2, 0.6 / 1.2); break; case FlowGraphNodeContentType.MethodBody: contentTypeColor = new ColorValue(0.45, 0.1, 0.1); break; case FlowGraphNodeContentType.FlowStart: contentTypeColor = new ColorValue(0.45, 0.1, 0.1); break; //case FlowchartNodeContentType.Flow: contentTypeColor = new ColorValue( 0.15, 0.15, 0.4 ); break; //case FlowchartNodeContentType.MethodBody: contentTypeColor = new ColorValue( 0.4, 0.1, 0.1 ); break; //!!!! default: //contentTypeColor = new ColorValue( 0.3, 0.3, 0.3 ); //titleColor = new ColorValue( 0.36, 0.36, 0.36 ); contentTypeColor = new ColorValue(0.26, 0.26, 0.26); //contentTypeColor = new ColorValue( 0.24, 0.24, 0.24 ); titleColor = new ColorValue(0.3, 0.3, 0.3); break; //default: contentTypeColor = new ColorValue( 0.3, 0.3, 0.3 ); break; } if (titleColor == null) { titleColor = contentTypeColor; } //!!!! //object is disabled { var c = node.ControlledObject.Value; if (c != null && !c.EnabledInHierarchy) { contentTypeColor *= new ColorValue(0.5, 0.5, 0.5, 1); } } if (selectionStateControlledObject != EditorRenderSelectionState.None) { titleColor = new ColorValue(0.3, 0.3, 0.3) * objColorMultiplierWithSelection; } //ColorValue titleColor; //if( selectionStateControlledObject == EditorRenderSelectionState.None ) // titleColor = contentTypeColor; //else // titleColor = new ColorValue( 0.3, 0.3, 0.3 ) * objColorMultiplierWithSelection; renderer.AddQuad(titleRect, titleColor.Value); //renderer.AddQuad( titleRect, new ColorValue( .3, .3, .3 ) * objColorMultiplierWithSelection ); renderer.AddQuad(bodyRect, contentTypeColor /* totalNodeColorMultiplier*/); //renderer.AddQuad( bodyRect, new ColorValue( .3, .3, .3 ) * totalNodeColorMultiplier ); //renderer.AddQuad( bodyRect, new ColorValue( 1, 1, 1 ) /*new ColorValue( .3, .3, .3 )*/ * nodeColorMultiplier ); //renderer.AddQuad( bodyRect, settings.BodyColor /*new ColorValue( .3, .3, .3 )*/ * nodeColorMultiplier ); //renderer.AddQuad( rect, new ColorValue( .3, .3, .3 ) * nodeColorMultiplierWithSelection ); renderer.AddRectangle(nodeRect, new ColorValue(.6, .6, .6) * objColorMultiplierWithSelection); renderer.AddLine( window.ConvertUnitToScreen(node.Position.ToVector2() + new Vector2(0, 1)), window.ConvertUnitToScreen(node.Position.ToVector2() + new Vector2(nodeSize.X, 1)), new ColorValue(.6, .6, .6) * objColorMultiplierWithSelection); //if( titleRect.IsContainsPoint( mouse ) ) // mouseOverObjects.AddWithCheckAlreadyContained( node ); } //!!!!было ////BlueprintGraphNodeComment: draw comment //if( node is BlueprintGraphNodeComment && !string.IsNullOrEmpty( node.NodeComment ) ) //{ // renderer.AddText( fontComment, node.NodeComment, rectNode.LeftTop, HorizontalAlign.Left, VerticalAlign.Bottom, // settings.CommentColor ); //} if (window.GetZoom() > .25f) { //Comment if (!string.IsNullOrEmpty(node.Comment)) //!!!!было && !( node is BlueprintGraphNodeComment ) ) { //!!!!style var color = new ColorValue(1, 1, 1); //settings.CommentColor renderer.AddText(window.NodeFontComment, nodeFontSizeComment, node.Comment, nodeRect.LeftTop, EHorizontalAlignment.Left, EVerticalAlignment.Bottom, color); } //title, texts { renderer.PushClipRectangle(nodeRect); //title { ColorValue titleColorMultiplier = new ColorValue(1, 1, 1); //!!!!было //if( node.IsFlowEntry() && !IsObjectSelected( node ) ) // titleColorMultiplier = new ColorValue( 1, 0, 0 ); Vector2 pos = window.ConvertUnitToScreen(node.Position.ToVector2() + new Vector2(.1f, 0)); renderer.AddText(window.NodeFont, nodeFontSize, representation.Title, pos, EHorizontalAlignment.Left, EVerticalAlignment.Top, titleColorMultiplier * objColorMultiplierWithSelection); } //!!!! ////texts //if( settings.Texts != null ) //{ // for( int n = 0; n < settings.Texts.Length; n++ ) // { // string text = settings.Texts[ n ]; // Vec2 pos2 = ConvertUnitToScreen( node.NodePosition.ToVec2() + new Vec2( .3, (float)n + 1 ) ); // renderer.AddText( fontValue, text, pos2 + new Vec2( 0, cellHeight * .05f ), EHorizontalAlign.Left, // EVerticalAlign.Top, new ColorValue( .7f, .7f, .7f ) * nodeColorMultiplierWithSelection ); // } //} renderer.PopClipRectangle(); } //client area { //!!!! var texture = representationData.NodeImage; if (texture != null) { Rectangle rect; if (representationData.NodeImageView == FlowGraphRepresentationData.NodeImageViewEnum.WideScaled) { double size = 6; rect = new Rectangle( node.Position.ToVector2() + new Vector2(0, representation.Size.Y - size), node.Position.ToVector2() + new Vector2(representation.Size.X, representation.Size.Y)); double border = 0.2; rect.Expand(-border); Rectangle rectInScreen = window.ConvertUnitToScreen(rect); var texCoords = new Rectangle(0, 0, 1, 1); var textureSize = texture.Result.ResultSize; var s = textureSize.ToVector2() / viewport.SizeInPixels.ToVector2(); var rect2 = new Rectangle(rectInScreen.Left, rectInScreen.Top, rectInScreen.Left + s.X, rectInScreen.Top + s.Y); renderer.PushClipRectangle(rectInScreen); renderer.PushTextureFilteringMode(CanvasRenderer.TextureFilteringMode.Point); renderer.AddQuad(rect2, new Rectangle(0, 0, 1, 1), texture); renderer.PopTextureFilteringMode(); renderer.PopClipRectangle(); } else { double size = 5; rect = new Rectangle( node.Position.ToVector2() + new Vector2(0, representation.Size.Y - size), node.Position.ToVector2() + new Vector2(size, representation.Size.Y)); double border = 0.2; rect.Expand(-border); Rectangle rectInScreen = window.ConvertUnitToScreen(rect); renderer.AddQuad(rectInScreen, new Rectangle(0, 0, 1, 1), texture); } //double size = 5; //double border = 0.2; //Rectangle rect = new Rectangle( // node.Position.ToVector2() + new Vector2( 0, representation.Size.Y - size ), // node.Position.ToVector2() + new Vector2( size, representation.Size.Y ) ); //rect.Expand( -border ); //Rectangle rectInScreen = window.ConvertUnitToScreen( rect ); //renderer.AddQuad( rectInScreen, new Rectangle( 0, 0, 1, 1 ), texture ); } } var mouseOverSocket = mouseOverObject as Component_FlowGraphNode.Representation.Connector; //items for (int nItem = 0; nItem < representation.Items.Count; nItem++) { var item = representation.Items[nItem]; ColorValue circleColorNotSpecified = new ColorValue(0.6, 0.6, 0.6); ColorValue circleColorSpecified = new ColorValue(1, 1, 1); ColorValue circleColorMouseOver = new ColorValue(1, 1, 0); ColorValue circleColorCanConnect = new ColorValue(1, 1, 0); bool isFlow = false; { var item2 = item as Component_FlowGraphNode.Representation.ItemProperty; //!!!!может кешировать, часто бывает if (item2 != null && MetadataManager.GetTypeOfNetType(typeof(FlowInput)).IsAssignableFrom(item2.Property.TypeUnreferenced)) { isFlow = true; } } //draw input circle if (item.Input != null) { Vector2 center = GetSocketPositionInUnits(item, true); Rectangle rect = window.ConvertUnitToScreen(new Rectangle(center - new Vector2(.25, .25), center + new Vector2(.25, .25))); ColorValue circleColor = circleColorNotSpecified; //check reference specified var itemProperty = item as Component_FlowGraphNode.Representation.ItemProperty; if (itemProperty != null && ReferenceUtility.IsReferenceType(itemProperty.Property.Type.GetNetType())) { Component obj = itemProperty.Owner.Owner.ControlledObject; if (obj != null) { var v = itemProperty.Property.GetValue(obj, null); var iReference = v as IReference; if (iReference != null && !string.IsNullOrEmpty(iReference.GetByReference)) { //!!!!инвалидная может быть circleColor = circleColorSpecified; } } } if (mouseOverSocket != null && mouseOverSocket.item == item && mouseOverSocket.input && referenceCreationSocketFrom == null && dragDropSetReferenceData == null) { circleColor = circleColorMouseOver; } if (referenceCreationSocketFrom != null && window.CanCreateReference(item.Input, referenceCreationSocketFrom)) { circleColor = circleColorCanConnect; } if (isFlow && dragDropSetReferenceData != null && window.CanCreateReferenceDragDropSetReference(dragDropSetReferenceData, item.Input, out string[] dummy))