comparison Veneer.lua @ 88:b107b4df7eb6

- core:DynamicReanchor - top-down evaluation of clustered frames - core:InternalReanchor(module) - bottom-up evaluation of target and frames anchored to it
author Nenue
date Thu, 20 Oct 2016 04:08:11 -0400
parents 27db212af783
children 74e714637d6a
comparison
equal deleted inserted replaced
87:27db212af783 88:b107b4df7eb6
1 -- Veneer 1 -- Veneer Custom Interface Framework
2 -- Base framework for making things draggable. 2 -- 1. vn OnLoad
3 3 -- 2. OnEvent where IsLoggedIn() == true
4 4 -- 3. Setup() where (not self.initialized)
5 5 -- 4. Update()
6 -- 5. Reanchor()
6 7
7 SLASH_VENEER1 = "/veneer" 8 SLASH_VENEER1 = "/veneer"
8 SLASH_VENEER2 = "/vn" 9 SLASH_VENEER2 = "/vn"
9 10
10 SlashCmdList.VENEER = function(cmd) 11 SlashCmdList.VENEER = function(cmd)
11 end 12 end
13
12 VeneerCore = { 14 VeneerCore = {
13 Frames = {}, 15 Frames = {},
14 ConfigLayers = {}, 16 ConfigLayers = {},
15 FrameClusters = {}, 17 FrameClusters = {},
16 parserDepth = 0, 18 parserDepth = 0,
17 pendingCalls = {}, 19 pendingCalls = {},
18 } 20 }
19 VeneerHandlerMixin = { 21 VeneerHandlerMixin = {
20 Reanchor = nop, 22
21 anchorPoint = 'CENTER', -- indicates the initial cluster group point 23 anchorPoint = 'CENTER', -- indicates the initial cluster group point
22 --anchorPath = 'BOTTOM', -- indicates the point from which the frame is anchored in a cluster arrangement 24 --anchorPath = 'BOTTOM', -- indicates the point from which the frame is anchored in a cluster arrangement
25 OnHide = function()
26 Veneer:DynamicReanchor()
27 end,
28 OnShow = function(self)
29 self:Reanchor()
30 Veneer:StaticReanchor(self)
31 end
23 } 32 }
33 VeneerAnimationMixin = {}
24 local print = DEVIAN_WORKSPACE and function(...) print('Veneer', ...) end or nop 34 local print = DEVIAN_WORKSPACE and function(...) print('Veneer', ...) end or nop
25 local wipe = table.wipe 35 local wipe = table.wipe
26 36
27 local defaults = { 37 local defaults = {
28 enableAll = true, 38 enableAll = true,
93 self:RegisterEvent('ADDON_LOADED') 103 self:RegisterEvent('ADDON_LOADED')
94 self:RegisterEvent('PLAYER_LOGIN') 104 self:RegisterEvent('PLAYER_LOGIN')
95 105
96 self.DEVIAN_PNAME = 'Veneer' 106 self.DEVIAN_PNAME = 'Veneer'
97 self:RegisterForDrag('LeftButton') 107 self:RegisterForDrag('LeftButton')
108
109
98 end 110 end
99 111
100 function VeneerCore:OnEvent(event, ...) 112 function VeneerCore:OnEvent(event, ...)
101 if event == 'ADDON_LOADED' or event == 'PLAYER_LOGIN' then 113 if event == 'ADDON_LOADED' or event == 'PLAYER_LOGIN' then
102 if IsLoggedIn() and not self.intialized then 114 if IsLoggedIn() and not self.intialized then
182 print(' -- doing initialization') 194 print(' -- doing initialization')
183 if handler.Setup and not handler.initialized then 195 if handler.Setup and not handler.initialized then
184 handler:Setup() 196 handler:Setup()
185 handler.initialized = true 197 handler.initialized = true
186 end 198 end
187 if handler.Update then
188 handler:Update()
189 end
190 self:InternalReanchor(handler) 199 self:InternalReanchor(handler)
191 200
192 end 201 end
193 end 202 end
194 203
195 function VeneerCore:Reanchor() 204 function VeneerCore:Reanchor()
196 self:ExecuteOnClusters(nil, 'Reanchor') 205 self:ExecuteOnClusters(nil, 'Reanchor')
206 self:DynamicReanchor(self)
197 end 207 end
198 208
199 function VeneerCore:Update() 209 function VeneerCore:Update()
200 self:ExecuteOnClusters(nil, 'Update') 210 self:ExecuteOnClusters(nil, 'Update')
211 self:Reanchor()
201 end 212 end
202 213
203 -- updates anchor relations to and from the target handler 214 -- updates anchor relations to and from the target handler
204 function VeneerCore:GetAnchor(...) 215 function VeneerCore:GetAnchor(...)
205 216
206 end 217 end
207 218
219 -- Evaluates frames visibility and chains them accordingly
220
221 function VeneerCore:DynamicReanchor(parent)
222 parent = parent or self
223 print('|cFF88FF00DynamicReanchor()')
224 for anchorPoint, cluster in pairs(parent.FrameClusters) do
225 local lastFrame
226 for index, frame in ipairs(cluster) do
227 print(' |cFF00FF00'..index, frame:GetName(), frame:IsVisible())
228 if frame:IsVisible() then
229 anchorPoint = frame.anchorPoint
230
231
232 frame:ClearAllPoints()
233 if lastFrame then
234 frame:SetPoint(anchorPoint, lastFrame, ANCHOR_OFFSET_POINT[anchorPoint], 0, 0)
235 else
236 frame:SetPoint(anchorPoint, UIParent, anchorPoint, 0, 0)
237 end
238 lastFrame = frame
239 end
240
241 end
242 end
243 end
244
245 -- Evaluates the current visibility state and re-anchors adjacent blocks accordingly
208 function VeneerCore:InternalReanchor(handler, printFunc) 246 function VeneerCore:InternalReanchor(handler, printFunc)
209 print('|cFF00FFFFVeneer:InternalReanchor('..handler:GetName()..')') 247 print('|cFF00FFFFVeneer:InternalReanchor('..handler:GetName()..')')
210 local anchorPoint = handler.anchorPath or handler.anchorPoint 248 local anchorPoint = handler.anchorPath or handler.anchorPoint
211 local anchorParent, anchorTo = UIParent, anchorPoint 249 local anchorParent, anchorTo = UIParent, anchorPoint
212 for i, frame in ipairs(handler.anchorCluster) do 250 local subPoint, subTo
213 if frame ~= handler then 251 local nextFrame
214 anchorParent = frame 252 for index, frame in ipairs(handler.anchorCluster) do
215 anchorTo = ANCHOR_OFFSET_POINT[anchorPoint] 253
216 254 print(' |cFF00FF00'..index, frame:GetName(), frame:IsVisible())
217 else 255 if frame:IsVisible() then
218 local nextFrame = handler.anchorCluster[i+1] 256 if frame ~= handler then
219 if nextFrame then 257 anchorParent = frame
220 258 anchorTo = ANCHOR_OFFSET_POINT[anchorPoint]
221 local subPoint = nextFrame.anchorPath or nextFrame.anchorPoint 259
222 local subTo = ANCHOR_OFFSET_POINT[subPoint] 260 else
223 nextFrame:ClearAllPoints() 261 nextFrame = handler.anchorCluster[index+1]
224 nextFrame:SetPoint(subPoint, handler, subTo, 0, 0) 262 if nextFrame then
225 print(' -- pushing '..nextFrame:GetName()..' down the anchor chain', subPoint, subTo) 263
264 subPoint = nextFrame.anchorPath or nextFrame.anchorPoint
265 subTo = ANCHOR_OFFSET_POINT[subPoint]
266 nextFrame:ClearAllPoints()
267 nextFrame:SetPoint(subPoint, handler, subTo, 0, 0)
268 print(' -- pushing '..nextFrame:GetName()..' down the anchor chain', subPoint, subTo)
269 end
270 break
226 end 271 end
227 break 272 end
228 end 273 end
229 end 274
230 275 if handler:IsVisible() then
231 handler:ClearAllPoints() 276 handler:SetPoint(anchorPoint, anchorParent, anchorTo, 0, 0)
232 handler:SetPoint(anchorPoint, anchorParent, anchorTo, 0, 0) 277 else
278 if anchorParent and nextFrame then
279 nextFrame:SetPoint(subPoint, handler, subTo, 0, 0)
280 end
281 end
282
233 283
234 print(handler.anchorPoint, anchorParent, anchorTo) 284 print(handler.anchorPoint, anchorParent, anchorTo)
235 if printFunc then 285 if printFunc then
236 printFunc('|cFF88FF00'..handler:GetName()..':SetPoint(', handler.anchorPoint, anchorParent, anchorTo) 286 printFunc('|cFF88FF00'..handler:GetName()..':SetPoint(', handler.anchorPoint, anchorParent, anchorTo)
237 end 287 end
238 288 end
239 end 289
290 function VeneerCore:SlideBlock(frame, ...)
291
292 local anchorPoint, parent, anchorTo, pX,pY = ...
293 print(' |cFF0088FFSlide:|r', frame, 'to', parent, pX,pY)
294 local qX, qY = pX, pY
295 local bX, bY
296 local dX, dY = 0, 0
297 local aX, aY = frame:GetLeft(), frame:GetTop()
298 local str = ''
299 if not aX then
300 dY = ((anchorPoint == 'TOP') and frame:GetHeight()) or (((anchorPoint == 'BOTTOM') and -frame:GetHeight()) or 0)
301 dX = ((anchorPoint == 'LEFT') and -frame:GetWidth()) or (((anchorPoint == 'RIGHT') and frame:GetWidth()) or 0)
302 qX = pX + dX
303 qY = pY + dY
304 aX, aY = qX, qY
305 bX, bY = pX, pY
306 str = '|cFFFFFF00relative|r'
307 else
308 frame:ClearAllPoints()
309
310 bX, bY = frame:GetLeft(), frame:GetTop()
311 dX, dY = (bX-aX), (bY-aY)
312
313 str = '|cFFFFFF00existing|r'
314 end
315
316 if ((dX ~= 0) or (dY ~= 0)) and frame.BlockSlide then
317 print(' |cFF00FF88Slide result:|r',str, dX, dY)
318
319 frame:ClearAllPoints()
320 frame:SetPoint(anchorPoint, parent, anchorTo, qX, qY)
321 frame.BlockSlide.dX = dX
322 frame.BlockSlide.dY = dY
323 frame.BlockSlide.sourcePoint = {anchorPoint, parent, anchorTo, qX, qY}
324 frame.BlockSlide.destPoint = {anchorPoint, parent, anchorTo, pX,pY}
325 frame.BlockSlide.translation:SetOffset(dX, dY)
326 frame.BlockSlide:Play()
327 return
328 end
329 end
330
240 331
241 function VeneerCore:ExecuteOnClusters(layer, method) 332 function VeneerCore:ExecuteOnClusters(layer, method)
242 self.parserDepth = self.parserDepth + 1 333 self.parserDepth = self.parserDepth + 1
243 if not layer then 334 if not layer then
244 if self.parserDepth > 1 then 335 if self.parserDepth > 1 then
368 459
369 local VeneerButton_OnShow = function(self) 460 local VeneerButton_OnShow = function(self)
370 VeneerButton_Update(self) 461 VeneerButton_Update(self)
371 end 462 end
372 463
464 -- Takes frame handle and assigns a block to it
373 function VeneerCore:Acquire (frame, template) 465 function VeneerCore:Acquire (frame, template)
374 if not frame then 466 if not frame then
375 print('|cFFFF4400Unable to acquire frame...|r') 467 print('|cFFFF4400Unable to acquire frame...|r')
376 return 468 return
377 end 469 end
397 end 489 end
398 490
399 return veneer 491 return veneer
400 end 492 end
401 493
402 local mixin_probe = { 494 function VeneerHandlerMixin:Reanchor (anchorAll)
403 'ArtifactFrame', 495 if not anchorAll then
404 'ArtifactFrameUnderlay', 496 Veneer:InternalReanchor(self)
405 } 497 end
406 498
407 499 end
500
501 function VeneerAnimationMixin:OnPlay()
502 PlaySoundKitID(229)
503 print('|cFF00FF00Anim:OnPlay|r @', unpack(self.sourcePoint))
504 end
505 function VeneerAnimationMixin:OnStop()
506 PlaySoundKitID(229)
507 end
508 function VeneerAnimationMixin:OnFinished()
509 PlaySoundKitID(229)
510 print('|cFF00FF00Anim:OnFinish|r @', unpack(self.destPoint))
511 self:GetParent():ClearAllPoints()
512 self:GetParent():SetPoint(unpack(self.destPoint))
513 end