Mercurial > wow > worldplan
comparison WorldPlan.lua @ 30:8cb750e79952
WorldPlan:
- Reworking filters to utilize newly added CVars
| author | Nenue |
|---|---|
| date | Fri, 28 Oct 2016 14:06:07 -0400 |
| parents | c1612c2c1840 |
| children | d0114b51cdea |
comparison
equal
deleted
inserted
replaced
| 29:c1612c2c1840 | 30:8cb750e79952 |
|---|---|
| 1 -- Veneer | |
| 2 -- WorldPlan.lua | 1 -- WorldPlan.lua |
| 3 -- Created: 8/16/2016 8:19 AM | 2 -- Created: 8/16/2016 8:19 AM |
| 4 -- %file-revision% | 3 -- %file-revision% |
| 5 --[[ | 4 |
| 6 Summary: | 5 local addonName, db = ... |
| 7 Adds reward icons to the world quest POI markers, and adds said markers to the continent map. | |
| 8 | |
| 9 Issues: | |
| 10 Dalaran quests aren't visible until that map has been specifically viewed by the player. | |
| 11 --]] | |
| 12 | 6 |
| 13 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark" | 7 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark" |
| 14 local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" | 8 local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" |
| 15 | 9 |
| 16 local POI_BORDER_MASK = "Interface\\Minimap\\UI-Minimap-Background" | 10 local POI_BORDER_MASK = "Interface\\Minimap\\UI-Minimap-Background" |
| 20 local POI_BORDER_YELLOW = "Interface\\BUTTONS\\YELLOWORANGE64" | 14 local POI_BORDER_YELLOW = "Interface\\BUTTONS\\YELLOWORANGE64" |
| 21 local POI_BORDER_GREEN = "Interface\\BUTTONS\\GREENGRAD64" | 15 local POI_BORDER_GREEN = "Interface\\BUTTONS\\GREENGRAD64" |
| 22 | 16 |
| 23 WorldPlanCore = { | 17 WorldPlanCore = { |
| 24 defaults = {}, | 18 defaults = {}, |
| 25 | 19 modules = {}, |
| 20 } | |
| 21 WorldPlanQuestsMixin = { | |
| 22 QuestsByZone = {}, | |
| 23 QuestsByID = {}, | |
| 24 freePins = {}, | |
| 26 } | 25 } |
| 27 WorldPlanPOIMixin = {} | 26 WorldPlanPOIMixin = {} |
| 28 WorldPlanFilterPinMixin = {} | 27 WorldPlanFilterPinMixin = setmetatable({ QuestsByID = {}, freePins = {} }, {__tostring = function() return 'QuestHandler' end}) |
| 29 local WorldPlanFlightMapMixin = setmetatable({}, {__tostring = function() return 'FlightMapHandler' end}) | 28 local WorldPlanFlightMapMixin = setmetatable({}, {__tostring = function() return 'FlightMapHandler' end}) |
| 30 local WorldQuests = setmetatable({ QuestsByID = {}, freePins = {} }, {__tostring = function() return 'QuestHandler' end}) | 29 local WorldQuests = WorldPlanQuestsMixin |
| 31 local FilterBar = setmetatable({ SummaryHeaders = {} }, {__tostring = function() return 'FilterBar' end}) | 30 |
| 32 | 31 |
| 33 local WorldPlan = WorldPlanCore | 32 local WorldPlan = WorldPlanCore |
| 34 local QuestPOI = WorldPlanPOIMixin | 33 local QuestPOI = WorldPlanPOIMixin |
| 35 local FilterPin = WorldPlanFilterPinMixin | 34 local FilterPin = WorldPlanFilterPinMixin |
| 36 local WP_VERSION = "1.0" | 35 local WP_VERSION = "1.0" |
| 60 | 59 |
| 61 local GetCurrentMapAreaID, GetMapNameByID, GetSuperTrackedQuestID = GetCurrentMapAreaID, GetMapNameByID, GetSuperTrackedQuestID | 60 local GetCurrentMapAreaID, GetMapNameByID, GetSuperTrackedQuestID = GetCurrentMapAreaID, GetMapNameByID, GetSuperTrackedQuestID |
| 62 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo | 61 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo |
| 63 | 62 |
| 64 | 63 |
| 65 local PinBaseIndex = 1600 | |
| 66 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 | |
| 67 | |
| 68 -- maps where we do our own anchors | |
| 69 local CONTINENT_MAPS = { [BROKEN_ISLES_ID] = BROKEN_ISLES_ID, } | |
| 70 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", | |
| 71 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } | |
| 72 -- default color templates | 64 -- default color templates |
| 73 local ARTIFACT_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_ARTIFACT] | 65 local ARTIFACT_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_ARTIFACT] |
| 74 local MONEY_COLOR = {hex ='|cFFFFFF00', r=1, g=1, b=0} | 66 local MONEY_COLOR = {hex ='|cFFFFFF00', r=1, g=1, b=0} |
| 75 local COMMON_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_COMMON] | 67 local COMMON_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_COMMON] |
| 76 local DEFAULT_TYPE = { | 68 local DEFAULT_TYPE = { |
| 80 desaturated = true, | 72 desaturated = true, |
| 81 pinMask = POI_BORDER_MASK, | 73 pinMask = POI_BORDER_MASK, |
| 82 rewardMask = POI_BORDER_MASK, | 74 rewardMask = POI_BORDER_MASK, |
| 83 texture = POI_BORDER_FILL, | 75 texture = POI_BORDER_FILL, |
| 84 continent = { | 76 continent = { |
| 85 PinSize = 18, | 77 PinSize = 14, |
| 86 Border = 3, | 78 Border = 2, |
| 87 TrackingBorder = 2, | 79 TrackingBorder = 1, |
| 88 TagSize = 6, | 80 TagSize = 6, |
| 89 TimeleftStage = 3, | 81 TimeleftStage = 0, |
| 90 showNumber = true, | 82 showNumber = true, |
| 83 numberFontObject = 'WorldPlanFont' | |
| 91 }, | 84 }, |
| 92 zone = { | 85 zone = { |
| 93 PinSize = 22, | 86 PinSize = 22, |
| 94 Border = 3, | 87 Border = 3, |
| 95 TrackingBorder = 2, | 88 TrackingBorder = 2, |
| 96 TagSize = 12, | 89 TagSize = 12, |
| 97 TimeleftStage = 3, | 90 TimeleftStage = 3, |
| 98 showNumber = true, | 91 showNumber = true, |
| 92 numberFontObject = 'WorldPlanNumberFontThin' | |
| 99 }, | 93 }, |
| 100 minimized = { | 94 minimized = { |
| 101 PinSize = 4, | 95 PinSize = 4, |
| 102 Border = 1, | 96 Border = 0, |
| 103 TrackingBorder = 2, | 97 TrackingBorder = 1, |
| 104 NoIcon = true, | 98 NoIcon = true, |
| 105 TimeleftStage = 1, | 99 TimeleftStage = 1, |
| 106 showNumber = false, | 100 showNumber = false, |
| 107 } | 101 } |
| 108 } | 102 } |
| 163 local superTrackedID | 157 local superTrackedID |
| 164 local currentMapName | 158 local currentMapName |
| 165 local hasNewQuestPins | 159 local hasNewQuestPins |
| 166 local isContinentMap | 160 local isContinentMap |
| 167 local numPins = 0 | 161 local numPins = 0 |
| 168 local QuestsByZone = {} | |
| 169 local QuestsByFaction = {} | |
| 170 local QuestsByReward = {} | |
| 171 local QuestsByTag = {} | |
| 172 local QuestsByID = {} | |
| 173 local QuestPositions = {} | |
| 174 local FilterInclusions = {rewardType = {}, worldQuestType = {}, factionID = {}} | 162 local FilterInclusions = {rewardType = {}, worldQuestType = {}, factionID = {}} |
| 175 local NotificationTypes = {} | 163 local NotificationTypes = {} |
| 176 local ZoneInfo = {} | 164 local ZoneInfo = {} |
| 177 local SummaryHeaders = {} | 165 local SummaryHeaders = {} |
| 178 | 166 |
| 181 | 169 |
| 182 local hasPendingQuestData | 170 local hasPendingQuestData |
| 183 local notifyPlayed | 171 local notifyPlayed |
| 184 local scanner, wmtt, WorldMapPOIFrame | 172 local scanner, wmtt, WorldMapPOIFrame |
| 185 | 173 |
| 186 WorldPlanCore.QuestsByID = QuestsByID | |
| 187 WorldPlanCore.QuestsByZone = QuestsByZone | |
| 188 | 174 |
| 189 local tasksQueue = {} | 175 local tasksQueue = {} |
| 190 local function OnNext (func) | 176 local function OnNext (func) |
| 191 if #tasksQueue == 0 then | 177 if #tasksQueue == 0 then |
| 192 _G.WorldPlan:SetScript('OnUpdate', function() | 178 _G.WorldPlan:SetScript('OnUpdate', function() |
| 200 end) | 186 end) |
| 201 end | 187 end |
| 202 print('inserting task #', #tasksQueue+1, func) | 188 print('inserting task #', #tasksQueue+1, func) |
| 203 tinsert(tasksQueue, func) | 189 tinsert(tasksQueue, func) |
| 204 end | 190 end |
| 205 | |
| 206 -- combines templates | |
| 207 local function DoMixins(frame,...) | |
| 208 for i = 1, select('#', ...) do | |
| 209 for k,v in pairs(select(i,...)) do | |
| 210 frame[k] = v | |
| 211 end | |
| 212 end | |
| 213 return frame | |
| 214 end | |
| 215 | |
| 216 | 191 |
| 217 -- update a masked texture without messing up its blending mask | 192 -- update a masked texture without messing up its blending mask |
| 218 local SetMaskedTexture = function(region, file, mask) | 193 local SetMaskedTexture = function(region, file, mask) |
| 219 mask = mask or POI_BORDER_MASK | 194 mask = mask or POI_BORDER_MASK |
| 220 region:SetMask(nil) | 195 region:SetMask(nil) |
| 241 msg = (msg and (msg .. ' ') or '') .. tostring(select(i, ...)) | 216 msg = (msg and (msg .. ' ') or '') .. tostring(select(i, ...)) |
| 242 end | 217 end |
| 243 DEFAULT_CHAT_FRAME:AddMessage("|cFF0088FFWorldPlan|r: " .. msg) | 218 DEFAULT_CHAT_FRAME:AddMessage("|cFF0088FFWorldPlan|r: " .. msg) |
| 244 end | 219 end |
| 245 | 220 |
| 221 local current_type_owner | |
| 222 function WorldPlan:AddHandler (frame, defaults) | |
| 223 print('|cFFFFFF00'..self:GetName()..':AddHandler()', frame:GetName()) | |
| 224 tinsert(self.modules, frame) | |
| 225 self.defaults[frame] = defaults | |
| 226 frame.GetTypeInfo = function(frame, typeID) | |
| 227 return self:GetTypeInfo(frame, typeID) | |
| 228 end | |
| 229 end | |
| 230 | |
| 246 function WorldPlan:OnLoad () | 231 function WorldPlan:OnLoad () |
| 247 | 232 |
| 248 self.Types = setmetatable({}, { | 233 self.Types = setmetatable({}, { |
| 249 __newindex = function(t, k, v) | 234 __newindex = function(t, k, v) |
| 250 print('adding type', k) | |
| 251 if type(v) == 'table' then | 235 if type(v) == 'table' then |
| 252 v = setmetatable(v, {__index = function(t,k) | 236 print('adding owner', k) |
| 253 print('##deferring to default key', k) | 237 v = setmetatable(v, { |
| 254 return DEFAULT_TYPE[k] | 238 __newindex = function(t2,k2,v2) |
| 239 if type(v2) == 'table' then | |
| 240 print('adding type', k2) | |
| 241 v2 = setmetatable(v2, {__index = function(t3,k3) | |
| 242 --print('##deferring to default key', k3) | |
| 243 return DEFAULT_TYPE[k3] | |
| 244 end}) | |
| 245 end | |
| 246 rawset(t2,k2,v2) | |
| 255 end}) | 247 end}) |
| 256 end | 248 end |
| 257 rawset(t,k,v) | 249 rawset(t,k,v) |
| 258 end | 250 end |
| 259 }) | 251 }) |
| 260 | 252 |
| 261 local rgbWhite = {1, 1, 1} | 253 self.Types[self] = {} |
| 262 self.Types[REWARD_REAGENT] = { r = 0, g = 1, b = 1 } | |
| 263 self.Types[REWARD_ARTIFACT_POWER] = { r = 1, g = .25, b = .5, hasNumeric = true, numberRGB = rgbWhite } | |
| 264 self.Types[REWARD_GEAR] = { r = .1, g = .2, b = 1 } | |
| 265 self.Types[REWARD_CURRENCY] = { r = 1, g = 1, b = 0, hasNumeric = true, numberRGB = rgbWhite, } | |
| 266 self.Types[REWARD_CASH] = { r = 0, g = 0, b = 0, } | |
| 267 | 254 |
| 268 for index, color in pairs(ITEM_QUALITY_COLORS) do | 255 for index, color in pairs(ITEM_QUALITY_COLORS) do |
| 269 self.Types[(index+127)] = { r = color.r, g = color.g, b = color.b, hex = color.hex, } | 256 self:AddTypeInfo(self, index, { r = color.r, g = color.g, b = color.b, hex = color.hex, }) |
| 270 end | 257 end |
| 271 | 258 |
| 272 WorldPlan = self | 259 WorldPlan = self |
| 273 scanner = _G.WorldPlanTooltip | 260 scanner = _G.WorldPlanTooltip |
| 274 wmtt = _G.WorldMapTooltip | 261 wmtt = _G.WorldMapTooltip |
| 283 self:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED") | 270 self:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED") |
| 284 self:RegisterEvent("SKILL_LINES_CHANGED") | 271 self:RegisterEvent("SKILL_LINES_CHANGED") |
| 285 self:RegisterEvent("ARTIFACT_XP_UPDATE") | 272 self:RegisterEvent("ARTIFACT_XP_UPDATE") |
| 286 self:RegisterEvent("ADDON_LOADED") | 273 self:RegisterEvent("ADDON_LOADED") |
| 287 self:SetParent(WorldMapFrame) | 274 self:SetParent(WorldMapFrame) |
| 288 | |
| 289 WorldPlan.modules = { | |
| 290 WorldQuests, FilterBar, WorldPlanFlightMapMixin, | |
| 291 } | |
| 292 end | 275 end |
| 293 | 276 |
| 294 function WorldPlan:OnShow() | 277 function WorldPlan:OnShow() |
| 295 print(self:GetName()..':OnShow()') | 278 print(self:GetName()..':OnShow()') |
| 296 if self.isStale then | 279 if self.isStale then |
| 297 self:RefreshAll() | 280 self:Refresh() |
| 298 end | 281 end |
| 299 | 282 |
| 300 end | 283 end |
| 301 | 284 |
| 302 function WorldPlan:OnEvent (event, ...) | 285 function WorldPlan:OnEvent (event, ...) |
| 312 if IsLoggedIn() and not self.initialized then | 295 if IsLoggedIn() and not self.initialized then |
| 313 self:Setup() | 296 self:Setup() |
| 314 end | 297 end |
| 315 elseif event == 'WORLD_MAP_UPDATE' then | 298 elseif event == 'WORLD_MAP_UPDATE' then |
| 316 self.currentMapID = GetCurrentMapAreaID() | 299 self.currentMapID = GetCurrentMapAreaID() |
| 317 self:RefreshAll() | 300 print('|cFFFF4400currentMapID =', self.currentMapID) |
| 301 self:Refresh() | |
| 318 else | 302 else |
| 319 for i, module in ipairs(self.modules) do | 303 for i, module in ipairs(self.modules) do |
| 320 if module.OnEvent then | 304 if module.OnEvent then |
| 321 print('forwarding to', tostring(module)) | 305 print('forwarding to', tostring(module)) |
| 322 module:OnEvent(event, ...) | 306 module:OnEvent(event, ...) |
| 358 self.initialized = true | 342 self.initialized = true |
| 359 | 343 |
| 360 hooksecurefunc("UIDropDownMenu_Initialize", self.OnDropDownInitialize) | 344 hooksecurefunc("UIDropDownMenu_Initialize", self.OnDropDownInitialize) |
| 361 end | 345 end |
| 362 | 346 |
| 363 function WorldPlan:GetTypeInfo(typeID) | 347 function WorldPlan:AddTypeInfo(owner, id, info) |
| 348 self.Types[owner] = self.Types[owner] or {} | |
| 349 self.Types[owner][id] = info | |
| 350 print('Type('..owner:GetName()..')('..id..') = '.. tostring(info)) | |
| 351 end | |
| 352 | |
| 353 function WorldPlan:GetTypeInfo(owner, typeID) | |
| 364 local info, extraInfo | 354 local info, extraInfo |
| 365 if (not typeID) or (not self.Types[typeID]) then | 355 if not owner then |
| 366 qprint('## sent default type') | 356 --print('## deferring to default type list') |
| 357 else | |
| 358 --print('## pulling for', owner:GetName(), 'id =', typeID) | |
| 359 end | |
| 360 | |
| 361 owner = owner or self | |
| 362 if (not typeID) or (not self.Types[owner][typeID]) then | |
| 363 --print('## sending list default') | |
| 367 info = DEFAULT_TYPE | 364 info = DEFAULT_TYPE |
| 368 else | 365 else |
| 369 qprint('## sent defined type', typeID) | 366 --print('## sent list definition', typeID) |
| 370 info = self.Types[typeID] | 367 info = self.Types[owner][typeID] |
| 371 end | 368 end |
| 372 | 369 |
| 373 if isContinentMap then | 370 if isContinentMap then |
| 374 extraInfo = info.continent | 371 extraInfo = info.continent |
| 375 qprint('### continent subtype', extraInfo) | 372 --print('### continent subtype', extraInfo) |
| 376 else | 373 else |
| 377 extraInfo = info.zone | 374 extraInfo = info.zone |
| 378 | 375 |
| 379 qprint('### zone subtype', extraInfo) | 376 --print('### zone subtype', extraInfo) |
| 380 end | 377 end |
| 381 return info, extraInfo | 378 return info, extraInfo |
| 382 end | 379 end |
| 383 | 380 |
| 384 do | 381 do |
| 411 end | 408 end |
| 412 return nil, nil | 409 return nil, nil |
| 413 end | 410 end |
| 414 end | 411 end |
| 415 | 412 |
| 416 function WorldPlan:RefreshAll (forced) | 413 function WorldPlan:Refresh (forced) |
| 414 print('|cFFFFFF00'..self:GetName()..':Refresh()|r forced:', forced, 'init:', self.initialized) | |
| 417 if not self.initialized then | 415 if not self.initialized then |
| 418 return | 416 return |
| 419 end | 417 end |
| 420 | 418 |
| 421 POI_DEFAULT_TYPE = db.defaultPinStyle | 419 POI_DEFAULT_TYPE = db.defaultPinStyle |
| 515 info.checked = db.DisplayContinentSummary | 513 info.checked = db.DisplayContinentSummary |
| 516 info.func = DropDown_OnClick | 514 info.func = DropDown_OnClick |
| 517 UIDropDownMenu_AddButton(info) | 515 UIDropDownMenu_AddButton(info) |
| 518 end | 516 end |
| 519 | 517 |
| 518 -------------------------------------------------------------------------------------------------------------------- | |
| 519 -------------------------------------------------------------------------------------------------------------------- | |
| 520 | |
| 521 local PinBaseIndex = 1600 | |
| 522 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 | |
| 523 | |
| 524 -- maps where we do our own anchors | |
| 525 local CONTINENT_MAPS = { [BROKEN_ISLES_ID] = BROKEN_ISLES_ID, } | |
| 526 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", | |
| 527 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } | |
| 528 | |
| 520 function WorldQuests:Setup() | 529 function WorldQuests:Setup() |
| 521 | 530 |
| 522 | 531 |
| 523 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do | 532 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do |
| 524 QuestsByZone[mapID] = {} | 533 self.QuestsByZone[mapID] = {} |
| 525 end | 534 end |
| 526 | 535 |
| 527 | 536 |
| 528 -- refresh positions any time blizzard does so (i.e. mousewheel zoom) | 537 -- refresh positions any time blizzard does so (i.e. mousewheel zoom) |
| 529 hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function() | 538 hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function() |
| 540 end | 549 end |
| 541 end) | 550 end) |
| 542 | 551 |
| 543 end | 552 end |
| 544 | 553 |
| 554 local defaults = {} | |
| 555 function WorldQuests:OnLoad() | |
| 556 print('|cFF00FF88'..self:GetName()..':OnLoad') | |
| 557 | |
| 558 WorldPlan:AddHandler(self, defaults) | |
| 559 | |
| 560 local rgbWhite = {1, 1, 1} | |
| 561 WorldPlan:AddTypeInfo(self, REWARD_REAGENT, { r = 0, g = 1, b = 1 }) | |
| 562 WorldPlan:AddTypeInfo(self, REWARD_ARTIFACT_POWER, { r = 1, g = .25, b = .5, hasNumeric = true, numberRGB = rgbWhite }) | |
| 563 WorldPlan:AddTypeInfo(self, REWARD_GEAR, { r = .1, g = .2, b = 1 }) | |
| 564 WorldPlan:AddTypeInfo(self, REWARD_CURRENCY, { r = 1, g = 1, b = 0, hasNumeric = true, numberRGB = {1,1,0}, }) | |
| 565 WorldPlan:AddTypeInfo(self, REWARD_CASH, { r = 0, g = 0, b = 0, }) | |
| 566 | |
| 567 for areaID, fileName in pairs(WORLD_QUEST_MAPS) do | |
| 568 self.QuestsByZone[areaID] = {} | |
| 569 end | |
| 570 | |
| 571 self:RegisterEvent('QUEST_LOG_UPDATE') | |
| 572 self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL') | |
| 573 self:RegisterEvent('SKILL_LINES_CHANGED') | |
| 574 | |
| 575 | |
| 576 end | |
| 577 | |
| 545 function WorldQuests:OnEvent (event, ...) | 578 function WorldQuests:OnEvent (event, ...) |
| 546 print('|cFFFFFF00'..tostring(self)..':OnEvent()'..event..'|r', GetTime(), ...) | 579 local print = wqprint |
| 580 print('|cFFFFFF00'..self:GetName()..':OnEvent()'..event..'|r', GetTime(), ...) | |
| 547 if event == 'QUEST_LOG_UPDATE' then | 581 if event == 'QUEST_LOG_UPDATE' then |
| 548 local questID, added = ... | 582 local questID, added = ... |
| 549 if questID and added then | 583 if questID and added then |
| 550 local questPOI = self:AcquirePin(questID) | 584 local questPOI = self:AcquirePin(questID) |
| 551 self.hasUpdate, self.isPending = questPOI:RefreshData() | 585 self.hasUpdate, self.isPending = questPOI:RefreshData() |
| 552 else | 586 else |
| 553 self:RefreshData() | 587 self:RefreshData() |
| 554 end | 588 end |
| 555 print('WorldMapFrame', WorldMapFrame:IsVisible(), 'doRefresh:', hasNewQuestPins) | 589 print('WorldMapFrame', WorldMapFrame:IsVisible(), 'hasUpdates:', self.hasUpdate) |
| 556 if WorldMapFrame:IsVisible() and hasNewQuestPins then | |
| 557 self:Refresh(true) | |
| 558 end | |
| 559 | |
| 560 elseif event == 'WORLD_QUEST_COMPLETED_BY_SPELL' then | 590 elseif event == 'WORLD_QUEST_COMPLETED_BY_SPELL' then |
| 561 local questID = ... | 591 local questID = ... |
| 562 if questID and QuestsByID[questID] then | 592 if questID and self.QuestsByID[questID] then |
| 563 self:ReleasePin(QuestsByID[questID]) | 593 self:ReleasePin(self.QuestsByID[questID]) |
| 564 end | 594 end |
| 565 elseif event == 'SKILL_LINES_CHANGED' then | 595 elseif event == 'SKILL_LINES_CHANGED' then |
| 596 self.hasUpdate = true | |
| 597 end | |
| 598 end | |
| 599 | |
| 600 function WorldQuests:OnUpdate() | |
| 601 if self.hasUpdate then | |
| 602 wqprint('|cFF00FF00pushing update') | |
| 566 self:Refresh(true) | 603 self:Refresh(true) |
| 567 end | 604 end |
| 568 end | 605 end |
| 606 | |
| 569 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation | 607 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation |
| 570 function WorldQuests:AcquirePin (questID, mapID) | 608 function WorldQuests:AcquirePin (questID, mapID) |
| 571 local pin = QuestsByID[questID] | 609 local pin = self.QuestsByID[questID] |
| 572 local isNew = false | 610 local isNew = false |
| 573 if not pin then | 611 if not pin then |
| 574 isNew = true | 612 isNew = true |
| 575 local numFree = #self.freePins | 613 local numFree = #self.freePins |
| 576 if numFree >= 1 then | 614 if numFree >= 1 then |
| 580 local name = 'WorldPlanQuestMarker' .. NumPinFrames | 618 local name = 'WorldPlanQuestMarker' .. NumPinFrames |
| 581 --print('|cFF00FF00Creating', name) | 619 --print('|cFF00FF00Creating', name) |
| 582 pin = CreateFrame('Frame', name, WorldMapPOIFrame, 'WorldPlanQuestPin') | 620 pin = CreateFrame('Frame', name, WorldMapPOIFrame, 'WorldPlanQuestPin') |
| 583 | 621 |
| 584 pin:SetFrameStrata('HIGH') | 622 pin:SetFrameStrata('HIGH') |
| 623 pin.GetTypeInfo = function(frame, typeID) | |
| 624 return self:GetTypeInfo(typeID) | |
| 625 end | |
| 585 NumPinFrames = NumPinFrames + 1 | 626 NumPinFrames = NumPinFrames + 1 |
| 586 --pin.iconBorder:SetVertexColor(0,0,0,1) | 627 --pin.iconBorder:SetVertexColor(0,0,0,1) |
| 587 end | 628 end |
| 588 pin:SetID(questID) | 629 pin:SetID(questID) |
| 589 pin.isNew = true | 630 pin.isNew = true |
| 591 | 632 |
| 592 -- used by TaskPOI_x scripts | 633 -- used by TaskPOI_x scripts |
| 593 pin.questID = questID | 634 pin.questID = questID |
| 594 pin.worldQuest = true | 635 pin.worldQuest = true |
| 595 | 636 |
| 596 QuestsByID[questID] = pin | 637 self.QuestsByID[questID] = pin |
| 597 else | 638 else |
| 598 --print('|cFF00FF00Using', pin:GetName()) | 639 --print('|cFF00FF00Using', pin:GetName()) |
| 599 end | 640 end |
| 600 mapID = mapID or TQ_GetQuestZoneID(questID) | 641 mapID = mapID or TQ_GetQuestZoneID(questID) |
| 601 QuestsByZone[mapID][questID] = pin | 642 self.QuestsByZone[mapID][questID] = pin |
| 602 | 643 |
| 603 return pin, isNew | 644 return pin, isNew |
| 604 end | 645 end |
| 605 | 646 |
| 606 -- remove from index and add it to the recycling heap | 647 -- remove from index and add it to the recycling heap |
| 607 function WorldQuests:ReleasePin (pin) | 648 function WorldQuests:ReleasePin (pin) |
| 608 | 649 |
| 609 local id = pin.questId | 650 local id = pin.questId |
| 610 if id then | 651 if id then |
| 611 QuestsByID[id] = nil | 652 self.QuestsByID[id] = nil |
| 612 for i, zone in pairs(QuestsByZone) do | 653 for i, zone in pairs(self.QuestsByZone) do |
| 613 print('-', i, zone[i]) | 654 print('-', i, zone[i]) |
| 614 zone[id] = nil | 655 zone[id] = nil |
| 615 end | 656 end |
| 616 end | |
| 617 if pin.factionID then | |
| 618 QuestsByFaction[pin.factionID][id] = nil | |
| 619 end | 657 end |
| 620 pin:Hide() | 658 pin:Hide() |
| 621 pin:ClearAllPoints() | 659 pin:ClearAllPoints() |
| 622 tinsert(self.freePins, pin) | 660 tinsert(self.freePins, pin) |
| 623 print('|cFFFF4400Clearing out', pin:GetName(),id) | 661 print('|cFFFF4400Clearing out', pin:GetName(),id) |
| 630 superTrackedID = GetSuperTrackedQuestID() | 668 superTrackedID = GetSuperTrackedQuestID() |
| 631 if not mapID then | 669 if not mapID then |
| 632 -- info not available yet | 670 -- info not available yet |
| 633 return | 671 return |
| 634 end | 672 end |
| 673 | |
| 674 print('|cFF00FF88'..self:GetName()..':RefreshData()|r', 'map:', mapID, 'realMap:', GetCurrentMapAreaID()) | |
| 675 | |
| 635 if mapID == BROKEN_ISLES_ID then | 676 if mapID == BROKEN_ISLES_ID then |
| 636 self.hasUpdate = false | 677 self.hasUpdate = false |
| 637 print('|cFF00FFFFRefreshQuestsForMap|r', mapID, GetMapNameByID(mapID), superTrackedID) | 678 print('|cFF00FFFFContinent:|r', mapID, GetMapNameByID(mapID), superTrackedID) |
| 638 self.fullSearch = true | 679 self.fullSearch = true |
| 639 for i = 1, MC_GetNumZones(mapID) do | 680 for i = 1, MC_GetNumZones(mapID) do |
| 640 local submapID, name, depth = MC_GetZoneInfo(mapID, i) | 681 local submapID, name, depth = MC_GetZoneInfo(mapID, i) |
| 641 self:RefreshData(submapID) | 682 self:RefreshData(submapID) |
| 642 end | 683 end |
| 643 self.fullSearch = nil | 684 self.fullSearch = nil |
| 644 elseif QuestsByZone[mapID] then | 685 elseif self.QuestsByZone[mapID] then |
| 645 local taskInfo = TQ_GetQuestsForPlayerByMapID(mapID) | 686 local taskInfo = TQ_GetQuestsForPlayerByMapID(mapID) |
| 646 local quest = QuestsByZone[mapID] | |
| 647 local numQuests = 0 | 687 local numQuests = 0 |
| 648 if taskInfo and #taskInfo >= 1 then | 688 if taskInfo and #taskInfo >= 1 then |
| 649 print('|cFF00FFFFRefreshQuestsForMap|r', mapID, GetMapNameByID(mapID), #taskInfo) | 689 print('|cFF00FFFF Zone:|r', mapID, GetMapNameByID(mapID), #taskInfo) |
| 650 wipe(QuestsByZone[mapID]) | 690 wipe(self.QuestsByZone[mapID]) |
| 651 ZoneInfo[mapID] = taskInfo | 691 ZoneInfo[mapID] = taskInfo |
| 692 qprint('|cFFFF4400START of', GetMapNameByID(mapID)) | |
| 652 for taskID, info in pairs(taskInfo) do | 693 for taskID, info in pairs(taskInfo) do |
| 653 print('-', taskID) | |
| 654 local questID = info.questId | 694 local questID = info.questId |
| 655 info.mapID = mapID | 695 info.mapID = mapID |
| 656 local questPOI = self:AcquirePin(questID, mapID) | 696 local questPOI = self:AcquirePin(questID, mapID) |
| 657 local hasUpdate, isPending = questPOI:RefreshData(taskInfo) | 697 local hasUpdate, isPending = questPOI:RefreshData(info) |
| 658 self.hasUpdate = (self.hasUpdate or hasUpdate) | 698 self.hasUpdate = (self.hasUpdate or hasUpdate) |
| 659 self.isPending = (self.isPending or isPending) | 699 self.isPending = (self.isPending or isPending) |
| 660 numQuests = numQuests + 1 | 700 numQuests = numQuests + 1 |
| 661 end | 701 end |
| 662 end | 702 qprint('|cFFFF4400END of', GetMapNameByID(mapID)) |
| 663 end | 703 end |
| 664 | 704 end |
| 665 print(' hasUpdate:', self.hasUpdate, 'isPending:', self.isPending, 'timer:', self.OnNext) | 705 |
| 666 if self.hasUpdate then | 706 if not self.fullSearch then |
| 667 self.OnNext = self.OnNext or C_Timer.NewTimer(0.25, function() | 707 print(' hasUpdate:', self.hasUpdate, 'isPending:', self.isPending, 'timer:', (self.OnNext and 'waiting' or '')) |
| 668 self:Refresh(true) | 708 |
| 669 self.OnNext = nil | 709 end |
| 670 end) | 710 |
| 671 end | |
| 672 end | 711 end |
| 673 | 712 |
| 674 function WorldQuests:Refresh(forced) | 713 function WorldQuests:Refresh(forced) |
| 675 local print = wqprint | 714 local print = wqprint |
| 676 print('|cFF00FF88'..tostring(self)..':Refresh()|r') | 715 print('|cFF00FF88'..self:GetName()..':Refresh()|r') |
| 677 if not WorldMapPOIFrame:IsVisible() then | 716 if not WorldMapPOIFrame:IsVisible() then |
| 678 return | 717 return |
| 679 end | 718 end |
| 680 if forced then | 719 if forced then |
| 681 self:Reset() | 720 self:Reset() |
| 688 end | 727 end |
| 689 | 728 |
| 690 -- prepares elements for a map update | 729 -- prepares elements for a map update |
| 691 function WorldQuests:Reset () | 730 function WorldQuests:Reset () |
| 692 local print = wqprint | 731 local print = wqprint |
| 693 print('|cFF00FF88'..tostring(self)..':Reset()|r') | 732 print('|cFF00FF88'..self:GetName()..':Reset()|r') |
| 694 wipe(QuestPositions) | 733 for questID, pin in pairs(self.QuestsByID) do |
| 695 wipe(QuestsByReward) | |
| 696 wipe(QuestsByTag) | |
| 697 for questID, pin in pairs(QuestsByID) do | |
| 698 pin.used = nil | 734 pin.used = nil |
| 699 end | 735 end |
| 700 end | 736 end |
| 701 | 737 |
| 702 -- update visibility states of all pins | 738 -- update visibility states of all pins |
| 713 | 749 |
| 714 if submapID == BROKEN_ISLES_ID and (not db.DisplayContinentPins) then | 750 if submapID == BROKEN_ISLES_ID and (not db.DisplayContinentPins) then |
| 715 print('not updating map for reasons') | 751 print('not updating map for reasons') |
| 716 return | 752 return |
| 717 end | 753 end |
| 718 print('|cFF88FF00'..tostring(self)..':UpdateAnchors|r', submapID, GetMapNameByID(submapID), 'pin count:', numPins) | 754 print('|cFF88FF00'..self:GetName()..':UpdateAnchors|r', submapID, GetMapNameByID(submapID), 'pin count:', numPins) |
| 719 local numZones = MC_GetNumZones(submapID) | 755 local numZones = MC_GetNumZones(submapID) |
| 720 if numZones then | 756 if numZones then |
| 721 for i = 1, numZones do | 757 for i = 1, numZones do |
| 722 local subMapID = MC_GetZoneInfo(submapID, i) | 758 local subMapID = MC_GetZoneInfo(submapID, i) |
| 723 self:UpdateAnchors(subMapID) | 759 self:UpdateAnchors(subMapID) |
| 724 end | 760 end |
| 725 end | 761 end |
| 726 local pins = QuestsByZone[submapID] | 762 local pins = self.QuestsByZone[submapID] |
| 727 | 763 |
| 728 if pins then | 764 if pins then |
| 729 local hostFrame = WorldMapPOIFrame | 765 local hostFrame = WorldMapPOIFrame |
| 730 local mapWidth, mapHeight = hostFrame:GetSize() | 766 local mapWidth, mapHeight = hostFrame:GetSize() |
| 731 for questID, pin in pairs(pins) do | 767 for questID, pin in pairs(pins) do |
| 768 pin.hasUpdate = true | |
| 732 pin:IsShowable() | 769 pin:IsShowable() |
| 733 if pin.used then | 770 if pin.used then |
| 734 pin:SetFrameLevel(PinBaseIndex+ (pin.whiteListed and 200 or 0) +numPins) | 771 pin:SetFrameLevel(PinBaseIndex+ (pin.whiteListed and 200 or 0) +numPins) |
| 735 print('level', PinBaseIndex+ (pin.whiteListed and 200 or 0) +numPins) | 772 print('level', PinBaseIndex+ (pin.whiteListed and 200 or 0) +numPins) |
| 736 pin:SetAnchor(WorldMapPOIFrame, currentMap, mapWidth, mapHeight) | 773 pin:SetAnchor(WorldMapPOIFrame, currentMap, mapWidth, mapHeight) |
| 756 wipe(debug_hide) | 793 wipe(debug_hide) |
| 757 -- continent or zone sizing | 794 -- continent or zone sizing |
| 758 local fadeGrouped = (db.FadeWhileGrouped and IsInGroup()) | 795 local fadeGrouped = (db.FadeWhileGrouped and IsInGroup()) |
| 759 | 796 |
| 760 numPins = 0 | 797 numPins = 0 |
| 761 for questID, pin in pairs(QuestsByID) do | 798 for questID, pin in pairs(self.QuestsByID) do |
| 762 -- can we show it? | 799 -- can we show it? |
| 763 if showQuestPOI and (pin.used) then | 800 if showQuestPOI and (pin.used) then |
| 764 | 801 |
| 802 pin.hasUpdate = true | |
| 765 if fadeGrouped then | 803 if fadeGrouped then |
| 766 pin:SetAlpha(0.25) | 804 pin:SetAlpha(0.25) |
| 767 else | 805 else |
| 768 pin:SetAlpha(1) | 806 pin:SetAlpha(1) |
| 769 end | 807 end |
| 788 print('animating? ', questID, 'filtered:', pin.filtered) | 826 print('animating? ', questID, 'filtered:', pin.filtered) |
| 789 end | 827 end |
| 790 -- trap new but animating pins here | 828 -- trap new but animating pins here |
| 791 else | 829 else |
| 792 -- hard show existing pin | 830 -- hard show existing pin |
| 793 print('refresh #', questID, 'filtered:', pin.filtered) | 831 print('refresh #', questID, 'filtered:', pin.filtered, 'hasUpdate', pin.hasUpdate) |
| 794 pin.hasUpdate = true | 832 pin:Show() |
| 795 pin:Show(true) | |
| 796 tinsert(debug_show,questID) | 833 tinsert(debug_show,questID) |
| 797 end | 834 end |
| 798 else | 835 else |
| 799 if pin:IsShown() then | 836 if pin:IsShown() then |
| 800 tinsert(debug_hide,questID) | 837 tinsert(debug_hide,questID) |
| 807 print(' adding:', table.concat(debug_animate, ',' )) | 844 print(' adding:', table.concat(debug_animate, ',' )) |
| 808 print(' refresh:', table.concat(debug_show, ',' )) | 845 print(' refresh:', table.concat(debug_show, ',' )) |
| 809 print(' hiding:', table.concat(debug_hide, ',' )) | 846 print(' hiding:', table.concat(debug_hide, ',' )) |
| 810 hasNewQuestPins = nil | 847 hasNewQuestPins = nil |
| 811 notifyPlayed = nil | 848 notifyPlayed = nil |
| 849 self.hasUpdate = nil | |
| 812 end | 850 end |
| 813 | 851 |
| 814 -- data provider manipulations for the taxi map | 852 -- data provider manipulations for the taxi map |
| 815 WorldPlan.OnFlightMapLoaded = function() | 853 WorldPlan.OnFlightMapLoaded = function() |
| 816 if true then return end | 854 if true then return end |
| 831 WorldPlan:GetPinsForMap(self:GetMapID()) | 869 WorldPlan:GetPinsForMap(self:GetMapID()) |
| 832 | 870 |
| 833 for pin in self:EnumerateAllPins() do | 871 for pin in self:EnumerateAllPins() do |
| 834 if pin.worldQuest then | 872 if pin.worldQuest then |
| 835 --print('got pin #', pin.questID) | 873 --print('got pin #', pin.questID) |
| 836 local wp = QuestsByID[pin.questID] | 874 local wp = self.QuestsByID[pin.questID] |
| 837 if wp then | 875 if wp then |
| 838 wp:ClearAllPoints() | 876 wp:ClearAllPoints() |
| 839 wp:SetParent(FlightMapFrame.ScrollContainer) | 877 wp:SetParent(FlightMapFrame.ScrollContainer) |
| 840 wp:SetFrameStrata('MEDIUM') | 878 wp:SetFrameStrata('MEDIUM') |
| 841 wp:SetPoint('CENTER', pin, 'CENTER') | 879 wp:SetPoint('CENTER', pin, 'CENTER') |
| 871 self.filtered = nil | 909 self.filtered = nil |
| 872 self.used = true | 910 self.used = true |
| 873 | 911 |
| 874 print(' |cFFFF4400IsShowable()|r', self.title) | 912 print(' |cFFFF4400IsShowable()|r', self.title) |
| 875 | 913 |
| 876 local isIncluded | 914 if not self.passesBlizzFilters then |
| 877 for filterKey, filterValues in pairs(WorldPlan.UsedFilters) do | 915 self.filtered = true |
| 878 local controlValue = self[filterKey] | 916 end |
| 879 if controlValue then | |
| 880 local filterType = filterValues[controlValue] | |
| 881 if filterType == true then | |
| 882 isIncluded = true | |
| 883 print(' include? ', filterKey, controlValue, filterType) | |
| 884 end | |
| 885 end | |
| 886 self.filtered = (not isIncluded) | |
| 887 end | |
| 888 | |
| 889 | |
| 890 if not TQ_IsActive(self.questID) then | 917 if not TQ_IsActive(self.questID) then |
| 891 self.used = nil | 918 self.used = nil |
| 892 end | 919 elseif qType == LE_QUEST_TAG_TYPE_PROFESSION then |
| 893 if qType == LE_QUEST_TAG_TYPE_PROFESSION then | |
| 894 if not (db.ShowAllProfessionQuests or (self.tradeskillLineIndex and GetProfessionInfo(self.tradeskillLineIndex))) then | 920 if not (db.ShowAllProfessionQuests or (self.tradeskillLineIndex and GetProfessionInfo(self.tradeskillLineIndex))) then |
| 895 self.used = nil | 921 self.used = nil |
| 896 end | 922 end |
| 897 end | 923 end |
| 898 return self.used, self.filtered | 924 return self.used, self.filtered |
| 902 print('|cFF0088FFUpdatePinTimer()|r') | 928 print('|cFF0088FFUpdatePinTimer()|r') |
| 903 end | 929 end |
| 904 | 930 |
| 905 --- Fixes icons upon size update | 931 --- Fixes icons upon size update |
| 906 function QuestPOI:UpdateSize (style, subStyle) | 932 function QuestPOI:UpdateSize (style, subStyle) |
| 907 self.style = self.style or POI_DEFAULT_TYPE | |
| 908 style = style or self.style | 933 style = style or self.style |
| 909 subStyle = subStyle or self.subStyle | 934 subStyle = subStyle or self.subStyle |
| 910 | 935 |
| 911 qprint('|cFF00FF88'..self:GetName()..'|r:UpdateSize()', style, subStyle) | 936 --qprint('|cFF00FF88'..self:GetName()..'|r:UpdateSize()', style, subStyle) |
| 912 | 937 |
| 913 self.currentWidth = subStyle.PinSize | 938 self.currentWidth = subStyle.PinSize |
| 914 self.borderSize = subStyle.Border | 939 self.borderSize = subStyle.Border |
| 915 self.trackingBorderSize = subStyle.TrackingBorder | 940 self.trackingBorderSize = subStyle.TrackingBorder |
| 916 self.tagSize = subStyle.TagSize | 941 self.tagSize = subStyle.TagSize |
| 964 | 989 |
| 965 | 990 |
| 966 end | 991 end |
| 967 | 992 |
| 968 | 993 |
| 969 function FilterBar:OnEvent(event) | |
| 970 if event == 'QUEST_LOG_UPDATE' then | |
| 971 self:Refresh() | |
| 972 end | |
| 973 end | |
| 974 | |
| 975 function FilterBar:PassesFilterSet(filterKey, pin) | |
| 976 local passesFilter = true | |
| 977 for filterKey, filters in pairs(QuestFilters) do | |
| 978 for rewardType, value in pairs(QuestFilters[filterKey]) do | |
| 979 if value == 1 and rewardType == pin[filterKey] then | |
| 980 passesFilter = true | |
| 981 elseif value == -1 and rewardType == pin[filterKey] then | |
| 982 passesFilter = false | |
| 983 end | |
| 984 end | |
| 985 end | |
| 986 return passesFilter | |
| 987 end | |
| 988 | |
| 989 | |
| 990 local bountyIndex | |
| 991 local debug_headers = {} | |
| 992 | |
| 993 function FilterBar:Setup() | |
| 994 self:GetFilters() | |
| 995 end | |
| 996 | |
| 997 function FilterBar:OnEvent(event,...) | |
| 998 if event == 'QUEST_LOG_UPDATE' then | |
| 999 self:Reset() | |
| 1000 self:Refresh() | |
| 1001 end | |
| 1002 end | |
| 1003 | |
| 1004 function FilterBar:GetFilters() | |
| 1005 | |
| 1006 local print = fbprint | |
| 1007 wipe(WorldPlan.FilterOptions) | |
| 1008 | |
| 1009 for index, info in ipairs(POI_FILTER_OPTIONS) do | |
| 1010 tinsert(WorldPlan.FilterOptions, info) | |
| 1011 end | |
| 1012 self.bounties, self.numBounties = GetQuestBountyInfoForMapID(WorldPlan.currentMapID) | |
| 1013 self.BountyFilters = {} | |
| 1014 for index, data in ipairs(self.bounties) do | |
| 1015 local info = self.BountyFilters[index] | |
| 1016 if not info then | |
| 1017 info = {} | |
| 1018 self.BountyFilters[index] = info | |
| 1019 end | |
| 1020 | |
| 1021 local questTitle = GetQuestLogTitle(GetQuestLogIndexByID(data.questID)) | |
| 1022 | |
| 1023 info.filterKey = 'factionID' | |
| 1024 info.filterValue = data.factionID | |
| 1025 info.label = questTitle | |
| 1026 info.texture = data.icon | |
| 1027 print('loading emissary', questTitle) | |
| 1028 tinsert(WorldPlan.FilterOptions, info) | |
| 1029 --{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PROFESSION, label = 'Profession', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", }, | |
| 1030 end | |
| 1031 end | |
| 1032 | |
| 1033 function FilterBar:Reset() | |
| 1034 self:GetFilters() | |
| 1035 end | |
| 1036 | |
| 1037 function FilterBar:Refresh(forced) | |
| 1038 local print = fbprint | |
| 1039 local blocks = self.SummaryHeaders | |
| 1040 local relativeFrame = WorldMapFrame.UIElementsFrame.TrackingOptionsButton | |
| 1041 local numHeaders = 0 | |
| 1042 print('|cFF00FF88'..tostring(self)..':Refresh()|r', 'currentMap=',WorldPlan.currentMapID) | |
| 1043 | |
| 1044 | |
| 1045 local quests = QuestsByZone[WorldPlan.currentMapID] or QuestsByID | |
| 1046 | |
| 1047 | |
| 1048 for index, info in ipairs(WorldPlan.FilterOptions) do | |
| 1049 local numQuests = 0 | |
| 1050 | |
| 1051 for questID, pin in pairs(quests) do | |
| 1052 if pin.used then | |
| 1053 if not info.filterKey then | |
| 1054 numQuests = numQuests + 1 | |
| 1055 elseif pin[info.filterKey] == info.filterValue then | |
| 1056 numQuests = numQuests + 1 | |
| 1057 end | |
| 1058 end | |
| 1059 end | |
| 1060 print(tostring(index).. ' ("'..tostring(info.label)..'" f('.. tostring(info.filterKey).. '='..tostring(info.filterValue) .. '), '..tostring(numQuests)..')') | |
| 1061 | |
| 1062 if numQuests >= 1 then | |
| 1063 numHeaders = numHeaders + 1 | |
| 1064 local button = blocks[numHeaders] | |
| 1065 if not blocks[numHeaders] then | |
| 1066 button = CreateFrame('Button', 'WorldPlanFilterButton'..numHeaders, WorldMapScrollFrame, 'WorldPlanFilterPin') | |
| 1067 for k,v in pairs(info)do print(k,v) end | |
| 1068 button.iconBorder:SetTexture(info.fill or POI_BORDER_FILL) | |
| 1069 button.iconBorder:SetMask(info.mask or POI_BORDER_MASK) | |
| 1070 button.iconBorder:SetDesaturated(info.desaturated) | |
| 1071 button.supertrackBorder:SetTexture(info.fill or POI_BORDER_FILL) | |
| 1072 button.supertrackBorder:SetMask(info.mask or POI_BORDER_MASK) | |
| 1073 button.supertrackBorder:SetDesaturated(true) | |
| 1074 blocks[numHeaders] = button | |
| 1075 end | |
| 1076 | |
| 1077 button:SetID(index) | |
| 1078 button.spacing = ((info.filterKey ~= relativeFrame.filterKey) and 10) or 0 | |
| 1079 button.relativeFrame = relativeFrame | |
| 1080 button:Refresh(info, (numHeaders == 1), numQuests) | |
| 1081 button:Show() | |
| 1082 relativeFrame = button | |
| 1083 end | |
| 1084 | |
| 1085 end | |
| 1086 | |
| 1087 self.numHeaders = numHeaders | |
| 1088 for i = numHeaders + 1, #WorldPlan.FilterOptions do | |
| 1089 if self.SummaryHeaders[i] then | |
| 1090 self.SummaryHeaders[i]:Hide() | |
| 1091 end | |
| 1092 end | |
| 1093 end | |
| 1094 | |
| 1095 function FilterBar:Cleanup() | |
| 1096 | |
| 1097 -- hide trailing buttons | |
| 1098 end | |
| 1099 | |
| 1100 | |
| 1101 function FilterPin:Refresh(info, isFirst, numQuests) | |
| 1102 local print = fbprint | |
| 1103 isFirst = isFirst or self.isFirst | |
| 1104 numQuests = numQuests or self.numQuests | |
| 1105 | |
| 1106 if info then | |
| 1107 self.isFirst = isFirst | |
| 1108 self.numQuests = numQuests | |
| 1109 self.filterKey = info.filterKey | |
| 1110 self.filterValue = info.filterValue | |
| 1111 self.tagID = info.tagID | |
| 1112 | |
| 1113 self.icon:ClearAllPoints() | |
| 1114 self.icon:SetTexture(info.texture) | |
| 1115 self.icon:SetAllPoints(self) | |
| 1116 self.supertrackBorder:Hide() | |
| 1117 self.count:SetText(numQuests) | |
| 1118 self:Show() | |
| 1119 end | |
| 1120 | |
| 1121 | |
| 1122 self.itemTexture = self.texture | |
| 1123 | |
| 1124 if isFirst then | |
| 1125 self:SetPoint('TOP', self.relativeFrame, 'BOTTOM', 0, -5) | |
| 1126 else | |
| 1127 self:SetPoint('TOPRIGHT', self.relativeFrame, 'BOTTOMRIGHT', 0, -(3*2 + 1 + (self.spacing or 0))) | |
| 1128 | |
| 1129 end | |
| 1130 print('anchor to', self.relativeFrame:GetName()) | |
| 1131 | |
| 1132 local r, g, b, a = 1,1,1,1 | |
| 1133 local used = WorldPlan.UsedFilters[self.filterKey] | |
| 1134 if used and self.filterKey then | |
| 1135 if used[self.filterValue] == true then | |
| 1136 r, g, b = 0, 1, 0 | |
| 1137 elseif used[self.filterValue] == false then | |
| 1138 r, g, b = 1, 0, 0 | |
| 1139 end | |
| 1140 end | |
| 1141 self.iconBorder:SetVertexColor(r, g, b, a) | |
| 1142 self:UpdateSize() | |
| 1143 end | |
| 1144 | |
| 1145 function FilterPin:OnLoad() | |
| 1146 self:RegisterForClicks('AnyUp') | |
| 1147 self:SetFrameStrata('HIGH') | |
| 1148 self:SetFrameLevel(151) | |
| 1149 self:SetScript('OnUpdate', nil) | |
| 1150 self.style = db.filterStyle | |
| 1151 self.subStyle = db.defaultPinStyle.continent | |
| 1152 end | |
| 1153 | |
| 1154 function FilterPin:OnUpdate () | |
| 1155 | |
| 1156 end | |
| 1157 | |
| 1158 function FilterPin:OnLeave () | |
| 1159 if GameTooltip:IsOwned(self) then | |
| 1160 GameTooltip:Hide() | |
| 1161 end | |
| 1162 end | |
| 1163 | |
| 1164 -- shift-click: reset filter | |
| 1165 -- click: rotate through include(1), exclude(-1), ignore(nil) | |
| 1166 function FilterPin:OnClick (button) | |
| 1167 local print = fbprint | |
| 1168 local filterKey = self.filterKey | |
| 1169 local filterValue = self.filterValue | |
| 1170 | |
| 1171 | |
| 1172 local operation = opPrefix | |
| 1173 local setInclude = (button == 'LeftButton') | |
| 1174 | |
| 1175 | |
| 1176 if not filterKey then | |
| 1177 -- resetting | |
| 1178 wipe(WorldPlan.UsedFilters) | |
| 1179 | |
| 1180 elseif IsShiftKeyDown() then | |
| 1181 WorldPlan.UsedFilters[filterKey] = nil | |
| 1182 else | |
| 1183 WorldPlan.UsedFilters[filterKey] = WorldPlan.UsedFilters[filterKey] or {} | |
| 1184 WorldPlan.UsedFilters[filterKey][filterValue] = setInclude | |
| 1185 print(filterKey, filterValue, '=', setInclude) | |
| 1186 | |
| 1187 for index, info in ipairs(WorldPlan.FilterOptions) do | |
| 1188 if info.filterKey == filterKey then | |
| 1189 if (not IsControlKeyDown()) and (filterValue ~= info.filterValue) then | |
| 1190 WorldPlan.UsedFilters[filterKey][info.filterValue] = (not setInclude) | |
| 1191 print(filterKey, info.filterValue, '=', WorldPlan.UsedFilters[filterKey][info.filterValue]) | |
| 1192 end | |
| 1193 end | |
| 1194 end | |
| 1195 | |
| 1196 end | |
| 1197 print('|cFF00FF88Filter Update:', filterKey, filterValue, operation) | |
| 1198 WorldPlan:RefreshAll() | |
| 1199 end | |
| 1200 | 994 |
| 1201 --%debug% | 995 --%debug% |
| 1202 local SetTimedCallbackForAllPins = function(seconds, callback) | 996 local SetTimedCallbackForAllPins = function(seconds, callback) |
| 1203 C_Timer.After(seconds, function() | 997 C_Timer.After(seconds, function() |
| 1204 for id, pin in pairs(QuestsByID) do | 998 for id, pin in pairs(WorldPlanQuests.QuestsByID) do |
| 1205 callback(pin) | 999 callback(pin) |
| 1206 end | 1000 end |
| 1207 end) | 1001 end) |
| 1208 end | 1002 end |
| 1209 | 1003 |
