changeset 16:880828018bf4

ObjectiveEvents - trim down the number of events that fire full updates - begin the general outline for determining which trackers need to refresh - handlers for accepting and completing auto-popup quests ObjectiveFrame - correct variables for money reward calculation - make sure everythign is scaling to the font strings and that the font strings aren't being pinned by SetSize ObjectiveInfo - implementation of autoquest popups - discern between internal and client bonus objective indexes - acquire the correct data set from bonus objective query ObjectiveStyle - look for a style table under the previously interpreted set before deferring standard options - horizontal/vertical options in gradient - remove height-fixing for font strings
author Nenue
date Tue, 05 Apr 2016 00:39:12 -0400
parents f660f1c1e0aa
children c33497b116d6
files ObjectiveCore.lua ObjectiveEvents.lua ObjectiveFrame.lua ObjectiveInfo.lua ObjectiveStyle.lua ObjectiveTracker.xml ObjectiveUI.lua ObjectiveWidgets.lua
diffstat 8 files changed, 341 insertions(+), 176 deletions(-) [+]
line wrap: on
line diff
--- a/ObjectiveCore.lua	Mon Apr 04 03:41:28 2016 -0400
+++ b/ObjectiveCore.lua	Tue Apr 05 00:39:12 2016 -0400
@@ -6,9 +6,9 @@
 local B = select(2,...).frame
 local pairs, setmetatable, type, tostring = pairs, setmetatable, type, tostring
 local format = string.format
-local M = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
 local print = B.print('Objectives')
-local ObjectiveTrackerFrame = ObjectiveTrackerFrame
+local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame
 
 --[[
   Full quest info is available if:
@@ -25,95 +25,95 @@
     - Its binary completion status
 
 ]]
---- Global Frames
-local Wrapper = _G.VeneerObjectiveWrapper
-local Scroller = Wrapper.scrollArea
-local Scroll = _G.VeneerObjectiveScroll
+
+
+--- Performance values
+--[[
+  self:RegisterEvent("QUEST_LOG_UPDATE");
+	self:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED");
+	self:RegisterEvent("QUEST_WATCH_LIST_CHANGED");
+	self:RegisterEvent("QUEST_AUTOCOMPLETE");
+	self:RegisterEvent("QUEST_ACCEPTED");
+	self:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED");
+	self:RegisterEvent("SCENARIO_UPDATE");
+	self:RegisterEvent("SCENARIO_CRITERIA_UPDATE");
+	self:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE");
+	self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
+	self:RegisterEvent("ZONE_CHANGED");
+	self:RegisterEvent("QUEST_POI_UPDATE");
+	self:RegisterEvent("VARIABLES_LOADED");
+	self:RegisterEvent("QUEST_TURNED_IN");
+	self:RegisterEvent("PLAYER_MONEY");
+ ]]
+mod.Reason ={
+  UPDATE_MASK_AUTOQUEST            = 0x00000001,
+  UPDATE_MASK_QUEST                = 0x00000002,
+  UPDATE_MASK_BONUS                = 0x00000004,
+  UPDATE_MASK_CHEEVS               = 0x00000008,
+  UPDATE_MASK_ALL                  = 0x00000017,
+
+  QUEST_LOG_UPDATE                 = 0x00000003,
+  TRACKED_ACHIEVEMENT_LIST_CHANGED = 0x00000008,
+  QUEST_WATCH_LIST_CHANGED         = 0x00000003,
+  QUEST_AUTOCOMPLETE               = 0x00000003,
+  QUEST_ACCEPTED                   = 0x00000003,
+  SUPER_TRACKED_QUEST_CHANGED      = 0x00000002,
+  SCENARIO_UPDATE                  = 0x00000004,
+  SCENARIO_CRITERIA_UPDATE         = 0x00000004,
+  TRACKED_ACHIEVEMENT_UPDATE       = 0x00000008,
+  ZONE_CHANGED_NEW_AREA            = 0x00000017,
+  ZONE_CHANGED                     = 0x00000017,
+  QUEST_POI_UPDATE                 = 0x00000003,
+  QUEST_TURNED_IN                  = 0x00000003,
+}
+mod.MoneyReasons = 0
 
 --- Baseline defaults
-M.defaults = {
-
-}
+mod.defaults = {}
 
 --- list used to make things happen
-M.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
+mod.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
 
 --- ipairs() list of handlers for wrapper update
-M.orderedHandlers = {}
-M.orderedTrackers = {}
-M.indexedTrackers = {}
+mod.orderedHandlers = {}
+mod.orderedTrackers = {}
+mod.indexedTrackers = {}
 --- pairs() list of handler frames for tracker updates
-M.namedTrackers = {}
+mod.namedTrackers = {}
 
 --- Handler stubs
