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