changeset 75:78d78dc77822

update conditional tweaks
author Nenue
date Mon, 10 Apr 2017 07:13:29 -0400
parents 2ba11b25aa7f
children 836cd54c84b3
files QuestPOI.lua WorldPlan.lua WorldPlan.xml WorldQuests.lua WorldQuests.xml
diffstat 5 files changed, 275 insertions(+), 227 deletions(-) [+]
line wrap: on
line diff
--- a/QuestPOI.lua	Sat Apr 08 17:07:58 2017 -0400
+++ b/QuestPOI.lua	Mon Apr 10 07:13:29 2017 -0400
@@ -45,8 +45,8 @@
 local previousHighlight
 
 local DATA_DEBUG = false
-local PIN_REFRESH_DELAY = .5
-local PIN_REQUEST_DELAY = .1
+local PIN_REFRESH_DELAY = 1
+local PIN_REQUEST_DELAY = .2
 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark"
 local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up"
 
@@ -338,21 +338,21 @@
 
 -- attempt to pull pin data
 function QuestPOI:GetData ()
-  dprint('|cFF00FF88'..self:GetID()..':GetData()|r')
+  --dprint('|cFF00FF88'..self:GetID()..':GetData()|r')
   local questID = self.questID
   if not questID then
-    dprint('|cFFFF4400bad pin|r', self:GetName())
+    --dprint('|cFFFF4400bad pin|r', self:GetName())
     return nil
   end
 
   local questTitle, factionID, capped = TQ_GetQuestInfoByQuestID(questID)
   -- if the title is nil, then wait and try later
   if not questTitle then
-    dprint('|cFFBB8844dataLoaded|r = false|cFF00FFFF', self.questId)
+    --dprint('|cFFBB8844dataLoaded|r = false|cFF00FFFF', self.questId)
     return false
   else
     self.title, self.factionID, self.capped = questTitle, factionID, capped
-    dprint(questTitle, factionID, capped)
+    print(questTitle, factionID, capped)
     -- set tag details
     local worldQuestType
     self.tagID, self.tagName, worldQuestType, self.rarity, self.isElite, self.tradeskillLineIndex = GetQuestTagInfo(questID);
@@ -366,7 +366,7 @@
       local id = self.tradeskillLineIndex and select(7, GetProfessionInfo(self.tradeskillLineIndex))
       if id then
         self.isKnownProfession = true
-        qprint('profession' , self.title, id)
+        --qprint('profession' , self.title, id)
         tagAtlas = WORLD_QUEST_ICONS_BY_PROFESSION[id]
       end
     elseif worldQuestType == LE_QUEST_TAG_TYPE_DUNGEON then
@@ -376,7 +376,7 @@
     self.tagAtlas = tagAtlas
 
     local dataLoaded, rewardType, itemName, itemTexture, itemNumber, quality, xpType, xpName, xpIcon, xpCount = self:UpdateRewards()
-    dprint('|cFFBB8844  dataLoaded|r =', dataLoaded, rewardType, itemName, itemTexture, itemNumber, quality)
+    --dprint('|cFFBB8844  dataLoaded|r =', dataLoaded, rewardType, itemName, itemTexture, itemNumber, quality)
     if dataLoaded then
       self.rewardType = rewardType
       self.itemName = itemName
@@ -426,7 +426,7 @@
         rewardIcon = "Interface\\ICONS\\inv_7xp_inscription_talenttome01"
         rewardCount = artifactXP
         rewardType = REWARD_ARTIFACT_POWER
-        qprint('  artifactXP', artifactXP)
+        --dprint('  artifactXP', artifactXP)
         foundPrimary = true
       end
 
@@ -441,7 +441,7 @@
           text = text
         })
 
-        qprint('  currency', i, currencyID, name, " |T"..tostring(texture)..":12:12|t")
+        --dprint('  currency', i, currencyID, name, " |T"..tostring(texture)..":12:12|t")
         if currencyID == ID_RESOURCES then
           rewardIcon = texture
           rewardCount = numItems
@@ -494,7 +494,7 @@
                 local ap = text and text:gsub(',', ''):gsub(' million', '000000'):match('(%d+) '..ARTIFACT_POWER)
                 if ap then
                   rewardCount = tonumber(ap)
-                  print(ap)
+                  --dprint(ap)
                 end
 
               end
@@ -503,7 +503,7 @@
                 local text = WorldPlanTooltipTextLeft2:GetText()
               end
 
-              print('is an AP token')
+              --dprint('is an AP token')
             elseif classID == LE_ITEM_CLASS_TRADEGOODS then
               rewardType = REWARD_REAGENT
               rewardIcon = texture
@@ -513,7 +513,7 @@
             end
 
 
-            qprint('  reward', i, name, " |T"..tostring(texture)..":12:12|t", quality, isUsable, itemID)
+            --dprint('  reward', i, name, " |T"..tostring(texture)..":12:12|t", quality, isUsable, itemID)
             tinsert(rewardItems, {
               name = name,
               texture = texture,
@@ -522,7 +522,7 @@
               isUsable = isUsable
             })
             if not foundPrimary then
-              print('  -updating primary')
+              --print('  -updating primary')
               rewardType = REWARD_GEAR
 
               rewardIcon = texture
@@ -535,8 +535,8 @@
         end
       end
 
