Nenue@40
|
1 --- ${PACKAGE_NAME}
|
Nenue@40
|
2 -- @file-author@
|
Nenue@40
|
3 -- @project-revision@ @project-hash@
|
Nenue@40
|
4 -- @file-revision@ @file-hash@
|
Nenue@40
|
5 -- Created: 4/24/2016 11:30 AM
|
Nenue@40
|
6 --- These functions deal with propagating and managing block/line templates
|
Nenue@40
|
7 local B = select(2,...).frame
|
Nenue@40
|
8 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
|
Nenue@40
|
9 local _G, ipairs, max, tostring = _G, ipairs, max, tostring
|
Nenue@40
|
10 local tinsert, tremove, tContains = table.insert, table.remove, tContains
|
Nenue@40
|
11 local Default = T.DefaultHandler
|
Nenue@40
|
12 local CreateFrame = CreateFrame
|
Nenue@40
|
13 local print = B.print('Layout')
|
Nenue@40
|
14 local bprint = B.print('Block')
|
Nenue@40
|
15 local lprint = B.print('Layout')
|
Nenue@40
|
16 local fprint = B.print('Frame')
|
Nenue@40
|
17 local used, free
|
Nenue@40
|
18
|
Nenue@40
|
19 local blockFadeOut_OnPlay = function(self)
|
Nenue@40
|
20 fprint(self:GetName(), '|cFF00FF00PLAY|r', debugstack(1,3,1))
|
Nenue@40
|
21 end
|
Nenue@40
|
22 local blockFadeOut_OnFinished = function(self)
|
Nenue@40
|
23 fprint(self:GetName(), '|cFF00FF00FINISHED|r', debugstack(1,3, 1))
|
Nenue@40
|
24 end
|
Nenue@40
|
25
|
Nenue@40
|
26 local tMove = function(source, dest, frame)
|
Nenue@40
|
27 -- if it's already in the stack, sanity check source stack
|
Nenue@40
|
28 local removed
|
Nenue@40
|
29 if tContains(dest, frame) then
|
Nenue@40
|
30 for i, entry in ipairs(source) do
|
Nenue@40
|
31 if entry == frame then
|
Nenue@40
|
32 removed = i
|
Nenue@40
|
33 tremove(source, i)
|
Nenue@40
|
34 break
|
Nenue@40
|
35 end
|
Nenue@40
|
36 end
|
Nenue@40
|
37 -- still need to resolve position
|
Nenue@40
|
38 for i, entry in ipairs(dest) do
|
Nenue@40
|
39 if entry == frame then
|
Nenue@40
|
40 bprint('tMove result:', (removed and ('|cFFFF4400a|r['..removed .. '] is now ') or '') .. '|cFF00FF00b|r[' .. i..']')
|
Nenue@40
|
41 return i
|
Nenue@40
|
42 end
|
Nenue@40
|
43 end
|
Nenue@40
|
44 else
|
Nenue@40
|
45 -- if it's not, then pull from source stack
|
Nenue@40
|
46 for i, entry in ipairs(source) do
|
Nenue@40
|
47 if entry == frame then
|
Nenue@40
|
48 removed = i
|
Nenue@40
|
49 tremove(source, i)
|
Nenue@40
|
50 break
|
Nenue@40
|
51 end
|
Nenue@40
|
52 end
|
Nenue@40
|
53 tinsert(dest, frame)
|
Nenue@40
|
54 bprint('tMove result:', (removed and ('|cFFFF4400a|r['..removed .. '] is now ') or '') .. '|cFF00FF00b|r[' .. #dest..']')
|
Nenue@40
|
55 return #dest
|
Nenue@40
|
56 end
|
Nenue@40
|
57 end
|
Nenue@40
|
58
|
Nenue@40
|
59
|
Nenue@40
|
60 --- Creates or retrieves a complete line data object
|
Nenue@43
|
61 function Default:GetLine (block, lineIndex)
|
Nenue@40
|
62 local print = lprint
|
Nenue@40
|
63 local blockIndex = block.index
|
Nenue@40
|
64 local lines = block.lines
|
Nenue@40
|
65 if not lineIndex then
|
Nenue@40
|
66 lineIndex = block.currentLine + 1
|
Nenue@40
|
67 print(' |cFFFFFF00generating a frame')
|
Nenue@40
|
68 end
|
Nenue@40
|
69
|
Nenue@40
|
70 block.numLines = max(block.numLines, lineIndex)
|
Nenue@40
|
71
|
Nenue@40
|
72 if not lines[lineIndex] then
|
Nenue@43
|
73 print(' |cFF00FF88created line #'..lineIndex..' from for '..self.name..' block #'..blockIndex)
|
Nenue@43
|
74 lines[lineIndex] = CreateFrame('Frame', 'Vn'..self.name .. blockIndex..'ObjectiveLine'..lineIndex, block, 'VeneerTrackerObjective')
|
Nenue@40
|
75 local line = lines[lineIndex]
|
Nenue@40
|
76 line.index = lineIndex
|
Nenue@40
|
77 line.height = 0
|
Nenue@40
|
78 line.schema = ''
|
Nenue@40
|
79 B.SetConfigLayers(line)
|
Nenue@40
|
80
|
Nenue@40
|
81 if debug then
|
Nenue@40
|
82 for _, region in ipairs(lines[lineIndex].debug) do
|
Nenue@40
|
83 region:Show()
|
Nenue@40
|
84 end
|
Nenue@40
|
85 end
|
Nenue@40
|
86
|
Nenue@40
|
87 end
|
Nenue@40
|
88 return lines[lineIndex]
|
Nenue@40
|
89 end
|
Nenue@40
|
90
|
Nenue@40
|
91
|
Nenue@40
|
92
|
Nenue@40
|
93 --- Creates or retrieves a complete block frame object
|
Nenue@40
|
94 --- todo: make it use data index to avoid re-coloring every block
|
Nenue@43
|
95 function Default:GetBlock (index)
|
Nenue@40
|
96 local print = bprint
|
Nenue@43
|
97 print('|cFF0088FF'..self.name..':GetBlock', index)
|
Nenue@43
|
98 local block = self.InfoBlock[index]
|
Nenue@43
|
99 local used = self.usedBlocks
|
Nenue@43
|
100 local free = self.freeBlocks
|
Nenue@40
|
101
|
Nenue@44
|
102 if block and block.isAnimating then
|
Nenue@44
|
103 return block
|
Nenue@40
|
104 end
|
Nenue@40
|
105
|
Nenue@40
|
106 -- if the frame entry is still good, sort heaps
|
Nenue@40
|
107 if block and block.info.id == index then
|
Nenue@40
|
108 block.posIndex = tMove(free, used, block)
|
Nenue@43
|
109 print(' |cFFFFFF00using '..self.name..'|r.|cFF00FFBBusedBlocks['..tostring(block.posIndex)..'] ('.. block:GetName()..', "'..tostring(block.info.title)..'")')
|
Nenue@40
|
110 else
|
Nenue@40
|
111 local source = 'cache'
|
Nenue@43
|
112 if #self.freeBlocks >= 1 then
|
Nenue@43
|
113 block = tremove(self.freeBlocks)
|
Nenue@40
|
114 print(' |cFF00FF00 assigning from free heap', block:GetName())
|
Nenue@40
|
115 else
|
Nenue@40
|
116
|
Nenue@43
|
117 local blockIndex = (#self.usedBlocks + #self.freeBlocks) + 1
|
Nenue@43
|
118 block = CreateFrame('Frame', 'Veneer'..tostring(self)..'Block'..blockIndex, self.frame, 'VeneerTrackerBlock')
|
Nenue@40
|
119 --block:SetParent()
|
Nenue@40
|
120 block.schema = ''
|
Nenue@40
|
121 block.lines = {}
|
Nenue@40
|
122 block.numLines = 0
|
Nenue@40
|
123 block.currentLine = 0
|
Nenue@40
|
124 block.attachmentHeight = 0
|
Nenue@40
|
125 block.offset = 0
|
Nenue@40
|
126 B.SetConfigLayers(block)
|
Nenue@40
|
127 --- methods for event handlers
|
Nenue@43
|
128 block.Select = self.Select
|
Nenue@43
|
129 block.Open = self.Open
|
Nenue@43
|
130 block.Remove = self.Remove
|
Nenue@43
|
131 block.Link = self.Link
|
Nenue@43
|
132 block.clickZone:SetScript('OnMouseUp', function(frame, ...) self.OnMouseUp(block, ...) end)
|
Nenue@43
|
133 block.clickZone:SetScript('OnMouseDown', function(frame, ...) self.OnMouseDown(block, ...) end)
|
Nenue@40
|
134 block:ClearAllPoints()
|
Nenue@40
|
135 block.index = blockIndex
|
Nenue@40
|
136 block.blockFadeOut:SetScript('OnPlay', blockFadeOut_OnPlay)
|
Nenue@40
|
137 source = 'new'
|
Nenue@40
|
138 end
|
Nenue@43
|
139 self.InfoBlock[index] = block
|
Nenue@40
|
140 block.posIndex = tMove(free, used, block)
|
Nenue@43
|
141 print(' |cFF00FF00('..source..')|r |cFF0088FF'..self.name..'|r.|cFF00FFBBusedBlocks['..block.posIndex..'] =|r', block:GetName())
|
Nenue@40
|
142 end
|
Nenue@44
|
143
|
Nenue@46
|
144 block.blockFadeOut:SetScript('OnFinished', blockFadeOut_OnFinished)
|
Nenue@46
|
145 block:SetScript('OnHide', function(self)
|
Nenue@46
|
146 fprint(self:GetName(), '|cFF00FF00HIDE|r', debugstack(1,3,1))
|
Nenue@46
|
147 if(self.DebugTab:IsShown()) then
|
Nenue@46
|
148 self.DebugTab:Hide()
|
Nenue@46
|
149 end
|
Nenue@46
|
150 self.blockFadeOut:SetScript('OnFinished', blockFadeOut_OnFinished)
|
Nenue@46
|
151 end)
|
Nenue@43
|
152 print(' used/free: |cFFFFFF00' .. #self.usedBlocks .. '|r/|cFF00FFFF'..#self.freeBlocks ..'|r')
|
Nenue@40
|
153 return block
|
Nenue@40
|
154 end
|
Nenue@40
|
155
|
Nenue@40
|
156 --- begins a blockFadeOut animation and fires FreeBlock when that's done
|
Nenue@43
|
157 function Default:ClearBlock (block)
|
Nenue@46
|
158 if block.blockFadeOut:IsPlaying() then return end
|
Nenue@46
|
159
|
Nenue@40
|
160 block.blockFadeOut:SetScript('OnFinished', nil)
|
Nenue@43
|
161 block.blockFadeOut:SetScript('OnFinished', function(anim)
|
Nenue@43
|
162 --@debug@
|
Nenue@43
|
163 fprint(anim:GetName(), '|cFFFFFF00FINISHED|r', debugstack())--@end-debug@
|
Nenue@43
|
164 anim:SetScript('OnFinished', blockFadeOut_OnFinished)
|
Nenue@43
|
165 self:FreeBlock(block)
|
Nenue@40
|
166 end)
|
Nenue@40
|
167 block.blockFadeOut:Play()
|
Nenue@40
|
168 end
|
Nenue@40
|
169
|
Nenue@43
|
170 --- fired by OnFinished scripts; does the actual table swapping
|
Nenue@43
|
171 function Default:FreeBlock(block)
|
Nenue@40
|
172 bprint('|cFFFF4400FreeBlock|r', block:GetName())
|
Nenue@43
|
173 local used = self.usedBlocks
|
Nenue@43
|
174 local free = self.freeBlocks
|
Nenue@40
|
175 tMove(used, free, block)
|
Nenue@40
|
176
|
Nenue@40
|
177 bprint(' |cFFFF4444used/free:|r |cFFFFFF00' .. #used .. '|r/|cFF00FFFF'..#free ..'|r')
|
Nenue@40
|
178
|
Nenue@40
|
179 block:Hide()
|
Nenue@40
|
180 local animations = {block:GetAnimationGroups() }
|
Nenue@40
|
181 for i, animGroup in ipairs(animations) do
|
Nenue@40
|
182 bprint(' animGroup', i, animGroup:GetName())
|
Nenue@40
|
183 animGroup:Stop()
|
Nenue@40
|
184 end
|
Nenue@40
|
185 end
|