diff QuestPOI.lua @ 49:dbd81d49af02

- Solve more frame data flagging issues - Unify method for resolving filter and visibility states - Flight Map modifications respect filter settings - Solve initial draw issues with tag icon, filter state handling - Solve issues with text layer synchronization during map changes
author Nenue
date Thu, 29 Dec 2016 13:31:20 -0500
parents c0b88bd1e40b
children 3066f3ef1258
line wrap: on
line diff
--- a/QuestPOI.lua	Tue Dec 27 19:46:40 2016 -0500
+++ b/QuestPOI.lua	Thu Dec 29 13:31:20 2016 -0500
@@ -25,6 +25,7 @@
 local wqprint = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end
 local iprint = DEVIAN_WORKSPACE and function(...) _G.print('ItemScan', ...) end or function() end
 local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or function() end
+local dprint = DEVIAN_WORKSPACE and function(...) _G.print('WQData', ...) end or function() end
 local QuestPOI = WorldPlanPOIMixin
 
 
@@ -60,7 +61,7 @@
 
 -- Pin color/display variables
 db.TooltipExtras = db.TooltipExtras or {} -- idiot-proofing
-
+db.PinAlpha = 1
 
 local familiars = {
     [42159] = 'Nightwatcher Merayl',
@@ -109,22 +110,18 @@
   local _, name, _, completed, _, _, _, _, _, icon = GetAchievementInfo(achievementID)
   if not completed then
 
-    WorldMapTooltip:AddLine(" ")
-    WorldMapTooltip:AddLine("Achievements:")
-    WorldMapTooltip:AddLine(' |T'..icon..':20:20|t '..name)
-
     local numItems = GetAchievementNumCriteria(achievementID)
     local numNeeded = 0
     local tooltipLines = {}
     for i =1, numItems do
       local criteriaName, criteriaType, completed, _, _, _, _, subAchievementID = GetAchievementCriteriaInfo(achievementID, i)
-      print(GetAchievementCriteriaInfo(achievementID, i))
+      --print(GetAchievementCriteriaInfo(achievementID, i))
 
       if not completed then
-        print('::', criteriaName, completed, subAchievementID)
+        --print('::', criteriaName, completed, subAchievementID)
         if criteriaType == 8 then
           local _, _, _, completed, _, _, _, _, _, subIcon = GetAchievementInfo(subAchievementID)
-          print(' -', criteriaName, completed, subIcon)
+          --print(' -', criteriaName, completed, subIcon)
           if not completed then
             local numCompleted = 0
             local numSubItems = GetAchievementNumCriteria(subAchievementID)
@@ -132,7 +129,7 @@
             for j = 1, numSubItems do
               local subName, _, completed = GetAchievementCriteriaInfo(subAchievementID, j)
 
-              print('   -',subName, completed)
+              --print('   -',subName, completed)
               if completed then
                 numCompleted = numCompleted + 1
               else
@@ -154,14 +151,14 @@
         end
       end
     end
-    if numNeeded >= 1 then
+    if hasInfo then
+      WorldMapTooltip:AddLine(" ")
+      WorldMapTooltip:AddLine("Achievements:")
+      WorldMapTooltip:AddLine(' |T'..icon..':20:20|t '..name)
       for i, line in ipairs(tooltipLines) do
         WorldMapTooltip:AddLine(line)
       end
-    else
-      WorldMapTooltip:AddLine('Criteria completed!', 0, 1, 0)
     end
-
   end
   return hasInfo
 end
@@ -193,13 +190,12 @@
 function QuestPOI:OnEnter()
   if not WorldMapFrame:IsVisible() then
     WorldMap_HijackTooltip(self.owningFrame)
-  else
-    if self.filtered then
-      return
-    end
+  end
+  if self.filtered then
+    return
   end
   WorldMapTooltip:SetOwner(self, "ANCHOR_RIGHT");
-  print('doing tooltip stuff')
+  --print('doing tooltip stuff')
 
   -- Can't add stuff after, so most of the blizzard tooltip hook is simply copied over
   local questID = self.questID
@@ -267,10 +263,10 @@
 -- attempt to pull pin data
 local GetQuestTagInfo, GetProfessionInfo = GetQuestTagInfo, GetProfessionInfo
 function QuestPOI:GetData ()
-  qprint('|cFF00FF88'..self:GetName()..':GetWorldQuestInfo()|r')
+  dprint('|cFF00FF88'..self:GetID()..':GetData()|r')
   local questID = self.questID
   if not questID then
-    rprint('|cFFFF4400bad pin|r', self:GetName())
+    dprint('|cFFFF4400bad pin|r', self:GetName())
     return nil
   end
 
@@ -278,10 +274,14 @@
   -- if the title is nil, then wait and try later
   if not questTitle then
     self.isPending = true
-    rprint('|cFFBB8844nodata|r|cFF00FFFF', self.questId)
+    dprint('|cFFBB8844isPending=true|r|cFF00FFFF', self.questId)
   else
     self.title, self.factionID, self.capped = questTitle, factionID, capped
-    rprint('|cFFBB8844  data|r|cFF00FFFF', (self.isPending and 'late|r' or 'jit|r'), self.title, '|r', self.factionID)
+    dprint('|cFFBB8844  data|r|cFF00FFFF', (self.isPending and '|cFFFF4400delayed|r' or '|cFF00FF00success|r'), self.title, '|r', self.factionID)
+    if self.dataLoaded then
+      dprint('  |cFFFF4400overwriting data|r')
+    end
+
     -- set tag details
     local worldQuestType
     self.tagID, self.tagName, worldQuestType, self.rarity, self.isElite, self.tradeskillLineIndex = GetQuestTagInfo(questID);
@@ -312,6 +312,7 @@
     qprint('  ', tostring(self.title), " |T"..tostring(self.itemTexture)..":12:12|t", tostring(self.itemName))
 
     if self.itemTexture and self.itemName and self.title then
+      self.dataLoaded = true
       self.isPending = nil
       self.throttle = 1
       self.updateRate = PIN_REFRESH_DELAY
@@ -348,9 +349,9 @@
       rewardType = REWARD_CASH
     end
 
-  print('  '..self.questID..':|cFFFFFF00SetRewardInfo():', rewardType)
+  qprint('  '..self.questID..':|cFFFFFF00SetRewardInfo():', numRewards, rewardType)
     self.itemNumber = tonumber(rewardCount or self.itemNumber)
-    self.rewardType = rewardType or REWARD_GEAR
+    self.rewardType = rewardType
     self.quality = quality
 
     self.itemTexture = rewardIcon or self.itemTexture
@@ -373,20 +374,15 @@
 end
 
 -- run from OnShow if .isNew is set
-function QuestPOI:OnNew()
 
+function QuestPOI:StartFade()
   if not self.isAnimating then
     --qprint('|cFFFFFF00'.. self.title .. ' added to quest log.')
     self:SetAlpha(0)
-    if db.Config.FadeWhileGrouped then
-      self.FadeIn.FadeIn:SetToAlpha(0.15)
-      self.PendingFade.FadeIn:SetToAlpha(0.15)
-      self.PendingFade.FadeOut:SetFromAlpha(0.15)
-    else
-      self.FadeIn.FadeIn:SetToAlpha(1)
-      self.PendingFade.FadeIn:SetToAlpha(1)
-      self.PendingFade.FadeOut:SetFromAlpha(1)
-    end
+      self.FadeIn.FadeIn:SetToAlpha(db.PinAlpha)
+      self.PendingFade.FadeIn:SetToAlpha(db.PinAlpha)
+      self.PendingFade.FadeOut:SetFromAlpha(db.PinAlpha)
+
     self.isAnimating = true
     self.isNew = nil
     self.isStale = true
@@ -394,58 +390,73 @@
   end
 end
 
+function QuestPOI:EndFade()
+  self.isAnimating = nil
+  self:SetAlpha(db.PinAlpha)
+end
+
 function QuestPOI:OnShow ()
 
   if self.isNew then
     qprint('|cFFFFFF00'..tostring(self:GetName())..':OnShow()|r update:', self.isStale, 'new:', self.isNew, 'animation:', self.isAnimating)
     --qprint('|cFFFFFF00popping new pin handler')
-    self:OnNew()
+    self:StartFade()
   elseif not self.isAnimating then
     self:SetAlpha(1) -- fix stuck alpha
   end
 
-  if self.isNew or self.isStale then
+  if self.isStale then
+    qprint('|cFF0088FFflagged for refresh')
     self:Refresh()
   end
   --WorldPlan:print(self:GetAlpha())
 
+  if not self.Overlay:IsShown() then
+    self:StartFade()
+  end
+
+
+  self.Overlay:SetShown(true)
 end
 function QuestPOI:OnHide()
-  --qprint('|cFFFFFF00["'..tostring(self.title)..'"]|r:OnHide()')
-  if not self:IsShown() then
-    self.isAnimating = nil
-    self:SetAlpha(1)
-  end
-
+  qprint('|cFFFFFF00'..self:GetID()..'r:OnHide()')
+  self.isAnimating = nil
+  self:SetAlpha(db.PinAlpha)
   self.Overlay:SetShown(false)
 end
 
-function QuestPOI:SetAnchor(frame, mapID, mapWidth, mapHeight)
-  qprint('  |cFF00FF00'..self:GetName()..':SetAnchor()|r', self.questID, mapID)
-  self:ClearAllPoints()
-  local dX, dY = TQ_GetQuestLocation(self.questID)
-  if not dX or dX == 0 then
-    local _, x, y = QuestPOIGetIconInfo(self.questID)
-    if x and floor(x) ~= 0 then
-      dX, dY = x, y
-    else
-      dX, dY = self.x, self.y
+local overlayBaseIndex = 1300
+function QuestPOI:SetAnchor(dX, dY, mapWidth, mapHeight)
+  local oX, oY = self.x, self.y
+  if not (dX and dY) then
+    local dX, dY = TQ_GetQuestLocation(self.questID)
+    if not dX or dX == 0 then
+      local _, x, y = QuestPOIGetIconInfo(self.questID)
+      if x and floor(x) ~= 0 then
+        dX, dY = x, y
+      else
+        dX, dY = self.x, self.y
+      end
     end
   end
-  local oX, oY = self.x, self.y
-  self.x = dX
-  self.y = dY
-
-
+  if not (mapHeight and mapWidth) then
+    mapWidth, mapHeight = self:GetParent():GetSize()
+  end
   local pX = (dX * mapWidth)
   local pY = (-dY * mapHeight)
 
-  if oX ~= dX then
-    wqprint('  |cFF00FF00'..self.questID..':|r', oX, dX, format("%0.2f %0.2f", pX, pY))
-  end
 
-  self:SetParent(WorldMapPOIFrame)
-  self:SetPoint('CENTER', frame, 'TOPLEFT', pX, pY)
+  self.x = dX
+  self.y = dY
+  self:ClearAllPoints()
+  self:SetPoint('CENTER', self:GetParent(), 'TOPLEFT', pX, pY)
+  self:SetShown(self.used)
+
+  self.Overlay:SetParent(self:GetParent())
+  self.Overlay:ClearAllPoints()
+  self.Overlay:SetPoint('TOPLEFT', self, 'TOPLEFT', 0, 4)
+  self.Overlay:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', 0, -4)
+  self.Overlay:SetFrameLevel(overlayBaseIndex + self:GetID())
 end
 
 function QuestPOI:OnLoad()
@@ -489,10 +500,11 @@
   -- query for reward data if it wasn't found in the original scan
   local questID = self.questID
   if self.isPending then
-      self:GetData()
-    if not (self.PendingFade:IsPlaying() or self.isAnimating) then
+    print('|cFFFF4400'..self:GetID()..':|r polling reward info')
+    if not (self.isAnimating) then
       self.PendingFade:Play()
     end
+    self:GetData()
     return
   else
     if self.PendingFade:IsPlaying() then
@@ -525,12 +537,15 @@
 
 
 
-function QuestPOI:Refresh ()
-  print('|cFF00FF88'..self:GetName()..'|r:Refresh()')
+function QuestPOI:Refresh (fromUser)
+
+  --rprint('|c'..(fromUser and 'FF0088FF' or 'FF00FF88' )..self:GetID()..'|r:Refresh() type =', self.rewardType, 'title =', self.title)
+
+
 
   local styleType = (self.isPending and STYLE_TYPE_PENDING) or self.rewardType
   local style,subStyle =  self:GetTypeInfo(self.rewardType)
-  if self.filtered then
+  if self.filtered and (self.questID ~= GetSuperTrackedQuestID()) then
     subStyle = style.minimized
   end
   self.style = style
@@ -587,11 +602,9 @@
     icon:SetVertexColor(style.r, style.g, style.b)
   end
 
-  local borderStyle = style
   iconBorder:SetMask("Interface\\Minimap\\UI-Minimap-Background")
   iconBorder:SetTexture(PENDING_BORDER)
-
-  iconBorder:SetVertexColor(borderStyle.r, borderStyle.g, borderStyle.b, 1)
+  iconBorder:SetVertexColor(style.r, style.g, style.b, 1)
   iconBorder:SetDesaturated(true)
   iconBorder:SetAlpha(subStyle.alpha or 1)
 
@@ -599,15 +612,9 @@
   trackingBorder:SetTexture(PENDING_BORDER)
   trackingBorder:SetVertexColor(0,0,0,1)
 
-  self.tagIcon:SetShown(self.tagSize and true or false)
+  self.tagIcon:SetShown((not self.filtered) and true or false)
   self.tagIcon:SetAtlas(self.tagAtlas)
-  self.tagIcon:SetAlpha(subStyle.alpha or 1)
-  self.Overlay:SetShown(true)
-  self.Overlay:ClearAllPoints(self)
-  self.Overlay:SetParent(self:GetParent())
-  self.Overlay:SetFrameLevel(self:GetFrameLevel()+200)
-  self.Overlay:SetPoint('TOPLEFT', self, 'TOPLEFT', 0, 4)
-  self.Overlay:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', 0, -4)
+
   self.EliteBorder:SetShown(self.isElite and not self.filtered)
 
 
@@ -639,7 +646,7 @@
       filtered = true
     end
   end
-  return filtered
+  self.filtered = filtered
 end
 
 function QuestPOI:IsShowable ()
@@ -647,27 +654,22 @@
   local qType = self.worldQuestType
 
   if not self.worldQuest then
-    print('ignoring showable check')
+    --print('ignoring showable check')
     return self.used, self.filtered
   end
   self.used = TQ_IsActive(self.questID)
-
   if qType == LE_QUEST_TAG_TYPE_PROFESSION then
-    qprint('hide flags:', (not self.isKnownProfession), (db.Config.ShowAllProfessionQuests == false))
     if (not self.isKnownProfession) and  (db.Config.ShowAllProfessionQuests == false) then
-      qprint(self.used)
       self.used = nil
-      qprint(self.used)
     end
   end
-  print('  '..self.questID..':|cFFFFFF00IsShowable()|r ', self.used, self.title)
-  return self.used
+  rprint('  '..self.questID..':|cFFFFFF00IsShowable()|r ', self.used, self.title)
 end
 
 --- Fixes icons upon size update
 function QuestPOI:UpdateSize ()
 
-  qprint('|cFF00FF88'..self:GetName()..'|r:UpdateSize()', self.style, self.subStyle)
+  --qprint('|cFF00BB88'..self:GetID()..'|r:UpdateSize()', self.style, self.subStyle)
 
   local style = self.style
   local subStyle = self.subStyle