annotate ObjectiveTracker/DefaultTracker.lua @ 37:e84d645c8ab8

- revised the tracker update function to build its complete data list up front and use the values as points of comparison for determining possible out of place blocks, which will be iterated over afterward to remove what wasn't re-used - also entailed revising the exact role of global event handlers and function hooks, limiting their directions of communication so one doesn't end up calling the other multiple or inifinity times - schema handling polish
author Nenue
date Mon, 18 Apr 2016 07:56:23 -0400
parents a487841050be
children 1f8f9cc3d956
rev   line source
Nenue@35 1 --- ${PACKAGE_NAME}
Nenue@35 2 -- @file-author@
Nenue@35 3 -- @project-revision@ @project-hash@
Nenue@35 4 -- @file-revision@ @file-hash@
Nenue@35 5 -- Created: 4/17/2016 7:33 AM
Nenue@35 6 local B = select(2,...).frame
Nenue@35 7 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
Nenue@35 8 local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
Nenue@35 9 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion, tinsert, tremove = IsResting, UnitXP, UnitXPMax, GetXPExhaustion, table.insert, table.remove
Nenue@35 10 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
Nenue@35 11 local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText
Nenue@35 12 local PERCENTAGE_STRING, GetQuestProgressBarPercent = PERCENTAGE_STRING, GetQuestProgressBarPercent
Nenue@35 13 local Default, AutoQuest, Quest, Bonus, Cheevs = T.DefaultHandler, T.AutoQuest, T.Quest, T.Bonus, T.Cheevs
Nenue@35 14 local InCombatLockdown, format, lshift, CreateFrame = InCombatLockdown, format, bit.lshift, CreateFrame
Nenue@35 15 local IsModifiedClick, ChatEdit_GetActiveWindow = IsModifiedClick, ChatEdit_GetActiveWindow
Nenue@35 16 local print = B.print('Tracker')
Nenue@35 17 local oprint = B.print('Objectives')
Nenue@35 18 local bprint = B.print('Block')
Nenue@35 19 local tprint = B.print('Tracker')
Nenue@35 20 local lprint = B.print('Line')
Nenue@35 21 local unitLevel = 1
Nenue@35 22 local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_REASON
Nenue@35 23 local debug = false
Nenue@35 24
Nenue@35 25 --- FRAMES
Nenue@35 26 local Wrapper = _G.VeneerObjectiveWrapper
Nenue@35 27 local Scroller = Wrapper.scrollArea
Nenue@35 28 local Scroll = _G.VeneerObjectiveScroll
Nenue@35 29 local orderedHandlers = T.orderedHandlers
Nenue@35 30 local orderedNames = T.orderedNames
Nenue@35 31
Nenue@35 32
Nenue@35 33 --- Placing the Update functions here since they shouldn't be messing with schema stuff
Nenue@35 34 local currentPosition, anchorFrame, anchorPoint
Nenue@35 35 --- Positioning and stuff
Nenue@35 36 local tick = 0
Nenue@35 37 local firstUpdate = true
Nenue@35 38 function T:Update (reason, ...)
Nenue@35 39 if not B.Conf.VeneerObjectiveWrapper.enabled then
Nenue@35 40 return
Nenue@35 41 end
Nenue@35 42
Nenue@35 43 tick = tick + 1
Nenue@35 44 if firstUpdate or not reason then
Nenue@35 45 reason = _G.OBJECTIVE_TRACKER_UPDATE_ALL
Nenue@35 46 end
Nenue@35 47
Nenue@35 48 local print = tprint
Nenue@35 49 local hasStuff = false
Nenue@35 50 local insertingStuff = false
Nenue@35 51
Nenue@35 52 print(format('|cFFBB0066Update:|r |cFFFF%04X%d|r ', tick, lshift(reason, 4)), reason, ...)
Nenue@35 53 currentPosition = 0
Nenue@35 54
Nenue@35 55 for id, handler in pairs(T.orderedHandlers) do
Nenue@35 56 local frame = handler.frame
Nenue@35 57
Nenue@35 58
Nenue@35 59 if band(reason, handler.updateReasonModule + handler.updateReasonEvents) > 0 then
Nenue@35 60 insertingStuff = handler:UpdateTracker(reason, ...)
Nenue@35 61 else
Nenue@35 62 print(' |cFFFF4400Update:|r skipping',handler.name)
Nenue@35 63 end
Nenue@35 64
Nenue@35 65 if handler.numWatched >= 1 then
Nenue@35 66 hasStuff = true
Nenue@35 67 currentPosition = currentPosition + 1
Nenue@35 68 Default.AddTracker(handler, frame, currentPosition)
Nenue@35 69
Nenue@35 70 else
Nenue@35 71 frame:ClearAllPoints()
Nenue@35 72 frame:SetPoint('BOTTOM', Scroll, 'BOTTOM', 0, 0)
Nenue@35 73 frame.destinationOffset = 0
Nenue@35 74 frame:Hide()
Nenue@35 75 frame.wasEmpty = true
Nenue@35 76 end
Nenue@35 77 end
Nenue@35 78
Nenue@35 79 -- do these whenever there is content or content is being added
Nenue@35 80 if hasStuff or insertingStuff then
Nenue@35 81 T:FinishWrapper()
Nenue@35 82 end
Nenue@35 83 Quest.GetClosest()
Nenue@35 84 --T.UpdateActionButtons(reason)
Nenue@35 85 if firstUpdate then
Nenue@35 86 firstUpdate = nil
Nenue@35 87 end
Nenue@35 88 end
Nenue@35 89
Nenue@35 90 Default.UpdateTracker = function (handler, reason, id, isNew)
Nenue@35 91 local print = tprint
Nenue@37 92 local frame = handler.frame
Nenue@35 93 local blockIndex = 0
Nenue@35 94
Nenue@37 95 print(format(' |cFFFF8800UpdateTracker|r(%s): %s', handler.name, reason))
Nenue@35 96 handler.updateReason = reason
Nenue@37 97 local numWatched, numAll, watchTable = handler:GetNumWatched(id, isNew)
Nenue@35 98
Nenue@37 99 if numWatched >= 1 then
Nenue@37 100 if watchTable then
Nenue@37 101 print('|cFF00FF00 n ID Obj wID Log Blk')
Nenue@37 102 for i, w in ipairs(watchTable) do
Nenue@37 103 print(format(' %2d => %6d %3d %3d %3s %s', i, w.id, w.numObjectives, w.watchIndex, (w.logIndex or ''), (handler.InfoBlock[w.id] and handler.InfoBlock[w.id]:GetName() or '')))
Nenue@37 104 end
Nenue@37 105 end
Nenue@35 106 end
Nenue@35 107
Nenue@37 108 handler.numWatched = numWatched
Nenue@37 109 handler.numAll = numAll
Nenue@35 110 handler.numBlocks = 0
Nenue@35 111 handler.currentBlock = 0
Nenue@37 112 handler.currentAnchor = frame.titlebg
Nenue@37 113 for blockIndex = 1, numWatched do
Nenue@35 114 local currentBlock = handler:UpdateBlock(blockIndex, id, isNew)
Nenue@35 115 if currentBlock then
Nenue@35 116 handler:AddBlock(currentBlock)
Nenue@35 117 else
Nenue@35 118 print(' |cFFFF9900finished|r @', blockIndex)
Nenue@35 119 break -- done with quest stuff
Nenue@35 120 end
Nenue@35 121 end
Nenue@35 122
Nenue@35 123
Nenue@35 124 local numBlocks = handler.numBlocks
Nenue@35 125 local used = handler.usedBlocks
Nenue@35 126 local free = handler.freeBlocks
Nenue@37 127 print(format(' (%s): |cFFFF8800%04X|r --- blocks |cFFFF8800%d|r, (used/free: |cFFFF8800%d|r/|cFFFF8800%d|r)', handler.name, band(reason, handler.updateReasonModule + handler.updateReasonEvents, reason), numBlocks, #used, #free))
Nenue@37 128 return numWatched, numAll
Nenue@35 129 end
Nenue@35 130
Nenue@37 131 Default.UpdateBlock = function (handler, index)
Nenue@35 132 local print = bprint
Nenue@37 133 if not index then
Nenue@35 134 return
Nenue@35 135 end
Nenue@37 136 local info = handler.WatchList[index] -- should match up with whatever the internal watch list has
Nenue@35 137 if not info then
Nenue@35 138 return
Nenue@35 139 end
Nenue@37 140 print(' Updating |cFF00FF00'..handler.displayName..'|r|cFF00FFFF'..index..'|r|cFF0099FF', info.id ,'|r')
Nenue@35 141 local frame = handler.frame
Nenue@35 142 local block = handler:GetBlock(info.id)
Nenue@35 143
Nenue@35 144 block.handler = handler
Nenue@35 145 block.info = info
Nenue@35 146
Nenue@37 147 info.blockIndex = index
Nenue@37 148 if info.id then
Nenue@37 149 print(' storing id', info.id, 'for', block:GetName())
Nenue@37 150 handler.InfoBlock[info.id] = block
Nenue@35 151 end
Nenue@37 152 if info.logIndex then
Nenue@37 153 print(' storing logIndex', info.logIndex, 'for', block:GetName())
Nenue@37 154 handler.LogBlock[info.logIndex] = block
Nenue@37 155 end
Nenue@37 156 if info.watchIndex then
Nenue@37 157 print(' storing watchIndex', info.watchIndex, 'for', block:GetName())
Nenue@37 158 handler.WatchBlock[info.watchIndex] = block
Nenue@37 159 end
Nenue@37 160 handler.BlockInfo[index] = info
Nenue@37 161 handler:UpdateObjectives(block)
Nenue@35 162
Nenue@35 163 block.title:SetText(info.title)
Nenue@35 164
Nenue@35 165 print(' |cFFFFFF00height|r:', block.height)
Nenue@35 166 print(' |cFF00FFFF)|r -> ', block, block:GetHeight())
Nenue@35 167
Nenue@35 168 block:Show()
Nenue@35 169
Nenue@35 170 if info.specialItem and not info.itemButton then
Nenue@35 171 print(' - |cFF00FFFFgenerating item button for info set')
Nenue@35 172 info.itemButton = T.SetItemButton(block, info)
Nenue@35 173 else
Nenue@35 174 --info.itemButton = nil
Nenue@35 175 end
Nenue@35 176
Nenue@35 177 local tagPoint, tagAnchor, tagRelative, x, y = 'TOPRIGHT', block, 'TOPRIGHT', -2, -2
Nenue@35 178
Nenue@35 179 local numCurrency = 0
Nenue@35 180 for i, rewardTile in ipairs(block.rewardTile) do
Nenue@35 181 if info.rewardInfo and info.rewardInfo[i] then
Nenue@35 182 local reward = info.rewardInfo[i]
Nenue@35 183 --rewardTile:SetPoint(tagPoint, tagAnchor, tagRelative, -2, -2)
Nenue@35 184 rewardTile:SetTexture(reward.texture)
Nenue@35 185 rewardTile:Show()
Nenue@35 186
Nenue@35 187 print('updating reward tile #'.. i, reward.type, reward.count, reward.text, reward.texture)
Nenue@35 188 if reward.count and reward.count > 1 then
Nenue@35 189 block.rewardLabel[i]:SetText(reward.count)
Nenue@35 190 block.rewardLabel[i]:Show()
Nenue@35 191 end
Nenue@35 192
Nenue@35 193 rewardTile:ClearAllPoints()
Nenue@35 194 rewardTile:SetPoint(tagPoint, tagAnchor, tagRelative, x, y)
Nenue@35 195 tagPoint, tagAnchor, tagRelative, x, y = 'TOPRIGHT', rewardTile, 'TOPLEFT', -2, 0
Nenue@35 196 else
Nenue@35 197 rewardTile:Hide()
Nenue@35 198 block.rewardLabel[i]:Hide()
Nenue@35 199 end
Nenue@35 200 end
Nenue@35 201
Nenue@35 202 if info.selected then
Nenue@35 203 block.SelectionOverlay:Show()
Nenue@35 204 else
Nenue@35 205 block.SelectionOverlay:Hide()
Nenue@35 206 end
Nenue@35 207
Nenue@35 208 if info.tagInfo then
Nenue@35 209 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'frequencyTag', tagPoint, tagAnchor, tagRelative)
Nenue@35 210 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'typeTag', tagPoint, tagAnchor, tagRelative)
Nenue@35 211 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'completionTag', tagPoint, tagAnchor, tagRelative)
Nenue@35 212 end
Nenue@35 213
Nenue@37 214 if info.schema then
Nenue@37 215 block.schema = info.schema
Nenue@37 216 end
Nenue@37 217
Nenue@35 218 if info.statusKey and (Devian and Devian.InWorkspace()) then
Nenue@37 219 block.debugText:SetText(tostring(info.statusKey) .. ' ' .. tostring(block.posIndex) .. ' '.. tostring(info.logIndex))
Nenue@35 220 block.debugText:Show()
Nenue@35 221 end
Nenue@35 222 return block
Nenue@35 223 end
Nenue@35 224
Nenue@37 225 Default.UpdateObjectives = function(handler, block)
Nenue@35 226 local print = lprint
Nenue@37 227 local block_schema = block.schema
Nenue@35 228 local info = block.info
Nenue@35 229 print(' |cFF00FF00default.objectives', block:GetName())
Nenue@35 230 -- reset the starting positions
Nenue@35 231 block.endPoint = block.titlebg
Nenue@35 232 block.attachmentHeight = 0
Nenue@35 233 block.currentLine = 0
Nenue@35 234
Nenue@35 235 local displayObjectiveHeader = false
Nenue@35 236
Nenue@35 237 block.attachmentHeight = 0
Nenue@35 238 local text, attachment, template
Nenue@35 239
Nenue@35 240
Nenue@35 241 if info.description and #info.description >= 1 then
Nenue@35 242 print(' |cFF00FFFF header line:|r', info.description)
Nenue@35 243 text = info.description
Nenue@35 244 handler:AddLine(block, text, nil)
Nenue@35 245 end
Nenue@35 246
Nenue@35 247 if (info.isComplete or info.numObjectives == 0) and info.completionText then
Nenue@35 248 print(' overriding line #1 for completion text:', info.completionText)
Nenue@35 249 text = info.completionText
Nenue@35 250 handler:AddLine(block, text, nil, 'completed')
Nenue@35 251 else
Nenue@35 252 if info.objectives then
Nenue@35 253 for i, data in ipairs(info.objectives) do
Nenue@35 254 local line = handler:GetLine(block)
Nenue@35 255 displayObjectiveHeader = true
Nenue@35 256 line.height = 0
Nenue@35 257 text, attachment, template = handler:UpdateLine(block, line, data)
Nenue@35 258 print(' |cFF88FF00#', i, data.type, text, attachment)
Nenue@35 259 handler:AddLine(block, text, attachment, template)
Nenue@35 260
Nenue@35 261 end
Nenue@35 262 end
Nenue@35 263 end
Nenue@35 264
Nenue@35 265 if block.currentLine < block.numLines then
Nenue@35 266 print(' - cull', block.currentLine, block.numLines)
Nenue@35 267 for i = block.currentLine + 1, block.numLines do
Nenue@35 268 print(' - hide |cFFFF0088'..i..'|r', block.lines[i])
Nenue@35 269 block.lines[i]:ClearAllPoints()
Nenue@35 270 block.lines[i]:Hide()
Nenue@35 271 end
Nenue@35 272 end
Nenue@35 273
Nenue@35 274 if block.currentLine > 0 then
Nenue@35 275 block.attachmentHeight = block.attachmentHeight
Nenue@35 276 print(' |cFF00FF00attachment:', block.attachmentHeight)
Nenue@35 277 end
Nenue@35 278 return block_schema
Nenue@35 279 end
Nenue@35 280
Nenue@35 281 Default.UpdateLine = function(handler, block, line, data)
Nenue@35 282 return data.text, line.widget, 'normal'
Nenue@35 283 end
Nenue@35 284
Nenue@35 285 Default.Select = function(handler, block)
Nenue@35 286 T:Update()
Nenue@35 287 end
Nenue@35 288 Default.Open = function(handler, block)
Nenue@37 289 T:Update(handler.updateReasonModule)
Nenue@35 290 end
Nenue@35 291 Default.Remove = function(handler, block)
Nenue@37 292 T:Update(handler.updateReasonModule)
Nenue@35 293 end
Nenue@35 294 Default.Report = function(handler, block)
Nenue@35 295 print('Stats:', handler.numWatched,'items tracked,', handler.numBlocks,'blocks assigned.')
Nenue@35 296 end
Nenue@35 297
Nenue@35 298 Default.OnMouseUp = function(self, button)
Nenue@35 299 print(self.handler.name, self.mainStyle, self.subStyle)
Nenue@35 300 if button == 'LeftButton' then
Nenue@35 301 if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then
Nenue@35 302 self.Link(self.handler, self)
Nenue@35 303 elseif IsModifiedClick("QUESTWATCHTOGGLE") then
Nenue@35 304 self.Remove(self.handler, self)
Nenue@35 305 else
Nenue@35 306 self.Select(self.handler, self)
Nenue@35 307 end
Nenue@35 308 elseif button == 'RightButton' then
Nenue@35 309 self.Open(self.handler, self)
Nenue@35 310 end
Nenue@35 311 self.initialButton = nil
Nenue@35 312 self.modChatLink = nil
Nenue@35 313 self.modQuestWatch = nil
Nenue@37 314 --T:Update(self.handler.updateReasonModule)
Nenue@35 315 print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r')
Nenue@35 316 end
Nenue@35 317 Default.OnMouseDown = function(self, button)
Nenue@35 318 print(self.info.title)
Nenue@35 319 end