Mercurial > wow > worldplan
comparison WorldPlan.lua @ 9:a2b623043970 v1.0-rc
WorldQuests:
- Filter interface controls reworked: Left-Click toggles inclusive filtering, right-click toggle exclusion, and holding ctrl or shift will flip or reset the other filters of that type respectively.
- Fix QuestPOI texture masks disappearing when toggling filter options
* new masks aren't applied until SetTexture() is called, making a seemingly redundant call necessary for the change to manifest
- Implemented configuration data storage and retrieval; tracking menu options should actually do something now.
- Ignore remaining time for Profession quests that aren't part of the player's profession loadout
- Alternate tooltip data appears for Pet Battle quests involved in the Family Familar achievement. A list of outstanding criteria is provided in the POI tooltip, and the quest name is highlighted in the filter tooltip.
ClassPlan:
- actually handle the mission complete icon
author | Nenue |
---|---|
date | Sun, 23 Oct 2016 17:18:31 -0400 |
parents | 802abb8a10ea |
children | 06c9a30d48da |
comparison
equal
deleted
inserted
replaced
8:802abb8a10ea | 9:a2b623043970 |
---|---|
20 local WorldPlan = WorldPlanCore | 20 local WorldPlan = WorldPlanCore |
21 local QuestPOI = WorldPlanPOIMixin | 21 local QuestPOI = WorldPlanPOIMixin |
22 local FilterPin = WorldPlanFilterPinMixin | 22 local FilterPin = WorldPlanFilterPinMixin |
23 local WP_VERSION = "1.0" | 23 local WP_VERSION = "1.0" |
24 | 24 |
25 local db | |
25 local print = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end | 26 local print = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end |
26 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end | 27 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end |
27 local iprint = DEVIAN_WORKSPACE and function(...) _G.print('ItemScan', ...) end or function() end | 28 local iprint = DEVIAN_WORKSPACE and function(...) _G.print('ItemScan', ...) end or function() end |
29 local wqprint = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end | |
30 local fbprint = DEVIAN_WORKSPACE and function(...) _G.print('FilterBar', ...) end or function() end | |
28 | 31 |
29 local wipe, tremove, tinsert, pairs, floor, tContains = table.wipe, table.remove, table.insert, pairs, floor, tContains | 32 local wipe, tremove, tinsert, pairs, floor, tContains = table.wipe, table.remove, table.insert, pairs, floor, tContains |
30 local TQ_GetQuestInfoByQuestID = C_TaskQuest.GetQuestInfoByQuestID -- Return the name of a quest with a given ID | 33 local TQ_GetQuestInfoByQuestID = C_TaskQuest.GetQuestInfoByQuestID -- Return the name of a quest with a given ID |
31 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented | 34 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented |
32 local TQ_GetQuestTimeLeftMinutes = C_TaskQuest.GetQuestTimeLeftMinutes | 35 local TQ_GetQuestTimeLeftMinutes = C_TaskQuest.GetQuestTimeLeftMinutes |
47 | 50 |
48 local GetCurrentMapAreaID, GetMapNameByID, GetSuperTrackedQuestID = GetCurrentMapAreaID, GetMapNameByID, GetSuperTrackedQuestID | 51 local GetCurrentMapAreaID, GetMapNameByID, GetSuperTrackedQuestID = GetCurrentMapAreaID, GetMapNameByID, GetSuperTrackedQuestID |
49 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo | 52 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo |
50 | 53 |
51 | 54 |
52 local SearchFaction | |
53 local PinBaseIndex = 1600 | 55 local PinBaseIndex = 1600 |
54 local ShowAllProfessionQuests = false | |
55 local DisplayContinentSummary = true | |
56 local DisplayContinentPins = true | |
57 local NotifyWhenNewQuests = true | |
58 local PinRewardFilter, PinTagFilter | |
59 local BROKEN_ISLES_ID, DALARAN_ID, AZSUNA_ID, VALSHARAH_ID, HIGHMOUNTAIN_ID, STORMHEIM_ID, SURAMAR_ID, EOA_ID = 1007, 1014, 1015,1018, 1024, 1017, 1033, 1096 | 56 local BROKEN_ISLES_ID, DALARAN_ID, AZSUNA_ID, VALSHARAH_ID, HIGHMOUNTAIN_ID, STORMHEIM_ID, SURAMAR_ID, EOA_ID = 1007, 1014, 1015,1018, 1024, 1017, 1033, 1096 |
60 | 57 |
61 -- maps where we do our own anchors | 58 -- maps where we do our own anchors |
62 local CONTINENT_MAPS = { [BROKEN_ISLES_ID] = BROKEN_ISLES_ID, } | 59 local CONTINENT_MAPS = { [BROKEN_ISLES_ID] = BROKEN_ISLES_ID, } |
63 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", | 60 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", |
64 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } | 61 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } |
65 -- default color templates | 62 -- default color templates |
66 local ARTIFACT_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_ARTIFACT] | 63 local ARTIFACT_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_ARTIFACT] |
67 local MONEY_COLOR = {hex ='|cFFFFFF00', r=1, g=1, b=0} | 64 local MONEY_COLOR = {hex ='|cFFFFFF00', r=1, g=1, b=0} |
68 local COMMON_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_COMMON] | 65 local COMMON_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_COMMON] |
69 | |
70 -- operating flags | |
71 local superTrackedID | |
72 local currentMapName | |
73 local hasNewQuestPins | |
74 local isContinentMap | |
75 | 66 |
76 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark" | 67 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark" |
77 local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" | 68 local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" |
78 | 69 |
79 local POI_BORDER_MASK = "Interface\\Minimap\\UI-Minimap-Background" | 70 local POI_BORDER_MASK = "Interface\\Minimap\\UI-Minimap-Background" |
162 --continentBorder = 1, | 153 --continentBorder = 1, |
163 --zoneBorder = 1, | 154 --zoneBorder = 1, |
164 } | 155 } |
165 | 156 |
166 | 157 |
158 | |
159 local defaults = { | |
160 defaultPinStyle = POI_DEFAULT_TYPE, | |
161 rewardStyle = POI_REWARD_TYPE, | |
162 filterStyle = POI_FILTER_STYLE, | |
163 ShowAllProfessionQuests = true, | |
164 DisplayContinentSummary = true, | |
165 DisplayContinentPins = true, | |
166 NotifyWhenNewQuests = true, | |
167 EnablePins = true, | |
168 FadeWhileGrouped = true, | |
169 } | |
170 | |
167 -- Summary header structure | 171 -- Summary header structure |
168 local POI_FILTER_OPTIONS = { | 172 local POI_FILTER_OPTIONS = { |
169 { label = 'Filters', texture = "Interface\\WorldMap\\WorldMap-Icon" }, | 173 { label = 'Filters', texture = "Interface\\WorldMap\\WorldMap-Icon" }, |
170 { filterKey= 'rewardType', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" }, | 174 { filterKey= 'rewardType', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" }, |
171 { filterKey= 'rewardType', filterValue = REWARD_CURRENCY,label = 'Currency', texture = "Interface\\ICONS\\inv_misc_elvencoins" }, | 175 { filterKey= 'rewardType', filterValue = REWARD_CURRENCY,label = 'Currency', texture = "Interface\\ICONS\\inv_misc_elvencoins" }, |
174 { filterKey= 'rewardType', filterValue = REWARD_REAGENT, label = 'Reagents', texture = 1417744 }, | 178 { filterKey= 'rewardType', filterValue = REWARD_REAGENT, label = 'Reagents', texture = 1417744 }, |
175 { filterKey= 'rewardType', filterValue = REWARD_CASH, label = 'Reagents', texture = ICON_MONEY }, | 179 { filterKey= 'rewardType', filterValue = REWARD_CASH, label = 'Reagents', texture = ICON_MONEY }, |
176 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 }, | 180 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 }, |
177 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", }, | 181 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", }, |
178 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_DUNGEON, label = 'Dungeon', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", }, | 182 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_DUNGEON, label = 'Dungeon', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", }, |
183 { filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\ICONS\\70_professions_scroll_02", }, | |
179 } | 184 } |
180 WorldPlanCore.BrokenIsleID = BROKEN_ISLES_ID | 185 WorldPlanCore.BrokenIsleID = BROKEN_ISLES_ID |
181 WorldPlanCore.FilterOptions = POI_FILTER_OPTIONS | |
182 WorldPlanCore.FilterStyle = POI_FILTER_STYLE | 186 WorldPlanCore.FilterStyle = POI_FILTER_STYLE |
183 | 187 |
184 | 188 WorldPlanCore.FilterOptions = {} |
189 | |
190 | |
191 -- operating flags | |
192 local superTrackedID | |
193 local currentMapName | |
194 local hasNewQuestPins | |
195 local isContinentMap | |
185 local numPins = 0 | 196 local numPins = 0 |
186 local QuestsByZone = {} | 197 local QuestsByZone = {} |
187 local QuestsByFaction = {} | 198 local QuestsByFaction = {} |
188 local QuestsByReward = {} | 199 local QuestsByReward = {} |
189 local QuestsByTag = {} | 200 local QuestsByTag = {} |
190 local QuestsByID = {} | 201 local QuestsByID = {} |
191 local QuestPositions = {} | 202 local QuestPositions = {} |
192 local FilterInclusions = {rewardType = {}, worldQuestType = {}} | 203 local FilterInclusions = {rewardType = {}, worldQuestType = {}, factionID = {}} |
193 local FilterExclusions = {rewardType = {}, worldQuestType = {} } | 204 local FilterExclusions = {rewardType = {}, worldQuestType = {}, factionID = {}} |
194 local NotificationTypes = {} | 205 local NotificationTypes = {} |
195 local ZoneInfo = {} | 206 local ZoneInfo = {} |
196 local SummaryHeaders = {} | 207 local SummaryHeaders = {} |
197 WorldPlanCore.QuestsByID = QuestsByID | |
198 WorldPlanCore.QuestsByZone = QuestsByZone | |
199 | 208 |
200 local FreePins = {} | 209 local FreePins = {} |
201 local NumPinFrames = 1 | 210 local NumPinFrames = 1 |
202 | 211 |
203 local hasPendingQuestData | 212 local hasPendingQuestData |
204 local notifyPlayed | 213 local notifyPlayed |
205 local scanner, wmtt, WorldMapPOIFrame | 214 local scanner, wmtt, WorldMapPOIFrame |
206 | 215 |
216 WorldPlanCore.QuestsByID = QuestsByID | |
217 WorldPlanCore.QuestsByZone = QuestsByZone | |
207 | 218 |
208 local tasksQueue = {} | 219 local tasksQueue = {} |
209 local function OnNext (func) | 220 local function OnNext (func) |
210 if #tasksQueue == 0 then | 221 if #tasksQueue == 0 then |
211 _G.WorldPlan:SetScript('OnUpdate', function() | 222 _G.WorldPlan:SetScript('OnUpdate', function() |
297 WorldPlanData[key] = nil | 308 WorldPlanData[key] = nil |
298 else | 309 else |
299 WorldPlanData[key] = true | 310 WorldPlanData[key] = true |
300 end | 311 end |
301 end | 312 end |
313 WorldPlan:RefreshAll() | |
302 end | 314 end |
303 | 315 |
304 function WorldPlan:print(...) | 316 function WorldPlan:print(...) |
305 local msg | 317 local msg |
306 for i = 1, select('#', ...) do | 318 for i = 1, select('#', ...) do |
327 self:RegisterEvent("ADDON_LOADED") | 339 self:RegisterEvent("ADDON_LOADED") |
328 | 340 |
329 WorldPlan.modules = { | 341 WorldPlan.modules = { |
330 WorldQuests, FilterBar, WorldPlanFlightMapMixin, | 342 WorldQuests, FilterBar, WorldPlanFlightMapMixin, |
331 } | 343 } |
332 hooksecurefunc("UIDropDownMenu_Initialize", self.OnDropDownInitialize) | |
333 end | 344 end |
334 | 345 |
335 function WorldPlan:OnEvent (event, ...) | 346 function WorldPlan:OnEvent (event, ...) |
336 print() | 347 print() |
337 print(event, ...) | 348 print(event, ...) |
344 end | 355 end |
345 if IsLoggedIn() and not self.initialized then | 356 if IsLoggedIn() and not self.initialized then |
346 self:Setup() | 357 self:Setup() |
347 end | 358 end |
348 elseif event == 'WORLD_MAP_UPDATE' then | 359 elseif event == 'WORLD_MAP_UPDATE' then |
360 self.currentMapID = GetCurrentMapAreaID() | |
349 self:RefreshAll() | 361 self:RefreshAll() |
350 end | 362 end |
351 for i, module in ipairs(self.modules) do | 363 for i, module in ipairs(self.modules) do |
352 if module.OnEvent then | 364 if module.OnEvent then |
353 print('forwarding to', tostring(module)) | 365 print('forwarding to', tostring(module)) |
361 if not WorldPlanData then | 373 if not WorldPlanData then |
362 WorldPlanData = {key = 0 } | 374 WorldPlanData = {key = 0 } |
363 end | 375 end |
364 WorldPlanData.key = (WorldPlanData.key or 0) + 1 | 376 WorldPlanData.key = (WorldPlanData.key or 0) + 1 |
365 self.db = WorldPlanData | 377 self.db = WorldPlanData |
378 self.db.WorldQuests = self.db.WorldQuests or {} | |
379 db = self.db | |
380 for k,v in pairs(defaults) do | |
381 db[k] = v | |
382 end | |
383 | |
384 self.currentMapID = GetCurrentMapAreaID() | |
366 | 385 |
367 for i, module in ipairs(self.modules) do | 386 for i, module in ipairs(self.modules) do |
387 module.db = self.db | |
368 if module.Setup then module:Setup() end | 388 if module.Setup then module:Setup() end |
369 if not module.RegisterEvent then | 389 if not module.RegisterEvent then |
370 module.RegisterEvent = self.RegisterEvent | 390 module.RegisterEvent = self.RegisterEvent |
371 end | 391 end |
372 end | 392 end |
373 self.initialized = true | 393 self.initialized = true |
374 | 394 |
395 hooksecurefunc("UIDropDownMenu_Initialize", self.OnDropDownInitialize) | |
375 end | 396 end |
376 | 397 |
377 function WorldPlan:RefreshAll (forced) | 398 function WorldPlan:RefreshAll (forced) |
399 if not self.initialized then | |
400 return | |
401 end | |
402 | |
403 POI_DEFAULT_TYPE = db.defaultPinStyle | |
404 POI_REWARD_TYPE = db.rewardStyle | |
405 POI_FILTER_STYLE = db.filterStyle | |
406 | |
407 | |
408 for i, module in ipairs(self.modules) do | |
409 if module.Reset then | |
410 print(module, 'Reset()') | |
411 module:Reset() | |
412 end | |
413 end | |
414 | |
378 for i, module in ipairs(self.modules) do | 415 for i, module in ipairs(self.modules) do |
379 if module.Refresh then | 416 if module.Refresh then |
417 print(module, 'Refresh()') | |
380 module:Refresh() | 418 module:Refresh() |
419 end | |
420 end | |
421 | |
422 for i, module in ipairs(self.modules) do | |
423 if module.Cleanup then | |
424 print(module, 'Cleanup()') | |
425 module:Cleanup() | |
381 end | 426 end |
382 end | 427 end |
383 end | 428 end |
384 function WorldPlan:UpdateAnchors () | 429 function WorldPlan:UpdateAnchors () |
385 for i, module in ipairs(self.modules) do | 430 for i, module in ipairs(self.modules) do |
392 -- insert visual options into the tracking button menu | 437 -- insert visual options into the tracking button menu |
393 WorldPlan.OnDropDownInitialize = function (self, callback, dropType) | 438 WorldPlan.OnDropDownInitialize = function (self, callback, dropType) |
394 if self ~= WorldMapFrameDropDown then | 439 if self ~= WorldMapFrameDropDown then |
395 return | 440 return |
396 end | 441 end |
442 local db = WorldPlan.db | |
397 | 443 |
398 local info = UIDropDownMenu_CreateInfo() | 444 local info = UIDropDownMenu_CreateInfo() |
399 info.text = "" | 445 info.text = "" |
400 info.isTitle = true | 446 info.isTitle = true |
401 UIDropDownMenu_AddButton(info) | 447 UIDropDownMenu_AddButton(info) |
405 info.isTitle = nil | 451 info.isTitle = nil |
406 info.disabled = nil | 452 info.disabled = nil |
407 info.keepShownOnClick = true | 453 info.keepShownOnClick = true |
408 info.tooltipOnButton = 1 | 454 info.tooltipOnButton = 1 |
409 | 455 |
410 info.text = "Hidden World Quests" | 456 info.text = "Enable" |
457 info.isNotRadio = true | |
458 info.value = "EnablePins" | |
459 info.checked = db.EnablePins | |
460 info.tooltipTitle = "Enable World Quest Overlays" | |
461 info.tooltipText = "Toggle the detail layers here." | |
462 info.func = DropDown_OnClick | |
463 UIDropDownMenu_AddButton(info) | |
464 | |
465 info.text = "Display All Profession Quests" | |
411 info.isNotRadio = true | 466 info.isNotRadio = true |
412 info.value = "ShowAllProfessionQuests" | 467 info.value = "ShowAllProfessionQuests" |
413 info.checked = ShowAllProfessionQuests | 468 info.checked = db.ShowAllProfessionQuests |
414 info.tooltipTitle = "Hidden Quests" | 469 info.tooltipTitle = "Hidden Quests" |
415 info.tooltipText = "Display work order and profession-related quests that are skipped by the default UI." | 470 info.tooltipText = "Display work order and profession-related quests that are skipped by the default UI." |
416 info.func = DropDown_OnClick | 471 info.func = DropDown_OnClick |
417 UIDropDownMenu_AddButton(info) | 472 UIDropDownMenu_AddButton(info) |
418 | 473 |
419 info.text = "Show Continent Pins" | 474 info.text = "Show Continent Pins" |
420 info.isNotRadio = true | 475 info.isNotRadio = true |
421 info.value = "DisplayContinentPins" | 476 info.value = "DisplayContinentPins" |
422 info.checked = DisplayContinentPins | 477 info.checked = db.DisplayContinentPins |
423 info.tooltipTitle = "Continent Pins" | 478 info.tooltipTitle = "Continent Pins" |
424 info.tooltipText = "Display quest pins on the continent map (may get cramped)." | 479 info.tooltipText = "Display quest pins on the continent map (may get cramped)." |
425 info.func = DropDown_OnClick | 480 info.func = DropDown_OnClick |
426 UIDropDownMenu_AddButton(info) | 481 UIDropDownMenu_AddButton(info) |
427 | 482 |
428 info.text = "Show Summary" | 483 info.text = "Show Summary" |
429 info.isNotRadio = true | 484 info.isNotRadio = true |
430 info.value = "DisplayContinentSummary" | 485 info.value = "DisplayContinentSummary" |
431 info.tooltipTitle = "Summary Bar" | 486 info.tooltipTitle = "Summary Bar" |
432 info.tooltipText = "Display a summary of active world quests. Note: requires directly viewing Broken Isle and Dalaran maps to gain complete info." | 487 info.tooltipText = "Display a summary of active world quests. Note: requires directly viewing Broken Isle and Dalaran maps to gain complete info." |
433 info.checked = DisplayContinentSummary | 488 info.checked = db.DisplayContinentSummary |
489 info.func = DropDown_OnClick | |
490 UIDropDownMenu_AddButton(info) | |
491 | |
492 info.text = "Fade In Groups" | |
493 info.isNotRadio = true | |
494 info.value = "FadeWhileGrouped" | |
495 info.tooltipTitle = "Group Fade" | |
496 info.tooltipText = "Reduce pin alpha when grouped, so player dots are easier to see." | |
497 info.checked = db.DisplayContinentSummary | |
434 info.func = DropDown_OnClick | 498 info.func = DropDown_OnClick |
435 UIDropDownMenu_AddButton(info) | 499 UIDropDownMenu_AddButton(info) |
436 end | 500 end |
437 | 501 |
438 function WorldQuests:Setup() | 502 function WorldQuests:Setup() |
439 -- refresh positions any time blizzard does so (i.e. mousewheel zoom) | 503 -- refresh positions any time blizzard does so (i.e. mousewheel zoom) |
440 hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function() | 504 hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function() |
441 self:Refresh() | 505 self:Refresh(true) |
442 end) | 506 end) |
443 | 507 |
444 -- hide the original world quest POIs | 508 -- hide the original world quest POIs |
445 hooksecurefunc("WorldMap_UpdateQuestBonusObjectives", function() | 509 hooksecurefunc("WorldMap_UpdateQuestBonusObjectives", function() |
446 for i = 1, NUM_WORLDMAP_TASK_POIS do | 510 for i = 1, NUM_WORLDMAP_TASK_POIS do |
448 if button and button.worldQuest then | 512 if button and button.worldQuest then |
449 button:Hide() | 513 button:Hide() |
450 end | 514 end |
451 end | 515 end |
452 end) | 516 end) |
453 | |
454 | 517 |
455 end | 518 end |
456 | 519 |
457 function WorldQuests:OnEvent (event, ...) | 520 function WorldQuests:OnEvent (event, ...) |
458 print('|cFFFFFF00'..tostring(self)..':OnEvent()'..event..'|r', ...) | 521 print('|cFFFFFF00'..tostring(self)..':OnEvent()'..event..'|r', ...) |
467 local questID = ... | 530 local questID = ... |
468 if questID and QuestsByID[questID] then | 531 if questID and QuestsByID[questID] then |
469 self:ReleasePin(QuestsByID[questID]) | 532 self:ReleasePin(QuestsByID[questID]) |
470 end | 533 end |
471 elseif event == 'SKILL_LINES_CHANGED' then | 534 elseif event == 'SKILL_LINES_CHANGED' then |
472 self:Refresh() | 535 self:Refresh(true) |
473 end | 536 end |
474 end | 537 end |
475 | 538 |
476 function WorldQuests:AcquirePin (questID, pinTable) | 539 function WorldQuests:AcquirePin (questID, pinTable) |
477 local pin = QuestsByID[questID] | 540 local pin = QuestsByID[questID] |
539 print('|cFFFF4400Clearing out', pin:GetName(),id) | 602 print('|cFFFF4400Clearing out', pin:GetName(),id) |
540 end | 603 end |
541 | 604 |
542 -- create of update quest pins for a map and its underlying zones | 605 -- create of update quest pins for a map and its underlying zones |
543 function WorldQuests:GetPinsForMap (mapID) | 606 function WorldQuests:GetPinsForMap (mapID) |
607 local print = wqprint | |
544 mapID = mapID or GetCurrentMapAreaID() | 608 mapID = mapID or GetCurrentMapAreaID() |
545 superTrackedID = GetSuperTrackedQuestID() | 609 superTrackedID = GetSuperTrackedQuestID() |
546 if not mapID then | 610 if not mapID then |
547 -- info not available yet | 611 -- info not available yet |
548 return | 612 return |
573 end | 637 end |
574 end | 638 end |
575 end | 639 end |
576 if hasNewQuestPins and not self.fullSearch then | 640 if hasNewQuestPins and not self.fullSearch then |
577 print('|cFF00FF00NEW PINS DO ANCHOR THINGS') | 641 print('|cFF00FF00NEW PINS DO ANCHOR THINGS') |
578 self:Refresh () | 642 self:Refresh (true) |
579 hasNewQuestPins = nil | 643 hasNewQuestPins = nil |
580 end | 644 end |
581 end | 645 end |
582 | 646 |
583 -- create or update the pin using the given questID and C_TaskQuest results | 647 -- create or update the pin using the given questID and C_TaskQuest results |
597 if not HaveQuestData(questID) then | 661 if not HaveQuestData(questID) then |
598 print('|cFFFF4400Retrieval failed.') | 662 print('|cFFFF4400Retrieval failed.') |
599 TQ_RequestPreloadRewardData(questID) | 663 TQ_RequestPreloadRewardData(questID) |
600 hasPendingQuestData = true | 664 hasPendingQuestData = true |
601 else | 665 else |
602 print('|cFF00FF88HaveQuestData|r') | 666 wqprint('|cFF00FF88Quest Data Received|r') |
603 pin.mapID = pin.mapID or C_TaskQuest.GetQuestZoneID(questID) | 667 pin.mapID = pin.mapID or C_TaskQuest.GetQuestZoneID(questID) |
604 | 668 |
605 -- set reward category | 669 -- set reward category |
606 local numRewards = GetNumQuestLogRewards(questID) | 670 local numRewards = GetNumQuestLogRewards(questID) |
607 local numCurrency = GetNumQuestLogRewardCurrencies(questID) | 671 local numCurrency = GetNumQuestLogRewardCurrencies(questID) |
686 end | 750 end |
687 return QuestsByID[questID] | 751 return QuestsByID[questID] |
688 end | 752 end |
689 | 753 |
690 function WorldQuests:Refresh(forced) | 754 function WorldQuests:Refresh(forced) |
691 print('pushing |cFF00FF88'..tostring(self)..':Refresh()|r') | 755 local print = wqprint |
756 print('|cFF00FF88'..tostring(self)..':Refresh()|r') | |
692 if not WorldMapPOIFrame:IsVisible() then | 757 if not WorldMapPOIFrame:IsVisible() then |
693 return | 758 return |
694 end | 759 end |
695 self:Reset() | 760 if forced then |
761 self:Reset() | |
762 end | |
696 self:UpdateAnchors() | 763 self:UpdateAnchors() |
697 self:Cleanup () | 764 |
765 if forced then | |
766 self:Cleanup () | |
767 end | |
698 end | 768 end |
699 | 769 |
700 -- prepares elements for a map update | 770 -- prepares elements for a map update |
701 function WorldQuests:Reset () | 771 function WorldQuests:Reset () |
772 local print = wqprint | |
773 print('|cFF00FF88'..tostring(self)..':Reset()|r') | |
702 wipe(QuestPositions) | 774 wipe(QuestPositions) |
703 wipe(QuestsByReward) | 775 wipe(QuestsByReward) |
704 wipe(QuestsByTag) | 776 wipe(QuestsByTag) |
705 for questID, pin in pairs(QuestsByID) do | 777 for questID, pin in pairs(QuestsByID) do |
706 pin.used = nil | 778 pin.used = nil |
707 end | 779 end |
708 qprint(tostring(self)..':|cFFFFFF00Reset()|r') | |
709 end | 780 end |
710 | 781 |
711 -- update visibility states of all pins | 782 -- update visibility states of all pins |
712 function WorldQuests:UpdateAnchors (submapID) | 783 function WorldQuests:UpdateAnchors (submapID) |
784 local print = wqprint | |
785 local db = WorldPlan.db | |
713 local mapFileName, textureHeight, textureWidth, isMicroDungeon, microDungeonMapName = GetMapInfo() | 786 local mapFileName, textureHeight, textureWidth, isMicroDungeon, microDungeonMapName = GetMapInfo() |
714 if isMicroDungeon then | 787 if isMicroDungeon then |
715 return | 788 return |
716 end | 789 end |
717 | 790 |
718 local currentMap = GetCurrentMapAreaID() | 791 local currentMap = GetCurrentMapAreaID() |
719 local submapID = submapID or currentMap | 792 local submapID = submapID or currentMap |
720 | 793 |
721 if submapID == BROKEN_ISLES_ID and (not DisplayContinentPins) then | 794 if submapID == BROKEN_ISLES_ID and (not db.DisplayContinentPins) then |
722 print('not updating map for reasons') | 795 print('not updating map for reasons') |
723 return | 796 return |
724 end | 797 end |
725 print('|cFF88FF00'..tostring(self)..':UpdateAnchors|r', submapID, GetMapNameByID(submapID), 'pin count:', numPins) | 798 print('|cFF88FF00'..tostring(self)..':UpdateAnchors|r', submapID, GetMapNameByID(submapID), 'pin count:', numPins) |
726 local numZones = MC_GetNumZones(submapID) | 799 local numZones = MC_GetNumZones(submapID) |
734 | 807 |
735 if pins then | 808 if pins then |
736 local hostFrame = WorldMapPOIFrame | 809 local hostFrame = WorldMapPOIFrame |
737 local mapWidth, mapHeight = hostFrame:GetSize() | 810 local mapWidth, mapHeight = hostFrame:GetSize() |
738 for questID, pin in pairs(pins) do | 811 for questID, pin in pairs(pins) do |
739 if pin:IsShowable(true) then | 812 pin:IsShowable() |
740 pin:SetFrameLevel(PinBaseIndex+numPins) | 813 if pin.used then |
814 pin:SetFrameLevel(PinBaseIndex+ (pin.whiteListed and 200 or 0) +numPins) | |
815 print('level', PinBaseIndex+ (pin.whiteListed and 200 or 0) +numPins) | |
741 pin:SetAnchor(WorldMapPOIFrame, currentMap, mapWidth, mapHeight) | 816 pin:SetAnchor(WorldMapPOIFrame, currentMap, mapWidth, mapHeight) |
742 pin.used = true | |
743 numPins = numPins + 1 | 817 numPins = numPins + 1 |
744 end | 818 end |
745 end | 819 end |
746 end | 820 end |
747 end | 821 end |
748 | |
749 | |
750 | |
751 | 822 |
752 -- shows, animates, or hides pins based on their current visibility flags | 823 -- shows, animates, or hides pins based on their current visibility flags |
753 local debug_show = {} | 824 local debug_show = {} |
754 local debug_animate = {} | 825 local debug_animate = {} |
755 local debug_hide = {} | 826 local debug_hide = {} |
756 function WorldQuests:Cleanup () | 827 function WorldQuests:Cleanup () |
757 local showQuestPOI = GetCVarBool("questPOI") | 828 local print = wqprint |
829 local showQuestPOI = db.EnablePins | |
758 print('|cFFFFFF00'..tostring(self)..':Cleanup()|r') | 830 print('|cFFFFFF00'..tostring(self)..':Cleanup()|r') |
759 wipe(QuestsByReward) | 831 local mapID = GetCurrentMapAreaID() |
760 wipe(QuestsByTag) | 832 isContinentMap = (mapID == BROKEN_ISLES_ID) |
833 | |
761 wipe(debug_show) | 834 wipe(debug_show) |
762 wipe(debug_animate) | 835 wipe(debug_animate) |
763 wipe(debug_hide) | 836 wipe(debug_hide) |
764 local mapID = GetCurrentMapAreaID() | |
765 isContinentMap = (mapID == BROKEN_ISLES_ID) | |
766 | |
767 -- continent or zone sizing | 837 -- continent or zone sizing |
768 local subStyle = isContinentMap and 'continent' or 'zone' | 838 local fadeGrouped = (db.FadeWhileGrouped and IsInGroup()) |
769 | 839 |
770 numPins = 0 | 840 numPins = 0 |
771 for questID, pin in pairs(QuestsByID) do | 841 for questID, pin in pairs(QuestsByID) do |
772 -- can we show it? | 842 -- can we show it? |
773 if showQuestPOI and (pin.used) then | 843 if showQuestPOI and (pin.used) then |
774 pin.subStyle = pin.filtered and 'minimized' or subStyle | 844 pin:Refresh() |
775 pin:GetSizeMetrics() | 845 |
776 | 846 if fadeGrouped then |
777 | 847 pin:SetAlpha(0.25) |
848 else | |
849 pin:SetAlpha(1) | |
850 end | |
778 -- is it a new quest? | 851 -- is it a new quest? |
779 if pin.isNew then | 852 if pin.isNew then |
780 if not pin.isAnimating then | 853 if not pin.isAnimating then |
781 pin.isAnimating = true | 854 pin.isAnimating = true |
782 OnNext(function() | 855 OnNext(function() |
791 PlaySoundKitID(23404) | 864 PlaySoundKitID(23404) |
792 end | 865 end |
793 end | 866 end |
794 end | 867 end |
795 tinsert(debug_animate,questID) | 868 tinsert(debug_animate,questID) |
869 else | |
870 | |
871 print('animating? ', questID, 'filtered:', pin.filtered) | |
796 end | 872 end |
797 -- trap new but animating pins here | 873 -- trap new but animating pins here |
798 else | 874 else |
799 -- hard show existing pin | 875 -- hard show existing pin |
876 print('refresh #', questID, 'filtered:', pin.filtered) | |
800 pin:Show() | 877 pin:Show() |
801 tinsert(debug_show,questID) | 878 tinsert(debug_show,questID) |
802 end | 879 end |
803 else | 880 else |
881 if pin:IsShown() then | |
882 tinsert(debug_hide,questID) | |
883 end | |
884 pin.isAnimating = nil | |
885 pin.FadeIn:Stop() | |
804 pin:Hide() | 886 pin:Hide() |
805 tinsert(debug_hide,questID) | |
806 end | |
807 | |
808 -- is it part of the current map? | |
809 if pin.used then | |
810 local rewardType = pin.rewardType | |
811 local tagType = pin.worldQuestType | |
812 if rewardType then | |
813 QuestsByReward[rewardType] = QuestsByReward[rewardType] or {} | |
814 tinsert(QuestsByReward[rewardType], pin) | |
815 end | |
816 if tagType then | |
817 QuestsByTag[tagType] = QuestsByTag[tagType] or {} | |
818 tinsert(QuestsByTag[tagType], pin) | |
819 end | |
820 end | 887 end |
821 end | 888 end |
822 print(' adding:', table.concat(debug_animate, ',' )) | 889 print(' adding:', table.concat(debug_animate, ',' )) |
823 print(' showing:', table.concat(debug_show, ',' )) | 890 print(' refresh:', table.concat(debug_show, ',' )) |
891 print(' hiding:', table.concat(debug_hide, ',' )) | |
824 hasNewQuestPins = nil | 892 hasNewQuestPins = nil |
825 notifyPlayed = nil | 893 notifyPlayed = nil |
826 end | 894 end |
827 | 895 |
828 -- data provider manipulations for the taxi map | 896 -- data provider manipulations for the taxi map |
869 local GetTime, mod = GetTime, mod | 937 local GetTime, mod = GetTime, mod |
870 | 938 |
871 | 939 |
872 | 940 |
873 | 941 |
874 function QuestPOI:Refresh () | 942 function WorldQuests:FilterCheckByID(questID) |
875 print('|cFF00FF88["'..tostring(self.title)..'"]|r:Refresh()', tostring(self.title), "|T"..tostring(self.itemTexture)..":12:12|t", tostring(self.itemName)) | 943 local pin = WorldQuests:GetPinByQuestID(questID) |
876 qprint(self.style) | 944 return pin:IsShowable() |
877 | 945 end |
878 local questID = self.questId | 946 |
879 local style = self.style | 947 |
880 local borderMask = style.mask | 948 function QuestPOI:IsShowable () |
881 local borderFill = style.texture | 949 local print = wqprint |
882 local iconBorder = self.iconBorder | 950 local db = WorldPlan.db |
883 local icon = self.icon | |
884 local count = self.count | |
885 | |
886 --WorldPlan:print(tostring(self.title), "|T"..tostring(self.itemTexture)..":16:16|t", tostring(self.itemName)) | |
887 SetMaskedTexture(icon, self.itemTexture or ICON_UNKNOWN, borderMask) | |
888 icon:SetAllPoints(self) | |
889 | |
890 if self.itemName then | |
891 local color = self.rewardColor or COMMON_COLOR | |
892 if self.itemNumber and self.target then | |
893 self.count:SetText(color.hex .. tostring(self.itemNumber)) | |
894 else | |
895 self.count:SetText(nil) | |
896 end | |
897 end | |
898 | |
899 SetMaskedTexture(iconBorder, borderFill, borderMask) | |
900 local border = (self.rewardType and POI_REWARD_TYPE[self.rewardType]) or (WORLD_QUEST_QUALITY_COLORS[self.rarity] or COMMON_COLOR) | |
901 iconBorder:SetVertexColor(border.r, border.g, border.b, border.a) | |
902 iconBorder:SetDesaturated(true) | |
903 | |
904 local trackingBorder = self.supertrackBorder | |
905 | |
906 self.highlight:SetMask(nil) | |
907 if questID == GetSuperTrackedQuestID() then | |
908 trackingBorder:SetVertexColor(0,0,0,1) | |
909 else | |
910 trackingBorder:SetVertexColor(0,0,0,0.5) | |
911 end | |
912 self.highlight:SetAllPoints(trackingBorder) | |
913 | |
914 SetMaskedTexture(trackingBorder, borderFill, borderMask) | |
915 self.highlight:SetMask(borderMask) | |
916 | |
917 local qType = self.worldQuestType | |
918 self.tagIcon:SetAtlas(self.tagAtlas) | |
919 self.tagIcon:SetTexCoord(0,1,0,1) | |
920 | |
921 | |
922 if self.isElite then | |
923 self.EliteDecal:Show() | |
924 else | |
925 self.EliteDecal:Hide() | |
926 end | |
927 | |
928 if style.showNumber then | |
929 self.label:SetText(self.itemNumber) | |
930 else | |
931 self.label:SetText(nil) | |
932 end | |
933 qprint('|cFF88FF00updated', questID, self.title, self.rewardType, (style.showNumber and self.itemNumber) or '') | |
934 end | |
935 | |
936 | |
937 | |
938 | |
939 function QuestPOI:IsShowable (ignoreFilters) | |
940 local qType = self.worldQuestType | 951 local qType = self.worldQuestType |
941 local rType = self.rewardType | 952 local rType = self.rewardType |
942 self.filtered = nil | 953 self.filtered = nil |
943 print(' |cFFFF4400IsShowable()|r', self.tradeskillLineIndex, self.title) | 954 self.whiteListed = nil |
955 self.used = true | |
956 | |
944 | 957 |
945 local whiteListed, blackListed | 958 local whiteListed, blackListed |
946 for filterKey, includes in pairs(FilterInclusions) do | 959 for filterKey, includes in pairs(FilterInclusions) do |
947 local controlValue = self[filterKey] | 960 local controlValue = self[filterKey] |
948 if FilterInclusions[filterKey][controlValue] then | 961 if FilterInclusions[filterKey][controlValue] then |
949 whiteListed = true | 962 self.filtered = nil |
963 self.whiteListed = true | |
950 break | 964 break |
951 end | 965 end |
952 if FilterExclusions[filterKey][controlValue] then | 966 if FilterExclusions[filterKey][controlValue] then |
953 blackListed = true | 967 self.filtered = true |
954 end | 968 end |
955 end | 969 end |
956 print(blackListed, whiteListed) | |
957 self.filtered = (blackListed and (not whiteListed)) | |
958 | 970 |
959 if not TQ_IsActive(self.questID) then | 971 if not TQ_IsActive(self.questID) then |
960 print(' quest is dead') | 972 self.used = nil |
961 return false | |
962 end | 973 end |
963 if qType == LE_QUEST_TAG_TYPE_PROFESSION then | 974 if qType == LE_QUEST_TAG_TYPE_PROFESSION then |
964 | 975 if not (db.ShowAllProfessionQuests or (self.tradeskillLineIndex and GetProfessionInfo(self.tradeskillLineIndex))) then |
965 if not (ShowAllProfessionQuests or (self.tradeskillLineIndex and GetProfessionInfo(self.tradeskillLineIndex))) then | 976 self.used = nil |
966 print(' non-profession') | 977 end |
967 return false | 978 end |
968 end | 979 print(' |cFFFF4400IsShowable()|r', self.used, self.filtered, self.title) |
969 end | 980 return self.used, self.filtered |
970 return true | |
971 end | 981 end |
972 | 982 |
973 function QuestPOI:UpdateTimer (timeLeft, timeType) | 983 function QuestPOI:UpdateTimer (timeLeft, timeType) |
974 print('|cFF0088FFUpdatePinTimer()|r') | 984 print('|cFF0088FFUpdatePinTimer()|r') |
975 end | 985 end |
976 | 986 |
977 --- Re-acquires size information and triggers things | 987 --- Fixes icons upon size update |
978 function QuestPOI:GetSizeMetrics (style, subStyle) | 988 function QuestPOI:UpdateSize (style, subStyle) |
979 self.style = self.style or POI_DEFAULT_TYPE | 989 self.style = self.style or POI_DEFAULT_TYPE |
980 self.subStyle = self.subStyle or 'continent' | 990 self.subStyle = self.subStyle or 'continent' |
981 | 991 |
982 style = style or self.style | 992 style = style or self.style |
983 subStyle = style[subStyle or self.subStyle] | 993 subStyle = style[subStyle or self.subStyle] |
989 self.tagSize = subStyle.TagSize | 999 self.tagSize = subStyle.TagSize |
990 self.TimeleftStage = subStyle.TimeleftStage | 1000 self.TimeleftStage = subStyle.TimeleftStage |
991 self.NoIcon = subStyle.NoIcon | 1001 self.NoIcon = subStyle.NoIcon |
992 | 1002 |
993 self:SetSize(self.currentWidth, self.currentWidth) | 1003 self:SetSize(self.currentWidth, self.currentWidth) |
994 end | 1004 |
995 | |
996 -- triggered by OnSizeChanged script | |
997 function QuestPOI:OnSizeChanged () | |
998 local iconBorder = self.iconBorder | 1005 local iconBorder = self.iconBorder |
999 local trackingBorder = self.supertrackBorder | 1006 local trackingBorder = self.supertrackBorder |
1000 local tag = self.tagIcon | 1007 local tag = self.tagIcon |
1001 local style = self.style or POI_DEFAULT_TYPE | 1008 local style = self.style or POI_DEFAULT_TYPE |
1002 local mask = style.mask or POI_BORDER_FILL | 1009 local mask = style.mask or POI_BORDER_FILL |
1023 tag:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', borderWidth, -borderWidth) | 1030 tag:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', borderWidth, -borderWidth) |
1024 else | 1031 else |
1025 tag:Hide() | 1032 tag:Hide() |
1026 end | 1033 end |
1027 | 1034 |
1035 --qprint('using mask:', mask, self.name ) | |
1028 self.icon:SetMask(mask) | 1036 self.icon:SetMask(mask) |
1037 self.icon:SetTexture(self.icon:GetTexture()) | |
1029 self.iconBorder:SetMask(mask) | 1038 self.iconBorder:SetMask(mask) |
1030 self.supertrackBorder:SetMask(mask) | 1039 self.supertrackBorder:SetMask(mask) |
1031 | 1040 |
1032 if self.NoIcon then | 1041 if self.NoIcon then |
1033 self.icon:Hide() | 1042 self.icon:Hide() |
1056 end | 1065 end |
1057 end | 1066 end |
1058 return passesFilter | 1067 return passesFilter |
1059 end | 1068 end |
1060 | 1069 |
1070 | |
1071 local bountyIndex | |
1061 local debug_headers = {} | 1072 local debug_headers = {} |
1062 function FilterBar:Refresh() | 1073 |
1063 local mapID = GetCurrentMapAreaID() | 1074 function FilterBar:Setup() |
1075 self:GetFilters() | |
1076 end | |
1077 | |
1078 function FilterBar:OnEvent(event,...) | |
1079 if event == 'QUEST_LOG_UPDATE' then | |
1080 self:Reset() | |
1081 self:Refresh() | |
1082 end | |
1083 end | |
1084 | |
1085 function FilterBar:GetFilters() | |
1086 | |
1087 local print = fbprint | |
1088 wipe(WorldPlan.FilterOptions) | |
1089 | |
1090 for index, info in ipairs(POI_FILTER_OPTIONS) do | |
1091 tinsert(WorldPlan.FilterOptions, info) | |
1092 end | |
1093 self.bounties, self.numBounties = GetQuestBountyInfoForMapID(WorldPlan.currentMapID) | |
1094 self.BountyFilters = {} | |
1095 for index, data in ipairs(self.bounties) do | |
1096 local info = self.BountyFilters[index] | |
1097 if not info then | |
1098 info = {} | |
1099 self.BountyFilters[index] = info | |
1100 end | |
1101 | |
1102 local questTitle = GetQuestLogTitle(GetQuestLogIndexByID(data.questID)) | |
1103 | |
1104 info.filterKey = 'factionID' | |
1105 info.filterValue = data.factionID | |
1106 info.label = questTitle | |
1107 info.texture = data.icon | |
1108 print('loading emissary', questTitle) | |
1109 tinsert(WorldPlan.FilterOptions, info) | |
1110 --{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", }, | |
1111 end | |
1112 end | |
1113 | |
1114 function FilterBar:Reset() | |
1115 self:GetFilters() | |
1116 end | |
1117 | |
1118 function FilterBar:Refresh(forced) | |
1119 local print = fbprint | |
1064 local blocks = self.SummaryHeaders | 1120 local blocks = self.SummaryHeaders |
1121 local relativeFrame = WorldMapFrame.UIElementsFrame.TrackingOptionsButton | |
1065 local numHeaders = 0 | 1122 local numHeaders = 0 |
1066 local lastButton | 1123 print('|cFF00FF88'..tostring(self)..':Refresh()|r', 'currentMap=',WorldPlan.currentMapID) |
1067 local pinSize, borderSize, trackingSize = 20, 2, 2 | 1124 |
1068 print('|cFF00FF88'..tostring(self)..':Refresh()|r') | 1125 |
1069 for index, info in pairs(POI_FILTER_OPTIONS) do | 1126 local quests = QuestsByZone[WorldPlan.currentMapID] or QuestsByID |
1127 | |
1128 | |
1129 for index, info in ipairs(WorldPlan.FilterOptions) do | |
1070 local numQuests = 0 | 1130 local numQuests = 0 |
1071 local quests = QuestsByZone[mapID] or QuestsByID | |
1072 | 1131 |
1073 for questID, pin in pairs(quests) do | 1132 for questID, pin in pairs(quests) do |
1074 if pin.used then | 1133 if pin.used then |
1075 if not info.filterKey then | 1134 if not info.filterKey then |
1076 numQuests = numQuests + 1 | 1135 numQuests = numQuests + 1 |
1077 elseif pin[info.filterKey] == info.filterValue then | 1136 elseif pin[info.filterKey] == info.filterValue then |
1078 numQuests = numQuests + 1 | 1137 numQuests = numQuests + 1 |
1079 end | 1138 end |
1080 end | 1139 end |
1081 end | 1140 end |
1082 print(tostring(index).. ' ("'..tostring(info.label)..'"'.. tostring(rewardFilter).. ', '..tostring(tagFilter) .. ', '..tostring(numQuests)..')') | 1141 print(tostring(index).. ' ("'..tostring(info.label)..'" f('.. tostring(info.filterKey).. '='..tostring(info.filterValue) .. '), '..tostring(numQuests)..')') |
1083 | 1142 |
1084 if numQuests >= 1 then | 1143 if numQuests >= 1 then |
1085 numHeaders = numHeaders + 1 | 1144 numHeaders = numHeaders + 1 |
1086 local button = blocks[numHeaders] | 1145 local button = blocks[numHeaders] |
1087 if not blocks[numHeaders] then | 1146 if not blocks[numHeaders] then |
1094 button.supertrackBorder:SetDesaturated(true) | 1153 button.supertrackBorder:SetDesaturated(true) |
1095 blocks[numHeaders] = button | 1154 blocks[numHeaders] = button |
1096 end | 1155 end |
1097 | 1156 |
1098 button:SetID(index) | 1157 button:SetID(index) |
1099 button.lastButton = lastButton | 1158 button.spacing = ((info.filterKey ~= relativeFrame.filterKey) and 10) or 0 |
1159 button.relativeFrame = relativeFrame | |
1100 button:Refresh(info, (numHeaders == 1), numQuests) | 1160 button:Refresh(info, (numHeaders == 1), numQuests) |
1101 button:Show() | 1161 button:Show() |
1102 lastButton = button | 1162 print(' using', button.label:GetText()) |
1103 end | 1163 relativeFrame = button |
1104 | 1164 end |
1105 end | 1165 |
1166 end | |
1167 | |
1168 self.numHeaders = numHeaders | |
1169 for i = numHeaders + 1, #WorldPlan.FilterOptions do | |
1170 if self.SummaryHeaders[i] then | |
1171 self.SummaryHeaders[i]:Hide() | |
1172 end | |
1173 end | |
1174 end | |
1175 | |
1176 function FilterBar:Cleanup() | |
1177 | |
1106 -- hide trailing buttons | 1178 -- hide trailing buttons |
1107 for i = numHeaders + 1, #POI_FILTER_OPTIONS do | |
1108 if blocks[i] then | |
1109 blocks[i]:Hide() | |
1110 end | |
1111 end | |
1112 end | 1179 end |
1113 | 1180 |
1114 | 1181 |
1115 function FilterPin:Refresh(info, isFirst, numQuests) | 1182 function FilterPin:Refresh(info, isFirst, numQuests) |
1116 info = info or POI_FILTER_OPTIONS[self:GetID()] | 1183 local print = fbprint |
1117 isFirst = isFirst or self.isFirst | 1184 isFirst = isFirst or self.isFirst |
1118 numQuests = numQuests or self.numQuests | 1185 numQuests = numQuests or self.numQuests |
1119 | 1186 |
1120 self.isFirst = isFirst | 1187 if info then |
1121 self.numQuests = numQuests | 1188 self.isFirst = isFirst |
1122 self.filterKey = info.filterKey | 1189 self.numQuests = numQuests |
1123 self.filterValue = info.filterValue | 1190 self.filterKey = info.filterKey |
1124 self.tagID = info.tagID | 1191 self.filterValue = info.filterValue |
1125 | 1192 self.tagID = info.tagID |
1126 self.icon:ClearAllPoints() | 1193 |
1127 self.icon:SetTexture(info.texture) | 1194 self.icon:ClearAllPoints() |
1128 self.icon:SetAllPoints(self) | 1195 self.icon:SetTexture(info.texture) |
1129 self.supertrackBorder:Hide() | 1196 self.icon:SetAllPoints(self) |
1130 self.label:SetText(numQuests) | 1197 self.supertrackBorder:Hide() |
1131 self:Show() | 1198 self.label:SetText(numQuests) |
1132 | 1199 self:Show() |
1200 end | |
1201 | |
1202 | |
1203 self.itemTexture = self.texture | |
1133 | 1204 |
1134 if isFirst then | 1205 if isFirst then |
1135 self:SetPoint('TOP', WorldMapFrame.UIElementsFrame.TrackingOptionsButton, 'BOTTOM', 0, -5) | 1206 self:SetPoint('TOP', self.relativeFrame, 'BOTTOM', 0, -5) |
1136 else | 1207 else |
1137 self:SetPoint('TOPRIGHT', self.lastButton, 'BOTTOMRIGHT', 0, -(3*2 + 1 + (info.spacing or 0))) | 1208 self:SetPoint('TOPRIGHT', self.relativeFrame, 'BOTTOMRIGHT', 0, -(3*2 + 1 + (self.spacing or 0))) |
1138 end | 1209 |
1139 | 1210 end |
1140 print(self.filterKey, self.filterValue) | 1211 print('anchor to', self.relativeFrame:GetName()) |
1212 | |
1141 local r, g, b, a = 1,1,1,1 | 1213 local r, g, b, a = 1,1,1,1 |
1142 if self.filterKey then | 1214 if self.filterKey then |
1143 if FilterInclusions[self.filterKey][self.filterValue] == true then | 1215 if FilterInclusions[self.filterKey][self.filterValue] == true then |
1144 r, g, b = 0, 1, 0 | 1216 r, g, b = 0, 1, 0 |
1145 elseif FilterExclusions[self.filterKey][self.filterValue] then | 1217 elseif FilterExclusions[self.filterKey][self.filterValue] then |
1146 r, g, b = 1, 0, 0 | 1218 r, g, b = 1, 0, 0 |
1147 end | 1219 end |
1148 end | 1220 end |
1149 self.iconBorder:SetVertexColor(r, g, b, a) | 1221 self.iconBorder:SetVertexColor(r, g, b, a) |
1150 | 1222 self:UpdateSize() |
1151 | |
1152 self:GetSizeMetrics() | |
1153 end | 1223 end |
1154 | 1224 |
1155 function FilterPin:OnLoad() | 1225 function FilterPin:OnLoad() |
1156 self:RegisterForClicks('AnyUp') | 1226 self:RegisterForClicks('AnyUp') |
1157 self:SetFrameStrata('HIGH') | 1227 self:SetFrameStrata('HIGH') |
1170 end | 1240 end |
1171 | 1241 |
1172 -- shift-click: reset filter | 1242 -- shift-click: reset filter |
1173 -- click: rotate through include(1), exclude(-1), ignore(nil) | 1243 -- click: rotate through include(1), exclude(-1), ignore(nil) |
1174 function FilterPin:OnClick (button) | 1244 function FilterPin:OnClick (button) |
1245 local print = fbprint | |
1175 local filterKey = self.filterKey | 1246 local filterKey = self.filterKey |
1176 local filterValue = self.filterValue | 1247 local filterValue = self.filterValue |
1177 | 1248 |
1178 print('click', filterKey, filterValue) | 1249 |
1250 local operation = opPrefix | |
1251 local setExclude = (button == 'RightButton') | |
1252 local filterTable = setExclude and FilterExclusions or FilterInclusions | |
1253 local opposingTable = setExclude and FilterInclusions or FilterExclusions | |
1254 | |
1179 | 1255 |
1180 if not filterKey then | 1256 if not filterKey then |
1181 -- resetting | 1257 -- resetting |
1182 for k,v in pairs(FilterInclusions) do | 1258 for k,v in pairs(FilterInclusions) do |
1183 wipe(v) | 1259 wipe(v) |
1184 end | 1260 end |
1185 for k,v in pairs(FilterExclusions) do | 1261 for k,v in pairs(FilterExclusions) do |
1186 wipe(v) | 1262 wipe(v) |
1187 end | 1263 end |
1188 else | 1264 else |
1189 local setExclude = (button == 'RightButton') | 1265 |
1190 if IsControlKeyDown() then | 1266 if filterTable[filterKey][filterValue] then |
1191 if setExclude then | 1267 filterTable[filterKey][filterValue] = nil |
1192 if FilterExclusions[filterKey][filterValue] then | 1268 else |
1193 FilterExclusions[filterKey][filterValue] = nil | 1269 filterTable[filterKey][filterValue] = true |
1194 else | 1270 opposingTable[filterKey][filterValue] = nil |
1195 FilterExclusions[filterKey][filterValue] = true | 1271 end |
1272 | |
1273 local overrideFilters = IsControlKeyDown() | |
1274 local overrideOpposing = IsShiftKeyDown() | |
1275 | |
1276 for k, info in ipairs(POI_FILTER_OPTIONS) do | |
1277 if (info.filterKey == filterKey) and (info.filterValue ~= filterValue) then | |
1278 if overrideFilters then | |
1279 filterTable[info.filterKey][info.filterValue] = nil | |
1280 opposingTable[info.filterKey][info.filterValue] = true | |
1281 elseif overrideOpposing then | |
1282 filterTable[info.filterKey][info.filterValue] = nil | |
1283 opposingTable[info.filterKey][info.filterValue] = nil | |
1284 end | |
1196 end | 1285 end |
1197 FilterInclusions[filterKey][filterValue] = nil | 1286 end |
1198 else | 1287 |
1199 if FilterInclusions[filterKey][filterValue] == true then | 1288 |
1200 FilterInclusions[filterKey][filterValue] = nil | 1289 end |
1201 else | 1290 |
1202 FilterInclusions[filterKey][filterValue] = true | 1291 print('|cFF00FF88Filter Update:', filterKey, filterValue, operation) |
1203 end | |
1204 FilterExclusions[filterKey][filterValue] = nil | |
1205 end | |
1206 elseif IsShiftKeyDown() then | |
1207 FilterInclusions[filterKey][filterValue] = nil | |
1208 FilterExclusions[filterKey][filterValue] = nil | |
1209 else | |
1210 print('limit to', filterKey, filterValue) | |
1211 if setExclude then | |
1212 FilterExclusions[filterKey][filterValue] = true | |
1213 FilterInclusions[filterKey][filterValue] = nil | |
1214 else | |
1215 FilterInclusions[filterKey][filterValue] = true | |
1216 FilterExclusions[filterKey][filterValue] = nil | |
1217 end | |
1218 | |
1219 for k, info in ipairs(POI_FILTER_OPTIONS) do | |
1220 if info.filterKey and ((info.filterKey ~= filterKey) or (info.filterValue ~= filterValue)) then | |
1221 if setExclude then | |
1222 FilterExclusions[info.filterKey][info.filterValue] = nil | |
1223 FilterInclusions[info.filterKey][info.filterValue] = true | |
1224 else | |
1225 FilterExclusions[info.filterKey][info.filterValue] = true | |
1226 FilterInclusions[info.filterKey][info.filterValue] = nil | |
1227 end | |
1228 | |
1229 end | |
1230 end | |
1231 | |
1232 end | |
1233 end | |
1234 | |
1235 | 1292 |
1236 WorldPlan:RefreshAll() | 1293 WorldPlan:RefreshAll() |
1237 end | 1294 end |
1238 | 1295 |
1239 --%debug% | 1296 --%debug% |