Skip to main content

Using Payloads in Tooltip Data

Using Payloads in Tooltip Data

Use TriggerPayload to pass complex object data to tooltips.

Basic Usage

Setting Payload:

void UInventorySlot::SetItem(UItemData* Item)
{
FLayeredToolTipTriggerData TriggerData;
TriggerData.TriggerPayload = Item; // Pass object as payload

ULayeredTooltipFunctionLibrary::RegisterWidgetAsTooltipTrigger(this, TriggerData);
}

Using Payload in Tooltips:

void UItemTooltip::InitializeLayeredTooltip_Implementation(const FLayeredToolTipTriggerData& TriggerData)
{
if (UItemData* Item = Cast<UItemData>(TriggerData.TriggerPayload))
{
SetItemIcon(Item->GetIcon());
SetItemStats(Item->GetStats());
SetItemDescription(Item->GetDescription());
}
}
Real-Time Data Reflection

Displaying Dynamic Information:

void UCharacterTooltip::InitializeLayeredTooltip_Implementation(const FLayeredToolTipTriggerData& TriggerData)
{
if (AMyCharacter* Character = Cast<AMyCharacter>(TriggerData.TriggerPayload))
{
SetHealthBar(Character->GetHealthPercent());
SetLevel(Character->GetLevel());
SetActiveEffects(Character->GetActiveEffects());
}
}

Updating in Pinned State:

void UDynamicTooltip::OnLayeredTooltipPinned_Implementation(bool bPinned)
{
if (bPinned)
{
GetWorld()->GetTimerManager().SetTimer(UpdateTimer, this,
&UDynamicTooltip::UpdateContent, 0.5f, true);
}
else
{
GetWorld()->GetTimerManager().ClearTimer(UpdateTimer);
}
}
Usage in Text Providers

Object-Based Text Generation:

FText UDynamicTextProvider::ResolveText_Implementation(const FLayeredToolTipTriggerData& TriggerData)
{
if (UItemData* Item = Cast<UItemData>(TriggerData.TriggerPayload))
{
return FText::FromString(FString::Printf(TEXT("%s\nLevel: %d\nValue: %d gold"),
*Item->GetName(), Item->GetLevel(), Item->GetValue()));
}

return TriggerData.TooltipText;
}
Safe Usage

Caching with Weak References:

class UTooltipWidget : public ULayeredTooltipUserWidget
{
private:
TWeakObjectPtr<UObject> CachedPayload;

public:
virtual void InitializeLayeredTooltip_Implementation(const FLayeredToolTipTriggerData& TriggerData) override
{
CachedPayload = TriggerData.TriggerPayload;
if (CachedPayload.IsValid())
{
ProcessPayload(CachedPayload.Get());
}
}

void UpdateContent()
{
if (CachedPayload.IsValid())
{
ProcessPayload(CachedPayload.Get());
}
}
};