Fix some issues with new root canvas stuff

This commit is contained in:
2026-04-22 17:02:24 -04:00
parent d985a6bc55
commit a964211cc8
5 changed files with 128 additions and 101 deletions

View File

@@ -18,33 +18,6 @@ UlxRootCanvasSlot::UlxRootCanvasSlot(const FObjectInitializer& ObjectInitializer
SetOffsets(FMargin(0.0f, 0.0f, 0.0f, 0.0f));
}
void UlxRootCanvasSlot::SetZOrderReliable(int32 Order)
{
if (SlotUnderConstruction)
{
PRAGMA_DISABLE_DEPRECATION_WARNINGS
ZOrder = Order;
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}
else
{
SetZOrder(Order);
}
}
int32 UlxRootCanvasSlot::GetZOrderReliable()
{
if (SlotUnderConstruction)
{
PRAGMA_DISABLE_DEPRECATION_WARNINGS
return ZOrder;
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}
else
{
return GetZOrder();
}
}
UClass* UlxRootCanvasPanel::GetSlotClass() const
{
@@ -70,16 +43,24 @@ UlxRootCanvasSlot* UlxRootCanvasPanel::AddChildToRootCanvas(UWidget* Content)
return Cast<UlxRootCanvasSlot>(Super::AddChild(Content));
}
int32 UlxRootCanvasPanel::GetMaxZOrder() const
void UlxRootCanvasPanel::OnSlotAdded(UPanelSlot* InSlot)
{
int32 MaxZOrder = 0;
for (UPanelSlot *PanelSlot : Slots)
UlxRootCanvasSlot *Slot = CastChecked<UlxRootCanvasSlot>(InSlot);
Slot->BringToFrontCount = ++BringToFrontCounter;
Super::OnSlotAdded(InSlot);
}
UlxRootCanvasSlot* UlxRootCanvasPanel::GetTopWidget()
{
UlxRootCanvasSlot* Top = nullptr;
for (UPanelSlot* PanelSlot : Slots)
{
UlxRootCanvasSlot *TypedSlot = Cast<UlxRootCanvasSlot>(PanelSlot);
check(TypedSlot);
MaxZOrder = FMath::Max(MaxZOrder, TypedSlot->GetZOrderReliable());
UlxRootCanvasSlot* Slot = CastChecked<UlxRootCanvasSlot>(PanelSlot);
if (Cast<UUserWidget>(Slot->Content) == nullptr) continue;
if ((Top == nullptr) || (*Top < *Slot)) Top = Slot;
}
return MaxZOrder;
return Top;
}
TArray<UlxRootCanvasSlot*> UlxRootCanvasPanel::GetSortedUserWidgets()
@@ -95,12 +76,33 @@ TArray<UlxRootCanvasSlot*> UlxRootCanvasPanel::GetSortedUserWidgets()
}
Result.StableSort([](const UlxRootCanvasSlot &A, const UlxRootCanvasSlot &B)
{
return A.GetZOrder() > B.GetZOrder();
return A < B;
});
return Result;
}
void UlxRootCanvasPanel::UpdateZOrders()
{
for (UPanelSlot *PanelSlot : Slots)
{
UlxRootCanvasSlot *Slot = Cast<UlxRootCanvasSlot>(PanelSlot);
check(Slot);
int32 ZOrder = (Slot->ShowPointer ? 1000000 : 0) + Slot->BringToFrontCount;
Slot->SetZOrder(ZOrder);
}
}
void UlxRootCanvasPanel::BringToFront(UUserWidget *Widget)
{
if (!IsValid(Widget)) return;
UlxRootCanvasSlot *Slot = Cast<UlxRootCanvasSlot>(Widget->Slot);
if (!Slot) return;
UlxRootCanvasPanel *Panel = Cast<UlxRootCanvasPanel>(Slot->Parent);
if (!Panel) return;
Slot->BringToFrontCount = ++Panel->BringToFrontCounter;
}
void UlxRootCanvasPanel::SetWidgetWindowManagement(class UUserWidget *Widget,
bool ShowPointer, bool BlockInput, bool EnableEnhancedInput, bool BringToFront, UWidget *DesiredFocusWidget)
{
@@ -120,7 +122,15 @@ void UlxRootCanvasPanel::SetWidgetWindowManagement(class UUserWidget *Widget,
Slot->ShowPointer = ShowPointer;
Slot->BlockInput = BlockInput;
Slot->EnableEnhancedInput = EnableEnhancedInput;
Widget->SetDesiredFocusWidget(DesiredFocusWidget);
if (BringToFront) Slot->SetZOrderReliable(Panel->GetMaxZOrder() + 1);
if (DesiredFocusWidget)
{
if (!Widget->SetDesiredFocusWidget(DesiredFocusWidget))
UE_LOG(LogLuprexIntegration, Error, TEXT("SetWidgetWindowManagement: focus widget must be a child of widget"));
}
else
{
Widget->SetDesiredFocusWidget(NAME_None);
}
if (BringToFront) Slot->BringToFrontCount = ++Panel->BringToFrontCounter;
}