-M.AutoQuest = {
+mod.AutoQuest = {
   name = "AutoQuest",
-  displayName = "Local Quests",
+  displayName = "Notice",
 }
-M.Quest = {
+mod.Quest = {
   name = "Quest",
   displayName = "Quests",
 }
-M.Cheevs = {
+mod.Cheevs = {
   name = "Cheevs",
   displayName = "Achievements",
 }
-M.Bonus = {
+mod.Bonus = {
   name = "Bonus",
   displayName = "Bonus Objectives",
 }
 
-
---- Temp values set during updates
-local wrapperWidth, wrapperHeight
-local scrollWidth, scrollHeight
-local previousBlock
-local currentBlock
-
-local frame_guide_init = function(self)
-  self.testU = self.testU or self:CreateTexture('TestU', 'OVERLAY', 'VnTestLine')
-  self.testB = self.testB or self:CreateTexture('TestB', 'OVERLAY', 'VnTestLine')
-  self.testL = self.testL or self:CreateTexture('TestL', 'OVERLAY', 'VnTestLine')
-  self.testR = self.testR or self:CreateTexture('TestR', 'OVERLAY', 'VnTestLine')
-end
-local frame_guide = function(self, target)
-  if not target then return end
-  if target:IsDragging() then return end
-  local thickness = 1
-  local midX, midY = target:GetCenter()
-  local width, height = target:GetWidth() * 1.5, target:GetHeight() * 1.5
-  --print('frame', target:GetLeft(), target:GetTop(), target:GetRight(), target:GetBottom())
-  self.testB:ClearAllPoints()
-  self.testB:SetPoint('TOP', UIParent, 'BOTTOMLEFT', midX, target:GetBottom())
-  self.testB:SetSize(width,thickness)
-
-  self.testU:ClearAllPoints()
-  self.testU:SetPoint('BOTTOM', UIParent, 'BOTTOMLEFT', midX, target:GetTop())
-  self.testU:SetSize(width,thickness)
-
-  self.testL:ClearAllPoints()
-  self.testL:SetPoint('RIGHT', UIParent, 'BOTTOMLEFT', target:GetLeft(), midY)
-  self.testL:SetSize(thickness,height)
-
-  self.testR:ClearAllPoints()
-  self.testR:SetPoint('LEFT', UIParent, 'BOTTOMLEFT', target:GetRight(), midY)
-  self.testR:SetSize(thickness,height)
-end
-
 --- Handler template
 local CreateHandler = function (self, name, index)
   print(self, name)
-  local handler = setmetatable({}, {
+
+  local handler = setmetatable(mod[name] or {}, {
     __tostring = function() return name end,
-    __call = function (self) M.UpdateTracker(self) end
+    __call = function (self) mod.UpdateTracker(self) end
   })
-  if type(M.orderedHandlers[index]) == 'table' then
-    return M.orderedHandlers[index]
+  if type(mod.orderedHandlers[index]) == 'table' then
+    return mod.orderedHandlers[index]
   end
 
   print('take up locals first')
   local preset = {}
-  for k,v in pairs(M[name]) do
+  for k,v in pairs(mod[name]) do
     preset[k] = true
     if type(v) == 'table' then
       handler[k] = {}
@@ -122,6 +122,7 @@
     end
   end
 
+
   print('resulting handler contents')
   for k, v in pairs(self) do
     if not handler[k] then
@@ -129,7 +130,7 @@
         -- assume all tables to be local data; don't inherit or ref
         handler[k] = {}
       else
-        handler[k] = M.Tracker[k]
+        handler[k] = mod.Tracker[k]
       end
     else
       print(name, 'has its own', k)
@@ -137,18 +138,20 @@
   end
   print('|cFFFF4400'..tostring(name)..'|r:')
   for k, v in pairs(handler) do
-    print(string.format("%24s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
+    print(format("%24s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
   end
-  M[name] = handler
-  M.orderedHandlers[index] = handler
+
+  mod[name] = handler
+
+  mod.orderedHandlers[index] = handler
   return true
 end
 
-M.Tracker = setmetatable({}, {
+mod.Tracker = setmetatable({}, {
   __call = CreateHandler,
   __tostring = function() return 'DEFAULT_TRACKING_HANDLER' end
 })
-local Tracker = M.Tracker
+local Tracker = mod.Tracker
 Tracker.numWatched = 0   --- number of entries being handled
 Tracker.numBlocks = 0    --- number of blocks created
 Tracker.actualBlocks = 0 --- number of blocks in use
@@ -159,10 +162,8 @@
 Tracker.Watched = {}     -- find by watchIndex
 Tracker.Info = {}        -- find by data ID
 Tracker.BlockInfo = {}   -- find by block ID
-Tracker.LogInfo = {}     -- find by log ID (quest log mainly)
-Tracker.WatchInfo = {}
-Tracker.LogBlock = {}
-Tracker.WatchBlock = {}
+Tracker.WatchInfo = {}   -- find data  by watch index
+Tracker.WatchBlock = {}  -- find block by watch index
 
 
 
@@ -173,8 +174,8 @@
       block = handler.freeBlocks[#handler.freeBlocks]
       handler.freeBlocks[#handler.freeBlocks] = nil
     else
-      block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, Scroll, 'VeneerTrackerBlock')
-      block.SetStyle = M.SetBlockStyle
+      block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, VeneerObjectiveScroll, 'VeneerTrackerBlock')
+      block.SetStyle = mod.SetBlockStyle
       block.Select = handler.Select
       block.Open = handler.Open
       block.Remove = handler.Remove
@@ -189,38 +190,10 @@
   return handler.usedBlocks[blockIndex]
 end
 
-function M:OnInitialize()
+function mod:OnInitialize()
   self.InitializeWrapper()
   self.InitializeXPTracker()
-  M.SetEvents()
+  mod.SetEvents()
   ObjectiveTrackerFrame:UnregisterAllEvents()
   ObjectiveTrackerFrame:Hide()
-
 end
-
---[[
-QUESTLINE_UPDATE	This event is not yet documented
-QUESTTASK_UPDATE	This event is not yet documented
-QUEST_ACCEPTED	Fires when a new quest is added to the player's quest log (which is what happens after a player accepts a quest).
-QUEST_ACCEPT_CONFIRM	Fires when certain kinds of quests (e.g. NPC escort quests) are started by another member of the player's group
-QUEST_AUTOCOMPLETE	Fires when a quest is automatically completed (remote handin available)
-QUEST_BOSS_EMOTE	This event is not yet documented
-QUEST_CHOICE_CLOSE	This event is not yet documented
-QUEST_CHOICE_UPDATE	This event is not yet documented
-QUEST_COMPLETE	Fires when the player is looking at the "Complete" page for a quest, at a questgiver.
-QUEST_DETAIL	Fires when details of an available quest are presented by a questgiver
-QUEST_FINISHED	Fires when the player ends interaction with a questgiver or ends a stage of the questgiver dialog
-QUEST_GREETING	Fires when a questgiver presents a greeting along with a list of active or available quests
-QUEST_ITEM_UPDATE	Fires when information about items in a questgiver dialog is updated
-QUEST_LOG_UPDATE	Fires when the game client receives updates relating to the player's quest log (this event is not just related to the quests inside it)
-QUEST_POI_UPDATE	This event is not yet documented
-QUEST_PROGRESS	Fires when interacting with a questgiver about an active quest
-QUEST_REMOVED	This event is not yet documented
-QUEST_TURNED_IN	Fired when a quest is turned in
-QUEST_WATCH_LIST_CHANGED	This event is not yet documented
-QUEST_WATCH_OBJECTIVES_CHANGED	This event is not yet documented
-QUEST_WATCH_UPDATE	Fires when the player's status regarding a quest's objectives changes, for instance picking up a required object or killing a mob for that quest. All forms of (quest objective) progress changes will trigger this event.]
-
-TRACKED_ACHIEVEMENT_LIST_CHANGED	This event is not yet documented
-TRACKED_ACHIEVEMENT_UPDATE	Fires when the player's progress changes on an achievement marked for watching in the objectives tracker
- ]]
\ No newline at end of file
--- a/ObjectiveEvents.lua	Mon Apr 04 03:41:28 2016 -0400
+++ b/ObjectiveEvents.lua	Tue Apr 05 00:39:12 2016 -0400
@@ -13,10 +13,31 @@
   QUEST_REMOVED = 'OnQuestRemoved'
 }
 
+--- Using the same values as Blizzard_ObjectiveTracker for use in securehook
+local OBJECTIVE_TRACKER_UPDATE_QUEST				        		= 0x0001;
+local OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED		      		= 0x0002;
+local OBJECTIVE_TRACKER_UPDATE_TASK_ADDED		    	  		= 0x0004;
+local OBJECTIVE_TRACKER_UPDATE_SCENARIO			      	  	= 0x0008;
+local OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE		  	= 0x0010;
+local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT			      	= 0x0020;
+local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED		  	= 0x0040;
+local OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED		= 0x0080;
+
+local OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST			      	= 0x0100;
+local OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP	= 0x0200;
+local OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE		= 0x0400;
+local OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO	    		= 0x0800;
+local OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT		  	= 0x1000;
+
+local OBJECTIVE_TRACKER_UPDATE_STATIC					        	= 0x0000;
+local OBJECTIVE_TRACKER_UPDATE_ALL				          		= 0xFFFF;
+
+local OBJECTIVE_TRACKER_UPDATE_REASON                   = OBJECTIVE_TRACKER_UPDATE_ALL;		-- default
+local OBJECTIVE_TRACKER_UPDATE_ID                       = 0;
+
 local HandlerEvents = {
-  QUEST_ACCEPTED = mod.Quest,
-  QUEST_REMOVED = mod.Quest,
-  QUEST_WATCH_LIST_CHANGED = mod.Quest,
+  QUEST_ACCEPTED = 0x0003,
+  QUEST_WATCH_LIST_CHANGED = 0x0003,
   SUPER_TRACKED_QUEST_CHANGED = mod.Quest,
   QUEST_LOG_UPDATE = mod.Quest,
   TRACKED_ACHIEVEMENT_LIST_CHANGED = mod.Cheevs,
@@ -29,6 +50,7 @@
   ['AbandonQuest'] = 'AbandonQuest',
   ['AcknowledgeAutoAcceptQuest'] = 'AcknowledgeAutoAcceptQuest',
   ['AddAutoQuestPopUp'] = 'AddAutoQuestPopUp',
+  ['RemoveAutoQuestPopUp'] = 'RemoveAutoQuestPopUp',
   ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement'
 }
 
@@ -70,7 +92,7 @@
   end
   if HandlerEvents[event] then
     print('|cFF0088FF'..event..'|r wrapper update')
-    mod.UpdateWrapper()
+    mod.UpdateWrapper(event)
     isHandled = true
   end
   if not isHandled then
@@ -99,7 +121,7 @@
 
 mod.OnQuestRemoved = function(_, questLogIndex, questID)
 
-  mod.UpdateWrapper()
+  mod.UpdateWrapper(0x00000003)
 
 end
 
@@ -109,7 +131,7 @@
 --- Function hooks for BlizzUI compatibility
 -------------------------------------------------------------------
 mod.AddQuestWatch = function(questID)
-  mod.UpdateWrapper()
+  mod.UpdateWrapper(0x00000003)
 end
 
 mod.RemoveQuestWatch = function(questIndex, ...)
@@ -126,7 +148,7 @@
     mod.Quest.WatchInfo[info.watchIndex] = nil
   end
 
-  mod.UpdateWrapper()
+  mod.UpdateWrapper('RemovedQuestWatch' .. tostring(questIndex))
   QuestPOIUpdateIcons()
 end
 
@@ -146,4 +168,13 @@
 mod.TurnInQuest = function()
 
   QuestPOIUpdateIcons()
+end
+
+mod.AddAutoQuestPopUp = function(...)
+ print('|cFFFF8800AddAutoQuestPopUp|r', ...)
+ mod.UpdateWrapper(OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP)
+end
+mod.RemoveAutoQuestPopUp = function(...)
+  print('|cFFFF8800RemoveAutoQuestPopUp|r', ...)
+  mod.UpdateWrapper(OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP)
 end
\ No newline at end of file
--- a/ObjectiveFrame.lua	Mon Apr 04 03:41:28 2016 -0400
+++ b/ObjectiveFrame.lua	Tue Apr 05 00:39:12 2016 -0400
@@ -81,7 +81,7 @@
   end
 
   --- xp bar
-  XPBar:SetWidth(wrapperWidth - Wrapper.close:GetWidth())
+  XPBar:SetWidth(mod.Conf.Wrapper.WrapperWidth - Wrapper.CloseButton:GetWidth())
   XPBar.statusbg:SetAllPoints(XPBar)
   XPBar:RegisterEvent('DISABLE_XP_GAIN')
   XPBar:RegisterEvent('ENABLE_XP_GAIN')
@@ -243,7 +243,7 @@
   --end
 
   if info.numObjectives >= 1 then
-    t.attachmentHeight = textSpacing
+    t.attachmentHeight = 0
     t.status:Show()
     print('    lines to build:', info.numObjectives)
 
@@ -256,6 +256,7 @@
     t.status:SetText(nil)
   end
   t.title:SetText(info.title)
+  print('     ', t.status:CanWordWrap(), t.status:GetStringHeight())
 
 
   if info.specialItem and not info.itemButton then
@@ -273,12 +274,25 @@
     print('    anchor to|cFF0088FF', previousBlock:GetName())
   end
 
+
   --- metrics are calculated in SetStyle
   t:SetStyle('TrackerBlock', handler.name, t.mainStyle, t.subStyle)
   t:Show()
 
   print('  |cFF00FFFF)|r -> ', t, t:GetHeight())
 
+  if info.rewardInfo then
+    print('has immediate reward')
+    if info.rewardInfo[1].type == 'currency' or info.rewardInfo[1].type == 'item' then
+      t.icon:Show()
+      t.iconLabel:SetText(info.rewardInfo[1].count)
+      t.icon:SetSize(t.height, t.height)
+      t.icon:SetTexture(info.rewardInfo[1].texture)
+    end
+
+  else
+    t.icon:Hide()
+  end
 
   if Devian and Devian.InWorkspace() then
     t.debugText:Show()
@@ -309,6 +323,10 @@
 
 
     if line.widget then
+      if attachmentHeight == 0 then
+        attachmentHeight = block.status.spacing
+      end
+
       line.widget:Show()
       line.widget:SetParent(block)
       line.widget:SetPoint('TOPLEFT', block.status, 'BOTTOMLEFT', 0, -attachmentHeight )
@@ -329,6 +347,7 @@
   block.attachmentHeight = attachmentHeight
 
   block.status:SetText(text)
+  block.status:SetWordWrap(true)
 end
 
 --- Objective parsers
@@ -351,9 +370,7 @@
 
 Bonus.ParseObjective = function(line, info)
   local print = B.print('BonusLine')
-  for k,v in pairs(line) do
-    print(k, v)
-  end
+
 
   line.displayColor = 'FFFFFF'
   if line.text and not info.title then
@@ -425,7 +442,8 @@
 mod.Quest.numButtons = 0
 local usedButtons = mod.Quest.itemButtons
 local freeButtons = mod.Quest.freeButtons
-mod.UpdateWrapper = function()
+mod.UpdateWrapper = function(reason)
+  print('|cFF00FFFFUpdateWrapper:|r', reason)
   unitLevel = UnitLevel('player')
   wrapperWidth = mod.Conf.Wrapper.WrapperWidth
   scrollWidth = mod.Conf.Wrapper.WrapperWidth
--- a/ObjectiveInfo.lua	Mon Apr 04 03:41:28 2016 -0400
+++ b/ObjectiveInfo.lua	Tue Apr 05 00:39:12 2016 -0400
@@ -1,7 +1,7 @@
 local B = select(2,...).frame
 local wipe, pairs, ipairs, min, max, unpack = table.wipe, pairs, ipairs, min, max, unpack
 local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo
-local GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo
+local GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo
 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
 local print = B.print('TrackerInfo')
 
@@ -13,9 +13,34 @@
 
 -----------------------------
 --- AUTO_QUEST
-AutoQuest.GetNumWatched = GetNumAutoQuestPopUps
-AutoQuest.GetInfo = function(watchIndex)
-  return Quest.GetInfo(watchIndex)
+AutoQuest.LogInfo = {}
+AutoQuest.LogBlock = {}
+AutoQuest.QuestBlock = {}
+AutoQuest.WatchBlock = {}
+AutoQuest.GetNumWatched = function()
+  AutoQuest.numWatched = GetNumAutoQuestPopUps()
+  return AutoQuest.numWatched
+end
+AutoQuest.GetInfo = function(self, popupIndex)
+
+  local questID, type = GetAutoQuestPopUp(popupIndex)
+  local questIndex = GetQuestLogIndexByID(questID)
+  local questWatchIndex = GetQuestWatchIndex(questIndex)
+
+  local questInfo = Quest:GetInfo(questWatchIndex)
+  self.Info[questID] = {
+    title = questInfo.title,
+    description = type,
+    popupType = type,
+    questID = questID,
+    questIndex = questIndex,
+    popupIndex = popupIndex,
+    watchIndex = questWatchIndex,
+    numObjectives = 0
+  }
+
+
+  return self.Info[questID]
 end
 
 -----------------------------
@@ -26,42 +51,57 @@
 
 local taskData = {}
 Bonus.QuestBlock = {}
+Bonus.TaskWatch = {}
 Bonus.GetNumWatched = function()
-  Bonus.TasksTable = GetTasksTable()
+  local tasks = GetTasksTable()
   local numTasks = 0
-  for i, questID in ipairs(Bonus.TasksTable) do
-    local isInArea, isOnMap, numObjectives = GetTaskInfo(questID)
-    if isInArea and isOnMap then
+  Bonus.TaskWatch = {}
+  print('|cFFFFFF00Bonus.GetNumWatched()|r', #tasks)
+  for i, questID in ipairs(tasks) do
+    local t = Bonus.StoreTask(questID)
+    print ('   taskIndex', i, 'questID', questID)
+    print('   isComplete', t.isComplete)
+    if (t.inInArea or t.isOnMap) and not t.isComplete then
       numTasks = numTasks + 1
+      Bonus.TaskWatch[numTasks] = t
     end
   end
   Bonus.numAll = #Bonus.TasksTable
   Bonus.numWatched = numTasks
   return GetNumQuestLogTasks()
 end
-Bonus.GetInfo = function(self, watchIndex)
-  local questID = Bonus.TasksTable[watchIndex]
+
+Bonus.GetInfo = function(self, taskIndex)
+  return Bonus.TaskWatch[taskIndex]
+end
+
+Bonus.StoreTask = function(questID)
+
   if not questID then
-    print('|cFFFF4400no quest ID for row', watchIndex)
+    print('|cFFFF4400invalid quest ID', questID)
     return
   end
 
+  Bonus.Info[questID] = Bonus.Info[questID] or {}
+  local t = Bonus.Info[questID]
+  local isInArea, isOnMap, numObjectives = GetTaskInfo(questID)
+  t.questID = questID
+  t.numObjectives = numObjectives
+  t.isInArea  = isInArea
+  t.isOnMap = isOnMap
 
-  local t= {}
-  t.isInArea, t.isOnMap, t.numObjectives = GetTaskInfo(questID)
-
-  print('isInArea', t.isInArea, 'isOnMap', t.isOnMap, 'numObj', t.numObjectives)
-  t.displayObjectives = false
-  t.isComplete = true
-  t.questID = questID
-  if t.numObjectives >= 1 then
-    print(t.numObjectives,'objective rows')
+  print('    isInArea', isInArea, 'isOnMap', isOnMap, 'numObj', numObjectives)
+  local displayObjectives = false
+  local isComplete = true
+  if numObjectives >= 1 then
+    print('     ', numObjectives,'objective rows')
     t.objectives = {}
     for i = 1, t.numObjectives do
       t.objectives[i] = {}
       local o = t.objectives[i]
       o.index = i
-      o.text, o.objectiveType, o.finished, o.displayAsObjective = GetQuestObjectiveInfo(questID, i, true)
+      --local text, objectiveType, finished, displayAsObjective =
+      o.text, o.objectiveType, o.finished, o.displayAsObjective = GetQuestObjectiveInfo(questID, i, false)
 
       print(i, '==>', o.text, o.objectiveType, o.finished, o.displayAsObjective)
       t.displayObjectives = t.displayObjectives or o.displayAsObjective
@@ -69,6 +109,52 @@
 
     end
   end
+
+  t.displayObjectives = displayObjectives
+
+
+  local rewards = {}
+  t.numCurrencies = GetNumQuestLogRewardCurrencies(questID)
+  for i = 1, t.numCurrencies do
+    local name, texture, count = GetQuestLogRewardCurrencyInfo(i, questID)
+    tinsert(rewards,{
+      type = 'currency',
+      index = i,
+      name = name,
+      texture = texture,
+      count = count
+    });
+  end
+  -- items
+  t.numItems = GetNumQuestLogRewards(questID)
+  for i = 1, t.numItems do
+    local name, texture, count, quality, isUsable = GetQuestLogRewardInfo(i, questID)
+    tinsert(rewards, {
+      type = 'item',
+      index = i ,
+      name = name,
+      texture = texture,
+      count = count,
+      quality = quality,
+      isUsable = isUsable
+    });
+  end
+  -- money
+
+  local money = GetQuestLogRewardMoney(questID)
+  if ( money > 0 ) then
+    tinsert(rewards, {
+      type = 'money',
+      name = GetMoneyString(money),
+      texture = "Interface\\Icons\\inv_misc_coin_01",
+      count = 0,
+    });
+  end
+
+  if #rewards >= 1 then
+    t.rewardInfo = rewards
+  end
+
   Bonus.TasksTable[questID] = t
 
   return t
@@ -80,6 +166,8 @@
 Quest.freeButtons = {}
 Quest.POI = {}
 Quest.QuestBlock = {}
+Quest.LogBlock = {}
+Quest.LogInfo = {}
 Quest.GetNumWatched = function()
   Quest.numAll = GetNumQuestLogEntries()
   Quest.numWatched = GetNumQuestWatches()
@@ -96,9 +184,9 @@
   if not questID then
     return
   end
-  self.Info[questID] = self.Info[questID] or {}
+  Quest.Info[questID] = Quest.Info[questID] or {}
 
-  local q = self.Info[questID]
+  local q = Quest.Info[questID]
   q.watchIndex = watchIndex
   q.type = 'Quest'
   q.questID = questID
--- a/ObjectiveStyle.lua	Mon Apr 04 03:41:28 2016 -0400
+++ b/ObjectiveStyle.lua	Tue Apr 05 00:39:12 2016 -0400
@@ -85,7 +85,7 @@
         TextColor = {1, .9, .2, 1},
       },
       titlebg = {
-        Gradient = {MinColor = {0,0,0,0.25}, MaxColor = {0,0,0,.15}},
+        Gradient = {'VERTICAL', MinColor = {0,0,0,0.25}, MaxColor = {0,0,0,.15}},
       }
     }
   },
@@ -93,7 +93,7 @@
     Normal = {
       titlebg = {
         Indent = 2,
-        Gradient = { MinColor = {0.2, .4, 1, 0}, MaxColor = {.7, 0, 0.9, .14}},
+        Gradient = { 'HORIZONTAL', MinColor = {0.2, .4, 1, 0}, MaxColor = {.7, 0, 0.9, .14}},
       },
       title = {
         TextColor = {1,1,1,0.5},
@@ -106,7 +106,7 @@
         Spacing = textSpacing,
       },
       statusbg = {
-        Gradient = { MinColor = {0.2, .4, 1, 0}, MaxColor = {.7, 0, 0.9, .11}},
+        Gradient = { 'HORIZONTAL', MinColor = {0.2, .4, 1, 0}, MaxColor = {.7, 0, 0.9, .11}},
       }
     },
     Super = {
@@ -116,7 +116,7 @@
         Spacing = titleSpacing, BackgroundFullWidth = true
       },
       titlebg = {
-        Gradient = { MinColor = {0, .7, .6, .45}, MaxColor = {0, .7, .6, 0.23}},
+        Gradient = { 'HORIZONTAL', MinColor = {0, .7, .6, 0}, MaxColor = {0, .7, .6, 0.23}},
       },
       status = {
         TextColor = {1,1,1,1},
@@ -124,7 +124,7 @@
         Spacing = textSpacing,
       },
       statusbg = {
-        Gradient = { MinColor = {0, .7, .6, 0.40}, MaxColor = {0, .7, .6, 0.23} },
+        Gradient = { 'HORIZONTAL', MinColor = {0, .7, .6, 0}, MaxColor = {0, .7, .6, 0.23} },
       },
     },
     MouseDown = {
@@ -133,14 +133,14 @@
         Spacing = titleSpacing,
       },
       titlebg = {
-        Gradient = {          MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, .4},        },
+        Gradient = {'HORIZONTAL',  MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, .4},        },
       },
       status = {
         Font = {textFont, textSize, textOutline},
         Spacing = textSpacing,
       },
       statusbg = {
-        Gradient = {          MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, .2},        },
+        Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, .2},        },
       }
     },
     Complete = {
@@ -149,25 +149,46 @@
         Font = {titleFont, titleSize, titleOutline},        Spacing = titleSpacing,
       },
       titlebg = {
-        Gradient = {          MinColor = {0, 1, 0, 0.34},          MaxColor = {0, 1, 0, .17},        },
+        Gradient = {'HORIZONTAL', MinColor = {0, 1, 0, 0},          MaxColor = {0, 1, 0, 0.34},        },
       },
       status = {
         TextColor = {1,1,1,0.5},
         Font = {textFont, textSize, textOutline},        Spacing = textSpacing,
       },
       statusbg = {
-        Gradient = {          MinColor = {0, 1, 0, .25},          MaxColor = {0, 1, 0, 0.12},        },
+        Gradient = {'HORIZONTAL', MinColor = {0, 1, 0, 0},          MaxColor = {0, 1, 0, .25},        },
       }
     },
     Daily = {
       titlebg = {
-        Gradient = {          MinColor = {0, .4, 1, 0.34},          MaxColor = {0, 0.4, 1, .17},        },
+        Gradient = {'HORIZONTAL', MinColor = {0, .4, 1, 0.34},          MaxColor = {0, 0.4, 1, .17},        },
       },
       statusbg = {
-        Gradient = {          MinColor = {0, .4, 1, 0.25},          MaxColor = {0, 0.4, 1, .12},        },
+        Gradient = {'HORIZONTAL', MinColor = {0, .4, 1, 0.25},          MaxColor = {0, 0.4, 1, .12},        },
       },
     },
