// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Input/PopupMethodReply.h" #include "Framework/Application/IMenu.h" class SWidget; class SWindow; /** * Represents the base class of popup menus. */ class FMenuBase : public IMenu, public TSharedFromThis { public: virtual FOnMenuDismissed& GetOnMenuDismissed() override { return OnMenuDismissed; } virtual TSharedPtr GetContent() const override { return Content; } bool IsCollapsedByParent() const { return bIsCollapsedByParent; } virtual bool UsingApplicationMenuStack() const override { return true; } protected: FMenuBase(TSharedRef InContent, const bool bCollapsedByParent); FOnMenuDismissed OnMenuDismissed; TSharedRef Content; bool bDismissing; bool bIsCollapsedByParent; }; /** * Represents a popup menu that is shown in its own SWindow. */ class FMenuInWindow : public FMenuBase { public: FMenuInWindow(TSharedRef InWindow, TSharedRef InContent, const bool bIsCollapsedByParent); virtual ~FMenuInWindow() {} virtual EPopupMethod GetPopupMethod() const override { return EPopupMethod::CreateNewWindow; } virtual TSharedPtr GetParentWindow() const override; virtual TSharedPtr GetOwnedWindow() const override { return GetParentWindow(); } virtual void Dismiss() override; private: TWeakPtr Window; }; /** * Represents a popup menu that is shown in the same window as the widget that summons it. */ class FMenuInPopup : public FMenuBase { public: FMenuInPopup(TSharedRef InContent, const bool bIsCollapsedByParent); virtual ~FMenuInPopup() {} virtual EPopupMethod GetPopupMethod() const { return EPopupMethod::UseCurrentWindow; } virtual TSharedPtr GetParentWindow() const; virtual TSharedPtr GetOwnedWindow() const { return TSharedPtr(); } virtual void Dismiss() override; }; /** * Represents a popup menu that is shown in a host widget (such as a menu anchor). */ class FMenuInHostWidget : public FMenuBase { public: FMenuInHostWidget(TSharedRef InHost, const TSharedRef& InContent, const bool bIsCollapsedByParent); virtual ~FMenuInHostWidget() {} virtual EPopupMethod GetPopupMethod() const { return EPopupMethod::UseCurrentWindow; } virtual TSharedPtr GetParentWindow() const; virtual TSharedPtr GetOwnedWindow() const { return TSharedPtr(); } virtual void Dismiss() override; virtual bool UsingApplicationMenuStack() const override; private: TWeakPtr MenuHost; };