You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
4.6 KiB

local _, addon = ...
local Banner = CreateFrame("Frame");
Banner:Hide();
addon.Banner = Banner;
local outQuart = addon.EasingFunctions.outQuart;
function Banner:Init()
-- Banner theme is always brown
-- 3-Slice Background
local pieces = {};
local file = "Interface/AddOns/DialogueUI/Art/Theme_Shared/Banner-H-Brown.png";
for i = 1, 3 do
pieces[i] = self:CreateTexture(nil, "BACKGROUND");
pieces[i]:SetTexture(file);
pieces[i]:ClearAllPoints();
end
pieces[1]:SetSize(80, 160); --Left
pieces[3]:SetSize(80, 160); --Right
pieces[2]:SetSize(352, 160); --Center
pieces[1]:SetTexCoord(0, 80/512, 0, 160/256);
pieces[2]:SetTexCoord(80/512, 430/512, 0, 160/256);
pieces[3]:SetTexCoord(430/512, 1, 0, 160/256);
pieces[1]:SetPoint("CENTER", self, "LEFT", 0, 0);
pieces[3]:SetPoint("CENTER", self, "RIGHT", 0, 0);
pieces[2]:SetPoint("TOPLEFT", pieces[1], "TOPRIGHT", 0, 0);
pieces[2]:SetPoint("BOTTOMRIGHT", pieces[3], "BOTTOMLEFT", 0, 0);
self.pieces = pieces;
self.Text = self:CreateFontString(nil, "OVERLAY", "DUIFont_Quest_Paragraph");
self.Text:SetJustifyH("CENTER");
self.Text:SetJustifyV("MIDDLE");
self.Text:SetPoint("CENTER", self, "CENTER", 0, 0);
self.Text:SetWidth(400); --maxwidth
self.Text:SetSpacing(4);
addon.ThemeUtil:SetFontColor(self.Text, "DarkBrown");
local cornerSize = 42;
self:SetCornerSize(cornerSize);
self:SetFrameStrata("FULLSCREEN_DIALOG");
self:SetScript("OnShow", self.OnShow);
self:SetScript("OnHide", self.OnHide);
self:SetScript("OnMouseDown", self.OnMouseDown);
self:SetScript("OnEnter", self.OnEnter);
self:SetScript("OnLeave", self.OnLeave);
self.Init = nil;
end
function Banner:SetCornerSize(cornerSize)
local height = 2 * cornerSize;
self.pieces[1]:SetSize(cornerSize, height);
self.pieces[3]:SetSize(cornerSize, height);
self.minWidth = 512 / 80 * cornerSize;
self.sidePadding = 112 / 80 * cornerSize;
self:SetHeight(height);
local shirnkH = 0;
local shrinkV = 24 / 80 * cornerSize;
self:SetHitRectInsets(shirnkH, shirnkH, shrinkV, shrinkV);
end
function Banner:Layout()
local width = self.Text:GetWrappedWidth() + 2 * self.sidePadding;
self:SetWidth(math.max(width, self.minWidth));
self.frameWidth = width;
local offsetY = WorldFrame:GetHeight() * 0.1;
self.frameOffsetY = -offsetY;
self.fromOffsetY = self.frameOffsetY - 40;
self:ClearAllPoints();
self:SetPoint("TOP", nil, "TOP", 0, self.frameOffsetY);
end
function Banner:OnMouseDown(button)
if button == "RightButton" then
self:Hide();
end
end
function Banner:OnEnter()
self.isMouseOver = true;
end
function Banner:OnLeave()
self.isMouseOver = nil;
end
function Banner:OnShow()
if self.onShowFunc then
self.onShowFunc(self);
end
end
function Banner:OnHide()
self:Hide();
self:SetScript("OnUpdate", nil);
self.t = nil;
self.autoFade = nil;
self.isMouseOver = nil;
end
local function FadeOut_OnUpdate(self, elapsed)
if ((self.t <= 0) and (not self.isMouseOver)) or self.t > 0 then
self.t = self.t + elapsed;
end
if self.t > 0 then
local alpha = 1 - 4 * self.t;
if alpha <= 0 then
alpha = 0;
self:SetScript("OnUpdate", nil);
self:Hide();
end
self:SetAlpha(alpha);
end
end
local ANIM_DURATION = 0.5;
local function AnimIntro_FlyUp_OnUpdate(self, elapsed)
self.t = self.t + elapsed;
if self.t < 0 then return end; --delay
local offsetY = outQuart(self.t, self.fromOffsetY, self.frameOffsetY, ANIM_DURATION);
local alpha = 4*self.t;
if alpha > 1 then
alpha = 1;
end
if self.t >= ANIM_DURATION then
offsetY = self.frameOffsetY;
self:SetScript("OnUpdate", nil);
if self.autoFade then
self.t = -5; --AutoFadeDelay
self:SetScript("OnUpdate", FadeOut_OnUpdate);
end
end
self:SetPoint("TOP", nil, "TOP", 0, offsetY);
self:SetAlpha(alpha);
end
function Banner:DisplayMessage(msg, delay, autoFade)
if self.Init then
self:Init();
end
self.Text:SetText(msg);
self:Layout();
self:Show();
self.t = (delay and -delay) or 0;
self.autoFade = autoFade and true;
self:SetScript("OnUpdate", AnimIntro_FlyUp_OnUpdate);
self:SetAlpha(0);
end
function Banner:DisplayAutoFadeMessage(msg, delay)
self:DisplayMessage(msg, delay, true);
end