Mercurial > wow > buffalo2
diff 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 |
line wrap: on
line diff
--- a/ObjectiveUI.lua Sat Apr 02 05:01:54 2016 -0400 +++ b/ObjectiveUI.lua Sat Apr 02 17:46:52 2016 -0400 @@ -11,7 +11,9 @@ local tremove, tremovebyval = table.remove, table.removebyval -------------------------------------------------------------------- ---- Tracker-specific widgets and their handlers +--- Functions responsible for: +--- - UI interactions that propagate to the BlizzardUI (sending RemoveQuestWatch() on remove quest action) +--- - -------------------------------------------------------------------- Tracker.Select = function(self) end @@ -25,6 +27,7 @@ if button == 'LeftButton' then if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then self:Link() + self:SetStyle('TrackerBlock', self.info.type, 'Normal') elseif IsModifiedClick("QUESTWATCHTOGGLE") then self:Remove() else @@ -32,6 +35,7 @@ end elseif button == 'RightButton' then self:Open() + self:SetStyle('TrackerBlock', self.info.type, 'Normal') end self.initialButton = nil self.modChatLink = nil @@ -40,19 +44,11 @@ end Tracker.OnMouseDown = function(self, button) - self:SetStyle('TrackeBlock','MouseDown') + self:SetStyle('TrackerBlock', 'MouseDown') print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE")) print(self.info.title) end ------------------------------ ---- AUTO_QUEST -AutoQuest.name = "Remote Quests" -AutoQuest.GetNumWatched = GetNumAutoQuestPopUps - ------------------------------ ---- QUEST -Quest.name = "Quests" Quest.Select = function(self) SetSuperTrackedQuestID(self.info.questID) mod.UpdateWrapper() @@ -76,13 +72,13 @@ ----------------------------- --- CHEEVS Cheevs.Select = function(self) + self:SetStyle('TrackerBlock', self.info.type, 'Normal') end Cheevs.Remove = function(self) RemoveTrackedAchievement(self.info.cheevID) end Cheevs.OnMouseUp = function(self, button) Tracker.OnMouseUp(self, button) - self:SetStyle('TrackerBlock', 'Cheev', 'CheevNormal') end Cheevs.Link = function(self) local achievementLink = GetAchievementLink(self.info.cheevID); @@ -101,294 +97,3 @@ AchievementFrame_SelectAchievement(self.info.cheevID); end ----------------------------------------------------------------------------------------- ---- frame template and scripts lifted from "QuestKing 2" by Barjack ---- url: http://mods.curse.com/addons/wow/questking ----------------------------------------------------------------------------------------- -local usedButtons = mod.Quest.itemButtons -local freeButtons = mod.Quest.freeButtons -mod.SetItemButton = function(block, info) - local itemInfo = info.specialItem - if not itemInfo then - return - end - --- .specialItem :: {link = link, charges = charges, icon = icon, start = start, duration = duration, enable = enable} - - - local itemButton - if not info.itemButton then - if #freeButtons >= 1 then - print(' |cFF00FFFFfound a free button') - itemButton = freeButtons[#freeButtons] - freeButtons[#freeButtons] = nil - if itemButton.block then - itemButton.block.itemButton = nil - itemButton.block = nil - end - else - local buttonIndex = mod.Quest.numButtons + #freeButtons + 1 - itemButton = CreateFrame('Button', 'VeneerQuestItemButton' .. buttonIndex, UIParent, 'VeneerItemButtonTemplate') - itemButton.buttonIndex = buttonIndex - itemButton:SetSize(itemButtonSize, itemButtonSize) - itemButton:GetNormalTexture():SetSize(itemButtonSize * (5/3), itemButtonSize * (5/3)) - print(' |cFFFF4400starting new button', itemButton:GetName()) - end - mod.Quest.numButtons = mod.Quest.numButtons + 1 - else - itemButton = info.itemButton - print(' |cFF00FF00found assigned button', itemButton:GetName()) - - end - -- set values - - info.itemButton = itemButton - usedButtons[info.questID] = itemButton - print(' |cFF8800FFassigning|r', itemButton:GetName(), 'to quest|cFF00FF00', info.questID, '|rat|cFFFFFF00', block:GetName(),'|r') - - for k,v in pairs(usedButtons) do - print('|cFFFF44DD'..k..'|r', v:GetName()) - end - - itemButton:SetAttribute("type", "item") - itemButton:SetAttribute("item", itemInfo.link) - - itemButton.questID = info.questID - itemButton.questLogIndex = info.questLogIndex - itemButton.charges = itemInfo.charges - itemButton.rangeTimer = -1 - itemButton.block = block - - SetItemButtonTexture(itemButton, itemInfo.icon) - SetItemButtonCount(itemButton, itemInfo.charges) - Veneer_QuestObjectiveItem_UpdateCooldown(itemButton); - - return itemButton -end ---- Clear an itemButton from the given block -mod.FreeItemButtons = function(block) - - if block.itemButton then - local itemButton = block.itemButton - if itemButton.questID ~= block.info.questID then - block.itemButton = nil - itemButton.block = mod.Quest.InfoBlock[itemButton.questID] - else - itemButton.block = nil - itemButton:Hide() - - usedButtons[itemButton.questID] = nil - freeButtons[#freeButtons + 1] = itemButton - mod.Quest.numButtons = mod.Quest.numButtons - 1 - print('|cFFFF0088released', itemButton:GetName(),'and', block:GetName()) - end - end -end - -function Veneer_QuestObjectiveItem_OnUpdate (self, elapsed) - -- Handle range indicator - local rangeTimer = self.rangeTimer - if (rangeTimer) then - rangeTimer = rangeTimer - elapsed - if (rangeTimer <= 0) then - local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(self.questLogIndex) - if ((not charges) or (charges ~= self.charges)) then - mod.UpdateWrapper() - return - end - - local count = self.HotKey - local valid = IsQuestLogSpecialItemInRange(self.questLogIndex) - if (valid == 0) then - count:Show() - count:SetVertexColor(1.0, 0.1, 0.1) - elseif (valid == 1) then - count:Show() - count:SetVertexColor(0.6, 0.6, 0.6) - else - count:Hide() - end - rangeTimer = TOOLTIP_UPDATE_TIME - end - - self.rangeTimer = rangeTimer - end -end - -function Veneer_QuestObjectiveItem_UpdateCooldown (itemButton) - local start, duration, enable = GetQuestLogSpecialItemCooldown(itemButton.questLogIndex) - if (start) then - CooldownFrame_SetTimer(itemButton.Cooldown, start, duration, enable) - if (duration > 0 and enable == 0) then - SetItemButtonTextureVertexColor(itemButton, 0.4, 0.4, 0.4) - else - SetItemButtonTextureVertexColor(itemButton, 1, 1, 1) - end - end -end - ------------------------------------------ --- Criteria frames - ---[[ - text = description, - type = type, - finished = completed, - quantity = quantity, - requiredQuantity = requiredQuantity, - characterName = characterName, - flags = flags, - assetID = assetID, - quantityString = quantityString, - criteriaID = criteriaID, -]] -local newWidgetID = 0 -mod.WidgetRegistry = {} -local wr = mod.WidgetRegistry - ---- Get a usable widget for the given achievement criteria set. - -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block -mod.SetWidget = function(obj, info) - local print = B.print('ObjectiveWidgets') - local widgetType = obj.type - local widget - if wr[widgetType] and wr[widgetType].used[obj.criteriaID] then - widget = wr[widgetType].used[obj.criteriaID] - print('|cFF00FF00Updating ('..obj.criteriaID..')', widget) - elseif not wr[widgetType] or #wr[widgetType].free == 0 then - widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType) - - print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn) - else - widget = tremove(wr[widgetType].free) - print('|cFFFFFF00Acquiring released widget', widget:GetName()) - end - - wr[widgetType].used[obj.criteriaID] = widget - widget.info = obj - widget.parentInfo = info - mod.InitializeWidget(widget) - return widget -end - ---- WidgetTemplate 'OnLoad' -mod.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 - ---- WidgetTemplate 'OnShow' -mod.InitializeWidget = setmetatable({}, { - __call = function(t, frame) - -- todo: config pull - local maxWidth = 250 - - frame:SetWidth(maxWidth) - mod.UpdateWidget[frame.widgetType](frame) - frame:SetScript('OnEvent', mod.UpdateWidget[frame.widgetType]) - if frame.info.isCurrency then - frame:RegisterEvent('CHAT_MSG_CURRENCY') - frame:RegisterEvent('CURRENCY_LIST_UPDATE') - end - frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE') - frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED') - frame:RegisterEvent('CRITERIA_UPDATE') - frame:RegisterEvent('CRITERIA_COMPLETE') - frame:RegisterEvent('CRITERIA_EARNED') - - return t[frame.widgetType](frame) - end, -}) - ---- WidgetTemplate 'OnEvent' -mod.UpdateWidget = setmetatable({}, { - __call = function(t, frame) - if not frame.widgetType then - error('Invalid widget template, needs .widgetType') - return - end - - return t[frame.widgetType](frame) - end -}) - ---- WidgetTemplate 'OnHide' -mod.ReleaseWidget = function(frame) - local print = B.print('ObjectiveWidgets') - local reg = wr[frame.widgetType] - if reg and reg.used[frame.info.criteriaID] then - reg.used[frame.info.criteriaID] = nil - frame.info = nil - frame.parentInfo = nil - frame:UnregisterAllEvents() - tinsert(reg.free, frame) - print('|cFFBBBBBBreleased from service', frame:GetName()) - end -end - ---- RemoveTrackedAchievement post-hook -mod.CleanWidgets = function() - local print = B.print('ObjectiveWidgets') - local tracked = {GetTrackedAchievements() } - for type, reg in pairs(mod.WidgetRegistry) do - print('collecting', type) - for criteriaID, frame in pairs(reg.used) do - local id = frame.info.cheevID - - if id and not tContains(tracked, id) then - - print(' untracked achievement', id, 'associated with', criteriaID, frame:GetName()) - frame:Hide() - end - end - end -end - -mod.WidgetParams = { - ['ProgressBar'] = { - height = 20, - caption = {}, - quantityString = {SetFontObject = _G.VeneerFontNormal} - } -} - -mod.InitializeWidget.ProgressBar = function(self) - local print = B.print('ObjectiveWidgets') - local params = mod.WidgetParams[self.widgetType] - self.height = params.height - self:SetHeight(20) - self.bg:SetHeight(20) - self.fg:ClearAllPoints() - self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', 2, 2) - self.fg:SetHeight(16) - self.quantityString:SetFontObject(params.quantityString.SetFontObject) - self.quantityString:SetText(self.info.quantityString) -end - -mod.UpdateWidget.ProgressBar = function (self) - local print = B.print('ObjectiveWidgets') - local quantity, requiredQuantity = self.info.quantity, self.info.requiredQuantity - - if self.info.finished then - self.fg:SetWidth(self.bg:GetWidth() - 4) - elseif quantity == 0 then - self.fg:Hide() - else - self.fg:Show() - self.fg:SetWidth((self.bg:GetWidth()-4) * (quantity / requiredQuantity)) - end -end - - -mod.InitializeWidget.Hidden = function (self) - self.height = 0 -end -mod.UpdateWidget.Hidden = function (self) - self.height= 0 -end \ No newline at end of file