comparison ObjectiveFrame.lua @ 10:f03c75f63566

ObjectiveStyle & ObjectiveFrame - abstract aesthetic details away from ObjectiveFrame - revise SetBlockStyle into a more general algorithm for every frame - implement caching of resolved attribute combinations - use loadstring functions to store resolved attributes and call upon those when, for example, a MouseUp leads a tracker block to restore its original style
author Nenue
date Sat, 02 Apr 2016 03:19:25 -0400
parents 2698173edd40
children 8238cddaddb1
comparison
equal deleted inserted replaced
9:2698173edd40 10:f03c75f63566
2 -- @file-author@ 2 -- @file-author@
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 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 = ipairs, max, min, unpack, floor, pairs, tostring, type
8 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion 9 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion
9 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent 10 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
10 local CreateFrame = CreateFrame 11 local CreateFrame = CreateFrame
11 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
12 local print = B.print('Objectives') 12 local print = B.print('Objectives')
13 -------------------------------------------------------------------- 13 --------------------------------------------------------------------
14 --- Global frame layout 14 --- Global frame layout
15 -------------------------------------------------------------------- 15 --------------------------------------------------------------------
16 16
24 --- Temp values set during updates 24 --- Temp values set during updates
25 local wrapperWidth, wrapperHeight 25 local wrapperWidth, wrapperHeight
26 local scrollWidth, scrollHeight 26 local scrollWidth, scrollHeight
27 local previousBlock 27 local previousBlock
28 local currentBlock 28 local currentBlock
29 --- todo: map these into config table when its sorted out 29 --- todo: source these from config
30 local itemButtonSize, itemButtonSpacing = 36, 1 30 local itemButtonSize, itemButtonSpacing = 36, 1
31 local titleFont, textFont = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]] 31 local titleFont, textFont = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]]
32 local titleSize, textSize = 15, 15 32 local titleSize, textSize = 15, 15
33 local titleOutline, textOutline = "OUTLINE", "OUTLINE" 33 local titleOutline, textOutline = "OUTLINE", "OUTLINE"
34 local titleSpacing, textSpacing = 4, 3 34 local titleSpacing, textSpacing = 4, 3
38 local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24 38 local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24
39 local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2 39 local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2
40 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0} 40 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0}
41 41
42 --- These are mostly aesthetic choices so it lives here 42 --- These are mostly aesthetic choices so it lives here
43 mod.defaults = { 43
44 ObjectiveTrackerAnchor = {'BOTTOM', 'RIGHT'},
45 ObjectiveTrackerParent = 'DebuffButton',
46 ObjectiveTrackerSize = {250, 600},
47 ObjectiveWrapperParent = '',
48 WrapperStyle = {
49 Header = {
50 Background = {Left = '', Right = '', Tile = ''},
51 BackgroundCrop = {Left = {0, 0.4, 0,1}, Right={0.6,1,0,1}, Tile = {0.4,.6,0,1,}},
52 BackgroundScale = {Left = 100, Right = 100},
53 Font = {wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline}
54 }
55 },
56 ObjectiveHeaderStyle = {
57 Normal = {
58 Gradient = {MinColor = {.05,.15,0.5,0.7}, MaxColor = {.05,.15,0.5,.35}},
59 Font = {headerFont, headerSize, headerOutline}, Spacing = headerSpacing,
60 }
61 },
62 ObjectiveTrackerStyle = {
63 Normal = {
64 Title = {
65 Gradient = { MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, .19}},
66 Font = {titleFont, titleSize, titleOutline}, Spacing = titleSpacing,
67 },
68 Text = {
69 Gradient = { MinColor = {0.2, .4, 1, 0.25}, MaxColor = {.7, 0, 0.9, .12}},
70 Font = {textFont, textSize, textOutline}, Spacing = textSpacing,
71 },
72 },
73 Super = {
74 Title = {
75 Gradient = { MinColor = {0, .7, .6, .8}, MaxColor = {0, .7, .6, 0.2}},
76 Font = {titleFont, titleSize, titleOutline},
77 Spacing = titleSpacing, BackgroundFullWidth = true
78 },
79 Text = {
80 Gradient = { MinColor = {0, .7, .6, 0.5}, MaxColor = {0, .7, .6, 0.1} },
81 Font = {textFont, textSize, textOutline}, Spacing = textSpacing,
82 },
83 },
84 Active = {
85 Title = {
86 Gradient = { MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, .4}, },
87 Font = {titleFont, titleSize, titleOutline},
88 Spacing = titleSpacing,
89 BackgroundFullWidth = true
90 },
91 Text = {
92 Gradient = { MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, .2}, },
93 Font = {textFont, textSize, textOutline},
94 Spacing = textSpacing,
95 BackgroundFullWidth = true
96 }
97 },
98 Complete = {
99 Title = {
100 Gradient = { MinColor = {0, 1, 0, 0.34}, MaxColor = {0, 1, 0, .17}, },
101 Font = {titleFont, titleSize, titleOutline}, Spacing = titleSpacing,
102 BackgroundFullWidth = true
103 },
104 Text = {
105 Gradient = { MinColor = {0, 1, 0, .25}, MaxColor = {0, 1, 0, 0.12}, },
106 Font = {textFont, textSize, textOutline}, Spacing = textSpacing,
107 BackgroundFullWidth = true
108 }
109 },
110 CheevNormal = {
111
112 Title = {
113 Gradient = { MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, .19}},
114 Font = {titleFont, titleSize, titleOutline}, Spacing = titleSpacing,
115 },
116 Text = {
117 Gradient = { MinColor = {0.2, .4, 1, 0.25}, MaxColor = {.7, 0, 0.9, .12}},
118 Font = {textFont, textSize, textOutline}, Spacing = textSpacing,
119 },
120 },
121 CheevComplete = {
122
123 Title = {
124 Gradient = { MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, .19}},
125 Font = {titleFont, titleSize, titleOutline}, Spacing = titleSpacing,
126 },
127 Text = {
128 Gradient = { MinColor = {0.2, .4, 1, 0.25}, MaxColor = {.7, 0, 0.9, .12}},
129 Font = {textFont, textSize, textOutline}, Spacing = textSpacing,
130 },
131 }
132 }
133 }
134
135 local FontBank = {
136 ['Normal'] = VeneerCriteriaFontNormal,
137 ['Progress'] = VeneerCriteriaFontProgress,
138 ['Complete'] = VeneerCriteriaFontComplete,
139 ['Failed'] = VeneerCriteriaFontFailed,
140 }
141 44
142 local Scroller_OnShow = function() 45 local Scroller_OnShow = function()
143 Wrapper.watchMoneyReasons = 0; 46 Wrapper.watchMoneyReasons = 0;
144 mod.UpdateWrapper() 47 mod.UpdateWrapper()
145 mod.SetEvents() 48 mod.SetEvents()
146 for i, region in ipairs(Wrapper.header) do 49 for i, region in ipairs(Wrapper.headerComplex) do
147 region:Show() 50 region:Show()
148 end 51 end
149 end 52 end
150 53
151 local Scroller_OnHide = function() 54 local Scroller_OnHide = function()
152 local self = Wrapper 55 local self = Wrapper
153 Wrapper:UnregisterAllEvents() 56 Wrapper:UnregisterAllEvents()
154 Wrapper:SetScript('OnEvent', nil) 57 Wrapper:SetScript('OnEvent', nil)
155 for i, region in ipairs(Wrapper.header) do 58 for i, region in ipairs(Wrapper.headerComplex) do
156 region:Hide() 59 region:Hide()
157 end 60 end
158 end 61 end
159 62
160 local Scroller_OnMouseWheel = function(self, delta) 63 local Scroller_OnMouseWheel = function(self, delta)
181 end 84 end
182 end 85 end
183 86
184 mod.InitializeTrackers = function() 87 mod.InitializeTrackers = function()
185 88
186 local c = mod.defaults.ObjectiveHeaderStyle.Normal
187 local g1, g2, g3, g4 = unpack(c.Gradient.MinColor)
188 local h1, h2, h3, h4 = unpack(c.Gradient.MaxColor)
189 89
190 for i, name in ipairs(orderedNames) do 90 for i, name in ipairs(orderedNames) do
191 if not mod.orderedHandlers[i] then 91 if not mod.orderedHandlers[i] then
192 if mod.Tracker(name, i) then 92 if mod.Tracker(name, i) then
193 local handler = mod[name] 93 local handler = mod[name]
194 94
195 local tracker = CreateFrame('Frame', 'Veneer'..name..'Tracker', Scroll, 'VeneerTrackerTemplate') 95 local tracker = CreateFrame('Frame', 'Veneer'..name..'Tracker', Scroll, 'VeneerTrackerTemplate')
196 tracker.header:SetText(handler.name) 96 tracker.title:SetText(name)
197 tracker.header:SetHeight(headerHeight) 97 mod.SetBlockStyle(tracker, 'Tracker', 'Normal')
198 tracker.header:SetFont(unpack(c.Font))
199 tracker.header:SetTextColor(unpack(headerColor))
200
201 tracker.headerbg:SetGradientAlpha('HORIZONTAL', g1, g2 ,g3, g4, h1, h2, h3, h4)
202 tracker.headerbg:SetHeight(headerHeight)
203 98
204 handler.Tracker = tracker 99 handler.Tracker = tracker
205 mod.orderedTrackers[i] = tracker 100 mod.orderedTrackers[i] = tracker
206 mod.namedTrackers[name] = tracker 101 mod.namedTrackers[name] = tracker
207 mod.indexedTrackers[handler] = tracker 102 mod.indexedTrackers[handler] = tracker
208 print('created new tracker frames for new handler') 103 print('created new tracker frames for new handler')
104
105
209 end 106 end
210 end 107 end
211 end 108 end
212 109
213 Scroller:SetScrollChild(Scroll) 110 Scroller:SetScrollChild(Scroll)
299 end 196 end
300 self.xpText:SetText(xp .. '/'.. xpmax .. (rest and (' ('..tostring(rest)..')') or '')) 197 self.xpText:SetText(xp .. '/'.. xpmax .. (rest and (' ('..tostring(rest)..')') or ''))
301 end 198 end
302 end 199 end
303 200
304 mod.UpdateReputation = function(self) 201
305 end
306
307 --- Argument containers
308 local a1, a2, a3, a4, b1, b2, b3, b4, f1, f2, f3, w1, w2
309 mod.SetBlockStyle = function(block, name)
310 -- var names intended to reflect argument order
311 --@debug@
312 local c = mod.defaults.ObjectiveTrackerStyle[name]
313 --@end-debug@
314 --[===[@non-debug
315 local c = mod.Conf
316 --@end-non-debug]===]
317 a1, a2, a3, a4 = unpack(c.Title.Gradient.MinColor)
318 b1, b2, b3, b4 = unpack(c.Title.Gradient.MaxColor)
319 block.titlebg:SetGradientAlpha('HORIZONTAL', a1, a2, a3, a4, b1, b2, b3, b4)
320
321 a1, a2, a3, a4 = unpack(c.Text.Gradient.MinColor)
322 b1, b2, b3, b4 = unpack(c.Text.Gradient.MaxColor)
323 block.bg:SetGradientAlpha('HORIZONTAL', a1, a2, a3, a4, b1, b2, b3, b4)
324
325 f1, f2, f3 = unpack(c.Title.Font)
326 block.title:SetFont(f1, f2, f3)
327
328 f1, f2 ,f3 = unpack(c.Text.Font)
329 block.objectives:SetFont(f1,f2,f3)
330
331 w1 = Wrapper:GetWidth()
332 w2 = (c.Title.BackgroundFullWidth and w1 or block.title:GetStringWidth())
333
334 local titleSpacing, titleSpacing2 = c.Title.Spacing, (c.Title.Spacing * 2)
335 local textSpacing, textSpacing2 = c.Text.Spacing, (c.Text.Spacing * 2)
336
337 if block.info.isTrivial then
338 block.title:SetTextColor(0.7, 0.7, 0.7, 1)
339 elseif block.info.isComplete then
340 block.title:SetTextColor(1,1,1,1)
341 else
342 block.title:SetTextColor(0,.7,1,1)
343 end
344 block.title:SetSpacing(titleSpacing)
345 block.objectives:SetSpacing(textSpacing)
346 block.objectives:SetWordWrap(true)
347
348 local titleHeight, textHeight = block.title:GetStringHeight(), block.objectives:GetStringHeight() + block.attachmentHeight
349 local blockHeight = titleHeight + titleSpacing2 + textHeight + textSpacing2
350 local blockWidth = wrapperMaxWidth
351
352 block.titlebg:SetSize(min(w1, w2), titleHeight + titleSpacing2)
353 block.bg:SetSize(w1, textHeight + textSpacing2)
354 block:SetSize(blockWidth, blockHeight)
355
356 block.title:SetPoint('TOPLEFT', block.titlebg, 'TOPLEFT', 0, -titleSpacing)
357 block.objectives:SetPoint('TOPLEFT', block.titlebg, 'BOTTOMLEFT', textIndent, -textSpacing)
358
359 -- store
360 block.titleHeight = titleHeight
361 block.textHeight = textHeight
362 block.width = blockWidth
363 block.height = blockHeight
364
365 print(' |cFF00FFFF'..block:GetName()..'|r:|cFF0088FFSetStyle|r(', blockWidth, 'x', blockHeight, '(textH', textHeight,', titleH', titleHeight, ')')
366 end
367 202
368 local segments = {'Left', 'Right', 'Tile'} 203 local segments = {'Left', 'Right', 'Tile'}
369 mod.UpdateWrapperStyle = function() 204 mod.UpdateWrapperStyle = function()
370 local c = mod.defaults.WrapperStyle 205 --[[for _, segment in ipairs(segments) do
371 for _, segment in ipairs(segments) do 206 local texture, a1, a2, a3, a4, width = unpack(mod.defaults.Style.Wrapper.BackgroundComplex[segment])
372 Wrapper['Background'..segment]:SetAtlas(c.Header.Background[segment]) 207 Wrapper['Background'..segment]:SetAtlas(texture)
373 Wrapper['Background'..segment]:SetTexCoord(unpack(c.Header.BackgroundCrop[segment])) 208 Wrapper['Background'..segment]:SetTexCoord(a1, a2, a3, a4)
374 if c.Header.BackgroundScale[segment] then 209 if width then
375 Wrapper['Background'..segment]:SetWidth(c.Header.BackgroundScale[segment]) 210 Wrapper['Background'..segment]:SetWidth(width)
376 end 211 end
377 end 212 end]]
378 end 213 end
379 214
380 --- Updates the selected block frame to display the given info batch 215 --- Updates the selected block frame to display the given info batch
381 -- If `previousBlock` is set, it will attempt to anchor to that 216 -- If `previousBlock` is set, it will attempt to anchor to that
382 -- @param blockNum the ordered block to be updated, not a watchIndex value 217 -- @param blockNum the ordered block to be updated, not a watchIndex value
383 -- @param info the reference returned by the GetXInfo functions 218 -- @param info the reference returned by the GetXInfo functions
384 -- REMEMBER: t.info and questData[questID] are the same table 219 -- REMEMBER: t.info and questData[questID] are the same table
385 mod.UpdateTrackerBlock = function (handler, blockIndex, info) 220 mod.UpdateTrackerBlock = function (handler, blockIndex, info)
221 local print = B.print('ObjectiveBlockParse')
386 print(' |cFF00FFFFUpdateTrackerBlock('..blockIndex..'|r') 222 print(' |cFF00FFFFUpdateTrackerBlock('..blockIndex..'|r')
387 if not blockIndex or not info then 223 if not blockIndex or not info then
388 return 224 return
389 end 225 end
390 226
227 local mainStyle = 'Normal'
228 local subStyle
391 local tracker = handler.Tracker 229 local tracker = handler.Tracker
392 230
393 local t = handler:GetBlock(blockIndex) 231 local t = handler:GetBlock(blockIndex)
394 if previousBlock then 232 if previousBlock then
395 if blockIndex == 1 then 233 t:SetPoint('TOPLEFT', previousBlock, 'BOTTOMLEFT', 0, 0)
396 t:SetPoint('TOPLEFT', previousBlock, 'TOPLEFT', 0, -headerHeight)
397 else
398 t:SetPoint('TOPLEFT', previousBlock, 'BOTTOMLEFT', 0, 0)
399 end
400 t:SetPoint('RIGHT', tracker,'RIGHT', 0, 0) 234 t:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
401 end 235 end
402 --print(t:GetName(), t:GetSize()) 236 --print(t:GetName(), t:GetSize())
403 --print(t:GetPoint(1)) 237 --print(t:GetPoint(1))
404 238
419 t:SetScript('OnMouseDown', handler.OnMouseDown) 253 t:SetScript('OnMouseDown', handler.OnMouseDown)
420 t.title:SetText(info.title) 254 t.title:SetText(info.title)
421 255
422 t.attachmentHeight = 0 256 t.attachmentHeight = 0
423 if info.isComplete then 257 if info.isComplete then
424 t.objectives:Show() 258 t.status:Show()
425 t.objectives:SetText(info.completionText) 259 t.status:SetText(info.completionText)
426 elseif info.numObjectives >= 1 then 260 elseif info.numObjectives >= 1 then
427 t.attachmentHeight = textSpacing 261 t.attachmentHeight = textSpacing
428 t.objectives:Show() 262 t.status:Show()
429 print(' - objective lines:', info.numObjectives, 'can wrap:', t.objectives:CanWordWrap()) 263 print(' - objective lines:', info.numObjectives, 'can wrap:', t.status:CanWordWrap())
430 264
431 local text = '' 265 local text = ''
432 266
433 --- todo: implement objective displays 267 --- todo: implement objective displays
434 -- in an accumulator loop, call upon handler for the appropriate display frame, each defining: 268 -- in an accumulator loop, call upon handler for the appropriate display frame, each defining:
435 -- * height of whatever display widget is involved in conveying the task 269 -- * height - height of whatever display widget is involved in conveying the task
436 -- * number of non-wrapped text lines to account for line space; may be discarded depending on things 270 -- * lines - number of non-wrapped text lines to account for line space; may be discarded depending on things
437 -- * boolean that determines listening for money events or not 271 -- * money - boolean that determines listening for money events or not
438 t.attachmentHeight, text = mod.UpdateObjectives(t, info, text) 272 -- * progress - number ranging 0 to 2 indicating none/partial/full completion respectively
439 273 text = mod.UpdateObjectives(t, info, text)
440 t.objectives:SetText(text) 274
441 t.objectives:SetWordWrap(true) 275 t.status:SetText(text)
442 276 t.status:SetWordWrap(true)
443
444 277
445 elseif info.description then 278 elseif info.description then
446 t.objectives:SetText(info.description) 279 t.status:SetText(info.description)
447 t.objectives:SetWordWrap(true) 280 t.status:SetWordWrap(true)
448 else 281 else
449 t.objectives:SetText(nil) 282 t.status:SetText(nil)
450 end 283 end
451 local style = 'Normal' 284
452 if info.isComplete then 285 if info.isComplete then
453 style = 'Complete' 286 mainStyle = 'Complete'
454 elseif info.superTracked then 287 end
455 style = 'Super' 288 if info.superTracked then
289 subStyle = 'Super'
456 end 290 end
457 291
458 if info.specialItem and not info.itemButton then 292 if info.specialItem and not info.itemButton then
459 print(' - |cFF00FFFFgenerating item button for info set') 293 print(' - |cFF00FFFFgenerating item button for info set')
460 info.itemButton = mod.SetItemButton(t, info) 294 info.itemButton = mod.SetItemButton(t, info)
466 t.debugText:Show() 300 t.debugText:Show()
467 t.debugText:SetText(tostring(blockIndex) .. '\n' .. tostring(info.itemButton and info.itemButton:GetName())) 301 t.debugText:SetText(tostring(blockIndex) .. '\n' .. tostring(info.itemButton and info.itemButton:GetName()))
468 end 302 end
469 303
470 --- metrics are calculated in SetStyle 304 --- metrics are calculated in SetStyle
471 t:SetStyle(style) 305 t:SetStyle('TrackerBlock', handler.name, mainStyle, subStyle)
472 t:Show() 306 t:Show()
473 307
474 print(' |cFF00FFFF)|r -> ', t, t:GetHeight()) 308 print(' |cFF00FFFF)|r -> ', t, t:GetHeight())
475 return t 309 return t
476 end 310 end
477 311
478 mod.UpdateObjectives = function(block, info, text) 312 mod.UpdateObjectives = function(block, info, text)
313 local print = B.print('ObjectiveBlockParse')
314
479 local attachmentHeight = block.attachmentHeight 315 local attachmentHeight = block.attachmentHeight
480 if info.description then 316 if info.description then
481 print(' -- has description text:', select('#', info.description), info.description) 317 print(' -- has description text:', select('#', info.description), info.description)
482 text = info.description 318 text = info.description
483 end 319 end
320 local completionScore, completionMax = 0, 0
484 for o, obj in ipairs(info.objectives) do 321 for o, obj in ipairs(info.objectives) do
485 --- achievement criteria 322 --- achievement criteria
486 if obj.flags then 323 if obj.flags then
487 324
488 325
498 end 335 end
499 336
500 print('obj.type =', obj.type) 337 print('obj.type =', obj.type)
501 print(' ** qtyStr:', obj.quantityString, 'qty:', obj.quantity, 'assetID:', obj.assetID) 338 print(' ** qtyStr:', obj.quantityString, 'qty:', obj.quantity, 'assetID:', obj.assetID)
502 obj.widget = mod.SetWidget(obj, info) 339 obj.widget = mod.SetWidget(obj, info)
340 if obj.finished then
341 obj.progress = 2
342 elseif obj.quantity > 0 then
343 obj.progress = 1
344 else
345 obj.progress = 0
346 end
347
348
503 --- none of the above (most quests) 349 --- none of the above (most quests)
504 else 350 else
505 local line = obj.text 351 local line = obj.text
506 local color = '00FFFF' 352 local color = '00FFFF'
507 if obj.finished then 353 if obj.finished then
354 obj.progress = 2
508 color = 'FFFFFF' 355 color = 'FFFFFF'
509 elseif obj.type == 'monster' then 356 elseif obj.type == 'monster' then
510 color = 'FFFF00' 357 color = 'FFFF00'
511 elseif obj.type == 'item' then 358 elseif obj.type == 'item' then
512 color = '44DDFF' 359 color = '44DDFF'
520 367
521 obj.widget:Show() 368 obj.widget:Show()
522 obj.widget:SetPoint('TOPLEFT', block.objectives, 'BOTTOMLEFT', 0, -attachmentHeight) 369 obj.widget:SetPoint('TOPLEFT', block.objectives, 'BOTTOMLEFT', 0, -attachmentHeight)
523 print('have a widget, height is', obj.widget.height) 370 print('have a widget, height is', obj.widget.height)
524 attachmentHeight = attachmentHeight + obj.widget.height 371 attachmentHeight = attachmentHeight + obj.widget.height
525 end 372 completionScore = completionScore + obj.progress
526 373 completionMax = completionMax + 2
527 end 374 end
528 return attachmentHeight, text 375
376 end
377
378 block.completionScore = completionScore / completionMax
379 block.attachmentHeight = attachmentHeight
380
381 return text
529 end 382 end
530 383
531 mod.UpdateTracker = function(handler) 384 mod.UpdateTracker = function(handler)
532 print('|cFF00FF88UpdateTracker(|r|cFFFF4400' .. type(handler) .. '|r :: |cFF88FFFF' .. tostring(handler) .. '|r') 385 print('|cFF00FF88UpdateTracker(|r|cFFFF4400' .. type(handler) .. '|r :: |cFF88FFFF' .. tostring(handler) .. '|r')
533 local tracker = handler.Tracker 386 local tracker = handler.Tracker
534 local blockIndex = 0 387 local blockIndex = 0
535 local trackerHeight = headerHeight 388 local trackerHeight = headerHeight
536 local w = 300 389 local w = 300
537 390
538 previousBlock = handler.Tracker 391 previousBlock = tracker.title
539 local numWatched = handler.GetNumWatched() 392 local numWatched = handler.GetNumWatched()
540 local numBlocks = handler.numBlocks 393 local numBlocks = handler.numBlocks
541 local actualBlocks = 0 394 local actualBlocks = 0
542 for watchIndex = 1, 25 do 395 for watchIndex = 1, 25 do
543 blockIndex = blockIndex + 1 396 blockIndex = blockIndex + 1
544 if watchIndex <= numWatched then 397 if watchIndex <= numWatched then
545 local info = handler:GetInfo(watchIndex) 398 local info = handler:GetInfo(watchIndex)
546 if info then 399 if info then
547 local currentBlock = mod.UpdateTrackerBlock(handler, blockIndex, info) 400 local currentBlock = mod.UpdateTrackerBlock(handler, blockIndex, info)
548 previousBlock = currentBlock 401 previousBlock = currentBlock
402 print('|cFF00FF00'..currentBlock:GetName()..'|r', currentBlock.height)
549 trackerHeight = trackerHeight + currentBlock.height 403 trackerHeight = trackerHeight + currentBlock.height
550 numBlocks = max(numBlocks, watchIndex) 404 numBlocks = max(numBlocks, watchIndex)
551 actualBlocks = actualBlocks + 1 405 actualBlocks = actualBlocks + 1
552 else 406 else
553 print('|cFFFF0000Failed to draw info for index #'..watchIndex) 407 print('|cFFFF0000Failed to draw info for index #'..watchIndex)
594 for i, handler in ipairs(orderedHandlers) do 448 for i, handler in ipairs(orderedHandlers) do
595 mod.UpdateTracker(handler) 449 mod.UpdateTracker(handler)
596 if handler.actualBlocks >= 1 then 450 if handler.actualBlocks >= 1 then
597 local tracker = handler.Tracker 451 local tracker = handler.Tracker
598 print('setting', handler.Tracker, 'to anchor to offset', -scrollHeight) 452 print('setting', handler.Tracker, 'to anchor to offset', -scrollHeight)
599 tracker:SetParent(Scroll) -- this doesn't do anything that relativeTo doesn't 453 tracker:SetParent(Scroll)
600 tracker:SetPoint('TOPLEFT', Scroll, 'TOPLEFT', 0, - scrollHeight) 454 tracker:SetPoint('TOPLEFT', Scroll, 'TOPLEFT', 0, - scrollHeight)
601 tracker:SetSize(wrapperWidth, tracker.height) 455 tracker:SetSize(wrapperWidth, tracker.height)
602 print('adding ', tracker.height) 456 print('adding ', tracker.height)
603 scrollHeight = scrollHeight + tracker.height 457 scrollHeight = scrollHeight + tracker.height
604 end 458 end
621 wrapperWidth = floor(wrapperWidth+.5) 475 wrapperWidth = floor(wrapperWidth+.5)
622 wrapperHeight = floor(wrapperHeight+.5) 476 wrapperHeight = floor(wrapperHeight+.5)
623 headerHeight = floor(headerHeight+.5) 477 headerHeight = floor(headerHeight+.5)
624 478
625 if wrapperBlocks >= 1 then 479 if wrapperBlocks >= 1 then
626 for i, region in ipairs(Wrapper.header) do 480 for i, region in ipairs(Wrapper.headerComplex) do
627 region:Show() 481 region:Show()
628 end 482 end
629 else 483 else
630 for i, region in ipairs(Wrapper.header) do 484 for i, region in ipairs(Wrapper.headerComplex) do
631 region:Hide() 485 region:Hide()
632 end 486 end
633 return 487 return
634 end 488 end
635 --wrapperHeight = scrollHeight 489 --wrapperHeight = scrollHeight
636 490
637 print('|cFFFFFF00params:|r scroller:', scrollWidth, 'x', scrollHeight) 491 print('|cFFFFFF00params:|r scroller:', scrollWidth, 'x', scrollHeight)
638 print('|cFFFFFF00params:|r scroll:', scrollWidth, 'x', scrollHeight) 492 print('|cFFFFFF00params:|r scroll:', scrollWidth, 'x', scrollHeight)
639 print('|cFFFFFF00params:|r wrapper:', wrapperWidth, 'x', wrapperHeight) 493 print('|cFFFFFF00params:|r wrapper:', wrapperWidth, 'x', wrapperHeight)
640 print('|cFFFFFF00params:|r header:', headerHeight) 494 print('|cFFFFFF00params:|r header:', headerHeight)
495
496 mod.SetBlockStyle(Scroller, 'Scroller', 'Normal')
497 mod.SetBlockStyle(Scroller, 'Scroll', 'Normal')
498 mod.SetBlockStyle(Wrapper, 'Wrapper', 'Normal')
641 499
642 Scroller:SetSize(wrapperWidth, wrapperHeight) 500 Scroller:SetSize(wrapperWidth, wrapperHeight)
643 Scroller:SetPoint('TOPLEFT', Wrapper, 'TOPLEFT', 0, -headerHeight) 501 Scroller:SetPoint('TOPLEFT', Wrapper, 'TOPLEFT', 0, -headerHeight)
644 Scroller:SetPoint('BOTTOMRIGHT', Wrapper, 'BOTTOMRIGHT') 502 Scroller:SetPoint('BOTTOMRIGHT', Wrapper, 'BOTTOMRIGHT')
645 503