-      qprint('  '..self.questID..':|cFFFFFF00SetRewardInfo():', numQuestRewards, rewardType)
-      qprint('  ', tostring(self.title), " |T"..tostring(self.itemTexture)..":12:12|t", tostring(self.itemName))
+      --dprint('  '..self.questID..':|cFFFFFF00UpdateRewards():', numQuestRewards, rewardType)
+      --dprint('  ', tostring(self.title), " |T"..tostring(self.itemTexture)..":12:12|t", tostring(self.itemName))
 
       if (self.itemNumber ~= rewardCount) or (self.rewardType ~= rewardType) or (self.itemName ~= rewardName) or (self.itemTexture ~= rewardIcon) then
         if DATA_DEBUG and (self.debugTimer <= 0) then
@@ -571,25 +571,33 @@
 
 -- run from OnShow if .isNew is set
 
-function QuestPOI:StartFade()
-  if not self.isAnimating then
-    qprint('|cFFFFFF00clearing new status')
+function QuestPOI:OnAnimStart()
+  --qprint('|cFFFFFF00OnAnimStart(|r'..self:GetID()..'|cFFFFFF00)|r', self.fadeEvent)
+  self.isAnimating = true
+  self.isNew = nil
+end
+
+function QuestPOI:TryToFade(event)
+  if self.FadeIn:IsPlaying() then
+    --qprint('|cFFFF4400TryToFade('..self:GetID()..'|cFFFF4400)|r stopping because already in progress')
+    return
+  end
+
+  self.fadeEvent = event
+  if self.dataLoaded then
+    --qprint('|cFFFFFF00TryToFade('..self:GetID()..'|cFFFFFF00)|r', event)
     self:SetAlpha(0)
-    if self.dataLoaded then
-      self:Refresh('POI_ISNEW')
-      self.FadeIn.FadeIn:SetToAlpha(db.PinAlpha)
-      self.PendingFade.FadeIn:SetToAlpha(db.PinAlpha)
-      self.PendingFade.FadeOut:SetFromAlpha(db.PinAlpha)
+    self:Refresh(event)
+    self.FadeIn.FadeIn:SetToAlpha(db.PinAlpha)
+    self.isStale = true
+    self.FadeIn:Play()
+  else
 
-      self.isAnimating = true
-      self.isNew = nil
-      self.isStale = true
-      self.FadeIn:Play()
-    end
+    --qprint('|cFFFF4400TryToFade('..self:GetID()..'|cFFFF4400)|r stopping because not loaded')
   end
 end
 
-function QuestPOI:EndFade()
+function QuestPOI:OnAnimStop()
   self.isAnimating = nil
   self:SetAlpha(db.PinAlpha)
 end
@@ -597,15 +605,15 @@
 function QuestPOI:OnShow ()
 
   if self.isNew then
-    self:StartFade()
+    self:TryToFade('POI_ONSHOW_NEW')
   else
     if not self.isAnimating then
-      print('|cFF00FF00Alpha correction')
+      --print('|cFF00FF00Alpha correction')
       self:SetAlpha(db.PinAlpha) -- fix stuck alpha
     end
     if self.isStale then
-      print('|cFF00FF00refresh on show')
-      self:Refresh('POI_SCRIPT')
+      --print('|cFF00FF00refresh on show')
+      self:Refresh('POI_ONSHOW_STALE')
     end
   end
   self:ShowFrames()
@@ -625,13 +633,14 @@
 
 -- Applies position and sizing parameters to the pin data
 function QuestPOI:SetAnchor(owner, dX, dY, mapWidth, mapHeight, scaleFactor)
-  dprint(self:GetName()..':SetAnchor()', owner, dX, dY, scaleFactor, self.filtered, self.used)
+  --dprint(self:GetName()..':SetAnchor()', owner, dX, dY, scaleFactor, self.filtered, self.used)
   if not self.used then
     self.hideReason = 'SetAnchor() on an unused frame.'
     self:HideFrames()
     return
   end
 
+
   if owner then
     self:SetParent(owner)
     self.Overlay:SetParent(owner)
@@ -640,9 +649,6 @@
     owner = self:GetParent()
   end
 
-  self:SetFrameLevel(pinBaseIndex + self:GetID())
-  self.Overlay:SetFrameLevel(overlayBaseIndex + self:GetID())
-
 
   if scaleFactor then
     --print('scaleFactor')
@@ -672,7 +678,7 @@
 -- Show/Hide the text overlays associated with the quest pin; they aren't hierarchically linked
 function QuestPOI:ShowFrames()
   if not self:IsShown() then
-    print('|cFFFFFF00' ..self:GetName()..':ShowFrames()')
+    -- print('|cFFFFFF00' ..self:GetName()..':ShowFrames()')
     -- do not SetShown() here
   end
   self.Overlay:SetShown(true)
@@ -685,8 +691,6 @@
     if not self.hideReason then
       self.hideReason = "HideFrames() called"
     end
-    --print(self:GetName()..':HideFrames()')
-    self:SetShown(false)
   end
   self.Overlay:SetShown(false)
   self.count:SetShown(false)
@@ -695,7 +699,7 @@
 end
 
 function QuestPOI:OnLoad()
