annotate 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
rev   line source
Nenue@80 1 -- Veneer
Nenue@80 2 -- OrderHall.lua
Nenue@80 3 -- Created: 10/7/2016 10:55 PM
Nenue@80 4 -- %file-revision%
Nenue@80 5 --
Nenue@80 6
Nenue@80 7 VeneerWorldStateCurrencyMixin = {}
Nenue@81 8 VeneerWorldStateProgressMixin = {}
Nenue@81 9 VeneerWorldStateMixin = {
Nenue@82 10 maxHeight = 0,
Nenue@81 11 detectedFrames = {}
Nenue@81 12 }
Nenue@80 13 local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop
Nenue@80 14
Nenue@80 15 function VeneerWorldStateMixin:Setup()
Nenue@80 16 --DEFAULT_CHAT_FRAME:AddMessage('Loaded')
Nenue@81 17 print('All:Setup()')
Nenue@81 18
Nenue@81 19 self.modules = self.modules or {self:GetChildren()}
Nenue@81 20 for i, frame in ipairs(self.modules) do
Nenue@81 21 if frame.Setup then
Nenue@81 22 frame:Setup()
Nenue@81 23 end
Nenue@82 24
Nenue@82 25 frame:SetScript('OnSizeChanged', function()
Nenue@82 26 local h = frame:GetHeight()
Nenue@82 27 if h > self.maxHeight then
Nenue@82 28 self.maxHeight = h
Nenue@82 29 self:SetHeight(h)
Nenue@82 30 print('updating max height:', h)
Nenue@82 31 elseif h < self.maxHeight then
Nenue@82 32 self:UpdateSize()
Nenue@82 33 end
Nenue@82 34 end)
Nenue@82 35 frame:SetScript('OnHide', function()
Nenue@82 36 print('|cFF0088FF'..frame:GetName()..':OnHide()')
Nenue@82 37 self:UpdateSize()
Nenue@82 38 end)
Nenue@82 39 frame:SetScript('OnShow', function()
Nenue@82 40 frame.timeLived = 0
Nenue@82 41 print('|cFF0088FF'..frame:GetName()..':OnShow()')
Nenue@82 42 self:UpdateSize()
Nenue@82 43 end)
Nenue@82 44
Nenue@82 45 function frame.ShowPanel(frame)
Nenue@82 46 frame:SetShown(true)
Nenue@82 47 self:Show()
Nenue@82 48 end
Nenue@83 49 function frame.HidePanel(frame)
Nenue@83 50 frame:SetShown(false)
Nenue@83 51 self:UpdateSize()
Nenue@83 52 end
Nenue@81 53 end
Nenue@82 54 self:SetOrderHallUIMods()
Nenue@80 55 end
Nenue@80 56
Nenue@82 57 function VeneerWorldStateMixin:SetOrderHallUIMods()
Nenue@81 58 if OrderHallCommandBar then
Nenue@81 59 if not self.detectedFrames[OrderHallCommandBar] then
Nenue@81 60 self.detectedFrames[OrderHallCommandBar] = true
Nenue@81 61 hooksecurefunc(OrderHallCommandBar,'Show', function()
Nenue@82 62 self:SetOrderHallUIMods()
Nenue@82 63 end)
Nenue@82 64 hooksecurefunc(OrderHallCommandBar,'Hide', function()
Nenue@82 65 self:SetOrderHallUIMods()
Nenue@81 66 end)
Nenue@81 67 end
Nenue@81 68
Nenue@81 69
Nenue@81 70 OrderHallCommandBar:ClearAllPoints()
Nenue@81 71 OrderHallCommandBar:SetPoint('TOP')
Nenue@81 72 OrderHallCommandBar:SetWidth(600)
Nenue@81 73 OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5)
Nenue@81 74 OrderHallCommandBar.WorldMapButton:Hide()
Nenue@81 75 OrderHallCommandBar:EnableMouse(false)
Nenue@82 76
Nenue@82 77 if OrderHallCommandBar:IsVisible() then
Nenue@82 78 self:SetPoint('TOP', OrderHallCommandBar, 'BOTTOM')
Nenue@82 79 print('anchoring to CommandBar')
Nenue@82 80 else
Nenue@82 81 self:SetPoint('TOP', UIParent, 'TOP')
Nenue@82 82 print('anchoring to UIParent')
Nenue@82 83 end
Nenue@82 84 else
Nenue@82 85 self:SetPoint('TOP', UIParent, 'TOP')
Nenue@82 86 print('anchoring to UIParent')
Nenue@81 87 end
Nenue@80 88 end
Nenue@80 89 local initialized
Nenue@80 90 function VeneerWorldStateMixin:OnEvent(event, arg)
Nenue@80 91 print(event, arg)
Nenue@81 92
Nenue@81 93 if event == 'PLAYER_LOGIN' and not initialized then
Nenue@81 94 if IsLoggedIn() then
Nenue@81 95 initialized = true
Nenue@80 96 self:Setup()
Nenue@81 97 self:UnregisterEvent('PLAYER_LOGIN')
Nenue@81 98 end
Nenue@82 99 elseif event == 'ADDON_LOADED' then
Nenue@82 100 if initialized and IsAddOnLoaded('Blizzard_OrderHallUI') then
Nenue@82 101 self:SetOrderHallUIMods()
Nenue@82 102 end
Nenue@82 103 elseif event == 'PLAYER_ENTERING_WORLD' then
Nenue@80 104 self:Update()
Nenue@81 105 elseif event == 'PLAYER_REGEN_ENABLED' then
Nenue@83 106 self:SetShown(true)
Nenue@81 107 elseif event == 'PLAYER_REGEN_DISABLED' then
Nenue@83 108 self:SetShown(false)
Nenue@80 109 end
Nenue@80 110 end
Nenue@80 111
Nenue@80 112 function VeneerWorldStateMixin:Update()
Nenue@82 113 self.modules = {self:GetChildren()}
Nenue@80 114 print('|cFFFFFF00All:Update()|r')
Nenue@82 115 print(self:GetChildren())
Nenue@82 116 for i, frame in ipairs(self.modules) do
Nenue@82 117 if frame.Update then
Nenue@82 118 print(' |cFFFF00FF'.. frame:GetName() .. ':Update()')
Nenue@82 119 frame:Update()
Nenue@82 120 end
Nenue@82 121 end
Nenue@82 122 self:SetOrderHallUIMods()
Nenue@82 123 end
Nenue@82 124
Nenue@82 125 function VeneerWorldStateMixin:UpdateSize()
Nenue@82 126 print('|cFFFFFF00All:UpdateSize()|r')
Nenue@82 127 print(self:GetChildren())
Nenue@82 128 self.modules = {self:GetChildren()}
Nenue@81 129 self.maxHeight = 0
Nenue@81 130 for i, frame in ipairs(self.modules) do
Nenue@82 131 print(' '..frame:GetName()..':',frame:IsShown(), frame:IsVisible(), frame:GetHeight())
Nenue@82 132 if frame:IsShown() then
Nenue@82 133 self.maxHeight = max(self.maxHeight, frame:GetHeight())
Nenue@80 134 end
Nenue@80 135 end
Nenue@82 136 if self.maxHeight == 0 then
Nenue@82 137 print ('height zero')
Nenue@82 138 self:Hide()
Nenue@82 139 else
Nenue@82 140 self:Show()
Nenue@82 141 print ('height update:', self.maxHeight)
Nenue@82 142 self:SetHeight(self.maxHeight)
Nenue@82 143 end
Nenue@82 144
Nenue@80 145 end
Nenue@80 146
Nenue@80 147
Nenue@80 148
Nenue@80 149 function VeneerWorldStateMixin:OnLoad ()
Nenue@81 150 self:RegisterEvent('PLAYER_LOGIN')
Nenue@80 151 self:RegisterEvent('ADDON_LOADED')
Nenue@80 152 self:RegisterEvent('ARTIFACT_UPDATE')
Nenue@80 153 self:RegisterEvent('ARTIFACT_XP_UPDATE')
Nenue@80 154 self:RegisterEvent('PLAYER_ENTERING_WORLD')
Nenue@81 155 self:RegisterEvent('PLAYER_REGEN_ENABLED')
Nenue@81 156 self:RegisterEvent('PLAYER_REGEN_DISABLED')
Nenue@80 157 end
Nenue@80 158
Nenue@80 159 function VeneerWorldStateCurrencyMixin:OnLoad ()
Nenue@80 160
Nenue@80 161 self:RegisterEvent('ZONE_CHANGED')
Nenue@80 162 self:RegisterEvent('CURRENCY_DISPLAY_UPDATE')
Nenue@80 163 self:RegisterEvent('CHAT_MSG_CURRENCY')
Nenue@80 164
Nenue@80 165 end
Nenue@80 166
Nenue@80 167 function VeneerWorldStateCurrencyMixin:OnEvent (event, arg)
Nenue@80 168 self:Update()
Nenue@80 169 end
Nenue@80 170
Nenue@80 171
Nenue@80 172 function VeneerWorldStateCurrencyMixin:Update()
Nenue@81 173
Nenue@82 174 print(' Zone:', GetZoneText())
Nenue@81 175 if GetZoneText() == 'Suramar' then
Nenue@80 176 local name, earned, texture, earnedThisWeek, weeklyMax, totalMax = GetCurrencyInfo(1155)
Nenue@80 177
Nenue@80 178 self.Icon:SetTexture(texture)
Nenue@80 179 self.Label:SetFormattedText("%d / %d", earned, totalMax)
Nenue@80 180 self:Show()
Nenue@80 181 self:SetWidth(self.Icon:GetWidth() + self.Label:GetStringWidth() + 6)
Nenue@82 182 self:SetSize(200,16)
Nenue@80 183 else
Nenue@80 184 self:Hide()
Nenue@80 185 end
Nenue@81 186
Nenue@82 187
Nenue@81 188 end
Nenue@81 189
Nenue@82 190 function VeneerWorldStateProgressMixin:OnUpdate(sinceLast)
Nenue@82 191 self.timeLived = (self.timeLived or 0) + sinceLast
Nenue@82 192 if self.timeLived >= 3 and not self.TransitionFadeOut:IsPlaying() then
Nenue@82 193 if not self.timeOut then
Nenue@82 194 self.timeOut = true
Nenue@82 195 self.TransitionFadeOut:Play()
Nenue@82 196 end
Nenue@82 197 end
Nenue@82 198 end
Nenue@82 199
Nenue@82 200
Nenue@81 201 function VeneerWorldStateProgressMixin:OnLoad()
Nenue@82 202 self:RegisterEvent('PLAYER_EQUIPMENT_CHANGED')
Nenue@81 203
Nenue@82 204 self:RegisterEvent("PLAYER_XP_UPDATE");
Nenue@82 205 self:RegisterEvent("UPDATE_EXHAUSTION");
Nenue@82 206 self:RegisterEvent("PLAYER_LEVEL_UP");
Nenue@82 207 self:RegisterEvent("PLAYER_UPDATE_RESTING");
Nenue@82 208
Nenue@82 209 self:RegisterEvent("ARTIFACT_UPDATE");
Nenue@82 210 self:RegisterEvent("ARTIFACT_XP_UPDATE");
Nenue@82 211 self:RegisterEvent("ARTIFACT_CLOSE");
Nenue@82 212 self:RegisterEvent("ARTIFACT_MAX_RANKS_UPDATE");
Nenue@82 213
Nenue@82 214 self.progressPercent = 0
Nenue@82 215 self.progressAmount = 0
Nenue@82 216 self.progressMax = 1
Nenue@82 217 self.progressOverflow = 0
Nenue@81 218 end
Nenue@81 219
Nenue@81 220 function VeneerWorldStateProgressMixin:Setup()
Nenue@81 221 self:UpdateXPGain()
Nenue@82 222
Nenue@82 223 if self.canGainXP then
Nenue@81 224 self.mode = 'xp'
Nenue@81 225 else
Nenue@81 226 self.mode = 'artifact'
Nenue@81 227 end
Nenue@81 228 print('setup mode:', self.mode)
Nenue@81 229 end
Nenue@81 230
Nenue@82 231 function VeneerWorldStateProgressMixin:OnEvent(event, ...)
Nenue@82 232 local lastMode = self.mode
Nenue@82 233 if event == 'PLAYER_LEVEL_UP' or event == 'ENABLE_XP_GAIN' or event == 'DISABLE_XP_GAIN' then
Nenue@81 234 self:UpdateXPGain()
Nenue@81 235 elseif event == 'ARTIFACT_XP_UPDATE' or event == 'ARTIFACT_UPDATE' then
Nenue@81 236 self.mode = 'artifact'
Nenue@82 237
Nenue@82 238 elseif event == 'PLAYER_EQUIPMENT_CHANGED' then
Nenue@82 239 local slot, hasEquip = ...
Nenue@82 240 if slot == 16 then
Nenue@82 241 self.mode = 'artifact'
Nenue@82 242 lastMode = nil
Nenue@82 243 end
Nenue@82 244 elseif event == 'PLAYER_XP_UPDATE' or event == 'PLAYER_LEVEL_UP' then
Nenue@82 245 print('forcing to XP mode')
Nenue@81 246 self.mode = 'xp'
Nenue@81 247 end
Nenue@82 248 self.modeChanged = (lastMode ~= self.mode)
Nenue@82 249 if self.modeChanged and self:IsVisible() then
Nenue@82 250 print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()', event, ...)
Nenue@82 251 self.TransitionFadeIn:Stop()
Nenue@82 252 self.TransitionFadeOut:Play()
Nenue@82 253 else
Nenue@82 254 print('|cFFFFFF00'..self:GetName()..':Update()', event, ...)
Nenue@82 255 self:Update()
Nenue@82 256 end
Nenue@81 257 end
Nenue@81 258 function VeneerWorldStateProgressMixin:UpdateXPGain()
Nenue@82 259 self.canGainXP = (UnitLevel('player') < GetMaxPlayerLevel()) and (not IsXPUserDisabled())
Nenue@82 260 if not self.canGainXP then
Nenue@81 261 self.ProgressBar:SetColorTexture(0.75,0.75,0.75)
Nenue@81 262 end
Nenue@81 263 end
Nenue@81 264
Nenue@81 265 local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo
Nenue@81 266 local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank
Nenue@81 267 function VeneerWorldStateProgressMixin:Update()
Nenue@82 268 local hasNewInfo = false
Nenue@82 269 local progressChange = false
Nenue@82 270 print(' current mode:', self.mode)
Nenue@81 271
Nenue@81 272
Nenue@81 273 if self.mode == 'xp' then
Nenue@81 274 local xp = UnitXP('player')
Nenue@81 275 local xpMax = UnitXPMax('player')
Nenue@81 276 local bonusXP = GetXPExhaustion()
Nenue@81 277 if xp then
Nenue@81 278 self.progressPercent = xp / xpMax
Nenue@81 279 end
Nenue@82 280
Nenue@82 281 self.progressText = 'Level ' .. UnitLevel('player') .. ': ' .. xp .. '/' .. xpMax
Nenue@82 282
Nenue@82 283 if bonusXP then
Nenue@82 284 self.ProgressBar:SetColorTexture(0, 0.5,1)
Nenue@82 285 self.OverflowBar:Show()
Nenue@82 286 self.OverflowBar:ClearAllPoints()
Nenue@82 287 self.OverflowBar:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', 0, 0)
Nenue@82 288 print(bonusXP, (xpMax - xp))
Nenue@82 289 if bonusXP < (xpMax - xp) then
Nenue@82 290
Nenue@82 291 self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPRIGHT', (bonusXP / xpMax) * self:GetWidth(), 0)
Nenue@82 292 else
Nenue@82 293 self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPRIGHT', 0, 0)
Nenue@82 294 end
Nenue@82 295 else
Nenue@82 296 self.OverflowBar:Hide()
Nenue@82 297 self.ProgressBar:SetColorTexture(0.5,0,1)
Nenue@82 298 end
Nenue@82 299 hasNewInfo = (self.progressAmount ~= xp)
Nenue@82 300
Nenue@83 301 progressChange = (hasNewInfo and not self.modeChanged) and ((xp - self.progressAmount) / xpMax)
Nenue@82 302
Nenue@82 303
Nenue@82 304 self.progressAmount = xp
Nenue@82 305 self.progressMax = xpMax
Nenue@81 306 elseif self.mode == 'artifact' then
Nenue@81 307
Nenue@81 308 local itemID, altItemID, name, icon, totalXP, pointsSpent = GetEquippedArtifactInfo()
Nenue@82 309 print(' C_AUI:', itemID, altItemID, name, icon, totalXP, pointsSpent)
Nenue@82 310
Nenue@82 311 if itemID then
Nenue@82 312 local nextRankCost = GetCostForPointAtRank(pointsSpent) or 0
Nenue@82 313 hasNewInfo = (self.progressAmount ~= totalXP)
Nenue@83 314 progressChange = (hasNewInfo and not self.modeChanged) and (((totalXP - self.progressAmount) / nextRankCost))
Nenue@82 315
Nenue@82 316 if totalXP > nextRankCost then
Nenue@82 317 self.progressPercent = 1
Nenue@82 318 self.progressOverflow = totalXP - nextRankCost
Nenue@82 319 else
Nenue@82 320 self.progressPercent = totalXP / nextRankCost
Nenue@82 321 end
Nenue@82 322
Nenue@82 323 self.progressText = name .. ' ('..pointsSpent .. '): '.. totalXP .. ' / ' .. nextRankCost
Nenue@82 324
Nenue@82 325 self.ProgressBar:SetColorTexture(1,0.5,0,1)
Nenue@82 326 self.OverflowBar:Hide()
Nenue@82 327
Nenue@82 328
Nenue@82 329 self.progressAmount = totalXP
Nenue@82 330 self.progressMax = nextRankCost
Nenue@82 331 else
Nenue@82 332 self.progressAmount = 0
Nenue@82 333 self.progressMax = 1
Nenue@82 334 self.progressText = ''
Nenue@82 335 end
Nenue@82 336 end
Nenue@82 337
Nenue@82 338 if self.mode then
Nenue@82 339 self:SetSize(600,16)
Nenue@82 340 if hasNewInfo then
Nenue@82 341 self.timeOut = nil
Nenue@82 342 self.timeLived = 0
Nenue@82 343 if self.TransitionFadeOut:IsPlaying() then
Nenue@82 344 self.TransitionFadeOut:Stop()
Nenue@82 345 self:SetAlpha(1)
Nenue@82 346 end
Nenue@82 347 if not self:IsVisible() then
Nenue@82 348 self.TransitionFadeIn:Play()
Nenue@82 349 else
Nenue@82 350 self:ShowPanel()
Nenue@82 351 end
Nenue@82 352
Nenue@81 353 end
Nenue@81 354
Nenue@82 355 print(self.ProgressBG:GetWidth())
Nenue@82 356 print(' Percent:', floor(self.progressPercent*100)/100, 'BarLength:', floor(self:GetWidth()* self.progressPercent), 'NewInfo:', hasNewInfo, 'IsShown:', self:IsShown())
Nenue@81 357
Nenue@81 358
Nenue@82 359 if progressChange then
Nenue@82 360 print(' Render change:', progressChange)
Nenue@82 361 self.ProgressAdded:Show()
Nenue@82 362 self.ProgressAdded:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', - (self:GetWidth() * progressChange), 0)
Nenue@82 363 self.ProgressAdded:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', 0, 0)
Nenue@82 364 self.ProgressFlash:Play()
Nenue@81 365 end
Nenue@81 366
Nenue@82 367
Nenue@82 368 if self.progressPercent > 0 then
Nenue@82 369 self.ProgressBar:Show()
Nenue@82 370 self.ProgressBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPLEFT', self:GetWidth()* self.progressPercent , 0)
Nenue@82 371
Nenue@82 372 self.Label:SetText(self.progressText)
Nenue@82 373 else
Nenue@82 374 self.ProgressBar:Hide()
Nenue@82 375 end
Nenue@81 376 else
Nenue@83 377 self:HidePanel()
Nenue@81 378 end
Nenue@81 379
Nenue@82 380 self.modeChanged = nil
Nenue@80 381 end