-
Notifications
You must be signed in to change notification settings - Fork 3
/
DeferredPainter.cpp
110 lines (93 loc) · 2.54 KB
/
DeferredPainter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Copyright Sharundaar. All Rights Reserved.
#include "DeferredPainter.h"
class SDeferredPainter : public SBox
{
public:
SLATE_BEGIN_ARGS(SDeferredPainter) {}
SLATE_ARGUMENT(bool, bDrawDefer)
SLATE_END_ARGS()
void Construct(const FArguments& InArgs)
{
bDrawDefer = InArgs._bDrawDefer;
}
virtual int32 OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const override
{
if(bDrawDefer)
{
// An SBox just draws its only child
FArrangedChildren ArrangedChildren(EVisibility::Visible);
this->ArrangeChildren(AllottedGeometry, ArrangedChildren);
// Maybe none of our children are visible
if( ArrangedChildren.Num() > 0 )
{
check( ArrangedChildren.Num() == 1 );
FArrangedWidget& TheChild = ArrangedChildren[0];
OutDrawElements.QueueDeferredPainting({
ChildSlot.GetWidget(),
Args.WithNewParent(this),
TheChild.Geometry,
InWidgetStyle,
ShouldBeEnabled( bParentEnabled )
});
}
return LayerId;
}
else
{
return SBox::OnPaint(Args, AllottedGeometry, MyCullingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled);
}
}
void SetDeferPaint(bool bEnableDeferPaint)
{
if(bDrawDefer != bEnableDeferPaint)
{
bDrawDefer = bEnableDeferPaint;
Invalidate(EInvalidateWidgetReason::Paint);
}
}
protected:
bool bDrawDefer = false;
};
TSharedRef<SWidget> UDeferredPainter::RebuildWidget()
{
TSharedRef<SDeferredPainter> DeferPainter = SAssignNew(DeferredPainter, SDeferredPainter).bDrawDefer(bEnableDeferPaint);
if(UWidget* Content = GetContent())
{
DeferPainter->SetContent(Content->TakeWidget());
}
else
{
DeferPainter->SetContent(SNullWidget::NullWidget);
}
return DeferPainter;
}
void UDeferredPainter::SynchronizeProperties()
{
Super::SynchronizeProperties();
if ( !DeferredPainter.IsValid() )
{
return;
}
DeferredPainter->SetDeferPaint(bEnableDeferPaint);
}
void UDeferredPainter::ReleaseSlateResources(bool bReleaseChildren)
{
Super::ReleaseSlateResources(bReleaseChildren);
DeferredPainter.Reset();
}
void UDeferredPainter::OnSlotAdded(UPanelSlot* InSlot)
{
if ( !DeferredPainter.IsValid() )
{
return;
}
DeferredPainter->SetContent(InSlot->Content ? InSlot->Content->TakeWidget() : SNullWidget::NullWidget);
}
void UDeferredPainter::OnSlotRemoved(UPanelSlot* InSlot)
{
if ( !DeferredPainter.IsValid() )
{
return;
}
DeferredPainter->SetContent(SNullWidget::NullWidget);
}