// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "ToolMenuOwner.h" #include "ToolMenuDelegates.h" #include "ToolMenuMisc.h" #include "Misc/Attribute.h" #include "Framework/MultiBox/MultiBoxDefs.h" #include "Framework/Commands/UICommandInfo.h" #include "UObject/TextProperty.h" #include "ToolMenuEntry.generated.h" class UToolMenuEntryScript; struct FKeyEvent; struct FToolMenuEntrySubMenuData { public: FToolMenuEntrySubMenuData() : bIsSubMenu(false), bOpenSubMenuOnClick(false), bAutoCollapse(false) { } bool bIsSubMenu; bool bOpenSubMenuOnClick; /** Entry placed into the parent's menu when there is only one entry */ bool bAutoCollapse; FNewToolMenuChoice ConstructMenu; }; struct FToolMenuEntryOptionsDropdownData { FNewToolMenuChoice MenuContentGenerator; TAttribute ToolTip; FUIAction Action; }; struct FToolMenuEntryToolBarData { public: FToolMenuEntryToolBarData() : bSimpleComboBox(false), bIsFocusable(false), bForceSmallIcons(false) { } /** Delegate that generates a widget for this combo button's menu content. Called when the menu is summoned. */ FNewToolMenuChoice ComboButtonContextMenuGenerator; /** Legacy delegate that generates a widget for this combo button's menu content. Called when the menu is summoned. */ FNewToolBarDelegateLegacy ConstructLegacy; TSharedPtr OptionsDropdownData; bool bSimpleComboBox; /** Whether ToolBar will have Focusable buttons */ bool bIsFocusable; /** Whether this toolbar should always use small icons, regardless of the current settings */ bool bForceSmallIcons; }; struct FToolMenuEntryWidgetData { public: FToolMenuEntryWidgetData() : bNoIndent(false), bSearchable(false), bNoPadding(false) { } /** Remove the padding from the left of the widget that lines it up with other menu items */ bool bNoIndent; /** If true, widget will be searchable */ bool bSearchable; /** If true, no padding will be added */ bool bNoPadding; }; USTRUCT(BlueprintType) struct TOOLMENUS_API FToolMenuEntry { GENERATED_BODY() FToolMenuEntry(); FToolMenuEntry(const FToolMenuOwner InOwner, const FName InName, EMultiBlockType InType); static FToolMenuEntry InitMenuEntry(const FName InName, const TAttribute& InLabel, const TAttribute& InToolTip, const TAttribute& InIcon, const FToolUIActionChoice& InAction, const EUserInterfaceActionType UserInterfaceActionType = EUserInterfaceActionType::Button, const FName InTutorialHighlightName = NAME_None); static FToolMenuEntry InitMenuEntry(const TSharedPtr< const FUICommandInfo >& InCommand, const TAttribute& InLabelOverride = TAttribute(), const TAttribute& InToolTipOverride = TAttribute(), const TAttribute& InIconOverride = TAttribute(), const FName InTutorialHighlightName = NAME_None, const TOptional InNameOverride = TOptional()); static FToolMenuEntry InitMenuEntry(const FName InNameOverride, const TSharedPtr< const FUICommandInfo >& InCommand, const TAttribute& InLabelOverride = TAttribute(), const TAttribute& InToolTipOverride = TAttribute(), const TAttribute& InIconOverride = TAttribute(), const FName InTutorialHighlightName = NAME_None); static FToolMenuEntry InitMenuEntryWithCommandList(const TSharedPtr& InCommand, const TSharedPtr& InCommandList, const TAttribute& InLabelOverride = TAttribute(), const TAttribute& InToolTipOverride = TAttribute(), const TAttribute& InIconOverride = TAttribute(), const FName InTutorialHighlightName = NAME_None, const TOptional InNameOverride = TOptional()); static FToolMenuEntry InitMenuEntry(const FName InName, const FToolUIActionChoice& InAction, const TSharedRef& Widget); static FToolMenuEntry InitSubMenu(const FName InName, const TAttribute& InLabel, const TAttribute& InToolTip, const FNewToolMenuChoice& InMakeMenu, const FToolUIActionChoice& InAction, const EUserInterfaceActionType InUserInterfaceActionType, bool bInOpenSubMenuOnClick = false, const TAttribute& InIcon = TAttribute(), const bool bShouldCloseWindowAfterMenuSelection = true); static FToolMenuEntry InitSubMenu(const FName InName, const TAttribute& InLabel, const TAttribute& InToolTip, const FNewToolMenuChoice& InMakeMenu, bool bInOpenSubMenuOnClick = false, const TAttribute& InIcon = TAttribute(), const bool bShouldCloseWindowAfterMenuSelection = true); static FToolMenuEntry InitSubMenu(const FName InName, const FToolUIActionChoice& InAction, const TSharedRef& InWidget, const FNewToolMenuChoice& InMakeMenu, bool bShouldCloseWindowAfterMenuSelection = true); static FToolMenuEntry InitToolBarButton(const FName InName, const FToolUIActionChoice& InAction, const TAttribute& InLabel = TAttribute(), const TAttribute& InToolTip = TAttribute(), const TAttribute& InIcon = TAttribute(), const EUserInterfaceActionType UserInterfaceActionType = EUserInterfaceActionType::Button, FName InTutorialHighlightName = NAME_None); static FToolMenuEntry InitToolBarButton(const TSharedPtr< const FUICommandInfo >& InCommand, const TAttribute& InLabelOverride = TAttribute(), const TAttribute& InToolTipOverride = TAttribute(), const TAttribute& InIconOverride = TAttribute(), FName InTutorialHighlightName = NAME_None, const TOptional InNameOverride = TOptional()); static FToolMenuEntry InitComboButton(const FName InName, const FToolUIActionChoice& InAction, const FNewToolMenuChoice& InMenuContentGenerator, const TAttribute& InLabelOverride = TAttribute(), const TAttribute& InToolTipOverride = TAttribute(), const TAttribute& InIconOverride = TAttribute(), bool bInSimpleComboBox = false, FName InTutorialHighlightName = NAME_None); static FToolMenuEntry InitSeparator(const FName InName); static FToolMenuEntry InitWidget(const FName InName, const TSharedRef& InWidget, const FText& Label, bool bNoIndent = false, bool bSearchable = true, bool bNoPadding = false); bool IsSubMenu() const { return SubMenuData.bIsSubMenu; } bool IsConstructLegacy() const { return ConstructLegacy.IsBound(); } const FUIAction* GetActionForCommand(const FToolMenuContext& InContext, TSharedPtr& OutCommandList) const; void SetCommandList(const TSharedPtr& InCommandList); void AddOptionsDropdown(FUIAction InAction, const FOnGetContent InMenuContentGenerator, const TAttribute& InToolTip = TAttribute()); void AddKeybindFromCommand(const TSharedPtr< const FUICommandInfo >& InCommand); bool IsCommandKeybindOnly() const; bool CommandAcceptsInput(const FKeyEvent& InKeyEvent) const; bool TryExecuteToolUIAction(const FToolMenuContext& InContext); friend struct FToolMenuSection; friend class UToolMenuEntryScript; private: void SetCommand(const TSharedPtr< const FUICommandInfo >& InCommand, TOptional InName, const TAttribute& InLabel, const TAttribute& InToolTip, const TAttribute& InIcon); void ResetActions(); bool IsScriptObjectDynamicConstruct() const; bool IsNonLegacyDynamicConstruct() const; public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") FName Name; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") FToolMenuOwner Owner; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") EMultiBlockType Type; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") EUserInterfaceActionType UserInterfaceActionType; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") FName TutorialHighlightName; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") FToolMenuInsert InsertPosition; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") bool bShouldCloseWindowAfterMenuSelection; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") TObjectPtr ScriptObject; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Tool Menus") FName StyleNameOverride; FToolMenuEntrySubMenuData SubMenuData; FToolMenuEntryToolBarData ToolBarData; FToolMenuEntryWidgetData WidgetData; /** Optional delegate that returns a widget to use as this menu entry */ FNewToolMenuWidget MakeWidget; TAttribute Label; TAttribute ToolTip; TAttribute Icon; private: friend class UToolMenus; friend class UToolMenuEntryExtensions; friend class FPopulateMenuBuilderWithToolMenuEntry; FToolUIActionChoice Action; FToolMenuStringCommand StringExecuteAction; TSharedPtr< const FUICommandInfo > Command; TSharedPtr< const FUICommandList > CommandList; FNewToolMenuSectionDelegate Construct; FNewToolMenuDelegateLegacy ConstructLegacy; bool bAddedDuringRegister; UPROPERTY() bool bCommandIsKeybindOnly; };