TSharedPtr<SWidget> SGraphPanel::OnSummonContextMenu(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) { //Editability is up to the user to consider for menu options { // If we didn't drag very far, summon a context menu. // Figure out what's under the mouse: Node, Pin or just the Panel, and summon the context menu for that. UEdGraphNode* NodeUnderCursor = NULL; UEdGraphPin* PinUnderCursor = NULL; { FArrangedChildren ArrangedNodes(EVisibility::Visible); this->ArrangeChildrenForContextMenuSummon(MyGeometry, ArrangedNodes); const int32 HoveredNodeIndex = SWidget::FindChildUnderMouse( ArrangedNodes, MouseEvent ); if (HoveredNodeIndex != INDEX_NONE) { const FArrangedWidget& HoveredNode = ArrangedNodes[HoveredNodeIndex]; TSharedRef<SGraphNode> GraphNode = StaticCastSharedRef<SGraphNode>(HoveredNode.Widget); TSharedPtr<SGraphNode> GraphSubNode = GraphNode->GetNodeUnderMouse(HoveredNode.Geometry, MouseEvent); GraphNode = GraphSubNode.IsValid() ? GraphSubNode.ToSharedRef() : GraphNode; NodeUnderCursor = GraphNode->GetNodeObj(); // Selection should switch to this code if it isn't already selected. // When multiple nodes are selected, we do nothing, provided that the // node for which the context menu is being created is in the selection set. if (!SelectionManager.IsNodeSelected(GraphNode->GetObjectBeingDisplayed())) { SelectionManager.SelectSingleNode(GraphNode->GetObjectBeingDisplayed()); } const TSharedPtr<SGraphPin> HoveredPin = GraphNode->GetHoveredPin( HoveredNode.Geometry, MouseEvent ); if (HoveredPin.IsValid()) { PinUnderCursor = HoveredPin->GetPinObj(); } } } const FVector2D NodeAddPosition = PanelCoordToGraphCoord( MyGeometry.AbsoluteToLocal(MouseEvent.GetScreenSpacePosition()) ); TArray<UEdGraphPin*> NoSourcePins; return SummonContextMenu(MouseEvent.GetScreenSpacePosition(), NodeAddPosition, NodeUnderCursor, PinUnderCursor, NoSourcePins, MouseEvent.IsShiftDown()); } return TSharedPtr<SWidget>(); }
FReply STrack::OnMouseButtonUp( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) { bool bLeftMouseButton = MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton; bool bRightMouseButton = MouseEvent.GetEffectingButton() == EKeys::RightMouseButton; if ( bRightMouseButton ) { TSharedPtr<SWidget> WidgetToFocus; WidgetToFocus = SummonContextMenu(MyGeometry, MouseEvent); return (WidgetToFocus.IsValid()) ? FReply::Handled().ReleaseMouseCapture().SetUserFocus( WidgetToFocus.ToSharedRef(), EFocusCause::SetDirectly ) : FReply::Handled().ReleaseMouseCapture(); } else if ( bLeftMouseButton ) { float SnapPos = 0.f; if ( GetDraggableBarSnapPosition(MyGeometry, SnapPos) ) { // Final update on draggable bar to snap position OnBarDrag.Execute(DraggableBarIndex, SnapPos); } if(bDraggingBar) { OnBarDrop.Execute(DraggableBarIndex); OnBarClicked.ExecuteIfBound(DraggableBarIndex); } /** Bar dragging */ DraggableBarIndex = INDEX_NONE; bDraggingBar = false; } return FReply::Unhandled(); }