-  qprint('|cFF00FF88'..self:GetName()..':OnLoad()|r',db.Config)
+  --qprint('|cFF00FF88'..self:GetName()..':OnLoad()|r',db.Config)
   self.debugTimer = 4
   self.title = '|cFF0088FF' .. RETRIEVING_DATA..'|r'
   self.isPending = true
@@ -717,7 +721,7 @@
   end
 end
 
-
+local updateTime, markTime
 function QuestPOI:OnUpdate (sinceLast)
   -- control update check intervals
 
@@ -734,6 +738,7 @@
     self.debugTimer = self.debugTimer - sinceLast
     if self.debugTimer >= 0 then
       print(self.debugTimer)
+      return
     end
   end
   --@end-debug@
@@ -741,13 +746,16 @@
   -- query for reward data if it wasn't found in the original scan
 
   if not self.dataLoaded then
-    print('|cFFFF4400'..self:GetID()..':|r polling reward info')
 
     local dataLoaded = self:GetData()
     if dataLoaded and not tContains(db.UpdatedPins, self) then
-      self.PendingFade:Stop()
+      -- self.PendingFade:Stop()
       -- scale info from the parent module is needed, so deal with it there
+      --print('|cFF00FF88  queueing for update')
       tinsert(db.UpdatedPins, self)
+    else
+
+      --print('|cFFFF4400OnUpdate(|r'..self:GetID()..'|cFFFF4400)|r poll failed')
     end
     return
   end
@@ -761,35 +769,26 @@
 function QuestPOI:GetCriteriaState()
   local isCriteria, isBounty, isSpellTarget
   if self.factionID then
-
-    local bounties = db.BountiesByFactionID
-    if bounties then
-      for factionID, bounty in pairs(bounties) do
-
-        if IsQuestCriteriaForBounty(self.questID, bounty.questID) then
-          isCriteria = true
-          if db.selectedBounty == bounty then
-            isBounty = true
-          end
-          print('|cFF00FF88Criteria:|r', self.questID, bounty.questID, isCriteria, isBounty)
+    for index, bounty in pairs(db.Bounties) do
+      if IsQuestCriteriaForBounty(self.questID, bounty.questID) then
+        isCriteria = true
+        if db.selectedBounty == bounty then
+          isBounty = true
         end
+        --dprint('|cFF00FF88Criteria:|r', self.questID, bounty.questID, isCriteria, isBounty)
       end
-
-
-      print('|cFFFF4400Criteria:|r', self.questID, self.isCriteria, self.isBounty)
-
     end
   end
   isSpellTarget = IsQuestIDValidSpellTarget(self.questID)
 
   if (self.isBounty ~= isBounty) or (self.isCriteria ~= isCriteria) or (self.isSpellTarget ~= isSpellTarget) then
-
+    --wqprint('|cFF00FF00criteria state changed')
     self.isBounty = isBounty
     self.isCriteria = isCriteria
     self.isSpellTarget = isSpellTarget
+    self.isStale = true
     return true
   end
-
 end
 
 -- Called at static intervals and with Refresh
@@ -828,7 +827,7 @@
 
 function QuestPOI:Refresh (event)
 
-  print('|cFF00FF88'..self:GetID()..'|r:Refresh()', event)
+  print('|cFF00FF88Refresh(|r'..self:GetID()..'|cFF00FF88)|r', event, self.title)
 
   local style = DEFAULT_STYLE
   if self.dataLoaded and not self.filtered then
@@ -942,11 +941,11 @@
   self.isStale = nil
 
   if self.isBounty then
-    print('is bounty')
+    --print('is bounty')
     iconBorder:SetVertexColor(trackingBorder:GetVertexColor())
     trackingBorder:SetVertexColor(unpack(BORDER_SELECTED_BOUNTY))
   elseif self.isCriteria then
-    print('is criteria of a bounty')
+    --print('is criteria of a bounty')
     iconBorder:SetVertexColor(trackingBorder:GetVertexColor())
     trackingBorder:SetVertexColor(unpack(BORDER_CRITERIA))
   else
--- a/WorldPlan.lua	Sat Apr 08 17:07:58 2017 -0400
+++ b/WorldPlan.lua	Mon Apr 10 07:13:29 2017 -0400
@@ -32,6 +32,8 @@
 db.UsedPins = {}
 db.UpdatedPins = {}
 db.ReportChunks = {}
+db.Bounties = {}
+db.BountiesByQuestID = {}
 db.BountiesByFactionID = {}
 
 -- default color templates
@@ -356,7 +358,12 @@
     end
   end
   local isMapOpen = WorldMapFrame:IsShown()
-  local isNewMap = isMapOpen and ((mapAreaID ~= db.currentMapID) or (isMapOpen ~= db.isMapOpen) or (db.isMicroDungeon ~= isMicroDungeon))
+  if not isMapOpen then
+    return
+  end
+
+  local isNewMap = (mapAreaID ~= db.currentMapID) or (isMapOpen ~= db.isMapOpen) or (db.isMicroDungeon ~= isMicroDungeon)
+
 
   db.isMicroDungeon = isMicroDungeon
   db.isMapOpen = isMapOpen
@@ -367,6 +374,9 @@
 
   for _, module in ipairs(db.OrderedModules) do
     if module.OnMapInfo then
