You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
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]
131 lines
4.7 KiB
C++
131 lines
4.7 KiB
C++
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "IntroTutorialsPrivatePCH.h"
|
|
#include "STutorialOverlay.h"
|
|
#include "STutorialContent.h"
|
|
#include "EditorTutorial.h"
|
|
#include "IntroTutorials.h"
|
|
|
|
void STutorialOverlay::Construct(const FArguments& InArgs, FTutorialStage* const InStage)
|
|
{
|
|
ParentWindow = InArgs._ParentWindow;
|
|
bIsStandalone = InArgs._IsStandalone;
|
|
OnClosed = InArgs._OnClosed;
|
|
|
|
TSharedPtr<SOverlay> Overlay;
|
|
|
|
ChildSlot
|
|
[
|
|
SAssignNew(Overlay, SOverlay)
|
|
+SOverlay::Slot()
|
|
[
|
|
SAssignNew(OverlayCanvas, SCanvas)
|
|
]
|
|
];
|
|
|
|
if(InStage != nullptr)
|
|
{
|
|
// add non-widget content, if any
|
|
if(InArgs._AllowNonWidgetContent && InStage->Content.Type != ETutorialContent::None)
|
|
{
|
|
Overlay->AddSlot()
|
|
[
|
|
SNew(SHorizontalBox)
|
|
+SHorizontalBox::Slot()
|
|
.VAlign(VAlign_Center)
|
|
.HAlign(HAlign_Center)
|
|
[
|
|
SNew(STutorialContent, InStage->Content)
|
|
.OnClosed(InArgs._OnClosed)
|
|
.IsStandalone(InArgs._IsStandalone)
|
|
.WrapTextAt(600.0f)
|
|
]
|
|
];
|
|
}
|
|
|
|
if(InStage->WidgetContent.Num() > 0)
|
|
{
|
|
FIntroTutorials& IntroTutorials = FModuleManager::Get().GetModuleChecked<FIntroTutorials>("IntroTutorials");
|
|
|
|
// now add canvas slots for widget-bound content
|
|
for(const FTutorialWidgetContent& WidgetContent : InStage->WidgetContent)
|
|
{
|
|
if(WidgetContent.Content.Type != ETutorialContent::None)
|
|
{
|
|
TSharedPtr<STutorialContent> ContentWidget =
|
|
SNew(STutorialContent, WidgetContent.Content)
|
|
.HAlign(WidgetContent.HorizontalAlignment)
|
|
.VAlign(WidgetContent.VerticalAlignment)
|
|
.Offset(WidgetContent.Offset)
|
|
.IsStandalone(bIsStandalone)
|
|
.OnClosed(OnClosed)
|
|
.WrapTextAt(WidgetContent.ContentWidth)
|
|
.Anchor(WidgetContent.WidgetAnchor);
|
|
|
|
OverlayCanvas->AddSlot()
|
|
.Position(TAttribute<FVector2D>::Create(TAttribute<FVector2D>::FGetter::CreateSP(ContentWidget.Get(), &STutorialContent::GetPosition)))
|
|
.Size(TAttribute<FVector2D>::Create(TAttribute<FVector2D>::FGetter::CreateSP(ContentWidget.Get(), &STutorialContent::GetSize)))
|
|
[
|
|
ContentWidget.ToSharedRef()
|
|
];
|
|
|
|
OnPaintNamedWidget.AddSP(ContentWidget.Get(), &STutorialContent::HandlePaintNamedWidget);
|
|
OnResetNamedWidget.AddSP(ContentWidget.Get(), &STutorialContent::HandleResetNamedWidget);
|
|
OnCacheWindowSize.AddSP(ContentWidget.Get(), &STutorialContent::HandleCacheWindowSize);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int32 STutorialOverlay::OnPaint( const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const
|
|
{
|
|
if(ParentWindow.IsValid())
|
|
{
|
|
TSharedPtr<SWindow> PinnedWindow = ParentWindow.Pin();
|
|
OnResetNamedWidget.Broadcast();
|
|
OnCacheWindowSize.Broadcast(PinnedWindow->GetWindowGeometryInWindow().Size);
|
|
LayerId = TraverseWidgets(PinnedWindow.ToSharedRef(), PinnedWindow->GetWindowGeometryInWindow(), MyClippingRect, OutDrawElements, LayerId);
|
|
}
|
|
|
|
return SCompoundWidget::OnPaint(Args, AllottedGeometry, MyClippingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled);
|
|
}
|
|
|
|
int32 STutorialOverlay::TraverseWidgets(TSharedRef<SWidget> InWidget, const FGeometry& InGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId) const
|
|
{
|
|
const FName Tag = InWidget->GetTag();
|
|
if(Tag != NAME_None)
|
|
{
|
|
// we are a named widget - ask it to draw
|
|
OnPaintNamedWidget.Broadcast(InWidget, InGeometry);
|
|
|
|
// if we are picking, we need to draw an outline here
|
|
FName WidgetNameToHighlight = NAME_None;
|
|
bool bIsPicking = false;
|
|
FIntroTutorials& IntroTutorials = FModuleManager::Get().GetModuleChecked<FIntroTutorials>("IntroTutorials");
|
|
if(IntroTutorials.OnIsPicking().IsBound())
|
|
{
|
|
bIsPicking = IntroTutorials.OnIsPicking().Execute(WidgetNameToHighlight);
|
|
}
|
|
|
|
if(WidgetNameToHighlight != NAME_None || bIsPicking)
|
|
{
|
|
const bool bHighlight = WidgetNameToHighlight != NAME_None && WidgetNameToHighlight == Tag;
|
|
if(bIsPicking || (!bIsPicking && bHighlight))
|
|
{
|
|
const FLinearColor Color = bIsPicking && bHighlight ? FLinearColor::Green : FLinearColor::White;
|
|
FSlateDrawElement::MakeBox(OutDrawElements, LayerId++, InGeometry.ToPaintGeometry(), FCoreStyle::Get().GetBrush(TEXT("Debug.Border")), MyClippingRect, ESlateDrawEffect::None, Color);
|
|
}
|
|
}
|
|
}
|
|
|
|
FArrangedChildren ArrangedChildren(EVisibility::Visible);
|
|
InWidget->ArrangeChildren(InGeometry, ArrangedChildren);
|
|
for(int32 ChildIndex = 0; ChildIndex < ArrangedChildren.Num(); ChildIndex++)
|
|
{
|
|
const FArrangedWidget& ArrangedWidget = ArrangedChildren(ChildIndex);
|
|
LayerId = TraverseWidgets(ArrangedWidget.Widget, ArrangedWidget.Geometry, MyClippingRect, OutDrawElements, LayerId);
|
|
}
|
|
|
|
return LayerId;
|
|
} |