Mercurial > wow > buffalo2
comparison ObjectiveWidgets.lua @ 14:ed642234f017
ObjectiveFrame
- implement proper tracker name text
- expanded tracker prototypes to cover "objective lines" formatting and accommodation of widget variables
- implement the progress bars for bonus objectives
ObjectiveStyle
- moved `UpdateWrapperStyle` over and renamed it to fit semantics
- change the formula for block.`height` to measure non-widget content only
- allows widgets to position relative to text
- size FontString `status` to match block.`height`
- full block height is acquired by adding block.`height` and block.`attachmentHeight` which is calculated during objective parsing
ObjectiveWidgets
- use string keys for generated widgets to deal with multiple objectives under the same questID, and maybe dungeon objectives
- wrapper buttons use a common code path
- specialized handlers for wheel scrolling moved over to fit semantics
| author | Nenue |
|---|---|
| date | Mon, 04 Apr 2016 03:16:22 -0400 |
| parents | 9455693fc290 |
| children | f660f1c1e0aa |
comparison
equal
deleted
inserted
replaced
| 13:9455693fc290 | 14:ed642234f017 |
|---|---|
| 3 local print = B.print('WidgetFactory') | 3 local print = B.print('WidgetFactory') |
| 4 local UIParent = UIParent | 4 local UIParent = UIParent |
| 5 local GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown = GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown | 5 local GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown = GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown |
| 6 local CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll = CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll | 6 local CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll = CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll |
| 7 local tremove, tinsert, tContains, pairs, setmetatable = tremove, tinsert, tContains, pairs, setmetatable | 7 local tremove, tinsert, tContains, pairs, setmetatable = tremove, tinsert, tContains, pairs, setmetatable |
| 8 | |
| 9 --- frame refs | |
| 10 local Wrapper = _G.VeneerObjectiveWrapper | |
| 11 local Scroller = Wrapper.scrollArea | |
| 12 local CloseButton = Wrapper.CloseButton | |
| 13 local QuestMapButton = Wrapper.QuestMapButton | |
| 14 local Scroll = _G.VeneerObjectiveScroll | |
| 15 | |
| 16 local panelButtons = { | |
| 17 CloseButton = { | |
| 18 closedSwatch = { | |
| 19 [[Interface\Buttons\UI-Panel-QuestHideButton]], | |
| 20 [[Interface\Buttons\UI-Panel-QuestHideButton]], | |
| 21 0, 0.5, 0.5, 1, | |
| 22 0.5, 1, 0.5, 1, | |
| 23 }, | |
| 24 openSwatch = { | |
| 25 [[Interface\Buttons\UI-Panel-QuestHideButton]], | |
| 26 [[Interface\Buttons\UI-Panel-QuestHideButton]], | |
| 27 0.5, 1, 0.5, 1, | |
| 28 0, 0.5, 0.5, 1, | |
| 29 }, | |
| 30 parent = 'VeneerObjectiveWrapper' | |
| 31 }, | |
| 32 QuestMapButton = { | |
| 33 closedSwatch = { | |
| 34 [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]], | |
| 35 [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]], | |
| 36 0, 1, 0.5, 1, | |
| 37 0, 1, 0, 0.5, | |
| 38 }, | |
| 39 openSwatch = { | |
| 40 [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]], | |
| 41 [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]], | |
| 42 0, 1, 0, 0.5, | |
| 43 0, 1, 0.5, 1, | |
| 44 } | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 local Scroller_OnShow = function() | |
| 49 Wrapper.watchMoneyReasons = 0; | |
| 50 mod.UpdateWrapper() | |
| 51 mod.SetEvents() | |
| 52 for i, region in ipairs(Wrapper.headerComplex) do | |
| 53 region:Show() | |
| 54 end | |
| 55 end | |
| 56 | |
| 57 local Scroller_OnHide = function() | |
| 58 local self = Wrapper | |
| 59 Wrapper:UnregisterAllEvents() | |
| 60 Wrapper:SetScript('OnEvent', nil) | |
| 61 for i, region in ipairs(Wrapper.headerComplex) do | |
| 62 region:Hide() | |
| 63 end | |
| 64 end | |
| 65 | |
| 66 local Scroller_OnMouseWheel = function(self, delta) | |
| 67 local r = Scroll:GetHeight() - Scroller:GetHeight() | |
| 68 local s = B.Conf.ObjectiveScroll - delta * floor(r/5+.5) | |
| 69 local from = self:GetVerticalScroll() | |
| 70 if s >= r then | |
| 71 s = r | |
| 72 elseif s < 1 then | |
| 73 s = 0 | |
| 74 end | |
| 75 self:SetVerticalScroll(s) | |
| 76 B.Conf.ObjectiveScroll = s | |
| 77 print('|cFF00FF00OnMouseWheel', 'from = ', from, 'scroll =', s, ' range =', r, 'current =', self:GetVerticalScroll()) | |
| 78 | |
| 79 mod.UpdateActionButtons('SCROLLING') | |
| 80 end | |
| 81 | |
| 82 local UpdatePanelButton = function (self, state) | |
| 83 state = state and B.Conf.FrameState[state] or 1 | |
| 84 local swatch = (state == 1) and self.openSwatch or self.closedSwatch | |
| 85 self:SetNormalTexture(swatch[1]) | |
| 86 self:SetPushedTexture(swatch[2]) | |
| 87 if #swatch >= 6 then | |
| 88 self:GetNormalTexture():SetTexCoord(swatch[3], swatch[4], swatch[5], swatch[6]) | |
| 89 end | |
| 90 if #swatch == 10 then | |
| 91 self:GetPushedTexture():SetTexCoord(swatch[7], swatch[8], swatch[9], swatch[10]) | |
| 92 end | |
| 93 | |
| 94 end | |
| 95 | |
| 96 local OnClick = {} | |
| 97 OnClick.CloseButton = function(self) | |
| 98 Wrapper:Minimize() | |
| 99 UpdatePanelButton(self, self.parent) | |
| 100 end | |
| 101 | |
| 102 OnClick.QuestMapButton = function() | |
| 103 ToggleWorldMap() | |
| 104 end | |
| 105 | |
| 106 mod.InitializeWrapperWidgets = function() | |
| 107 --- tracker scroll | |
| 108 Scroller:SetScript('OnMouseWheel', Scroller_OnMouseWheel) | |
| 109 Scroller:SetScript('OnShow', Scroller_OnShow) | |
| 110 Scroller:SetScript('OnHide', Scroller_OnHide) | |
| 111 for name, swatch in pairs(panelButtons) do | |
| 112 local source = swatch and swatch or panelButtons.CloseButton | |
| 113 local button = Wrapper[name] | |
| 114 button.parent = swatch.parent | |
| 115 button.openSwatch = source.openSwatch | |
| 116 button.closedSwatch = source.closedSwatch | |
| 117 if OnClick[name] then | |
| 118 button:SetScript('OnClick', OnClick[name]) | |
| 119 end | |
| 120 UpdatePanelButton(button, button.parent) | |
| 121 end | |
| 122 end | |
| 123 | |
| 8 ---------------------------------------------------------------------------------------- | 124 ---------------------------------------------------------------------------------------- |
| 9 --- XML and script code lifted from "QuestKing 2" by Barjack, | 125 --- XML and script code lifted from "QuestKing 2" by Barjack, |
| 10 --- found at http://mods.curse.com/addons/wow/questking | 126 --- found at http://mods.curse.com/addons/wow/questking |
| 11 ---------------------------------------------------------------------------------------- | 127 ---------------------------------------------------------------------------------------- |
| 12 local usedButtons = mod.Quest.itemButtons | 128 local usedButtons = mod.Quest.itemButtons |
| 150 mod.WidgetRegistry = {} | 266 mod.WidgetRegistry = {} |
| 151 local wr = mod.WidgetRegistry | 267 local wr = mod.WidgetRegistry |
| 152 | 268 |
| 153 --- Get a usable widget for the given achievement criteria set. | 269 --- Get a usable widget for the given achievement criteria set. |
| 154 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block | 270 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block |
| 155 mod.SetWidget = function(obj, info) | 271 mod.SetWidget = function(line, info, objectiveType, objectiveKey) |
| 156 local print = B.print('ObjectiveWidgets') | 272 local print = B.print('ObjectiveWidgets') |
| 157 local widgetType = obj.type | 273 local widgetType = objectiveType |
| 158 local widget | 274 local widget |
| 159 if wr[widgetType] and wr[widgetType].used[obj.criteriaID] then | 275 if wr[widgetType] and wr[widgetType].used[objectiveKey] then |
| 160 widget = wr[widgetType].used[obj.criteriaID] | 276 widget = wr[widgetType].used[objectiveKey] |
| 161 print('|cFF00FF00Updating ('..obj.criteriaID..')', widget) | 277 print('|cFF00FF00Updating ('..objectiveKey..')', widget) |
| 162 elseif not wr[widgetType] or #wr[widgetType].free == 0 then | 278 elseif not wr[widgetType] or #wr[widgetType].free == 0 then |
| 163 widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType) | 279 widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType) |
| 164 | 280 |
| 165 print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn) | 281 print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn) |
| 166 else | 282 else |
| 167 widget = tremove(wr[widgetType].free) | 283 widget = tremove(wr[widgetType].free) |
| 168 print('|cFFFFFF00Acquiring released widget', widget:GetName()) | 284 print('|cFFFFFF00Acquiring released widget', widget:GetName()) |
| 169 end | 285 end |
| 170 | 286 |
| 171 wr[widgetType].used[obj.criteriaID] = widget | 287 |
| 172 widget.info = obj | 288 wr[widgetType].used[objectiveKey] = widget |
| 173 widget.parentInfo = info | 289 widget.line = line |
| 290 widget.info = info | |
| 291 widget.key = objectiveKey | |
| 174 mod.InitializeWidget(widget) | 292 mod.InitializeWidget(widget) |
| 175 return widget | 293 return widget |
| 176 end | 294 end |
| 177 | 295 |
| 178 --- WidgetTemplate 'OnLoad' | 296 --- WidgetTemplate 'OnLoad' |
| 193 __call = function(t, frame) | 311 __call = function(t, frame) |
| 194 -- todo: config pull | 312 -- todo: config pull |
| 195 local maxWidth = 250 | 313 local maxWidth = 250 |
| 196 | 314 |
| 197 frame:SetWidth(maxWidth) | 315 frame:SetWidth(maxWidth) |
| 198 mod.UpdateWidget[frame.widgetType](frame) | |
| 199 frame:SetScript('OnEvent', mod.UpdateWidget[frame.widgetType]) | 316 frame:SetScript('OnEvent', mod.UpdateWidget[frame.widgetType]) |
| 200 if frame.info.isCurrency then | 317 if frame.info.isCurrency then |
| 201 frame:RegisterEvent('CHAT_MSG_CURRENCY') | 318 frame:RegisterEvent('CHAT_MSG_CURRENCY') |
| 202 frame:RegisterEvent('CURRENCY_LIST_UPDATE') | 319 frame:RegisterEvent('CURRENCY_LIST_UPDATE') |
| 203 end | 320 end |
| 204 frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE') | 321 frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE') |
| 205 frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED') | 322 frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED') |
| 206 frame:RegisterEvent('CRITERIA_UPDATE') | 323 frame:RegisterEvent('CRITERIA_UPDATE') |
| 207 frame:RegisterEvent('CRITERIA_COMPLETE') | 324 frame:RegisterEvent('CRITERIA_COMPLETE') |
| 208 frame:RegisterEvent('CRITERIA_EARNED') | 325 frame:RegisterEvent('CRITERIA_EARNED') |
| 209 | 326 t[frame.widgetType](frame) |
| 210 return t[frame.widgetType](frame) | 327 mod.UpdateWidget[frame.widgetType](frame) |
| 211 end, | 328 end, |
| 212 }) | 329 }) |
| 213 | 330 |
| 214 --- WidgetTemplate 'OnEvent' | 331 --- WidgetTemplate 'OnEvent' |
| 215 mod.UpdateWidget = setmetatable({}, { | 332 mod.UpdateWidget = setmetatable({}, { |
| 225 | 342 |
| 226 --- WidgetTemplate 'OnHide' | 343 --- WidgetTemplate 'OnHide' |
| 227 mod.ReleaseWidget = function(frame) | 344 mod.ReleaseWidget = function(frame) |
| 228 local print = B.print('ObjectiveWidgets') | 345 local print = B.print('ObjectiveWidgets') |
| 229 local reg = wr[frame.widgetType] | 346 local reg = wr[frame.widgetType] |
| 230 if reg and reg.used[frame.info.criteriaID] then | 347 if reg and reg.used[frame.key] then |
| 231 reg.used[frame.info.criteriaID] = nil | 348 reg.used[frame.key] = nil |
| 349 frame.line = nil | |
| 232 frame.info = nil | 350 frame.info = nil |
| 233 frame.parentInfo = nil | |
| 234 frame:UnregisterAllEvents() | 351 frame:UnregisterAllEvents() |
| 235 tinsert(reg.free, frame) | 352 tinsert(reg.free, frame) |
| 236 print('|cFFBBBBBBreleased from service', frame:GetName()) | 353 print('|cFFBBBBBBreleased from service', frame:GetName()) |
| 237 end | 354 end |
| 238 end | 355 end |
| 239 | 356 |
| 240 --- RemoveTrackedAchievement post-hook | 357 --- RemoveTrackedAchievement post-hook |
| 241 mod.CleanWidgets = function() | 358 mod.CleanWidgets = function() |
| 242 local print = B.print('ObjectiveWidgets') | 359 local print = B.print('ObjectiveWidgets') |
| 243 local tracked = {GetTrackedAchievements() } | 360 local tracked = {GetTrackedAchievements() } |
| 361 local tasks = GetTasksTable() | |
| 244 for type, reg in pairs(mod.WidgetRegistry) do | 362 for type, reg in pairs(mod.WidgetRegistry) do |
| 245 print('collecting', type) | 363 print('collecting', type) |
| 246 for criteriaID, frame in pairs(reg.used) do | 364 for key, frame in pairs(reg.used) do |
| 247 local id = frame.info.cheevID | 365 if frame.info.cheevID then |
| 248 | 366 local id = frame.info.cheevID |
| 249 if id and not tContains(tracked, id) then | 367 |
| 250 | 368 if id and not tContains(tracked, id) then |
| 251 print(' untracked achievement', id, 'associated with', criteriaID, frame:GetName()) | 369 |
| 252 frame:Hide() | 370 print(' untracked achievement', id, 'associated with', key, frame:GetName()) |
| 371 frame:Hide() | |
| 372 end | |
| 373 elseif frame.info.questID then | |
| 374 -- do something for quest task | |
| 253 end | 375 end |
| 254 end | 376 end |
| 255 end | 377 end |
| 256 end | 378 end |
| 257 | 379 |
| 258 | 380 |
| 259 mod.defaults.WidgetVars = { | 381 |
| 382 mod.defaults.WidgetStyle = { | |
| 260 ProgressBar = { | 383 ProgressBar = { |
| 384 Spacing = 4, | |
| 261 bg = { | 385 bg = { |
| 262 Height = 20, | 386 Height = 20, |
| 263 }, | 387 }, |
| 264 fg = { | 388 fg = { |
| 265 Height = 16, | 389 Height = 16, |
| 266 }, | 390 }, |
| 267 status = { | 391 status = { |
| 268 FontObject = _G.VeneerFontNormal | 392 FontObject = _G.VeneerCriteriaFontNormal |
| 269 } | 393 } |
| 270 } | 394 } |
| 271 } | 395 } |
| 272 mod.InitializeWidget.ProgressBar = function(self) | 396 mod.InitializeWidget.ProgressBar = function(self) |
| 273 local c = mod.defaults.WidgetVars.ProgressBar | 397 local c = mod.defaults.WidgetStyle.ProgressBar |
| 274 local params = mod.WidgetParams[self.widgetType] | 398 self.height = c.bg.Height + c.Spacing |
| 275 self.height = params.height | |
| 276 self:SetHeight(c.bg.Height) | 399 self:SetHeight(c.bg.Height) |
| 277 self.bg:SetHeight(c.bg.Height) | 400 self.bg:SetHeight(c.bg.Height) |
| 278 self.fg:ClearAllPoints() | 401 self.fg:ClearAllPoints() |
| 279 self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', 2, 2) | 402 self.indent = (c.bg.Height - c.fg.Height) / 2 |
| 403 self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', self.indent, self.indent) | |
| 280 self.fg:SetHeight(c.fg.Height) | 404 self.fg:SetHeight(c.fg.Height) |
| 281 self.status:SetFontObject(c.status.FontObject) | 405 self.status:SetFontObject(c.status.FontObject) |
| 282 self.status:SetText(self.info.quantityString) | 406 self.status:SetText(self.info.quantityString) |
| 283 end | 407 end |
| 284 | 408 |
| 285 mod.UpdateWidget.ProgressBar = function (self) | 409 mod.UpdateWidget.ProgressBar = function (self) |
| 286 local quantity, requiredQuantity = self.info.quantity, self.info.requiredQuantity | 410 local quantity, requiredQuantity = self.line.value, self.line.maxValue |
| 287 | 411 print('update vals:') |
| 288 if self.info.finished then | 412 for k,v in pairs(self.line) do |
| 289 self.fg:SetWidth(self.bg:GetWidth() - 4) | 413 print(k, v) |
| 414 end | |
| 415 | |
| 416 if self.line.format then | |
| 417 self.status:SetFormattedText(self.line.format, self.line.value, self.line.maxValue) | |
| 418 end | |
| 419 | |
| 420 | |
| 421 if self.line.finished then | |
| 422 self.fg:SetWidth(self.bg:GetWidth() - self.indent) | |
| 290 elseif quantity == 0 then | 423 elseif quantity == 0 then |
| 291 self.fg:Hide() | 424 self.fg:Hide() |
| 292 else | 425 else |
| 293 self.fg:Show() | 426 self.fg:Show() |
| 294 self.fg:SetWidth((self.bg:GetWidth()-4) * (quantity / requiredQuantity)) | 427 self.fg:SetWidth((self.bg:GetWidth() -self.indent) * (quantity / requiredQuantity)) |
| 295 end | 428 end |
| 296 end | 429 end |
| 297 | 430 |
| 298 | 431 |
| 299 mod.InitializeWidget.Hidden = function (self) | 432 mod.InitializeWidget.Hidden = function (self) |
