comparison ObjectiveUI.lua @ 13:9455693fc290

Init - recall XML display state on reload ObjectiveFrame - quest coloring by relative level - quest coloring by daily/weekly/complete status - remember starting scroll value between reload - limit anchor points to edges for regions affected by style attributes ObjectiveInfo - AutoQuest outline definitions - Pull Quest title and tag data in addition to WatchInfo ObjectiveStyle - ensure consistent style table - hardcode certain attributes for sanity XML - ensure consistent naming conventions for heading and content elements - ensure hardcore anchors are based on edges - expansion of file structure to deal with complexities of dynamic widgets and style caching ObjectiveUI - determine primary style by block handler when restoring original style - moved framescript to 'ObjectiveWidgets' lua
author Nenue
date Sat, 02 Apr 2016 17:46:52 -0400
parents 8238cddaddb1
children ed642234f017
comparison
equal deleted inserted replaced
12:8238cddaddb1 13:9455693fc290
9 local Tracker, AutoQuest, Quest, Cheevs = mod.Tracker, mod.AutoQuest, mod.Quest, mod.Cheevs 9 local Tracker, AutoQuest, Quest, Cheevs = mod.Tracker, mod.AutoQuest, mod.Quest, mod.Cheevs
10 local itemButtonSize, itemButtonSpacing = 36, 1 10 local itemButtonSize, itemButtonSpacing = 36, 1
11 local tremove, tremovebyval = table.remove, table.removebyval 11 local tremove, tremovebyval = table.remove, table.removebyval
12 12
13 -------------------------------------------------------------------- 13 --------------------------------------------------------------------
14 --- Tracker-specific widgets and their handlers 14 --- Functions responsible for:
15 --- - UI interactions that propagate to the BlizzardUI (sending RemoveQuestWatch() on remove quest action)
16 --- -
15 -------------------------------------------------------------------- 17 --------------------------------------------------------------------
16 18
17 Tracker.Select = function(self) end 19 Tracker.Select = function(self) end
18 Tracker.Open = function(self) end 20 Tracker.Open = function(self) end
19 Tracker.Remove = function(self) end 21 Tracker.Remove = function(self) end
23 25
24 Tracker.OnMouseUp = function(self, button) 26 Tracker.OnMouseUp = function(self, button)
25 if button == 'LeftButton' then 27 if button == 'LeftButton' then
26 if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then 28 if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then
27 self:Link() 29 self:Link()
30 self:SetStyle('TrackerBlock', self.info.type, 'Normal')
28 elseif IsModifiedClick("QUESTWATCHTOGGLE") then 31 elseif IsModifiedClick("QUESTWATCHTOGGLE") then
29 self:Remove() 32 self:Remove()
30 else 33 else
31 self:Select() 34 self:Select()
32 end 35 end
33 elseif button == 'RightButton' then 36 elseif button == 'RightButton' then
34 self:Open() 37 self:Open()
38 self:SetStyle('TrackerBlock', self.info.type, 'Normal')
35 end 39 end
36 self.initialButton = nil 40 self.initialButton = nil
37 self.modChatLink = nil 41 self.modChatLink = nil
38 self.modQuestWatch = nil 42 self.modQuestWatch = nil
39 print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r') 43 print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r')
40 end 44 end
41 45
42 Tracker.OnMouseDown = function(self, button) 46 Tracker.OnMouseDown = function(self, button)
43 self:SetStyle('TrackeBlock','MouseDown') 47 self:SetStyle('TrackerBlock', 'MouseDown')
44 print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE")) 48 print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE"))
45 print(self.info.title) 49 print(self.info.title)
46 end 50 end
47 51
48 -----------------------------
49 --- AUTO_QUEST
50 AutoQuest.name = "Remote Quests"
51 AutoQuest.GetNumWatched = GetNumAutoQuestPopUps
52
53 -----------------------------
54 --- QUEST
55 Quest.name = "Quests"
56 Quest.Select = function(self) 52 Quest.Select = function(self)
57 SetSuperTrackedQuestID(self.info.questID) 53 SetSuperTrackedQuestID(self.info.questID)
58 mod.UpdateWrapper() 54 mod.UpdateWrapper()
59 end 55 end
60 Quest.Link = function(self) 56 Quest.Link = function(self)
74 70
75 71
76 ----------------------------- 72 -----------------------------
77 --- CHEEVS 73 --- CHEEVS
78 Cheevs.Select = function(self) 74 Cheevs.Select = function(self)
75 self:SetStyle('TrackerBlock', self.info.type, 'Normal')
79 end 76 end
80 Cheevs.Remove = function(self) 77 Cheevs.Remove = function(self)
81 RemoveTrackedAchievement(self.info.cheevID) 78 RemoveTrackedAchievement(self.info.cheevID)
82 end 79 end
83 Cheevs.OnMouseUp = function(self, button) 80 Cheevs.OnMouseUp = function(self, button)
84 Tracker.OnMouseUp(self, button) 81 Tracker.OnMouseUp(self, button)
85 self:SetStyle('TrackerBlock', 'Cheev', 'CheevNormal')
86 end 82 end
87 Cheevs.Link = function(self) 83 Cheevs.Link = function(self)
88 local achievementLink = GetAchievementLink(self.info.cheevID); 84 local achievementLink = GetAchievementLink(self.info.cheevID);
89 if ( achievementLink ) then 85 if ( achievementLink ) then
90 ChatEdit_InsertLink(achievementLink); 86 ChatEdit_InsertLink(achievementLink);
99 AchievementFrame_ToggleAchievementFrame(); 95 AchievementFrame_ToggleAchievementFrame();
100 end 96 end
101 AchievementFrame_SelectAchievement(self.info.cheevID); 97 AchievementFrame_SelectAchievement(self.info.cheevID);
102 end 98 end
103 99
104 ----------------------------------------------------------------------------------------
105 --- frame template and scripts lifted from "QuestKing 2" by Barjack
106 --- url: http://mods.curse.com/addons/wow/questking
107 ----------------------------------------------------------------------------------------
108 local usedButtons = mod.Quest.itemButtons
109 local freeButtons = mod.Quest.freeButtons
110 mod.SetItemButton = function(block, info)
111 local itemInfo = info.specialItem
112 if not itemInfo then
113 return
114 end
115 --- .specialItem :: {link = link, charges = charges, icon = icon, start = start, duration = duration, enable = enable}
116
117
118 local itemButton
119 if not info.itemButton then
120 if #freeButtons >= 1 then
121 print(' |cFF00FFFFfound a free button')
122 itemButton = freeButtons[#freeButtons]
123 freeButtons[#freeButtons] = nil
124 if itemButton.block then
125 itemButton.block.itemButton = nil
126 itemButton.block = nil
127 end
128 else
129 local buttonIndex = mod.Quest.numButtons + #freeButtons + 1
130 itemButton = CreateFrame('Button', 'VeneerQuestItemButton' .. buttonIndex, UIParent, 'VeneerItemButtonTemplate')
131 itemButton.buttonIndex = buttonIndex
132 itemButton:SetSize(itemButtonSize, itemButtonSize)
133 itemButton:GetNormalTexture():SetSize(itemButtonSize * (5/3), itemButtonSize * (5/3))
134 print(' |cFFFF4400starting new button', itemButton:GetName())
135 end
136 mod.Quest.numButtons = mod.Quest.numButtons + 1
137 else
138 itemButton = info.itemButton
139 print(' |cFF00FF00found assigned button', itemButton:GetName())
140
141 end
142 -- set values
143
144 info.itemButton = itemButton
145 usedButtons[info.questID] = itemButton
146 print(' |cFF8800FFassigning|r', itemButton:GetName(), 'to quest|cFF00FF00', info.questID, '|rat|cFFFFFF00', block:GetName(),'|r')
147
148 for k,v in pairs(usedButtons) do
149 print('|cFFFF44DD'..k..'|r', v:GetName())
150 end
151
152 itemButton:SetAttribute("type", "item")
153 itemButton:SetAttribute("item", itemInfo.link)
154
155 itemButton.questID = info.questID
156 itemButton.questLogIndex = info.questLogIndex
157 itemButton.charges = itemInfo.charges
158 itemButton.rangeTimer = -1
159 itemButton.block = block
160
161 SetItemButtonTexture(itemButton, itemInfo.icon)
162 SetItemButtonCount(itemButton, itemInfo.charges)
163 Veneer_QuestObjectiveItem_UpdateCooldown(itemButton);
164
165 return itemButton
166 end
167 --- Clear an itemButton from the given block
168 mod.FreeItemButtons = function(block)
169
170 if block.itemButton then
171 local itemButton = block.itemButton
172 if itemButton.questID ~= block.info.questID then
173 block.itemButton = nil
174 itemButton.block = mod.Quest.InfoBlock[itemButton.questID]
175 else
176 itemButton.block = nil
177 itemButton:Hide()
178
179 usedButtons[itemButton.questID] = nil
180 freeButtons[#freeButtons + 1] = itemButton
181 mod.Quest.numButtons = mod.Quest.numButtons - 1
182 print('|cFFFF0088released', itemButton:GetName(),'and', block:GetName())
183 end
184 end
185 end
186
187 function Veneer_QuestObjectiveItem_OnUpdate (self, elapsed)
188 -- Handle range indicator
189 local rangeTimer = self.rangeTimer
190 if (rangeTimer) then
191 rangeTimer = rangeTimer - elapsed
192 if (rangeTimer <= 0) then
193 local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(self.questLogIndex)
194 if ((not charges) or (charges ~= self.charges)) then
195 mod.UpdateWrapper()
196 return
197 end
198
199 local count = self.HotKey
200 local valid = IsQuestLogSpecialItemInRange(self.questLogIndex)
201 if (valid == 0) then
202 count:Show()
203 count:SetVertexColor(1.0, 0.1, 0.1)
204 elseif (valid == 1) then
205 count:Show()
206 count:SetVertexColor(0.6, 0.6, 0.6)
207 else
208 count:Hide()
209 end
210 rangeTimer = TOOLTIP_UPDATE_TIME
211 end
212
213 self.rangeTimer = rangeTimer
214 end
215 end
216
217 function Veneer_QuestObjectiveItem_UpdateCooldown (itemButton)
218 local start, duration, enable = GetQuestLogSpecialItemCooldown(itemButton.questLogIndex)
219 if (start) then
220 CooldownFrame_SetTimer(itemButton.Cooldown, start, duration, enable)
221 if (duration > 0 and enable == 0) then
222 SetItemButtonTextureVertexColor(itemButton, 0.4, 0.4, 0.4)
223 else
224 SetItemButtonTextureVertexColor(itemButton, 1, 1, 1)
225 end
226 end
227 end
228
229 -----------------------------------------
230 -- Criteria frames
231
232 --[[
233 text = description,
234 type = type,
235 finished = completed,
236 quantity = quantity,
237 requiredQuantity = requiredQuantity,
238 characterName = characterName,
239 flags = flags,
240 assetID = assetID,
241 quantityString = quantityString,
242 criteriaID = criteriaID,
243 ]]
244 local newWidgetID = 0
245 mod.WidgetRegistry = {}
246 local wr = mod.WidgetRegistry
247
248 --- Get a usable widget for the given achievement criteria set.
249 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block
250 mod.SetWidget = function(obj, info)
251 local print = B.print('ObjectiveWidgets')
252 local widgetType = obj.type
253 local widget
254 if wr[widgetType] and wr[widgetType].used[obj.criteriaID] then
255 widget = wr[widgetType].used[obj.criteriaID]
256 print('|cFF00FF00Updating ('..obj.criteriaID..')', widget)
257 elseif not wr[widgetType] or #wr[widgetType].free == 0 then
258 widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType)
259
260 print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn)
261 else
262 widget = tremove(wr[widgetType].free)
263 print('|cFFFFFF00Acquiring released widget', widget:GetName())
264 end
265
266 wr[widgetType].used[obj.criteriaID] = widget
267 widget.info = obj
268 widget.parentInfo = info
269 mod.InitializeWidget(widget)
270 return widget
271 end
272
273 --- WidgetTemplate 'OnLoad'
274 mod.RegisterWidget = function(frame)
275 local print = B.print('ObjectiveWidgets')
276 local widgetType = frame.widgetType
277 if not wr[frame.widgetType] then
278 print('|cFFFF4400[[WidgetTemplate]]|r', widgetType)
279 wr[widgetType] = { lastn = 1, free = {}, used = {}, usedIndex = {}, freeIndex = {} }
280 else
281 print('|cFF0088FF+ [[WidgetTemplate]]r', widgetType, wr[widgetType].lastn)
282 wr[widgetType].lastn = wr[widgetType].lastn + 1
283 end
284 end
285
286 --- WidgetTemplate 'OnShow'
287 mod.InitializeWidget = setmetatable({}, {
288 __call = function(t, frame)
289 -- todo: config pull
290 local maxWidth = 250
291
292 frame:SetWidth(maxWidth)
293 mod.UpdateWidget[frame.widgetType](frame)
294 frame:SetScript('OnEvent', mod.UpdateWidget[frame.widgetType])
295 if frame.info.isCurrency then
296 frame:RegisterEvent('CHAT_MSG_CURRENCY')
297 frame:RegisterEvent('CURRENCY_LIST_UPDATE')
298 end
299 frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE')
300 frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED')
301 frame:RegisterEvent('CRITERIA_UPDATE')
302 frame:RegisterEvent('CRITERIA_COMPLETE')
303 frame:RegisterEvent('CRITERIA_EARNED')
304
305 return t[frame.widgetType](frame)
306 end,
307 })
308
309 --- WidgetTemplate 'OnEvent'
310 mod.UpdateWidget = setmetatable({}, {
311 __call = function(t, frame)
312 if not frame.widgetType then
313 error('Invalid widget template, needs .widgetType')
314 return
315 end
316
317 return t[frame.widgetType](frame)
318 end
319 })
320
321 --- WidgetTemplate 'OnHide'
322 mod.ReleaseWidget = function(frame)
323 local print = B.print('ObjectiveWidgets')
324 local reg = wr[frame.widgetType]
325 if reg and reg.used[frame.info.criteriaID] then
326 reg.used[frame.info.criteriaID] = nil
327 frame.info = nil
328 frame.parentInfo = nil
329 frame:UnregisterAllEvents()
330 tinsert(reg.free, frame)
331 print('|cFFBBBBBBreleased from service', frame:GetName())
332 end
333 end
334
335 --- RemoveTrackedAchievement post-hook
336 mod.CleanWidgets = function()
337 local print = B.print('ObjectiveWidgets')
338 local tracked = {GetTrackedAchievements() }
339 for type, reg in pairs(mod.WidgetRegistry) do
340 print('collecting', type)
341 for criteriaID, frame in pairs(reg.used) do
342 local id = frame.info.cheevID
343
344 if id and not tContains(tracked, id) then
345
346 print(' untracked achievement', id, 'associated with', criteriaID, frame:GetName())
347 frame:Hide()
348 end
349 end
350 end
351 end
352
353 mod.WidgetParams = {
354 ['ProgressBar'] = {
355 height = 20,
356 caption = {},
357 quantityString = {SetFontObject = _G.VeneerFontNormal}
358 }
359 }
360
361 mod.InitializeWidget.ProgressBar = function(self)
362 local print = B.print('ObjectiveWidgets')
363 local params = mod.WidgetParams[self.widgetType]
364 self.height = params.height
365 self:SetHeight(20)
366 self.bg:SetHeight(20)
367 self.fg:ClearAllPoints()
368 self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', 2, 2)
369 self.fg:SetHeight(16)
370 self.quantityString:SetFontObject(params.quantityString.SetFontObject)
371 self.quantityString:SetText(self.info.quantityString)
372 end
373
374 mod.UpdateWidget.ProgressBar = function (self)
375 local print = B.print('ObjectiveWidgets')
376 local quantity, requiredQuantity = self.info.quantity, self.info.requiredQuantity
377
378 if self.info.finished then
379 self.fg:SetWidth(self.bg:GetWidth() - 4)
380 elseif quantity == 0 then
381 self.fg:Hide()
382 else
383 self.fg:Show()
384 self.fg:SetWidth((self.bg:GetWidth()-4) * (quantity / requiredQuantity))
385 end
386 end
387
388
389 mod.InitializeWidget.Hidden = function (self)
390 self.height = 0
391 end
392 mod.UpdateWidget.Hidden = function (self)
393 self.height= 0
394 end