Mercurial > wow > buffalo2
comparison ObjectiveTracker/Widgets.lua @ 39:92534dc793f2
- restore the previous QuestLogSelection after pulling for selection-restricted quest data; fixes icon mixups while quest map is open
- moved progressbar builders into the schema environment, with all the other Frame.lua functions; prep for configuration access
- relegate the various removal events to a framescript in their corresponding blocks; this takes care of resolving dead frames
author | Nenue |
---|---|
date | Thu, 21 Apr 2016 16:43:37 -0400 |
parents | 1f8f9cc3d956 |
children | 9480bd904f4c |
comparison
equal
deleted
inserted
replaced
38:1f8f9cc3d956 | 39:92534dc793f2 |
---|---|
252 SetItemButtonTextureVertexColor(itemButton, 1, 1, 1) | 252 SetItemButtonTextureVertexColor(itemButton, 1, 1, 1) |
253 end | 253 end |
254 end | 254 end |
255 end | 255 end |
256 | 256 |
257 ----------------------------------------- | |
258 -- Criteria frames | |
259 | |
260 --[[ | |
261 text = description, | |
262 type = type, | |
263 finished = completed, | |
264 quantity = quantity, | |
265 requiredQuantity = requiredQuantity, | |
266 characterName = characterName, | |
267 flags = flags, | |
268 assetID = assetID, | |
269 quantityString = quantityString, | |
270 criteriaID = criteriaID, | |
271 ]] | |
272 local newWidgetID = 0 | |
273 T.WidgetRegistry = {} | |
274 local wr = T.WidgetRegistry | |
275 | |
276 --- Get a usable widget for the given achievement criteria set. | |
277 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block | |
278 T.GetWidget = function(data, objectiveType, objectiveKey) | |
279 local print = B.print('ObjectiveWidgets') | |
280 local widgetType = objectiveType | |
281 local widget | |
282 if wr[widgetType] and wr[widgetType].used[objectiveKey] then | |
283 widget = wr[widgetType].used[objectiveKey] | |
284 print('|cFF00FF00Updating ('..objectiveKey..')', widget) | |
285 elseif not wr[widgetType] or #wr[widgetType].free == 0 then | |
286 widget = CreateFrame(widgetType, 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType) | |
287 print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn) | |
288 else | |
289 widget = tremove(wr[widgetType].free) | |
290 print('|cFFFFFF00Acquiring released widget', widget:GetName()) | |
291 end | |
292 | |
293 | |
294 wr[widgetType].used[objectiveKey] = widget | |
295 widget.objective = data | |
296 widget.key = objectiveKey | |
297 T.InitializeWidget(widget) | |
298 return widget | |
299 end | |
300 | |
301 --- WidgetTemplate 'OnLoad' | |
302 T.RegisterWidget = function(frame) | |
303 local print = B.print('ObjectiveWidgets') | |
304 local widgetType = frame.widgetType | |
305 if not wr[frame.widgetType] then | |
306 print('|cFFFF4400[[WidgetTemplate]]|r', widgetType) | |
307 wr[widgetType] = { lastn = 1, free = {}, used = {}, usedIndex = {}, freeIndex = {} } | |
308 else | |
309 print('|cFF0088FF+ [[WidgetTemplate]]r', widgetType, wr[widgetType].lastn) | |
310 wr[widgetType].lastn = wr[widgetType].lastn + 1 | |
311 end | |
312 end | |
313 --- WidgetTemplate 'OnShow' | |
314 local wrapperWidth, textIndent | |
315 T.InitializeWidget = setmetatable({}, { | |
316 __call = function(t, frame) | |
317 -- todo: config pull | |
318 if not wrapperWidth then | |
319 wrapperWidth = T.Conf.Wrapper.Width | |
320 textIndent = T.Conf.Wrapper.TextIndent | |
321 end | |
322 | |
323 frame:SetWidth(wrapperWidth - textIndent * 2) | |
324 frame:SetScript('OnEvent', T.UpdateWidget[frame.widgetType]) | |
325 frame:RegisterEvent('QUEST_LOG_UPDATE') | |
326 frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE') | |
327 frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED') | |
328 frame:RegisterEvent('CRITERIA_UPDATE') | |
329 frame:RegisterEvent('CRITERIA_COMPLETE') | |
330 frame:RegisterEvent('CRITERIA_EARNED') | |
331 t[frame.widgetType](frame) | |
332 T.UpdateWidget[frame.widgetType](frame) | |
333 end, | |
334 }) | |
335 | |
336 --- WidgetTemplate 'OnEvent' | |
337 T.UpdateWidget = setmetatable({}, { | |
338 __call = function(t, frame) | |
339 if not frame.widgetType then | |
340 error('Invalid widget template, needs .widgetType') | |
341 return | |
342 end | |
343 | |
344 return t[frame.widgetType](frame) | |
345 end | |
346 }) | |
347 | |
348 --- WidgetTemplate 'OnHide' | |
349 T.ReleaseWidget = function(frame) | |
350 --[[ | |
351 local print = B.print('ObjectiveWidgets') | |
352 local reg = wr[frame.widgetType] | |
353 if reg and reg.used[frame.key] then | |
354 reg.used[frame.key] = nil | |
355 frame.line = nil | |
356 frame.info = nil | |
357 frame:UnregisterAllEvents() | |
358 tinsert(reg.free, frame) | |
359 print('|cFFBBBBBBreleased from service', frame:GetName()) | |
360 end | |
361 ]] | |
362 end | |
363 | |
364 --- RemoveTrackedAchievement post-hook | |
365 T.CleanWidgets = function() | |
366 local print = B.print('ObjectiveWidgets') | |
367 local tracked = {GetTrackedAchievements() } | |
368 local tasks = GetTasksTable() | |
369 for type, reg in pairs(T.WidgetRegistry) do | |
370 print('collecting', type) | |
371 for key, frame in pairs(reg.used) do | |
372 if frame.objective.cheevID then | |
373 local id = frame.objective.cheevID | |
374 | |
375 if id and not tContains(tracked, id) then | |
376 | |
377 print(' untracked achievement', id, 'associated with', key, frame:GetName()) | |
378 frame:Hide() | |
379 end | |
380 elseif frame.objective.questID then | |
381 -- do something for quest task | |
382 end | |
383 end | |
384 end | |
385 end | |
386 | |
387 | |
388 | |
389 T.defaults.WidgetStyle = { | |
390 | |
391 } | |
392 | |
393 local progressHeight = 17 | |
394 local progressBorder = 1 | |
395 local progressFont = _G.VeneerCriteriaFontNormal | |
396 | |
397 local lprint = B.print('Line') | |
398 T.InitializeWidget.StatusBar = function(self) | |
399 local print = lprint | |
400 local c = T.Conf.Wrapper | |
401 self.height = progressHeight + c.TextSpacing | |
402 self.width = c.Width - c.TextSpacing | |
403 self.value = self.value or 1 | |
404 self.maxValue = self.maxValue or 1 | |
405 | |
406 self:SetHeight(progressHeight) | |
407 self:SetMinMaxValues(0, self.maxValue) | |
408 self:SetValue(self.value) | |
409 | |
410 --self.status:SetFontObject(progressFont) | |
411 self.status:SetText(self.objective.quantityString) | |
412 end | |
413 | |
414 T.UpdateWidget.StatusBar = function (self) | |
415 local value, maxValue = self.value, self.maxValue | |
416 print('update vals:') | |
417 for k,v in pairs(self) do | |
418 print(k, v) | |
419 end | |
420 self:SetValue(self.value) | |
421 local format = self.format or '%d/%d' | |
422 self.status:SetFormattedText(format, value, maxValue) | |
423 local progress = (value / maxValue) | |
424 if progress > 0 then | |
425 print('color:', 1-progress*2 , progress*2 - 1,0,1) | |
426 print('width:', (self.width -progressBorder * 2) * progress) | |
427 self:SetStatusBarColor(1-progress*2 , progress*2,0,1) | |
428 end | |
429 end | |
430 | |
431 | |
432 T.InitializeWidget.Hidden = function (self) | |
433 self.height = 0 | |
434 end | |
435 T.UpdateWidget.Hidden = function (self) | |
436 self.height= 0 | |
437 end | |
438 | |
439 | |
440 --- Queue any active item buttons for update for that frame | |
441 local iprint = B.print('ItemButton') | |
442 local Quest = T.Quest | |
443 local IsQuestWatched, InCombatLockdown = IsQuestWatched, InCombatLockdown | |
444 T.UpdateActionButtons = function(updateReason) | |
445 local print = iprint | |
446 Scroller.snap_upper = 0 | |
447 Scroller.snap_lower = 0 | |
448 local print = B.print('ItemButton') | |
449 if updateReason then | |
450 print = B.print('IB_'..updateReason) | |
451 end | |
452 | |
453 local previousItem | |
454 for questID, itemButton in pairs(Quest.itemButtons) do | |
455 local info= T.Quest.Info[questID] | |
456 | |
457 print('|cFF00FFFF'.. questID .. '|r', itemButton:GetName()) | |
458 local block = T.Quest.QuestBlock[questID] | |
459 if block then | |
460 -- Dispatch the probe | |
461 if IsQuestWatched(info.logIndex) then | |
462 itemButton.previousItem = previousItem | |
463 print(' |cFFFFFF00probing', block:GetName()) | |
464 block:SetScript('OnUpdate', function() | |
465 if block:GetBottom() and not InCombatLockdown() then | |
466 print(' '..block:GetName()..' |cFF00FF00probe hit!') | |
467 T.UpdateBlockAction(block, itemButton, itemButton.previousItem) -- needs to be previousItem from this scope | |
468 block:SetScript('OnUpdate', nil) | |
469 | |
470 end | |
471 end) | |
472 previousItem = itemButton | |
473 else | |
474 print('hidden block or unwatched quest') | |
475 itemButton.previousItem = nil | |
476 itemButton:Hide() | |
477 end | |
478 elseif itemButton:IsVisible() then | |
479 print(' |cFFFF0088hiding unwatched quest button', itemButton:GetName()) | |
480 itemButton.previousItem = nil | |
481 itemButton:Hide() | |
482 else | |
483 print(' |cFFBBBBBBignoring hidden log quest button', itemButton:GetName()) | |
484 end | |
485 end | |
486 end |