Files
UnrealEngineUWP/Engine/Source/Editor/UnrealEd/Private/ComponentVisualizerManager.cpp
Chris Wood 8a112d6140 PushMenu() now respects QueryPopupMethod(). All menus now support reusing windows.
UE-14641 - Fix PushMenu() to use QueryPopupMethod()

Pretty big refactor
Adds IMenu as way to identify menus. Replaces referring to menus as SWindows.
Lots of uses of PushMenu() fixed up to match new API

#codereview Nick.Atamas

[CL 2579277 by Chris Wood in Main branch]
2015-06-05 20:19:33 -04:00

150 lines
4.3 KiB
C++

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "UnrealEd.h"
#include "ComponentVisualizerManager.h"
#include "ILevelEditor.h"
#include "ILevelViewport.h"
/** Handle a click on the specified editor viewport client */
bool FComponentVisualizerManager::HandleClick(FLevelEditorViewportClient* InViewportClient, HHitProxy* HitProxy, const FViewportClick& Click)
{
bool bHandled = HandleProxyForComponentVis(InViewportClient, HitProxy, Click);
if (bHandled && Click.GetKey() == EKeys::RightMouseButton)
{
TSharedPtr<SWidget> MenuWidget = GenerateContextMenuForComponentVis();
if (MenuWidget.IsValid())
{
auto ParentLevelEditor = InViewportClient->ParentLevelEditor.Pin();
if (ParentLevelEditor.IsValid() && ParentLevelEditor->GetActiveViewportInterface().IsValid() )
{
TSharedPtr<SWidget> MenuParent = ParentLevelEditor->GetActiveViewportInterface()->GetViewportWidget().Pin();
FSlateApplication::Get().PushMenu(
MenuParent.ToSharedRef(),
FWidgetPath(),
MenuWidget.ToSharedRef(),
FSlateApplication::Get().GetCursorPos(),
FPopupTransitionEffect(FPopupTransitionEffect::ContextMenu));
return true;
}
}
}
return false;
}
bool FComponentVisualizerManager::HandleProxyForComponentVis(FLevelEditorViewportClient* InViewportClient, HHitProxy* HitProxy, const FViewportClick& Click)
{
if (HitProxy->IsA(HComponentVisProxy::StaticGetType()))
{
HComponentVisProxy* VisProxy = (HComponentVisProxy*)HitProxy;
const UActorComponent* ClickedComponent = VisProxy->Component.Get();
if (ClickedComponent != NULL)
{
TSharedPtr<FComponentVisualizer> Visualizer = GUnrealEd->FindComponentVisualizer(ClickedComponent->GetClass());
if (Visualizer.IsValid())
{
bool bIsActive = Visualizer->VisProxyHandleClick(InViewportClient, VisProxy, Click);
if (bIsActive)
{
// call EndEditing on any currently edited visualizer, if we are going to change it
TSharedPtr<FComponentVisualizer> EditedVisualizer = EditedVisualizerPtr.Pin();
if (EditedVisualizer.IsValid() && Visualizer.Get() != EditedVisualizer.Get())
{
EditedVisualizer->EndEditing();
}
EditedVisualizerPtr = Visualizer;
return true;
}
}
}
}
else
{
ClearActiveComponentVis();
}
return false;
}
void FComponentVisualizerManager::ClearActiveComponentVis()
{
TSharedPtr<FComponentVisualizer> EditedVisualizer = EditedVisualizerPtr.Pin();
if (EditedVisualizer.IsValid())
{
EditedVisualizer->EndEditing();
EditedVisualizerPtr = NULL;
}
}
bool FComponentVisualizerManager::HandleInputKey(FEditorViewportClient* ViewportClient, FViewport* Viewport, FKey Key, EInputEvent Event) const
{
TSharedPtr<FComponentVisualizer> EditedVisualizer = EditedVisualizerPtr.Pin();
if (EditedVisualizer.IsValid())
{
if(EditedVisualizer->HandleInputKey(ViewportClient, Viewport, Key, Event))
{
return true;
}
}
return false;
}
bool FComponentVisualizerManager::HandleInputDelta(FEditorViewportClient* InViewportClient, FViewport* InViewport, FVector& InDrag, FRotator& InRot, FVector& InScale) const
{
TSharedPtr<FComponentVisualizer> EditedVisualizer = EditedVisualizerPtr.Pin();
if (EditedVisualizer.IsValid() && InViewportClient->GetCurrentWidgetAxis() != EAxisList::None)
{
if (EditedVisualizer->HandleInputDelta(InViewportClient, InViewport, InDrag, InRot, InScale))
{
return true;
}
}
return false;
}
bool FComponentVisualizerManager::GetWidgetLocation(const FEditorViewportClient* ViewportClient, FVector& OutLocation) const
{
TSharedPtr<FComponentVisualizer> EditedVisualizer = EditedVisualizerPtr.Pin();
if (EditedVisualizer.IsValid())
{
return EditedVisualizer->GetWidgetLocation(ViewportClient, OutLocation);
}
return false;
}
bool FComponentVisualizerManager::GetCustomInputCoordinateSystem(const FEditorViewportClient* ViewportClient, FMatrix& OutMatrix) const
{
TSharedPtr<FComponentVisualizer> EditedVisualizer = EditedVisualizerPtr.Pin();
if (EditedVisualizer.IsValid())
{
return EditedVisualizer->GetCustomInputCoordinateSystem(ViewportClient, OutMatrix);
}
return false;
}
TSharedPtr<SWidget> FComponentVisualizerManager::GenerateContextMenuForComponentVis() const
{
TSharedPtr<FComponentVisualizer> EditedVisualizer = EditedVisualizerPtr.Pin();
if (EditedVisualizer.IsValid())
{
return EditedVisualizer->GenerateContextMenu();
}
return TSharedPtr<SWidget>();
}