+      if module.Debug then
+        module:Debug(event)
+      end
       print('  |cFF00FFFF'..module:GetName() .. ':OnMapInfo()|r')
       module:OnMapInfo(isBrokenIsle, isContinent, mapAreaID, isNewMap, isMapOpen)
     end
@@ -386,7 +396,7 @@
       print('|cFFFF4400currentMapID =', db.currentMapID, ...)
 
 
-      self:SetCurrentMap(event)
+      self:SetCurrentMap(event .. ' ' .. GetTime())
     end
   end
 end
@@ -639,7 +649,7 @@
   for i, module in ipairs(db.OrderedModules) do
     if module.Refresh then
       print('|cFF00FF00external '..module:GetName()..':Refresh()|r')
-      module:Refresh(forced)
+      module:Refresh('WORLDPLAN_REFRESH')
     end
   end
 
--- a/WorldPlan.xml	Sat Apr 08 17:07:58 2017 -0400
+++ b/WorldPlan.xml	Mon Apr 10 07:13:29 2017 -0400
@@ -41,11 +41,14 @@
       <AnimationGroup parentKey="FadeIn" setToFinalAlpha="true" looping="NONE">
         <Alpha parentKey="FadeIn" duration="0.45" fromAlpha="0" toAlpha="1" order="1" />
         <Scripts>
+          <OnPlay>
+            self:GetParent():OnAnimStart()
+          </OnPlay>
           <OnStop>
-            self:GetParent():EndFade()
+            self:GetParent():OnAnimStop()
           </OnStop>
           <OnFinished>
-            self:GetParent():EndFade()
+            self:GetParent():OnAnimStop()
           </OnFinished>
         </Scripts>
       </AnimationGroup>
--- a/WorldQuests.lua	Sat Apr 08 17:07:58 2017 -0400
+++ b/WorldQuests.lua	Mon Apr 10 07:13:29 2017 -0400
@@ -3,11 +3,11 @@
 -- Created: 11/2/2016 3:40 PM
 -- %file-revision%
 
-local print = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end
-local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or function() end
-local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end
-local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end
-local mprint = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or function() end
+local print = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or nop
+local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or nop
+local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or nop
+local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or nop
+local mprint = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or nop
 local _, db = ...
 local Module = WorldPlanQuestsMixin
 
@@ -17,6 +17,7 @@
 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented
 local TQ_GetQuestZoneID = C_TaskQuest.GetQuestZoneID
 local TQ_IsActive = C_TaskQuest.IsActive
+local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData
 local pairs, ipairs, tinsert, tremove, wipe = pairs, ipairs, tinsert, tremove, table.wipe
 local GetTaskInfo, GetTasksTable, HaveQuestData = GetTaskInfo, GetTasksTable, HaveQuestData
 local GetTime = GetTime
@@ -44,6 +45,8 @@
 local BountyBoard = WorldMapFrame.UIElementsFrame.BountyBoard
 local ActionButton = WorldMapFrame.UIElementsFrame.ActionButton
 
+local pinBaseIndex = 1500
+local overlayBaseIndex = 1580
 local layoutDirty = true
 local bountiesDirty = true
 local currentScale = WorldMapDetailFrame:GetScale()
@@ -64,30 +67,18 @@
   end)
 end
 
