Files
UnrealEngineUWP/Engine/Source/Editor/GraphEditor/Public/SGraphActionMenu.h

348 lines
16 KiB
C
Raw Normal View History

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340) #lockdown Nick.Penwarden #rb none ========================== MAJOR FEATURES + CHANGES ========================== Change 3209340 on 2016/11/23 by Ben.Marsh Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h. Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms. * Every header now includes everything it needs to compile. * There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first. * There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h. * Every .cpp file includes its matching .h file first. * This helps validate that each header is including everything it needs to compile. * No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more. * You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there. * There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible. * No engine code explicitly includes a precompiled header any more. * We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies. * PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files. Tool used to generate this transform is at Engine\Source\Programs\IncludeTool. [CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
#include "CoreMinimal.h"
#include "SlateFwd.h"
#include "Misc/Attribute.h"
#include "Input/Reply.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "UObject/GCObject.h"
#include "Widgets/SWidget.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Views/SExpanderArrow.h"
#include "Widgets/Views/STableViewBase.h"
#include "Widgets/Views/STableRow.h"
#include "Widgets/Views/STreeView.h"
#include "EdGraph/EdGraphSchema.h"
class IToolTip;
class SEditableTextBox;
struct FCreateWidgetForActionData;
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340) #lockdown Nick.Penwarden #rb none ========================== MAJOR FEATURES + CHANGES ========================== Change 3209340 on 2016/11/23 by Ben.Marsh Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h. Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms. * Every header now includes everything it needs to compile. * There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first. * There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h. * Every .cpp file includes its matching .h file first. * This helps validate that each header is including everything it needs to compile. * No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more. * You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there. * There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible. * No engine code explicitly includes a precompiled header any more. * We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies. * PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files. Tool used to generate this transform is at Engine\Source\Programs\IncludeTool. [CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
struct FGraphActionNode;
/** Delegate for hooking up an inline editable text block to be notified that a rename is requested. */
DECLARE_DELEGATE( FOnRenameRequestActionNode );
/** Delegate executed when the mouse button goes down */
DECLARE_DELEGATE_RetVal_OneParam( bool, FCreateWidgetMouseButtonDown, TWeakPtr<FEdGraphSchemaAction> );
/** Default widget for GraphActionMenu */
class GRAPHEDITOR_API SDefaultGraphActionWidget : public SCompoundWidget
{
SLATE_BEGIN_ARGS( SDefaultGraphActionWidget ) {}
SLATE_ATTRIBUTE(FText, HighlightText)
SLATE_END_ARGS()
void Construct(const FArguments& InArgs, const FCreateWidgetForActionData* InCreateData);
virtual FReply OnMouseButtonDown( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override;
/** The item that we want to display with this widget */
TWeakPtr<FEdGraphSchemaAction> ActionPtr;
/** Delegate executed when mouse button goes down */
FCreateWidgetMouseButtonDown MouseButtonDownDelegate;
};
struct FCreateWidgetForActionData
{
/** True if we want to use the mouse delegate */
bool bHandleMouseButtonDown;
/** Delegate for mouse button going down */
FCreateWidgetMouseButtonDown MouseButtonDownDelegate;
/** The action being used for the widget */
TSharedPtr< FEdGraphSchemaAction > Action;
/** The delegate to determine if the current action is selected in the row */
FIsSelected IsRowSelectedDelegate;
/** This will be returned, hooked up to request a rename */
FOnRenameRequestActionNode* const OnRenameRequest;
/** The text to highlight */
TAttribute<FText> HighlightText;
/** True if the widget should be read only - no renaming allowed */
bool bIsReadOnly;
FCreateWidgetForActionData(FOnRenameRequestActionNode* const InOnRenameRequest)
: OnRenameRequest(InOnRenameRequest)
, bIsReadOnly(false)
{
}
};
struct FCustomExpanderData
{
/** The menu row associated with the widget being customized */
TSharedPtr<ITableRow> TableRow;
/** The action associated with the menu row being customized */
TSharedPtr<FEdGraphSchemaAction> RowAction;
/** The widget container that the custom expander will belong to */
TSharedPtr<SPanel> WidgetContainer;
};
/** Class that displays a list of graph actions and them to be searched and selected */
class GRAPHEDITOR_API SGraphActionMenu : public SCompoundWidget, public FGCObject
{
public:
/** Delegate that can be used to create a widget for a particular action */
DECLARE_DELEGATE_RetVal_OneParam( TSharedRef<SWidget>, FOnCreateWidgetForAction, FCreateWidgetForActionData* const );
/** Delegate that can be used to create a custom "expander" widget for a particular row */
DECLARE_DELEGATE_RetVal_OneParam( TSharedRef<SExpanderArrow>, FOnCreateCustomRowExpander, FCustomExpanderData const& );
/** Delegate executed when an action is selected */
DECLARE_DELEGATE_TwoParams( FOnActionSelected, const TArray< TSharedPtr<FEdGraphSchemaAction> >&, ESelectInfo::Type );
/** Delegate executed when an action is double clicked */
DECLARE_DELEGATE_OneParam( FOnActionDoubleClicked, const TArray< TSharedPtr<FEdGraphSchemaAction> >& );
/** Delegate executed when an action is dragged */
DECLARE_DELEGATE_RetVal_TwoParams( FReply, FOnActionDragged, const TArray< TSharedPtr<FEdGraphSchemaAction> >&, const FPointerEvent& );
/** Delegate executed when a category is dragged */
DECLARE_DELEGATE_RetVal_TwoParams( FReply, FOnCategoryDragged, const FText&, const FPointerEvent& );
/** Delegate executed when the list of all actions needs to be refreshed */
DECLARE_DELEGATE_OneParam( FOnCollectAllActions, FGraphActionListBuilderBase& );
/** Delegate executed when the list of all actions needs to be refreshed, should return any sections that should always be visible, even if they don't have children. */
DECLARE_DELEGATE_OneParam( FOnCollectStaticSections, TArray<int32>& )
/** Delegate executed when a category is being renamed so any post-rename actions can be handled */
DECLARE_DELEGATE_ThreeParams( FOnCategoryTextCommitted, const FText&, ETextCommit::Type, TWeakPtr< FGraphActionNode >);
/** Delegate executed to check if the selected action is valid for renaming */
DECLARE_DELEGATE_RetVal_OneParam( bool, FCanRenameSelectedAction, TWeakPtr< FGraphActionNode > );
/** Delegate to get the name of a section if the widget is a section separator. */
DECLARE_DELEGATE_RetVal_OneParam( FText, FGetSectionTitle, int32 );
/** Delegate to get the tooltip of a section if the widget is a section separator. */
DECLARE_DELEGATE_RetVal_OneParam( TSharedPtr<IToolTip>, FGetSectionToolTip, int32 );
/** Delegate to get the widget that appears on the section bar in the section separator. */
DECLARE_DELEGATE_RetVal_TwoParams( TSharedRef<SWidget>, FGetSectionWidget, TSharedRef<SWidget>, int32 );
/** Delegate to get the filter text */
DECLARE_DELEGATE_RetVal( FText, FGetFilterText);
/** Delegate to check if an action matches a specified name (used for renaming items etc.) */
DECLARE_DELEGATE_RetVal_TwoParams( bool, FOnActionMatchesName, FEdGraphSchemaAction*, const FName& );
SLATE_BEGIN_ARGS(SGraphActionMenu)
: _AutoExpandActionMenu(false)
, _AlphaSortItems(true)
, _SortItemsRecursively(true)
, _ShowFilterTextBox(true)
, _UseSectionStyling(false)
, _bAllowPreselectedItemActivation(false)
, _GraphObj(nullptr)
{ }
SLATE_EVENT( FOnActionSelected, OnActionSelected )
SLATE_EVENT( FOnActionDoubleClicked, OnActionDoubleClicked )
SLATE_EVENT( FOnActionDragged, OnActionDragged )
SLATE_EVENT( FOnCategoryDragged, OnCategoryDragged )
SLATE_EVENT( FOnContextMenuOpening, OnContextMenuOpening )
SLATE_EVENT( FOnCreateWidgetForAction, OnCreateWidgetForAction )
SLATE_EVENT( FOnCreateCustomRowExpander, OnCreateCustomRowExpander )
SLATE_EVENT( FOnCollectAllActions, OnCollectAllActions )
SLATE_EVENT( FOnCollectStaticSections, OnCollectStaticSections )
SLATE_EVENT( FOnCategoryTextCommitted, OnCategoryTextCommitted )
SLATE_EVENT( FCanRenameSelectedAction, OnCanRenameSelectedAction )
SLATE_EVENT( FGetSectionTitle, OnGetSectionTitle )
SLATE_EVENT( FGetSectionToolTip, OnGetSectionToolTip )
SLATE_EVENT( FGetSectionWidget, OnGetSectionWidget )
SLATE_EVENT( FGetFilterText, OnGetFilterText )
SLATE_EVENT( FOnActionMatchesName, OnActionMatchesName )
SLATE_ARGUMENT( bool, AutoExpandActionMenu )
SLATE_ARGUMENT( bool, AlphaSortItems )
SLATE_ARGUMENT( bool, SortItemsRecursively )
SLATE_ARGUMENT( bool, ShowFilterTextBox )
SLATE_ARGUMENT( bool, UseSectionStyling )
SLATE_ARGUMENT( bool, bAllowPreselectedItemActivation )
SLATE_ARGUMENT( TArray<UEdGraphPin*>, DraggedFromPins )
SLATE_ARGUMENT( UEdGraph*, GraphObj )
SLATE_END_ARGS()
void Construct( const FArguments& InArgs, bool bIsReadOnly = true );
// FGCObject override
virtual void AddReferencedObjects( FReferenceCollector& Collector ) override;
virtual FString GetReferencerName() const override;
/**
* Refreshes the actions that this widget should display
*
* @param bPreserveExpansion TRUE if the expansion state of the tree should be preserved
* @param bHandleOnSelectionEvent TRUE if the item should be selected and any actions that occur with selection will be handled. FALSE and only selection will occur */
void RefreshAllActions(bool bPreserveExpansion, bool bHandleOnSelectionEvent = true);
/** Returns a map of all top level sections and their current expansion state. */
void GetSectionExpansion(TMap<int32, bool>& SectionExpansion) const;
/** Sets the sections to be expanded of all top level sections. */
void SetSectionExpansion(const TMap<int32, bool>& SectionExpansion);
protected:
/** Tree view for showing actions */
TSharedPtr< STreeView< TSharedPtr<FGraphActionNode> > > TreeView;
/** Text box used for searching for actions */
TSharedPtr<SSearchBox> FilterTextBox;
/** List of all actions we can browser */
FGraphActionListBuilderBase AllActions;
/** Flattened list of all actions passing the filter */
TArray< TSharedPtr<FGraphActionNode> > FilteredActionNodes;
/** Root of filtered actions tree */
TSharedPtr<FGraphActionNode> FilteredRootAction;
/** Used to track selected action for keyboard interaction */
int32 SelectedSuggestion;
/** Allows us to set selection (via keyboard) without triggering action */
bool bIgnoreUIUpdate;
/** Should we auto-expand categories */
bool bAutoExpandActionMenu;
/** Should we display the filter text box */
bool bShowFilterTextBox;
/** Don't sort items alphabetically */
bool bAlphaSortItems;
/** If only the top entries should be sorted or subentries as well */
bool bSortItemsRecursively;
/** Should the rows and sections be styled like the details panel? */
bool bUseSectionStyling;
/** Whether we allow pre-selected items to be activated with a left-click */
bool bAllowPreselectedItemActivation;
/** Delegate to call when action is selected */
FOnActionSelected OnActionSelected;
/** Delegate to call when action is double clicked */
FOnActionDoubleClicked OnActionDoubleClicked;
/** Delegate to call when an action is dragged. */
FOnActionDragged OnActionDragged;
/** Delegate to call when a category is dragged. */
FOnCategoryDragged OnCategoryDragged;
/** Delegate to call to create widget for an action */
FOnCreateWidgetForAction OnCreateWidgetForAction;
/** Delegate to call for creating a custom "expander" widget for indenting a menu row with */
FOnCreateCustomRowExpander OnCreateCustomRowExpander;
/** Delegate to call to collect all actions */
FOnCollectAllActions OnCollectAllActions;
/** Delegate to call to collect all always visible sections */
FOnCollectStaticSections OnCollectStaticSections;
/** Delegate to call to handle any post-category rename events */
FOnCategoryTextCommitted OnCategoryTextCommitted;
/** Delegate to call to check if a selected action is valid for renaming */
FCanRenameSelectedAction OnCanRenameSelectedAction;
/** Delegate to get the name of a section separator. */
FGetSectionTitle OnGetSectionTitle;
/** Delegate to get the tooltip of a section separator. */
FGetSectionToolTip OnGetSectionToolTip;
/** Delegate to get the widgets of a section separator. */
FGetSectionWidget OnGetSectionWidget;
/** Delegate to get the filter text if supplied from an external source */
FGetFilterText OnGetFilterText;
/** Delegate to check if an action matches a specified name (used for renaming items etc.) */
FOnActionMatchesName OnActionMatchesName;
public:
// SWidget interface
virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent) override;
// End of SWidget interface
/** Get filter text box widget */
TSharedRef<SEditableTextBox> GetFilterTextBox();
/** Get action that is currently selected */
void GetSelectedActions(TArray< TSharedPtr<FEdGraphSchemaAction> >& OutSelectedActions) const;
/** Initiates a rename on the selected action node, if possible */
void OnRequestRenameOnActionNode();
/** Queries if a rename on the selected action node is possible */
bool CanRequestRenameOnActionNode() const;
/** Get category that is currently selected */
FString GetSelectedCategoryName() const;
/** Get category child actions that is currently selected */
void GetSelectedCategorySubActions(TArray<TSharedPtr<FEdGraphSchemaAction>>& OutActions) const;
/** Get category child actions for the passed in action */
void GetCategorySubActions(TWeakPtr<FGraphActionNode> InAction, TArray<TSharedPtr<FEdGraphSchemaAction>>& OutActions) const;
/**
* Selects an non-creation item in the list, searching by FName, deselects if name is none
*
* @param ItemName The name of the item to select
* @param SelectInfo The selection type
* @param SectionId If known, the section Id to restrict the selection to, useful in the case of categories where they can exist multiple times
* @param bIsCategory TRUE if the selection is a category, categories obey different rules and it's hard to re-select properly without this knowledge
* @return TRUE if the item was successfully selected or the tree cleared, FALSE if unsuccessful
*/
bool SelectItemByName(const FName& ItemName, ESelectInfo::Type SelectInfo = ESelectInfo::Direct, int32 SectionId = INDEX_NONE, bool bIsCategory = false );
/** Expands any category with the associated name */
void ExpandCategory(const FText& CategoryName);
/* Handler for mouse button going down */
bool OnMouseButtonDownEvent( TWeakPtr<FEdGraphSchemaAction> InAction );
/** Regenerated filtered results (FilteredRootAction and FilteredActionNodes) based on filter text */
void GenerateFilteredItems(bool bPreserveExpansion);
/** The last typed action within the graph action menu */
static FString LastUsedFilterText;
protected:
/** Get current filter text */
FText GetFilterText() const;
/** Change the selection to reflect the active suggestion */
void MarkActiveSuggestion();
/** Try to spawn the node reflected by the active suggestion */
bool TryToSpawnActiveSuggestion();
/** Returns true if the tree should be autoexpanded */
bool ShouldExpandNodes() const;
/** Checks if the passed in node is safe for renaming */
bool CanRenameNode(TWeakPtr<FGraphActionNode> InNode) const;
// Delegates
/** Called when filter text changes */
void OnFilterTextChanged( const FText& InFilterText );
/** Called when enter is hit in search box */
void OnFilterTextCommitted(const FText& InText, ETextCommit::Type CommitInfo);
/** Get children */
void OnGetChildrenForCategory( TSharedPtr<FGraphActionNode> InItem, TArray< TSharedPtr<FGraphActionNode> >& OutChildren );
/** Create widget for the supplied node */
TSharedRef<ITableRow> MakeWidget( TSharedPtr<FGraphActionNode> InItem, const TSharedRef<STableViewBase>& OwnerTable, bool bIsReadOnly );
/**
* Called when tree item is selected
*
* @param InSelectedItem The action node that is being selected
* @param SelectInfo Selection type - Only OnMouseClick and OnKeyPress will trigger a call to HandleSelection
*/
void OnItemSelected( TSharedPtr< FGraphActionNode > InSelectedItem, ESelectInfo::Type SelectInfo );
/**
* Executes the selection delegate providing it has been bound, and the provided action node given is valid and is an action node
*
* @param InselectedItem The graph action node selected
*
* @return true if item selection delegate was executed
*/
bool HandleSelection( TSharedPtr< FGraphActionNode > &InSelectedItem, ESelectInfo::Type InSelectionType );
/** Called when tree item is double clicked */
void OnItemDoubleClicked( TSharedPtr< FGraphActionNode > InClickedItem );
/** Called when tree item dragged */
FReply OnItemDragDetected( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent );
/** Callback when rename text is committed */
void OnNameTextCommitted(const FText& NewText, ETextCommit::Type InTextCommit, TWeakPtr< FGraphActionNode > InAction);
/** Handler for when an item has scrolled into view after having been requested to do so */
Copying //UE4/Dev-Blueprints to Dev-Main (//UE4/Dev-Main) #lockdown Nick.Penwarden ========================== MAJOR FEATURES + CHANGES ========================== Change 2806214 on 2015/12/16 by Michael.Schoell Connection draw policy refactored into a factory system. PR#1663 #jira UE-22123 - GitHub 1663 : Implement PinConnectionPolicy factory system Change 2806845 on 2015/12/17 by Maciej.Mroz Blueprint C++ Conversion: fixed varioaus problem. Some limitations of included header list were reverted :( Any compilation-time optimization are premature (as far as Orion cannot be compiled). #codereview Dan.Oconnor Change 2806892 on 2015/12/17 by Maciej.Mroz Blueprint C++ Conversion: fixed compilation error "fatal error C1001: An internal error has occurred in the compiler." Change 2807020 on 2015/12/17 by Michael.Schoell Recursively expand all tree items in graph context menus or My Blueprint window by holding shift when clicking on an arrow. Change 2807639 on 2015/12/17 by Maciej.Mroz BP C++ conversion: Fix for const-correctness. Included generated headers in structs. Change 2807880 on 2015/12/17 by Mike.Beach PR #1865 : Render Kismet graph pin color box with alpha https://github.com/EpicGames/UnrealEngine/pull/1865 #github 1865 #1865 #jira UE-23863 Change 2808538 on 2015/12/18 by Maciej.Mroz Workaround for UE-24467. Some corrupted files can be opened and fixed. #codereivew Dan.Oconnor, Michael.Schoell Change 2808540 on 2015/12/18 by Maciej.Mroz BP C++ conversion: fixed const-correctness related issues Change 2809333 on 2015/12/18 by Phillip.Kavan [UE-23452] SCS/UCS component instancing optimizations change summary: - added FArchive::FCustomPropertyListNode - modified various parts of serialization code to accomodate custom property lists - added cooked component instancing data + supporting APIs to UBlueprintGeneratedClass Change 2810216 on 2015/12/21 by Maciej.Mroz Blueprint C++ Conversion: - Fixed Compiler Error C2026 (too big string) - Fixed a lot of errors related to const correctness. "NativeConst" and "NativeConstTemplateArg" MetaData added. - Fixed bunch of problems with TEnumAsByte - Fixed for error C2059: syntax error : 'bad suffix on number' - when struct name starts with a digit - Fixed int -> bool conversion #codereview Mike.Beach, Dan.Oconnor, Steve.Robb Change 2810397 on 2015/12/21 by Maciej.Mroz Blueprint C++ Conversion: Fixed Compiler Error C1091 (too big string) Change 2810638 on 2015/12/21 by Dan.Oconnor Timers for measuring VM overhead, stats for tracking individual script functions improved (now nicludes ProcessEvent). Stats system is expected to avoid double counting for object and function stats. Change 2811038 on 2015/12/22 by Phillip.Kavan [UE-23452] Fix uninitialized variables in cooked component data. - should eliminate crashes introduced by last change Change 2811054 on 2015/12/22 by Phillip.Kavan [UE-23452] Additional fix for uninitialized USTRUCT property. Change 2811254 on 2015/12/22 by Dan.Oconnor More script function detail in stats Change 2811325 on 2015/12/22 by Maciej.Mroz Blueprint C++ Conversion: improved: ExcludedBlueprintTypes list #codereview Dan.Oconnor Change 2812316 on 2015/12/24 by Michael.Schoell Added more ByValue/ByRef test cases and added a way to dump all tests that are no longer succeeding. Tests Include: Verification that functions take and can modify by-ref values. ForEach loop verification. Tests for verifying that current functionality will continue to work after COPY injection and that "expected" functionality will work (and currently doesn't). More MegaArray tests. Change 2812318 on 2015/12/24 by Michael.Schoell Usability fix: Duplicating graphs in the MyBP window will now open and focus the new graph. Change 2813179 on 2015/12/29 by Michael.Schoell When promoting pins to variables, will no longer carry bIsReference, bIsConst, or bIsWeakPointer value to the new variable's type. Change 2813435 on 2015/12/30 by Michael.Schoell Submitting by-value/by-ref testing BP with more tests: More "Set Members..." tests to catch edge cases. More Array tests. Change 2813441 on 2015/12/30 by Michael.Schoell [CL 2842166 by Mike Beach in Main branch]
2016-01-25 13:25:51 -05:00
void OnItemScrolledIntoView( TSharedPtr<FGraphActionNode> InActionNode, const TSharedPtr<ITableRow>& InWidget );
/** Callback for expanding tree items recursively */
void OnSetExpansionRecursive(TSharedPtr<FGraphActionNode> InTreeNode, bool bInIsItemExpanded);
private:
/** The pins that have been dragged off of to prompt the creation of this action menu. */
TArray<UEdGraphPin*> DraggedFromPins;
/** The graph that this menu is being constructed in */
UEdGraph* GraphObj;
};