comparison ObjectiveCore.lua @ 19:605e8f0e46db

ObjectiveCore / Style / Events / Frame - polishing the execution path for better performance - make use of the Blizzard_ObjectiveTracker bitfield values to ensure compatibility in possible secure hooks - avoid full updates when possible (using said bitfield values to indicate targeted sections) - extreme streamlining of event handling layout: specific reason updates are invoked from API hooks; broader updates are invoked by when the event listener catches something vague like 'QUEST_LOG_UPDATE'
author Nenue
date Wed, 06 Apr 2016 07:38:35 -0400
parents 880828018bf4
children 6bd2102d340b
comparison
equal deleted inserted replaced
18:d1812fb10ae6 19:605e8f0e46db
1 --- ${PACKAGE_NAME} 1 --- ${PACKAGE_NAME}
2 -- @file-author@ 2 -- @file-author@
3 -- @project-revision@ @project-hash@ 3 -- @project-revision@ @project-hash@
4 -- @file-revision@ @file-hash@ 4 -- @file-revision@ @file-hash@
5 -- Created: 3/26/2016 1:51 AM 5 -- Created: 3/26/2016 1:51 AM
6 local B = select(2,...).frame 6 local B, _G = select(2,...).frame, _G
7 local pairs, setmetatable, type, tostring = pairs, setmetatable, type, tostring 7 local pairs, setmetatable, type, tostring = _G.pairs, _G.setmetatable, _G.type, _G.tostring
8 local format = string.format 8 local format = _G.format
9 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') 9 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
10 local print = B.print('Objectives') 10 local print = B.print('Objectives')
11 local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame 11 local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = _G.ObjectiveTrackerFrame, _G.VeneerObjectiveScroll, _G.CreateFrame
12 12 local Wrapper = _G.VeneerObjectiveWrapper
13 --[[ 13 local ipairs, tinsert, hooksecurefunc = _G.ipairs, _G.tinsert, _G.hooksecurefunc
14 Full quest info is available if: 14 local Scroller = VeneerObjectiveWrapper.scrollArea
15 - It's in the player quest log, or is available from the Gossip interface 15 local Scroll = _G.VeneerObjectiveScroll
16 - It's being shared from another player and is acceptible
17 - It's an auto-quest that is available in the current location
18 Partial quest info is availabe if:
19 - It's already completed (i.e. it appears in CompletedQuestInfo()).
20 - It's an scheduled interval quest (daily, weekly, etc.)
21 - It's contained in a quest link received from chat
22 Under any other circumstances, only minimal info can be pulled:
23 - Its availability to the player
24 - Its relation with the currently engaged NPC
25 - Its binary completion status
26
27 ]]
28
29 16
30 --- Performance values 17 --- Performance values
31 --[[ 18 --[[
32 self:RegisterEvent("QUEST_LOG_UPDATE"); 19 self:RegisterEvent("QUEST_LOG_UPDATE");
33 self:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED"); 20 self:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED");
43 self:RegisterEvent("QUEST_POI_UPDATE"); 30 self:RegisterEvent("QUEST_POI_UPDATE");
44 self:RegisterEvent("VARIABLES_LOADED"); 31 self:RegisterEvent("VARIABLES_LOADED");
45 self:RegisterEvent("QUEST_TURNED_IN"); 32 self:RegisterEvent("QUEST_TURNED_IN");
46 self:RegisterEvent("PLAYER_MONEY"); 33 self:RegisterEvent("PLAYER_MONEY");
47 ]] 34 ]]
48 mod.Reason ={ 35
49 UPDATE_MASK_AUTOQUEST = 0x00000001, 36
50 UPDATE_MASK_QUEST = 0x00000002, 37 --- These are the bitfields used by Blizzard_ObjectiveTracker to determine which segments get parsed.
51 UPDATE_MASK_BONUS = 0x00000004, 38 --- They are replicated here so that plugins can make use of any securehook args involving this info.
52 UPDATE_MASK_CHEEVS = 0x00000008, 39 local OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST -- 0x0100
53 UPDATE_MASK_ALL = 0x00000017, 40 local OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP = OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP -- 0x0200
54 41 local OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE -- 0x0400
55 QUEST_LOG_UPDATE = 0x00000003, 42 local OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO -- 0x0800
56 TRACKED_ACHIEVEMENT_LIST_CHANGED = 0x00000008, 43 local OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT -- 0x1000
57 QUEST_WATCH_LIST_CHANGED = 0x00000003, 44
58 QUEST_AUTOCOMPLETE = 0x00000003, 45
59 QUEST_ACCEPTED = 0x00000003, 46 local OBJECTIVE_TRACKER_UPDATE_STATIC = OBJECTIVE_TRACKER_UPDATE_STATIC -- 0x0000
60 SUPER_TRACKED_QUEST_CHANGED = 0x00000002, 47 local OBJECTIVE_TRACKER_UPDATE_ALL = OBJECTIVE_TRACKER_UPDATE_ALL -- 0xFFFF
61 SCENARIO_UPDATE = 0x00000004, 48 local OBJECTIVE_TRACKER_UPDATE_ID = OBJECTIVE_TRACKER_UPDATE_ID -- 0
62 SCENARIO_CRITERIA_UPDATE = 0x00000004, 49
63 TRACKED_ACHIEVEMENT_UPDATE = 0x00000008, 50 local OBJECTIVE_TRACKER_UPDATE_QUEST = OBJECTIVE_TRACKER_UPDATE_QUEST -- 0x0001
64 ZONE_CHANGED_NEW_AREA = 0x00000017, 51 local OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED = OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED -- 0x0002
65 ZONE_CHANGED = 0x00000017, 52 local OBJECTIVE_TRACKER_UPDATE_TASK_ADDED = OBJECTIVE_TRACKER_UPDATE_TASK_ADDED -- 0x0004
66 QUEST_POI_UPDATE = 0x00000003, 53 local OBJECTIVE_TRACKER_UPDATE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_SCENARIO -- 0x0008
67 QUEST_TURNED_IN = 0x00000003, 54 local OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE = OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE -- 0x0010
68 } 55 local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT -- 0x0020
56 local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED -- 0x0040
57 local OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED = OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED -- 0x0080
58
59 local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_ALL -- default
60 --- Used to determine which trackers are listening for money events
69 mod.MoneyReasons = 0 61 mod.MoneyReasons = 0
70 62
71 --- Baseline defaults 63 --- Baseline defaults table; values defined in the files that they pertain to
72 mod.defaults = {} 64 mod.defaults = {}
73 65
74 --- list used to make things happen 66 --- Tracker display order
75 mod.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'} 67 mod.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
76 68
77 --- ipairs() list of handlers for wrapper update 69 --- ipairs() argument tables
78 mod.orderedHandlers = {} 70 mod.orderedHandlers = setmetatable({}, {__mode = "k"})
79 mod.orderedTrackers = {} 71 mod.orderedTrackers = setmetatable({}, {__mode = "k"})
80 mod.indexedTrackers = {} 72 mod.indexedTrackers = setmetatable({}, {__mode = "k"})
81 --- pairs() list of handler frames for tracker updates 73
82 mod.namedTrackers = {} 74 --- pairs() argument tables
83 75 mod.namedTrackers = setmetatable({}, {__mode = "k"})
84 --- Handler stubs 76
77 local WRAPPER_ANCHOR_POINT = 'TOPRIGHT'
78 local WRAPPER_OFFSET_X = 0
79 local WRAPPER_OFFSET_Y = -200
80 local WRAPPER_MAX_HEIGHT = 670
81 local WRAPPER_WIDTH = 280
82 local WRAPPER_HEADER_HEIGHT = 24
83
84 mod.defaults.Wrapper = {
85 AnchorPoint = WRAPPER_ANCHOR_POINT,
86 OffsetX = WRAPPER_OFFSET_X,
87 OffsetY = WRAPPER_OFFSET_Y,
88 Height = WRAPPER_MAX_HEIGHT,
89 Width = WRAPPER_WIDTH,
90 HeaderHeight = WRAPPER_HEADER_HEIGHT
91 }
92 --- Tracker module definitions begin here; innards dealing with data retreival and output are defined further in
93 mod.DefaultTracker = {
94 previousHeight = 0,
95
96 name = "temp",
97 displayName = "temp",
98 updateReasonModule = 0xFF00,
99 updateReasonEvent = 0x00FF,
100
101 numWatched = 0, --- number of entries being handled
102 numBlocks = 0, --- number of blocks created
103 actualBlocks = 0, --- number of blocks in use
104
105 freeBlocks = {}, --- block heap
106 usedBlocks = {},
107
108 Info = {}, -- find data by ID
109 BlockInfo = {}, -- find data by block ID
110 Watched = {}, -- find watchIndex by data ID
111 WatchInfo = {}, -- find data by watch index
112 WatchBlock = {}, -- find block by watch index
113 }
114
85 mod.AutoQuest = { 115 mod.AutoQuest = {
86 name = "AutoQuest", 116 name = "AutoQuest",
87 displayName = "Notice", 117 displayName = "Notice",
118 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
119 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
120 OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
88 } 121 }
89 mod.Quest = { 122 mod.Quest = {
90 name = "Quest", 123 name = "Quest",
91 displayName = "Quests", 124 displayName = "Quests",
125 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
126 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
127 OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
92 } 128 }
93 mod.Cheevs = { 129 mod.Cheevs = {
94 name = "Cheevs", 130 name = "Cheevs",
95 displayName = "Achievements", 131 displayName = "Achievements",
132 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT,
133 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT +
134 OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED,
96 } 135 }
97 mod.Bonus = { 136 mod.Bonus = {
98 name = "Bonus", 137 name = "Bonus",
99 displayName = "Bonus Objectives", 138 displayName = "Bonus Objectives",
100 } 139 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE,
101 140 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
102 --- Handler template 141 OBJECTIVE_TRACKER_UPDATE_TASK_ADDED +
103 local CreateHandler = function (self, name, index) 142 OBJECTIVE_TRACKER_UPDATE_SCENARIO +
104 print(self, name) 143 OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE +
144 OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED
145 }
146
147 local Tracker_string = function (self)
148 return self.name
149 end
150 local Tracker_call = function (self, reason)
151 self:Update(reason)
152 end
153
154 local Tracker_Initialize = function (self, name, index)
155 print('Initializing |cFF00FFFF'..name..'|r module...')
105 156
106 local handler = setmetatable(mod[name] or {}, { 157 local handler = setmetatable(mod[name] or {}, {
107 __tostring = function() return name end, 158 __tostring = Tracker_string,
108 __call = function (self) mod.UpdateTracker(self) end 159 __call = Tracker_call
109 }) 160 })
110 if type(mod.orderedHandlers[index]) == 'table' then 161 if type(mod.orderedHandlers[index]) == 'table' then
111 return mod.orderedHandlers[index] 162 return mod.orderedHandlers[index]
112 end 163 end
113 164
114 print('take up locals first') 165 print('|cFFFFFF00Acquiring locals')
115 local preset = {} 166 local preset = {}
116 for k,v in pairs(mod[name]) do 167 for k, _ in pairs(handler) do
117 preset[k] = true 168 preset[k] = true
118 if type(v) == 'table' then 169 end
119 handler[k] = {} 170
120 else 171
121 handler[k] = v 172 print('|cFFFF8800Inheriting')
122 end
123 end
124
125
126 print('resulting handler contents')
127 for k, v in pairs(self) do 173 for k, v in pairs(self) do
128 if not handler[k] then 174 if not handler[k] then
129 if type(v) == 'table' then 175 if type(v) == 'table' then
130 -- assume all tables to be local data; don't inherit or ref 176 -- assume all tables to be local data; don't inherit or ref
131 handler[k] = {} 177 handler[k] = {}
132 else 178 else
133 handler[k] = mod.Tracker[k] 179 handler[k] = self[k]
134 end 180 end
135 else 181 print('copying', k)
136 print(name, 'has its own', k)
137 end 182 end
138 end 183 end
139 print('|cFFFF4400'..tostring(name)..'|r:') 184 print('|cFFFF4400'..tostring(name)..'|r:')
140 for k, v in pairs(handler) do 185 for k, v in pairs(handler) do
141 print(format("%24s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v))) 186 print(format("%32s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
142 end 187 end
143 188
144 mod[name] = handler 189 mod[name] = handler
190
191 local trackerName = 'Veneer'..name..'Tracker'
192 local handler = mod[name]
193 local frame = CreateFrame('Frame', trackerName, _G.VeneerObjectiveScroll, 'VeneerTrackerTemplate')
194 frame.title:SetText(handler.displayName)
195 mod.SetBlockStyle(frame, 'Tracker', 'Normal')
196 handler.frame = frame
197 handler.trackerName = trackerName
198 mod.orderedTrackers[index] = frame
199 mod.namedTrackers[name] = frame
200 mod.indexedTrackers[handler] = frame
201 print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module')
145 202
146 mod.orderedHandlers[index] = handler 203 mod.orderedHandlers[index] = handler
147 return true 204 return true
148 end 205 end
149 206
150 mod.Tracker = setmetatable({}, { 207 function mod:OnEvent (event, ...)
151 __call = CreateHandler, 208 local isHandled
152 __tostring = function() return 'DEFAULT_TRACKING_HANDLER' end 209 print('|cFF00FF00'.. event ..'|r', ...)
153 }) 210 if ( event == "QUEST_LOG_UPDATE" ) then
154 local Tracker = mod.Tracker 211 mod:Update(OBJECTIVE_TRACKER_UPDATE_QUEST);
155 Tracker.numWatched = 0 --- number of entries being handled 212 elseif ( event == "TRACKED_ACHIEVEMENT_UPDATE" ) then
156 Tracker.numBlocks = 0 --- number of blocks created 213 --AchievementObjectiveTracker_OnAchievementUpdate(...);
157 Tracker.actualBlocks = 0 --- number of blocks in use 214 mod.Cheevs:Update(OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT)
158 215 elseif ( event == "QUEST_ACCEPTED" ) then
159 Tracker.freeBlocks = {} --- block heap 216 local questLogIndex, questID = ...;
160 Tracker.usedBlocks = {} 217 if ( IsQuestTask(questID) ) then
161 218 mod:Update(OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID);
162 Tracker.Watched = {} -- find by watchIndex
163 Tracker.Info = {} -- find by data ID
164 Tracker.BlockInfo = {} -- find by block ID
165 Tracker.WatchInfo = {} -- find data by watch index
166 Tracker.WatchBlock = {} -- find block by watch index
167
168
169
170 Tracker.GetBlock = function(handler, blockIndex)
171 local block = handler.usedBlocks[blockIndex]
172 if not handler.usedBlocks[blockIndex] then
173 if #handler.freeBlocks >= 1 then
174 block = handler.freeBlocks[#handler.freeBlocks]
175 handler.freeBlocks[#handler.freeBlocks] = nil
176 else 219 else
177 block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, VeneerObjectiveScroll, 'VeneerTrackerBlock') 220 if ( AUTO_QUEST_WATCH == "1" and GetNumQuestWatches() < MAX_WATCHABLE_QUESTS ) then
178 block.SetStyle = mod.SetBlockStyle 221 AddQuestWatch(questLogIndex);
179 block.Select = handler.Select 222 SetSuperTrackedQuestID(questID);
180 block.Open = handler.Open 223 end
181 block.Remove = handler.Remove 224 end
182 block.Link = handler.Link 225 elseif ( event == "TRACKED_ACHIEVEMENT_LIST_CHANGED" ) then
183 block:SetScript('OnMouseUp', handler.OnMouseUp) 226 local achievementID, added = ...;
184 block:SetScript('OnMouseDown', handler.OnMouseDown) 227 if ( added ) then
185 block:ClearAllPoints() 228 mod:Update(OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID);
186 end 229 else
187 230 mod:Update(OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT);
188 handler.usedBlocks[blockIndex] = block 231 end
189 end 232 elseif ( event == "QUEST_WATCH_LIST_CHANGED" ) then
190 return handler.usedBlocks[blockIndex] 233 local questID, added = ...;
191 end 234 if ( added ) then
192 235 if ( not IsQuestTask(questID) ) then
236 mod:Update(OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID);
237 end
238 else
239 mod:Update(OBJECTIVE_TRACKER_UPDATE_QUEST);
240 end
241 elseif ( event == "QUEST_POI_UPDATE" ) then
242 QuestPOIUpdateIcons();
243 if ( GetCVar("trackQuestSorting") == "proximity" ) then
244 SortQuestWatches();
245 end
246
247 mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST);
248
249 elseif ( event == "SCENARIO_CRITERIA_UPDATE" ) then
250 mod:Update(OBJECTIVE_TRACKER_UPDATE_SCENARIO);
251 elseif ( event == "SUPER_TRACKED_QUEST_CHANGED" ) then
252 mod:Update(OBJECTIVE_TRACKER_UPDATE_QUEST)
253 elseif ( event == "ZONE_CHANGED" ) then
254 local inMicroDungeon = IsPlayerInMicroDungeon();
255 if ( inMicroDungeon ~= self.inMicroDungeon ) then
256 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
257 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
258 end
259 --SortQuestWatches();
260 self.inMicroDungeon = inMicroDungeon;
261 end
262 elseif ( event == "QUEST_AUTOCOMPLETE" ) then
263 local questId = ...;
264 AddAutoQuestPopUp(questId, "COMPLETE");
265 elseif ( event == "SCENARIO_UPDATE" ) then
266 local newStage = ...;
267 if ( newStage ) then
268 mod:Update(OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE);
269 else
270 mod:Update(OBJECTIVE_TRACKER_UPDATE_SCENARIO);
271 end
272 elseif ( event == "ZONE_CHANGED_NEW_AREA" ) then
273 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
274 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
275 end
276 SortQuestWatches();
277 elseif ( event == "QUEST_TURNED_IN" ) then
278 local questID, xp, money = ...;
279 if ( IsQuestTask(questID) ) then
280 mod.Bonus:Update()
281 end
282 elseif ( event == "PLAYER_MONEY" and self.watchMoneyReasons > 0 ) then
283 mod:Update(self.watchMoneyReasons);
284 end
285 end
286
287 --- Done once per ui load
288 local BlizzHooks = {
289 ['AddQuestWatch'] = 'AddQuestWatch',
290 ['RemoveQuestWatch'] = 'RemoveQuestWatch',
291 ['AbandonQuest'] = 'AbandonQuest',
292 ['AcknowledgeAutoAcceptQuest'] = 'AcknowledgeAutoAcceptQuest',
293 ['AddAutoQuestPopUp'] = 'AddAutoQuestPopUp',
294 ['RemoveAutoQuestPopUp'] = 'RemoveAutoQuestPopUp',
295 ['AddTrackedAchievement'] = 'AddTrackedAchievement',
296 ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement',
297 ['SetSuperTrackedQuestID'] = 'SetSuperTrackedQuestID'
298 }
299 local VeneerData
193 function mod:OnInitialize() 300 function mod:OnInitialize()
194 self.InitializeWrapper() 301 local c = mod.Conf.Wrapper
195 self.InitializeXPTracker() 302 VeneerData = _G.VeneerData
196 mod.SetEvents() 303 VeneerData.CallLog = VeneerData.CallLog or {}
304 if not mod.isHooked then
305 mod.isHooked = true
306 for blizzFunc, veneerFunc in pairs(BlizzHooks) do
307 if mod[veneerFunc] then
308 hooksecurefunc(blizzFunc, mod[veneerFunc])
309 else
310 hooksecurefunc(blizzFunc, function(...)
311 print('|cFFFF0088securehook('..tostring(blizzFunc)..')|r args:', ...)
312 tinsert(VeneerData.CallLog, {blizzFunc, ...})
313 end)
314 end
315 end
316 end
317 Scroller:SetScrollChild(Scroll)
318 Scroller:SetWidth(c.Width)
319 Scroll:SetPoint('TOPLEFT', Scroller, 'TOPLEFT')
320 Scroll:SetWidth(c.Width)
197 ObjectiveTrackerFrame:UnregisterAllEvents() 321 ObjectiveTrackerFrame:UnregisterAllEvents()
198 ObjectiveTrackerFrame:Hide() 322 ObjectiveTrackerFrame:Hide()
199 end 323 end
324
325 --- Done any time the the minimize button is toggled up
326
327 function mod:OnEnable()
328 for id, name in ipairs(mod.orderedNames) do
329 if not mod.orderedHandlers[id] then
330 Tracker_Initialize(mod.DefaultTracker, name, id)
331 end
332 end
333
334 for event, func in pairs(mod) do
335 if type(func) == 'function' and event:match('^[A-Z_]+$') then
336 print('|cFFFF44FFlistening to', event)
337 Wrapper:RegisterEvent(event)
338 end
339 end
340
341 local c = mod.Conf.Wrapper
342 Wrapper:SetPoint(c.AnchorPoint, UIParent, c.AnchorPoint, c.OffsetX, c.OffsetY)
343 B.Conf.FramePosition[Wrapper:GetName()] = {c.AnchorPoint, c.AnchorPoint, c.OffsetX, c.OffsetY}
344 Wrapper:SetWidth(c.Width)
345
346
347 mod.InitializeWidgets()
348 mod:Update()
349 end
350
351 function mod:OnDisable()
352
353 end
354
355