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
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
|