comparison ObjectiveUI.lua @ 8:7923243ae972

ObjectiveUI & ObjectiveEvents - securehook to API calls for compatibility with addons that work with the objective tracking interface - let the API hooks invoke ObjectiveUI functions when possible - ObjectiveUI framescript handlers should use the corresponding API call if possible, so that addon space can be fully aware of our actions - Sanity check cached data when possible during 'Remove' hooks ObjectiveInfo - Add cheevID to criteria info ObjectiveCore - Index quest tracker blocks by their watch offset, and use that to verify whether the given block frame should be released into pool ObjectiveFrame - Differentiate between visible and non-visible unused buttons, and only release when their quest has been dropped
author Nenue
date Fri, 01 Apr 2016 14:40:14 -0400
parents 5301c68f28d8
children 2698173edd40
comparison
equal deleted inserted replaced
7:5301c68f28d8 8:7923243ae972
34 self:Open() 34 self:Open()
35 end 35 end
36 self.initialButton = nil 36 self.initialButton = nil
37 self.modChatLink = nil 37 self.modChatLink = nil
38 self.modQuestWatch = nil 38 self.modQuestWatch = nil
39 print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r ->',self.info.trackingID) 39 print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE"))
40 print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r')
40 end 41 end
41 42
42 Tracker.OnMouseDown = function(self, button) 43 Tracker.OnMouseDown = function(self, button)
43 self.initialButton = button 44 self.initialButton = button
44 self.modChatLink = IsModifiedClick("CHATLINK") 45 self.modChatLink = IsModifiedClick("CHATLINK")
45 self.modQuestWatch = IsModifiedClick("QUESTWATCHTOGGLE") 46 self.modQuestWatch = IsModifiedClick("QUESTWATCHTOGGLE")
46 self:SetStyle('Active') 47 self:SetStyle('Active')
48 print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE"))
47 print(self.info.title) 49 print(self.info.title)
48 end 50 end
49 51
50 ----------------------------- 52 -----------------------------
51 --- AUTO_QUEST 53 --- AUTO_QUEST
70 end 72 end
71 73
72 Quest.Remove = function(self) 74 Quest.Remove = function(self)
73 print('removing', self.info.questLogIndex, 'from watcher') 75 print('removing', self.info.questLogIndex, 'from watcher')
74 RemoveQuestWatch(self.info.questLogIndex) 76 RemoveQuestWatch(self.info.questLogIndex)
75
76 mod.Quest.LogBlock[self.info.questLogIndex] = nil
77 mod.Quest.QuestBlock[self.info.questID] = nil
78 QuestPOIUpdateIcons()
79 mod.UpdateWrapper()
80 end 77 end
81 78
82 79
83 ----------------------------- 80 -----------------------------
84 --- CHEEVS 81 --- CHEEVS
85 Cheevs.Select = function(self) 82 Cheevs.Select = function(self)
86 end 83 end
84 Cheevs.Remove = function(self)
85 RemoveTrackedAchievement(self.info.cheevID)
86 end
87 Cheevs.OnMouseUp = function(self)
88 Tracker.OnMouseUp(self)
89 self:SetStyle('CheevNormal')
90 end
87 Cheevs.Link = function(self) 91 Cheevs.Link = function(self)
88 local achievementLink = GetAchievementLink(self.info.cheevID); 92 local achievementLink = GetAchievementLink(self.info.cheevID);
89 if ( achievementLink ) then 93 if ( achievementLink ) then
90 ChatEdit_InsertLink(achievementLink); 94 ChatEdit_InsertLink(achievementLink);
91 end 95 end
92 self:SetStyle('CheevNormal')
93 end 96 end
94 97
95 Cheevs.Open = function(self) 98 Cheevs.Open = function(self)
96 if ( not AchievementFrame ) then 99 if ( not AchievementFrame ) then
97 AchievementFrame_LoadUI(); 100 AchievementFrame_LoadUI();
247 local wr = mod.WidgetRegistry 250 local wr = mod.WidgetRegistry
248 251
249 --- Get a usable widget for the given achievement criteria set. 252 --- Get a usable widget for the given achievement criteria set.
250 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block 253 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block
251 mod.SetWidget = function(obj, info) 254 mod.SetWidget = function(obj, info)
255 local print = B.print('ObjectiveWidgets')
252 local widgetType = obj.type 256 local widgetType = obj.type
253 local widget 257 local widget
254 258 if wr[widgetType] and wr[widgetType].used[obj.criteriaID] then
255 if not wr[widgetType] or #wr[widgetType].free == 0 then 259 widget = wr[widgetType].used[obj.criteriaID]
256 print('VeneerObjectiveCriteria' .. widgetType) 260 print('|cFF00FF00Updating ('..obj.criteriaID..')', widget)
257 widget = CreateFrame('Frame', nil, VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType) 261 elseif not wr[widgetType] or #wr[widgetType].free == 0 then
258 end 262 widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType)
259 local free = wr[widgetType].free 263
260 local used = wr[widgetType].used 264 print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn)
261 265 else
262 widget = tremove(free) 266 widget = tremove(wr[widgetType].free)
263 local index = #used+1 267 print('|cFFFFFF00Acquiring released widget', widget:GetName())
264 used[index] = widget 268 end
265 wr[widgetType].usedIndex[widget] = index 269
270 wr[widgetType].used[obj.criteriaID] = widget
266 widget.info = obj 271 widget.info = obj
267 widget.parentInfo = info 272 widget.parentInfo = info
268 mod.InitializeWidget(widget) 273 mod.InitializeWidget(widget)
269
270 return widget 274 return widget
271 end 275 end
272 276
273 --- Fired by OnLoad() when a new frame is spawned 277 --- WidgetTemplate 'OnLoad'
274 mod.RegisterWidget = function(frame) 278 mod.RegisterWidget = function(frame)
279 local print = B.print('ObjectiveWidgets')
275 local widgetType = frame.widgetType 280 local widgetType = frame.widgetType
276 local obj = frame.info
277 if not wr[frame.widgetType] then 281 if not wr[frame.widgetType] then
278 print('|cFFFF4400[[WidgetTemplate]]|r', widgetType) 282 print('|cFFFF4400[[WidgetTemplate]]|r', widgetType)
279 wr[widgetType] = { lastn = 0, free = {}, used = {}, usedIndex = {}, freeIndex = {} } 283 wr[widgetType] = { lastn = 1, free = {}, used = {}, usedIndex = {}, freeIndex = {} }
280 end 284 else
281 tinsert(wr[frame.widgetType].free, frame) 285 print('|cFF0088FF+ [[WidgetTemplate]]r', widgetType, wr[widgetType].lastn)
282 end 286 wr[widgetType].lastn = wr[widgetType].lastn + 1
287 end
288 end
289
290 --- WidgetTemplate 'OnShow'
283 mod.InitializeWidget = setmetatable({}, { 291 mod.InitializeWidget = setmetatable({}, {
284 __call = function(t, frame) 292 __call = function(t, frame)
285 -- todo: config pull 293 -- todo: config pull
286 local maxWidth = 250 294 local maxWidth = 250
287 295
299 frame:RegisterEvent('CRITERIA_EARNED') 307 frame:RegisterEvent('CRITERIA_EARNED')
300 308
301 return t[frame.widgetType](frame) 309 return t[frame.widgetType](frame)
302 end, 310 end,
303 }) 311 })
312
313 --- WidgetTemplate 'OnEvent'
304 mod.UpdateWidget = setmetatable({}, { 314 mod.UpdateWidget = setmetatable({}, {
305 __call = function(t, frame) 315 __call = function(t, frame)
306 if not frame.widgetType then 316 if not frame.widgetType then
307 error('Invalid widget template, needs .widgetType') 317 error('Invalid widget template, needs .widgetType')
308 return 318 return
310 320
311 return t[frame.widgetType](frame) 321 return t[frame.widgetType](frame)
312 end 322 end
313 }) 323 })
314 324
325 --- WidgetTemplate 'OnHide'
315 mod.ReleaseWidget = function(frame) 326 mod.ReleaseWidget = function(frame)
327 local print = B.print('ObjectiveWidgets')
316 local reg = wr[frame.widgetType] 328 local reg = wr[frame.widgetType]
317 if reg and reg.usedIndex[frame] then 329 if reg and reg.used[frame.info.criteriaID] then
318 tremove(reg.used, reg.usedIndex[frame]) 330 reg.used[frame.info.criteriaID] = nil
319 reg.usedIndex[frame] = nil 331 frame.info = nil
332 frame.parentInfo = nil
320 frame:UnregisterAllEvents() 333 frame:UnregisterAllEvents()
321 tinsert(reg.free, frame) 334 tinsert(reg.free, frame)
335 print('|cFFBBBBBBreleased from service', frame:GetName())
336 end
337 end
338
339 --- RemoveTrackedAchievement post-hook
340 mod.CleanWidgets = function()
341 local print = B.print('ObjectiveWidgets')
342 local tracked = {GetTrackedAchievements() }
343 for type, reg in pairs(mod.WidgetRegistry) do
344 print('collecting', type)
345 for criteriaID, frame in pairs(reg.used) do
346 local id = frame.info.cheevID
347
348 if id and not tContains(tracked, id) then
349
350 print(' untracked achievement', id, 'associated with', criteriaID, frame:GetName())
351 frame:Hide()
352 end
353 end
322 end 354 end
323 end 355 end
324 356
325 mod.WidgetParams = { 357 mod.WidgetParams = {
326 ['ProgressBar'] = { 358 ['ProgressBar'] = {
329 quantityString = {SetFontObject = _G.VeneerFontNormal} 361 quantityString = {SetFontObject = _G.VeneerFontNormal}
330 } 362 }
331 } 363 }
332 364
333 mod.InitializeWidget.ProgressBar = function(self) 365 mod.InitializeWidget.ProgressBar = function(self)
366 local print = B.print('ObjectiveWidgets')
334 local params = mod.WidgetParams[self.widgetType] 367 local params = mod.WidgetParams[self.widgetType]
335 self.height = params.height 368 self.height = params.height
336 self:SetHeight(20) 369 self:SetHeight(20)
337 self.bg:SetHeight(20) 370 self.bg:SetHeight(20)
338 self.fg:SetHeight(18) 371 self.fg:SetHeight(16)
339 self.fg:SetPoint('BOTTOMLEFT', self.bg, 'BOTTOMLEFT', 1, 1) 372 self.fg:SetPoint('BOTTOMLEFT', self.bg, 'BOTTOMLEFT', 1, 1)
340 self.quantityString:SetFontObject(params.quantityString.SetFontObject) 373 self.quantityString:SetFontObject(params.quantityString.SetFontObject)
341 self.quantityString:SetText(self.info.quantityString) 374 self.quantityString:SetText(self.info.quantityString)
342 end 375 end
343 376
344 mod.UpdateWidget.ProgressBar = function (self) 377 mod.UpdateWidget.ProgressBar = function (self)
378 local print = B.print('ObjectiveWidgets')
345 local quantity, requiredQuantity = self.info.quantity, self.info.requiredQuantity 379 local quantity, requiredQuantity = self.info.quantity, self.info.requiredQuantity
346 self.fg:SetPoint('TOPLEFT', self, 'TOPLEFT', 0, 0) 380
347 if self.info.finished then 381 if self.info.finished then
348 self.fg:SetWidth(self.bg:GetWidth() - 2) 382 self.fg:SetWidth(self.bg:GetWidth() - 2)
349 elseif quantity == 0 then 383 elseif quantity == 0 then
350 self.fg:Hide() 384 self.fg:Hide()
351 else 385 else
352 self.fg:Show() 386 self.fg:Show()
353 self.fg:SetWidth(self:GetWidth() * (quantity / requiredQuantity)) 387 self.fg:SetWidth((self:GetWidth()-2) * (quantity / requiredQuantity))
354 end 388 end
355 389 end
356 end