comparison FilterBar.lua @ 31:d0114b51cdea

WorldPlan: - Reworking filters to utilize newly added CVars - Fleshed out POI tooltip for WQ's associated with Family Familiars - Filter button tooltip includes reward icons - Respond to tracking menu clicks when they change filter options
author Nenue
date Fri, 28 Oct 2016 19:54:00 -0400
parents 8cb750e79952
children e8679ecb48d8
comparison
equal deleted inserted replaced
30:8cb750e79952 31:d0114b51cdea
3 -- Created: 10/27/2016 8:55 PM 3 -- Created: 10/27/2016 8:55 PM
4 -- %file-revision% 4 -- %file-revision%
5 -- 5 --
6 6
7 local print = DEVIAN_WORKSPACE and function(...) _G.print('FilterBar', ...) end or nop 7 local print = DEVIAN_WORKSPACE and function(...) _G.print('FilterBar', ...) end or nop
8 local wipe, ipairs, pairs = table.wipe, ipairs, pairs
8 9
9 local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD 10 local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD
10 local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER 11 local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER
11 local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT 12 local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT
12 local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES 13 local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES
28 numberFontObject = 'WorldPlanNumberFontThin' 29 numberFontObject = 'WorldPlanNumberFontThin'
29 } 30 }
30 local DEFAULT_FILTER_LIST = { 31 local DEFAULT_FILTER_LIST = {
31 { label = 'Filters', texture = "Interface\\WorldMap\\WorldMap-Icon" }, 32 { label = 'Filters', texture = "Interface\\WorldMap\\WorldMap-Icon" },
32 { filterKey= 'rewardType', cVar = 'worldQuestFilterArtifactPower', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" }, 33 { filterKey= 'rewardType', cVar = 'worldQuestFilterArtifactPower', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" },
33 { filterKey= 'rewardType', cVar = 'worldQuestFilterOrderResources', filterValue = REWARD_CURRENCY,label = 'Order Resources', texture = "Interface\\ICONS\\inv_misc_elvencoins" }, 34 { filterKey= 'rewardType', cVar = 'worldQuestFilterOrderResources', filterValue = REWARD_CURRENCY,label = 'Order Resources', texture = "Interface\\Icons\\inv_orderhall_orderresources" },
34 { filterKey= 'rewardType', cVar = 'worldQuestFilterEquipment', filterValue = REWARD_GEAR, label = 'Equipment', texture = "Interface\\ICONS\\garrison_bluearmorupgrade" }, 35 { filterKey= 'rewardType', cVar = 'worldQuestFilterEquipment', filterValue = REWARD_GEAR, label = 'Equipment', texture = "Interface\\ICONS\\garrison_bluearmorupgrade" },
35 { filterKey= 'rewardType', cVar = 'worldQuestFilterProfessionMaterials', filterValue = REWARD_REAGENT, label = 'Materials', texture = 1417744 }, 36 { filterKey= 'rewardType', cVar = 'worldQuestFilterProfessionMaterials', filterValue = REWARD_REAGENT, label = 'Materials', texture = 1417744 },
36 { filterKey= 'rewardType', cVar = 'worldQuestFilterGold', filterValue = REWARD_CASH, label = 'Gold', texture = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" }, 37 { filterKey= 'rewardType', cVar = 'worldQuestFilterGold', filterValue = REWARD_CASH, label = 'Gold', texture = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" },
37 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 }, 38 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 },
38 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", }, 39 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", },
124 self:Update(forced) 125 self:Update(forced)
125 end 126 end
126 127
127 local filterFill = "Interface\\BUTTONS\\YELLOWORANGE64" 128 local filterFill = "Interface\\BUTTONS\\YELLOWORANGE64"
128 local filterMask = "Interface\\Minimap\\UI-Minimap-Background" 129 local filterMask = "Interface\\Minimap\\UI-Minimap-Background"
130
131 local questResults = {{}}
129 function WorldPlanSummaryMixin:Update(forced) 132 function WorldPlanSummaryMixin:Update(forced)
130 local blocks = self.buttons 133 local blocks = self.buttons
131 local relativeFrame = WorldMapFrame.UIElementsFrame.TrackingOptionsButton 134 local relativeFrame = WorldMapFrame.UIElementsFrame.TrackingOptionsButton
132 local numHeaders = 0 135 local numHeaders = 0
133 print('|cFF00FF88'..tostring(self)..':Refresh()|r', 'currentMap=',self.currentMapID) 136 print('|cFF00FF88'..tostring(self)..':Refresh()|r', 'currentMap=',self.currentMapID)
134 137
135 138
136 local quests = WorldPlanQuests.QuestsByZone[self.currentMapID] or WorldPlanQuests.QuestsByID 139 local quests = WorldPlanQuests.QuestsByZone[self.currentMapID] or WorldPlanQuests.QuestsByID
137 140 local foundQuests = questResults[1]
138
139 for index, info in ipairs(self.filterList) do 141 for index, info in ipairs(self.filterList) do
140 local numQuests = 0 142 local numQuests = 0
141 143 local resultIndex = numHeaders + 1
144 questResults[resultIndex] = questResults[resultIndex] or {}
145 wipe(questResults[resultIndex])
142 for questID, pin in pairs(quests) do 146 for questID, pin in pairs(quests) do
143 if pin.used then 147 if pin.used then
144 if not info.filterKey then 148 if not info.filterKey then
145 numQuests = numQuests + 1 149 numQuests = numQuests + 1
146 elseif pin[info.filterKey] == info.filterValue then 150 elseif pin[info.filterKey] == info.filterValue then
147 numQuests = numQuests + 1 151 numQuests = numQuests + 1
152 tinsert(questResults[resultIndex], pin)
148 end 153 end
149 end 154 end
150 end 155 end
151 print(tostring(index).. ' ("'..tostring(info.label)..'" f('.. tostring(info.filterKey).. '='..tostring(info.filterValue) .. '), '..tostring(numQuests)..')') 156 print(tostring(index).. ' ("'..tostring(info.label)..'" f('.. tostring(info.filterKey).. '='..tostring(info.filterValue) .. '), '..tostring(numQuests)..')')
152 157
169 button.supertrackBorder:Hide() 174 button.supertrackBorder:Hide()
170 blocks[numHeaders] = button 175 blocks[numHeaders] = button
171 end 176 end
172 177
173 button.info = info 178 button.info = info
179 button.questList = questResults[resultIndex]
174 button:SetID(index) 180 button:SetID(index)
175 button.spacing = ((info.filterKey ~= relativeFrame.filterKey) and 10) or 0 181 button.spacing = ((info.filterKey ~= relativeFrame.filterKey) and 10) or 0
176 button.relativeFrame = relativeFrame 182 button.relativeFrame = relativeFrame
177 button:Refresh((numHeaders == 1), numQuests) 183 button:Refresh((numHeaders == 1), numQuests)
178 button:Show() 184 button:Show()
184 self.numHeaders = numHeaders 190 self.numHeaders = numHeaders
185 for i = numHeaders + 1, #blocks do 191 for i = numHeaders + 1, #blocks do
186 if blocks[i] then 192 if blocks[i] then
187 blocks[i]:Hide() 193 blocks[i]:Hide()
188 end 194 end
195 if questResults[i] then
196 wipe(questResults[i])
197 end
189 end 198 end
190 end 199 end
191 200
192 function WorldPlanSummaryMixin:Cleanup() 201 function WorldPlanSummaryMixin:Cleanup()
193
194 -- hide trailing buttons 202 -- hide trailing buttons
195 end 203 end
196 204
205 local rgbWhite = {r = 1, g= 1, b= 1, hex = '|cFFFFFFFF'}
197 function WorldPlanFilterPinMixin:OnEnter() 206 function WorldPlanFilterPinMixin:OnEnter()
198 207 if self.questList and #self.questList >= 1 then
199 end 208 GameTooltip:SetOwner(self, 'ANCHOR_LEFT')
209 GameTooltip_ClearInsertedFrames(GameTooltip)
210 GameTooltip:AddLine(self.info.label)
211 for index, pin in ipairs(self.questList) do
212 local colorInfo = (pin.quality and ITEM_QUALITY_COLORS[pin.quality]) or rgbWhite
213 GameTooltip:AddLine(pin.title ..(pin.cheevos and " |cFFFFFF00!|R" or ''), colorInfo.r, colorInfo.g, colorInfo.b)
214 GameTooltip:AddTexture(pin.itemTexture)
215 local cLine = GameTooltip:NumLines() - 1
216 print(cLine, _G['GameTooltipTexture'..cLine]:GetTexture())
217 if type(pin.itemTexture) == 'number' then
218 --- voodoo workaround for IDs getting coerced to string
219 _G['GameTooltipTexture'..cLine]:Show()
220 _G['GameTooltipTexture'..cLine]:SetTexture(pin.itemTexture)
221 end
222 GameTooltip:Show()
223 end
224 end
225 end
226
200 function WorldPlanFilterPinMixin:OnLeave() 227 function WorldPlanFilterPinMixin:OnLeave()
201 228 if GameTooltip:IsOwned(self) then
202 end 229 GameTooltip:Hide()
203 230 end
231 end
204 232
205 function WorldPlanFilterPinMixin:Refresh(isFirst, numQuests) 233 function WorldPlanFilterPinMixin:Refresh(isFirst, numQuests)
206 isFirst = isFirst or self.isFirst 234 isFirst = isFirst or self.isFirst
207 numQuests = numQuests or self.numQuests 235 numQuests = numQuests or self.numQuests
208 236
217 self.icon:SetMask(filterMask) 245 self.icon:SetMask(filterMask)
218 self.icon:SetTexture(info.texture) 246 self.icon:SetTexture(info.texture)
219 self.count:SetText(numQuests) 247 self.count:SetText(numQuests)
220 self.cVar = info.cVar 248 self.cVar = info.cVar
221 249
222
223 self.itemTexture = self.texture 250 self.itemTexture = self.texture
224 251
225 if isFirst then 252 if isFirst then
226 self:SetPoint('TOP', self.relativeFrame, 'BOTTOM', 0, -5) 253 self:SetPoint('TOP', self.relativeFrame, 'BOTTOM', 0, -5)
227 else 254 else
228 self:SetPoint('TOPRIGHT', self.relativeFrame, 'BOTTOMRIGHT', 0, -(3 + (self.spacing or 0))) 255 self:SetPoint('TOPRIGHT', self.relativeFrame, 'BOTTOMRIGHT', 0, -(3 + (self.spacing or 0)))
229
230 end 256 end
231 print('anchor to', self.relativeFrame:GetName(), info.mask) 257 print('anchor to', self.relativeFrame:GetName(), info.mask)
232 258
233 local r, g, b, a = 1,1,1,1 259 local r, g, b, a = 1,1,1,1
234 local used = WorldPlan.UsedFilters[self.filterKey] 260 local desaturated = false
235 if used and self.filterKey then 261 if self.cVar then
236 if used[self.filterValue] == true then 262 self.iconBorder:SetVertexColor(1, 1, 1, 1)
237 r, g, b = 0, 1, 0 263 if GetCVarBool(self.cVar) == true then
238 elseif used[self.filterValue] == false then 264 self.icon:SetVertexColor(1,1,1,1)
239 r, g, b = 1, 0, 0 265 self:SetAlpha(1)
266 else
267 self.icon:SetVertexColor(.5, .5, .5, 1)
268 self:SetAlpha(0.5)
240 end 269 end
241 else 270 else
242 if self.cVar and GetCVarBool(self.cVar) then 271 self:SetAlpha(1)
243 r, g, b = 0, 1, 0 272 if WorldPlan.UsedFilters[self.filterKey] then
244 end 273 if WorldPlan.UsedFilters[self.filterKey] == self.filterValue then
245 end 274 self.iconBorder:SetVertexColor(0, 1, 0)
246 self.iconBorder:SetVertexColor(r, g, b, a) 275 else
276 self.iconBorder:SetVertexColor(1, 0, 0)
277 end
278 else
279 self.iconBorder:SetVertexColor(1, 1, 1, 1)
280 end
281 end
282
247 --self:UpdateSize() 283 --self:UpdateSize()
248 end 284 end
249 285
250 function WorldPlanFilterPinMixin:OnLoad() 286 function WorldPlanFilterPinMixin:OnLoad()
251 self:RegisterForClicks('AnyUp') 287 self:RegisterForClicks('AnyUp')
265 301
266 -- shift-click: reset filter 302 -- shift-click: reset filter
267 -- click: rotate through include(1), exclude(-1), ignore(nil) 303 -- click: rotate through include(1), exclude(-1), ignore(nil)
268 function WorldPlanFilterPinMixin:OnClick (button) 304 function WorldPlanFilterPinMixin:OnClick (button)
269 305
306 print('|cFF00FF88'..self:GetName()..':OnClick()|r', filterKey, filterValue, operation)
270 local filterKey = self.filterKey 307 local filterKey = self.filterKey
271 local filterValue = self.filterValue 308 local filterValue = self.filterValue
272 309
273 310
274 local operation = opPrefix 311 local operation = opPrefix
275 local setInclude = (button == 'LeftButton')
276 312
277 313
278 if not filterKey then 314 if not filterKey then
279 -- resetting
280 wipe(WorldPlan.UsedFilters) 315 wipe(WorldPlan.UsedFilters)
281 316 elseif self.cVar then
282 elseif IsShiftKeyDown() then 317 SetCVar(self.cVar, (GetCVarBool(self.cVar) and 0) or 1)
283 WorldPlan.UsedFilters[filterKey] = nil
284 else 318 else
285 WorldPlan.UsedFilters[filterKey] = WorldPlan.UsedFilters[filterKey] or {} 319 local setInclude = (button == 'LeftButton')
286 WorldPlan.UsedFilters[filterKey][filterValue] = setInclude 320 local flushValue
287 print(filterKey, filterValue, '=', setInclude) 321 print('')
288 322 if WorldPlan.UsedFilters[filterKey] == filterValue then
289 for index, info in ipairs(WorldPlan.FilterOptions) do 323 WorldPlan.UsedFilters[filterKey] = nil
290 if info.filterKey == filterKey then 324 else
291 if (not IsControlKeyDown()) and (filterValue ~= info.filterValue) then 325 WorldPlan.UsedFilters[filterKey] = filterValue
292 WorldPlan.UsedFilters[filterKey][info.filterValue] = (not setInclude) 326 end
293 print(filterKey, info.filterValue, '=', WorldPlan.UsedFilters[filterKey][info.filterValue]) 327 end
294 end
295 end
296 end
297
298 end
299 print('|cFF00FF88Filter Update:', filterKey, filterValue, operation)
300 WorldPlan:Refresh() 328 WorldPlan:Refresh()
301 end 329 end