-function Module:OnUpdate(sinceLast)
-
-  if self.filtersDirty or self.isStale then
-    self:Refresh()
-  end
-  if #db.UpdatedPins >= 1 then
-    print('|cFF00FF88pending updates', #db.UpdatedPins)
-    self:RefreshIfQueued()
-  end
-
-end
-
 
 function Module:Setup()
-  print('|cFFFF4400'..self:GetName()..':Setup()')
+  --print('|cFFFF4400'..self:GetName()..':Setup()')
   for mapID, mapName in pairs(WORLD_QUEST_MAPS) do
     db.QuestsByZone[mapID] = {}
   end
   for target, arg in pairs(callbacks) do
-    print(type(target))
+    --print(type(target))
     if type(target) == 'table' then
       local callerName = target:GetName() or tostring(target)
       for name, method  in pairs(arg) do
-        print(callerName, arg)
+        --print(callerName, arg)
         hooksecurefunc(target, name, function(...)
           self:OnSecureHook(callerName .. '.' .. name, method, ...)
         end)
@@ -100,8 +91,8 @@
   end
 
   self.Status = CreateFrame('Frame', nil, self)
-  self.Status:SetPoint('TOPLEFT', WorldMapPOIFrame, 'TOPLEFT', 0, 0)
-  self.Status:SetPoint('BOTTOMRIGHT', WorldMapPOIFrame, 'TOPRIGHT', 0, -4)
+  self.Status:SetPoint('TOPLEFT', WorldMapFrame.UIElementsFrame, 'TOPLEFT', 0, 0)
+  self.Status:SetPoint('BOTTOMRIGHT', WorldMapFrame.UIElementsFrame, 'TOPRIGHT', 0, -4)
   self.Status.t = self.Status:CreateTexture(nil, 'OVERLAY')
   self.Status.b = self.Status:CreateTexture(nil, 'BACKGROUND')
   self.Status.b:SetColorTexture(0,0,0,.25)
@@ -114,15 +105,15 @@
   self.Status:SetScript('OnUpdate', function(status)
     local translateTo
     if numLoaded < numShown then
-      translateTo = numLoaded/numShown * status:GetWidth()
+      translateTo = (numLoaded/numShown) * status:GetWidth()
       status.t:SetWidth(translateTo)
     else
-      translateTo = numShown * status:GetWidth()
+      translateTo = status:GetWidth()
       status.t:SetWidth(translateTo)
     end
   end)
 
-  self:SetAllPoints(WorldMapPOIFrame)
+  self:SetAllPoints(WorldMapFrame.UIElementsFrame)
   for k,v in pairs( ToggleButton) do
     self.Toggle:SetScript(k,v)
   end
@@ -138,10 +129,10 @@
   WorldQuests:UpdateTaskPOIs()
 end
 callbacks.WorldMapFrame_UpdateMap = function(WorldQuests)
-  WorldQuests:RefreshIfChanged()
+  WorldQuests:RefreshIfChanged('WMF_UPDATE')
 end
 callbacks.WorldMapScrollFrame_ReanchorQuestPOIs = function (WorldQuests)
-  WorldQuests:RefreshIfChanged()
+  WorldQuests:RefreshIfChanged('WMF_REANCHOR')
 end
 
 callbacks[BountyBoard] = {}
@@ -156,7 +147,7 @@
 end
 
 function Module:OnConfigUpdate()
-  print('|cFFFFFF00OnConfigUpdate()|r')
+  --print('|cFFFFFF00OnConfigUpdate()|r')
   if db.Config.FadeWhileGrouped then
     db.PinAlpha = 0.15
   else
@@ -179,29 +170,17 @@
   button:Show()
 end
 
-db.UsedPOIs = {}
-function Module:UpdateTaskPOIs()
-  canTargetQuests = SpellCanTargetQuest()
-  local func = canTargetQuests and 'Show' or 'Hide'
-  for i = 1, NUM_WORLDMAP_TASK_POIS do
-    local button = _G['WorldMapFrameTaskPOI'..i]
-    if button and button.worldQuest then
-      button[func](button)
-    end
-  end
-end
-
 function Module:OnSecureHook(callbackName, func, ...)
-  rprint('|cFFFF4400'..callbackName..'|r', ...)
+  --rprint('|cFFFF4400'..callbackName..'|r', ...)
   func(self, ...)
 end
 
 local defaults = {}
 local REWARD_UNKNOWN = 768
 function Module:OnLoad()
-  print('|cFFFF4400'..self:GetName()..':OnLoad()')
+  --print('|cFFFF4400'..self:GetName()..':OnLoad()')
 
-  self:SetParent(WorldMapPOIFrame)
+  self:SetParent(WorldMapFrame.UIElementsFrame)
   WorldPlan:AddHandler(self, defaults)
 
   for areaID, fileName in pairs(WORLD_QUEST_MAPS) do
@@ -212,7 +191,7 @@
   self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL')
   self:RegisterEvent('SUPER_TRACKED_QUEST_CHANGED')
   self:RegisterEvent('SKILL_LINES_CHANGED')
-  self:RegisterEvent('CURRENT_SPELL_CAST_CHANGED')
+  --self:RegisterEvent('CURRENT_SPELL_CAST_CHANGED')
   self:RegisterEvent('ARTIFACT_UPDATE')
   self:RegisterEvent('QUEST_LOG_UPDATE')
 end
@@ -221,15 +200,14 @@
 local superTrackedQuestID
 function Module:OnEvent (event, ...)
 
-  print('|cFFFFFF00'..self:GetName()..':OnEvent() '..event..'|r', GetTime(), ...)
+  print('|cFFFFFF00OnEvent() '..event..'|r', GetTime(), ...)
   if (event == 'QUEST_LOG_UPDATE') then
     self:UpdateBounties(event)
-    self:RefreshIfChanged(event)
   elseif event == 'WORLD_QUEST_COMPLETED_BY_SPELL' then
     local questID = ...
-    self:UpdateBounties(event)
     if questID and db.QuestsByID[questID] then
       db.QuestsByID[questID].complete = true
+      self:ReleasePin(db.QuestsByID[questID])
     end
     self:Refresh(event)
   elseif event == 'SKILL_LINES_CHANGED' or event == 'CURRENT_SPELL_CAST_CHANGED' then
@@ -238,7 +216,7 @@
     local akCheck = C_ArtifactUI.GetArtifactKnowledgeMultiplier()
     if akCheck and (akCheck ~= artifactKnowledgeMultiplier) then
       if artifactKnowledgeMultiplier then
-        print('push artifact knowledge update', artifactKnowledgeMultiplier, 'to', akCheck)
+        --print('push artifact knowledge update', artifactKnowledgeMultiplier, 'to', akCheck)
         for index, pin in pairs( db.QuestsByID) do
           if pin.rewardType == REWARD_ARTIFACT_POWER then
             db.log(pin.questID .. ' ' .. tostring(pin.title) .. ' Flagged for artifact power.')
@@ -264,52 +242,85 @@
 end
 
 
+function Module:OnUpdate(sinceLast)
+
+  if self.refreshBenchMarkTicker then
+    --print(self.refreshBenchMarkTicker)
+    self.refreshBenchMarkTicker =   self.refreshBenchMarkTicker - 1
+
+    if self.refreshBenchMarkTicker == 0 then
+
+      self.refreshTime = floor((GetTime() - self.refreshBenchMark) * 1000)/1000
+      self.debugMessage:SetText(self.refreshTime)
+      self.refreshBenchMarkTicker = nil
+    end
+  else
+    self.refreshBenchMark = GetTime()
+  end
+
+  if self.filtersDirty or self.isStale then
+    self:Refresh()
+  end
+  if #db.UpdatedPins >= 1 then
+    --print('|cFF00FF88pending update', #db.UpdatedPins)
+    self:UpdateNext()
+  end
+
+end
+
+function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen)
+  if isNewMap then
+    print('|cFF0088FFOnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap)
+    layoutDirty = true
+    self:Refresh('WORLD_MAP_CHANGED')
+  else
+
+    --print('|cFFFFFF00'..self:GetName()..':OnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap)
+  end
+end
+
+
+function Module:UpdateTaskPOIs()
+  canTargetQuests = SpellCanTargetQuest()
+  local func = canTargetQuests and 'Show' or 'Hide'
+  for i = 1, NUM_WORLDMAP_TASK_POIS do
+    local button = _G['WorldMapFrameTaskPOI'..i]
+    if button and button.worldQuest then
+      button[func](button)
+    end
+  end
+end
 
 local bountyQuests = {}
 local bountyInfo = {}
+
 local bountyDisplayLocation, bountyLockedQuestID, selectedBountyIndex, selectedBountyQuestID
 function Module:UpdateBounties(...)
-  print('|cFF00FF88BountyInfo()|r', ...)
+    print('|cFF00FF88BountyInfo()|r', ...)
   wipe(db.BountiesByFactionID)
-  wipe(bountyQuests)
+  wipe(db.BountiesByQuestID)
 
   db.selectedBounty = nil
   selectedBountyIndex = BountyBoard:GetSelectedBountyIndex()
-  bountyInfo, bountyDisplayLocation, bountyLockedQuestID = GetQuestBountyInfoForMapID(db.currentMapID, bountyInfo)
+  db.Bounties, bountyDisplayLocation, bountyLockedQuestID = GetQuestBountyInfoForMapID(db.currentMapID, db.Bounties)
   local numBounties = 0
-  for index, info in ipairs(bountyInfo) do
-    if info.factionID then
+  for index, info in ipairs(db.Bounties) do
       numBounties = numBounties + 1
       info.index = index
       info.complete =  IsQuestComplete(info.questID)
       if not info.complete then
         db.BountiesByFactionID[info.factionID] = info
+        db.BountiesByQuestID[info.questID] = info
         if index == selectedBountyIndex then
           db.selectedBounty = info
           selectedBountyQuestID = info.questID
         end
         print(' ', index, info.factionID, GetQuestLogTitle(GetQuestLogIndexByID(info.questID)), info.complete, (index == selectedBountyIndex) and 'SELECTED' or '')
-        bountyQuests[info.questID] = info
       end
-    end
   end
   bountiesDirty = nil
 end
 
-function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen)
-  if isNewMap then
-    print('|cFF00FF88OnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap)
-    if isMapOpen then
-      self:Refresh(true)
-    else
-      self.isStale = true
-    end
-  else
-
-    rprint('|cFFFFFF00'..self:GetName()..':OnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap)
-  end
-end
-
 
 local totalPins = 0
 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation
@@ -336,21 +347,19 @@
       --print('|cFF00FF00Creating', name)
       pin = CreateFrame('Frame', name, WorldMapPOIFrame, 'WorldPlanQuestPin')
 
+      pin:SetID(totalPins)
       pin:SetFrameStrata('HIGH')
-      pin.GetTypeInfo = function(frame, typeID)
-        return self:GetTypeInfo(typeID)
-      end
-      pin:SetID(totalPins)
       numOverlays = numOverlays + 1
       --pin.iconBorder:SetVertexColor(0,0,0,1)
     end
     pin.questID = questID
     pin.worldQuest = true
-    pin.throttle = 1
+    pin.throttle = pin.updateRate
     pin.isNew = true
     pin.currentWidth = nil
     db.QuestsByID[questID] = pin
     tinsert(db.UsedPins, pin)
+
   end
 
   if pin and info then
@@ -358,12 +367,22 @@
     pin.floor = info.floor
     pin.numObjectives = info.numObjectives or 0
     if info.x and info.y then
-      pin.x = info.x or pin.x
-      pin.y = info.y or pin.y
-      --rprint('|cFFFF4400coords|r', info.x, info.y)
+      if (info.x ~= pin.x) or (info.y ~= pin.y) then
+        pin.isStale = true
+        --rprint('|cFFFF4400SetCoords|r', info.x, info.y)
+      end
+
     end
   end
 
+  pin.x = info.x or pin.x
+  pin.y = info.y or pin.y
+
+  if not HaveQuestData(questID) then
+    TQ_RequestPreloadRewardData(questID);
+  end
+
+
   if (not pin.dataLoaded) then
     local dataLoaded = pin:GetData()
     isDataLoaded = (isDataLoaded and dataLoaded)
@@ -372,8 +391,9 @@
 
 
   pin.isActive = TQ_IsActive(questID)
+  pin:GetCriteriaState()
   pin:CheckFilterRules()
-  rprint(pin:GetID(), pin.filtered, pin.used)
+  --rprint(pin:GetID(), pin.filtered, pin.used)
 
   return pin
 end
@@ -386,7 +406,7 @@
     db.QuestsByID[id] = nil
 
     for i, zone in pairs(db.QuestsByZone) do
-      print('-', i, zone[i])
+      --print('-', i, zone[i])
       zone[id] = nil
     end
     db.TasksByID[id] = nil
@@ -397,49 +417,53 @@
   tinsert(db.FreePins, pin)
 
   WorldPlan.dataFlush = true
-  print('|cFF00FF00-'.. (pin.mapID and GetMapNameByID(pin.mapID) or '???') ..'|r', id, pin.title)
+  --print('|cFF00FF00-'.. (pin.mapID and GetMapNameByID(pin.mapID) or '???') ..'|r', id, pin.title)
 end
 
 -- re-anchors and scales pins that have had either of these changed due to data loading delays
-function Module:RefreshIfQueued()
-  print('|cFF00FF88RefreshIfQueued()')
+function Module:UpdateNext()
+  --print('|cFF00FF88UpdateNext()')
   local pin = tremove(db.UpdatedPins)
-  while pin do
     pin:CheckFilterRules()
 
-    local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1]
-    print(pin.title, pin.dataLoaded  and not pin.filtered, scaleFactor)
-    if pin.used then
-      pin:SetAnchor(nil, pin.x, pin.y, self.hostWidth, self.hostHeight, scaleFactor)
-      if pin.isNew then
-        pin:OnShow()
-      end
-    end
+  local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1]
+  --print(pin.title, pin.dataLoaded  and not pin.filtered, scaleFactor)
+  if pin.used then
+    pin:SetAnchor(nil, pin.x, pin.y, self.hostWidth, self.hostHeight, scaleFactor)
+    pin:OnShow()
+  end
 
-    pin = tremove(db.UpdatedPins)
 
-  end
 end
 
+function Module:Debug(...)
+  print(...)
+end
 
 local msg = '|cFF00FF88WorldQuests:Refresh()|r|cFF00FFFF'
+local lastRefresh
 function Module:Refresh(...)
+  --
 
-  rprint(msg, ...)
   if not self:IsVisible() then
-    rprint('|cFF00FF88WorldQuests:Refresh()|r', ...)
-    self.isStale = true
-    return self:MarkAllPins()
+    print('|cFFFF4400Refresh()|r', ...)
+    --layoutDirty = true
+    return
   else
-    rprint('|cFF00FF88WorldQuests:Refresh()|r', ...)
-    print('|cFF00FF88WorldQuests:Refresh()|r', ...)
+    --
+    if lastRefresh == GetTime() then
+      print('|cFFFF4400multiple refreshes tried')
+    end
+    lastRefresh = GetTime()
+    --rprint(msg, ...)
+    print(msg, lastRefresh, ...)
   end
 
   if not db.Config.EnablePins then
     numShown = 0
     return
   end
-  wprint('  '..msg)
+  --wprint('  '..msg)
 
   scaleConstant = db.isContinentMap and 2 or 3
   canTargetQuests = SpellCanTargetQuest()
@@ -449,10 +473,12 @@
   end
 
   self:UpdateAnchors()
+--[[
   if bountiesDirty then
-    print('  bounties dirty, pushing that')
+    --print('  bounties dirty, pushing that')
     self:UpdateBounties()
   end
+  --]]
 
 
   -- calculate quests shown
@@ -462,9 +488,11 @@
     local oV = pin:IsShown()
     if pin.used then
       pin.throttle = 1
+      --[[
       if oV == false then
-        rprint('|cFF00FF00cleanup +|r', questID, pin.title)
+        --rprint('|cFF00FF00cleanup +|r', questID, pin.title)
       end
+      --]]
       pin:SetShown(true)
       numShown = numShown + 1
       if pin.dataLoaded then
@@ -472,36 +500,47 @@
       end
 
     else
+      --[[
       if oV == true then
         rprint('|cFFFF4400 -|r', questID, pin.title)
       end
+      --]]
       pin.hideReason = "Not used in map area " .. (db.currentMapID)
-      pin:HideFrames()
+      pin:SetShown(false)
     end
   end
 
 
-
-  print(' ', numShown, 'shown,', numLoaded, 'with data')
+  --print('flags ', layoutDirty, self.isStale)
+  --print(' ', numShown, 'shown,', numLoaded, 'with data')
   if numShown > numLoaded then
     self.Status:Show()
   end
 
+--
+  if layoutDirty or self.isStale then
+
+    self.refreshBenchMark = GetTime()
+    self.refreshBenchMarkTicker = 2
+    print('starting bench', self.refreshBenchMark)
+  end
+--
 
   layoutDirty = nil
   self.isStale = nil
   self.sizesDirty = nil
   self.isZoomDirty = nil
+
 end
 
 local refreshReason
-function Module:RefreshIfChanged()
+function Module:RefreshIfChanged(event)
   local scaleCheck = WorldMapDetailFrame:GetScale()
   refreshReason = nil
   if scaleCheck ~= currentScale then
     refreshReason = 'map scale updated'
-    self:Refresh('WORLD_MAP_SCALE_CHANGED')
     currentScale = scaleCheck
+    layoutDirty = true
   elseif self.isStale or layoutDirty then
     refreshReason = 'layout is marked dirty'
   end
@@ -512,70 +551,56 @@
 
   if self:IsVisible() then
     print('|cFF00FFFFRefreshIfChanged()|r', refreshReason)
-    self:Refresh('WORLDMAP_QUEUED')
+    self:Refresh(event)
   else
-    rprint('|cFF00FFFFRefreshIfChanged()|r flagging for later refresh', refreshReason)
+    print('|cFF00FFFFRefreshIfChanged()|r', refreshReason)
     self.isStale = true
   end
 end
 
 -- update visibility states of all pins
 function Module:MarkAllPins(pins)
-  print('  |cFFFFFF00'..self:GetName()..':MarkAllPins()|r', pins)
+  --print('  |cFFFFFF00'..self:GetName()..':MarkAllPins()|r', pins)
   pins = pins or db.QuestsByID
   for questID, pin in pairs(pins) do
     pin.isStale =  true
-    rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used)
-  end
-end
-
-function Module:UpdateQuestButton(info, mapID)
-  local questID, x, y = info.questId, info.x, info.y
-  local pin = self:AcquirePin(info)
-  if not pin then
-    return
-  end
-
-
-  local doUpdate = pin:GetCriteriaState() or pin.isStale
-  --print('  |- ', pin.questID, pin.title)
-  rprint('|cFF00FF00update|r', pin.questID, pin.title)
-
-  print(doUpdate)
-
-  if x and y then
-    local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1]
-    pin:SetFrameLevel(PinBaseIndex+pin:GetID())
-    pin.owningFrame = WorldMapFrame
-    pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor)
-    doUpdate = true
-    --tinsert(self.UsedPositions, pin)
-  end
-
-  if doUpdate then
-    print(' changed', pin.title, pin.isCriteria, pin.isBounty, pin.scaleFactor)
-    if pin:IsVisible() then
-      --numUpdated = numUpdated + 1
-      pin:Refresh('WORLDMAP_REFRESH')
-    else
-      --numHidden = numHidden + 1
-      pin.isStale = true
-    end
-  end
-
-  if mapID then
-    if not db.QuestsByZone[mapID] then
-      db.QuestsByZone[mapID] = {}
-    end
-    db.QuestsByZone[mapID][questID] = pin
+    --rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used)
   end
 end
 
 -- Updates quest markers in taskInfo while associating them with the given map
 function Module:UpdateQuestsForMap(taskInfo, mapID)
