annotate ObjectiveTracker/Block.lua @ 45:dd1ae565f559

Hooks and Handlers: - correct argument mix-ups for AcceptQuest/QUEST_ACCEPTED handlers; fixes auto-watch - respond to AcknowledgeAutoAcceptQuest; fixes lingering popups - include Popup and Quest trackers in the response code for CompleteQuest; fixes content artifacts following the rollover of repeating popups seen in Ashran - clean up wacky OnEvent header Layout - add alpha blend options QuestData - reset objectives data when a quest is in a completed state; keeps old data from ever reaching the Default.x code
author Nenue
date Tue, 26 Apr 2016 14:57:18 -0400
parents 756e8aeb040b
children aa693607b813
rev   line source
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@44 144 block.blockFadeOut:SetScript('OnFinished', blockFadeOut_OnFinished)
Nenue@44 145 block:SetScript('OnHide', function(self)
Nenue@44 146 fprint(self:GetName(), '|cFF00FF00HIDE|r', debugstack(1,3,1))
Nenue@44 147 if(self.DebugTab:IsShown()) then
Nenue@44 148 self.DebugTab:Hide()
Nenue@44 149 end
Nenue@44 150 self.blockFadeOut:SetScript('OnFinished', blockFadeOut_OnFinished)
Nenue@44 151 self.isAnimating = nil
Nenue@44 152 end)
Nenue@43 153 print(' used/free: |cFFFFFF00' .. #self.usedBlocks .. '|r/|cFF00FFFF'..#self.freeBlocks ..'|r')
Nenue@40 154 return block
Nenue@40 155 end
Nenue@40 156
Nenue@40 157 --- begins a blockFadeOut animation and fires FreeBlock when that's done
Nenue@43 158 function Default:ClearBlock (block)
Nenue@43 159 -- double ensure multiple finish scripts from firing
Nenue@40 160 if block.isAnimating then
Nenue@40 161 return
Nenue@40 162 end
Nenue@40 163 block.isAnimating = true
Nenue@40 164 block.blockFadeOut:SetScript('OnFinished', nil)
Nenue@43 165 block.blockFadeOut:SetScript('OnFinished', function(anim)
Nenue@43 166 --@debug@
Nenue@43 167 fprint(anim:GetName(), '|cFFFFFF00FINISHED|r', debugstack())--@end-debug@
Nenue@43 168 anim:SetScript('OnFinished', blockFadeOut_OnFinished)
Nenue@43 169 self:FreeBlock(block)
Nenue@40 170 block.isAnimating = nil
Nenue@40 171 end)
Nenue@40 172 block.blockFadeOut:Play()
Nenue@40 173 end
Nenue@40 174
Nenue@43 175 --- fired by OnFinished scripts; does the actual table swapping
Nenue@43 176 function Default:FreeBlock(block)
Nenue@40 177 bprint('|cFFFF4400FreeBlock|r', block:GetName())
Nenue@43 178 local used = self.usedBlocks
Nenue@43 179 local free = self.freeBlocks
Nenue@40 180 tMove(used, free, block)
Nenue@40 181
Nenue@40 182 bprint(' |cFFFF4444used/free:|r |cFFFFFF00' .. #used .. '|r/|cFF00FFFF'..#free ..'|r')
Nenue@40 183
Nenue@40 184 block:Hide()
Nenue@40 185 local animations = {block:GetAnimationGroups() }
Nenue@40 186 for i, animGroup in ipairs(animations) do
Nenue@40 187 bprint(' animGroup', i, animGroup:GetName())
Nenue@40 188 animGroup:Stop()
Nenue@40 189 end
Nenue@40 190 end