Mercurial > wow > buffalo2
comparison ObjectiveTracker/Frame.lua @ 28:c33c17dd97e7
file renames
| author | Nenue |
|---|---|
| date | Wed, 13 Apr 2016 20:19:37 -0400 |
| parents | |
| children | adcd7c328d07 |
comparison
equal
deleted
inserted
replaced
| 27:c3aa94bc6be2 | 28:c33c17dd97e7 |
|---|---|
| 1 --- ${PACKAGE_NAME} | |
| 2 -- @file-author@ | |
| 3 -- @project-revision@ @project-hash@ | |
| 4 -- @file-revision@ @file-hash@ | |
| 5 -- Created: 3/30/2016 12:49 AM | |
| 6 local B = select(2,...).frame | |
| 7 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') | |
| 8 local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band | |
| 9 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion | |
| 10 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent | |
| 11 local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText | |
| 12 local PERCENTAGE_STRING, GetQuestProgressBarPercent = PERCENTAGE_STRING, GetQuestProgressBarPercent | |
| 13 local Default, AutoQuest, Quest, Bonus, Cheevs = T.DefaultHandler, T.AutoQuest, T.Quest, T.Bonus, T.Cheevs | |
| 14 local InCombatLockdown, format, lshift, CreateFrame = InCombatLockdown, format, bit.lshift, CreateFrame | |
| 15 local print = B.print('Tracker') | |
| 16 local unitLevel = 1 | |
| 17 local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_REASON | |
| 18 local debug = false | |
| 19 -------------------------------------------------------------------- | |
| 20 --- Global frame layout | |
| 21 -------------------------------------------------------------------- | |
| 22 | |
| 23 --- Upvalues | |
| 24 local Wrapper = _G.VeneerObjectiveWrapper | |
| 25 local Scroller = Wrapper.scrollArea | |
| 26 local Scroll = _G.VeneerObjectiveScroll | |
| 27 local orderedHandlers = T.orderedHandlers | |
| 28 local orderedNames = T.orderedNames | |
| 29 | |
| 30 --- Temp values set during updates | |
| 31 local wrapperWidth, wrapperHeight | |
| 32 local scrollWidth, scrollHeight | |
| 33 local previousBlock | |
| 34 local currentBlock | |
| 35 --- todo: source these from config | |
| 36 local itemButtonSize, itemButtonSpacing = 36, 1 | |
| 37 | |
| 38 local headerHeight, headerColor, headerSpacing = 16, {1,1,1,1}, 2 | |
| 39 local headerbg = {'VERTICAL', 1, 1, 0.5, 0.5, 1, 1, 0.5, 0} | |
| 40 local headerFont, headerSize, headerOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 14, 'OUTLINE' | |
| 41 | |
| 42 local titlebg = {'HORIZONTAL', 1, 0, .7, .25, 1, 0, .7, .125} | |
| 43 local titlebg_daily = {'HORIZONTAL', 0, .7, 1, .25, 0, 1, .7, .125 } | |
| 44 local titlebg_account = {'HORIZONTAL', 0, .45, 1, .25, 0, .45, 1, .125} | |
| 45 local titleFont, titleSize, titleOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'OUTLINE' | |
| 46 | |
| 47 local textbg = {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0 } | |
| 48 local textbg_daily = {'HORIZONTAL', 0, .7, 1, .1, 0, 1, .7, .075 } | |
| 49 local textbg_account = {'HORIZONTAL', 0, .45, 1, 0.4, 0, .41, 1, .085 } | |
| 50 local textFont, textSize, textOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]], 16, 'OUTLINE' | |
| 51 | |
| 52 | |
| 53 local selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225} | |
| 54 local titleSpacing, textSpacing, blockSpacing = 3, 3, 1 | |
| 55 local titleIndent, textIndent,selectionIndent = 2, 5, 50 | |
| 56 | |
| 57 local wrapperMaxWidth, wrapperMaxHeight = 270, 490 -- these are the hard bounds, actual *Height variables are changed | |
| 58 local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE' | |
| 59 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0 } | |
| 60 local rewardSize = 32 | |
| 61 local oprint = B.print('Objectives') | |
| 62 local bprint = B.print('Block') | |
| 63 local tprint = B.print('Tracker') | |
| 64 local lprint = B.print('Line') | |
| 65 | |
| 66 local currentPosition, anchorFrame, anchorPoint | |
| 67 | |
| 68 --- Positioning and stuff | |
| 69 local tick = 0 | |
| 70 function T:Update (reason, ...) | |
| 71 tick = tick + 1 | |
| 72 local print = tprint | |
| 73 reason = reason or OBJECTIVE_TRACKER_UPDATE_REASON | |
| 74 local updateWrapper = 0 | |
| 75 local hasStuff | |
| 76 local insertingStuff | |
| 77 | |
| 78 print(format('%d |cFFFF%04X Update()', tick, lshift(reason, 4)), reason, ...) | |
| 79 currentPosition = 0 | |
| 80 anchorPoint = 'TOP' | |
| 81 anchorFrame = Scroll | |
| 82 | |
| 83 local wrapperHeight = 0 | |
| 84 for id, handler in pairs(T.orderedHandlers) do | |
| 85 local frame = handler.frame | |
| 86 | |
| 87 print(format('|cFF00FFFF%s and(%04X vs %04x+%04x) = %04X|r', handler.name, reason, handler.updateReasonModule, handler.updateReasonEvents, band(reason, handler.updateReasonModule + handler.updateReasonEvents))) | |
| 88 if band(reason, handler.updateReasonModule + handler.updateReasonEvents) > 0 then | |
| 89 handler:Update(reason, ...) | |
| 90 print(' |cFF00FF00'..id..'|r', handler.displayName, 'count:', handler.numWatched) | |
| 91 insertingStuff = true | |
| 92 else | |
| 93 print(' |cFFFF0088'..id..'|r', 'no reason to update') | |
| 94 end | |
| 95 | |
| 96 if handler.numWatched >= 1 then | |
| 97 hasStuff = true | |
| 98 currentPosition = currentPosition + 1 | |
| 99 frame:SetParent(Scroll) | |
| 100 frame:SetPoint('TOP', anchorFrame, anchorPoint, 0, 0) | |
| 101 print(' |cFF00BBFFpinning to', anchorFrame:GetName(), anchorPoint) | |
| 102 anchorFrame = handler.frame | |
| 103 anchorPoint = 'BOTTOM' | |
| 104 | |
| 105 print('current frame height:', frame.height) | |
| 106 wrapperHeight = wrapperHeight + frame.height | |
| 107 print('|cFFFF0088total height:', wrapperHeight) | |
| 108 else | |
| 109 handler.frame:Hide() | |
| 110 end | |
| 111 end | |
| 112 | |
| 113 | |
| 114 if hasStuff or insertingStuff then | |
| 115 print('updating height to', wrapperHeight) | |
| 116 Wrapper:SetHeight(wrapperHeight) | |
| 117 Scroller:SetHeight(wrapperHeight) | |
| 118 Scroll:SetHeight(wrapperHeight) | |
| 119 Scroller:SetVerticalScroll(B.Conf.ObjectiveScroll or 0) | |
| 120 print('|cFFFF8800Wrapper:', Wrapper:GetSize()) | |
| 121 for i = 1, Wrapper:GetNumPoints() do | |
| 122 print(' ', Wrapper:GetPoint(i)) | |
| 123 end | |
| 124 print(' |cFF00FFFFScroller:', Scroller:GetSize()) | |
| 125 for i = 1, Scroller:GetNumPoints() do | |
| 126 print(' ', Scroller:GetPoint(i)) | |
| 127 end | |
| 128 print(' |cFF00FFFFScroll:', Scroll:GetSize()) | |
| 129 for i = 1, Scroll:GetNumPoints() do | |
| 130 print(' ', Scroll:GetPoint(i)) | |
| 131 end | |
| 132 | |
| 133 Wrapper:Show() | |
| 134 Scroller:Show() | |
| 135 Scroll:Show() | |
| 136 end | |
| 137 Quest.GetClosest() | |
| 138 --T.UpdateActionButtons(reason) | |
| 139 end | |
| 140 | |
| 141 T.AddBlock = function(self, block) | |
| 142 local print = bprint | |
| 143 local tracker = self.frame | |
| 144 local info = block.info | |
| 145 currentBlock:SetPoint('TOPLEFT', self.currentAnchor, 'BOTTOMLEFT', 0, 0) | |
| 146 currentBlock:SetPoint('RIGHT', tracker,'RIGHT', 0, 0) | |
| 147 self.currentAnchor = currentBlock | |
| 148 print(' |cFFFFFF00'..tracker.height..'|r', '|cFF00FF00'..currentBlock:GetName()..'|r', currentBlock.height, tracker.height) | |
| 149 tracker.height = tracker.height + currentBlock.height | |
| 150 tracker.numBlocks = max(tracker.numBlocks, info.blockIndex) | |
| 151 tracker.actualBlocks = tracker.actualBlocks + 1 | |
| 152 end | |
| 153 | |
| 154 --- Used as an iterator of sorts for cascaded tag icon placements (the daily/faction/account icons) | |
| 155 T.AddTag = function (block, tagName, tagPoint, tagAnchor, tagRelative) | |
| 156 local print = bprint | |
| 157 local tag = block[tagName] | |
| 158 if block.info[tagName] and tag then | |
| 159 tag:SetTexCoord(unpack(block.info[tagName])) | |
| 160 tag:Show() | |
| 161 tag:SetPoint(tagPoint, tagAnchor, tagRelative, 0, 0) | |
| 162 tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', tag, 'TOPLEFT' | |
| 163 else | |
| 164 block[tagName]:Hide() | |
| 165 end | |
| 166 return tagPoint, tagAnchor, tagRelative | |
| 167 end | |
| 168 | |
| 169 --- Adds the given line to the current content and advances the anchor pointer to that new line for the following call. | |
| 170 T.AddLine = function(block, line) | |
| 171 local print = lprint | |
| 172 line:ClearAllPoints() | |
| 173 line:SetPoint('LEFT', block, 'LEFT', 0, 0) | |
| 174 line:SetPoint('TOP', block.endPoint, 'BOTTOM', 0, -textSpacing) | |
| 175 line:SetPoint('RIGHT', block, 'RIGHT', 0, 0) | |
| 176 line:SetHeight(line.height) | |
| 177 line:Show() | |
| 178 | |
| 179 block.endIndex = line.index | |
| 180 block.numLines = block.numLines + 1 | |
| 181 block.attachmentHeight = block.attachmentHeight + (line.height + textSpacing) | |
| 182 print(' |cFF0088FFsetting line #'..block.numLines..' for|r', block.info.title, "\n |cFF0088FFsize:|r", line.height, | |
| 183 "|cFF0088FFpoint:|r", line:GetPoint(1), "|cFF0088FFwidget:|r", (line.widget and 'Y' or 'N')) | |
| 184 block.endPoint = line | |
| 185 end | |
| 186 | |
| 187 --- Creates or retrieves a complete line data object | |
| 188 T.GetLine = function(handler, block, lineIndex) | |
| 189 local print = lprint | |
| 190 local blockIndex = block.index | |
| 191 if not block.lines then | |
| 192 block.lines = {} | |
| 193 end | |
| 194 local lines = block.lines | |
| 195 if not lines[lineIndex] then | |
| 196 print(' |cFF00FF88created line #'..lineIndex..' from for '..handler.name..' block #'..blockIndex) | |
| 197 lines[lineIndex] = CreateFrame('Frame', 'Vn'..handler.name .. blockIndex..'ObjectiveLine'..lineIndex, block, 'VeneerTrackerObjective') | |
| 198 local line = lines[lineIndex] | |
| 199 line.index = lineIndex | |
| 200 line.height = 0 | |
| 201 line.status:SetSpacing(textSpacing) | |
| 202 line.status:SetPoint('LEFT', line, 'LEFT', textIndent, 0) | |
| 203 B.SetConfigLayers(line) | |
| 204 | |
| 205 if lines[lineIndex+1] then | |
| 206 lines[lineIndex+1]:ClearAllPoints() | |
| 207 end | |
| 208 | |
| 209 if debug then | |
| 210 for _, region in ipairs(lines[lineIndex].debug) do | |
| 211 region:Show() | |
| 212 end | |
| 213 end | |
| 214 | |
| 215 end | |
| 216 return lines[lineIndex] | |
| 217 end | |
| 218 | |
| 219 --- Creates or retrieves a complete block frame object | |
| 220 T.GetBlock = function(handler, blockIndex) | |
| 221 local print = bprint | |
| 222 local block = handler.usedBlocks[blockIndex] | |
| 223 | |
| 224 if not handler.usedBlocks[blockIndex] then | |
| 225 if #handler.freeBlocks >= 1 then | |
| 226 block = handler.freeBlocks[#handler.freeBlocks] | |
| 227 handler.freeBlocks[#handler.freeBlocks] = nil | |
| 228 else | |
| 229 block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, Scroll, 'VeneerTrackerBlock') | |
| 230 | |
| 231 | |
| 232 | |
| 233 local c = T.Conf.Wrapper | |
| 234 block.index = blockIndex | |
| 235 block.SetStyle = T.SetBlockStyle | |
| 236 block:SetWidth(c.Width) | |
| 237 | |
| 238 block.title:SetSpacing(c.TitleSpacing) | |
| 239 block.title:SetPoint('TOP', block, 'TOP', 0, -titleSpacing) | |
| 240 | |
| 241 block.titlebg:SetTexture(1,1,1,1) | |
| 242 block.titlebg:SetGradientAlpha(unpack(T.colors.default.titlebg)) | |
| 243 block.titlebg:SetPoint('TOP', block, 'TOP', 0, 0) | |
| 244 block.titlebg:SetPoint('BOTTOM', block.title, 'BOTTOM', 0, -titleSpacing) | |
| 245 | |
| 246 block.status:SetSpacing(c.TextSpacing) | |
| 247 block.status:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, -textSpacing) | |
| 248 block.status:SetPoint('LEFT', block.titlebg, 'LEFT', textIndent, 0) | |
| 249 | |
| 250 block.statusbg:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, 0) | |
| 251 block.statusbg:SetPoint('BOTTOM', block, 'BOTTOM', 0, 0) | |
| 252 block.statusbg:SetTexture(1,1,1,1) | |
| 253 block.statusbg:SetGradientAlpha(unpack(T.colors.default.textbg)) | |
| 254 | |
| 255 block.SelectionOverlay:SetGradientAlpha(unpack(T.colors.default.selectionbg)) | |
| 256 block.SelectionOverlay:SetPoint('TOPLEFT', selectionIndent, 0) | |
| 257 block.SelectionOverlay:SetPoint('BOTTOMRIGHT') | |
| 258 | |
| 259 block.icon:SetSize(rewardSize, rewardSize) | |
| 260 block.icon:SetPoint('TOPRIGHT', block, 'TOPRIGHT', -2, -2) | |
| 261 | |
| 262 | |
| 263 --- methods for event handlers | |
| 264 | |
| 265 block.Select = handler.Select | |
| 266 block.Open = handler.Open | |
| 267 block.Remove = handler.Remove | |
| 268 block.Link = handler.Link | |
| 269 block.clickZone:SetScript('OnMouseUp', function(self, ...) handler.OnMouseUp(block, ...) end) | |
| 270 block.clickZone:SetScript('OnMouseDown', function(self, ...) handler.OnMouseDown(block, ...) end) | |
| 271 block.attachmentHeight = 0 | |
| 272 block:ClearAllPoints() | |
| 273 | |
| 274 B.SetConfigLayers(block) | |
| 275 | |
| 276 if debug then | |
| 277 for _, region in ipairs(block.debug) do | |
| 278 region:Show() | |
| 279 end | |
| 280 end | |
| 281 end | |
| 282 handler.usedBlocks[blockIndex] = block | |
| 283 end | |
| 284 return handler.usedBlocks[blockIndex] | |
| 285 end | |
| 286 | |
| 287 --- Content generator base | |
| 288 Default.Update = function (self, reason, ...) | |
| 289 local print = tprint | |
| 290 local tracker = self.frame | |
| 291 local blockIndex = 0 | |
| 292 tracker.previousHeight = tracker.height | |
| 293 tracker.height = 0 | |
| 294 | |
| 295 tracker.title:SetFont(headerFont, headerSize, headerOutline) | |
| 296 tracker.titlebg:SetHeight(headerHeight) | |
| 297 tracker.title:SetTextColor(unpack(headerColor)) | |
| 298 | |
| 299 self.currentAnchor = tracker.titlebg | |
| 300 local numWatched = self:GetNumWatched() | |
| 301 local numBlocks = self.numBlocks | |
| 302 local actualBlocks = 0 | |
| 303 for watchIndex = 1, 25 do | |
| 304 blockIndex = blockIndex + 1 | |
| 305 if watchIndex <= numWatched then | |
| 306 local info = self:GetInfo(watchIndex) | |
| 307 if info then | |
| 308 local currentBlock = self:UpdateBlock(blockIndex, info) | |
| 309 T.AddBlock(currentBlock) | |
| 310 else | |
| 311 print(' |cFFFF0000bad GetInfo data for #'..watchIndex) | |
| 312 end | |
| 313 elseif watchIndex <= numBlocks then | |
| 314 local used = self.usedBlocks | |
| 315 local free = self.freeBlocks | |
| 316 print('clean up dead quest block') | |
| 317 if used[blockIndex] then | |
| 318 used[blockIndex]:Hide() | |
| 319 used[blockIndex]:ClearAllPoints() | |
| 320 free[#free+1]= used[blockIndex] | |
| 321 used[blockIndex] = nil | |
| 322 end | |
| 323 else | |
| 324 print(' |cFFFF9900END|r @', blockIndex) | |
| 325 break -- done with quest stuff | |
| 326 end | |
| 327 end | |
| 328 | |
| 329 self.numWatched = numWatched | |
| 330 self.numBlocks = numBlocks | |
| 331 self.actualBlocks = actualBlocks | |
| 332 | |
| 333 if numBlocks >= 1 then | |
| 334 tracker.height = tracker.height + headerHeight | |
| 335 tracker:Show() | |
| 336 | |
| 337 if tracker.wasEmpty then | |
| 338 tracker.headerFade:Play() | |
| 339 tracker.wasEmpty = nil | |
| 340 end | |
| 341 if tracker.height ~= tracker.previousHeight then | |
| 342 tracker:SetHeight(tracker.height) | |
| 343 end | |
| 344 else | |
| 345 tracker:Hide() | |
| 346 tracker.wasEmpty = true | |
| 347 end | |
| 348 | |
| 349 return tracker.numWatched, tracker.numAll | |
| 350 end | |
| 351 | |
| 352 --- Updates the selected block frame to display the given info batch | |
| 353 -- If `previousBlock` is set, it will attempt to anchor to that | |
| 354 -- @param blockNum the ordered block to be updated, not a watchIndex value | |
| 355 -- @param info the reference returned by the GetXInfo functions | |
| 356 -- REMEMBER: t.info and questData[questID] are the same table | |
| 357 Default.UpdateBlock = function (handler, blockIndex, info) | |
| 358 local print = bprint | |
| 359 print(' Read list item |cFF00FFFF'..blockIndex..'|r') | |
| 360 if not blockIndex or not info then | |
| 361 return | |
| 362 end | |
| 363 local frame = handler.frame | |
| 364 local block = T.GetBlock(handler, blockIndex) | |
| 365 block.handler = handler | |
| 366 block.info = info | |
| 367 block.mainStyle = info.mainStyle or 'Normal' | |
| 368 block.subStyle = info.subStyle | |
| 369 | |
| 370 info.blockIndex = blockIndex | |
| 371 if info.questID then handler.QuestBlock[info.questID] = block end | |
| 372 if info.questLogIndex then handler.LogBlock[info.questLogIndex] = block end | |
| 373 if info.watchIndex then handler.WatchBlock[info.watchIndex] = block end | |
| 374 handler.BlockInfo[blockIndex] = info | |
| 375 | |
| 376 block.endPoint = block.titlebg | |
| 377 block.attachmentHeight = 0 | |
| 378 handler:UpdateObjectives(block) | |
| 379 | |
| 380 block.title:SetText(info.title) | |
| 381 local titleHeight = floor(block.title:GetHeight()+.5) | |
| 382 local statusHeight = floor(block.status:GetHeight()+.5) | |
| 383 local attachmentHeight =floor(block.attachmentHeight + .5) | |
| 384 local titlebgHeight = titleHeight + titleSpacing*2 | |
| 385 local statusbgHeight = statusHeight + textSpacing*2 | |
| 386 | |
| 387 block.titlebg:SetHeight(titlebgHeight) | |
| 388 | |
| 389 | |
| 390 print(' |cFF0088FFanchor to', handler.currentAnchor:GetName()) | |
| 391 | |
| 392 print(' |cFF00FF00total sizes:') | |
| 393 print(' attachment:', attachmentHeight) | |
| 394 print(' title:', titlebgHeight, '('.. titleHeight..')') | |
| 395 --block.titlebg:SetHeight(block.title:GetHeight() + T.Conf.Wrapper.TitleSpacing) | |
| 396 block.height = titlebgHeight + attachmentHeight | |
| 397 if statusHeight > 1 then | |
| 398 block.height = block.height + statusbgHeight | |
| 399 print(' status:', statusbgHeight, '('.. statusHeight..')') | |
| 400 else | |
| 401 print(' |cFFFF0088 skipped') | |
| 402 end | |
| 403 block:SetHeight(block.height) | |
| 404 | |
| 405 print(' |cFFFFFF00height|r:', block.height) | |
| 406 print(' |cFF00FFFF)|r -> ', block, block:GetHeight()) | |
| 407 | |
| 408 block:Show() | |
| 409 | |
| 410 if info.specialItem and not info.itemButton then | |
| 411 print(' - |cFF00FFFFgenerating item button for info set') | |
| 412 info.itemButton = T.SetItemButton(block, info) | |
| 413 else | |
| 414 --info.itemButton = nil | |
| 415 end | |
| 416 | |
| 417 local tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', block, 'TOPRIGHT' | |
| 418 | |
| 419 if info.rewardInfo then | |
| 420 print('has immediate reward') | |
| 421 if info.rewardInfo[1].type == 'currency' or info.rewardInfo[1].type == 'item' then | |
| 422 block.icon:Show() | |
| 423 block.iconLabel:SetText(info.rewardInfo[1].count) | |
| 424 block.icon:SetPoint(tagPoint, tagAnchor, tagRelative, -2, -2) | |
| 425 tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', block.icon, 'TOPLEFT' | |
| 426 block.icon:SetTexture(info.rewardInfo[1].texture) | |
| 427 end | |
| 428 else | |
| 429 block.icon:Hide() | |
| 430 end | |
| 431 | |
| 432 if info.selected then | |
| 433 block.SelectionOverlay:Show() | |
| 434 else | |
| 435 block.SelectionOverlay:Hide() | |
| 436 end | |
| 437 -- workaround for scrollchild issue where layers fall out of sync: in this case, it's by 1 vertical pixel | |
| 438 --block.highlight:SetPoint('TOPLEFT', block, 'TOPLEFT', 0, 1) | |
| 439 --block.lowlight:SetPoint('BOTTOMLEFT', block, 'BOTTOMLEFT', 0, 1) | |
| 440 | |
| 441 tagPoint, tagAnchor, tagRelative = T.AddTag(block, 'frequencyTag', tagPoint, tagAnchor, tagRelative) | |
| 442 tagPoint, tagAnchor, tagRelative = T.AddTag(block, 'typeTag', tagPoint, tagAnchor, tagRelative) | |
| 443 tagPoint, tagAnchor, tagRelative = T.AddTag(block, 'completionTag', tagPoint, tagAnchor, tagRelative) | |
| 444 | |
| 445 return block | |
| 446 end | |
| 447 | |
| 448 | |
| 449 | |
| 450 | |
| 451 --- Does the main iterations for populating block content. | |
| 452 -- Hooked by corresponding handler functions where additional details need to be sorted. | |
| 453 Default.UpdateObjectives = function(handler, block) | |
| 454 local print = lprint | |
| 455 local info = block.info | |
| 456 print(' |cFF00FF00default objectives routine', block:GetName()) | |
| 457 | |
| 458 -- reset the starting positions | |
| 459 block.attachmentHeight = 0 | |
| 460 block.endPoint = block.titlebg | |
| 461 local completionScore, completionMax = 0, 0 | |
| 462 local displayObjectiveHeader = false | |
| 463 | |
| 464 | |
| 465 --- The first line is going to be used no matter what, so it is hard-pulled. | |
| 466 -- It also ensures that we're in the right position for cleaning up the leftover lines. | |
| 467 local lineIndex = 1 | |
| 468 local line = T.GetLine(handler, block, lineIndex) | |
| 469 | |
| 470 block.numLines = 0 | |
| 471 block.attachmentHeight = 0 | |
| 472 | |
| 473 if info.description and #info.description >= 1 then | |
| 474 print(' |cFF00FFFF header line:|r', info.description) | |
| 475 line.status:SetText(info.description) | |
| 476 line.height = floor(line.status:GetStringHeight()+.5) + textSpacing | |
| 477 if line.widget then | |
| 478 line.widget:Hide() | |
| 479 end | |
| 480 T.AddLine(block, line) | |
| 481 | |
| 482 lineIndex = lineIndex + 1 | |
| 483 line = T.GetLine(handler, block, lineIndex) | |
| 484 end | |
| 485 | |
| 486 if (info.isComplete or info.numObjectives == 0) and info.completionText then | |
| 487 print(' overriding line #1 for completion text:', info.completionText) | |
| 488 line.status:SetText(info.completionText) | |
| 489 line.height = floor(line.status:GetStringHeight()+.5) + textSpacing | |
| 490 if line.widget then | |
| 491 line.widget:Hide() | |
| 492 end | |
| 493 T.AddLine(block, line) | |
| 494 else | |
| 495 if info.objectives then | |
| 496 for i, data in ipairs(info.objectives) do | |
| 497 print(' |cFF88FF00#', i, data.type, data.text) | |
| 498 displayObjectiveHeader = true | |
| 499 line.height = 0 | |
| 500 handler:UpdateLine(block, line, data) | |
| 501 | |
| 502 -- For progressbar and timer lines, status text may be used as the title heading | |
| 503 if line.widget then | |
| 504 local widgetPosition = 0 | |
| 505 --- WIDGET POSITION ------------------------------------------------- | |
| 506 line.widget:SetPoint('TOP', line, 'TOP', 0, -widgetPosition) | |
| 507 line.widget:Show() | |
| 508 line.height = line.widget:GetHeight() + textSpacing | |
| 509 --------------------------------------------------------------------- | |
| 510 if line.displayText and #line.displayText >= 1 then | |
| 511 widgetPosition = line.status:GetHeight() + textSpacing | |
| 512 line.status:SetText(line.displayText) | |
| 513 line.height = floor(line.status:GetStringHeight()+.5) + textSpacing + line.widget.height | |
| 514 print(' - progressbar has text, adjust') | |
| 515 end | |
| 516 elseif line.displayText then | |
| 517 line.status:SetText(line.displayText) | |
| 518 line.height = floor(line.status:GetStringHeight()+.5) | |
| 519 end | |
| 520 | |
| 521 T.AddLine(block, line) | |
| 522 | |
| 523 --print(' sz', line:GetWidth(), line:GetHeight(), 'pt', line:GetPoint(1)) | |
| 524 --print(' |cFF44BBFF#', i, 'anchoring line, size:', line.height, 'current endpoint:', line.statusbg) | |
| 525 | |
| 526 lineIndex = lineIndex + 1 | |
| 527 line = T.GetLine(handler, block, lineIndex) | |
| 528 end | |
| 529 end | |
| 530 end | |
| 531 | |
| 532 while (block.lines[lineIndex+1]) do | |
| 533 print(' - hide |cFFFF0088'..lineIndex..'|r') | |
| 534 block.lines[lineIndex]:Hide() | |
| 535 lineIndex = lineIndex +1 | |
| 536 end | |
| 537 | |
| 538 | |
| 539 | |
| 540 if lineIndex > 0 then | |
| 541 block.attachmentHeight = block.attachmentHeight + textSpacing * 2 | |
| 542 print(' |cFF00FF00attachment:', block.attachmentHeight) | |
| 543 end | |
| 544 | |
| 545 | |
| 546 --[[ | |
| 547 local lines = handler.lines[block.index] | |
| 548 if lines and #lines > block.numLines then | |
| 549 print(' |cFFFF008' .. (#lines - block.numLines) .. ' extra lines to hide.') | |
| 550 for i = block.numLines + 1, #lines do | |
| 551 print(' hide', i, lines[i]:GetName()) | |
| 552 lines[i]:Hide() | |
| 553 end | |
| 554 end | |
| 555 ]] | |
| 556 | |
| 557 | |
| 558 if debug then | |
| 559 for i, region in ipairs(block.debug) do | |
| 560 for j = 1, region:GetNumPoints() do | |
| 561 local _, target = region:GetPoint(j) | |
| 562 if target:IsVisible() then | |
| 563 region:Hide() | |
| 564 else | |
| 565 region:Show() | |
| 566 end | |
| 567 end | |
| 568 end | |
| 569 end | |
| 570 | |
| 571 block.completionScore = completionScore / completionMax | |
| 572 end | |
| 573 | |
| 574 | |
| 575 --- Module-specific display variables | |
| 576 -- * height - height of whatever display widget is involved in conveying the task | |
| 577 -- * money - boolean that determines listening for money events or not | |
| 578 -- * progress - number ranging 0 to 2 indicating none/partial/full completion respectively | |
| 579 | |
| 580 | |
| 581 Default.UpdateLine = function(block, line) | |
| 582 if line.finished then | |
| 583 line.progress = 2 | |
| 584 elseif line.quantity > 0 then | |
| 585 line.progress = 1 | |
| 586 else | |
| 587 line.progress = 0 | |
| 588 end | |
| 589 return line | |
| 590 end | |
| 591 ---------- | |
| 592 --- Top level methods | |
| 593 | |
| 594 --- Queue any active item buttons for update for that frame | |
| 595 local iprint = B.print('ItemButton') | |
| 596 T.UpdateActionButtons = function(updateReason) | |
| 597 local print = iprint | |
| 598 Scroller.snap_upper = 0 | |
| 599 Scroller.snap_lower = 0 | |
| 600 local print = B.print('ItemButton') | |
| 601 if updateReason then | |
| 602 print = B.print('IB_'..updateReason) | |
| 603 end | |
| 604 | |
| 605 local previousItem | |
| 606 for questID, itemButton in pairs(Quest.itemButtons) do | |
| 607 local info= T.Quest.Info[questID] | |
| 608 | |
| 609 print('|cFF00FFFF'.. questID .. '|r', itemButton:GetName()) | |
| 610 local block = T.Quest.QuestBlock[questID] | |
| 611 if block then | |
| 612 -- Dispatch the probe | |
| 613 if IsQuestWatched(info.questLogIndex) then | |
| 614 itemButton.previousItem = previousItem | |
| 615 print(' |cFFFFFF00probing', block:GetName()) | |
| 616 block:SetScript('OnUpdate', function() | |
| 617 if block:GetBottom() and not InCombatLockdown() then | |
| 618 print(' '..block:GetName()..' |cFF00FF00probe hit!') | |
| 619 T.UpdateBlockAction(block, itemButton, itemButton.previousItem) -- needs to be previousItem from this scope | |
| 620 block:SetScript('OnUpdate', nil) | |
| 621 | |
| 622 end | |
| 623 end) | |
| 624 previousItem = itemButton | |
| 625 else | |
| 626 print('hidden block or unwatched quest') | |
| 627 itemButton.previousItem = nil | |
| 628 itemButton:Hide() | |
| 629 end | |
| 630 elseif itemButton:IsVisible() then | |
| 631 print(' |cFFFF0088hiding unwatched quest button', itemButton:GetName()) | |
| 632 itemButton.previousItem = nil | |
| 633 itemButton:Hide() | |
| 634 else | |
| 635 print(' |cFFBBBBBBignoring hidden log quest button', itemButton:GetName()) | |
| 636 end | |
| 637 end | |
| 638 end | |
| 639 | |
| 640 T.UpdateBlockAction = function (block, itemButton) | |
| 641 local print = iprint | |
| 642 print('**|cFF0088FF'..itemButton:GetName(), '|r:Update()') | |
| 643 if itemButton.questID ~= block.info.questID then | |
| 644 print('** |cFFFF0088mismatched block assignment', itemButton.questID,'<~>', block.info.questID) | |
| 645 -- something happened between this and last frame, go back and set new probes | |
| 646 return T.UpdateActionButtons() | |
| 647 end | |
| 648 | |
| 649 local previousItem = itemButton.previousItem | |
| 650 local upper_bound = Scroller:GetTop() + Scroller.snap_upper | |
| 651 local lower_bound = Scroller:GetBottom() + Scroller.snap_lower + itemButtonSize | |
| 652 local point, anchor, relative | |
| 653 | |
| 654 if block:GetBottom() < lower_bound then | |
| 655 print('** ',block:GetName() ,'|cFFFFFF00bottom =', floor(block:GetBottom()+.5), 'threschold =', floor(lower_bound+.5)) | |
| 656 if previousItem then | |
| 657 print('adjusting', previousItem:GetName()) | |
| 658 previousItem:ClearAllPoints() | |
| 659 previousItem:SetPoint('BOTTOM', itemButton, 'TOP', 0, itemButtonSpacing) | |
| 660 end | |
| 661 itemButton:ClearAllPoints() | |
| 662 itemButton.x = Wrapper:GetLeft() -4 | |
| 663 itemButton.y = Wrapper:GetBottom() | |
| 664 point, anchor, relative = 'BOTTOMRIGHT', UIParent, 'BOTTOMLEFT' | |
| 665 Scroller.snap_lower = Scroller.snap_lower + itemButtonSize + itemButtonSpacing | |
| 666 | |
| 667 elseif block:GetTop() > upper_bound then | |
| 668 print('** ',block:GetName() ,'|cFFFFFF00top =', floor(block:GetTop()+.5), 'threschold =', floor(upper_bound+.5)) | |
| 669 itemButton:ClearAllPoints() | |
| 670 if previousItem then | |
| 671 print('latch onto another piece') | |
| 672 point, anchor, relative ='TOP', previousItem, 'BOTTOM' | |
| 673 itemButton.x = 0 | |
| 674 itemButton.y = -itemButtonSpacing | |
| 675 else | |
| 676 print('latch at corner', Scroller:GetLeft() -itemButtonSpacing, Scroller:GetTop()) | |
| 677 point, anchor, relative = 'TOPRIGHT', UIParent, 'BOTTOMLEFT' | |
| 678 itemButton.x = Scroller:GetLeft() -4 | |
| 679 itemButton.y = Scroller:GetTop() | |
| 680 end | |
| 681 itemButton:Show() | |
| 682 Scroller.snap_upper = Scroller.snap_upper - (itemButtonSize + itemButtonSpacing) | |
| 683 else | |
| 684 print('** ',block:GetName() ,'|cFF00FF00span =', floor(block:GetBottom()+.5), floor(block:GetTop()+.5), 'threschold =', floor(lower_bound+.5)) | |
| 685 itemButton:ClearAllPoints() | |
| 686 itemButton.x = block:GetLeft() - itemButtonSpacing | |
| 687 itemButton.y = block:GetTop() | |
| 688 point, anchor, relative = 'TOPRIGHT', UIParent, 'BOTTOMLEFT' | |
| 689 end | |
| 690 | |
| 691 itemButton:SetPoint(point, anchor, relative, itemButton.x, itemButton.y) | |
| 692 itemButton:Show() | |
| 693 end | |
| 694 | |
| 695 T.UpdateItemButtonCooldown = function(button) | |
| 696 | |
| 697 end | |
| 698 | |
| 699 Default.Select = function(self) | |
| 700 T:Update(self.watchReasonModule) | |
| 701 end | |
| 702 Default.Open = function(self) | |
| 703 T:Update(self.watchReasonModule) | |
| 704 end | |
| 705 Default.Remove = function(self) | |
| 706 T:Update(self.watchReasonModule) | |
| 707 end | |
| 708 Default.Report = function(self) | |
| 709 print('Stats:', self.numWatched,'items tracked,', self.numBlocks,'blocks assigned.') | |
| 710 end | |
| 711 | |
| 712 Default.OnMouseUp = function(self, button) | |
| 713 | |
| 714 print(self.handler.name, self.mainStyle, self.subStyle) | |
| 715 if button == 'LeftButton' then | |
| 716 if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then | |
| 717 self:Link() | |
| 718 elseif IsModifiedClick("QUESTWATCHTOGGLE") then | |
| 719 self:Remove() | |
| 720 else | |
| 721 self:Select() | |
| 722 end | |
| 723 elseif button == 'RightButton' then | |
| 724 self:Open() | |
| 725 end | |
| 726 self.initialButton = nil | |
| 727 self.modChatLink = nil | |
| 728 self.modQuestWatch = nil | |
| 729 mod:Update(self.handler.updateReasonModule) | |
| 730 print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r') | |
| 731 end | |
| 732 | |
| 733 Default.OnMouseDown = function(self, button) | |
| 734 | |
| 735 print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE")) | |
| 736 print(self.info.title) | |
| 737 end |
