Files
UnrealEngineUWP/Engine/Source/Editor/IntroTutorials/Private/IntroTutorials.h
Thomas Sarkanen a27980dcf0 Tutorials 2.0 - Initial version
NOTE: Old tutorials not deprecated (yet), but widget highlights in old tutorials will stop working with this change!

Added new Blueprintable UEditorTutorial object.
Added suite of widgets and details customizations to display tutorials.
New system is available on command line switch -NewTutorials.

Slate changes:
Tag names are now stored in SWidgets, rather than simply being discarded.
Removed STutorialWrapper in favour of using Tags.
Added Tags to more multibox widgets, so virtually all can now be picked.
Added SWindow::HasOverlay so we dont attempt to add overlays to widows that cannot have them.

[CL 2244216 by Thomas Sarkanen in Main branch]
2014-08-05 09:04:35 -04:00

191 lines
7.4 KiB
C++

// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
#pragma once
/** Query delegate to see if we are in picking mode */
DECLARE_DELEGATE_RetVal_OneParam(bool, FOnIsPicking, FName& /* OutWidgetNameToHighlight */);
class UEditorTutorial;
struct FTutorialContent;
class STutorialRoot;
/** Contains properties defining a "welcome" tutorial, which is auto-shown once.*/
struct FWelcomeTutorialProperties
{
/** If set, call this delegate to return the proper properties struct. */
DECLARE_DELEGATE_RetVal_OneParam(FWelcomeTutorialProperties const*, FWelcomeTutorialPropertiesChooserDelegate, UObject*);
FWelcomeTutorialPropertiesChooserDelegate ChooserDelegate;
/** Location of the tutorial doc files */
FString TutorialPath;
/** Ini setting name for the "have I seen this welcome screen" variable */
FString SeenOnceSettingName;
FGuid SurveyGuid;
FWelcomeTutorialProperties(FString InTutorialPath, FString InSeenOnceSettingName)
: TutorialPath(InTutorialPath), SeenOnceSettingName(InSeenOnceSettingName)
{}
FWelcomeTutorialProperties(FString InTutorialPath, FString InSeenOnceSettingName, FString SurveyGUIDString)
: TutorialPath(InTutorialPath), SeenOnceSettingName(InSeenOnceSettingName)
{
FGuid::ParseExact(SurveyGUIDString, EGuidFormats::DigitsWithHyphens, SurveyGuid);
}
FWelcomeTutorialProperties(FWelcomeTutorialPropertiesChooserDelegate InChooserDelegate)
: ChooserDelegate(InChooserDelegate)
{}
FWelcomeTutorialProperties() {}
};
class FIntroTutorials : public IIntroTutorials
{
public:
static const FString IntroTutorialConfigSection;
static const FString InEditorTutorialPath;
static const FString WelcomeTutorialPath;
static const FString InEditorGamifiedTutorialPath;
static const FString HomePath;
static const FString BlueprintHomePath;
static const FString TemplateOverviewPath;
static const FWelcomeTutorialProperties UE4WelcomeTutorial;
static const FWelcomeTutorialProperties BlueprintHomeTutorial;
static const FWelcomeTutorialProperties ClassBlueprintWelcomeTutorial;
static const FWelcomeTutorialProperties MacroLibraryBlueprintWelcomeTutorial;
static const FWelcomeTutorialProperties InterfaceBlueprintWelcomeTutorial;
static const FWelcomeTutorialProperties LevelScriptBlueprintWelcomeTutorial;
static const FWelcomeTutorialProperties AddCodeToProjectWelcomeTutorial;
static const FWelcomeTutorialProperties MatineeEditorWelcomeTutorial;
static const FWelcomeTutorialProperties TemplateOverview;
// ctor
FIntroTutorials();
/** Get the delegate used to check for whether we are picking widgets */
FOnIsPicking& OnIsPicking();
private:
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
/** Add the menu extension for summoning the tutorial */
void AddSummonTutorialsMenuExtension(FMenuBuilder& MenuBuilder);
/** Add a menu extender to summon context-sensitive Blueprints page */
TSharedRef<FExtender> AddSummonBlueprintTutorialsMenuExtender(const TSharedRef<FUICommandList> CommandList, const TArray<UObject*> EditingObjects) const;
/** Add a menu entry to summon context-sensitive Blueprints page */
void AddSummonBlueprintTutorialsMenuExtension(FMenuBuilder& MenuBuilder, UObject* PrimaryObject);
/** Event to be called when the main frame is loaded */
void MainFrameLoad(TSharedPtr<SWindow> InRootWindow, bool bIsNewProjectWindow);
/** Summon a tutorial with the supplied path */
void SummonTutorialWindowForPage(const FString& Path);
/** Summon tutorial home page to front */
void SummonTutorialHome();
/** Summon blueprint tutorial home page to front */
void SummonBlueprintTutorialHome(UObject* Asset, bool bForceWelcome);
/** Event to be called when Tutorial window is closed. */
void OnTutorialWindowClosed(const TSharedRef<SWindow>& Window);
/** Called when tutorial is dismissed, either when finished or aborted. */
void OnTutorialDismissed() const;
/** Event to be called when any asset editor is opened */
void OnAssetEditorOpened(UObject* Asset);
/** Events to call when editor changes state in various ways */
void OnAddCodeToProjectDialogOpened();
void OnNewProjectDialogOpened();
void OnMatineeEditorOpened();
void OnEditorModeChanged(FEdMode* Mode, bool bEnteringMode);
/** Events to call when opening the compiler fails */
void HandleCompilerNotFound();
/** Events to call when SDK isn't installed */
void HandleSDKNotInstalled(const FString& PlatformName, const FString& DocLink);
bool MaybeOpenWelcomeTutorial(const FWelcomeTutorialProperties& TutorialProperties);
bool MaybeOpenWelcomeTutorial(const FString& TutorialPath, const FString& ConfigSettingName);
void ResetWelcomeTutorials() const;
template< typename KeyType >
void ResetTutorialPropertyMap(TMap<KeyType, FWelcomeTutorialProperties> Map) const;
void ResetTutorial(const FWelcomeTutorialProperties& TutProps) const;
bool HasSeenTutorial(const FWelcomeTutorialProperties& TutProps) const;
FWelcomeTutorialProperties const* ChooseBlueprintWelcomeTutorial(UObject* BlueprintObject);
FWelcomeTutorialProperties const* ChooseBlueprintWelcomeTutorial(UObject* BlueprintObject, bool bForceWelcome);
FWelcomeTutorialProperties const* FindAssetEditorTutorialProperties(UClass const* Class) const;
FString AnalyticsEventNameFromTutorialPath(const FString& TutorialPath) const;
/** Delegate for home button visibility */
EVisibility GetHomeButtonVisibility() const;
/** Handle linking between tutorials */
FString HandleGotoNextTutorial(const FString& InCurrentPage) const;
void SummonTutorialBrowser(TSharedRef<SWindow> InWindow, const FString& InFilter = TEXT(""));
public:
// IIntroTutorials interface
virtual void RegisterTutorialForAssetEditor(UClass* AssetClass, const FString& TutorialDocPath, const FString& TutorialHasBeenSeenSettingName, const FString& SurveyGUIDString) override;
virtual void UnregisterTutorialForAssetEditor(UClass* AssetClass) override;
virtual void LaunchTutorial(UEditorTutorial* Tutorial, bool bRestart = true, TWeakPtr<SWindow> InNavigationWindow = nullptr) override;
// End of IIntroTutorials interface
private:
/** The tab id of the tutorial tab */
static const FName IntroTutorialTabName;
/** The extender to pass to the level editor to extend it's window menu */
TSharedPtr<FExtender> MainMenuExtender;
/** The extender to pass to the blueprint editor to extend it's window menu */
TSharedPtr<FExtender> BlueprintEditorExtender;
/** The tutorial window that we use to display the tutorials */
TWeakPtr<SWindow> TutorialWindow;
/** Widget used to display tutorial */
TWeakPtr<class SIntroTutorials> TutorialWidget;
/** The root window that we will always try to parent the tutorial window to */
TWeakPtr<SWindow> RootWindow;
TMap<FString, FGuid> TutorialSurveyMap;
TMap<UClass*, FWelcomeTutorialProperties> AssetEditorTutorialPropertyMap;
TMap<FName, FWelcomeTutorialProperties> EditorModeTutorialPropertyMap;
/** The current object we are using as a basis for displaying a tutorial */
UClass* CurrentObjectClass;
bool bEnablePostTutorialSurveys;
/** Map of what tutorial to go to at the end of another */
TMap<FString, FString> TutorialChainMap;
/** should we be clearing the 'have seen this tutorial' flag? (controlled by -tutorials on the command line) */
bool bDesireResettingTutorialSeenFlagOnLoad;
/** Delegate used to determine whether we are in picking mode */
FOnIsPicking OnIsPickingDelegate;
/** Root widget for tutorial overlay system */
TSharedPtr<STutorialRoot> TutorialRoot;
};