-    Cheev =  {
+    AutoQuest = {
+      Normal = {
+        titlebg = {
+          Indent = 2,
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 0}, MaxColor = {.7, 0, 0.9, .14}},
+        },
+        title = {
+          TextColor = {1,1,1,1},
+          Font = {titleFont, titleSize, titleOutline},
+          Spacing = titleSpacing,
+        },
+        status = {
+          TextColor = {0,1,0,1},
+          Font = {textFont, textSize, textOutline},
+          Spacing = textSpacing,
+        },
+        statusbg = {
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 0}, MaxColor = {.7, 0, 0.9, .11}},
+        }
+      },
+    },
+    Cheevs =  {
       Normal = {
 
         title = {
@@ -175,7 +196,7 @@
           Spacing = titleSpacing,
         },
         titlebg = {
-          Gradient = { MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, .19}},
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, .19}},
 
         },
         status = {
@@ -183,7 +204,7 @@
           Spacing = textSpacing,
         },
         statusbg = {
-          Gradient = { MinColor = {0.2, .4, 1, 0.25}, MaxColor = {.7, 0, 0.9, .12}},
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 0.25}, MaxColor = {.7, 0, 0.9, .12}},
         },
       },
       Complete = {
@@ -192,14 +213,14 @@
           Spacing = titleSpacing,
         },
         titlebg = {
-          Gradient = { MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, .19}},
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, .19}},
         },
         status = {
           Font = {textFont, textSize, textOutline},
           Spacing = textSpacing,
         },
         statusbg = {
-          Gradient = { MinColor = {0.2, .4, 1, 0.25}, MaxColor = {.7, 0, 0.9, .12}},
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 0.25}, MaxColor = {.7, 0, 0.9, .12}},
         },
       },
     }
