annotate Modules/OrderHall.lua @ 82:be813a9d99c0

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