diff ObjectiveTracker/Widgets.lua @ 43:9480bd904f4c

- file name organizing
author Nenue
date Mon, 25 Apr 2016 13:51:58 -0400
parents 92534dc793f2
children
line wrap: on
line diff
--- a/ObjectiveTracker/Widgets.lua	Mon Apr 25 03:32:34 2016 -0400
+++ b/ObjectiveTracker/Widgets.lua	Mon Apr 25 13:51:58 2016 -0400
@@ -1,14 +1,16 @@
 local B = select(2,...).frame
 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
 local print = B.print('WidgetFactory')
+local tprint = B.print('Tracker')
 local _G, UIParent = _G, UIParent
 local GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown = GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown
-local CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll = CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll
-local tremove, tContains, pairs, ipairs, setmetatable, floor = tremove, tContains, pairs, ipairs, setmetatable, floor
+local CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame = CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame
+local pairs, ipairs, floor = pairs, ipairs, floor
 local SetItemButtonTexture, SetItemButtonCount = SetItemButtonTexture, SetItemButtonCount
-local ToggleWorldMap, GetTrackedAchievements, GetTasksTable = ToggleWorldMap, GetTrackedAchievements, GetTasksTable
+local ToggleWorldMap = ToggleWorldMap
 -- GLOBALS: Veneer_QuestObjectiveItem_UpdateCooldown, Veneer_QuestObjectiveItem_OnUpdate
---- frame refs
+
+--- Functions for generating and recycling the miscellaneous interface widgets specified by quests
 local Wrapper = _G.VeneerObjectiveWrapper
 local Scroller = Wrapper.scrollArea
 local CloseButton = Wrapper.CloseButton
@@ -113,6 +115,57 @@
   ToggleWorldMap()
 end
 
+--- Get a usable widget for the given achievement criteria set.
+-- Returns a frame object with dimensioning parameters needed to size the receiving tracker block
+local wr = T.WidgetRegistry
+T.GetWidget = function(data, objectiveType, objectiveKey)
+  local print = B.print('ObjectiveWidgets')
+  local widgetType = objectiveType
+  local widget
+  local isNew
+  if wr[widgetType] and wr[widgetType].used[objectiveKey] then
+    widget = wr[widgetType].used[objectiveKey]
+    print('|cFF00FF00Updating ('..objectiveKey..')', widget)
+  elseif not wr[widgetType] or #wr[widgetType].free == 0 then
+    -- creating a new frame
+    isNew = true
+    widget = CreateFrame(widgetType, 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType)
+    print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn)
+    T.UpdateSchema(widgetType, data.schema or 'default')
+  else
+    -- recycling for a different criteria set
+    isNew = true
+    widget = tremove(wr[widgetType].free)
+    print('|cFFFFFF00Acquiring released widget', widget:GetName())
+  end
+
+  for k,v in pairs(data) do
+    if not widget[k] then
+      widget[k] = v
+      tprint('widget', widget:GetName(), k, v)
+    end
+  end
+
+  wr[widgetType].used[objectiveKey] = widget
+  widget.objective = data
+  widget.key = objectiveKey
+  T.InitializeWidget(widget, isNew)
+  return widget
+end
+
+local wr = T.WidgetRegistry
+--- WidgetTemplate 'OnLoad'
+T.RegisterWidget = function(frame)
+  local print = B.print('ObjectiveWidgets')
+  local widgetType = frame.widgetType
+  if not wr[frame.widgetType] then
+    print('|cFFFF4400[[WidgetTemplate]]|r', widgetType)
+    wr[widgetType] = { lastn = 1, free = {}, used = {}, usedIndex = {}, freeIndex = {} }
+  else
+    print('|cFF0088FF+ [[WidgetTemplate]]r', widgetType, wr[widgetType].lastn)
+    wr[widgetType].lastn = wr[widgetType].lastn + 1
+  end
+end
 
 T.InitializeWidgets = function()
   local panelButtons = T.buttons