comparison ObjectiveTracker/Frame.lua @ 34:9856ebc63fa4

- half solution to Update being fired multiple times during load - change securefunc handlers to dispense a reason code; catch that reason code in the enclosure passed to hooksecurefunc, and decide whether to update or not from there.
author Nenue
date Sun, 17 Apr 2016 00:21:45 -0400
parents 64f2a9bbea79
children 69d03f8e293e
comparison
equal deleted inserted replaced
33:64f2a9bbea79 34:9856ebc63fa4
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 Module = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') 7 local Module = 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 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 9 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion, tinsert, tremove = IsResting, UnitXP, UnitXPMax, GetXPExhaustion, table.insert, table.remove
10 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent 10 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
11 local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText 11 local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText
12 local PERCENTAGE_STRING, GetQuestProgressBarPercent = PERCENTAGE_STRING, GetQuestProgressBarPercent 12 local PERCENTAGE_STRING, GetQuestProgressBarPercent = PERCENTAGE_STRING, GetQuestProgressBarPercent
13 local Default, AutoQuest, Quest, Bonus, Cheevs = Module.DefaultHandler, Module.AutoQuest, Module.Quest, Module.Bonus, Module.Cheevs 13 local Default, AutoQuest, Quest, Bonus, Cheevs = Module.DefaultHandler, Module.AutoQuest, Module.Quest, Module.Bonus, Module.Cheevs
14 local InCombatLockdown, format, lshift, CreateFrame = InCombatLockdown, format, bit.lshift, CreateFrame 14 local InCombatLockdown, format, lshift, CreateFrame = InCombatLockdown, format, bit.lshift, CreateFrame
15 local IsModifiedClick, ChatEdit_GetActiveWindow = IsModifiedClick, ChatEdit_GetActiveWindow 15 local IsModifiedClick, ChatEdit_GetActiveWindow = IsModifiedClick, ChatEdit_GetActiveWindow
16 local print = B.print('Tracker') 16 local print = B.print('Tracker')
17 local oprint = B.print('Objectives')
18 local bprint = B.print('Block')
19 local tprint = B.print('Tracker')
20 local lprint = B.print('Line')
17 local unitLevel = 1 21 local unitLevel = 1
18 local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_REASON 22 local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_REASON
19 local debug = false 23 local debug = false
20 24
21 --- Upvalues 25 --- FRAMES
22 local Wrapper = _G.VeneerObjectiveWrapper 26 local Wrapper = _G.VeneerObjectiveWrapper
23 local Scroller = Wrapper.scrollArea 27 local Scroller = Wrapper.scrollArea
24 local Scroll = _G.VeneerObjectiveScroll 28 local Scroll = _G.VeneerObjectiveScroll
25 local orderedHandlers = Module.orderedHandlers 29 local orderedHandlers = Module.orderedHandlers
26 local orderedNames = Module.orderedNames 30 local orderedNames = Module.orderedNames
27 31
28 --- Temp values set during updates 32 --- FRAME TEMP VARIABLES
29 local wrapperWidth, wrapperHeight 33 local wrapperWidth, wrapperHeight
30 local scrollWidth, scrollHeight 34 local scrollWidth, scrollHeight
31 local previousBlock 35
32 local currentBlock 36 --- SCHEMA VARIABLES
33 --- todo: source these from config 37 local schemaName, lastSchema = {
38 tracker = '',
39 block = '',
40 line = ''
41 }, {}
42 local trackerSchema, blockSchema, lineSchema
43
34 local itemButtonSize, itemButtonSpacing = 36, 1 44 local itemButtonSize, itemButtonSpacing = 36, 1
35
36 local headerHeight, headerColor, headerSpacing = 16, {1,.75,0,1}, 2
37 local headerbg = {'VERTICAL', 1, 1, 0.5, 0.5, 1, 1, 0.5, 0}
38 local headerFont, headerSize, headerOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 14, 'OUTLINE'
39
40 local titlebg = {'HORIZONTAL', 1, 0, .7, 0, 1, 0, .7, .2}
41 local titlebg_daily = {'HORIZONTAL', 0, .7, 1, 0, 0, 1, .7, .2 }
42 local titlebg_account = {'HORIZONTAL', 0, .45, 1, 0, 0, .45, 1, .2}
43 local titleFont, titleSize, titleOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'OUTLINE'
44
45 local textbg = {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0 }
46 local textbg_daily = {'HORIZONTAL', 0, .7, 1, .1, 0, 1, .7, .075 }
47 local textbg_account = {'HORIZONTAL', 0, .45, 1, 0.4, 0, .41, 1, .085 }
48 local textFont, textSize, textOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]], 16, 'OUTLINE'
49
50
51 local selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225}
52 local titleSpacing, textSpacing, blockSpacing = 3, 3, 1
53 local titleIndent, textIndent,selectionIndent = 2, 5, 50
54
55 local lineColors = {
56 normal = {
57 text = {.5,.75,1},
58 },
59 completed = {
60 text = {0, 1, 0}
61 },
62 failed = {
63 text = {1,0,0 }
64 },
65 autocomplete = {
66 text = {0,1,0 }
67 },
68 object = {
69 text = {0,1,1}
70 },
71 monster = {
72 text = {1,1,0}
73 },
74 item = {
75 text = {1,.25,.5}
76 }
77 }
78
79 local wrapperMaxWidth, wrapperMaxHeight = 270, 490 -- these are the hard bounds, actual *Height variables are changed 45 local wrapperMaxWidth, wrapperMaxHeight = 270, 490 -- these are the hard bounds, actual *Height variables are changed
80 local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE' 46 local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE'
81 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0 } 47 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0 }
82 local rewardSize = 24 48 local rewardSize = 24
83 local oprint = B.print('Objectives') 49
84 local bprint = B.print('Block') 50 local headerHeight, headerColor, headerSpacing = 16, {1,.75,0,1}, 2
85 local tprint = B.print('Tracker') 51 local headerbg = {'VERTICAL', 1, 1, 0.5, 0.5, 1, 1, 0.5, 0}
86 local lprint = B.print('Line') 52 local headerFont, headerSize, headerOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 14, 'OUTLINE'
53
54 local titlebg = {'HORIZONTAL', 1, 0, .7, 0, 1, 0, .7, .2}
55 local titleFont, titleSize, titleOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'OUTLINE'
56 local titleColor = {0,.7,1,1}
57
58 local textbg = {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0 }
59 local textFont, textSize, textOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]], 16, 'OUTLINE'
60 local textColor = {1,1,1,1}
61
62 local selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225}
63 local titleSpacing, textSpacing, blockSpacing = 3, 3, 1
64 local titleIndent, textIndent,selectionIndent = 2, 5, 50
65 --- END SCHEMA
66 --- schema swapper
67 Module.UpdateSchema = function(layer, newSchema)
68 if not (Module.Conf.Schema[layer] and Module.Conf.Schema[layer][newSchema]) then
69 return
70 elseif schemaName[layer] == newSchema then
71 return
72 end
73 lastSchema[layer] = schemaName[layer]
74 schemaName[layer] = newSchema
75 local c = Module.Conf.Schema[layer][newSchema]
76
77 if layer == 'tracker' then
78 headerHeight, headerSpacing = c.headerHeight, c.headerSpacing
79 headerColor = c.headerColor
80 headerbg = c.headerbg
81 headerFont, headerSize, headerOutline = c.headerFont, c.headerSize, c.headerOutline
82 trackerSchema = newSchema
83 elseif layer == 'block' then
84 titlebg = c.titlebg
85 titleFont, titleSize, titleOutline = c.titleFont, c.titleSize, c.titleOutline
86 selectionbg = c.selectionbg
87 titleSpacing, textSpacing, blockSpacing = c.titleSpacing, c.textSpacing, c.blockSpacing
88 titleIndent, textIndent,selectionIndent = 2, 5, 50
89 titleColor = c.titleColor
90 rewardSize = 24
91 blockSchema = newSchema
92 textFont, textSize, textOutline = c.textFont, c.textSize, c.textOutline
93 textbg = c.textbg
94 textIndent = c.textIndent
95 rewardSize = c.rewardSize
96 elseif layer == 'line' then
97 textColor = c.textColor
98 lineSchema = newSchema
99 end
100 print('|cFFFF0088UpdateSchema:|r', layer, lastSchema[layer], '->', newSchema)
101 end
87 102
88 Default.AddBlock = function(self, block, blockIndex) 103 Default.AddBlock = function(self, block, blockIndex)
89 local blockIndex = blockIndex or (self.currentBlock + 1) 104 local blockIndex = blockIndex or (self.currentBlock + 1)
90 local print = bprint 105 local print = bprint
91 local tracker = self.frame 106 local tracker = self.frame
92 local info = block.info 107 local info = block.info
93 108
109 if blockSchema ~= block.schema then
110 print('new schema detected, applicating...')
111 block.schema = blockSchema
112 block:SetWidth(Module.Conf.Wrapper.Width)
113 block.title:SetSpacing(titleSpacing)
114 block.title:SetPoint('TOP', block, 'TOP', 0, -titleSpacing)
115 block.title:SetPoint('LEFT', block, 'LEFT', titleIndent, 0)
116 block.titlebg:SetTexture(1,1,1,1)
117 block.titlebg:SetGradientAlpha(unpack(titlebg))
118 block.titlebg:SetPoint('TOP', block, 'TOP', 0, 0)
119 block.titlebg:SetPoint('BOTTOM', block.title, 'BOTTOM', 0, -titleSpacing)
120 block.status:SetSpacing(textSpacing)
121 block.status:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, -textSpacing)
122 block.status:SetPoint('LEFT', block.titlebg, 'LEFT', textIndent, 0)
123 block.statusbg:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, 0)
124 block.statusbg:SetPoint('BOTTOM', block, 'BOTTOM', 0, 0)
125 block.statusbg:SetTexture(1,1,1,1)
126 block.statusbg:SetGradientAlpha(unpack(textbg))
127 block.SelectionOverlay:SetGradientAlpha(unpack(selectionbg))
128 block.SelectionOverlay:SetPoint('TOPLEFT', selectionIndent, 0)
129 block.SelectionOverlay:SetPoint('BOTTOMRIGHT')
130
131 local anchor, target, point, x, y = 'TOPRIGHT', block, 'TOPRIGHT', -2, -2
132 for i, tile in ipairs(block.rewardTile) do
133 print(rewardSize)
134 tile:SetSize(rewardSize, rewardSize)
135 tile:ClearAllPoints()
136 tile:SetPoint(anchor, target, point, x, y)
137 block.rewardLabel[i]:SetPoint('TOP', tile, 'TOP', 0, 0)
138 anchor, target, point, x, y = 'TOPRIGHT', tile, 'TOPLEFT', -2, 0
139 end
140 end
141
142 if block.debug then
143 local func = (B.Conf.GuidesMode == true) and 'Show' or 'Hide'
144 for _, region in ipairs(block.debug) do
145 region[func]()
146 end
147 end
148
149 -- positioned by offset since they tend to swap contents
94 block.index = blockIndex 150 block.index = blockIndex
95 block:SetPoint('TOPLEFT', self.frame, 'TOPLEFT', 0, block.offset) 151 block:SetPoint('TOPLEFT', self.frame, 'TOPLEFT', 0, block.offset)
96 block:SetPoint('RIGHT', tracker,'RIGHT', 0, 0) 152 block:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
97 self.currentBlock = blockIndex 153 self.currentBlock = blockIndex
98 self.currentAnchor = block 154 self.currentAnchor = block
99 print(' |cFFFFFF00'..tracker.height..'|r', '|cFF00FF00'..block:GetName()..'|r', block.height, tracker.height) 155 print(' |cFFFFFF00'..tracker.height..'|r', '|cFF00FF00'..block:GetName()..'|r', block.height, tracker.height)
100 tracker.height = tracker.height + block.height 156 tracker.height = tracker.height + block.height
101 self.numBlocks = max(self.numBlocks, blockIndex)
102 self.actualBlocks = self.actualBlocks + 1 157 self.actualBlocks = self.actualBlocks + 1
103 end 158 end
104 159
105 --- Used as an iterator of sorts for cascaded tag icon placements (the daily/faction/account icons) 160 --- Used as an iterator of sorts for cascaded tag icon placements (the daily/faction/account icons)
106 Default.AddTag = function (handler, block, tagInfo, tagPoint, tagAnchor, tagRelative) 161 Default.AddTag = function (handler, block, tagInfo, tagPoint, tagAnchor, tagRelative)
123 178
124 --- Adds the given line to the current content and advances the anchor pointer to that new line for the following call. 179 --- Adds the given line to the current content and advances the anchor pointer to that new line for the following call.
125 Default.AddLine = function(handler, block, text, attachment, template) 180 Default.AddLine = function(handler, block, text, attachment, template)
126 local print = lprint 181 local print = lprint
127 local lineIndex = block.currentLine + 1 182 local lineIndex = block.currentLine + 1
128 local line = handler:GetLine(block) 183 local line = handler:GetLine(block, lineIndex)
129 line.index = lineIndex 184 line.index = lineIndex
130 line:ClearAllPoints() 185 if line.schema ~= template then
131 line:SetPoint('LEFT', block, 'LEFT', 0, 0) 186 print(' |cFF00FF00change schema', template)
132 line:SetPoint('TOP', block.endPoint, 'BOTTOM', 0, 0) 187 Module.UpdateSchema('line', template)
133 line:SetPoint('RIGHT', block, 'RIGHT', 0, 0) 188 line.status:SetSpacing(textSpacing)
189 line.status:SetPoint('LEFT', line, 'LEFT', textIndent, 0)
190 line.status:SetPoint('RIGHT', line, 'RIGHT', -textIndent, 0)
191 line.status:SetTextColor(unpack(textColor))
192 line.schema = template
193 else
194 print(' |cFFFFFF00keep schema', template)
195 end
196 line:SetPoint('TOP', block.endPoint, 'BOTTOM', 0, -textSpacing)
134 line:Show() 197 line:Show()
135 198
136 print(' |cFF0088FFAddLine >>|r', block, '::', block.endPoint:GetName(),'"'.. text .. '"', attachment, template) 199
200 print(' |cFF0088FFAddLine >>|r', block, '::', block.endPoint:GetName(),'"'.. text .. '"', attachment, template)
201
202
203 -- fill in the text, then derive pixel-rounded height
137 line.status:SetText(text) 204 line.status:SetText(text)
138 line.height = floor(line.status:GetStringHeight()+.5) + textSpacing 205 line.height = floor(line.status:GetStringHeight()+.5)
139 line:SetHeight(line.height)
140
141 local r, g, b, a = 1, 1, 1, 1
142 if lineColors[template] then
143 r, g, b = unpack(lineColors[template].text)
144 end
145 line.status:SetTextColor(r, g, b, a)
146 206
147 -- For progressbar and timer lines, status text may be used as the title heading 207 -- For progressbar and timer lines, status text may be used as the title heading
148 if attachment then 208 if attachment then
149 local widgetOffset = 0 209 print(' |cFFFF0088doing things with a widget', attachment:GetSize())
150 line.height = attachment:GetHeight() + textSpacing 210 line.height = attachment:GetHeight()
151 if text and #text >= 1 then 211 if text then
152 widgetOffset = line.status:GetHeight() + textSpacing 212 line.height = max(line.height, line.status:GetStringHeight())
153 line.height = line.height + floor(line.status:GetStringHeight()+.5) + textSpacing 213 end
154 print(' |cFFFF0088doing things with captioned widget') 214 if attachment.status:GetText() then
155 else 215 line.height = max(line.height, attachment.status:GetStringHeight())
156 print(' |cFFFF0088doing things with a widget') 216 end
157 end
158 attachment:SetPoint('TOP', line, 'TOP', 0, -widgetOffset)
159 attachment:Show() 217 attachment:Show()
160 end 218 end
161 219
162 block.attachmentHeight = block.attachmentHeight + line.height 220 line:SetHeight(line.height)
163 print(' |cFF0088FFsetting line #'..lineIndex..' for|r', block.info.title, "\n |cFF0088FFsize:|r", line.height, 221 block.attachmentHeight = block.attachmentHeight + line.height + textSpacing
222 print(' |cFF0088FFsetting line #'..lineIndex..' for|r', block.info.title, "\n |cFF0088FFsize:|r", line.height,
164 "|cFF0088FFpoint:|r", line:GetPoint(1), "|cFF0088FFwidget:|r", (line.widget and 'Y' or 'N')) 223 "|cFF0088FFpoint:|r", line:GetPoint(1), "|cFF0088FFwidget:|r", (line.widget and 'Y' or 'N'))
165 block.currentLine = lineIndex 224 block.currentLine = lineIndex
166 block.endPoint = line.statusbg -- edge used for the next block 225 block.endPoint = line.statusbg -- edge used for the next block
167 226
168 return lineIndex 227 return lineIndex
173 local print = lprint 232 local print = lprint
174 local blockIndex = block.index 233 local blockIndex = block.index
175 local lines = block.lines 234 local lines = block.lines
176 if not lineIndex then 235 if not lineIndex then
177 lineIndex = block.currentLine + 1 236 lineIndex = block.currentLine + 1
178 print(' fetching the "next" line:', lineIndex) 237 print(' |cFFFFFF00generating a frame')
179 else
180 print(' fetching explicit offset:', lineIndex)
181 end 238 end
182 239
183 block.numLines = max(block.numLines, lineIndex) 240 block.numLines = max(block.numLines, lineIndex)
184 print(' |cFF00FFFFposition|r', block.currentLine, '|cFF00FFFFof|r|cFFFFFF00' , block.numLines)
185 241
186 if not lines[lineIndex] then 242 if not lines[lineIndex] then
187 print(' |cFF00FF88created line #'..lineIndex..' from for '..handler.name..' block #'..blockIndex) 243 print(' |cFF00FF88created line #'..lineIndex..' from for '..handler.name..' block #'..blockIndex)
188 lines[lineIndex] = CreateFrame('Frame', 'Vn'..handler.name .. blockIndex..'ObjectiveLine'..lineIndex, block, 'VeneerTrackerObjective') 244 lines[lineIndex] = CreateFrame('Frame', 'Vn'..handler.name .. blockIndex..'ObjectiveLine'..lineIndex, block, 'VeneerTrackerObjective')
189 local line = lines[lineIndex] 245 local line = lines[lineIndex]
190 line.index = lineIndex 246 line.index = lineIndex
191 line.height = 0 247 line.height = 0
192 line.status:SetSpacing(textSpacing)
193 line.status:SetPoint('LEFT', line, 'LEFT', textIndent, 0)
194 B.SetConfigLayers(line) 248 B.SetConfigLayers(line)
195
196 if lines[lineIndex+1] then
197 lines[lineIndex+1]:ClearAllPoints()
198 end
199 249
200 if debug then 250 if debug then
201 for _, region in ipairs(lines[lineIndex].debug) do 251 for _, region in ipairs(lines[lineIndex].debug) do
202 region:Show() 252 region:Show()
203 end 253 end
208 end 258 end
209 259
210 260
211 261
212 --- Creates or retrieves a complete block frame object 262 --- Creates or retrieves a complete block frame object
213 Default.GetBlock = function(handler, blockIndex) 263 --- todo: make it use data index to avoid re-coloring every block
264 Default.GetBlock = function(handler, logIndex)
214 local print = bprint 265 local print = bprint
215 local block = handler.usedBlocks[blockIndex] 266 print('|cFFFFFF00getting a block for logID', logIndex ..',', #handler.usedBlocks,'used', #handler.freeBlocks, 'free')
216 267 local block = handler.LogBlock[logIndex]
217 if not handler.usedBlocks[blockIndex] then 268
269 if not block then
218 if #handler.freeBlocks >= 1 then 270 if #handler.freeBlocks >= 1 then
219 block = handler.freeBlocks[#handler.freeBlocks] 271 block = tremove(handler.freeBlocks)
220 handler.freeBlocks[#handler.freeBlocks] = nil 272 print(' assigning from free heap|cFF00FFFF', block:GetName())
221 else 273 else
274
275 local blockIndex = handler.numBlocks + 1
222 block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, handler.frame, 'VeneerTrackerBlock') 276 block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, handler.frame, 'VeneerTrackerBlock')
223
224 local c = Module.Conf.Wrapper
225 block.index = blockIndex
226 block.lines = {} 277 block.lines = {}
227 block.numLines = 0 278 block.numLines = 0
228 block.currentLine = 0 279 block.currentLine = 0
229 block:SetWidth(c.Width) 280 block.attachmentHeight = 0
230 281 B.SetConfigLayers(block)
231 block.title:SetSpacing(c.TitleSpacing)
232 block.title:SetPoint('TOP', block, 'TOP', 0, -titleSpacing)
233 block.title:SetPoint('LEFT', block, 'LEFT', titleIndent, 0)
234
235 block.titlebg:SetTexture(1,1,1,1)
236 block.titlebg:SetGradientAlpha(unpack(titlebg))
237 block.titlebg:SetPoint('TOP', block, 'TOP', 0, 0)
238 block.titlebg:SetPoint('BOTTOM', block.title, 'BOTTOM', 0, -titleSpacing)
239
240 block.status:SetSpacing(c.TextSpacing)
241 block.status:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, -textSpacing)
242 block.status:SetPoint('LEFT', block.titlebg, 'LEFT', textIndent, 0)
243
244 block.statusbg:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, 0)
245 block.statusbg:SetPoint('BOTTOM', block, 'BOTTOM', 0, 0)
246 block.statusbg:SetTexture(1,1,1,1)
247 block.statusbg:SetGradientAlpha(unpack(textbg))
248
249 block.SelectionOverlay:SetGradientAlpha(unpack(Module.colors.default.selectionbg))
250 block.SelectionOverlay:SetPoint('TOPLEFT', selectionIndent, 0)
251 block.SelectionOverlay:SetPoint('BOTTOMRIGHT')
252
253 --block.icon:SetSize(rewardSize, rewardSize)
254 --block.icon:SetPoint()
255 local anchor, target, point, x, y = 'TOPRIGHT', block, 'TOPRIGHT', -2, -2
256 for i, tile in ipairs(block.rewardTile) do
257 print(rewardSize)
258 tile:SetSize(rewardSize, rewardSize)
259 tile:ClearAllPoints()
260 tile:SetPoint(anchor, target, point, x, y)
261 block.rewardLabel[i]:SetPoint('TOP', tile, 'TOP', 0, -2)
262 anchor, target, point, x, y = 'TOPRIGHT', tile, 'TOPLEFT', -2, 0
263 end
264
265
266 --- methods for event handlers 282 --- methods for event handlers
267 283
268 block.Select = handler.Select 284 block.Select = handler.Select
269 block.Open = handler.Open 285 block.Open = handler.Open
270 block.Remove = handler.Remove 286 block.Remove = handler.Remove
271 block.Link = handler.Link 287 block.Link = handler.Link
272 block.clickZone:SetScript('OnMouseUp', function(self, ...) handler.OnMouseUp(block, ...) end) 288 block.clickZone:SetScript('OnMouseUp', function(self, ...) handler.OnMouseUp(block, ...) end)
273 block.clickZone:SetScript('OnMouseDown', function(self, ...) handler.OnMouseDown(block, ...) end) 289 block.clickZone:SetScript('OnMouseDown', function(self, ...) handler.OnMouseDown(block, ...) end)
274 block.attachmentHeight = 0
275 block:ClearAllPoints() 290 block:ClearAllPoints()
276 291 block.index = blockIndex
277 B.SetConfigLayers(block) 292 handler.numBlocks = max(handler.numBlocks, blockIndex)
278 293
279 if debug then 294 print(' |cFFFFFF00creating new|r', block:GetName())
280 for _, region in ipairs(block.debug) do 295 end
281 region:Show() 296 handler.LogBlock[logIndex] = block
282 end 297 tinsert(handler.usedBlocks, block)
283 end 298 else
284 end 299 print(' |cFFFFFF00use existing block|r', block:GetName())
285 handler.usedBlocks[blockIndex] = block 300 end
286 end 301 return block
287 return handler.usedBlocks[blockIndex]
288 end 302 end
289 303
290 local currentPosition, anchorFrame, anchorPoint 304 local currentPosition, anchorFrame, anchorPoint
291 --- Positioning and stuff 305 --- Positioning and stuff
292 local tick = 0 306 local tick = 0
293 local maxReason = 0 307 local firstUpdate = true
294 function Module:Update (reason, ...) 308 function Module:Update (reason, ...)
309 if not B.Conf.VeneerObjectiveWrapper.enabled then
310 return
311 end
312
295 tick = tick + 1 313 tick = tick + 1
296 -- is this the first time updating? 314 if firstUpdate or not reason then
297 if maxReason == 0 then 315 reason = _G.OBJECTIVE_TRACKER_UPDATE_ALL
298 reason = OBJECTIVE_TRACKER_UPDATE_ALL
299 elseif not reason then
300 reason = OBJECTIVE_TRACKER_UPDATE_REASON
301 end 316 end
302 317
303 local print = tprint 318 local print = tprint
304 local updateWrapper = 0 319 local updateWrapper = 0
305 local hasStuff 320 local hasStuff
306 local insertingStuff 321 local insertingStuff
307 322
308 print(format('%d |cFFFF%04X Update()', tick, lshift(reason, 4)), reason, ...) 323 print(format('|cFFBB0066Update:|r |cFFFF%04X%d|r ', tick, lshift(reason, 4)), reason, ...)
309 currentPosition = 0 324 currentPosition = 0
310 anchorPoint = 'TOP' 325 anchorPoint = 'TOP'
311 anchorFrame = Scroll 326 anchorFrame = Scroll
312 327
313 local wrapperHeight = 0 328 local wrapperHeight = 0
314 for id, handler in pairs(Module.orderedHandlers) do 329 for id, handler in pairs(Module.orderedHandlers) do
315 local frame = handler.frame 330 local frame = handler.frame
316 331
317 print(format('|cFF00FFFF%s and(%04X vs %04x+%04x) = %04X|r', handler.name, reason, handler.updateReasonModule, handler.updateReasonEvents, band(reason, handler.updateReasonModule + handler.updateReasonEvents))) 332
318 if band(reason, handler.updateReasonModule + handler.updateReasonEvents) > 0 then 333 if band(reason, handler.updateReasonModule + handler.updateReasonEvents) > 0 then
319 handler:UpdateTracker(reason, ...) 334 handler:UpdateTracker(reason, ...)
320 print(' |cFF00FF00'..id..'|r', handler.displayName, 'count:', handler.numWatched)
321 insertingStuff = true 335 insertingStuff = true
322 else 336 else
323 print(' |cFFFF0088'..id..'|r', 'no reason to update') 337 print(' |cFFFF0088'..id..'|r', 'no reason to update')
324 end 338 end
325 339
326 if handler.numWatched >= 1 then 340 if handler.numWatched >= 1 then
341
342 print(format('|cFF88FFBB%s and(%04X, %04x+%04x) = %04X|r', handler.name, reason, handler.updateReasonModule, handler.updateReasonEvents, band(reason, handler.updateReasonModule + handler.updateReasonEvents)))
327 hasStuff = true 343 hasStuff = true
328 currentPosition = currentPosition + 1 344 currentPosition = currentPosition + 1
329 frame.destinationOffset = -wrapperHeight 345 frame.destinationOffset = -wrapperHeight
330 if frame.previousOffset ~= wrapperHeight and frame:IsVisible() then 346 if (not firstUpdate) and frame.previousOffset ~= wrapperHeight and frame:IsVisible() then
331 print(frame.SlideIn.translation) 347 print(frame.SlideIn.translation)
332 local postFrame, postPoint = anchorFrame, anchorPoint 348 local postFrame, postPoint = anchorFrame, anchorPoint
333 local delta = frame.destinationOffset - frame.previousOffset 349 local delta = frame.destinationOffset - frame.previousOffset
334 local _, _, _, _, offset = frame:GetPoint(1) 350 local _, _, _, _, offset = frame:GetPoint(1)
335 print(' |cFF00BBFFstart slide for', delta, 'pixels, from', frame.previousOffset, '(', offset, ')') 351 print(' |cFF00BBFFstart slide for', delta, 'pixels, from', frame.previousOffset, '(', offset, ')')
338 frame.SlideIn:Play() 354 frame.SlideIn:Play()
339 for i, b in ipairs(handler.usedBlocks) do 355 for i, b in ipairs(handler.usedBlocks) do
340 b.SlideIn.translation:SetOffset(0, delta) 356 b.SlideIn.translation:SetOffset(0, delta)
341 b.SlideIn:Play() 357 b.SlideIn:Play()
342 end 358 end
359 local start = GetTime()
343 frame.SlideIn:SetScript('OnFinished', function() 360 frame.SlideIn:SetScript('OnFinished', function()
344 print(' |cFF00BBFFsliding finished:', delta, 'pixels covered') 361 print(' |cFF00BBFFsliding finished:', delta, 'pixels covered; duration:', GetTime()-start)
345 frame:SetParent(Scroll) 362 frame:SetParent(Scroll)
346 frame:SetPoint('TOP', Scroll, 'TOP', 0, frame.destinationOffset) 363 frame:SetPoint('TOP', Scroll, 'TOP', 0, frame.destinationOffset)
347 frame.previousOffset = frame.destinationOffset 364 frame.previousOffset = frame.destinationOffset
348 frame.SlideIn:SetScript('OnFinished', nil) 365 frame.SlideIn:SetScript('OnFinished', nil)
349 if Wrapper.destinationHeight then 366 if Wrapper.destinationHeight then
354 Wrapper.destinationHeight = nil 371 Wrapper.destinationHeight = nil
355 end 372 end
356 373
357 end) 374 end)
358 else 375 else
359 print(' |cFF00BBFFpinning to', anchorFrame:GetName(), anchorPoint) 376 print(' |cFF00BBFFpinning to', anchorFrame:GetName(), anchorPoint, '|rcurrent frame height:', frame.height)
377 print(' |cFFFF0088total height:', wrapperHeight)
360 frame:SetParent(Scroll) 378 frame:SetParent(Scroll)
361 frame:SetPoint('TOP', Scroll, 'TOP', 0, frame.destinationOffset) 379 frame:SetPoint('TOP', Scroll, 'TOP', 0, frame.destinationOffset)
362 end 380 end
363 381
364 frame:Show() 382 frame:Show()
365 anchorFrame = handler.frame 383 anchorFrame = handler.frame
366 anchorPoint = 'BOTTOM' 384 anchorPoint = 'BOTTOM'
367 385
368 print('current frame height:', frame.height)
369 wrapperHeight = wrapperHeight + frame.height 386 wrapperHeight = wrapperHeight + frame.height
370 print('|cFFFF0088total height:', wrapperHeight)
371 else 387 else
388
389 print(' |cFFFF4400GetNumWatched:|r',handler.name, '0')
372 frame:SetPoint('TOP', Scroll, 'TOP', 0, 0) 390 frame:SetPoint('TOP', Scroll, 'TOP', 0, 0)
373 frame.destinationOffset = 0 391 frame.destinationOffset = 0
374 frame.previousOffset = 0 392 frame.previousOffset = 0
375 handler.frame:Hide() 393 handler.frame:Hide()
376 end 394 end
404 Scroller:Show() 422 Scroller:Show()
405 Scroll:Show() 423 Scroll:Show()
406 end 424 end
407 Quest.GetClosest() 425 Quest.GetClosest()
408 --Module.UpdateActionButtons(reason) 426 --Module.UpdateActionButtons(reason)
427 if firstUpdate then
428 firstUpdate = nil
429 end
409 end 430 end
410 431
411 --- Content generator base 432 --- Content generator base
412 Default.UpdateTracker = function (handler, reason, id, isNew) 433 Default.UpdateTracker = function (handler, reason, id, isNew)
413 local print = tprint 434 local print = tprint
420 tracker.titlebg:SetHeight(headerHeight) 441 tracker.titlebg:SetHeight(headerHeight)
421 tracker.title:SetTextColor(unpack(headerColor)) 442 tracker.title:SetTextColor(unpack(headerColor))
422 443
423 handler.updateReason = reason 444 handler.updateReason = reason
424 handler.numWatched = handler:GetNumWatched() 445 handler.numWatched = handler:GetNumWatched()
446 if handler.numWatched >= 1 then
447
448 print(' |cFF00FF88GetNumWatched:|r',handler.name, handler.numWatched, 'of', handler.numAll)
449 end
450
425 handler.currentBlock = 0 451 handler.currentBlock = 0
426 handler.currentAnchor = tracker.titlebg 452 handler.currentAnchor = tracker.titlebg
427 local blockPosition = -headerHeight 453 local blockPosition = -headerHeight
428 for blockIndex = 1, handler.numWatched do 454 for blockIndex = 1, handler.numWatched do
429 local currentBlock = handler:UpdateBlock(blockIndex, id, isNew) 455 local currentBlock = handler:UpdateBlock(blockIndex, id, isNew)
435 print(' |cFFFF9900END|r @', blockIndex) 461 print(' |cFFFF9900END|r @', blockIndex)
436 break -- done with quest stuff 462 break -- done with quest stuff
437 end 463 end
438 end 464 end
439 465
440 for i = handler.currentBlock+1, handler.numBlocks do 466
441 local used = handler.usedBlocks 467 local numBlocks = handler.numBlocks
468 local used = handler.usedBlocks
469 if numBlocks < #used then
470 print(' |cFF0088FFcull the dead: showing|r', numBlocks, '|cFF0088FF out of|r', #used)
442 local free = handler.freeBlocks 471 local free = handler.freeBlocks
443 print('clean up dead quest block') 472 local remaining = #used
444 if used[i] then 473 for i = #used, 1, -1 do
445 used[i]:Hide() 474 print(' -', 'i='.. i, 'watchIndex='..used[i].info.watchIndex)
446 used[i]:ClearAllPoints() 475 if used[i].info.watchIndex > numBlocks then
447 free[#free+1]= used[blockIndex] 476 print(' clean up dead quest block')
448 used[i] = nil 477 local released = tremove(used, i)
478 released:Hide()
479 released:ClearAllPoints()
480 tinsert(free, used[blockIndex])
481 end
449 end 482 end
450 end 483 end
451 484
452 485
453 if handler.currentBlock >= 1 then 486 if handler.currentBlock >= 1 then
467 tracker.wasEmpty = true 500 tracker.wasEmpty = true
468 end 501 end
469 502
470 return tracker.numWatched, tracker.numAll 503 return tracker.numWatched, tracker.numAll
471 end 504 end
505
472 506
473 --- Updates the selected block frame to display the given info batch 507 --- Updates the selected block frame to display the given info batch
474 -- If `previousBlock` is set, it will attempt to anchor to that 508 -- If `previousBlock` is set, it will attempt to anchor to that
475 -- @param blockNum the ordered block to be updated, not a watchIndex value 509 -- @param blockNum the ordered block to be updated, not a watchIndex value
476 -- @param info the reference returned by the GetXInfo functions 510 -- @param info the reference returned by the GetXInfo functions
477 -- REMEMBER: t.info and questData[questID] are the same table 511 -- REMEMBER: t.info and questData[questID] are the same table
478 Default.UpdateBlock = function (handler, blockIndex, id, added) 512 Default.UpdateBlock = function (handler, blockIndex, id, added)
479 local print = bprint 513 local print = bprint
480 print(' Updating |cFF00FF00'..handler.displayName..'|r|cFF00FFFF'..blockIndex..'|r')
481 if not blockIndex then 514 if not blockIndex then
482 return 515 return
483 end 516 end
484 local info = handler:GetInfo(blockIndex) -- should match up with whatever the internal watch list has 517 local info = handler:GetInfo(blockIndex) -- should match up with whatever the internal watch list has
485 if not info then 518 if not info then
486 return 519 return
487 end 520 end
521 print(' Updating |cFF00FF00'..handler.displayName..'|r|cFF00FFFF'..blockIndex..'|r|cFF0099FF', info.id ,'|r')
488 local frame = handler.frame 522 local frame = handler.frame
489 local block = handler:GetBlock(blockIndex) 523 local block = handler:GetBlock(info.id)
490 524
491 block.questID = info.questID 525 if added then
492 if id == info.questID then 526 -- do something if the block is being assigned a new thing
493 --block.questFadeIn:Play()
494 end 527 end
495 528
496 block.handler = handler 529 block.handler = handler
497 block.info = info 530 block.info = info
498 block.mainStyle = info.mainStyle or 'Normal'
499 block.subStyle = info.subStyle
500 531
501 info.blockIndex = blockIndex 532 info.blockIndex = blockIndex
502 if info.questID then handler.QuestBlock[info.questID] = block end 533 if info.questID then handler.QuestBlock[info.questID] = block end
503 if info.questLogIndex then handler.LogBlock[info.questLogIndex] = block end 534 if info.logIndex then handler.LogBlock[info.logIndex] = block end
504 if info.watchIndex then handler.WatchBlock[info.watchIndex] = block end 535 if info.watchIndex then handler.WatchBlock[info.watchIndex] = block end
505 handler.BlockInfo[blockIndex] = info 536 handler.BlockInfo[blockIndex] = info
506 handler:UpdateObjectives(block) 537 local newSchema = handler:UpdateObjectives(block)
538 if newSchema and newSchema ~= blockSchema then
539 Module.UpdateSchema('block', newSchema)
540 end
507 541
508 block.title:SetText(info.title) 542 block.title:SetText(info.title)
509 local titleHeight = floor(block.title:GetHeight()+.5) 543 local titleHeight = floor(block.title:GetHeight()+.5)
510 local titlebgHeight = titleHeight + titleSpacing*2 544 local titlebgHeight = titleHeight + titleSpacing*2
511 block.titlebg:SetHeight(titlebgHeight) 545 block.titlebg:SetHeight(titlebgHeight)
514 local statusbgHeight = statusHeight + textSpacing*2 548 local statusbgHeight = statusHeight + textSpacing*2
515 local attachmentHeight =floor(block.attachmentHeight + .5) 549 local attachmentHeight =floor(block.attachmentHeight + .5)
516 550
517 print(' |cFF0088FFanchor to', handler.currentAnchor:GetName()) 551 print(' |cFF0088FFanchor to', handler.currentAnchor:GetName())
518 print(' |cFF00FF00attachment:|r', attachmentHeight, '|cFF00FF00title:|r', titlebgHeight, '('.. titleHeight..')') 552 print(' |cFF00FF00attachment:|r', attachmentHeight, '|cFF00FF00title:|r', titlebgHeight, '('.. titleHeight..')')
519 --block.titlebg:SetHeight(block.title:GetHeight() + Module.Conf.Wrapper.TitleSpacing) 553 if attachmentHeight > 0 then
554 attachmentHeight = attachmentHeight + textSpacing
555 end
556
520 block.height = titlebgHeight + attachmentHeight 557 block.height = titlebgHeight + attachmentHeight
521 558
522 if statusHeight > 1 then
523 block.height = block.height + statusbgHeight
524 print(' status:', statusbgHeight, '('.. statusHeight..')')
525 else
526 print(' |cFFFF0088 skipped')
527 end
528 block:SetHeight(block.height) 559 block:SetHeight(block.height)
529 560
530 print(' |cFFFFFF00height|r:', block.height) 561 print(' |cFFFFFF00height|r:', block.height)
531 print(' |cFF00FFFF)|r -> ', block, block:GetHeight()) 562 print(' |cFF00FFFF)|r -> ', block, block:GetHeight())
532 563
576 if info.tagInfo then 607 if info.tagInfo then
577 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'frequencyTag', tagPoint, tagAnchor, tagRelative) 608 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'frequencyTag', tagPoint, tagAnchor, tagRelative)
578 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'typeTag', tagPoint, tagAnchor, tagRelative) 609 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'typeTag', tagPoint, tagAnchor, tagRelative)
579 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'completionTag', tagPoint, tagAnchor, tagRelative) 610 tagPoint, tagAnchor, tagRelative = handler:AddTag(block, 'completionTag', tagPoint, tagAnchor, tagRelative)
580 end 611 end
612
613 if info.statusKey and (Devian and Devian.InWorkspace()) then
614 block.debugText:SetText(info.statusKey)
615 block.debugText:Show()
616 end
581 return block 617 return block
582 end 618 end
583 619
584 620
585 621
586 622
587 --- Does the main iterations for populating block content. 623 --- Does the main iterations for populating block content.
588 -- Hooked by corresponding handler functions where additional details need to be sorted. 624 -- Hooked by corresponding handler functions where additional details need to be sorted.
589 Default.UpdateObjectives = function(handler, block) 625 Default.UpdateObjectives = function(handler, block, block_schema)
590 local print = lprint 626 local print = lprint
591 local info = block.info 627 local info = block.info
592 print('|cFF00FF00default.objectives', block:GetName()) 628 print('|cFF00FF00default.objectives', block:GetName())
593 -- reset the starting positions 629 -- reset the starting positions
594 block.endPoint = block.titlebg 630 block.endPoint = block.titlebg
616 for i, data in ipairs(info.objectives) do 652 for i, data in ipairs(info.objectives) do
617 local line = handler:GetLine(block) 653 local line = handler:GetLine(block)
618 displayObjectiveHeader = true 654 displayObjectiveHeader = true
619 line.height = 0 655 line.height = 0
620 text, attachment, template = handler:UpdateLine(block, line, data) 656 text, attachment, template = handler:UpdateLine(block, line, data)
621 print(' |cFF88FF00#', i, data.type, text) 657 print(' |cFF88FF00#', i, data.type, text, attachment)
622 handler:AddLine(block, text, attachment, template) 658 handler:AddLine(block, text, attachment, template)
623 659
624 end 660 end
625 end 661 end
626 end 662 end
627 663
628 if info.statusKey and (Devian and Devian.InWorkspace()) then 664
629 handler:AddLine(block, info.statusKey, nil) 665 if block.currentLine < block.numLines then
630 end 666 print(' - cull', block.currentLine, block.numLines)
631 667 for i = block.currentLine + 1, block.numLines do
632 for i = block.currentLine + 1, block.numLines do 668 print(' - hide |cFFFF0088'..i..'|r', block.lines[i])
633 print(i, block.numLines) 669 block.lines[i]:ClearAllPoints()
634 print(' - hide |cFFFF0088'..i..'|r', block.lines[i]) 670 block.lines[i]:Hide()
635 block.lines[i]:ClearAllPoints() 671 end
636 block.lines[i]:Hide()
637 end 672 end
638 673
639 if block.currentLine > 0 then 674 if block.currentLine > 0 then
640 block.attachmentHeight = block.attachmentHeight + textSpacing 675 block.attachmentHeight = block.attachmentHeight + textSpacing
641 print(' |cFF00FF00attachment:', block.attachmentHeight) 676 print(' |cFF00FF00attachment:', block.attachmentHeight)
642 end 677 end
678 return block_schema
643 end 679 end
644 680
645 681
646 --- Module-specific display variables 682 --- Module-specific display variables
647 -- * height - height of whatever display widget is involved in conveying the task 683 -- * height - height of whatever display widget is involved in conveying the task
679 715
680 print('|cFF00FFFF'.. questID .. '|r', itemButton:GetName()) 716 print('|cFF00FFFF'.. questID .. '|r', itemButton:GetName())
681 local block = Module.Quest.QuestBlock[questID] 717 local block = Module.Quest.QuestBlock[questID]
682 if block then 718 if block then
683 -- Dispatch the probe 719 -- Dispatch the probe
684 if IsQuestWatched(info.questLogIndex) then 720 if IsQuestWatched(info.logIndex) then
685 itemButton.previousItem = previousItem 721 itemButton.previousItem = previousItem
686 print(' |cFFFFFF00probing', block:GetName()) 722 print(' |cFFFFFF00probing', block:GetName())
687 block:SetScript('OnUpdate', function() 723 block:SetScript('OnUpdate', function()
688 if block:GetBottom() and not InCombatLockdown() then 724 if block:GetBottom() and not InCombatLockdown() then
689 print(' '..block:GetName()..' |cFF00FF00probe hit!') 725 print(' '..block:GetName()..' |cFF00FF00probe hit!')
765 801
766 Module.UpdateItemButtonCooldown = function(button) 802 Module.UpdateItemButtonCooldown = function(button)
767 803
768 end 804 end
769 805
806
770 Default.Select = function(handler, block) 807 Default.Select = function(handler, block)
771 Module:Update(handler.watchReasonModule) 808 Module:Update(handler.watchReasonModule)
772 end 809 end
773 Default.Open = function(handler, block) 810 Default.Open = function(handler, block)
774 Module:Update(handler.watchReasonModule) 811 Module:Update(handler.watchReasonModule)