comparison FilterBar.lua @ 93:98b5e08b75ed v1.4.9

- Fixed quest completion checking and handling - Changed animation method to hopefully stop weird flickering. - Pins are now visible before full reward data is loaded - Filter bar redesigned: - aligned horizontally along the top of the map display - filter buttons display a '+' when there are matches in both current and other zones, and '*' when there only matches in other zones - button tooltips separate local and global quests - button categories are highlighted and labeled when the cursor is over them - Fixed invalid POI targets appearing when the spell targeting cursor is active
author Nenue
date Sat, 15 Apr 2017 11:04:54 -0400
parents a12f782571c5
children b29b35cb8539
comparison
equal deleted inserted replaced
92:df725cba1a6a 93:98b5e08b75ed
13 local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT 13 local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT
14 local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES 14 local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES
15 local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS 15 local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS
16 16
17 17
18 local filtersUsed
19 local filterFill = "Interface\\BUTTONS\\YELLOWORANGE64"
20 local filterMask = "Interface\\Minimap\\UI-Minimap-Background"
21
22 local HEADERS_SPACING = 3
23 local BUTTONS_SPACING = 1
24 local BUTTONS_HEIGHT = 20
25 local TOGGLE_SIZE = 20
26 local HEADERS_HEIGHT = 40
27
18 local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP 28 local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP
19 local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE 29 local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE
20 local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON 30 local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON
21 local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION 31 local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION
32
33 local barMouseOver
34 local filtersDirty = true
35 local layoutDirty = true
36 local matchesDirty -- don't flag until first filter loadout
22 37
23 local familiars = { 38 local familiars = {
24 [42159] = {npc = 106552, name = 'Nightwatcher Merayl'}, 39 [42159] = {npc = 106552, name = 'Nightwatcher Merayl'},
25 [40277] = {npc = 97804, name = 'Tiffany Nelson'}, 40 [40277] = {npc = 97804, name = 'Tiffany Nelson'},
26 [40298] = {npc = 99182, name = 'Sir Galveston'}, 41 [40298] = {npc = 99182, name = 'Sir Galveston'},
47 TagSize = 12, 62 TagSize = 12,
48 TimeleftStage = 3, 63 TimeleftStage = 3,
49 showNumber = true, 64 showNumber = true,
50 numberFontObject = 'WorldPlanNumberFontThin' 65 numberFontObject = 'WorldPlanNumberFontThin'
51 } 66 }
67
68 local headerNames = {
69 ['rewardType'] = 'Reward Type',
70 ['worldQuestType'] = 'Quest Type',
71 ['isElite'] = 'Elite',
72 ['factionID'] = 'Bounties'
73 }
74
52 db.DefaultFilters = { 75 db.DefaultFilters = {
53 { label = 'Filters', texture = "Interface\\WorldMap\\WorldMap-Icon" },
54 { filterKey= 'rewardType', cVar = 'worldQuestFilterArtifactPower', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" }, 76 { filterKey= 'rewardType', cVar = 'worldQuestFilterArtifactPower', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" },
55 { filterKey= 'rewardType', cVar = 'worldQuestFilterOrderResources', filterValue = REWARD_CURRENCY,label = 'Order Resources', texture = "Interface\\Icons\\inv_orderhall_orderresources" }, 77 { filterKey= 'rewardType', cVar = 'worldQuestFilterOrderResources', filterValue = REWARD_CURRENCY,label = 'Order Resources', texture = "Interface\\Icons\\inv_orderhall_orderresources" },
56 { filterKey= 'rewardType', cVar = 'worldQuestFilterEquipment', filterValue = REWARD_GEAR, label = 'Equipment', texture = "Interface\\ICONS\\garrison_bluearmorupgrade" }, 78 { filterKey= 'rewardType', cVar = 'worldQuestFilterEquipment', filterValue = REWARD_GEAR, label = 'Equipment', texture = "Interface\\ICONS\\garrison_bluearmorupgrade" },
57 { filterKey= 'rewardType', cVar = 'worldQuestFilterProfessionMaterials', filterValue = REWARD_REAGENT, label = 'Materials', texture = 1417744 }, 79 { filterKey= 'rewardType', cVar = 'worldQuestFilterProfessionMaterials', filterValue = REWARD_REAGENT, label = 'Materials', texture = 1417744 },
58 { filterKey= 'rewardType', cVar = 'worldQuestFilterGold', filterValue = REWARD_CASH, label = 'Gold', texture = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" }, 80 { filterKey= 'rewardType', cVar = 'worldQuestFilterGold', filterValue = REWARD_CASH, label = 'Gold', texture = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" },
59 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 }, 81 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 },
60 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", }, 82 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", },
61 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_DUNGEON, label = 'Dungeon', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", }, 83 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_DUNGEON, label = 'Dungeon', texture = "Interface\\LFGFRAME\\BattlenetWorking0", },
62 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\ICONS\\70_professions_scroll_02", }, 84 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\ICONS\\70_professions_scroll_02", },
85 --{ filterKey = 'isElite', filterValue = true, label = 'Elite', texture = "", desaturated = false},
86 --{ filterKey = 'isElite', filterValue = false, label = 'Not-Elite', texture = "", desaturated = false},
63 } 87 }
64 local defaults = {} 88 local defaults = {}
65 89
66 WorldPlanSummaryMixin = WorldPlanSummaryMixin or {} 90 WorldPlanSummaryMixin = WorldPlanSummaryMixin or {}
67 local Module = WorldPlanSummaryMixin 91 local Module = WorldPlanSummaryMixin
68 Module.selectedBountyIndex = {} 92 Module.selectedBountyIndex = {}
69 Module.bounties = {} 93 Module.bounties = {}
70 Module.filterList = {} 94 Module.filterList = {}
71 Module.buttons = {} 95 Module.Buttons = {}
96 Module.Headers = {}
72 Module.cvarFiltersDirty = false 97 Module.cvarFiltersDirty = false
73 WorldPlanFilterPinMixin = {} 98 WorldPlanFilterButtonMixin = {}
74 local Pin = WorldPlanFilterPinMixin 99 local Pin = WorldPlanFilterButtonMixin
75 100
76 function Module:OnLoad() 101 function Module:OnLoad()
77 self:SetParent(WorldMapFrame.UIElementsFrame) 102 --self:SetParent(WorldMapFrame.UIElementsFrame)
78 self:ClearAllPoints()
79 self:SetPoint('TOPRIGHT')
80 WorldPlan:AddHandler(self) 103 WorldPlan:AddHandler(self)
81 --[[for index, info in ipairs(db.DefaultFilters) do 104 --[[for index, info in ipairs(db.DefaultFilters) do
82 info.zone = db.DefaultFilterType 105 info.zone = db.DefaultFilterType
83 info.continent = db.DefaultFilterType 106 info.continent = db.DefaultFilterType
84 info.pinMask = "Interface\\Minimap\\UI-Minimap-Background" 107 info.pinMask = "Interface\\Minimap\\UI-Minimap-Background"
85 WorldPlan:AddTypeInfo(self,index, info) 108 WorldPlan:AddTypeInfo(self,index, info)
86 end 109 end
87 --]] 110 --]]
111
112
88 end 113 end
89 114
90 115
91 function Module:OnEvent(event, arg) 116 function Module:OnEvent(event, arg)
92 print('|cFF00FF88'..self:GetName()..':OnEvent()', event) 117 print('|cFF00FF88'..self:GetName()..':OnEvent()', event)
93 if (event == 'QUEST_LOG_UPDATE') and arg then 118 if (event == 'QUEST_LOG_UPDATE') and arg then
94 if db.QuestsByID[arg] then 119 filtersDirty = true
95 if db.QuestsByID[arg].factionID then 120 self:Refresh()
96 121 end
97 end
98 end
99 end
100
101 self.isStale = true
102 end 122 end
103 123
104 local bountyIndex 124 local bountyIndex
105 local debug_headers = {} 125 local debug_headers = {}
106 126 local ToggleButton = {}
107 function Module:Setup() 127 function Module:Setup()
108 print('|cFF00FF88'..self:GetName()..':Setup()') 128 print('|cFF00FF88'..self:GetName()..':Setup()')
109 self.isStale = true 129 self.isStale = true
110 self:SetShown(true) 130 self:SetParent(WorldMapFrame.UIElementsFrame)
111 end 131 --self:SetPoint('BOTTOMLEFT')
112 132 for k,v in pairs( ToggleButton) do
113 133 self.Toggle:SetScript(k,v)
114 function Module:OnUpdate() 134 end
135 self.Toggle:SetSize(TOGGLE_SIZE, TOGGLE_SIZE)
136
137 end
138
139
140 function Module:OnUpdate(sinceLast)
115 if self.isStale then 141 if self.isStale then
116 wprint('|cFF00FF00pushing update') 142 print('|cFF00FF00pushing update')
117 self:Refresh() 143 self:Refresh()
118 end 144 end
145
146 barMouseOver = self:IsMouseOver()
147 if barMouseOver or filtersUsed then
148
149 self.toAlpha = 1
150 self.Backdrop:Show()
151 else
152 self.toAlpha = 0.25
153 self.Backdrop:Hide()
154 end
155 local cAlpha = self:GetAlpha()
156 if cAlpha ~= self.toAlpha then
157 if cAlpha > self.toAlpha then
158 cAlpha = cAlpha - sinceLast*4
159 if cAlpha <= self.toAlpha then
160 cAlpha = self.toAlpha
161 end
162 else
163 cAlpha = cAlpha + sinceLast*4
164 if cAlpha >= self.toAlpha then
165 cAlpha = self.toAlpha
166 end
167 end
168 end
169 self:SetAlpha(cAlpha)
119 end 170 end
120 171
121 function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen) 172 function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen)
122 print('|cFFFFFF00OnMapInfo()', isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen) 173 print('|cFFFFFF00OnMapInfo()', isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen)
123 if not isBrokenIsle then 174 if not isBrokenIsle then
124 self:SetShown(false) 175 self:SetShown(false)
125 else 176 else
126 if self:IsShown() then 177 self:SetShown(true)
178 if isMapOpen then
127 self:Refresh() 179 self:Refresh()
128 end 180 else
129 self:SetShown(true) 181 matchesDirty = true
182 layoutDirty = true
183 end
130 end 184 end
131 end 185 end
132 186
133 function Module:OnShow() 187 function Module:OnShow()
134 print('|cFF00FF88'..self:GetName()..':OnShow()') 188 print('|cFF00FF88'..self:GetName()..':OnShow()')
135 if self.isStale then 189 self:Refresh()
136 self:Refresh() 190 end
137 end 191
192 local IsBountyCriteria = function(poiFrame, questID)
193 return IsQuestCriteriaForBounty(poiFrame.questID, questID)
138 end 194 end
139 195
140 local tinsert, GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID = tinsert, GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID 196 local tinsert, GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID = tinsert, GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID
141 function Module:GetFilters() 197
142 198 function Module:OnConfigUpdate()
143 print('|cFF00FFFF'..self:GetName()..':GetFilters()') 199
144 200 ToggleButton.OnShow(self.Toggle)
145 wipe(self.filterList) 201 end
202
203 function Module:Reset()
204 self:UpdateFilters('SUMMARY_RESET')
205 self:UpdateMatches('SUMMARY_RESET')
206 self:UpdateLayout('SUMMARY_RESET')
207 end
208
209 function Module:Refresh()
210 self:UpdateFilters('SUMMARY_REFRESH')
211 self:UpdateMatches('SUMMARY_REFRESH')
212 self:UpdateLayout('SUMMARY_REFRESH')
213 end
214
215 local questResults = {{} }
216 db.FilterList = {}
217
218 function Module:UpdateFilters(event)
219
220 print('|cFF00FFFF'..self:GetName()..':GetFilters()', event)
221
222 wipe(db.FilterList)
146 223
147 for index, info in ipairs(db.DefaultFilters) do 224 for index, info in ipairs(db.DefaultFilters) do
148 tinsert(self.filterList, info) 225 tinsert(db.FilterList, info)
149 end 226 end
150 self.bounties, self.numBounties = GetQuestBountyInfoForMapID(db.currentMapID) 227 self.bounties = db.Bounties
151 self.BountyFilters = {} 228 self.BountyFilters = {}
152 for index, data in ipairs(self.bounties) do 229 for index, data in ipairs(self.bounties) do
153 local info = self.BountyFilters[index] 230 if not IsQuestComplete(data.questID) then
154 if not info then 231
155 info = {} 232 local info = self.BountyFilters[index]
156 self.BountyFilters[index] = info 233 if not info then
157 end 234 info = {}
158 235 self.BountyFilters[index] = info
159 local questTitle = GetQuestLogTitle(GetQuestLogIndexByID(data.questID)) 236 layoutDirty = true
160 237 else
161 info.filterKey = 'factionID' 238 if info.questID ~= data.questID then
162 info.filterValue = data.factionID 239 layoutDirty = true
163 info.label = questTitle 240 end
164 info.texture = data.icon 241 end
165 print('loading emissary', questTitle) 242
166 243 local questTitle = GetQuestLogTitle(GetQuestLogIndexByID(data.questID))
167 tinsert(self.filterList, info) 244 info.filterKey = 'factionID'
168 --{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", }, 245 info.filterFunc = IsBountyCriteria
169 end 246 info.filterValue = data.questID
170 end 247 info.label = questTitle
171 248 info.texture = data.icon
172 function Module:Reset() 249 print('loading emissary', questTitle)
173 self:GetFilters() 250
174 end 251 tinsert(db.FilterList, info)
175 252 --{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", },
176 function Module:Refresh() 253 end
177 self:GetFilters() 254
178 self:Update() 255 end
179 end 256 end
180 257
181 local filterFill = "Interface\\BUTTONS\\YELLOWORANGE64" 258 function Module:UpdateMatches(event)
182 local filterMask = "Interface\\Minimap\\UI-Minimap-Background" 259 print('|cFF00FF00UpdateMatches()', event)
183 260 local quests = db.QuestsByID
184 local questResults = {{}} 261 local questsForMap = db.QuestsByZone[db.currentMapID] or quests
185 function Module:Update() 262
186 local blocks = self.buttons 263 for index, info in ipairs(db.FilterList) do
187 264 info.GlobalMatches = info.GlobalMatches or {}
265 info.LocalMatches = info.LocalMatches or {}
266 wipe(info.GlobalMatches)
267 wipe(info.LocalMatches)
268 print(info.filterKey, info.filterValue, info.filterFunc and 'func test' or 'compare')
269 for questID, pin in pairs(quests) do
270 print('', questID, pin.dataLoaded, (not IsQuestComplete(questID)))
271 if pin.dataLoaded and not IsQuestComplete(questID) then
272
273 local keyName, keyValue = info.filterKey, info.filterValue
274 local isMatch
275 if info.filterFunc then
276
277 isMatch = info.filterFunc(pin, keyValue)
278 print(' running special function, result =', isMatch)
279
280 elseif pin[keyName] and (pin[keyName] == keyValue) then
281 isMatch = true
282 print(' rote match')
283 end
284 if isMatch then
285 tinsert(info.GlobalMatches, pin)
286 if questsForMap[questID] then
287 print(' local map')
288 tinsert(info.LocalMatches, pin)
289 end
290
291 end
292 end
293
294 end
295 print('global', #info.GlobalMatches, 'local', #info.LocalMatches)
296 end
297 end
298
299 function Module:UpdateLayout(event)
300 print('|cFF00FF88UpdateLayout()|r', event, 'currentMap=',db.currentMapID)
301
302 self.filtersSelected = nil
303
304 local currentHeader
188 local relativeFrame = self 305 local relativeFrame = self
189 306 local lastKey
190 local numHeaders = 0 307
191 print('|cFF00FF88'..self:GetName()..':Update()|r', 'currentMap=',db.currentMapID) 308 local numHeaders = 0
309 local numButtons = 0
310
311 local layoutWidth = TOGGLE_SIZE + HEADERS_SPACING * 2
312 local headerWidth = HEADERS_SPACING
192 313
193 314
194 local layout = db.DefaultFilterType 315 local layout = db.DefaultFilterType
195 local borderWidth = layout.iconWidth + (layout.borderWidth * 2) 316 local borderWidth = layout.iconWidth + (layout.borderWidth * 2)
196 local highlightWidth = borderWidth + (layout.highlightWidth * 2) 317 local highlightWidth = borderWidth + (layout.highlightWidth * 2)
199 for _ in pairs(mapQuests) do 320 for _ in pairs(mapQuests) do
200 n = n + 1 321 n = n + 1
201 end 322 end
202 print(n, 'pins to work with') 323 print(n, 'pins to work with')
203 324
325
326 filtersUsed = nil
204 local firstCvar, lastCvar 327 local firstCvar, lastCvar
205 for index, info in ipairs(self.filterList) do 328 local isFirst = true
206 local numQuestsHere = 0 329 for index, info in ipairs(db.FilterList) do
207 local numQuestsTotal = 0
208 info.questList = info.questList or {}
209 wipe(info.questList)
210 print(info.filterKey, info.filterValue)
211
212 for questID, pin in pairs(db.QuestsByID) do
213 --print(pin.worldQuestType ~= LE_QUEST_TAG_TYPE_PROFESSION, (db.Config.ShowAllProfessionQuests or pin.isKnownProfession))
214 if pin.used then
215
216 print(pin.title, mapQuests[questID])
217 if (pin.worldQuestType ~= LE_QUEST_TAG_TYPE_PROFESSION) or (db.Config.ShowAllProfessionQuests or pin.isKnownProfession) then
218
219 if not info.filterKey then
220 if mapQuests[questID] then
221 numQuestsHere = numQuestsHere + 1
222 end
223 numQuestsTotal = numQuestsTotal + 1
224 elseif pin[info.filterKey] == info.filterValue then
225 if mapQuests[questID] then
226 numQuestsHere = numQuestsHere + 1
227 tinsert(info.questList, pin)
228 end
229 numQuestsTotal = numQuestsTotal + 1
230 end
231 end
232 end
233
234 end
235 --print('num here', numQuestsHere, numQuestsTotal) 330 --print('num here', numQuestsHere, numQuestsTotal)
236 info.totalQuests = numQuestsTotal 331
237 332
238 --print(tostring(index).. ' ("'..tostring(info.label)..'" f('.. tostring(info.filterKey).. '='..tostring(info.filterValue) .. '), '..tostring(numQuests)..')') 333 --print(tostring(index).. ' ("'..tostring(info.label)..'" f('.. tostring(info.filterKey).. '='..tostring(info.filterValue) .. '), '..tostring(numQuests)..')')
239 334
240 if numQuestsTotal >= 1 then 335 if #info.GlobalMatches >= 1 then
241 numHeaders = numHeaders + 1 336 if info.filterKey ~= lastKey then
242 local button = blocks[numHeaders] 337
243 if not blocks[numHeaders] then 338 numHeaders = numHeaders + 1
244 button = CreateFrame('Button', 'WorldPlanFilterButton'..numHeaders, self, 'WorldPlanFilterPin') 339 local nextHeader = self.Headers[numHeaders] or CreateFrame('Frame', 'FilterHeader' .. numHeaders, self, 'WorldPlanFilterHeader')
245 button:SetSize(32,20) 340 if currentHeader then
246 button.icon:SetTexCoord(0.1,.9,.1,(1 * (20/32))) 341 nextHeader:SetPoint('TOPLEFT', currentHeader, 'TOPRIGHT', 0, 0)
342
343 currentHeader:SetSize(headerWidth - BUTTONS_SPACING + HEADERS_SPACING, HEADERS_HEIGHT)
344 layoutWidth = layoutWidth + headerWidth
345 headerWidth = HEADERS_SPACING
346 else
347 nextHeader:SetPoint('TOPLEFT', TOGGLE_SIZE + HEADERS_SPACING * 2, 0)
348
349 end
350
351 print(' begin header '..numHeaders, 'layout width =', floor(layoutWidth+.5))
352 isFirst = true
353 currentHeader = nextHeader
354 currentHeader.Backdrop:SetHeight(BUTTONS_HEIGHT *2)
355 currentHeader.Label:SetText(headerNames[info.filterKey])
356 relativeFrame = currentHeader
357 end
358
359 numButtons = numButtons + 1
360 local button = self.Buttons[numButtons]
361 if not button then
362 button = CreateFrame('Button', 'FilterButton'..numButtons, self, 'WorldPlanFilterButton')
363 button:SetSize(32,BUTTONS_HEIGHT)
364 button.icon:SetTexCoord(0.1,.9,.1,(1 * (BUTTONS_HEIGHT/32)))
247 365
248 button.RewardBorder:ClearAllPoints() 366 button.RewardBorder:ClearAllPoints()
249 button.RewardBorder:SetPoint('TOPLEFT', button, 'TOPLEFT') 367 button.RewardBorder:SetPoint('TOPLEFT', button, 'TOPLEFT')
250 button.RewardBorder:SetPoint('BOTTOMRIGHT', button, 'BOTTOMRIGHT') 368 button.RewardBorder:SetPoint('BOTTOMRIGHT', button, 'BOTTOMRIGHT')
251
252
253 blocks[numHeaders] = button
254 end 369 end
255 370
256 button.info = info 371 button.info = info
257 button.numQuestsTotal = numQuestsTotal 372 button.numQuestsTotal = #info.GlobalMatches
258 button.numQuestsHere = numQuestsHere 373 button.numQuestsHere = #info.LocalMatches
259 button.questList = info.questList 374 button.GlobalMatches = info.GlobalMatches
260 button.isFirst = (numHeaders == 1) 375 button.LocalMatches = info.LocalMatches
376 button.isFirst = isFirst
261 button:SetID(index) 377 button:SetID(index)
262 button.spacing = ((relativeFrame.cVar and (not info.cVar)) or (relativeFrame.filterKey ~= info.filterKey)) and 5 or 1 378 button:SetParent(currentHeader)
263 button.relativeFrame = relativeFrame 379 button.relativeFrame = relativeFrame
264 button:Refresh() 380 button:Refresh()
265 button:Show() 381 button:Show()
266 relativeFrame = button 382 relativeFrame = button
267 383 headerWidth = headerWidth + button:GetWidth() + BUTTONS_SPACING
384
385 isFirst = false
268 if info.cVar then 386 if info.cVar then
269 firstCvar = firstCvar or button 387 firstCvar = firstCvar or button
270 lastCvar = button 388 lastCvar = button
271 end 389 end
272 390 lastKey = info.filterKey
273 end 391 end
274 end 392 end
275 393
276 self.numHeaders = numHeaders 394 self.numHeaders = numHeaders
277 for i = numHeaders + 1, #blocks do 395 for i = numButtons + 1, #self.Buttons do
278 if blocks[i] then 396 if self.Buttons[i] then
279 blocks[i]:Hide() 397 self.Buttons[i]:Hide()
280 wipe(blocks[i].questList) 398 wipe(self.Buttons[i].LocalMatches)
281 end 399 wipe(self.Buttons[i].GlobalMatches)
282 end 400 end
283 401 end
284 402 for i = numHeaders + 1, #self.Headers do
285 403 if self.Headers[i] then
404 self.Headers[i]:Hide()
405 end
406 end
407
408
409 if currentHeader then
410 currentHeader:SetSize(headerWidth - BUTTONS_SPACING + HEADERS_SPACING, HEADERS_HEIGHT)
411 layoutWidth = layoutWidth + headerWidth + HEADERS_SPACING
412 end
413
414 self:SetSize(layoutWidth, BUTTONS_HEIGHT + BUTTONS_SPACING * 2)
415 self:ClearAllPoints()
416 self:SetPoint('TOP')
286 self.isStale = nil 417 self.isStale = nil
418 layoutDirty = nil
287 end 419 end
288 420
289 function Module:Cleanup() 421 function Module:Cleanup()
290 -- hide trailing buttons 422 -- hide trailing buttons
291 end 423 end
292 424
293 local rgbWhite = {r = 1, g= 1, b= 1, hex = '|cFFFFFFFF'} 425 local rgbWhite = {r = 1, g= 1, b= 1, hex = '|cFFFFFFFF' }
426 local found = {}
294 function Pin:OnEnter() 427 function Pin:OnEnter()
295 if #self.questList >= 1 then 428 if #self.GlobalMatches >= 1 then
296 GameTooltip:SetOwner(self, 'ANCHOR_LEFT') 429 GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
297 GameTooltip:AddLine(self.info.label) 430 GameTooltip:AddLine(self.info.label)
298 for index, pin in ipairs(self.questList) do 431 wipe(found)
299 local colorInfo = (pin.quality and ITEM_QUALITY_COLORS[pin.quality]) or rgbWhite 432
300 GameTooltip:AddLine('|T'.. tostring(pin.itemTexture)..':16:16|t ' .. tostring(pin.title) ..(pin.cheevos and " |cFFFFFF00!|R" or ''), colorInfo.r, colorInfo.g, colorInfo.b) 433 if self.numQuestsHere >= 1 then
301 end 434 if self.numQuestsHere < self.numQuestsTotal then
435 GameTooltip:AddLine('This Zone', 1, 1, 0)
436 end
437 for index, pin in ipairs(self.LocalMatches) do
438 local colorInfo = (pin.quality and ITEM_QUALITY_COLORS[pin.quality]) or rgbWhite
439 found[pin] = pin
440 GameTooltip:AddLine('|T'.. tostring(pin.itemTexture)..':16:16|t ' .. tostring(pin.title) ..(pin.cheevos and " |cFFFFFF00!|R" or ''), 0, 1, 0)
441 end
442 end
443
444 if self.numQuestsHere < self.numQuestsTotal then
445 if self.numQuestsHere >= 1 then
446 GameTooltip:AddLine(' ')
447 end
448 GameTooltip:AddLine('Other Maps', 1, 1, 0)
449 for index, pin in ipairs(self.GlobalMatches) do
450 if not found[pin] then
451 local colorInfo = (pin.quality and ITEM_QUALITY_COLORS[pin.quality]) or rgbWhite
452 found[pin] = pin
453 GameTooltip:AddLine('|T'.. tostring(pin.itemTexture)..':16:16|t ' .. tostring(pin.title) ..(pin.cheevos and " |cFFFFFF00!|R" or ''), 1, 1, 1)
454 end
455 end
456 end
457
458
302 GameTooltip:AddLine(self.numQuestsTotal .. ' total') 459 GameTooltip:AddLine(self.numQuestsTotal .. ' total')
303 GameTooltip:Show() 460 GameTooltip:Show()
304 end 461 end
305 end 462 end
306 463
315 self.filterKey = info.filterKey 472 self.filterKey = info.filterKey
316 self.filterValue = info.filterValue 473 self.filterValue = info.filterValue
317 self.tagID = info.tagID 474 self.tagID = info.tagID
318 475
319 self.icon:SetTexture(info.texture) 476 self.icon:SetTexture(info.texture)
320 self.count:SetText(self.numQuestsHere) 477
478 if (self.numQuestsHere == 0) and (self.numQuestsTotal >= 1) then
479 self.count:SetText('*'..self.numQuestsTotal)
480 self.count:SetTextColor(0,1,1)
481 elseif self.numQuestsHere < self.numQuestsTotal then
482 self.count:SetText(self.numQuestsHere..'+')
483 self.count:SetTextColor(1,1,0)
484 else
485 self.count:SetText(self.numQuestsHere)
486 self.count:SetTextColor(1,1,1)
487 end
488
321 self.cVar = info.cVar 489 self.cVar = info.cVar
322
323 self.itemTexture = self.texture 490 self.itemTexture = self.texture
324 491
325 self:ClearAllPoints() 492 self:ClearAllPoints()
326 if self.isFirst then 493 if self.isFirst then
327 self:SetPoint('TOPRIGHT', self.relativeFrame, 'TOPRIGHT', -5, -42) 494 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPLEFT', HEADERS_SPACING, -HEADERS_SPACING)
328 else 495 else
329 self:SetPoint('TOPLEFT', self.relativeFrame, 'BOTTOMLEFT', 0, -(self.spacing or 0)) 496 self:SetPoint('LEFT', self.relativeFrame, 'RIGHT', BUTTONS_SPACING, 0)
330 end 497 end
331 print('anchor', self.relativeFrame:IsShown(), self:GetPoint(1)) 498 --print('anchor', self.relativeFrame:IsShown(), self:GetPoint(1))
332 499
333 self.icon:SetDesaturated(self.numQuestsHere == 0) 500 self.icon:SetDesaturated(self.numQuestsHere == 0)
334 501
335 local r, g, b, a = 0,0,0,1 502 local r, g, b, a = 0,0,0,1
336 local desaturated = false 503 local desaturated = false
337 if (self.numQuestsHere > 0) then 504 if (self.numQuestsHere > 0) or db.UsedFilters[self.filterKey] then
505
338 if self.cVar then 506 if self.cVar then
339 if GetCVarBool(self.cVar) then 507 if GetCVarBool(self.cVar) then
340 self.count:SetTextColor(1,1,1) 508 --self.count:SetTextColor(1,1,1)
341 r,g,b,a = 0, 0, 0, 1 509 r,g,b,a = 0, 0, 0, 1
342 else 510 else
343 self:GetParent().cvarFiltersDirty = true 511 filtersUsed = true
344 self.count:SetTextColor(1,0,0) 512 --self.count:SetTextColor(1,0,0)
345 self.icon:SetDesaturated(true) 513 self.icon:SetDesaturated(true)
346 r,g,b,a = 1, 0, 0, 0.5 514 r,g,b,a = 1, 0, 0, 0.5
347 end 515 end
348 else 516 else
349 if db.UsedFilters[self.filterKey] then 517 if db.UsedFilters[self.filterKey] then
518 filtersUsed = true
350 if db.UsedFilters[self.filterKey] == self.filterValue then 519 if db.UsedFilters[self.filterKey] == self.filterValue then
351 self.count:SetTextColor(0,1,0) 520 --self.count:SetTextColor(0,1,0)
352 r, g, b = 0, 1, 0 521 r, g, b = 0, 1, 0
353 else 522 else
354 self.count:SetTextColor(1,0,0) 523 --self.count:SetTextColor(1,0,0)
355 r, g, b = 1, 0, 0 524 r, g, b = 1, 0, 0
356 end 525 end
357 else 526 else
358 527
359 self.count:SetTextColor(1,1,1) 528 --self.count:SetTextColor(1,1,1)
360 if self.filterKey == 'worldQuestType' then 529 if self.filterKey == 'worldQuestType' then
361 r, g, b = 0, 0, 1 530 r, g, b = 0, 0, 1
362 elseif self.filterKey == 'factionID' then 531 elseif self.filterKey == 'factionID' then
363 r, g, b = 1, 1, 0 532 r, g, b = 1, 1, 0
364 end 533 end
373 542
374 function Pin:OnLoad() 543 function Pin:OnLoad()
375 self:RegisterForClicks('AnyUp') 544 self:RegisterForClicks('AnyUp')
376 self:SetFrameStrata('HIGH') 545 self:SetFrameStrata('HIGH')
377 self:SetFrameLevel(151) 546 self:SetFrameLevel(151)
378 self:SetScript('OnUpdate', nil)
379 self.questList = {} 547 self.questList = {}
380 -- WORLD_MAP_UPDATE and PLAYER_ENTERING_WORLD are passed down from a higher level 548 -- WORLD_MAP_UPDATE and PLAYER_ENTERING_WORLD are passed down from a higher level
381 end 549 end
382 550
383 function Pin:OnUpdate () 551 function Pin:OnUpdate ()
552 local group = self:GetParent()
553 if group:IsMouseOver() and barMouseOver then
554 group.Backdrop:Show()
555 group.Label:Show()
556 else
557 group.Backdrop:Hide()
558 group.Label:Hide()
559 end
384 end 560 end
385 561
386 -- shift-click: reset filter 562 -- shift-click: reset filter
387 -- click: rotate through include(1), exclude(-1), ignore(nil) 563 -- click: rotate through include(1), exclude(-1), ignore(nil)
388 local filtered_report = {} 564 local filtered_report = {}
434 SetCVar(cVar, 1) 610 SetCVar(cVar, 1)
435 end 611 end
436 612
437 -- check the visible filters and consider it clean if they're all lit 613 -- check the visible filters and consider it clean if they're all lit
438 parent.cvarFiltersDirty = false 614 parent.cvarFiltersDirty = false
439 for i, info in ipairs(parent.filterList) do 615 for i, info in ipairs(db.FilterList) do
440 if info.cVar and (#info.questList >= 1) then 616 if info.cVar and (#info.GlobalMatches >= 1) then
441 print(info.cVar, GetCVarBool(info.cVar)) 617 print(info.cVar, GetCVarBool(info.cVar))
442 if GetCVarBool(info.cVar) == false then 618 if GetCVarBool(info.cVar) == false then
443 parent.cvarFiltersDirty = true 619 parent.cvarFiltersDirty = true
444 print('|cFFFF4400still dirty') 620 print('|cFFFF4400still dirty')
445 break 621 break
474 if #filtered_report >= 1 then 650 if #filtered_report >= 1 then
475 --WorldPlan:print('Setting filter(s):', table.concat(filtered_report, ', ')) 651 --WorldPlan:print('Setting filter(s):', table.concat(filtered_report, ', '))
476 end 652 end
477 WorldPlan:Refresh(true) 653 WorldPlan:Refresh(true)
478 end 654 end
655 function ToggleButton:OnEnter()
656
657 GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
658 GameTooltip:AddLine('Toggle Pins')
659 GameTooltip:Show()
660 end
661 function ToggleButton:OnLeave()
662
663 if GameTooltip:IsOwned(self) then
664 GameTooltip:Hide()
665 end
666 end
667 function ToggleButton:OnShow()
668 self:SetChecked(db.Config.EnablePins and true or false)
669 end
670 function ToggleButton:OnHide()
671 if GameTooltip:IsOwned(self) then
672 GameTooltip:Hide()
673 end
674
675 end
676 function ToggleButton:OnClick()
677 --print(self:GetChecked())
678 db.Config.EnablePins = self:GetChecked()
679 _G.WorldPlan:OnConfigUpdate()
680 end