@@ -221,11 +242,12 @@
 mod.regionStyles = {}
 mod.SetBlockStyle = function(frame, frameType, ...)
   -- var names intended to reflect argument order
-  print('|cFFFFFF00'..frame:GetName()..'|r')
+  print('|cFFFFFF00'..frame:GetName()..'|r', frameType, ...)
   --@debug@
   local c = mod.defaults.Normal
   local style_list = {... }
   local styleName = frameType .. '-' .. table.concat(style_list,'')
+  local previousClass = mod.Conf.Style[frameType]
 
   if not style_cache[styleName] then
     local style = {}
@@ -238,15 +260,21 @@
     local normal = mod.defaults.Style.Normal
     local root =  mod.defaults.Style[frameType] or normal
     for i, className in ipairs(style_list) do
-      local class = root[className] or normal[className] or root
-      if root[className] then
-
+      local class = normal
+      if previousClass and previousClass[className] then
+        class = previousClass[className]
+        print('  ChildClass |cFFFF0088'.. className .. '|r')
+      elseif root[className] then
+        class = root[className]
         print('  SubClass |cFF0088FF'.. className .. '|r')
       elseif normal[className] then
+        class = normal[className]
         print('  SubClass Normal.|cFFFF0088'..className..'|r')
       else
-        print('  SubClass Normal')
+        print('  SubClass not found '..className..'')
       end
