Nenue@30
|
1 -- WorldPlan
|
Nenue@30
|
2 -- FilterBar.lua
|
Nenue@30
|
3 -- Created: 10/27/2016 8:55 PM
|
Nenue@30
|
4 -- %file-revision%
|
Nenue@30
|
5 --
|
Nenue@30
|
6
|
Nenue@30
|
7 local print = DEVIAN_WORKSPACE and function(...) _G.print('FilterBar', ...) end or nop
|
Nenue@31
|
8 local wipe, ipairs, pairs = table.wipe, ipairs, pairs
|
Nenue@30
|
9
|
Nenue@30
|
10 local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD
|
Nenue@30
|
11 local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER
|
Nenue@30
|
12 local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT
|
Nenue@30
|
13 local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES
|
Nenue@30
|
14 local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS
|
Nenue@30
|
15
|
Nenue@30
|
16
|
Nenue@30
|
17 local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP
|
Nenue@30
|
18 local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE
|
Nenue@30
|
19 local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON
|
Nenue@30
|
20 local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION
|
Nenue@30
|
21 local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL
|
Nenue@30
|
22 local DEFAULT_FILTER_LAYOUT = {
|
Nenue@30
|
23 PinSize = 22,
|
Nenue@30
|
24 Border = 3,
|
Nenue@30
|
25 TrackingBorder = 2,
|
Nenue@30
|
26 TagSize = 12,
|
Nenue@30
|
27 TimeleftStage = 3,
|
Nenue@30
|
28 showNumber = true,
|
Nenue@30
|
29 numberFontObject = 'WorldPlanNumberFontThin'
|
Nenue@30
|
30 }
|
Nenue@30
|
31 local DEFAULT_FILTER_LIST = {
|
Nenue@30
|
32 { label = 'Filters', texture = "Interface\\WorldMap\\WorldMap-Icon" },
|
Nenue@30
|
33 { filterKey= 'rewardType', cVar = 'worldQuestFilterArtifactPower', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" },
|
Nenue@31
|
34 { filterKey= 'rewardType', cVar = 'worldQuestFilterOrderResources', filterValue = REWARD_CURRENCY,label = 'Order Resources', texture = "Interface\\Icons\\inv_orderhall_orderresources" },
|
Nenue@30
|
35 { filterKey= 'rewardType', cVar = 'worldQuestFilterEquipment', filterValue = REWARD_GEAR, label = 'Equipment', texture = "Interface\\ICONS\\garrison_bluearmorupgrade" },
|
Nenue@30
|
36 { filterKey= 'rewardType', cVar = 'worldQuestFilterProfessionMaterials', filterValue = REWARD_REAGENT, label = 'Materials', texture = 1417744 },
|
Nenue@30
|
37 { filterKey= 'rewardType', cVar = 'worldQuestFilterGold', filterValue = REWARD_CASH, label = 'Gold', texture = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" },
|
Nenue@30
|
38 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 },
|
Nenue@30
|
39 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", },
|
Nenue@30
|
40 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_DUNGEON, label = 'Dungeon', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", },
|
Nenue@30
|
41 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\ICONS\\70_professions_scroll_02", },
|
Nenue@30
|
42 }
|
Nenue@30
|
43 local defaults = {}
|
Nenue@30
|
44
|
Nenue@30
|
45 WorldPlanSummaryMixin = {
|
Nenue@30
|
46 selectedBountyIndex = {},
|
Nenue@30
|
47 bounties = {},
|
Nenue@30
|
48 filterList = {},
|
Nenue@30
|
49 buttons = {},
|
Nenue@30
|
50 }
|
Nenue@30
|
51 WorldPlanFilterPinMixin = {}
|
Nenue@30
|
52
|
Nenue@30
|
53 function WorldPlanSummaryMixin:OnLoad()
|
Nenue@30
|
54 self:RegisterEvent('QUEST_LOG_UPDATE')
|
Nenue@30
|
55 self:RegisterEvent('WORLD_MAP_UPDATE')
|
Nenue@30
|
56
|
Nenue@30
|
57 WorldPlan:AddHandler(self, defaults)
|
Nenue@30
|
58
|
Nenue@30
|
59 for index, info in ipairs(DEFAULT_FILTER_LIST) do
|
Nenue@30
|
60 info.zone = DEFAULT_FILTER_LAYOUT
|
Nenue@30
|
61 info.continent = DEFAULT_FILTER_LAYOUT
|
Nenue@30
|
62 info.pinMask = "Interface\\Minimap\\UI-Minimap-Background"
|
Nenue@30
|
63
|
Nenue@30
|
64 WorldPlan:AddTypeInfo(self,index, info)
|
Nenue@30
|
65 end
|
Nenue@30
|
66
|
Nenue@30
|
67 end
|
Nenue@30
|
68
|
Nenue@30
|
69
|
Nenue@30
|
70 function WorldPlanSummaryMixin:OnEvent(event)
|
Nenue@32
|
71 self:Refresh()
|
Nenue@30
|
72 end
|
Nenue@30
|
73
|
Nenue@30
|
74 local bountyIndex
|
Nenue@30
|
75 local debug_headers = {}
|
Nenue@30
|
76
|
Nenue@30
|
77 function WorldPlanSummaryMixin:Setup()
|
Nenue@30
|
78 self:GetFilters()
|
Nenue@30
|
79 end
|
Nenue@30
|
80
|
Nenue@30
|
81
|
Nenue@30
|
82 function WorldPlanSummaryMixin:OnEvent(event,...)
|
Nenue@30
|
83 self.isStale = true
|
Nenue@30
|
84 end
|
Nenue@32
|
85 function WorldPlanSummaryMixin:OnUpdate()
|
Nenue@32
|
86 if self.isStale then
|
Nenue@32
|
87 self:Refresh()
|
Nenue@32
|
88 end
|
Nenue@32
|
89 end
|
Nenue@30
|
90
|
Nenue@30
|
91 function WorldPlanSummaryMixin:OnShow()
|
Nenue@30
|
92 self:Refresh()
|
Nenue@30
|
93 end
|
Nenue@30
|
94
|
Nenue@30
|
95 function WorldPlanSummaryMixin:GetFilters()
|
Nenue@30
|
96
|
Nenue@30
|
97
|
Nenue@30
|
98 wipe(self.filterList)
|
Nenue@30
|
99
|
Nenue@30
|
100 for index, info in ipairs(DEFAULT_FILTER_LIST) do
|
Nenue@30
|
101 tinsert(self.filterList, info)
|
Nenue@30
|
102 end
|
Nenue@30
|
103 self.bounties, self.numBounties = GetQuestBountyInfoForMapID(WorldPlan.currentMapID)
|
Nenue@30
|
104 self.BountyFilters = {}
|
Nenue@30
|
105 for index, data in ipairs(self.bounties) do
|
Nenue@30
|
106 local info = self.BountyFilters[index]
|
Nenue@30
|
107 if not info then
|
Nenue@30
|
108 info = {}
|
Nenue@30
|
109 self.BountyFilters[index] = info
|
Nenue@30
|
110 end
|
Nenue@30
|
111
|
Nenue@30
|
112 local questTitle = GetQuestLogTitle(GetQuestLogIndexByID(data.questID))
|
Nenue@30
|
113
|
Nenue@30
|
114 info.filterKey = 'factionID'
|
Nenue@30
|
115 info.filterValue = data.factionID
|
Nenue@30
|
116 info.label = questTitle
|
Nenue@30
|
117 info.texture = data.icon
|
Nenue@30
|
118 print('loading emissary', questTitle)
|
Nenue@30
|
119
|
Nenue@30
|
120 tinsert(self.filterList, info)
|
Nenue@30
|
121 --{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", },
|
Nenue@30
|
122 end
|
Nenue@30
|
123 end
|
Nenue@30
|
124
|
Nenue@30
|
125 function WorldPlanSummaryMixin:Reset()
|
Nenue@30
|
126 self.pinLayout = self:GetTypeInfo(255)
|
Nenue@30
|
127 self:GetFilters()
|
Nenue@30
|
128 end
|
Nenue@30
|
129
|
Nenue@30
|
130 function WorldPlanSummaryMixin:Refresh(forced)
|
Nenue@30
|
131 self:Update(forced)
|
Nenue@30
|
132 end
|
Nenue@30
|
133
|
Nenue@30
|
134 local filterFill = "Interface\\BUTTONS\\YELLOWORANGE64"
|
Nenue@30
|
135 local filterMask = "Interface\\Minimap\\UI-Minimap-Background"
|
Nenue@31
|
136
|
Nenue@31
|
137 local questResults = {{}}
|
Nenue@30
|
138 function WorldPlanSummaryMixin:Update(forced)
|
Nenue@30
|
139 local blocks = self.buttons
|
Nenue@30
|
140 local relativeFrame = WorldMapFrame.UIElementsFrame.TrackingOptionsButton
|
Nenue@30
|
141 local numHeaders = 0
|
Nenue@30
|
142 print('|cFF00FF88'..tostring(self)..':Refresh()|r', 'currentMap=',self.currentMapID)
|
Nenue@30
|
143
|
Nenue@30
|
144
|
Nenue@30
|
145 local quests = WorldPlanQuests.QuestsByZone[self.currentMapID] or WorldPlanQuests.QuestsByID
|
Nenue@31
|
146 local foundQuests = questResults[1]
|
Nenue@30
|
147 for index, info in ipairs(self.filterList) do
|
Nenue@30
|
148 local numQuests = 0
|
Nenue@31
|
149 local resultIndex = numHeaders + 1
|
Nenue@31
|
150 questResults[resultIndex] = questResults[resultIndex] or {}
|
Nenue@31
|
151 wipe(questResults[resultIndex])
|
Nenue@30
|
152 for questID, pin in pairs(quests) do
|
Nenue@30
|
153 if pin.used then
|
Nenue@30
|
154 if not info.filterKey then
|
Nenue@30
|
155 numQuests = numQuests + 1
|
Nenue@30
|
156 elseif pin[info.filterKey] == info.filterValue then
|
Nenue@30
|
157 numQuests = numQuests + 1
|
Nenue@31
|
158 tinsert(questResults[resultIndex], pin)
|
Nenue@30
|
159 end
|
Nenue@30
|
160 end
|
Nenue@30
|
161 end
|
Nenue@30
|
162 print(tostring(index).. ' ("'..tostring(info.label)..'" f('.. tostring(info.filterKey).. '='..tostring(info.filterValue) .. '), '..tostring(numQuests)..')')
|
Nenue@30
|
163
|
Nenue@30
|
164 if numQuests >= 1 then
|
Nenue@30
|
165 numHeaders = numHeaders + 1
|
Nenue@30
|
166 local button = blocks[numHeaders]
|
Nenue@30
|
167 if not blocks[numHeaders] then
|
Nenue@30
|
168 button = CreateFrame('Button', 'WorldPlanFilterButton'..numHeaders, WorldMapScrollFrame, 'WorldPlanFilterPin')
|
Nenue@30
|
169
|
Nenue@30
|
170 button:SetSize(24,24)
|
Nenue@30
|
171 button.icon:ClearAllPoints()
|
Nenue@30
|
172 button.icon:SetAllPoints(button)
|
Nenue@30
|
173
|
Nenue@30
|
174 button.iconBorder:SetPoint('TOPLEFT', button, 'TOPLEFT', -2, 2)
|
Nenue@30
|
175 button.iconBorder:SetPoint('BOTTOMRIGHT', button, 'BOTTOMRIGHT', 2, -2)
|
Nenue@30
|
176 button.iconBorder:SetMask(filterMask)
|
Nenue@30
|
177 button.iconBorder:SetTexture(filterFill)
|
Nenue@30
|
178 button.iconBorder:SetDesaturated(true)
|
Nenue@30
|
179
|
Nenue@30
|
180 button.supertrackBorder:Hide()
|
Nenue@30
|
181 blocks[numHeaders] = button
|
Nenue@30
|
182 end
|
Nenue@30
|
183
|
Nenue@30
|
184 button.info = info
|
Nenue@31
|
185 button.questList = questResults[resultIndex]
|
Nenue@30
|
186 button:SetID(index)
|
Nenue@30
|
187 button.spacing = ((info.filterKey ~= relativeFrame.filterKey) and 10) or 0
|
Nenue@30
|
188 button.relativeFrame = relativeFrame
|
Nenue@30
|
189 button:Refresh((numHeaders == 1), numQuests)
|
Nenue@30
|
190 button:Show()
|
Nenue@30
|
191 relativeFrame = button
|
Nenue@30
|
192 end
|
Nenue@30
|
193
|
Nenue@30
|
194 end
|
Nenue@30
|
195
|
Nenue@30
|
196 self.numHeaders = numHeaders
|
Nenue@30
|
197 for i = numHeaders + 1, #blocks do
|
Nenue@30
|
198 if blocks[i] then
|
Nenue@30
|
199 blocks[i]:Hide()
|
Nenue@30
|
200 end
|
Nenue@31
|
201 if questResults[i] then
|
Nenue@31
|
202 wipe(questResults[i])
|
Nenue@31
|
203 end
|
Nenue@30
|
204 end
|
Nenue@32
|
205 self.isStale = nil
|
Nenue@30
|
206 end
|
Nenue@30
|
207
|
Nenue@30
|
208 function WorldPlanSummaryMixin:Cleanup()
|
Nenue@30
|
209 -- hide trailing buttons
|
Nenue@30
|
210 end
|
Nenue@30
|
211
|
Nenue@31
|
212 local rgbWhite = {r = 1, g= 1, b= 1, hex = '|cFFFFFFFF'}
|
Nenue@30
|
213 function WorldPlanFilterPinMixin:OnEnter()
|
Nenue@31
|
214 if self.questList and #self.questList >= 1 then
|
Nenue@31
|
215 GameTooltip:SetOwner(self, 'ANCHOR_LEFT')
|
Nenue@31
|
216 GameTooltip_ClearInsertedFrames(GameTooltip)
|
Nenue@31
|
217 GameTooltip:AddLine(self.info.label)
|
Nenue@31
|
218 for index, pin in ipairs(self.questList) do
|
Nenue@31
|
219 local colorInfo = (pin.quality and ITEM_QUALITY_COLORS[pin.quality]) or rgbWhite
|
Nenue@31
|
220 GameTooltip:AddLine(pin.title ..(pin.cheevos and " |cFFFFFF00!|R" or ''), colorInfo.r, colorInfo.g, colorInfo.b)
|
Nenue@31
|
221 GameTooltip:AddTexture(pin.itemTexture)
|
Nenue@31
|
222 local cLine = GameTooltip:NumLines() - 1
|
Nenue@32
|
223 --print(cLine, _G['GameTooltipTexture'..cLine]:GetTexture())
|
Nenue@31
|
224 if type(pin.itemTexture) == 'number' then
|
Nenue@31
|
225 --- voodoo workaround for IDs getting coerced to string
|
Nenue@31
|
226 _G['GameTooltipTexture'..cLine]:Show()
|
Nenue@31
|
227 _G['GameTooltipTexture'..cLine]:SetTexture(pin.itemTexture)
|
Nenue@31
|
228 end
|
Nenue@31
|
229 GameTooltip:Show()
|
Nenue@31
|
230 end
|
Nenue@31
|
231 end
|
Nenue@30
|
232 end
|
Nenue@30
|
233
|
Nenue@31
|
234 function WorldPlanFilterPinMixin:OnLeave()
|
Nenue@31
|
235 if GameTooltip:IsOwned(self) then
|
Nenue@31
|
236 GameTooltip:Hide()
|
Nenue@31
|
237 end
|
Nenue@31
|
238 end
|
Nenue@30
|
239
|
Nenue@30
|
240 function WorldPlanFilterPinMixin:Refresh(isFirst, numQuests)
|
Nenue@30
|
241 isFirst = isFirst or self.isFirst
|
Nenue@30
|
242 numQuests = numQuests or self.numQuests
|
Nenue@30
|
243
|
Nenue@30
|
244 local info = self.info
|
Nenue@30
|
245
|
Nenue@30
|
246 self.isFirst = isFirst
|
Nenue@30
|
247 self.numQuests = numQuests
|
Nenue@30
|
248 self.filterKey = info.filterKey
|
Nenue@30
|
249 self.filterValue = info.filterValue
|
Nenue@30
|
250 self.tagID = info.tagID
|
Nenue@30
|
251
|
Nenue@30
|
252 self.icon:SetMask(filterMask)
|
Nenue@30
|
253 self.icon:SetTexture(info.texture)
|
Nenue@30
|
254 self.count:SetText(numQuests)
|
Nenue@30
|
255 self.cVar = info.cVar
|
Nenue@30
|
256
|
Nenue@30
|
257 self.itemTexture = self.texture
|
Nenue@30
|
258
|
Nenue@30
|
259 if isFirst then
|
Nenue@30
|
260 self:SetPoint('TOP', self.relativeFrame, 'BOTTOM', 0, -5)
|
Nenue@30
|
261 else
|
Nenue@30
|
262 self:SetPoint('TOPRIGHT', self.relativeFrame, 'BOTTOMRIGHT', 0, -(3 + (self.spacing or 0)))
|
Nenue@30
|
263 end
|
Nenue@30
|
264 print('anchor to', self.relativeFrame:GetName(), info.mask)
|
Nenue@30
|
265
|
Nenue@30
|
266 local r, g, b, a = 1,1,1,1
|
Nenue@31
|
267 local desaturated = false
|
Nenue@31
|
268 if self.cVar then
|
Nenue@31
|
269 self.iconBorder:SetVertexColor(1, 1, 1, 1)
|
Nenue@31
|
270 if GetCVarBool(self.cVar) == true then
|
Nenue@31
|
271 self.icon:SetVertexColor(1,1,1,1)
|
Nenue@31
|
272 self:SetAlpha(1)
|
Nenue@31
|
273 else
|
Nenue@31
|
274 self.icon:SetVertexColor(.5, .5, .5, 1)
|
Nenue@31
|
275 self:SetAlpha(0.5)
|
Nenue@30
|
276 end
|
Nenue@30
|
277 else
|
Nenue@31
|
278 self:SetAlpha(1)
|
Nenue@31
|
279 if WorldPlan.UsedFilters[self.filterKey] then
|
Nenue@31
|
280 if WorldPlan.UsedFilters[self.filterKey] == self.filterValue then
|
Nenue@31
|
281 self.iconBorder:SetVertexColor(0, 1, 0)
|
Nenue@31
|
282 else
|
Nenue@31
|
283 self.iconBorder:SetVertexColor(1, 0, 0)
|
Nenue@31
|
284 end
|
Nenue@31
|
285 else
|
Nenue@31
|
286 self.iconBorder:SetVertexColor(1, 1, 1, 1)
|
Nenue@30
|
287 end
|
Nenue@30
|
288 end
|
Nenue@31
|
289
|
Nenue@30
|
290 --self:UpdateSize()
|
Nenue@30
|
291 end
|
Nenue@30
|
292
|
Nenue@30
|
293 function WorldPlanFilterPinMixin:OnLoad()
|
Nenue@30
|
294 self:RegisterForClicks('AnyUp')
|
Nenue@30
|
295 self:SetFrameStrata('HIGH')
|
Nenue@30
|
296 self:SetFrameLevel(151)
|
Nenue@30
|
297 self:SetScript('OnUpdate', nil)
|
Nenue@30
|
298 end
|
Nenue@30
|
299
|
Nenue@30
|
300 function WorldPlanFilterPinMixin:OnUpdate ()
|
Nenue@30
|
301 end
|
Nenue@30
|
302
|
Nenue@30
|
303 function WorldPlanFilterPinMixin:OnLeave ()
|
Nenue@30
|
304 if GameTooltip:IsOwned(self) then
|
Nenue@30
|
305 GameTooltip:Hide()
|
Nenue@30
|
306 end
|
Nenue@30
|
307 end
|
Nenue@30
|
308
|
Nenue@30
|
309 -- shift-click: reset filter
|
Nenue@30
|
310 -- click: rotate through include(1), exclude(-1), ignore(nil)
|
Nenue@30
|
311 function WorldPlanFilterPinMixin:OnClick (button)
|
Nenue@30
|
312
|
Nenue@31
|
313 print('|cFF00FF88'..self:GetName()..':OnClick()|r', filterKey, filterValue, operation)
|
Nenue@30
|
314 local filterKey = self.filterKey
|
Nenue@30
|
315 local filterValue = self.filterValue
|
Nenue@30
|
316
|
Nenue@30
|
317
|
Nenue@30
|
318 local operation = opPrefix
|
Nenue@30
|
319
|
Nenue@30
|
320
|
Nenue@30
|
321 if not filterKey then
|
Nenue@30
|
322 wipe(WorldPlan.UsedFilters)
|
Nenue@31
|
323 elseif self.cVar then
|
Nenue@31
|
324 SetCVar(self.cVar, (GetCVarBool(self.cVar) and 0) or 1)
|
Nenue@30
|
325 else
|
Nenue@31
|
326 local setInclude = (button == 'LeftButton')
|
Nenue@31
|
327 local flushValue
|
Nenue@31
|
328 print('')
|
Nenue@31
|
329 if WorldPlan.UsedFilters[filterKey] == filterValue then
|
Nenue@31
|
330 WorldPlan.UsedFilters[filterKey] = nil
|
Nenue@31
|
331 else
|
Nenue@31
|
332 WorldPlan.UsedFilters[filterKey] = filterValue
|
Nenue@30
|
333 end
|
Nenue@30
|
334 end
|
Nenue@30
|
335 WorldPlan:Refresh()
|
Nenue@30
|
336 end |