comparison ObjectiveFrame.lua @ 14:ed642234f017

ObjectiveFrame - implement proper tracker name text - expanded tracker prototypes to cover "objective lines" formatting and accommodation of widget variables - implement the progress bars for bonus objectives ObjectiveStyle - moved `UpdateWrapperStyle` over and renamed it to fit semantics - change the formula for block.`height` to measure non-widget content only - allows widgets to position relative to text - size FontString `status` to match block.`height` - full block height is acquired by adding block.`height` and block.`attachmentHeight` which is calculated during objective parsing ObjectiveWidgets - use string keys for generated widgets to deal with multiple objectives under the same questID, and maybe dungeon objectives - wrapper buttons use a common code path - specialized handlers for wheel scrolling moved over to fit semantics
author Nenue
date Mon, 04 Apr 2016 03:16:22 -0400
parents 9455693fc290
children f660f1c1e0aa
comparison
equal deleted inserted replaced
13:9455693fc290 14:ed642234f017
3 -- @project-revision@ @project-hash@ 3 -- @project-revision@ @project-hash@
4 -- @file-revision@ @file-hash@ 4 -- @file-revision@ @file-hash@
5 -- Created: 3/30/2016 12:49 AM 5 -- Created: 3/30/2016 12:49 AM
6 local B = select(2,...).frame 6 local B = select(2,...).frame
7 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') 7 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
8 local ipairs, max, min, unpack, floor, pairs, tostring, type = ipairs, max, min, unpack, floor, pairs, tostring, type 8 local ipairs, max, min, unpack, floor, pairs, tostring, type, band = ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
9 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion 9 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion
10 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent 10 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
11 local Quest, Bonus, Cheevs = mod.Quest, mod.Bonus, mod.Cheevs
11 local CreateFrame = CreateFrame 12 local CreateFrame = CreateFrame
12 local print = B.print('Objectives') 13 local print = B.print('Objectives')
13 local unitLevel = 1 14 local unitLevel = 1
14 -------------------------------------------------------------------- 15 --------------------------------------------------------------------
15 --- Global frame layout 16 --- Global frame layout
38 local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE' 39 local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE'
39 local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24 40 local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24
40 local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2 41 local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2
41 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0} 42 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0}
42 43
43 --- These are mostly aesthetic choices so it lives here 44
44 45 mod.InitializeWrapper = function()
45 46
46 local Scroller_OnShow = function() 47 mod.SetBlockStyle(Scroller, 'Scroller', 'Normal')
47 Wrapper.watchMoneyReasons = 0; 48 mod.SetBlockStyle(Scroller, 'Scroll', 'Normal')
48 mod.UpdateWrapper() 49 mod.SetBlockStyle(Wrapper, 'Wrapper', 'Normal')
49 mod.SetEvents()
50 for i, region in ipairs(Wrapper.headerComplex) do
51 region:Show()
52 end
53 end
54
55 local Scroller_OnHide = function()
56 local self = Wrapper
57 Wrapper:UnregisterAllEvents()
58 Wrapper:SetScript('OnEvent', nil)
59 for i, region in ipairs(Wrapper.headerComplex) do
60 region:Hide()
61 end
62 end
63
64 local Scroller_OnMouseWheel = function(self, delta)
65 local r = Scroll:GetHeight() - Scroller:GetHeight()
66 local s = B.Conf.ObjectiveScroll - delta * floor(r/5+.5)
67 local from = self:GetVerticalScroll()
68 if s >= r then
69 s = r
70 elseif s < 1 then
71 s = 0
72 end
73 self:SetVerticalScroll(s)
74 B.Conf.ObjectiveScroll = s
75 print('|cFF00FF00OnMouseWheel', 'from = ', from, 'scroll =', s, ' range =', r, 'current =', self:GetVerticalScroll())
76
77 mod.UpdateActionButtons('SCROLLING')
78 end
79
80 local WrapperCloseButton_OnClick = function(self)
81 Wrapper:Minimize()
82 if B.Conf.FrameState[Wrapper:GetName()] == 1 then
83 self:GetNormalTexture():SetTexture([[Interface\PaperDollInfoFrame\UI-Character-SkillsPageDown-Up]])
84 self:GetPushedTexture():SetTexture([[Interface\PaperDollInfoFrame\UI-Character-SkillsPageDown-Down]])
85 else
86 self:GetNormalTexture():SetTexture([[Interface\PaperDollInfoFrame\UI-Character-SkillsPageUp-Up]])
87 self:GetPushedTexture():SetTexture([[Interface\PaperDollInfoFrame\UI-Character-SkillsPageUp-Down]])
88 end
89 end
90 local WrapperCloseButton_OnMouseWheel = function(self, delta)
91 end
92
93 mod.InitializeTrackers = function()
94
95 50
96 for i, name in ipairs(orderedNames) do 51 for i, name in ipairs(orderedNames) do
97 if not mod.orderedHandlers[i] then 52 if not mod.orderedHandlers[i] then
98 if mod.Tracker(name, i) then 53 if mod.Tracker(name, i) then
99 local handler = mod[name] 54 local handler = mod[name]
100
101 local tracker = CreateFrame('Frame', 'Veneer'..name..'Tracker', Scroll, 'VeneerTrackerTemplate') 55 local tracker = CreateFrame('Frame', 'Veneer'..name..'Tracker', Scroll, 'VeneerTrackerTemplate')
102 tracker.title:SetText(name) 56 tracker.title:SetText(handler.displayName)
103 mod.SetBlockStyle(tracker, 'Tracker', 'Normal') 57 mod.SetBlockStyle(tracker, 'Tracker', 'Normal')
104
105 handler.Tracker = tracker 58 handler.Tracker = tracker
106 mod.orderedTrackers[i] = tracker 59 mod.orderedTrackers[i] = tracker
107 mod.namedTrackers[name] = tracker 60 mod.namedTrackers[name] = tracker
108 mod.indexedTrackers[handler] = tracker 61 mod.indexedTrackers[handler] = tracker
109 print('created new tracker frames for new handler') 62 print('created new tracker frames for new handler')
110
111
112 end 63 end
113 end 64 end
114 end 65 end
115 66
116 Scroller:SetScrollChild(Scroll) 67 Scroller:SetScrollChild(Scroll)
117 Scroller:SetScript('OnMouseWheel', Scroller_OnMouseWheel) 68
118 Scroller:SetScript('OnShow', Scroller_OnShow) 69 mod.InitializeWrapperWidgets()
119 Scroller:SetScript('OnHide', Scroller_OnHide)
120 Wrapper.close:SetScript('OnClick', WrapperCloseButton_OnClick)
121 Wrapper.close:SetScript('OnMouseWheel', WrapperCloseButton_OnMouseWheel)
122 Wrapper:SetPoint(unpack(wrapperPosition))
123 if B.Conf.ObjectiveTrackerMinimized then 70 if B.Conf.ObjectiveTrackerMinimized then
124 Scroller_OnShow(Scroller) 71 Scroller_OnShow(Scroller)
125 end 72 end
126 mod.UpdateWrapperStyle() 73 mod.UpdateWrapperStyle()
127 end 74 end
206 end 153 end
207 end 154 end
208 155
209 156
210 157
211 local segments = {'Left', 'Right', 'Tile'} 158 mod.UpdateTracker = function(handler)
212 mod.UpdateWrapperStyle = function()
213 --[[for _, segment in ipairs(segments) do
214 local texture, a1, a2, a3, a4, width = unpack(mod.defaults.Style.Wrapper.BackgroundComplex[segment])
215 Wrapper['Background'..segment]:SetAtlas(texture)
216 Wrapper['Background'..segment]:SetTexCoord(a1, a2, a3, a4)
217 if width then
218 Wrapper['Background'..segment]:SetWidth(width)
219 end
220 end]]
221 end
222
223 --- Updates the selected block frame to display the given info batch
224 -- If `previousBlock` is set, it will attempt to anchor to that
225 -- @param blockNum the ordered block to be updated, not a watchIndex value
226 -- @param info the reference returned by the GetXInfo functions
227 -- REMEMBER: t.info and questData[questID] are the same table
228 mod.UpdateTrackerBlock = function (handler, blockIndex, info)
229 local print = B.print('ObjectiveBlockParse')
230 print(' |cFF00FFFFUpdateTrackerBlock('..blockIndex..'|r')
231 if not blockIndex or not info then
232 return
233 end
234
235 local mainStyle = 'Normal'
236 local subStyle
237 local tracker = handler.Tracker 159 local tracker = handler.Tracker
238 160 print('|cFFFF4400'..tracker:GetName().. '|r:Update()')
239 local t = handler:GetBlock(blockIndex)
240 if previousBlock then
241 t:SetPoint('TOPLEFT', previousBlock, 'BOTTOMLEFT', 0, 0)
242 t:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
243 end
244 --print(t:GetName(), t:GetSize())
245 --print(t:GetPoint(1))
246
247 t.info = info
248
249 if info.questID then handler.QuestBlock[info.questID] = t end
250 if info.questLogIndex then handler.LogBlock[info.questLogIndex] = t end
251 if info.watchIndex then handler.WatchBlock[info.watchIndex] = t end
252
253 info.blockIndex = blockIndex
254 handler.BlockInfo[blockIndex] = info
255
256 t.Select = handler.Select
257 t.Open = handler.Open
258 t.Remove = handler.Remove
259 t.Link = handler.Link
260 t:SetScript('OnMouseUp', handler.OnMouseUp)
261 t:SetScript('OnMouseDown', handler.OnMouseDown)
262 t.title:SetText(info.title)
263
264 t.attachmentHeight = 0
265 if info.isComplete then
266 t.status:Show()
267 t.status:SetText(info.completionText)
268 elseif info.numObjectives >= 1 then
269 t.attachmentHeight = textSpacing
270 t.status:Show()
271 print(' - objective lines:', info.numObjectives, 'can wrap:', t.status:CanWordWrap())
272
273 local text = ''
274
275 --- todo: implement objective displays
276 -- in an accumulator loop, call upon handler for the appropriate display frame, each defining:
277 -- * height - height of whatever display widget is involved in conveying the task
278 -- * lines - number of non-wrapped text lines to account for line space; may be discarded depending on things
279 -- * money - boolean that determines listening for money events or not
280 -- * progress - number ranging 0 to 2 indicating none/partial/full completion respectively
281 text = mod.UpdateObjectives(t, info, text)
282
283 t.status:SetText(text)
284 t.status:SetWordWrap(true)
285
286 elseif info.description then
287 t.status:SetText(info.description)
288 t.status:SetWordWrap(true)
289 else
290 t.status:SetText(nil)
291 end
292
293 if info.isComplete then
294 mainStyle = 'Complete'
295 end
296 if info.superTracked then
297 subStyle = 'Super'
298 elseif info.isDaily then
299 subStyle = 'Daily'
300 end
301
302 if info.specialItem and not info.itemButton then
303 print(' - |cFF00FFFFgenerating item button for info set')
304 info.itemButton = mod.SetItemButton(t, info)
305 else
306 --info.itemButton = nil
307 end
308
309 if info.level then
310 local levelDiff = unitLevel - info.level
311 if levelDiff > 9 then
312 t.title:SetTextColor(0.7, 0.7, 0.7, 1)
313 elseif levelDiff > 1 then
314 t.title:SetTextColor(0.5, 1, 0.5, 1)
315 elseif levelDiff < -1 then
316 t.title:SetTextColor(1, 0.4, 0.25, 1)
317 elseif levelDiff < -4 then
318 t.title:SetTextColor(1, 0, 0, 1)
319 else
320 t.title:SetTextColor(1,1,1,1)
321 end
322 end
323
324
325 if Devian and Devian.InWorkspace() then
326 t.debugText:Show()
327 t.debugText:SetText(tostring(blockIndex) .. '\n' .. tostring(info.itemButton and info.itemButton:GetName()) .. "\n" .. (info.level and info.level or '-'))
328 end
329
330 --- metrics are calculated in SetStyle
331 t:SetStyle('TrackerBlock', handler.name, mainStyle, subStyle)
332 t:Show()
333
334 print(' |cFF00FFFF)|r -> ', t, t:GetHeight())
335 return t
336 end
337
338 mod.UpdateObjectives = function(block, info, text)
339 local print = B.print('ObjectiveBlockParse')
340
341 local attachmentHeight = block.attachmentHeight
342 if info.description then
343 print(' -- has description text:', select('#', info.description), info.description)
344 text = info.description
345 end
346 local completionScore, completionMax = 0, 0
347 for o, obj in ipairs(info.objectives) do
348 --- achievement criteria
349 if obj.flags then
350
351
352 if bit.band(obj.flags, 0x00000001) > 0 then
353 obj.type = 'ProgressBar'
354 elseif bit.band(obj.flags, 0x00000002) then
355 obj.type = 'Hidden'
356 obj.widget = nil
357 else
358 obj.type = 'Text'
359 obj.widget = nil
360 text = text .. ((text == '') and "" or "\n") .. obj.text
361 end
362
363 print('obj.type =', obj.type)
364 print(' ** qtyStr:', obj.quantityString, 'qty:', obj.quantity, 'assetID:', obj.assetID)
365 obj.widget = mod.SetWidget(obj, info)
366 if obj.finished then
367 obj.progress = 2
368 elseif obj.quantity > 0 then
369 obj.progress = 1
370 else
371 obj.progress = 0
372 end
373
374
375 --- none of the above (most quests)
376 else
377 local line = obj.text
378 local color = '00FFFF'
379 if obj.finished then
380 obj.progress = 2
381 color = 'FFFFFF'
382 elseif obj.type == 'monster' then
383 color = 'FFFF00'
384 elseif obj.type == 'item' then
385 color = '44DDFF'
386 elseif obj.type == 'object' then
387 color = 'FF44DD'
388 end
389 text = text .. ((text == '') and "" or "\n") .. '|cFF'..color.. line .. '|r'
390 end
391
392 if obj.widget then
393
394 obj.widget:Show()
395 obj.widget:SetPoint('TOPLEFT', block.objectives, 'BOTTOMLEFT', 0, -attachmentHeight)
396 print('have a widget, height is', obj.widget.height)
397 attachmentHeight = attachmentHeight + obj.widget.height
398 completionScore = completionScore + obj.progress
399 completionMax = completionMax + 2
400 end
401
402 end
403
404 block.completionScore = completionScore / completionMax
405 block.attachmentHeight = attachmentHeight
406
407 return text
408 end
409
410 mod.UpdateTracker = function(handler)
411 print('|cFF00FF88UpdateTracker(|r|cFFFF4400' .. type(handler) .. '|r :: |cFF88FFFF' .. tostring(handler) .. '|r')
412 local tracker = handler.Tracker
413 local blockIndex = 0 161 local blockIndex = 0
414 local trackerHeight = headerHeight 162 local trackerHeight = headerHeight
415 local w = 300 163
416 164
417 previousBlock = tracker.title 165 previousBlock = tracker.title
418 local numWatched = handler.GetNumWatched() 166 local numWatched = handler.GetNumWatched()
419 local numBlocks = handler.numBlocks 167 local numBlocks = handler.numBlocks
420 local actualBlocks = 0 168 local actualBlocks = 0
423 if watchIndex <= numWatched then 171 if watchIndex <= numWatched then
424 local info = handler:GetInfo(watchIndex) 172 local info = handler:GetInfo(watchIndex)
425 if info then 173 if info then
426 local currentBlock = mod.UpdateTrackerBlock(handler, blockIndex, info) 174 local currentBlock = mod.UpdateTrackerBlock(handler, blockIndex, info)
427 previousBlock = currentBlock 175 previousBlock = currentBlock
428 print('|cFF00FF00'..currentBlock:GetName()..'|r', currentBlock.height) 176 print(' |cFFFFFF00'..watchIndex..'|r', '|cFF00FF00'..currentBlock:GetName()..'|r', currentBlock.height)
429 trackerHeight = trackerHeight + currentBlock.height 177 trackerHeight = trackerHeight + currentBlock.height
430 numBlocks = max(numBlocks, watchIndex) 178 numBlocks = max(numBlocks, watchIndex)
431 actualBlocks = actualBlocks + 1 179 actualBlocks = actualBlocks + 1
432 else 180 else
433 print('|cFFFF0000Failed to draw info for index #'..watchIndex) 181 print(' |cFFFF0000Failed to draw info for index #'..watchIndex)
434 end 182 end
435 183
436 elseif watchIndex <= numBlocks then 184 elseif watchIndex <= numBlocks then
437 local used = handler.usedBlocks 185 local used = handler.usedBlocks
438 local free = handler.freeBlocks 186 local free = handler.freeBlocks
442 used[blockIndex]:ClearAllPoints() 190 used[blockIndex]:ClearAllPoints()
443 free[#free+1]= used[blockIndex] 191 free[#free+1]= used[blockIndex]
444 used[blockIndex] = nil 192 used[blockIndex] = nil
445 end 193 end
446 else 194 else
447 print('Stopping scan at', blockIndex) 195 print(' |cFFFF9900END|r @', blockIndex)
448 break -- done with quest stuff 196 break -- done with quest stuff
449 end 197 end
450 end 198 end
451 handler.numWatched = numWatched 199 handler.numWatched = numWatched
452 handler.numBlocks = numBlocks 200 handler.numBlocks = numBlocks
453 handler.actualBlocks = actualBlocks 201 handler.actualBlocks = actualBlocks
454 handler:Report() 202 handler:Report()
455 previousBlock = nil 203
456 if numBlocks > 0 then 204 if numBlocks >= 1 then
205 previousBlock = nil
457 tracker.height = trackerHeight 206 tracker.height = trackerHeight
458 else 207 else
459 tracker.height = 0 208 tracker.height = 0
460 end 209 end
461 210
462 print('|cFF00FF88)|r ->', numBlocks, 'blocks; height', tracker.height, 'last block: ') 211 return tracker.numWatched, tracker.numAll
463 end 212 end
213
214 --- Updates the selected block frame to display the given info batch
215 -- If `previousBlock` is set, it will attempt to anchor to that
216 -- @param blockNum the ordered block to be updated, not a watchIndex value
217 -- @param info the reference returned by the GetXInfo functions
218 -- REMEMBER: t.info and questData[questID] are the same table
219 mod.UpdateTrackerBlock = function (handler, blockIndex, info)
220 local print = B.print('BlockParse')
221 print(' Read list item |cFF00FFFF'..blockIndex..'|r')
222 if not blockIndex or not info then
223 return
224 end
225 local tracker = handler.Tracker
226 local t = handler:GetBlock(blockIndex)
227 t.handler = handler
228 t.info = info
229 t.mainStyle = 'Normal'
230 t.subStyle = nil
231
232 info.blockIndex = blockIndex
233 if info.questID then handler.QuestBlock[info.questID] = t end
234 if info.questLogIndex then handler.LogBlock[info.questLogIndex] = t end
235 if info.watchIndex then handler.WatchBlock[info.watchIndex] = t end
236 handler.BlockInfo[blockIndex] = info
237
238
239 t.attachmentHeight = 0
240 --if info.isComplete then
241 --t.status:Show()
242 --t.status:SetText(info.completionText)
243 --end
244
245 if info.numObjectives >= 1 then
246 t.attachmentHeight = textSpacing
247 t.status:Show()
248 print(' lines to build:', info.numObjectives)
249
250 local text = ''
251
252 mod.UpdateObjectives(t, info, text)
253 elseif info.description then
254 t.status:SetText(info.description)
255 else
256 t.status:SetText(nil)
257 end
258 t.title:SetText(info.title)
259
260
261 if info.specialItem and not info.itemButton then
262 print(' - |cFF00FFFFgenerating item button for info set')
263 info.itemButton = mod.SetItemButton(t, info)
264 else
265 --info.itemButton = nil
266 end
267
268 handler.SetBlockTags(t, info)
269
270 if previousBlock then
271 t:SetPoint('TOPLEFT', previousBlock, 'BOTTOMLEFT', 0, 0)
272 t:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
273 print(' anchor to|cFF0088FF', previousBlock:GetName())
274 end
275
276 --- metrics are calculated in SetStyle
277 t:SetStyle('TrackerBlock', handler.name, t.mainStyle, t.subStyle)
278 t:Show()
279
280 print(' |cFF00FFFF)|r -> ', t, t:GetHeight())
281
282
283 if Devian and Devian.InWorkspace() then
284 t.debugText:Show()
285 t.debugText:SetText(tostring(blockIndex) .. '\n' .. tostring(info.itemButton and info.itemButton:GetName()) .. "\n" .. (tostring(t.mainStyle) .. '/' .. tostring(t.subStyle)))
286 end
287 return t
288 end
289
290 mod.UpdateObjectives = function(block, info, text)
291 local print = B.print('BlockLine')
292 print(' |cFF00FF00objective updates for', block:GetName())
293
294 local attachmentHeight = block.attachmentHeight
295 if info.description then
296 print(' -- has description text:', select('#', info.description), info.description)
297 text = info.description
298 end
299 local completionScore, completionMax = 0, 0
300
301 for i, line in ipairs(info.objectives) do
302 print(' |cFF88FF00objective', i)
303 block.handler.ParseObjective(line, info)
304
305 if line.title then
306 info.title = line.title
307 line.title = nil
308 end
309
310
311 if line.widget then
312 line.widget:Show()
313 line.widget:SetParent(block)
314 line.widget:SetPoint('TOPLEFT', block.status, 'BOTTOMLEFT', 0, -attachmentHeight )
315 print(' has a widget, height is', line.widget.height)
316 attachmentHeight = attachmentHeight + line.widget.height
317 completionScore = completionScore + line.progress
318 completionMax = completionMax + 2
319 end
320
321 if line.displayText then
322 print(' has text')
323 text = text .. ((text == '') and "" or "\n") .. '|cFF'..line.displayColor.. line.displayText .. '|r'
324 end
325
326 end
327
328 block.completionScore = completionScore / completionMax
329 block.attachmentHeight = attachmentHeight
330
331 block.status:SetText(text)
332 end
333
334 --- Objective parsers
335 -- defines the following variables
336 -- * height - height of whatever display widget is involved in conveying the task
337 -- * lines - number of non-wrapped text lines to account for line space; may be discarded depending on things
338 -- * money - boolean that determines listening for money events or not
339 -- * progress - number ranging 0 to 2 indicating none/partial/full completion respectively
340 mod.Tracker.ParseObjective = function(line, info)
341
342 if line.finished then
343 line.progress = 2
344 elseif line.quantity > 0 then
345 line.progress = 1
346 else
347 line.progress = 0
348 end
349
350 end
351
352 Bonus.ParseObjective = function(line, info)
353 local print = B.print('BonusLine')
354 for k,v in pairs(line) do
355 print(k, v)
356 end
357
358 line.displayColor = 'FFFFFF'
359 if line.text and not info.title then
360 line.title = line.text
361 else
362 line.displayText = line.text
363 end
364
365 line.progess = 0
366 if line.objectiveType == 'progressbar' then
367 print(' |cFFFF0088==|r', line.type, line.text)
368 line.widgetType = 'ProgressBar'
369 print(' |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID)))
370 line.value = GetQuestProgressBarPercent(info.questID) or 0
371 line.maxValue = 100
372 if line.value >= line.maxValue then
373 line.progress = 1
374 elseif line.value > 0 then
375 line.progress = 2
376 end
377 line.format = PERCENTAGE_STRING
378 line.widget = mod.SetWidget(line, info, 'ProgressBar', info.questID..'-'..line.index)
379 print('line.type =', line.type)
380 print(' ** qtyStr:', line.quantityString, 'qty:', line.value, 'assetID:', line.questID)
381 else
382 line.widget = nil
383 end
384 end
385
386 Cheevs.ParseObjective = function(line, info)
387 local print = B.print('CheevsLine')
388 line.progress = 0
389 if line.flags then
390 if band(line.flags, 0x00000001) > 0 then
391 line.format = "%d/%d"
392 line.widget = mod.SetWidget(line, info, 'ProgressBar', line.criteriaID)
393 elseif band(line.flags, 0x00000002) then
394 line.widget = nil
395 else
396 line.widget = nil
397 line.displayColor = 'FFFFFF'
398 line.displayText = line.text
399
400 end
401 end
402 print('line.type =', line.type)
403 print(' ** qtyStr:', line.quantityString, 'qty:', line.quantity, 'assetID:', line.assetID)
404 end
405
406 Quest.ParseObjective = function(line)
407 local print = B.print('QuestLine')
408 print(' |cFFFF0088', line.type)
409 local color = '00FFFF'
410 line.progress = 0
411 if line.finished then
412 line.progress = 2
413 color = 'FFFFFF'
414 elseif line.type == 'monster' then
415 color = 'FFFF00'
416 elseif line.type == 'item' then
417 color = '44DDFF'
418 elseif line.type == 'object' then
419 color = 'FF44DD'
420 end
421 line.displayColor = color
422 line.displayText = line.text
423 end
424
464 425
465 mod.Quest.numButtons = 0 426 mod.Quest.numButtons = 0
466 local usedButtons = mod.Quest.itemButtons 427 local usedButtons = mod.Quest.itemButtons
467 local freeButtons = mod.Quest.freeButtons 428 local freeButtons = mod.Quest.freeButtons
468 mod.UpdateWrapper = function() 429 mod.UpdateWrapper = function()
469 unitLevel = UnitLevel('player') 430 unitLevel = UnitLevel('player')
470 wrapperWidth = wrapperMaxWidth 431 wrapperWidth = mod.Conf.Wrapper.WrapperWidth
471 scrollWidth = wrapperWidth 432 scrollWidth = mod.Conf.Wrapper.WrapperWidth
472 local wrapperBlocks = 0 433 local wrapperBlocks = 0
473 -- Update scroll child vertical size 434 -- Update scroll child vertical size
474 scrollHeight = 0 435 scrollHeight = 0
475 for i, handler in ipairs(orderedHandlers) do 436 for i, handler in ipairs(orderedHandlers) do
476 mod.UpdateTracker(handler) 437 mod.UpdateTracker(handler)
438 local tracker = handler.Tracker
477 if handler.actualBlocks >= 1 then 439 if handler.actualBlocks >= 1 then
478 local tracker = handler.Tracker
479 print('setting', handler.Tracker, 'to anchor to offset', -scrollHeight)
480 tracker:SetParent(Scroll) 440 tracker:SetParent(Scroll)
481 tracker:SetPoint('TOPLEFT', Scroll, 'TOPLEFT', 0, - scrollHeight) 441 tracker:SetPoint('TOPLEFT', Scroll, 'TOPLEFT', 0, - scrollHeight)
482 tracker:SetSize(wrapperWidth, tracker.height) 442 tracker:SetSize(wrapperWidth, tracker.height)
483 print('adding ', tracker.height) 443 print('|cFF00FFFF'..tracker:GetName()..'|r h:|cFF00FF00', tracker.height, '|r y:|cFF00FF00', -scrollHeight)
484 scrollHeight = scrollHeight + tracker.height 444 scrollHeight = scrollHeight + tracker.height
445 tracker:Show()
446 else
447 tracker:Hide()
485 end 448 end
486 wrapperBlocks = wrapperBlocks + handler.actualBlocks 449 wrapperBlocks = wrapperBlocks + handler.actualBlocks
487 end 450 end
488 print('final scrollHeight:', scrollHeight) 451 print('final scrollHeight:', scrollHeight)
489 452
511 for i, region in ipairs(Wrapper.headerComplex) do 474 for i, region in ipairs(Wrapper.headerComplex) do
512 region:Hide() 475 region:Hide()
513 end 476 end
514 return 477 return
515 end 478 end
516 --wrapperHeight = scrollHeight 479 --[[wrapperHeight = scrollHeight
517 480
518 print('|cFFFFFF00params:|r scroller:', scrollWidth, 'x', scrollHeight) 481 print('|cFFFFFF00params:|r scroller:', scrollWidth .. ',' .. scrollHeight, 'scroll:', scrollWidth .. ',' .. scrollHeight,
519 print('|cFFFFFF00params:|r scroll:', scrollWidth, 'x', scrollHeight) 482 'wrapper:', wrapperWidth .. ',' .. wrapperHeight,
520 print('|cFFFFFF00params:|r wrapper:', wrapperWidth, 'x', wrapperHeight) 483 'header:', headerHeight)]]
521 print('|cFFFFFF00params:|r header:', headerHeight) 484
522 485 --Scroller:SetSize(wrapperWidth, wrapperHeight)
523 mod.SetBlockStyle(Scroller, 'Scroller', 'Normal')
524 mod.SetBlockStyle(Scroller, 'Scroll', 'Normal')
525 mod.SetBlockStyle(Wrapper, 'Wrapper', 'Normal')
526
527 Scroller:SetSize(wrapperWidth, wrapperHeight)
528 Scroller:SetPoint('TOPLEFT', Wrapper, 'TOPLEFT', 0, 0) 486 Scroller:SetPoint('TOPLEFT', Wrapper, 'TOPLEFT', 0, 0)
529 Scroller:SetPoint('BOTTOMRIGHT', Wrapper, 'BOTTOMRIGHT') 487 Scroller:SetPoint('BOTTOMRIGHT', Wrapper, 'BOTTOMRIGHT')
530 488
531 489
532 Scroll:SetSize(scrollWidth, scrollHeight) 490 Scroll:SetSize(scrollWidth, scrollHeight)
534 Scroll:SetPoint('RIGHT', Scroller, 'RIGHT') 492 Scroll:SetPoint('RIGHT', Scroller, 'RIGHT')
535 493
536 --Scroller:UpdateScrollChildRect() 494 --Scroller:UpdateScrollChildRect()
537 Wrapper:SetSize(wrapperWidth, wrapperHeight) 495 Wrapper:SetSize(wrapperWidth, wrapperHeight)
538 496
539 -- update action buttons 497 --[[ update action buttons
540 print('|cFF00FF00'..Scroll:GetName()..'|r:', Scroll:GetWidth(), Scroll:GetHeight(), 498 print('|cFF00FF00'..Scroll:GetName()..'|r:', Scroll:GetWidth(), Scroll:GetHeight(),
541 '|cFF00FF00'..Scroller:GetName()..'|r:', Scroller:GetWidth(), Scroller:GetHeight(), 499 '|cFF00FF00'..Scroller:GetName()..'|r:', Scroller:GetWidth(), Scroller:GetHeight(),
542 '|cFF00FF00'..Wrapper:GetName()..'|r:', Wrapper:GetWidth(), Wrapper:GetHeight(), 500 '|cFF00FF00'..Wrapper:GetName()..'|r:', Wrapper:GetWidth(), Wrapper:GetHeight(),
543 '|cFF0088FFvScrollRange|r:', floor(Scroller:GetVerticalScrollRange()+.5) 501 '|cFF0088FFvScrollRange|r:', floor(Scroller:GetVerticalScrollRange()+.5)
544 ) 502 )
545 mod.UpdateActionButtons('FULL_UPDATE') 503 mod.UpdateActionButtons()
504 --]]
546 505
547 end 506 end
548 507
549 --- Queue any active item buttons for update for that frame 508 --- Queue any active item buttons for update for that frame
550 mod.UpdateActionButtons = function(updateReason) 509 mod.UpdateActionButtons = function(updateReason)