+      previousClass = class
+
       for elementName, element in pairs(class) do
         if not elementName:match('^%u') then
           print('   scanning Element |cFF8800FF'.. elementName ..'|r')
@@ -263,7 +291,6 @@
         end
 
       end
-
     end
 
     for k, elements in pairs(mod.defaults.Style.Normal) do
@@ -277,7 +304,7 @@
     for k,v in pairs(style) do
       if type(v) == 'table' and not k:match('^%u') then
         for kk, vv in pairs(v) do
-        print('  |cFFFFFF00'..k..'|r.|cFF00FF00'..kk..'|r =', tostring(vv))
+        print('  |cFFFFFF00'..k..'|r.|cFF00FF00'..kk..'|r =', (type(vv) == 'table' and ('{'..table.concat(vv,', ')..'}') or tostring(vv)))
         end
       else
         print(' |cFFFFFFFF' .. k ..'|r =', tostring(v))
@@ -301,7 +328,7 @@
 
         for attributeName, value in pairs(styleset) do
           if mod.SetBlockAttribute[attributeName] then
-            print('  '..elementName..':'.. attributeName ..'(', value, ')')
+            print('  add function '..elementName..':'.. attributeName ..'(', (type(value) == 'table' and ('{'..table.concat(value,', ')..'}') or tostring(value)), ')')
 
 
             --mod.SetBlockAttribute[attributeName](region, value)