-  rprint('Map', GetMapNameByID(mapID), GetMapNameByID(db.currentMapID))
+  if mapID then
+    db.QuestsByZone[mapID] = db.QuestsByZone[mapID] or {}
+    wipe(db.QuestsByZone[mapID])
+  end
+  print('UpdateQuestsForMap()', GetMapNameByID(mapID), GetMapNameByID(db.currentMapID), layoutDirty)
   for index, info in pairs(taskInfo) do
-    self:UpdateQuestButton(info, mapID)
+
+    local questID, x, y = info.questId, info.x, info.y
+    local pin = self:AcquirePin(info)
+    if pin then
+      print(pin.title, pin.isStale)
+      if pin:IsShown() and (layoutDirty or pin.isStale) then
+        local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1]
+        pin.owningFrame = WorldMapFrame
+        pin:SetFrameLevel(PinBaseIndex+pin:GetID())
+        pin.Overlay:SetFrameLevel(overlayBaseIndex+pin:GetID())
+        pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor)
+        if pin.isStale then
+          pin:Refresh('WORLDMAP_REFRESH ' .. GetTime())
+        end
+        if mapID then
+          db.QuestsByZone[mapID][questID] = pin
+        end
+      else
+        if layoutDirty then
+          pin.isStale = true
+        end
+      end
+
+
+    end
   end
 end
 
