annotate ObjectiveUI.lua @ 12:8238cddaddb1

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