// Copyright Epic Games, Inc. All Rights Reserved. #include "Framework/Application/Menu.h" #include "Widgets/SWidget.h" #include "Widgets/SWindow.h" #include "Framework/Application/SlateApplication.h" FMenuBase::FMenuBase(TSharedRef InContent, const bool bCollapsedByParent) : Content(InContent) , bDismissing(false) , bIsCollapsedByParent(bCollapsedByParent) { } FMenuInWindow::FMenuInWindow(TSharedRef InWindow, TSharedRef InContent, const bool bIsCollapsedByParent) : FMenuBase(InContent, bIsCollapsedByParent) , Window(InWindow) { } TSharedPtr FMenuInWindow::GetParentWindow() const { // Return the menu's window return Window.Pin(); } void FMenuInWindow::Dismiss() { if (!bDismissing) { bDismissing = true; OnMenuDismissed.Broadcast(AsShared()); // Close the window // Will cause the window destroy code to call back into the stack to clean up TSharedPtr WindowPinned = Window.Pin(); if (WindowPinned.IsValid()) { WindowPinned->RequestDestroyWindow(); } } } FMenuInPopup::FMenuInPopup(TSharedRef InContent, const bool bIsCollapsedByParent) : FMenuBase(InContent, bIsCollapsedByParent) { } TSharedPtr FMenuInPopup::GetParentWindow() const { // Return the menu's window return FSlateApplication::Get().GetVisibleMenuWindow(); } void FMenuInPopup::Dismiss() { if (!bDismissing) { bDismissing = true; OnMenuDismissed.Broadcast(AsShared()); } } FMenuInHostWidget::FMenuInHostWidget(TSharedRef InHost, const TSharedRef& InContent, const bool bIsCollapsedByParent) : FMenuBase(InContent, bIsCollapsedByParent) , MenuHost(InHost) { } TSharedPtr FMenuInHostWidget::GetParentWindow() const { // Return the menu's window TSharedPtr HostPinned = MenuHost.Pin(); if (HostPinned.IsValid()) { return HostPinned->GetMenuWindow(); } return TSharedPtr(); } void FMenuInHostWidget::Dismiss() { if (!bDismissing) { bDismissing = true; TSharedPtr HostPinned = MenuHost.Pin(); if (HostPinned.IsValid()) { HostPinned->OnMenuDismissed(); } OnMenuDismissed.Broadcast(AsShared()); } } bool FMenuInHostWidget::UsingApplicationMenuStack() const { TSharedPtr HostPinned = MenuHost.Pin(); if (HostPinned.IsValid()) { return HostPinned->UsingApplicationMenuStack(); } return true; }