@@ -591,7 +616,7 @@
   end
 
 
-  rprint('|cFF00FF00'..self:GetName()..':UpdateAnchors()')
+  --rprint('|cFF00FF00'..self:GetName()..':UpdateAnchors()')
   local mapFileName, textureHeight, textureWidth, isMicroDungeon, microDungeonMapName = GetMapInfo()
   if isMicroDungeon then
     return
@@ -618,7 +643,7 @@
   self:SetChecked(db.Config.EnablePins and true or false)
 end
 function ToggleButton:OnClick()
-  print(self:GetChecked())
+  --print(self:GetChecked())
   db.Config.EnablePins = self:GetChecked()
   _G.WorldPlan:OnConfigUpdate()
 end
\ No newline at end of file
--- a/WorldQuests.xml	Sat Apr 08 17:07:58 2017 -0400
+++ b/WorldQuests.xml	Mon Apr 10 07:13:29 2017 -0400
@@ -11,6 +11,17 @@
       <OnUpdate method="OnUpdate" />
       <OnShow method="OnShow" />
     </Scripts>
+    <Layers>
+
+      <Layer level="OVERLAY">
+        <FontString parentKey="debugMessage" inherits="GameFontNormal">
+          <Anchors>
+            <Anchor point="BOTTOMLEFT" />
+
+          </Anchors>
+        </FontString>
+      </Layer>
+    </Layers>
 
     <Frames>
       <CheckButton name="$parentToggle" parentKey="Toggle" >