@@ -343,20 +370,26 @@
   frame.statusWidth = frame.width - normalSettings.status.Indent
   frame.titleWidth = frame.width - normalSettings.title.Indent
 
+  print((frame.status and frame.status:GetText()))
+  print((frame.status and frame.status:GetWidth()))
+  print(frame.status and frame.title:GetStringHeight())
+  print(frame.title and (frame.title:GetStringHeight() + (frame.title.spacing or 0)*2) or 0)
+  print(frame.status and frame.status:GetStringHeight())
+  print(frame.status and (frame.status:GetStringHeight() + (frame.status.spacing or 0)*2)  or 0)
   if frame.status then
     print('status  ', frame.statusHeight, normalSettings.status.Indent, 0, 'statusbg', frame.statusHeight)
+    frame.status:SetWidth(frame.width)
     frame.status:SetPoint('LEFT', frame, 'LEFT', normalSettings.status.Indent, 0)
-    frame.status:SetHeight(frame.statusHeight)
+    --frame.status:SetHeight(frame.statusHeight)
     if frame.statusbg then
-
-      frame.statusbg:SetHeight(frame.statusHeight + (frame.attachmentHeight or 0))
+      frame.statusbg:SetHeight(frame.statusHeight)
       frame.statusbg:SetWidth(frame.width)
     end
   end
   if frame.title then
     print('title  ',frame.titleHeight, normalSettings.title.Indent, 'titlebg',frame.titleHeight)
     frame.title:SetPoint('LEFT', frame, 'LEFT', normalSettings.title.Indent)
