Mercurial > wow > buffalo2
view Modules/OrderHall.lua @ 83:4ec4fd89fced
- order of operations regarding frame visibility checking
- interaction with WorldPlan OrderHall module
- fancy shmancy transition fades resulting from above
author | Nenue |
---|---|
date | Tue, 18 Oct 2016 01:57:02 -0400 |
parents | be813a9d99c0 |
children |
line wrap: on
line source
-- Veneer -- OrderHall.lua -- Created: 10/7/2016 10:55 PM -- %file-revision% -- VeneerWorldStateCurrencyMixin = {} VeneerWorldStateProgressMixin = {} VeneerWorldStateMixin = { maxHeight = 0, detectedFrames = {} } local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop function VeneerWorldStateMixin:Setup() --DEFAULT_CHAT_FRAME:AddMessage('Loaded') print('All:Setup()') self.modules = self.modules or {self:GetChildren()} for i, frame in ipairs(self.modules) do if frame.Setup then frame:Setup() end frame:SetScript('OnSizeChanged', function() local h = frame:GetHeight() if h > self.maxHeight then self.maxHeight = h self:SetHeight(h) print('updating max height:', h) elseif h < self.maxHeight then self:UpdateSize() end end) frame:SetScript('OnHide', function() print('|cFF0088FF'..frame:GetName()..':OnHide()') self:UpdateSize() end) frame:SetScript('OnShow', function() frame.timeLived = 0 print('|cFF0088FF'..frame:GetName()..':OnShow()') self:UpdateSize() end) function frame.ShowPanel(frame) frame:SetShown(true) self:Show() end function frame.HidePanel(frame) frame:SetShown(false) self:UpdateSize() end end self:SetOrderHallUIMods() end function VeneerWorldStateMixin:SetOrderHallUIMods() if OrderHallCommandBar then if not self.detectedFrames[OrderHallCommandBar] then self.detectedFrames[OrderHallCommandBar] = true hooksecurefunc(OrderHallCommandBar,'Show', function() self:SetOrderHallUIMods() end) hooksecurefunc(OrderHallCommandBar,'Hide', function() self:SetOrderHallUIMods() end) end OrderHallCommandBar:ClearAllPoints() OrderHallCommandBar:SetPoint('TOP') OrderHallCommandBar:SetWidth(600) OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5) OrderHallCommandBar.WorldMapButton:Hide() OrderHallCommandBar:EnableMouse(false) if OrderHallCommandBar:IsVisible() then self:SetPoint('TOP', OrderHallCommandBar, 'BOTTOM') print('anchoring to CommandBar') else self:SetPoint('TOP', UIParent, 'TOP') print('anchoring to UIParent') end else self:SetPoint('TOP', UIParent, 'TOP') print('anchoring to UIParent') end end local initialized function VeneerWorldStateMixin:OnEvent(event, arg) print(event, arg) if event == 'PLAYER_LOGIN' and not initialized then if IsLoggedIn() then initialized = true self:Setup() self:UnregisterEvent('PLAYER_LOGIN') end elseif event == 'ADDON_LOADED' then if initialized and IsAddOnLoaded('Blizzard_OrderHallUI') then self:SetOrderHallUIMods() end elseif event == 'PLAYER_ENTERING_WORLD' then self:Update() elseif event == 'PLAYER_REGEN_ENABLED' then self:SetShown(true) elseif event == 'PLAYER_REGEN_DISABLED' then self:SetShown(false) end end function VeneerWorldStateMixin:Update() self.modules = {self:GetChildren()} print('|cFFFFFF00All:Update()|r') print(self:GetChildren()) for i, frame in ipairs(self.modules) do if frame.Update then print(' |cFFFF00FF'.. frame:GetName() .. ':Update()') frame:Update() end end self:SetOrderHallUIMods() end function VeneerWorldStateMixin:UpdateSize() print('|cFFFFFF00All:UpdateSize()|r') print(self:GetChildren()) self.modules = {self:GetChildren()} self.maxHeight = 0 for i, frame in ipairs(self.modules) do print(' '..frame:GetName()..':',frame:IsShown(), frame:IsVisible(), frame:GetHeight()) if frame:IsShown() then self.maxHeight = max(self.maxHeight, frame:GetHeight()) end end if self.maxHeight == 0 then print ('height zero') self:Hide() else self:Show() print ('height update:', self.maxHeight) self:SetHeight(self.maxHeight) end end function VeneerWorldStateMixin:OnLoad () self:RegisterEvent('PLAYER_LOGIN') self:RegisterEvent('ADDON_LOADED') self:RegisterEvent('ARTIFACT_UPDATE') self:RegisterEvent('ARTIFACT_XP_UPDATE') self:RegisterEvent('PLAYER_ENTERING_WORLD') self:RegisterEvent('PLAYER_REGEN_ENABLED') self:RegisterEvent('PLAYER_REGEN_DISABLED') end function VeneerWorldStateCurrencyMixin:OnLoad () self:RegisterEvent('ZONE_CHANGED') self:RegisterEvent('CURRENCY_DISPLAY_UPDATE') self:RegisterEvent('CHAT_MSG_CURRENCY') end function VeneerWorldStateCurrencyMixin:OnEvent (event, arg) self:Update() end function VeneerWorldStateCurrencyMixin:Update() print(' Zone:', GetZoneText()) if GetZoneText() == 'Suramar' then local name, earned, texture, earnedThisWeek, weeklyMax, totalMax = GetCurrencyInfo(1155) self.Icon:SetTexture(texture) self.Label:SetFormattedText("%d / %d", earned, totalMax) self:Show() self:SetWidth(self.Icon:GetWidth() + self.Label:GetStringWidth() + 6) self:SetSize(200,16) else self:Hide() end end function VeneerWorldStateProgressMixin:OnUpdate(sinceLast) self.timeLived = (self.timeLived or 0) + sinceLast if self.timeLived >= 3 and not self.TransitionFadeOut:IsPlaying() then if not self.timeOut then self.timeOut = true self.TransitionFadeOut:Play() end end end function VeneerWorldStateProgressMixin:OnLoad() self:RegisterEvent('PLAYER_EQUIPMENT_CHANGED') self:RegisterEvent("PLAYER_XP_UPDATE"); self:RegisterEvent("UPDATE_EXHAUSTION"); self:RegisterEvent("PLAYER_LEVEL_UP"); self:RegisterEvent("PLAYER_UPDATE_RESTING"); self:RegisterEvent("ARTIFACT_UPDATE"); self:RegisterEvent("ARTIFACT_XP_UPDATE"); self:RegisterEvent("ARTIFACT_CLOSE"); self:RegisterEvent("ARTIFACT_MAX_RANKS_UPDATE"); self.progressPercent = 0 self.progressAmount = 0 self.progressMax = 1 self.progressOverflow = 0 end function VeneerWorldStateProgressMixin:Setup() self:UpdateXPGain() if self.canGainXP then self.mode = 'xp' else self.mode = 'artifact' end print('setup mode:', self.mode) end function VeneerWorldStateProgressMixin:OnEvent(event, ...) local lastMode = self.mode if event == 'PLAYER_LEVEL_UP' or event == 'ENABLE_XP_GAIN' or event == 'DISABLE_XP_GAIN' then self:UpdateXPGain() elseif event == 'ARTIFACT_XP_UPDATE' or event == 'ARTIFACT_UPDATE' then self.mode = 'artifact' elseif event == 'PLAYER_EQUIPMENT_CHANGED' then local slot, hasEquip = ... if slot == 16 then self.mode = 'artifact' lastMode = nil end elseif event == 'PLAYER_XP_UPDATE' or event == 'PLAYER_LEVEL_UP' then print('forcing to XP mode') self.mode = 'xp' end self.modeChanged = (lastMode ~= self.mode) if self.modeChanged and self:IsVisible() then print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()', event, ...) self.TransitionFadeIn:Stop() self.TransitionFadeOut:Play() else print('|cFFFFFF00'..self:GetName()..':Update()', event, ...) self:Update() end end function VeneerWorldStateProgressMixin:UpdateXPGain() self.canGainXP = (UnitLevel('player') < GetMaxPlayerLevel()) and (not IsXPUserDisabled()) if not self.canGainXP then self.ProgressBar:SetColorTexture(0.75,0.75,0.75) end end local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank function VeneerWorldStateProgressMixin:Update() local hasNewInfo = false local progressChange = false print(' current mode:', self.mode) if self.mode == 'xp' then local xp = UnitXP('player') local xpMax = UnitXPMax('player') local bonusXP = GetXPExhaustion() if xp then self.progressPercent = xp / xpMax end self.progressText = 'Level ' .. UnitLevel('player') .. ': ' .. xp .. '/' .. xpMax if bonusXP then self.ProgressBar:SetColorTexture(0, 0.5,1) self.OverflowBar:Show() self.OverflowBar:ClearAllPoints() self.OverflowBar:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', 0, 0) print(bonusXP, (xpMax - xp)) if bonusXP < (xpMax - xp) then self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPRIGHT', (bonusXP / xpMax) * self:GetWidth(), 0) else self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPRIGHT', 0, 0) end else self.OverflowBar:Hide() self.ProgressBar:SetColorTexture(0.5,0,1) end hasNewInfo = (self.progressAmount ~= xp) progressChange = (hasNewInfo and not self.modeChanged) and ((xp - self.progressAmount) / xpMax) self.progressAmount = xp self.progressMax = xpMax elseif self.mode == 'artifact' then local itemID, altItemID, name, icon, totalXP, pointsSpent = GetEquippedArtifactInfo() print(' C_AUI:', itemID, altItemID, name, icon, totalXP, pointsSpent) if itemID then local nextRankCost = GetCostForPointAtRank(pointsSpent) or 0 hasNewInfo = (self.progressAmount ~= totalXP) progressChange = (hasNewInfo and not self.modeChanged) and (((totalXP - self.progressAmount) / nextRankCost)) if totalXP > nextRankCost then self.progressPercent = 1 self.progressOverflow = totalXP - nextRankCost else self.progressPercent = totalXP / nextRankCost end self.progressText = name .. ' ('..pointsSpent .. '): '.. totalXP .. ' / ' .. nextRankCost self.ProgressBar:SetColorTexture(1,0.5,0,1) self.OverflowBar:Hide() self.progressAmount = totalXP self.progressMax = nextRankCost else self.progressAmount = 0 self.progressMax = 1 self.progressText = '' end end if self.mode then self:SetSize(600,16) if hasNewInfo then self.timeOut = nil self.timeLived = 0 if self.TransitionFadeOut:IsPlaying() then self.TransitionFadeOut:Stop() self:SetAlpha(1) end if not self:IsVisible() then self.TransitionFadeIn:Play() else self:ShowPanel() end end print(self.ProgressBG:GetWidth()) print(' Percent:', floor(self.progressPercent*100)/100, 'BarLength:', floor(self:GetWidth()* self.progressPercent), 'NewInfo:', hasNewInfo, 'IsShown:', self:IsShown()) if progressChange then print(' Render change:', progressChange) self.ProgressAdded:Show() self.ProgressAdded:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', - (self:GetWidth() * progressChange), 0) self.ProgressAdded:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', 0, 0) self.ProgressFlash:Play() end if self.progressPercent > 0 then self.ProgressBar:Show() self.ProgressBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPLEFT', self:GetWidth()* self.progressPercent , 0) self.Label:SetText(self.progressText) else self.ProgressBar:Hide() end else self:HidePanel() end self.modeChanged = nil end