Files
UnrealEngineUWP/Engine/Source/Editor/IntroTutorials/Private/STutorialOverlay.h
Thomas Sarkanen 1bca86ecf1 Fixed stalls in tutorials
API break: added a new pure virtual to IAssetEditorInstance - InvokeTab().

Tutorials were attempting to load a bogus asset for editing for each stage, causing stalls each time the user clicked Next.
Re-arranged code that attempted to open asset editor tabs so that it wasnt attempting ot open a bogus asset (used the correct member).
Order of tab manager preference is now Per-stage Blueprint asset editor->Per-'tutorial asset' editor->level editor.
Added new function to allow us to open tabs in asset editors. This avoids a dangerous up-cast to FAssetEditorToolkit to access its tab manager.

#codereview Bruce.Nesbit

[CL 2403225 by Thomas Sarkanen in Main branch]
2015-01-12 04:36:22 -05:00

98 lines
4.1 KiB
C++

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "EditorTutorial.h"
/** Delegate used when drawing/arranging widgets */
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnPaintNamedWidget, TSharedRef<SWidget> /*InWidget*/, const FGeometry& /*InGeometry*/);
/** Delegate used to inform widgets of the current window size, so they can auto-adjust layout */
DECLARE_MULTICAST_DELEGATE_OneParam(FOnCacheWindowSize, const FVector2D& /*InWindowSize*/);
/** Delegates for registering & querying whether a widget was drawn */
DECLARE_DELEGATE_OneParam(FOnWidgetWasDrawn, const FName& /*InName*/);
DECLARE_DELEGATE_RetVal_OneParam(bool, FOnWasWidgetDrawn, const FName& /*InName*/);
/**
* The widget which displays multiple 'floating' pieces of content overlaid onto the editor
*/
class STutorialOverlay : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS( STutorialOverlay )
{
_Visibility = EVisibility::SelfHitTestInvisible;
}
/** The window this content is displayed over */
SLATE_ARGUMENT(TWeakPtr<SWindow>, ParentWindow)
/** Whether this a standalone widget (with its own close button) or part of a group of other widgets, paired with tutorial navigation */
SLATE_ARGUMENT(bool, IsStandalone)
/** Delegate fired when the close button is clicked */
SLATE_EVENT(FSimpleDelegate, OnClosed)
SLATE_EVENT(FSimpleDelegate, OnBackClicked)
SLATE_EVENT(FSimpleDelegate, OnHomeClicked)
SLATE_EVENT(FSimpleDelegate, OnNextClicked)
SLATE_ATTRIBUTE(bool, IsBackEnabled)
SLATE_ATTRIBUTE(bool, IsHomeEnabled)
SLATE_ATTRIBUTE(bool, IsNextEnabled)
/** Whether we can show full window content in this overlay (i.e. in the same window as the navigation controls) */
SLATE_ARGUMENT(bool, AllowNonWidgetContent)
/** Delegates for registering & querying whether a widget was drawn */
SLATE_EVENT(FOnWidgetWasDrawn, OnWidgetWasDrawn)
SLATE_EVENT(FOnWasWidgetDrawn, OnWasWidgetDrawn)
SLATE_END_ARGS()
void Construct(const FArguments& InArgs, UEditorTutorial* InTutorial, FTutorialStage* const InStage);
/** SWidget implementation */
virtual int32 OnPaint( const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const override;
private:
/** Recursive function used to re-generate widget geometry and forward the geometry of named widgets onto their respective content */
int32 TraverseWidgets(TSharedRef<SWidget> InWidget, const FGeometry& InGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId) const;
/* Opens the browser that the given widget requires if it is not already. */
void OpenBrowserForWidgetAnchor(UEditorTutorial* InTutorial, const FTutorialWidgetContent &WidgetContent);
/* Focus on the blueprint node if an anchor widget references one */
void FocusOnAnyBlueprintNodes(const FTutorialWidgetContent &WidgetContent);
/* Do any interaction stuff for a widget - open browser, scroll to node etc */
void PerformWidgetInteractions(UEditorTutorial* InTutorial, const FTutorialWidgetContent &WidgetContent);
private:
/** Reference to the canvas we use to position our content widgets */
TSharedPtr<SCanvas> OverlayCanvas;
/** The window this content is displayed over */
TWeakPtr<SWindow> ParentWindow;
/** Whether this a standalone widget (with its own close button) or part of a group of other widgets, paired with tutorial navigation */
bool bIsStandalone;
/** Delegate fired when a cos ebutton is clicked in tutorial content */
FSimpleDelegate OnClosed;
/** Delegate used when drawing/arranging widgets */
FOnPaintNamedWidget OnPaintNamedWidget;
/** Delegate used to reset drawing of named widgets */
FSimpleMulticastDelegate OnResetNamedWidget;
/** Delegate used to inform widgets of the current window size, so they can auto-adjust layout */
FOnCacheWindowSize OnCacheWindowSize;
/** Flag to see if we have valid content (this widget is created to also supply picker overlays) */
bool bHasValidContent;
/** Delegate for querying whether a widget was drawn */
FOnWidgetWasDrawn OnWidgetWasDrawn;
};