Mercurial > wow > worldplan
view FilterBar.lua @ 30:8cb750e79952
WorldPlan:
- Reworking filters to utilize newly added CVars
author | Nenue |
---|---|
date | Fri, 28 Oct 2016 14:06:07 -0400 |
parents | |
children | d0114b51cdea |
line wrap: on
line source
-- WorldPlan -- FilterBar.lua -- Created: 10/27/2016 8:55 PM -- %file-revision% -- local print = DEVIAN_WORKSPACE and function(...) _G.print('FilterBar', ...) end or nop local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL local DEFAULT_FILTER_LAYOUT = { PinSize = 22, Border = 3, TrackingBorder = 2, TagSize = 12, TimeleftStage = 3, showNumber = true, numberFontObject = 'WorldPlanNumberFontThin' } local DEFAULT_FILTER_LIST = { { label = 'Filters', texture = "Interface\\WorldMap\\WorldMap-Icon" }, { filterKey= 'rewardType', cVar = 'worldQuestFilterArtifactPower', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" }, { filterKey= 'rewardType', cVar = 'worldQuestFilterOrderResources', filterValue = REWARD_CURRENCY,label = 'Order Resources', texture = "Interface\\ICONS\\inv_misc_elvencoins" }, { filterKey= 'rewardType', cVar = 'worldQuestFilterEquipment', filterValue = REWARD_GEAR, label = 'Equipment', texture = "Interface\\ICONS\\garrison_bluearmorupgrade" }, { filterKey= 'rewardType', cVar = 'worldQuestFilterProfessionMaterials', filterValue = REWARD_REAGENT, label = 'Materials', texture = 1417744 }, { filterKey= 'rewardType', cVar = 'worldQuestFilterGold', filterValue = REWARD_CASH, label = 'Gold', texture = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" }, { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 }, { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", }, { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_DUNGEON, label = 'Dungeon', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", }, { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\ICONS\\70_professions_scroll_02", }, } local defaults = {} WorldPlanSummaryMixin = { selectedBountyIndex = {}, bounties = {}, filterList = {}, buttons = {}, } WorldPlanFilterPinMixin = {} function WorldPlanSummaryMixin:OnLoad() self:RegisterEvent('QUEST_LOG_UPDATE') self:RegisterEvent('WORLD_MAP_UPDATE') WorldPlan:AddHandler(self, defaults) for index, info in ipairs(DEFAULT_FILTER_LIST) do info.zone = DEFAULT_FILTER_LAYOUT info.continent = DEFAULT_FILTER_LAYOUT info.pinMask = "Interface\\Minimap\\UI-Minimap-Background" WorldPlan:AddTypeInfo(self,index, info) end end function WorldPlanSummaryMixin:OnEvent(event) end local bountyIndex local debug_headers = {} function WorldPlanSummaryMixin:Setup() self:GetFilters() end function WorldPlanSummaryMixin:OnEvent(event,...) self.isStale = true end function WorldPlanSummaryMixin:OnShow() self:Refresh() end function WorldPlanSummaryMixin:GetFilters() wipe(self.filterList) for index, info in ipairs(DEFAULT_FILTER_LIST) do tinsert(self.filterList, info) end self.bounties, self.numBounties = GetQuestBountyInfoForMapID(WorldPlan.currentMapID) self.BountyFilters = {} for index, data in ipairs(self.bounties) do local info = self.BountyFilters[index] if not info then info = {} self.BountyFilters[index] = info end local questTitle = GetQuestLogTitle(GetQuestLogIndexByID(data.questID)) info.filterKey = 'factionID' info.filterValue = data.factionID info.label = questTitle info.texture = data.icon print('loading emissary', questTitle) tinsert(self.filterList, info) --{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", }, end end function WorldPlanSummaryMixin:Reset() self.pinLayout = self:GetTypeInfo(255) self:GetFilters() end function WorldPlanSummaryMixin:Refresh(forced) self:Update(forced) end local filterFill = "Interface\\BUTTONS\\YELLOWORANGE64" local filterMask = "Interface\\Minimap\\UI-Minimap-Background" function WorldPlanSummaryMixin:Update(forced) local blocks = self.buttons local relativeFrame = WorldMapFrame.UIElementsFrame.TrackingOptionsButton local numHeaders = 0 print('|cFF00FF88'..tostring(self)..':Refresh()|r', 'currentMap=',self.currentMapID) local quests = WorldPlanQuests.QuestsByZone[self.currentMapID] or WorldPlanQuests.QuestsByID for index, info in ipairs(self.filterList) do local numQuests = 0 for questID, pin in pairs(quests) do if pin.used then if not info.filterKey then numQuests = numQuests + 1 elseif pin[info.filterKey] == info.filterValue then numQuests = numQuests + 1 end end end print(tostring(index).. ' ("'..tostring(info.label)..'" f('.. tostring(info.filterKey).. '='..tostring(info.filterValue) .. '), '..tostring(numQuests)..')') if numQuests >= 1 then numHeaders = numHeaders + 1 local button = blocks[numHeaders] if not blocks[numHeaders] then button = CreateFrame('Button', 'WorldPlanFilterButton'..numHeaders, WorldMapScrollFrame, 'WorldPlanFilterPin') button:SetSize(24,24) button.icon:ClearAllPoints() button.icon:SetAllPoints(button) button.iconBorder:SetPoint('TOPLEFT', button, 'TOPLEFT', -2, 2) button.iconBorder:SetPoint('BOTTOMRIGHT', button, 'BOTTOMRIGHT', 2, -2) button.iconBorder:SetMask(filterMask) button.iconBorder:SetTexture(filterFill) button.iconBorder:SetDesaturated(true) button.supertrackBorder:Hide() blocks[numHeaders] = button end button.info = info button:SetID(index) button.spacing = ((info.filterKey ~= relativeFrame.filterKey) and 10) or 0 button.relativeFrame = relativeFrame button:Refresh((numHeaders == 1), numQuests) button:Show() relativeFrame = button end end self.numHeaders = numHeaders for i = numHeaders + 1, #blocks do if blocks[i] then blocks[i]:Hide() end end end function WorldPlanSummaryMixin:Cleanup() -- hide trailing buttons end function WorldPlanFilterPinMixin:OnEnter() end function WorldPlanFilterPinMixin:OnLeave() end function WorldPlanFilterPinMixin:Refresh(isFirst, numQuests) isFirst = isFirst or self.isFirst numQuests = numQuests or self.numQuests local info = self.info self.isFirst = isFirst self.numQuests = numQuests self.filterKey = info.filterKey self.filterValue = info.filterValue self.tagID = info.tagID self.icon:SetMask(filterMask) self.icon:SetTexture(info.texture) self.count:SetText(numQuests) self.cVar = info.cVar self.itemTexture = self.texture if isFirst then self:SetPoint('TOP', self.relativeFrame, 'BOTTOM', 0, -5) else self:SetPoint('TOPRIGHT', self.relativeFrame, 'BOTTOMRIGHT', 0, -(3 + (self.spacing or 0))) end print('anchor to', self.relativeFrame:GetName(), info.mask) local r, g, b, a = 1,1,1,1 local used = WorldPlan.UsedFilters[self.filterKey] if used and self.filterKey then if used[self.filterValue] == true then r, g, b = 0, 1, 0 elseif used[self.filterValue] == false then r, g, b = 1, 0, 0 end else if self.cVar and GetCVarBool(self.cVar) then r, g, b = 0, 1, 0 end end self.iconBorder:SetVertexColor(r, g, b, a) --self:UpdateSize() end function WorldPlanFilterPinMixin:OnLoad() self:RegisterForClicks('AnyUp') self:SetFrameStrata('HIGH') self:SetFrameLevel(151) self:SetScript('OnUpdate', nil) end function WorldPlanFilterPinMixin:OnUpdate () end function WorldPlanFilterPinMixin:OnLeave () if GameTooltip:IsOwned(self) then GameTooltip:Hide() end end -- shift-click: reset filter -- click: rotate through include(1), exclude(-1), ignore(nil) function WorldPlanFilterPinMixin:OnClick (button) local filterKey = self.filterKey local filterValue = self.filterValue local operation = opPrefix local setInclude = (button == 'LeftButton') if not filterKey then -- resetting wipe(WorldPlan.UsedFilters) elseif IsShiftKeyDown() then WorldPlan.UsedFilters[filterKey] = nil else WorldPlan.UsedFilters[filterKey] = WorldPlan.UsedFilters[filterKey] or {} WorldPlan.UsedFilters[filterKey][filterValue] = setInclude print(filterKey, filterValue, '=', setInclude) for index, info in ipairs(WorldPlan.FilterOptions) do if info.filterKey == filterKey then if (not IsControlKeyDown()) and (filterValue ~= info.filterValue) then WorldPlan.UsedFilters[filterKey][info.filterValue] = (not setInclude) print(filterKey, info.filterValue, '=', WorldPlan.UsedFilters[filterKey][info.filterValue]) end end end end print('|cFF00FF88Filter Update:', filterKey, filterValue, operation) WorldPlan:Refresh() end