comparison Modules/WorldState.lua @ 87:27db212af783

- polished position management code; goes something like: - core:Reanchor() to soft fix all anchors - module:Reanchor() or core:InternalReanchor(module) to position a specific set of neighboring frames
author Nenue
date Wed, 19 Oct 2016 16:51:17 -0400
parents 1196b8175674
children b107b4df7eb6
comparison
equal deleted inserted replaced
86:48182978d1c6 87:27db212af783
2 -- WorldState.lua 2 -- WorldState.lua
3 -- Created: 10/7/2016 10:55 PM 3 -- Created: 10/7/2016 10:55 PM
4 -- %file-revision% 4 -- %file-revision%
5 -- 5 --
6 6
7 VeneerWorldStateCurrencyMixin = {} 7 local WorldStateBlockMixin = {}
8 VeneerOrderHallMixin = {
9 anchorPoint = 'TOP',
10 }
11 VeneerWorldStateCurrencyMixin = {
12 }
8 VeneerWorldStateProgressMixin = { 13 VeneerWorldStateProgressMixin = {
9 keepOpen = true 14 keepOpen = true
10 } 15 }
11 VeneerWorldStateMixin = { 16 VeneerWorldStateMixin = {
12 maxHeight = 0, 17 maxHeight = 0,
13 detectedFrames = {} 18 detectedFrames = {},
19 anchorPoint = 'TOP',
14 } 20 }
15 local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop 21 local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop
22
23 function VeneerWorldStateMixin:Reset()
24 for i, frame in ipairs(self.modules) do
25 if frame.Reset then
26 frame:Reset()
27 end
28 end
29 self:Update()
30 end
16 31
17 function VeneerWorldStateMixin:Setup() 32 function VeneerWorldStateMixin:Setup()
18 --DEFAULT_CHAT_FRAME:AddMessage('Loaded') 33 --DEFAULT_CHAT_FRAME:AddMessage('Loaded')
19 print('|cFFFFFF00'..self:GetName()..'|r:Setup()') 34 print('|cFFFFFF00'..self:GetName()..'|r:Setup()')
20 35
24 if frame.Setup then 39 if frame.Setup then
25 print('--'.. frame:GetName()..':Setup()') 40 print('--'.. frame:GetName()..':Setup()')
26 frame:Setup() 41 frame:Setup()
27 end 42 end
28 43
29 frame:SetScript('OnSizeChanged', function() 44
30 local h = frame:GetHeight() 45 for k,v in pairs(WorldStateBlockMixin) do
31 if h > self.maxHeight then 46 if not frame[k] then
32 self.maxHeight = h 47 frame[k] = v
33 self:SetHeight(h) 48 if k:match('^On') then
34 print('updating max height:', h) 49 frame:SetScript(k, v)
35 elseif h < self.maxHeight then 50 end
36 self:UpdateSize() 51 end
37 end 52 end
38 end) 53
39 frame:SetScript('OnHide', function() 54 end
40 print('|cFF0088FF'..frame:GetName()..':OnHide()')
41 self:UpdateSize()
42 end)
43 frame:SetScript('OnShow', function()
44 frame.timeLived = 0
45 print('|cFF0088FF'..frame:GetName()..':OnShow()')
46 self:UpdateSize()
47 end)
48
49 function frame.ShowPanel(frame)
50 frame:SetShown(true)
51 self:Show()
52 end
53 function frame.HidePanel(frame)
54 frame:SetShown(false)
55 self:UpdateSize()
56 end
57 end
58 self:SetOrderHallUIMods()
59 self:UnregisterEvent('PLAYER_LOGIN') 55 self:UnregisterEvent('PLAYER_LOGIN')
60 end 56 end
61 57
62 function VeneerWorldStateMixin:SetOrderHallUIMods() 58 function VeneerWorldStateMixin:SetOrderHallUIMods()
63 if OrderHallCommandBar then 59 print('|cFFFF4400remove me', debugstack())
64 if not self.detectedFrames[OrderHallCommandBar] then
65 self.detectedFrames[OrderHallCommandBar] = true
66 hooksecurefunc(OrderHallCommandBar,'Show', function()
67 self:SetOrderHallUIMods()
68 end)
69 hooksecurefunc(OrderHallCommandBar,'Hide', function()
70 self:SetOrderHallUIMods()
71 self:UpdateSize()
72 end)
73 end
74
75
76 OrderHallCommandBar:ClearAllPoints()
77 OrderHallCommandBar:SetPoint('TOP')
78 OrderHallCommandBar:SetWidth(600)
79 OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5)
80 OrderHallCommandBar.WorldMapButton:Hide()
81 OrderHallCommandBar:EnableMouse(false)
82
83 if OrderHallCommandBar:IsVisible() then
84 self:SetPoint('TOP', OrderHallCommandBar, 'BOTTOM')
85 print('anchoring to CommandBar')
86 else
87 self:SetPoint('TOP', UIParent, 'TOP')
88 print('anchoring to UIParent')
89 end
90
91 self:UnregisterEvent('ADDON_LOADED')
92 else
93 self:SetPoint('TOP', UIParent, 'TOP')
94 print('anchoring to UIParent')
95 end
96 end 60 end
97 61
98 62
99 function VeneerWorldStateMixin:OnLoad () 63 function VeneerWorldStateMixin:OnLoad ()
64 self.modules = {self:GetChildren()}
100 print('|cFFFFFF00'..self:GetName()..'|r!') 65 print('|cFFFFFF00'..self:GetName()..'|r!')
101 self:RegisterEvent('PLAYER_LOGIN')
102 self:RegisterEvent('ADDON_LOADED')
103 self:RegisterEvent('ARTIFACT_UPDATE') 66 self:RegisterEvent('ARTIFACT_UPDATE')
104 self:RegisterEvent('ARTIFACT_XP_UPDATE') 67 self:RegisterEvent('ARTIFACT_XP_UPDATE')
105 self:RegisterEvent('PLAYER_ENTERING_WORLD') 68 self:RegisterEvent('PLAYER_ENTERING_WORLD')
106 self:RegisterEvent('PLAYER_REGEN_ENABLED') 69 self:RegisterEvent('PLAYER_REGEN_ENABLED')
107 self:RegisterEvent('PLAYER_REGEN_DISABLED') 70 self:RegisterEvent('PLAYER_REGEN_DISABLED')
71 self:RegisterEvent('ZONE_CHANGED_NEW_AREA')
72 self:RegisterEvent('ADDON_LOADED')
73 Veneer:AddHandler(self, self.anchorPoint, true)
74 SLASH_VENEERWORLDSTATE1 = "/vws"
75 SLASH_VENEERWORLDSTATE2 = "/worldstate"
76 SlashCmdList.VENEERWORLDSTATE = function()
77 self:Reset()
78 end
108 end 79 end
109 80
110 function VeneerWorldStateMixin:OnEvent(event, arg) 81 function VeneerWorldStateMixin:OnEvent(event, arg)
111 print(event, arg) 82 print(event, arg)
112 83
113 if event == 'PLAYER_LOGIN' then 84 if event == 'PLAYER_LOGIN' then
114 if IsLoggedIn() and not self.initialized then 85 if IsLoggedIn() and not self.initialized then
115 self.initialized = true 86 self.initialized = true
116 self:Setup() 87 self:Setup()
117 end 88 end
118 elseif event == 'ADDON_LOADED' then 89 elseif event == 'ZONE_CHANGED_NEW_AREA' or event == 'ADDON_LOADED' then
119 if self.initialized and IsAddOnLoaded('Blizzard_OrderHallUI') then 90 if OrderHallCommandBar then
120 self:SetOrderHallUIMods() 91 self:UnregisterEvent('ZONE_CHANGED_NEW_AREA')
92 self:UnregisterEvent('ADDON_LOADED')
93 Veneer:AddHandler(VeneerOrderHallHandler, 'TOP', true)
121 end 94 end
122 elseif event == 'PLAYER_ENTERING_WORLD' then 95 elseif event == 'PLAYER_ENTERING_WORLD' then
123 self:Update() 96 self:Update()
124 elseif event == 'PLAYER_REGEN_ENABLED' then 97 elseif event == 'PLAYER_REGEN_ENABLED' then
125 self:SetShown(true) 98 self:SetShown(true)
127 self:SetShown(false) 100 self:SetShown(false)
128 end 101 end
129 end 102 end
130 103
131 function VeneerWorldStateMixin:Update() 104 function VeneerWorldStateMixin:Update()
132 self.modules = {self:GetChildren()}
133 print('|cFFFFFF00All:Update()|r') 105 print('|cFFFFFF00All:Update()|r')
134 print(self:GetChildren())
135 for i, frame in ipairs(self.modules) do 106 for i, frame in ipairs(self.modules) do
136 if frame.Update then 107 if frame.Update then
137 print(' |cFFFF00FF'.. frame:GetName() .. ':Update()') 108 print(' |cFFFF00FF'.. frame:GetName() .. ':Update()')
138 frame:Update() 109 frame:Update()
139 end 110 end
140 end 111 end
141 self:SetOrderHallUIMods() 112 end
142 end 113
143 114 function VeneerWorldStateMixin:Reanchor(isUpdate)
144 function VeneerWorldStateMixin:UpdateSize() 115 print('|cFFFFFF00'..self:GetName()..':Reanchor()|r', #self.modules, 'blocks')
145 print('|cFFFFFF00All:UpdateSize()|r')
146 print(self:GetChildren())
147 self.modules = {self:GetChildren()}
148 self.maxHeight = 0 116 self.maxHeight = 0
149 for i, frame in ipairs(self.modules) do 117 for i, frame in ipairs(self.modules) do
150 print(' '..frame:GetName()..':',frame:IsShown(), frame:IsVisible(), frame:GetHeight()) 118 print(' '..frame:GetName()..':',frame:IsShown(), frame:IsVisible(), frame:GetHeight())
151 if frame:IsShown() then 119 if frame:IsShown() then
152 self.maxHeight = max(self.maxHeight, frame:GetHeight()) 120 self.maxHeight = max(self.maxHeight, frame:GetHeight())
153 end 121 end
154 end 122 end
155 if self.maxHeight == 0 then 123 if self.maxHeight == 0 then
156 print ('height zero') 124 print (' hiding because there are no blocks')
157 self:Hide() 125 self:Hide()
158 else 126 else
159 self:Show() 127 self:Show()
160 print ('height update:', self.maxHeight) 128 print (' height update:', self.maxHeight)
161 self:SetHeight(self.maxHeight) 129 self:SetHeight(self.maxHeight)
162 end 130 end
163 131
132 if not isUpdate then
133 Veneer:InternalReanchor(self, print)
134 end
164 end 135 end
165 136
166 137
167 138
168 function VeneerWorldStateMixin:OnMouseDown() 139 function VeneerWorldStateMixin:OnMouseDown()
140 end
141
142 function VeneerOrderHallMixin:Setup()
143 print('|cFFFFFF00'..self:GetName()..':Setup()')
144 hooksecurefunc(OrderHallCommandBar,'Show', function()
145 self:Update()
146 end)
147 hooksecurefunc(OrderHallCommandBar,'Hide', function()
148 self:Update()
149 end)
150 end
151
152 function VeneerOrderHallMixin:Update()
153
154 if not OrderHallCommandBar then
155 print('|cFFFF4400'..self:GetName()..' updater called without target')
156 return
157 end
158
159 print('|cFF0044FF'..self:GetName()..' update')
160 OrderHallCommandBar:ClearAllPoints()
161 OrderHallCommandBar:SetPoint('TOP', self, 'TOP')
162 OrderHallCommandBar:SetWidth(600)
163 OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5)
164 OrderHallCommandBar.WorldMapButton:Hide()
165 OrderHallCommandBar:EnableMouse(false)
166
167 self:SetSize(OrderHallCommandBar:GetSize())
169 end 168 end
170 169
171 function VeneerWorldStateCurrencyMixin:OnLoad () 170 function VeneerWorldStateCurrencyMixin:OnLoad ()
172 171
173 self:RegisterEvent("PLAYER_ENTERING_WORLD"); 172 self:RegisterEvent("PLAYER_ENTERING_WORLD");
201 200
202 201
203 end 202 end
204 203
205 function VeneerWorldStateProgressMixin:OnUpdate(sinceLast) 204 function VeneerWorldStateProgressMixin:OnUpdate(sinceLast)
205 self.timeLived = (self.timeLived or 0) + sinceLast
206 if self.keepOpen then 206 if self.keepOpen then
207 return 207 return
208 end 208 end
209
210 self.timeLived = (self.timeLived or 0) + sinceLast
211 if self.timeLived >= 3 and not self.TransitionFadeOut:IsPlaying() then 209 if self.timeLived >= 3 and not self.TransitionFadeOut:IsPlaying() then
212 if not self.timeOut then 210 if not self.timeOut then
213 self.timeOut = true 211 self.timeOut = true
214 self.TimedFadeOut:Play() 212 self.TimedFadeOut:Play()
215 end 213 end
237 235
238 end 236 end
239 237
240 function VeneerWorldStateProgressMixin:Setup() 238 function VeneerWorldStateProgressMixin:Setup()
241 self:UpdateXPGain() 239 self:UpdateXPGain()
242
243 if self.canGainXP then 240 if self.canGainXP then
244 self.mode = 'xp' 241 self.mode = 'xp'
245 else 242 else
246 self.mode = 'artifact' 243 self.mode = 'artifact'
247 end 244 end
281 end 278 end
282 end 279 end
283 280
284 local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo 281 local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo
285 local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank 282 local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank
283
284 function VeneerWorldStateProgressMixin:AnimateProgress(progressChange)
285
286 local progressWidth = self:GetWidth() * progressChange
287
288 print(' Render change:', progressChange, progressWidth)
289 self.ProgressAdded:Show()
290 self.ProgressAdded:ClearAllPoints()
291 self.ProgressAdded:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', 0, 0)
292 self.ProgressAdded:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', - (progressWidth), 0)
293
294
295 self.ProgressFlash.translation:SetOffset(progressWidth, 0)
296 self.ProgressFlash:Play()
297 end
298
286 function VeneerWorldStateProgressMixin:Update() 299 function VeneerWorldStateProgressMixin:Update()
287 local hasNewInfo = false 300 local hasNewInfo = false
288 local progressChange = false 301 local progressChange = false
289 print(' current mode:', self.mode) 302 print(' current mode:', self.mode)
290 303
363 print(self.ProgressBG:GetWidth()) 376 print(self.ProgressBG:GetWidth())
364 print(' Percent:', floor(self.progressPercent*100)/100, 'BarLength:', floor(self:GetWidth()* self.progressPercent), 'NewInfo:', hasNewInfo, 'IsShown:', self:IsShown()) 377 print(' Percent:', floor(self.progressPercent*100)/100, 'BarLength:', floor(self:GetWidth()* self.progressPercent), 'NewInfo:', hasNewInfo, 'IsShown:', self:IsShown())
365 378
366 379
367 if progressChange then 380 if progressChange then
368 print(' Render change:', progressChange) 381 self:AnimateProgress(progressChange)
369 self.ProgressAdded:Show()
370 self.ProgressAdded:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', - (self:GetWidth() * progressChange), 0)
371 self.ProgressAdded:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', 0, 0)
372 self.ProgressFlash:Play()
373 end 382 end
374 383
375 384
376 if self.progressPercent > 0 then 385 if self.progressPercent > 0 then
377 self.ProgressBar:Show() 386 self.ProgressBar:Show()
398 407
399 function VeneerWorldStateProgressMixin:OnMouseDown(button) 408 function VeneerWorldStateProgressMixin:OnMouseDown(button)
400 if button == 'RightButton' then 409 if button == 'RightButton' then
401 if self.keepOpen then 410 if self.keepOpen then
402 self.keepOpen = nil 411 self.keepOpen = nil
412 self.timeLived = 1000
403 else 413 else
404 self.keepOpen = true 414 self.keepOpen = true
405 end 415 end
406 print('keepOpen =', self.keepOpen) 416 print('keepOpen =', self.keepOpen)
407 else 417 else
423 self.TransitionFadeIn:Stop() 433 self.TransitionFadeIn:Stop()
424 print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()') 434 print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()')
425 self.modeChanged = true 435 self.modeChanged = true
426 self.TransitionFadeOut:Play() 436 self.TransitionFadeOut:Play()
427 end 437 end
438
439 do
440 function WorldStateBlockMixin:ShowPanel()
441 print('|cFF0088FF'..self:GetName()..':ShowPanel()')
442 self:SetShown(true)
443 VeneerWorldState:Show()
444 end
445 function WorldStateBlockMixin:HidePanel()
446 print('|cFF0088FF'..self:GetName()..':HidePanel()')
447 self:SetShown(false)
448 VeneerWorldState:Reanchor()
449 end
450
451 function WorldStateBlockMixin:OnSizeChanged ()
452 local h = self:GetHeight()
453 if h > VeneerWorldState.maxHeight then
454 VeneerWorldState.maxHeight = h
455 VeneerWorldState:SetHeight(h)
456 print('updating max height:', h)
457 elseif h < VeneerWorldState.maxHeight then
458 VeneerWorldState:Reanchor()
459 end
460 end
461 function WorldStateBlockMixin:OnHide ()
462 print('|cFF0088FF'..self:GetName()..':OnHide()')
463 VeneerWorldState:Reanchor()
464 end
465 function WorldStateBlockMixin:OnShow ()
466 self.timeLived = 0
467 print('|cFF0088FF'..self:GetName()..':OnShow()')
468 VeneerWorldState:Reanchor()
469 end
470 function WorldStateBlockMixin:Setup()
471 print('|cFF0088FF'..self:GetName()..':Setup()|r -- nop')
472 end
473 function WorldStateBlockMixin:Reset()
474 print('|cFF0088FF'..self:GetName()..':Reset()')
475 self.keepOpen = true
476 self:Setup()
477 end
478 end