-    frame.title:SetHeight(frame.titleHeight)
+    frame.title:SetWidth(frame.width)
     if frame.titlebg then
       frame.titlebg:SetHeight(frame.titleHeight)
       frame.titlebg:SetWidth(frame.width)
@@ -443,7 +476,7 @@
 local print = B.print('Attribute')
 sb.Gradient = function(region, value)
   print('|cFF8844FFGradient|r', region:GetName(), unpack(value))
-  o = 'HORIZONTAL'
+  o = value[1]
   a1, a2, a3, a4 = unpack(value.MinColor)
   b1, b2, b3, b4 = unpack(value.MaxColor)
   region:SetVertexColor(1,1,1)
--- a/ObjectiveTracker.xml	Mon Apr 04 03:41:28 2016 -0400
+++ b/ObjectiveTracker.xml	Tue Apr 05 00:39:12 2016 -0400
@@ -254,9 +254,11 @@
           </Gradient>
         </Texture>
         <Texture name="$parentItemTile" parentKey="icon" hidden="true">
-          <Size x="24" y="24" />
+          <Size x="40" y="40" />
+          <TexCoords top="0.12" bottom="0.87" left="0.12" right="0.87" />
           <Anchors>
-            <Anchor point="TOPRIGHT" x="-1" y="-1" />
+            <Anchor point="TOPRIGHT" x="0" y="0" />
+
           </Anchors>
         </Texture>
         <Texture name="$parentMoneyTile" parentKey="money" hidden="true" />
