Files
RelationshipsAchievements/Toast.lua
T
2026-07-23 02:43:14 +00:00

99 lines
3.1 KiB
Lua

-- Achievement toast popup (the "gold banner" that appears on unlock)
local TOAST_DURATION = 5.0
local FADE_DURATION = 1.0
local toast
local function CreateToast()
local f = CreateFrame("Button", "RelationshipsAchievementToast", UIParent)
f:SetWidth(320)
f:SetHeight(80)
f:SetPoint("TOP", UIParent, "TOP", 0, -120)
f:SetFrameStrata("HIGH")
f:EnableMouse(true)
f:RegisterForClicks("LeftButtonUp")
f:SetScript("OnClick", function()
if this.ach and RelationshipsAchievements_ShowDetail then
RelationshipsAchievements_ShowDetail(this.ach)
end
end)
f:Hide()
f:SetBackdrop({
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Border",
tile = true, tileSize = 32, edgeSize = 16,
insets = { left = 5, right = 5, top = 5, bottom = 5 },
})
f:SetBackdropColor(0, 0, 0, 0.9)
local header = f:CreateFontString(nil, "OVERLAY", "GameFontNormal")
header:SetPoint("TOP", f, "TOP", 0, -8)
header:SetText("Achievement Unlocked!")
header:SetTextColor(1, 0.82, 0)
f.header = header
local icon = f:CreateTexture(nil, "ARTWORK")
icon:SetWidth(48); icon:SetHeight(48)
icon:SetPoint("LEFT", f, "LEFT", 14, -6)
f.icon = icon
local title = f:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
title:SetPoint("TOPLEFT", icon, "TOPRIGHT", 14, -2)
title:SetPoint("RIGHT", f, "RIGHT", -10, 0)
title:SetJustifyH("LEFT")
title:SetTextColor(1, 1, 1)
f.title = title
local points = f:CreateFontString(nil, "OVERLAY", "GameFontNormal")
points:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -10, 8)
points:SetTextColor(1, 0.82, 0)
f.points = points
f.state = "hidden"
f.stateTime = 0
f:SetScript("OnUpdate", function()
local elapsed = arg1 or 0
this.stateTime = this.stateTime + elapsed
if this.state == "showing" then
local a = this.stateTime / 0.4
if a >= 1 then a = 1; this.state = "shown"; this.stateTime = 0 end
this:SetAlpha(a)
elseif this.state == "shown" then
if this.stateTime >= TOAST_DURATION then
this.state = "hiding"; this.stateTime = 0
end
elseif this.state == "hiding" then
local a = 1 - (this.stateTime / FADE_DURATION)
if a <= 0 then
a = 0
this:Hide()
this.state = "hidden"
end
this:SetAlpha(a)
end
end)
return f
end
function RelationshipsAchievements_ShowToast(ach)
if not ach then return end
if not toast then toast = CreateToast() end
toast.ach = ach
toast.title:SetText(ach.name)
toast.icon:SetTexture(ach.icon or "Interface\\Icons\\INV_Misc_QuestionMark")
if ach.points and ach.points > 0 then
toast.points:SetText(ach.points.." points")
else
toast.points:SetText("")
end
toast:SetAlpha(0)
toast:Show()
toast.state = "showing"
toast.stateTime = 0
PlaySoundFile("Sound\\Interface\\LevelUp.wav")
end