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.

237 lines
8.0 KiB

local _, addon = ...
local IsSpecializationActivateSpell = IsSpecializationActivateSpell;
local function IsTalentChaningSpell(spellID)
return spellID and IsSpecializationActivateSpell(spellID) or (spellID == 384255); --COMMIT_COMBAT_TRAIT_CONFIG_CHANGES_SPELL_ID
end
local PIXEL;
local FONT_PIXEL_HEIGHT = 16;
local BAR_PIXEL_HEIGHT_SMALL = 28;
local BAR_PIXEL_WDITH_SMALL = 192;
local LoadingBar;
local TalentTreeLoadingBarUtil = {};
addon.TalentTreeLoadingBarUtil = TalentTreeLoadingBarUtil;
function TalentTreeLoadingBarUtil:Init()
if not LoadingBar then
LoadingBar = CreateFrame("Frame", nil, NarciMiniTalentTree, "NarciTalentTreeLoadingBarTemplate");
local pixel = NarciAPI.GetPixelForWidget(NarciMiniTalentTree);
LoadingBar:UpdatePixel(pixel);
end
end
function TalentTreeLoadingBarUtil:SetFromSpecButton(specButton)
self:Init();
LoadingBar:SetParentObject(specButton, "spec");
LoadingBar.ClipFrame.Name:SetText(specButton.Name:GetText());
LoadingBar:OnInitiateCasting();
end
function TalentTreeLoadingBarUtil:SetFromLoadoutToggle(toggle)
self:Init();
LoadingBar:SetParentObject(toggle, "loadout");
LoadingBar.ClipFrame.Name:SetText("Activating");
LoadingBar:OnInitiateCasting();
end
function TalentTreeLoadingBarUtil:IsBarVisible()
return LoadingBar and LoadingBar:IsShown()
end
function TalentTreeLoadingBarUtil:HideBar()
if LoadingBar and not LoadingBar.isHidding then
LoadingBar:Hide();
end
end
NarciTalentTreeLoadingBarMixin = {};
function NarciTalentTreeLoadingBarMixin:UpdatePixel(px)
PIXEL = px;
local font = self.ClipFrame.Name:GetFont();
self.ClipFrame.Name:SetFont(font, FONT_PIXEL_HEIGHT * px, "");
self.ClipFrame.BlackLine:SetWidth(2*px);
self.ClipFrame.BlackLine:SetPoint("TOPRIGHT", self.ClipFrame, "TOPRIGHT", -2*px, 0);
self.ClipFrame.BlackLine:SetPoint("BOTTOMRIGHT", self.ClipFrame, "BOTTOMRIGHT", -2*px, 0);
self.FinishingLine:SetWidth(2*px);
end
function NarciTalentTreeLoadingBarMixin:SetParentObject(anchorTo, mode)
if mode == "spec" then
self:ClearAllPoints();
self:SetPoint("TOPLEFT", anchorTo, "TOPLEFT", 0, 0);
self:SetPoint("BOTTOMRIGHT", anchorTo, "BOTTOMRIGHT", 0, 0);
if mode ~= self.mode then
self.mode = mode;
self:SetFullWidth( anchorTo:GetWidth(), anchorTo:GetHeight() );
self.FinishingLine:Hide();
self.ClipFrame.Name:ClearAllPoints();
self.ClipFrame.Name:SetPoint("LEFT", self, "LEFT", 10, 0);
self.ClipFrame.Name:SetJustifyH("LEFT");
end
elseif mode == "loadout" then
self:ClearAllPoints();
self:SetPoint("CENTER", anchorTo, "CENTER", 0, 0);
if mode ~= self.mode then
self.mode = mode;
self:SetFullWidth(BAR_PIXEL_WDITH_SMALL, BAR_PIXEL_HEIGHT_SMALL, true);
self.FinishingLine:Show();
self.ClipFrame.Name:ClearAllPoints();
self.ClipFrame.Name:SetPoint("CENTER", self, "CENTER", 0, 0);
self.ClipFrame.Name:SetJustifyH("CENTER");
end
end
self:SetFrameLevel(anchorTo:GetFrameLevel() + 10);
end
function NarciTalentTreeLoadingBarMixin:SetFullWidth(width, height, isPixelSize)
local barWidth, barHeight;
local pixelW, pixelH;
if isPixelSize then
barWidth = width * PIXEL;
barHeight = height * PIXEL;
pixelW = width;
pixelH = height;
else
barWidth = width;
barHeight = height;
pixelW = width / PIXEL;
pixelH = height / PIXEL;
end
self:SetSize(barWidth, barHeight);
self.barPixelWidth = pixelW;
self.translationRange = pixelW - 256;
if self.translationRange < 0 then
self.translationRange = 0;
end
self.fullWidth = barWidth;
self.coordTop = (1 - (pixelH / 64))/2;
self.ClipFrame.Background:SetTexCoord((256 - pixelW)/256, 1, self.coordTop, 1-self.coordTop);
end
function NarciTalentTreeLoadingBarMixin:ListenEvents(state)
if state then
self:RegisterUnitEvent("UNIT_SPELLCAST_START", "player");
self:RegisterUnitEvent("UNIT_SPELLCAST_FAILED", "player");
self:RegisterUnitEvent("UNIT_SPELLCAST_INTERRUPTED", "player");
else
self:UnregisterEvent("UNIT_SPELLCAST_START");
self:UnregisterEvent("UNIT_SPELLCAST_FAILED");
self:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED");
end
end
function NarciTalentTreeLoadingBarMixin:OnHide()
self:ListenEvents(false);
self:Hide();
self:SetScript("OnUpdate", nil);
self.isHidding = nil;
end
local function SetBarTexCoord(texture, progress, translationRange, barPixelWidth, coordTop)
texture:SetTexCoord(translationRange*(1-progress)/256, (256*(1-progress) + progress * barPixelWidth)/256, coordTop, 1-coordTop);
end
local function LoadingBar_OnHold_OnUpdate(self, elapsed)
--prevent frame from being shown indefinitely when something unexpected happens (connection issue, failed to use loadout, etc.)
self.t = self.t + elapsed;
if self.t > 1 then
self:Hide();
self:SetScript("OnUpdate", nil);
end
end
local function LoadingBar_Loading_Update(self, elapsed)
self.t = self.t + elapsed;
self.p = self.t / self.d;
if self.p > 1 then
self.p = 1;
self:SetScript("OnUpdate", nil);
end
self.ClipFrame:SetWidth( self.p * self.fullWidth );
SetBarTexCoord(self.ClipFrame.Background, self.p, self.translationRange, self.barPixelWidth, self.coordTop);
end
local function LoadingBar_Interrupted_OnUpdate(self, elapsed)
self.t = self.t + elapsed;
self.p = self.p + elapsed*8;
if self.p > 1 then
self.p = 1;
end
self.ClipFrame:SetWidth( self.p * self.fullWidth );
SetBarTexCoord(self.ClipFrame.Background, 1, self.translationRange, self.barPixelWidth, self.coordTop);
if self.t > 0 then
local a = 1 - 5*self.t;
if a < 0 then
self:SetScript("OnUpdate", nil);
self:Hide();
else
self:SetAlpha(a);
end
end
end
function NarciTalentTreeLoadingBarMixin:OnInitiateCasting()
self:ListenEvents(true);
self:SetAlpha(0);
self:Show();
self.t = 0;
self.isHidding = nil;
self:SetScript("OnUpdate", LoadingBar_OnHold_OnUpdate);
self.ClipFrame.Background:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\ProgressBarBackground");
end
function NarciTalentTreeLoadingBarMixin:OnInterrupted()
self.ClipFrame.Background:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\TalentTree\\ProgressBarBackgroundRed");
SetBarTexCoord(self.ClipFrame.Background, 1, 0, self.barPixelWidth, self.coordTop);
self.ClipFrame:SetWidth(self.fullWidth);
self.ClipFrame.Name:SetText(INTERRUPTED);
self.t = -0.5;
if (not self.p) or self.p == 0 then
self:SetScript("OnUpdate", nil);
self:Hide();
else
self:SetScript("OnUpdate", LoadingBar_Interrupted_OnUpdate);
self.isHidding = true;
end
end
function NarciTalentTreeLoadingBarMixin:OnEvent(event, ...)
if event == "UNIT_SPELLCAST_START" then
local spellID = select(3, ...);
if IsTalentChaningSpell(spellID) then
self:UnregisterEvent(event);
local _, _, _, startTime, endTime = UnitCastingInfo("player");
local duration = (endTime - startTime)/1000;
if duration ~= 0 then
self.t = 0;
self.d = duration;
self:SetAlpha(1);
self:SetScript("OnUpdate", LoadingBar_Loading_Update);
end
end
elseif event == "UNIT_SPELLCAST_FAILED" or event == "UNIT_SPELLCAST_INTERRUPTED" then
local cancelledSpellID = select(3, ...);
if IsTalentChaningSpell(cancelledSpellID) then
self:OnInterrupted();
end
end
end