@@ -291,16 +293,15 @@
         <FontString name="$parentTitle" parentKey="title" inherits="VeneerTitleFont" justifyH="LEFT" justifyV="MIDDLE">
           <Anchors>
             <Anchor point="TOP" relativeKey="$parent.titlebg" />
-            <Anchor point="BOTTOM" relativeKey="$parent.titlebg"  />
-            <Anchor point="LEFT" relativeKey="$parent.titlebg" />
+            <Anchor point="LEFT" relativeKey="$parent" />
             <Anchor point="RIGHT" relativeKey="$parent" />
           </Anchors>
         </FontString>
         <FontString name="$parentStatus" parentKey="status" inherits="VeneerCriteriaFontNormal" justifyH="LEFT" justifyV="MIDDLE" wordwrap="true">
           <Anchors>
             <Anchor point="TOP" relativeKey="$parent.statusbg" />
-            <Anchor point="LEFT"  relativeKey="$parent.statusbg" />
-            <Anchor point="RIGHT" relativeKey="$parent.statusbg" />
+            <Anchor point="LEFT"  relativeKey="$parent" />
+            <Anchor point="RIGHT" relativeKey="$parent" />
           </Anchors>
         </FontString>
         <FontString name="$parentDebugText" parentKey="debugText" inherits="VeneerCriteriaFontNormal" justifyH="RIGHT">
@@ -308,6 +309,11 @@
             <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" />
           </Anchors>
         </FontString>
+        <FontString name="$parentItemTileText" parentKey="iconLabel" inherits="VeneerCriteriaFontNormal">
+          <Anchors>
+            <Anchor point="TOPRIGHT" x="-2" y="-4" relativeKey="$parent.icon" />
+          </Anchors>
+        </FontString>
       </Layer>
     </Layers>
   </Frame>
--- a/ObjectiveUI.lua	Mon Apr 04 03:41:28 2016 -0400
+++ b/ObjectiveUI.lua	Tue Apr 05 00:39:12 2016 -0400
@@ -49,10 +49,24 @@
   print(self.info.title)
 end
 
-Quest.Select = function(self)
-  SetSuperTrackedQuestID(self.info.questID)
+AutoQuest.Select = function(self)
+  if self.info.popupType == 'OFFER'  then
+    ShowQuestOffer(self.info.questIndex)
+  else
+    ShowQuestComplete(self.info.questIndex)
+  end
+  RemoveAutoQuestPopUp(self.info.questID)
+end
+
+Quest.Select = function(self) -- remote quests will get listed here as well, so their turn-in data needs to be checked
+  if AutoQuest.Info[self.info.questID] then
+    AutoQuest.Select(self)
+  else
+    SetSuperTrackedQuestID(self.info.questID)
+  end
   mod.UpdateWrapper()
 end
+
 Quest.Link = function(self)
   local questLink = GetQuestLink(block.questLogIndex);
   if ( questLink ) then
--- a/ObjectiveWidgets.lua	Mon Apr 04 03:41:28 2016 -0400
+++ b/ObjectiveWidgets.lua	Tue Apr 05 00:39:12 2016 -0400
@@ -341,6 +341,7 @@
 
 --- WidgetTemplate 'OnHide'
 mod.ReleaseWidget = function(frame)
+  --[[
   local print = B.print('ObjectiveWidgets')
   local reg = wr[frame.widgetType]
   if reg and reg.used[frame.key] then
@@ -351,6 +352,7 @@
     tinsert(reg.free, frame)
     print('|cFFBBBBBBreleased from service', frame:GetName())
   end
+  ]]
 end
 
 --- RemoveTrackedAchievement post-hook