changeset 14:ed642234f017

ObjectiveFrame - implement proper tracker name text - expanded tracker prototypes to cover "objective lines" formatting and accommodation of widget variables - implement the progress bars for bonus objectives ObjectiveStyle - moved `UpdateWrapperStyle` over and renamed it to fit semantics - change the formula for block.`height` to measure non-widget content only - allows widgets to position relative to text - size FontString `status` to match block.`height` - full block height is acquired by adding block.`height` and block.`attachmentHeight` which is calculated during objective parsing ObjectiveWidgets - use string keys for generated widgets to deal with multiple objectives under the same questID, and maybe dungeon objectives - wrapper buttons use a common code path - specialized handlers for wheel scrolling moved over to fit semantics
author Nenue
date Mon, 04 Apr 2016 03:16:22 -0400
parents 9455693fc290
children f660f1c1e0aa
files BuffFrame.xml Config.xml Core.xml Init.lua ObjectiveCore.lua ObjectiveFrame.lua ObjectiveInfo.lua ObjectiveStyle.lua ObjectiveTracker.xml ObjectiveUI.lua ObjectiveWidgets.lua ObjectiveWidgets.xml
diffstat 11 files changed, 1012 insertions(+), 743 deletions(-) [+]
line wrap: on
line diff
--- a/BuffFrame.xml	Sat Apr 02 17:46:52 2016 -0400
+++ b/BuffFrame.xml	Mon Apr 04 03:16:22 2016 -0400
@@ -3,6 +3,267 @@
   Veneer
   BuffFrame module
   -->
+
+
+  <!-- Buff-button underlay  -->
+  <Frame name="VeneerDecorTemplate" virtual="true" enableMouse="true" movable="true" frameStrata="BACKGROUND" hidden="true">
+    <Size x="30" y="30" />
+    <Layers>
+      <Layer level="BACKGROUND">
+        <Texture name="$parentButtonArea" setAllPoints="true" parentKey="background" alphaMode="BLEND">
+          <Color r="1" g="1" b="1" a="1" />
+        </Texture>
+        <Texture name="$parentButtonBackdrop" parentKey="backgroundFill" alphaMode="BLEND">
+          <Anchors>
+            <Anchor point="BOTTOMLEFT" relativePoint="BOTTOMLEFT" x="1" y="1" relativeKey="$parent.background" />
+            <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" x="-1" y="-1" relativeKey="$parent.background" />
+          </Anchors>
+          <Color r="0" g="0" b="0" a="1" />
+        </Texture>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <!-- Buff button overlay, and positioning anchor -->
+  <Frame name="VeneerGuideTemplate" virtual="true" movable="true" frameStrata="LOW">
+    <Scripts>
+      <OnShow>
+        self.mouseover = self:IsMouseOver()
+      </OnShow>
+      <OnUpdate>
+        if self:IsMouseOver() and not self.contains then
+          self.caster:Show()
+        else
+          self.caster:Hide()
+        end
+      </OnUpdate>
+    </Scripts>
+    <Layers>
+      <Layer level="ARTWORK">
+        <Texture name="$parentLegend" parentKey="legend" parentArray="config" setAllPoints="true" hidden="true">
+          <Color a="0.5" r="0" g="1" b="0" />
+        </Texture>
+        <Texture name="$parentCountLegend" parentKey="count" parentArray="config" hidden="true">
+          <Color a="0.75" r="1" g=".5" b="0" />
+        </Texture>
+
+
+        <Texture name="$parentIconArea" parentKey="icon" alphaMode="ADD">
+          <Color r="0" g="0" b="0" a="0" />
+        </Texture>
+        <Texture name="$parentTextLegend" parentKey="duration" parentArray="config" hidden="true" alphaMode="BLEND">
+          <Color a="0.25" r="1" g="1" b="1" />
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <FontString inherits="VeneerFontNormal" parentArray="config" name="$parentID" parentKey="idText" hidden="true" outline="NORMAL">
+          <Anchors>
+            <Anchor point="CENTER" />
+          </Anchors>
+        </FontString>
+        <FontString inherits="VeneerFontNormal" parentKey="caster" outline="NORMAL">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativePoint="TOPLEFT" relativeKey="$parent.icon" />
+          </Anchors>
+        </FontString>
+      </Layer>
+      <Layer level="HIGHLIGHT">
+
+      </Layer>
+    </Layers>
+  </Frame>
+
+
+  <!-- Anchor frame orientation-setting widget; click handler copies frame anchors over to buff buttons -->
+  <Button name="VeneerAnchorButton" virtual="true" parentArray="anchorButton" hidden="true">
+    <Scripts>
+      <OnClick>
+        self:GetParent():SetChildAnchors(self)
+      </OnClick>
+    </Scripts>
+    <Size x="15" y="15" />
+    <Layers>
+      <Layer level="BACKGROUND">
+        <Texture setAllPoints="true">
+          <Color r="0" g="0" b="0" a="1" />
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <Texture>
+          <Color r="0" g="1" b="0.5" a="1" />
+          <Anchors>
+            <Anchor point="BOTTOMLEFT" x="1" y="1" />
+            <Anchor point="TOPRIGHT" x="-1" y="-1" />
+          </Anchors>
+        </Texture>
+      </Layer>
+    </Layers>
+  </Button>
+
+  <Frame name="VeneerAnchorTemplate" virtual="true" enableMouse="false" movable="true" sizable="true" clampedToScreen="true">
+    <Layers>
+      <Layer level="BACKGROUND">
+        <Texture name="$parentBackground" setAllPoints="true" parentArray="config" hidden="true">
+          <Color r="0" g="0.2" b="1" a="0.2" />
+        </Texture>
+        <FontString name="$parentHeading" inherits="VeneerFontHighlight" parentArray="config" parentKey="heading" hidden="true">
+          <Anchors>
+            <Anchor point="BOTTOMLEFT" relativePoint="TOPLEFT" />
+          </Anchors>
+        </FontString>
+        <FontString name="$parentDebug" inherits="VeneerFontNormal" parentArray="debug" parentKey="debug">
+          <Anchors>
+            <Anchor point="BOTTOMLEFT" relativePoint="TOPLEFT" />
+          </Anchors>
+        </FontString>
+      </Layer>
+      <Layer level="OVERLAY">
+
+        <Texture name="$parentCutJoint" parentKey="alignedJoint" hidden="true">
+          <Size x="4" y="4" />
+          <Color r="1" g="0" b="0" a="1" />
+        </Texture>
+        <Texture name="$parentCutY" parentKey="cuttingJointX" hidden="true">
+          <Size x="4" y="48" />
+          <Color r="1" g="1" b="0" a="1" />
+        </Texture>
+        <Texture name="$parentCutX" parentKey="cuttingJointY" hidden="true">
+          <Size x="48" y="4" />
+          <Color r="1" g="1" b="0" a="1" />
+        </Texture>
+        <Texture name="$parentPoppedY" parentKey="poppingJointX" hidden="true">
+          <Size x="4" y="48" />
+          <Color r="0" g="1" b="1" a="1" />
+        </Texture>
+        <Texture name="$parentPoppedX" parentKey="poppingJointY" hidden="true">
+          <Size x="48" y="4" />
+          <Color r="0" g="1" b="1" a="1" />
+        </Texture>
+        <Texture name="$parentChildSpace" parentKey="childSpace" hidden="true">
+          <Color r="0" g=".5" b="1" a="0.5" />
+        </Texture>
+      </Layer>
+      <Layer level="HIGHLIGHT">
+        <Texture name="$parentHighlight" setAllPoints="true" parentArray="config" hidden="true">
+          <Color r="1" g="1" b="0" a="0.2" />
+        </Texture>
+      </Layer>
+    </Layers>
+    <Frames>
+      <Button name="$parentAnchorUL" inherits="VeneerAnchorButton">
+        <Anchors>
+          <Anchor point="TOPLEFT" />
+        </Anchors>
+      </Button>
+      <Button name="$parentAnchorUR" inherits="VeneerAnchorButton">
+        <Anchors>
+          <Anchor point="TOPRIGHT" />
+        </Anchors>
+      </Button>
+      <Button name="$parentAnchorUR" inherits="VeneerAnchorButton">
+        <Anchors>
+          <Anchor point="BOTTOMRIGHT" />
+        </Anchors>
+      </Button>
+      <Button name="$parentAnchorUR" inherits="VeneerAnchorButton">
+        <Anchors>
+          <Anchor point="BOTTOMLEFT" />
+        </Anchors>
+      </Button>
+    </Frames>
+  </Frame>
+
+  <Frame name="VeneerConsolidatedBuffsAnchor" inherits="VeneerAnchorTemplate" virtual="true">
+    <Layers>
+      <Layer level="OVERLAY">
+        <!-- need to make our own number label since the original is buried under secure layer -->
+        <FontString inherits="VeneerFontNormal" name="$parentLabel" parentKey="label">
+          <Anchors>
+            <Anchor point="TOP" relativePoint="BOTTOM" x="0" y="-2" />
+          </Anchors>
+        </FontString>
+        <!--
+        <Texture name="$parentBackdrop" parentKey="background" setAllPoints="true" alphaMode="BLEND">
+          <Color r="0" g="0" b="0" a="1" />
+          <Anchors>
+            <Anchor point="BOTTOMLEFT" x="1" y="1" />
+            <Anchor point="TOPRIGHT" x="-1" y="-1" />
+          </Anchors>
+        </Texture>
+        <Texture name="$parentIcon" parentKey="border" setAllPoints="true" alphaMode="BLEND">
+          <Color r="1" g="1" b="1" a="1" />
+        </Texture>
+        -->
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <Frame name="VeneerRaidBuffTemplate" virtual="true" enableMouse="false">
+    <Layers>
+      <Layer level="ARTWORK">
+        <Texture name="$parentLegend" parentKey="legend" parentArray="config" setAllPoints="true" hidden="true">
+          <Color a="0.5" r="0" g="1" b="0" />
+        </Texture>
+        <Texture name="$parentCountLegend" parentKey="count" parentArray="config" hidden="true">
+          <Color a="0.75" r="1" g=".5" b="0" />
+        </Texture>
+
+
+        <Texture name="$parentIconArea" parentKey="icon" alphaMode="ADD">
+          <Color r="0" g="0" b="0" a="0" />
+        </Texture>
+        <Texture name="$parentTextLegend" parentKey="duration" parentArray="config" hidden="true" alphaMode="BLEND">
+          <Color a="0.25" r="1" g="1" b="1" />
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <FontString inherits="VeneerFontNormal" parentArray="config" name="$parentSymbol" parentKey="symbol">
+          <Anchors>
+            <Anchor point="TOP" />
+          </Anchors>
+        </FontString>
+        <FontString inherits="VeneerFontNormal" parentArray="config" name="$parentID" parentKey="idText" hidden="true">
+          <Anchors>
+            <Anchor point="BOTTOM" />
+          </Anchors>
+        </FontString>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <Button name="VeneerMissingBuffTemplate" virtual="true">
+    <Scripts>
+      <OnClick>
+        if self.spell and not InCombatLockdown() then
+          CastSpellByID(self.spell)
+        end
+      </OnClick>
+    </Scripts>
+    <Layers>
+      <Layer level="BORDER">
+        <Texture setAllPoints="true">
+          <Color r="1" g="1" b="1" a="0.25" />
+        </Texture>
+      </Layer>
+      <Layer level="ARTWORK">
+        <Texture name="$parentIcon" parentKey="icon">
+          <Size x="20" y="20" />
+          <Anchors>
+            <Anchor point="LEFT" />
+          </Anchors>
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <FontString name="$parentLabel" parentKey="label" inherits="VeneerFontNormal" justifyH="LEFT">
+          <Anchors>
+            <Anchor point="LEFT" relativePoint="RIGHT" relativeKey="icon" />
+          </Anchors>
+        </FontString>
+      </Layer>
+    </Layers>
+  </Button>
+
+
   <Script file="BuffAnchors.lua" />
   <Script file="RaidBuffTray.lua" />
   <Script file="BuffButton.lua" />
--- a/Core.xml	Sat Apr 02 17:46:52 2016 -0400
+++ b/Core.xml	Mon Apr 04 03:16:22 2016 -0400
@@ -21,262 +21,33 @@
     </KeyValues>
   </Frame>
 
-  <!-- Buff-button underlay  -->
-  <Frame name="VeneerDecorTemplate" virtual="true" enableMouse="true" movable="true" frameStrata="BACKGROUND" hidden="true">
-    <Size x="30" y="30" />
-    <Layers>
-      <Layer level="BACKGROUND">
-        <Texture name="$parentButtonArea" setAllPoints="true" parentKey="background" alphaMode="BLEND">
-          <Color r="1" g="1" b="1" a="1" />
-        </Texture>
-        <Texture name="$parentButtonBackdrop" parentKey="backgroundFill" alphaMode="BLEND">
-          <Anchors>
-            <Anchor point="BOTTOMLEFT" relativePoint="BOTTOMLEFT" x="1" y="1" relativeKey="$parent.background" />
-            <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" x="-1" y="-1" relativeKey="$parent.background" />
-          </Anchors>
-          <Color r="0" g="0" b="0" a="1" />
-        </Texture>
-      </Layer>
-    </Layers>
-  </Frame>
 
-  <!-- Buff button overlay, and positioning anchor -->
-  <Frame name="VeneerGuideTemplate" virtual="true" movable="true" frameStrata="LOW">
-    <Scripts>
-      <OnShow>
-        self.mouseover = self:IsMouseOver()
-      </OnShow>
-      <OnUpdate>
-        if self:IsMouseOver() and not self.contains then
-          self.caster:Show()
-        else
-          self.caster:Hide()
-        end
-      </OnUpdate>
-    </Scripts>
-    <Layers>
-      <Layer level="ARTWORK">
-        <Texture name="$parentLegend" parentKey="legend" parentArray="config" setAllPoints="true" hidden="true">
-          <Color a="0.5" r="0" g="1" b="0" />
-        </Texture>
-        <Texture name="$parentCountLegend" parentKey="count" parentArray="config" hidden="true">
-          <Color a="0.75" r="1" g=".5" b="0" />
-        </Texture>
 
+  <Texture name="VnTestLine" virtual="true">
+    <Color r="1" g="1" b="0" a="1" />
+  </Texture>
 
-        <Texture name="$parentIconArea" parentKey="icon" alphaMode="ADD">
-          <Color r="0" g="0" b="0" a="0" />
-        </Texture>
-        <Texture name="$parentTextLegend" parentKey="duration" parentArray="config" hidden="true" alphaMode="BLEND">
-          <Color a="0.25" r="1" g="1" b="1" />
-        </Texture>
-      </Layer>
-      <Layer level="OVERLAY">
-        <FontString inherits="VeneerFontNormal" parentArray="config" name="$parentID" parentKey="idText" hidden="true" outline="NORMAL">
-          <Anchors>
-            <Anchor point="CENTER" />
-          </Anchors>
-        </FontString>
-        <FontString inherits="VeneerFontNormal" parentKey="caster" outline="NORMAL">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativePoint="TOPLEFT" relativeKey="$parent.icon" />
-          </Anchors>
-        </FontString>
-      </Layer>
-      <Layer level="HIGHLIGHT">
+  <Font name="VeneerTitleFont" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16" >
+    <Color r="1" g=".80" b=".25" a="1" />
+  </Font>
 
-      </Layer>
-    </Layers>
-  </Frame>
+  <Font name="VeneerCriteriaFontNormal" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16">
+    <Color r="1" g="1" b="1" a="1" />
+  </Font>
+  <Font name="VeneerCriteriaFontComplete" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16">
+    <Color r="0" g="1" b="0" a=".75" />
+  </Font>
+  <Font name="VeneerCriteriaFontProgressed" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16">
+    <Color r="1" g="1" b="0" a="1" />
+  </Font>
 
-  <!-- Anchor frame orientation-setting widget; click handler copies frame anchors over to buff buttons -->
-  <Button name="VeneerAnchorButton" virtual="true" parentArray="anchorButton" hidden="true">
-    <Scripts>
-      <OnClick>
-        self:GetParent():SetChildAnchors(self)
-      </OnClick>
-    </Scripts>
-    <Size x="15" y="15" />
-    <Layers>
-      <Layer level="BACKGROUND">
-        <Texture setAllPoints="true">
-          <Color r="0" g="0" b="0" a="1" />
-        </Texture>
-      </Layer>
-      <Layer level="OVERLAY">
-        <Texture>
-          <Color r="0" g="1" b="0.5" a="1" />
-          <Anchors>
-            <Anchor point="BOTTOMLEFT" x="1" y="1" />
-            <Anchor point="TOPRIGHT" x="-1" y="-1" />
-          </Anchors>
-        </Texture>
-      </Layer>
-    </Layers>
-  </Button>
+  <Font name="VeneerCriteriaFontFailed" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16">
+    <Color r="1" g=".4" b="0" a=".75" />
+  </Font>
 
-  <Frame name="VeneerAnchorTemplate" virtual="true" enableMouse="false" movable="true" sizable="true" clampedToScreen="true">
-    <Layers>
-      <Layer level="BACKGROUND">
-        <Texture name="$parentBackground" setAllPoints="true" parentArray="config" hidden="true">
-          <Color r="0" g="0.2" b="1" a="0.2" />
-        </Texture>
-        <FontString name="$parentHeading" inherits="VeneerFontHighlight" parentArray="config" parentKey="heading" hidden="true">
-          <Anchors>
-            <Anchor point="BOTTOMLEFT" relativePoint="TOPLEFT" />
-          </Anchors>
-        </FontString>
-        <FontString name="$parentDebug" inherits="VeneerFontNormal" parentArray="debug" parentKey="debug">
-          <Anchors>
-            <Anchor point="BOTTOMLEFT" relativePoint="TOPLEFT" />
-          </Anchors>
-        </FontString>
-      </Layer>
-      <Layer level="OVERLAY">
-
-        <Texture name="$parentCutJoint" parentKey="alignedJoint" hidden="true">
-          <Size x="4" y="4" />
-          <Color r="1" g="0" b="0" a="1" />
-        </Texture>
-        <Texture name="$parentCutY" parentKey="cuttingJointX" hidden="true">
-          <Size x="4" y="48" />
-          <Color r="1" g="1" b="0" a="1" />
-        </Texture>
-        <Texture name="$parentCutX" parentKey="cuttingJointY" hidden="true">
-          <Size x="48" y="4" />
-          <Color r="1" g="1" b="0" a="1" />
-        </Texture>
-        <Texture name="$parentPoppedY" parentKey="poppingJointX" hidden="true">
-          <Size x="4" y="48" />
-          <Color r="0" g="1" b="1" a="1" />
-        </Texture>
-        <Texture name="$parentPoppedX" parentKey="poppingJointY" hidden="true">
-          <Size x="48" y="4" />
-          <Color r="0" g="1" b="1" a="1" />
-        </Texture>
-        <Texture name="$parentChildSpace" parentKey="childSpace" hidden="true">
-          <Color r="0" g=".5" b="1" a="0.5" />
-        </Texture>
-      </Layer>
-      <Layer level="HIGHLIGHT">
-        <Texture name="$parentHighlight" setAllPoints="true" parentArray="config" hidden="true">
-          <Color r="1" g="1" b="0" a="0.2" />
-        </Texture>
-      </Layer>
-    </Layers>
-    <Frames>
-      <Button name="$parentAnchorUL" inherits="VeneerAnchorButton">
-        <Anchors>
-          <Anchor point="TOPLEFT" />
-        </Anchors>
-      </Button>
-      <Button name="$parentAnchorUR" inherits="VeneerAnchorButton">
-        <Anchors>
-          <Anchor point="TOPRIGHT" />
-        </Anchors>
-      </Button>
-      <Button name="$parentAnchorUR" inherits="VeneerAnchorButton">
-        <Anchors>
-          <Anchor point="BOTTOMRIGHT" />
-        </Anchors>
-      </Button>
-      <Button name="$parentAnchorUR" inherits="VeneerAnchorButton">
-        <Anchors>
-          <Anchor point="BOTTOMLEFT" />
-        </Anchors>
-      </Button>
-    </Frames>
-  </Frame>
-
-  <Frame name="VeneerConsolidatedBuffsAnchor" inherits="VeneerAnchorTemplate" virtual="true">
-    <Layers>
-      <Layer level="OVERLAY">
-        <!-- need to make our own number label since the original is buried under secure layer -->
-        <FontString inherits="VeneerFontNormal" name="$parentLabel" parentKey="label">
-          <Anchors>
-            <Anchor point="TOP" relativePoint="BOTTOM" x="0" y="-2" />
-          </Anchors>
-        </FontString>
-        <!--
-        <Texture name="$parentBackdrop" parentKey="background" setAllPoints="true" alphaMode="BLEND">
-          <Color r="0" g="0" b="0" a="1" />
-          <Anchors>
-            <Anchor point="BOTTOMLEFT" x="1" y="1" />
-            <Anchor point="TOPRIGHT" x="-1" y="-1" />
-          </Anchors>
-        </Texture>
-        <Texture name="$parentIcon" parentKey="border" setAllPoints="true" alphaMode="BLEND">
-          <Color r="1" g="1" b="1" a="1" />
-        </Texture>
-        -->
-      </Layer>
-    </Layers>
-  </Frame>
-
-  <Frame name="VeneerRaidBuffTemplate" virtual="true" enableMouse="false">
-    <Layers>
-      <Layer level="ARTWORK">
-        <Texture name="$parentLegend" parentKey="legend" parentArray="config" setAllPoints="true" hidden="true">
-          <Color a="0.5" r="0" g="1" b="0" />
-        </Texture>
-        <Texture name="$parentCountLegend" parentKey="count" parentArray="config" hidden="true">
-          <Color a="0.75" r="1" g=".5" b="0" />
-        </Texture>
-
-
-        <Texture name="$parentIconArea" parentKey="icon" alphaMode="ADD">
-          <Color r="0" g="0" b="0" a="0" />
-        </Texture>
-        <Texture name="$parentTextLegend" parentKey="duration" parentArray="config" hidden="true" alphaMode="BLEND">
-          <Color a="0.25" r="1" g="1" b="1" />
-        </Texture>
-      </Layer>
-      <Layer level="OVERLAY">
-        <FontString inherits="VeneerFontNormal" parentArray="config" name="$parentSymbol" parentKey="symbol">
-          <Anchors>
-            <Anchor point="TOP" />
-          </Anchors>
-        </FontString>
-        <FontString inherits="VeneerFontNormal" parentArray="config" name="$parentID" parentKey="idText" hidden="true">
-          <Anchors>
-            <Anchor point="BOTTOM" />
-          </Anchors>
-        </FontString>
-      </Layer>
-    </Layers>
-  </Frame>
-
-  <Button name="VeneerMissingBuffTemplate" virtual="true">
-    <Scripts>
-      <OnClick>
-        if self.spell and not InCombatLockdown() then
-          CastSpellByID(self.spell)
-        end
-      </OnClick>
-    </Scripts>
-    <Layers>
-      <Layer level="BORDER">
-        <Texture setAllPoints="true">
-          <Color r="1" g="1" b="1" a="0.25" />
-        </Texture>
-      </Layer>
-      <Layer level="ARTWORK">
-        <Texture name="$parentIcon" parentKey="icon">
-          <Size x="20" y="20" />
-          <Anchors>
-            <Anchor point="LEFT" />
-          </Anchors>
-        </Texture>
-      </Layer>
-      <Layer level="OVERLAY">
-        <FontString name="$parentLabel" parentKey="label" inherits="VeneerFontNormal" justifyH="LEFT">
-          <Anchors>
-            <Anchor point="LEFT" relativePoint="RIGHT" relativeKey="icon" />
-          </Anchors>
-        </FontString>
-      </Layer>
-    </Layers>
-  </Button>
+  <Font name="VeneerStatusFont" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="14">
+    <Color r="1" g="1" b="0" a="1" />
+  </Font>
 
   <FontString virtual="true" name="VeneerFieldName" parentKey="fieldname" inherits="VeneerFontHighlight" justifyV="TOP" justifyH="LEFT" />
   <FontString virtual="true" name="VeneerFieldValue" parentKey="fieldvalue" inherits="VeneerFontNormal" justifyV="TOP" justifyH="LEFT" />
--- a/Init.lua	Sat Apr 02 17:46:52 2016 -0400
+++ b/Init.lua	Mon Apr 04 03:16:22 2016 -0400
@@ -168,6 +168,8 @@
 
   B.Conf = setmetatable(VeneerData, {__index = function(_, k) return defaults[k] end})
 
+
+
   -- suffix tables
   for name, display in pairs(displays) do
     display.conf = setmetatable({}, {
@@ -236,16 +238,21 @@
   for level, batch in ipairs(moduleStack) do
     print('config level', level)
     for name, module in pairs(batch) do
-      print('integrity check', name)
+      if module.defaults then
+        print('setting defaults for module', name)
+        --[===[@non-debug@
+        if not VeneerData[name] then
+        --@end-non-debug@]===]
+          VeneerData[name] = {}
+        --[===[@non-debug@
+        end
+        --@end-non-debug@]===]
+        for k,v in pairs(module.defaults) do
+          VeneerData[name][k] = v
+        end
+        module.Conf = VeneerData[name]
+      end
 
-      --[===[@non-debug@
-      if module.defaults and not VeneerData[name] then
-      --@end-non-debug@]===]
-        print('Adding defaults from module ', name)
-        VeneerData[name] = module.default
-      --[===[@non-debug@
-      end
-      --@end-non-debug@]===]
     end
   end
 
--- a/ObjectiveCore.lua	Sat Apr 02 17:46:52 2016 -0400
+++ b/ObjectiveCore.lua	Mon Apr 04 03:16:22 2016 -0400
@@ -4,11 +4,9 @@
 -- @file-revision@ @file-hash@
 -- Created: 3/26/2016 1:51 AM
 local B = select(2,...).frame
-local wipe, pairs, ipairs, min, max, unpack = table.wipe, pairs, ipairs, min, max, unpack
-local setmetatable, type = setmetatable, type
-local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo
-local GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo
-local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local pairs, setmetatable, type, tostring = pairs, setmetatable, type, tostring
+local format = string.format
+local M = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
 local print = B.print('Objectives')
 local ObjectiveTrackerFrame = ObjectiveTrackerFrame
 
@@ -33,29 +31,36 @@
 local Scroll = _G.VeneerObjectiveScroll
 
 --- Baseline defaults
-mod.defaults = {
+M.defaults = {
 
 }
 
 --- list used to make things happen
-mod.orderedNames = {[1] = 'AutoQuest',  [2] = 'Quest', [3] = 'Cheevs'}
+M.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
 
 --- ipairs() list of handlers for wrapper update
-mod.orderedHandlers = {}
-mod.orderedTrackers = {}
-mod.indexedTrackers = {}
+M.orderedHandlers = {}
+M.orderedTrackers = {}
+M.indexedTrackers = {}
 --- pairs() list of handler frames for tracker updates
-mod.namedTrackers = {}
+M.namedTrackers = {}
 
 --- Handler stubs
-mod.AutoQuest = {
-  name = "AutoQuest"
+M.AutoQuest = {
+  name = "AutoQuest",
+  displayName = "Local Quests",
 }
-mod.Quest = {
-  name = "Quest"
+M.Quest = {
+  name = "Quest",
+  displayName = "Quests",
 }
-mod.Cheevs = {
-  name = "Cheevs"
+M.Cheevs = {
+  name = "Cheevs",
+  displayName = "Achievements",
+}
+M.Bonus = {
+  name = "Bonus",
+  displayName = "Bonus Objectives",
 }
 
 
@@ -100,15 +105,15 @@
   print(self, name)
   local handler = setmetatable({}, {
     __tostring = function() return name end,
-    __call = function (self) mod.UpdateTracker(self) end
+    __call = function (self) M.UpdateTracker(self) end
   })
-  if type(mod.orderedHandlers[index]) == 'table' then
-    return mod.orderedHandlers[index]
+  if type(M.orderedHandlers[index]) == 'table' then
+    return M.orderedHandlers[index]
   end
 
   print('take up locals first')
   local preset = {}
-  for k,v in pairs(mod[name]) do
+  for k,v in pairs(M[name]) do
     preset[k] = true
     if type(v) == 'table' then
       handler[k] = {}
@@ -124,7 +129,7 @@
         -- assume all tables to be local data; don't inherit or ref
         handler[k] = {}
       else
-        handler[k] = mod.Tracker[k]
+        handler[k] = M.Tracker[k]
       end
     else
       print(name, 'has its own', k)
@@ -134,16 +139,16 @@
   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)))
   end
-  mod[name] = handler
-  mod.orderedHandlers[index] = handler
+  M[name] = handler
+  M.orderedHandlers[index] = handler
   return true
 end
 
-mod.Tracker = setmetatable({}, {
+M.Tracker = setmetatable({}, {
   __call = CreateHandler,
   __tostring = function() return 'DEFAULT_TRACKING_HANDLER' end
 })
-local Tracker = mod.Tracker
+local Tracker = M.Tracker
 Tracker.numWatched = 0   --- number of entries being handled
 Tracker.numBlocks = 0    --- number of blocks created
 Tracker.actualBlocks = 0 --- number of blocks in use
@@ -169,8 +174,14 @@
       handler.freeBlocks[#handler.freeBlocks] = nil
     else
       block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, Scroll, 'VeneerTrackerBlock')
-      block.SetStyle = mod.SetBlockStyle
-      block:ClearAllPoints() -- making sure the anchors are clear in case they get added for some other template usage
+      block.SetStyle = M.SetBlockStyle
+      block.Select = handler.Select
+      block.Open = handler.Open
+      block.Remove = handler.Remove
+      block.Link = handler.Link
+      block:SetScript('OnMouseUp', handler.OnMouseUp)
+      block:SetScript('OnMouseDown', handler.OnMouseDown)
+      block:ClearAllPoints()
     end
 
     handler.usedBlocks[blockIndex] = block
@@ -178,10 +189,10 @@
   return handler.usedBlocks[blockIndex]
 end
 
-function mod:OnInitialize()
-  self.InitializeTrackers()
+function M:OnInitialize()
+  self.InitializeWrapper()
   self.InitializeXPTracker()
-  mod.SetEvents()
+  M.SetEvents()
   ObjectiveTrackerFrame:UnregisterAllEvents()
   ObjectiveTrackerFrame:Hide()
 
--- a/ObjectiveFrame.lua	Sat Apr 02 17:46:52 2016 -0400
+++ b/ObjectiveFrame.lua	Mon Apr 04 03:16:22 2016 -0400
@@ -5,9 +5,10 @@
 -- Created: 3/30/2016 12:49 AM
 local B = select(2,...).frame
 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local ipairs, max, min, unpack, floor, pairs, tostring, type = ipairs, max, min, unpack, floor, pairs, tostring, type
+local ipairs, max, min, unpack, floor, pairs, tostring, type, band = ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion
 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
+local Quest, Bonus, Cheevs = mod.Quest, mod.Bonus, mod.Cheevs
 local CreateFrame = CreateFrame
 local print = B.print('Objectives')
 local unitLevel = 1
@@ -40,86 +41,32 @@
 local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2
 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0}
 
---- These are mostly aesthetic choices so it lives here
 
+mod.InitializeWrapper = function()
 
-local Scroller_OnShow = function()
-  Wrapper.watchMoneyReasons = 0;
-  mod.UpdateWrapper()
-  mod.SetEvents()
-  for i, region in ipairs(Wrapper.headerComplex) do
-    region:Show()
-  end
-end
-
-local Scroller_OnHide = function()
-  local self = Wrapper
-  Wrapper:UnregisterAllEvents()
-  Wrapper:SetScript('OnEvent', nil)
-  for i, region in ipairs(Wrapper.headerComplex) do
-    region:Hide()
-  end
-end
-
-local Scroller_OnMouseWheel = function(self, delta)
-  local r = Scroll:GetHeight() - Scroller:GetHeight()
-  local s = B.Conf.ObjectiveScroll - delta * floor(r/5+.5)
-  local from = self:GetVerticalScroll()
-  if s >= r then
-    s = r
-  elseif s < 1 then
-    s = 0
-  end
-  self:SetVerticalScroll(s)
-  B.Conf.ObjectiveScroll = s
-  print('|cFF00FF00OnMouseWheel', 'from = ', from, 'scroll =', s, ' range =', r, 'current =', self:GetVerticalScroll())
-
-  mod.UpdateActionButtons('SCROLLING')
-end
-
-local WrapperCloseButton_OnClick = function(self)
-  Wrapper:Minimize()
-  if B.Conf.FrameState[Wrapper:GetName()] == 1 then
-    self:GetNormalTexture():SetTexture([[Interface\PaperDollInfoFrame\UI-Character-SkillsPageDown-Up]])
-    self:GetPushedTexture():SetTexture([[Interface\PaperDollInfoFrame\UI-Character-SkillsPageDown-Down]])
-  else
-    self:GetNormalTexture():SetTexture([[Interface\PaperDollInfoFrame\UI-Character-SkillsPageUp-Up]])
-    self:GetPushedTexture():SetTexture([[Interface\PaperDollInfoFrame\UI-Character-SkillsPageUp-Down]])
-  end
-end
-local WrapperCloseButton_OnMouseWheel = function(self, delta)
-end
-
-mod.InitializeTrackers = function()
-
+  mod.SetBlockStyle(Scroller, 'Scroller', 'Normal')
+  mod.SetBlockStyle(Scroller, 'Scroll', 'Normal')
+  mod.SetBlockStyle(Wrapper, 'Wrapper', 'Normal')
 
   for i, name in ipairs(orderedNames) do
     if not mod.orderedHandlers[i] then
       if mod.Tracker(name, i) then
         local handler = mod[name]
-
         local tracker = CreateFrame('Frame', 'Veneer'..name..'Tracker', Scroll, 'VeneerTrackerTemplate')
-        tracker.title:SetText(name)
+        tracker.title:SetText(handler.displayName)
         mod.SetBlockStyle(tracker, 'Tracker', 'Normal')
-
         handler.Tracker = tracker
         mod.orderedTrackers[i] = tracker
         mod.namedTrackers[name] = tracker
         mod.indexedTrackers[handler] = tracker
         print('created new tracker frames for new handler')
-
-
       end
     end
   end
 
   Scroller:SetScrollChild(Scroll)
-  Scroller:SetScript('OnMouseWheel', Scroller_OnMouseWheel)
-  Scroller:SetScript('OnShow', Scroller_OnShow)
-  Scroller:SetScript('OnHide', Scroller_OnHide)
-  Wrapper.close:SetScript('OnClick', WrapperCloseButton_OnClick)
-  Wrapper.close:SetScript('OnMouseWheel', WrapperCloseButton_OnMouseWheel)
-  Wrapper:SetPoint(unpack(wrapperPosition))
+
+  mod.InitializeWrapperWidgets()
   if B.Conf.ObjectiveTrackerMinimized then
     Scroller_OnShow(Scroller)
   end
@@ -208,211 +155,12 @@
 
 
 
-local segments = {'Left', 'Right', 'Tile'}
-mod.UpdateWrapperStyle = function()
-  --[[for _, segment in ipairs(segments) do
-    local texture, a1, a2, a3, a4, width = unpack(mod.defaults.Style.Wrapper.BackgroundComplex[segment])
-    Wrapper['Background'..segment]:SetAtlas(texture)
-    Wrapper['Background'..segment]:SetTexCoord(a1, a2, a3, a4)
-    if width then
-      Wrapper['Background'..segment]:SetWidth(width)
-    end
-  end]]
-end
-
---- Updates the selected block frame to display the given info batch
--- If `previousBlock` is set, it will attempt to anchor to that
--- @param blockNum the ordered block to be updated, not a watchIndex value
--- @param info the reference returned by the GetXInfo functions
--- REMEMBER: t.info and questData[questID] are the same table
-mod.UpdateTrackerBlock = function (handler, blockIndex, info)
-  local print = B.print('ObjectiveBlockParse')
-  print('  |cFF00FFFFUpdateTrackerBlock('..blockIndex..'|r')
-  if not blockIndex or not info then
-    return
-  end
-
-  local mainStyle = 'Normal'
-  local subStyle
+mod.UpdateTracker = function(handler)
   local tracker = handler.Tracker
-
-  local t = handler:GetBlock(blockIndex)
-  if previousBlock then
-    t:SetPoint('TOPLEFT', previousBlock, 'BOTTOMLEFT', 0, 0)
-    t:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
-  end
-  --print(t:GetName(), t:GetSize())
-  --print(t:GetPoint(1))
-
-  t.info = info
-
-  if info.questID then handler.QuestBlock[info.questID] = t end
-  if info.questLogIndex then handler.LogBlock[info.questLogIndex] = t end
-  if info.watchIndex then handler.WatchBlock[info.watchIndex] = t end
-
-  info.blockIndex = blockIndex
-  handler.BlockInfo[blockIndex] = info
-
-  t.Select = handler.Select
-  t.Open = handler.Open
-  t.Remove = handler.Remove
-  t.Link = handler.Link
-  t:SetScript('OnMouseUp', handler.OnMouseUp)
-  t:SetScript('OnMouseDown', handler.OnMouseDown)
-  t.title:SetText(info.title)
-
-  t.attachmentHeight = 0
-  if info.isComplete then
-    t.status:Show()
-    t.status:SetText(info.completionText)
-  elseif info.numObjectives >= 1 then
-    t.attachmentHeight = textSpacing
-    t.status:Show()
-    print('  - objective lines:', info.numObjectives, 'can wrap:', t.status:CanWordWrap())
-
-    local text = ''
-
-    --- todo: implement objective displays
-     -- in an accumulator loop, call upon handler for the appropriate display frame, each defining:
-      -- * height   - height of whatever display widget is involved in conveying the task
-      -- * lines    - number of non-wrapped text lines to account for line space; may be discarded depending on things
-      -- * money    - boolean that determines listening for money events or not
-      -- * progress - number ranging 0 to 2 indicating none/partial/full completion respectively
-    text = mod.UpdateObjectives(t, info, text)
-
-    t.status:SetText(text)
-    t.status:SetWordWrap(true)
-
-  elseif info.description then
-    t.status:SetText(info.description)
-    t.status:SetWordWrap(true)
-  else
-    t.status:SetText(nil)
-  end
-
-  if info.isComplete then
-    mainStyle = 'Complete'
-  end
-  if info.superTracked then
-    subStyle = 'Super'
-  elseif info.isDaily then
-    subStyle = 'Daily'
-  end
-
-  if info.specialItem and not info.itemButton then
-    print('  - |cFF00FFFFgenerating item button for info set')
-    info.itemButton = mod.SetItemButton(t, info)
-  else
-    --info.itemButton = nil
-  end
-
-  if info.level then
-    local levelDiff = unitLevel - info.level
-    if  levelDiff > 9 then
-      t.title:SetTextColor(0.7, 0.7, 0.7, 1)
-    elseif levelDiff > 1 then
-      t.title:SetTextColor(0.5, 1, 0.5, 1)
-    elseif levelDiff < -1 then
-      t.title:SetTextColor(1, 0.4, 0.25, 1)
-    elseif levelDiff < -4 then
-      t.title:SetTextColor(1, 0, 0, 1)
-    else
-      t.title:SetTextColor(1,1,1,1)
-    end
-  end
-
-
-  if Devian and Devian.InWorkspace() then
-    t.debugText:Show()
-    t.debugText:SetText(tostring(blockIndex) .. '\n' .. tostring(info.itemButton and info.itemButton:GetName()) .. "\n" .. (info.level and info.level or '-'))
-  end
-
-  --- metrics are calculated in SetStyle
-  t:SetStyle('TrackerBlock', handler.name, mainStyle, subStyle)
-  t:Show()
-
-  print('  |cFF00FFFF)|r -> ', t, t:GetHeight())
-  return t
-end
-
-mod.UpdateObjectives = function(block, info, text)
-  local print = B.print('ObjectiveBlockParse')
-
-  local attachmentHeight = block.attachmentHeight
-  if info.description then
-    print('  -- has description text:', select('#', info.description), info.description)
-    text = info.description
-  end
-  local completionScore, completionMax = 0, 0
-  for o, obj in ipairs(info.objectives) do
-    --- achievement criteria
-    if obj.flags then
-
-
-      if bit.band(obj.flags, 0x00000001) > 0 then
-        obj.type = 'ProgressBar'
-      elseif bit.band(obj.flags, 0x00000002) then
-        obj.type = 'Hidden'
-        obj.widget = nil
-      else
-        obj.type = 'Text'
-        obj.widget = nil
-        text = text .. ((text == '') and "" or "\n") .. obj.text
-      end
-
-      print('obj.type =', obj.type)
-      print('  ** qtyStr:', obj.quantityString, 'qty:', obj.quantity, 'assetID:', obj.assetID)
-      obj.widget = mod.SetWidget(obj, info)
-      if obj.finished then
-        obj.progress = 2
-      elseif obj.quantity > 0 then
-        obj.progress  = 1
-      else
-        obj.progress = 0
-      end
-
-
-      --- none of the above (most quests)
-    else
-      local line = obj.text
-      local color = '00FFFF'
-      if obj.finished then
-        obj.progress = 2
-        color = 'FFFFFF'
-      elseif obj.type == 'monster' then
-        color = 'FFFF00'
-      elseif obj.type == 'item' then
-        color = '44DDFF'
-      elseif obj.type == 'object' then
-        color = 'FF44DD'
-      end
-      text = text .. ((text == '') and "" or "\n") .. '|cFF'..color.. line .. '|r'
-    end
-
-    if obj.widget then
-
-      obj.widget:Show()
-      obj.widget:SetPoint('TOPLEFT', block.objectives, 'BOTTOMLEFT', 0, -attachmentHeight)
-      print('have a widget, height is', obj.widget.height)
-      attachmentHeight = attachmentHeight + obj.widget.height
-      completionScore = completionScore + obj.progress
-      completionMax = completionMax + 2
-    end
-
-  end
-
-  block.completionScore = completionScore / completionMax
-  block.attachmentHeight = attachmentHeight
-
-  return text
-end
-
-mod.UpdateTracker = function(handler)
-  print('|cFF00FF88UpdateTracker(|r|cFFFF4400' .. type(handler) .. '|r :: |cFF88FFFF' .. tostring(handler) .. '|r')
-  local tracker = handler.Tracker
+  print('|cFFFF4400'..tracker:GetName().. '|r:Update()')
   local blockIndex = 0
   local trackerHeight = headerHeight
-  local w = 300
+
 
   previousBlock = tracker.title
   local numWatched = handler.GetNumWatched()
@@ -425,12 +173,12 @@
       if info then
         local currentBlock = mod.UpdateTrackerBlock(handler, blockIndex, info)
         previousBlock = currentBlock
-        print('|cFF00FF00'..currentBlock:GetName()..'|r', currentBlock.height)
+        print('    |cFFFFFF00'..watchIndex..'|r', '|cFF00FF00'..currentBlock:GetName()..'|r', currentBlock.height)
         trackerHeight = trackerHeight + currentBlock.height
         numBlocks = max(numBlocks, watchIndex)
         actualBlocks = actualBlocks + 1
       else
-        print('|cFFFF0000Failed to draw info for index #'..watchIndex)
+        print('    |cFFFF0000Failed to draw info for index #'..watchIndex)
       end
 
     elseif watchIndex <= numBlocks then
@@ -444,7 +192,7 @@
         used[blockIndex] = nil
       end
     else
-      print('Stopping scan at', blockIndex)
+      print('  |cFFFF9900END|r @', blockIndex)
       break -- done with quest stuff
     end
   end
@@ -452,36 +200,251 @@
   handler.numBlocks = numBlocks
   handler.actualBlocks = actualBlocks
   handler:Report()
-  previousBlock = nil
-  if numBlocks > 0 then
+
+  if numBlocks >= 1 then
+    previousBlock = nil
     tracker.height = trackerHeight
   else
     tracker.height = 0
   end
 
-  print('|cFF00FF88)|r ->', numBlocks, 'blocks; height', tracker.height, 'last block: ')
+  return tracker.numWatched, tracker.numAll
 end
 
+--- Updates the selected block frame to display the given info batch
+-- If `previousBlock` is set, it will attempt to anchor to that
+-- @param blockNum the ordered block to be updated, not a watchIndex value
+-- @param info the reference returned by the GetXInfo functions
+-- REMEMBER: t.info and questData[questID] are the same table
+mod.UpdateTrackerBlock = function (handler, blockIndex, info)
+  local print = B.print('BlockParse')
+  print('  Read list item |cFF00FFFF'..blockIndex..'|r')
+  if not blockIndex or not info then
+    return
+  end
+  local tracker = handler.Tracker
+  local t = handler:GetBlock(blockIndex)
+  t.handler = handler
+  t.info = info
+  t.mainStyle = 'Normal'
+  t.subStyle = nil
+
+  info.blockIndex = blockIndex
+  if info.questID then handler.QuestBlock[info.questID] = t end
+  if info.questLogIndex then handler.LogBlock[info.questLogIndex] = t end
+  if info.watchIndex then handler.WatchBlock[info.watchIndex] = t end
+  handler.BlockInfo[blockIndex] = info
+
+
+  t.attachmentHeight = 0
+  --if info.isComplete then
+    --t.status:Show()
+    --t.status:SetText(info.completionText)
+  --end
+
+  if info.numObjectives >= 1 then
+    t.attachmentHeight = textSpacing
+    t.status:Show()
+    print('    lines to build:', info.numObjectives)
+
+    local text = ''
+
+    mod.UpdateObjectives(t, info, text)
+  elseif info.description then
+    t.status:SetText(info.description)
+  else
+    t.status:SetText(nil)
+  end
+  t.title:SetText(info.title)
+
+
+  if info.specialItem and not info.itemButton then
+    print('    - |cFF00FFFFgenerating item button for info set')
+    info.itemButton = mod.SetItemButton(t, info)
+  else
+    --info.itemButton = nil
+  end
+
+  handler.SetBlockTags(t, info)
+
+  if previousBlock then
+    t:SetPoint('TOPLEFT', previousBlock, 'BOTTOMLEFT', 0, 0)
+    t:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
+    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 Devian and Devian.InWorkspace() then
+    t.debugText:Show()
+    t.debugText:SetText(tostring(blockIndex) .. '\n' .. tostring(info.itemButton and info.itemButton:GetName()) .. "\n" .. (tostring(t.mainStyle) .. '/' .. tostring(t.subStyle)))
+  end
+  return t
+end
+
+mod.UpdateObjectives = function(block, info, text)
+  local print = B.print('BlockLine')
+  print('   |cFF00FF00objective updates for', block:GetName())
+
+  local attachmentHeight = block.attachmentHeight
+  if info.description then
+    print('  -- has description text:', select('#', info.description), info.description)
+    text = info.description
+  end
+  local completionScore, completionMax = 0, 0
+
+  for i, line in ipairs(info.objectives) do
+    print('     |cFF88FF00objective', i)
+    block.handler.ParseObjective(line, info)
+
+    if line.title then
+      info.title = line.title
+      line.title = nil
+    end
+
+
+    if line.widget then
+      line.widget:Show()
+      line.widget:SetParent(block)
+      line.widget:SetPoint('TOPLEFT', block.status, 'BOTTOMLEFT', 0, -attachmentHeight )
+      print('   has a widget, height is', line.widget.height)
+      attachmentHeight = attachmentHeight + line.widget.height
+      completionScore = completionScore + line.progress
+      completionMax = completionMax + 2
+    end
+
+    if line.displayText then
+      print('   has text')
+      text = text .. ((text == '') and "" or "\n") .. '|cFF'..line.displayColor.. line.displayText .. '|r'
+    end
+
+  end
+
+  block.completionScore = completionScore / completionMax
+  block.attachmentHeight = attachmentHeight
+
+  block.status:SetText(text)
+end
+
+--- Objective parsers
+-- defines the following variables
+-- * height   - height of whatever display widget is involved in conveying the task
+-- * lines    - number of non-wrapped text lines to account for line space; may be discarded depending on things
+-- * money    - boolean that determines listening for money events or not
+-- * progress - number ranging 0 to 2 indicating none/partial/full completion respectively
+mod.Tracker.ParseObjective = function(line, info)
+
+  if line.finished then
+    line.progress = 2
+  elseif line.quantity > 0 then
+    line.progress  = 1
+  else
+    line.progress = 0
+  end
+
+end
+
+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
+    line.title = line.text
+  else
+    line.displayText = line.text
+  end
+
+  line.progess = 0
+  if line.objectiveType == 'progressbar' then
+    print('  |cFFFF0088==|r', line.type, line.text)
+    line.widgetType = 'ProgressBar'
+    print('    |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID)))
+    line.value = GetQuestProgressBarPercent(info.questID) or 0
+    line.maxValue = 100
+    if  line.value >= line.maxValue then
+      line.progress = 1
+    elseif line.value > 0 then
+      line.progress = 2
+    end
+    line.format = PERCENTAGE_STRING
+    line.widget = mod.SetWidget(line, info, 'ProgressBar', info.questID..'-'..line.index)
+    print('line.type =', line.type)
+    print('  ** qtyStr:', line.quantityString, 'qty:', line.value, 'assetID:', line.questID)
+  else
+    line.widget = nil
+  end
+end
+
+Cheevs.ParseObjective = function(line, info)
+  local print = B.print('CheevsLine')
+  line.progress = 0
+  if line.flags then
+    if band(line.flags, 0x00000001) > 0 then
+      line.format = "%d/%d"
+      line.widget = mod.SetWidget(line, info, 'ProgressBar', line.criteriaID)
+    elseif band(line.flags, 0x00000002) then
+      line.widget = nil
+    else
+      line.widget = nil
+      line.displayColor = 'FFFFFF'
+      line.displayText = line.text
+
+    end
+  end
+  print('line.type =', line.type)
+  print('  ** qtyStr:', line.quantityString, 'qty:', line.quantity, 'assetID:', line.assetID)
+end
+
+Quest.ParseObjective = function(line)
+  local print = B.print('QuestLine')
+  print('      |cFFFF0088', line.type)
+  local color = '00FFFF'
+  line.progress = 0
+  if line.finished then
+    line.progress = 2
+    color = 'FFFFFF'
+  elseif line.type == 'monster' then
+    color = 'FFFF00'
+  elseif line.type == 'item' then
+    color = '44DDFF'
+  elseif line.type == 'object' then
+    color = 'FF44DD'
+  end
+  line.displayColor = color
+  line.displayText = line.text
+end
+
+
 mod.Quest.numButtons = 0
 local usedButtons = mod.Quest.itemButtons
 local freeButtons = mod.Quest.freeButtons
 mod.UpdateWrapper = function()
   unitLevel = UnitLevel('player')
-  wrapperWidth = wrapperMaxWidth
-  scrollWidth = wrapperWidth
+  wrapperWidth = mod.Conf.Wrapper.WrapperWidth
+  scrollWidth = mod.Conf.Wrapper.WrapperWidth
   local wrapperBlocks = 0
   -- Update scroll child vertical size
   scrollHeight = 0
   for i, handler in ipairs(orderedHandlers) do
     mod.UpdateTracker(handler)
+    local tracker = handler.Tracker
     if handler.actualBlocks >= 1 then
-      local tracker = handler.Tracker
-      print('setting', handler.Tracker, 'to anchor to offset', -scrollHeight)
       tracker:SetParent(Scroll)
       tracker:SetPoint('TOPLEFT', Scroll, 'TOPLEFT', 0, - scrollHeight)
       tracker:SetSize(wrapperWidth, tracker.height)
-      print('adding ', tracker.height)
+      print('|cFF00FFFF'..tracker:GetName()..'|r h:|cFF00FF00', tracker.height, '|r y:|cFF00FF00', -scrollHeight)
       scrollHeight = scrollHeight + tracker.height
+      tracker:Show()
+    else
+      tracker:Hide()
     end
     wrapperBlocks = wrapperBlocks + handler.actualBlocks
   end
@@ -513,18 +476,13 @@
     end
     return
   end
-  --wrapperHeight = scrollHeight
+  --[[wrapperHeight = scrollHeight
 
-  print('|cFFFFFF00params:|r scroller:', scrollWidth, 'x', scrollHeight)
-  print('|cFFFFFF00params:|r scroll:', scrollWidth, 'x', scrollHeight)
-  print('|cFFFFFF00params:|r wrapper:', wrapperWidth, 'x', wrapperHeight)
-  print('|cFFFFFF00params:|r header:', headerHeight)
+  print('|cFFFFFF00params:|r scroller:', scrollWidth .. ',' .. scrollHeight, 'scroll:', scrollWidth .. ',' .. scrollHeight,
+  'wrapper:', wrapperWidth .. ',' .. wrapperHeight,
+  'header:', headerHeight)]]
 
-  mod.SetBlockStyle(Scroller, 'Scroller', 'Normal')
-  mod.SetBlockStyle(Scroller, 'Scroll', 'Normal')
-  mod.SetBlockStyle(Wrapper, 'Wrapper', 'Normal')
-
-  Scroller:SetSize(wrapperWidth, wrapperHeight)
+  --Scroller:SetSize(wrapperWidth, wrapperHeight)
   Scroller:SetPoint('TOPLEFT', Wrapper, 'TOPLEFT', 0, 0)
   Scroller:SetPoint('BOTTOMRIGHT', Wrapper, 'BOTTOMRIGHT')
 
@@ -536,13 +494,14 @@
   --Scroller:UpdateScrollChildRect()
   Wrapper:SetSize(wrapperWidth, wrapperHeight)
 
-  -- update action buttons
+  --[[ update action buttons
   print('|cFF00FF00'..Scroll:GetName()..'|r:', Scroll:GetWidth(), Scroll:GetHeight(),
     '|cFF00FF00'..Scroller:GetName()..'|r:', Scroller:GetWidth(), Scroller:GetHeight(),
     '|cFF00FF00'..Wrapper:GetName()..'|r:', Wrapper:GetWidth(), Wrapper:GetHeight(),
     '|cFF0088FFvScrollRange|r:', floor(Scroller:GetVerticalScrollRange()+.5)
   )
-  mod.UpdateActionButtons('FULL_UPDATE')
+  mod.UpdateActionButtons()
+  --]]
 
 end
 
--- a/ObjectiveInfo.lua	Sat Apr 02 17:46:52 2016 -0400
+++ b/ObjectiveInfo.lua	Mon Apr 04 03:16:22 2016 -0400
@@ -3,9 +3,9 @@
 local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo
 local GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo
 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local print = B.print('Objectives')
+local print = B.print('TrackerInfo')
 
-local Tracker, AutoQuest, Quest, Cheevs = mod.Tracker, mod.AutoQuest, mod.Quest, mod.Cheevs
+local Tracker, Bonus, AutoQuest, Quest, Cheevs = mod.Tracker, mod.Bonus, mod.AutoQuest, mod.Quest, mod.Cheevs
 --------------------------------------------------------------------
 --- Tracker-specific data retrieval functions
 --------------------------------------------------------------------
@@ -13,28 +13,84 @@
 
 -----------------------------
 --- AUTO_QUEST
-AutoQuest.name = "Remote Quests"
 AutoQuest.GetNumWatched = GetNumAutoQuestPopUps
 AutoQuest.GetInfo = function(watchIndex)
   return Quest.GetInfo(watchIndex)
 end
 
 -----------------------------
+--- BONUS OBJECTIVE
+Bonus.TasksTable = {}
+Bonus.TasksPOI = {}
+Bonus.TaskScenario = {}
+
+local taskData = {}
+Bonus.QuestBlock = {}
+Bonus.GetNumWatched = function()
+  Bonus.TasksTable = GetTasksTable()
+  local numTasks = 0
+  for i, questID in ipairs(Bonus.TasksTable) do
+    local isInArea, isOnMap, numObjectives = GetTaskInfo(questID)
+    if isInArea and isOnMap then
+      numTasks = numTasks + 1
+    end
+  end
+  Bonus.numAll = #Bonus.TasksTable
+  Bonus.numWatched = numTasks
+  return GetNumQuestLogTasks()
+end
+Bonus.GetInfo = function(self, watchIndex)
+  local questID = Bonus.TasksTable[watchIndex]
+  if not questID then
+    print('|cFFFF4400no quest ID for row', watchIndex)
+    return
+  end
+
+
+  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')
+    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)
+
+      print(i, '==>', o.text, o.objectiveType, o.finished, o.displayAsObjective)
+      t.displayObjectives = t.displayObjectives or o.displayAsObjective
+      t.isComplete = t.isComplete and o.finished
+
+    end
+  end
+  Bonus.TasksTable[questID] = t
+
+  return t
+end
+
+-----------------------------
 --- QUEST
-Quest.name = "Quests"
 Quest.itemButtons = {}
 Quest.freeButtons = {}
 Quest.POI = {}
 Quest.QuestBlock = {}
 Quest.GetNumWatched = function()
-  return GetNumQuestWatches ()
+  Quest.numAll = GetNumQuestLogEntries()
+  Quest.numWatched = GetNumQuestWatches()
+  return Quest.numWatched
 end
 Quest.GetInfo = function (self, watchIndex)
   print('|cFF00DDFFQuest|r.|cFF0088FFGetInfo(|r'.. tostring(watchIndex)..'|r)')
   local questID, title, questIndex, numObjectives, requiredMoney, isComplete,
   startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isStory, isOnMap, hasLocalPOI = GetQuestWatchInfo(watchIndex)
 
-  local _, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex)
+  local _, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, _, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex)
   local questTagID, tagName = GetQuestTagInfo(questID);
 
   if not questID then
@@ -67,6 +123,11 @@
   q.isComplete = isComplete
   q.isStory = isStory
   q.isTask = isTask
+
+  if isTask then
+    --q.task =  Bonus.GetInfo(questID)
+  end
+
   --q.isBreadCrumb = isBreadCrumb
   q.completionText= GetQuestLogCompletionText(questIndex)
   q.numObjectives = GetNumQuestLeaderBoards(questIndex)
@@ -76,6 +137,7 @@
   for i = 1, q.numObjectives do
     local text, type, finished = GetQuestLogLeaderBoard(i, questIndex)
     q.objectives[i] = {
+      index = i,
       type = type,
       text = text,
       finished = finished
@@ -156,12 +218,13 @@
   for i = 1, c.numObjectives do
     local description, type, completed, quantity, requiredQuantity, characterName, flags, assetID, quantityString, criteriaID = GetAchievementCriteriaInfo(cheevID, i)
     c.objectives[i] = {
+      index = i,
       cheevID = cheevID,
       text = description,
       type = type,
       finished = completed,
-      quantity = quantity,
-      requiredQuantity = requiredQuantity,
+      value = quantity,
+      maxValue = requiredQuantity,
       characterName = characterName,
       flags = flags,
       assetID = assetID,
--- a/ObjectiveStyle.lua	Sat Apr 02 17:46:52 2016 -0400
+++ b/ObjectiveStyle.lua	Mon Apr 04 03:16:22 2016 -0400
@@ -5,35 +5,41 @@
 --- Deals with swapping between different color palettes
 ---
 
-local itemButtonSize, itemButtonSpacing =  36, 1
-local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0}
 local titleFont, textFont = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]]
-local titleSize, textSize = 15, 15
+local titleSize, textSize = 16, 15
 local titleOutline, textOutline = "OUTLINE", "OUTLINE"
-local titleSpacing, textSpacing = 4, 3
+local titleSpacing, textSpacing = 3, 1
 local unpack, type, pairs, tconcat = unpack, type, pairs, table.concat
-local wrapperMaxWidth, wrapperMaxHeight = 280, 490 -- these are the hard bounds, actual *Height variables are changed
 local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE'
-local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24
-local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2
+local headerFont, headerSize = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 24
+local headerOutline, headerSpacing = 'OUTLINE', 2
 
 
-mod.defaults.ObjectiveWrapper = {
-  ObjectiveTrackerFloat = {'BOTTOM', 'RIGHT'},
-  ObjectiveTrackerParent = 'DebuffButton',
-  ObjectiveTrackerSize = {250, 600},
-  ObjectiveWrapperParent = '',
+mod.defaults.Wrapper = {
+  WrapperPoint = 'TOPRIGHT',
+  WrapperFloatX = -25,
+  WrapperFloatV = 'TOP',
+  WrapperFloatY = -200,
+
+  WrapperWidth = 270,
+  WrapperHeight = 600,
 }
+mod.defaults.Tracker = {
+  HeaderHeight = 24,
+}
+
 mod.defaults.Style = {
   Format = {
     Frame = {
       Width = 270,
     },
     title = {
-      Indent = 0
+      Indent = 0,
+      Spacing = 0,
     },
     status = {
-      Indent = 5
+      Indent = 5,
+      Spacing = 0,
     }
   },
   FontBank = {
@@ -46,6 +52,8 @@
     title = {
       TextColor = {1, 1, 1, 1},
       Width = 270,
+      Spacing = 0,
+      Indent = 2,
     },
     titlebg = {
       Background = {0, 0, 0, 1},
@@ -53,6 +61,7 @@
     },
     status = {
       Width = 270,
+      Spacing = 0,
     },
     statusbg = {
       Width = 270,
@@ -63,8 +72,6 @@
   },
   Wrapper = {
     Frame = {
-    Point = {wrapperPosition},
-    MaxSize = {wrapperMaxWidth, wrapperMaxHeight},
     BackgroundComplex = {Left = {'', 0, 0.4, 0,1, 100}, Right={'', 0.6,1,0,1}, Tile = {'', 0.4,.6,0,1, 100}}, },
     title = {
       Font = {wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline},
@@ -74,41 +81,50 @@
     Normal = {
       title = {
         Font = {headerFont, headerSize, headerOutline}, Spacing = headerSpacing,
+        Indent = 2,
+        TextColor = {1, .9, .2, 1},
       },
       titlebg = {
-        Gradient = {MinColor = {0,0,0,0.7}, MaxColor = {0,0,0,.35}},
+        Gradient = {MinColor = {0,0,0,0.25}, MaxColor = {0,0,0,.15}},
       }
     }
   },
   TrackerBlock = {
     Normal = {
       titlebg = {
-        Gradient = { MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, .19}},
+        Indent = 2,
+        Gradient = { MinColor = {0.2, .4, 1, 0}, MaxColor = {.7, 0, 0.9, .14}},
       },
       title = {
+        TextColor = {1,1,1,0.5},
         Font = {titleFont, titleSize, titleOutline},
         Spacing = titleSpacing,
       },
       status = {
-        Font = {textFont, textSize, textOutline}, Spacing = textSpacing,
+        TextColor = {1,1,1,0.5},
+        Font = {textFont, textSize, textOutline},
+        Spacing = textSpacing,
       },
       statusbg = {
-        Gradient = { MinColor = {0.2, .4, 1, 0.25}, MaxColor = {.7, 0, 0.9, .12}},
+        Gradient = { MinColor = {0.2, .4, 1, 0}, MaxColor = {.7, 0, 0.9, .11}},
       }
     },
     Super = {
       title = {
+        TextColor = {1,1,1,1},
         Font = {titleFont, titleSize, titleOutline},
         Spacing = titleSpacing, BackgroundFullWidth = true
       },
       titlebg = {
-        Gradient = { MinColor = {0, .7, .6, .8}, MaxColor = {0, .7, .6, 0.2}},
+        Gradient = { MinColor = {0, .7, .6, .45}, MaxColor = {0, .7, .6, 0.23}},
       },
       status = {
-        Font = {textFont, textSize, textOutline}, Spacing = textSpacing,
+        TextColor = {1,1,1,1},
+        Font = {textFont, textSize, textOutline},
+        Spacing = textSpacing,
       },
       statusbg = {
-        Gradient = { MinColor = {0, .7, .6, 0.5}, MaxColor = {0, .7, .6, 0.1} },
+        Gradient = { MinColor = {0, .7, .6, 0.40}, MaxColor = {0, .7, .6, 0.23} },
       },
     },
     MouseDown = {
@@ -129,12 +145,14 @@
     },
     Complete = {
       title = {
+        TextColor = {1,1,1,0.5},
         Font = {titleFont, titleSize, titleOutline},        Spacing = titleSpacing,
       },
       titlebg = {
         Gradient = {          MinColor = {0, 1, 0, 0.34},          MaxColor = {0, 1, 0, .17},        },
       },
       status = {
+        TextColor = {1,1,1,0.5},
         Font = {textFont, textSize, textOutline},        Spacing = textSpacing,
       },
       statusbg = {
@@ -203,6 +221,7 @@
 mod.regionStyles = {}
 mod.SetBlockStyle = function(frame, frameType, ...)
   -- var names intended to reflect argument order
+  print('|cFFFFFF00'..frame:GetName()..'|r')
   --@debug@
   local c = mod.defaults.Normal
   local style_list = {... }
@@ -265,8 +284,6 @@
       end
     end
     style_cache[styleName] = style
-  else
-    print('Cache hit: ', styleName)
   end
 
   local style = style_cache[styleName]
@@ -314,44 +331,39 @@
     print('storing style func', styleName, result())
     style_cache_func[styleName] = result()
 
-  else
-    print('Cache function hit:', styleName)
   end
   style_cache_func[styleName](frame)
 
   --- Hardcoding the sizing vars for sanity
   local normalSettings = mod.defaults.Style.Format
-  frame.titleHeight = frame.title and (frame.title:GetStringHeight() + frame.title.spacing*2) or 0
-  frame.statusHeight = frame.status and (frame.status:GetStringHeight() + frame.status.spacing*2 + frame.attachmentHeight) or 0
-  frame.height = frame.titleHeight + frame.statusHeight
+  frame.titleHeight = frame.title and (frame.title:GetStringHeight() + (frame.title.spacing or 0)*2) or 0
+  frame.statusHeight = frame.status and (frame.status:GetStringHeight() + (frame.status.spacing or 0)*2)  or 0
+  frame.height = frame.titleHeight + frame.statusHeight + (frame.attachmentHeight or 0)
   frame.width = normalSettings.Frame.Width
   frame.statusWidth = frame.width - normalSettings.status.Indent
   frame.titleWidth = frame.width - normalSettings.title.Indent
 
   if frame.status then
-    print('status  ', frame.statusHeight, normalSettings.status.Indent, 0)
+    print('status  ', frame.statusHeight, normalSettings.status.Indent, 0, 'statusbg', frame.statusHeight)
     frame.status:SetPoint('LEFT', frame, 'LEFT', normalSettings.status.Indent, 0)
     frame.status:SetHeight(frame.statusHeight)
     if frame.statusbg then
 
-      print('statusbg', frame.statusHeight)
-      frame.statusbg:SetHeight(frame.statusHeight)
+      frame.statusbg:SetHeight(frame.statusHeight + (frame.attachmentHeight or 0))
       frame.statusbg:SetWidth(frame.width)
     end
   end
   if frame.title then
-    print('title  ',frame.titleHeight, normalSettings.title.Indent)
+    print('title  ',frame.titleHeight, normalSettings.title.Indent, 'titlebg',frame.titleHeight)
     frame.title:SetPoint('LEFT', frame, 'LEFT', normalSettings.title.Indent)
     frame.title:SetHeight(frame.titleHeight)
     if frame.titlebg then
-      print('titlebg',frame.titleHeight)
       frame.titlebg:SetHeight(frame.titleHeight)
       frame.titlebg:SetWidth(frame.width)
     end
   end
+  frame:SetSize(frame.width, frame.height)
   print('sizing frame', frame.width, frame.height)
-  frame:SetSize(frame.width, frame.height)
-  print(frame:GetSize())
     --[[
       local titleSpacing, titleSpacing2 = c.Title.Spacing, (c.Title.Spacing * 2)
       local textSpacing, textSpacing2 = c.Text.Spacing, (c.Text.Spacing * 2)
@@ -379,13 +391,53 @@
     --]]
   --print('    |cFF00FFFF'..block:GetName()..'|r:|cFF0088FFSetStyle|r(', blockWidth, 'x', blockHeight, '(textH', textHeight,', titleH', titleHeight, ')')
 end
+local segments = {'Left', 'Right', 'Tile' }
+local Wrapper = _G.VeneerObjectiveWrapper
+mod.UpdateWrapperStyle = function()
+  local  c = mod.Conf.Wrapper
+  --Wrapper:ClearAllPoints()
+  --Wrapper:SetPoint(c.WrapperPoint, UIParent, c.WrapperPoint, c.WrapperFloatX, c.WrapperFloatY)
+end
+
+mod.Tracker.SetBlockTags = function(block, info)
+  if info.isComplete then
+    block.mainStyle = 'Complete'
+  end
+  if info.superTracked then
+    block.subStyle = 'Super'
+  elseif info.isDaily then
+    block.subStyle = 'Daily'
+  end
+end
+local unitLevel = UnitLevel('player')
+mod.Quest.SetBlockTags = function(block, info)
+
+  mod.Tracker.SetBlockTags(block, info)
+  if info.level then
+    local levelDiff = unitLevel - info.level
+    if  levelDiff > 9 then
+      block.title:SetTextColor(0.7, 0.7, 0.7, 1)
+    elseif levelDiff > 1 then
+      block.title:SetTextColor(0.5, 1, 0.5, 1)
+    elseif levelDiff < -1 then
+      block.title:SetTextColor(1, 0.4, 0.25, 1)
+    elseif levelDiff < -4 then
+      block.title:SetTextColor(1, 0, 0, 1)
+    else
+      block.title:SetTextColor(1,1,1,1)
+    end
+  end
+end
+mod.Cheevs.SetBlockTags = function(block, info)
+  mod.Tracker.SetBlockTags(block, info)
+end
 
 --- Argument containers
-local o = "" -- text flag
-local a1, a2, a3, a4, b1, b2, b3, b4 = 0,0,0,1, 0,0,0,1 -- color1, color2
-local f1, f2, f3 = "", 0, "" -- font
-local w1, w2 = 0, 0 -- size
-local p1, p2, p3, x, y = "", "", "", 0, 0 -- path/point args
+local o -- text flag
+local a1, a2, a3, a4, b1, b2, b3, b4 -- color1, color2
+local f1, f2, f3 -- font
+local w1, w2 -- size
+local p1, p2, p3, x, y -- path/point args
 mod.SetBlockAttribute = {}
 local sb = mod.SetBlockAttribute
 local print = B.print('Attribute')
@@ -415,7 +467,7 @@
 end
 
 sb.Spacing = function(region, value)
-  print('FontSpacing', value)
+  print('FontSpacing', region:GetName(), value)
   region:SetSpacing(value)
   region.spacing = value
 end
@@ -446,4 +498,5 @@
 sb.Size = function(region, value)
   w1, w2 = unpack(value)
   region:SetSize(w1, w2)
-end
\ No newline at end of file
+end
+
--- a/ObjectiveTracker.xml	Sat Apr 02 17:46:52 2016 -0400
+++ b/ObjectiveTracker.xml	Mon Apr 04 03:16:22 2016 -0400
@@ -1,33 +1,6 @@
 <Ui>
 
-
-  <Texture name="VnTestLine" virtual="true">
-    <Color r="1" g="1" b="0" a="1" />
-  </Texture>
-
-  <Font name="VeneerTitleFont" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16" >
-    <Color r="1" g=".80" b=".25" a="1" />
-  </Font>
-
-  <Font name="VeneerCriteriaFontNormal" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16">
-    <Color r="1" g="1" b="1" a="1" />
-  </Font>
-  <Font name="VeneerCriteriaFontComplete" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16">
-    <Color r="0" g="1" b="0" a=".75" />
-  </Font>
-  <Font name="VeneerCriteriaFontProgressed" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16">
-    <Color r="1" g="1" b="0" a="1" />
-  </Font>
-
-  <Font name="VeneerCriteriaFontFailed" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="16">
-    <Color r="1" g=".4" b="0" a=".75" />
-  </Font>
-
-  <Font name="VeneerStatusFont" virtual="true" font="Fonts\FRIZQT__.TTF" outline="NORMAL" height="14">
-    <Color r="1" g="1" b="0" a="1" />
-  </Font>
-
-  <Frame name="VeneerObjectiveWrapper" parent="UIParent" movable="true" enableMouse="true">
+  <Frame name="VeneerObjectiveWrapper" parent="UIParent" movable="true" enableMouse="true" frameStrata="LOW">
     <Scripts>
       <OnLoad>
         self.toggle = true
@@ -92,11 +65,6 @@
         </Texture>-->
       </Layer>
       <Layer level="OVERLAY">
-        <FontString name="$parentTitle" parentKey="title" inherits="VeneerStatusFont">
-          <Anchors>
-            <Anchor point="LEFT" />
-          </Anchors>
-        </FontString>
 
         <!--<Texture name="$parentTCR" parentKey="outlineClosed" file="Interface\FrameGeneral\UI-Frame">
           <Size x="40" y="30" />
@@ -111,51 +79,6 @@
     </Layers>
     <Frames>
 
-      <Frame name="$parentXP" parentKey="XPBar" hidden="true">
-        <Size x="250" y="24" />
-        <Anchors>
-          <Anchor point="TOPLEFT" />
-        </Anchors>
-        <Layers>
-          <Layer level="BACKGROUND">
-            <Texture name="$parentBackground" parentKey="statusbg" setAllPoints="true"/>
-          </Layer>
-          <Layer level="ARTWORK">
-
-            <Texture name="$parentForeground" parentKey="foreground">
-              <Anchors>
-                <Anchor point="TOPLEFT" />
-                <Anchor point="BOTTOMLEFT" />
-              </Anchors>
-            </Texture>
-            <Texture name="$parentRested" parentKey="rested" >
-              <Anchors>
-                <Anchor point="TOPLEFT" />
-                <Anchor point="BOTTOMLEFT" />
-              </Anchors>
-            </Texture>
-          </Layer>
-          <Layer level="OVERLAY">
-            <FontString inherits="VeneerFontNormal" parentKey="title">
-              <Anchors>
-                <Anchor point="CENTER" />
-              </Anchors>
-            </FontString>
-          </Layer>
-        </Layers>
-      </Frame>
-
-      <Button name="$parentClose" parentKey="close" inherits="UIPanelCloseButtonNoScripts" enableMouseWheel="true" enableMouse="true">
-
-        <NormalTexture file="Interface\PaperDollInfoFrame\UI-Character-SkillsPageDown-Up" />
-        <PushedTexture file="Interface\PaperDollInfoFrame\UI-Character-SkillsPageDown-Down" />
-        <Anchors>
-          <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT" x="-2" y="2" />
-        </Anchors>
-        <Layers>
-        </Layers>
-      </Button>
-
       <ScrollFrame name="$parentScrollFrame" enableMouseWheel="true" parentKey="scrollArea" parentArray="minimizeFrames">
         <Layers>
           <Layer level="BACKGROUND">
@@ -184,9 +107,77 @@
           -->
         </Frames>
       </ScrollFrame>
+
+      <Frame name="$parentStatusHeader" parentKey="header" frameStrata="MEDIUM">
+        <Layers>
+          <Layer level="OVERLAY">
+            <FontString name="$parentTitle" parentKey="status" inherits="VeneerStatusFont" text="status test" justifyH="RIGHT">
+              <Anchors>
+                <Anchor point="TOPRIGHT" x="-64" y="0" />
+              </Anchors>
+            </FontString>
+          </Layer>
+        </Layers>
+      </Frame>
+
+      <Button name="$parentCloseButton" parentKey="CloseButton" enableMouse="true" frameStrata="MEDIUM">
+        <Size x="16" y="16" />
+        <HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
+        <Anchors>
+          <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" x="-2" y="0" />
+        </Anchors>
+      </Button>
+
+      <Button name="$parentQuestMapButton" parentArray="minimizeFrames" parentKey="QuestMapButton" frameStrata="MEDIUM">
+        <Size x="42" y="16" />
+        <HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
+        <Anchors>
+          <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.CloseButton" x="0" y="0" />
+        </Anchors>
+      </Button>
     </Frames>
   </Frame>
 
+
+
+
+  <Frame name="$parentXP" parent="VeneerObjectiveWrapper" parentKey="XPBar" hidden="true">
+    <Size x="250" y="24" />
+    <Anchors>
+      <Anchor point="TOPLEFT" />
+    </Anchors>
+    <Layers>
+      <Layer level="BACKGROUND">
+        <Texture name="$parentBackground" parentKey="statusbg" setAllPoints="true"/>
+      </Layer>
+      <Layer level="ARTWORK">
+
+        <Texture name="$parentForeground" parentKey="foreground">
+          <Anchors>
+            <Anchor point="TOPLEFT" />
+            <Anchor point="BOTTOMLEFT" />
+          </Anchors>
+        </Texture>
+        <Texture name="$parentRested" parentKey="rested" >
+          <Anchors>
+            <Anchor point="TOPLEFT" />
+            <Anchor point="BOTTOMLEFT" />
+          </Anchors>
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <FontString inherits="VeneerFontNormal" parentKey="title">
+          <Anchors>
+            <Anchor point="CENTER" />
+          </Anchors>
+        </FontString>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <!-- Header Panel -->
+
+  <!-- Background panels -->
   <Frame name="VeneerObjectiveScroll" parent="VeneerObjectiveWrapperScrollFrame">
     <Anchors>
       <Anchor point="TOPLEFT" />
@@ -209,8 +200,8 @@
       <Layer level="BACKGROUND">
         <Texture name="$parentTitleBackground" parentKey="titlebg">
           <Anchors>
-            <Anchor point="TOPLEFT" relativePoint="TOPLEFT" />
-            <Anchor point="RIGHT" relativePoint="RIGHT" />
+            <Anchor point="TOPLEFT" />
+            <Anchor point="RIGHT" />
           </Anchors>
           <Color r="1" g="1" b="1" a="1" />
           <Gradient orientation="HORIZONTAL">
@@ -220,9 +211,20 @@
         </Texture>
       </Layer>
       <Layer level="OVERLAY">
-        <FontString name="$parentTitle" inherits="VeneerFontHighlight" text="OBJ" parentKey="title">
+        <FontString name="$parentTitle" inherits="VeneerFontHighlight" text="OBJ" parentKey="title" justifyH="LEFT">
           <Anchors>
-            <Anchor point="TOPLEFT" />
+            <Anchor point="TOP" relativeKey="$parent.titlebg" />
+            <Anchor point="BOTTOM" relativeKey="$parent.titlebg"  />
+            <Anchor point="LEFT" relativeKey="$parent.titlebg" />
+            <Anchor point="RIGHT" relativeKey="$parent" />
+          </Anchors>
+        </FontString>
+        <FontString name="$parentStatus" inherits="VeneerStatusFont" parentKey="status" justifyH="RIGHT">
+          <Anchors>
+            <Anchor point="TOP" relativeKey="$parent.titlebg" />
+            <Anchor point="BOTTOM" relativeKey="$parent.titlebg"  />
+            <Anchor point="LEFT" relativeKey="$parent.titlebg" />
+            <Anchor point="RIGHT" relativeKey="$parent" />
           </Anchors>
         </FontString>
       </Layer>
@@ -297,7 +299,6 @@
         <FontString name="$parentStatus" parentKey="status" inherits="VeneerCriteriaFontNormal" justifyH="LEFT" justifyV="MIDDLE" wordwrap="true">
           <Anchors>
             <Anchor point="TOP" relativeKey="$parent.statusbg" />
-            <Anchor point="BOTTOM" relativeKey="$parent.statusbg"  />
             <Anchor point="LEFT"  relativeKey="$parent.statusbg" />
             <Anchor point="RIGHT" relativeKey="$parent.statusbg" />
           </Anchors>
--- a/ObjectiveUI.lua	Sat Apr 02 17:46:52 2016 -0400
+++ b/ObjectiveUI.lua	Mon Apr 04 03:16:22 2016 -0400
@@ -24,10 +24,10 @@
 end
 
 Tracker.OnMouseUp = function(self, button)
+  print(self.handler.name, self.mainStyle, self.subStyle)
   if button == 'LeftButton' then
     if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then
       self:Link()
-      self:SetStyle('TrackerBlock',  self.info.type, 'Normal')
     elseif IsModifiedClick("QUESTWATCHTOGGLE") then
       self:Remove()
     else
@@ -35,16 +35,16 @@
     end
   elseif button == 'RightButton' then
     self:Open()
-    self:SetStyle('TrackerBlock',  self.info.type, 'Normal')
   end
   self.initialButton = nil
   self.modChatLink = nil
   self.modQuestWatch = nil
+  self:SetStyle('TrackerBlock',  self.handler.name, self.mainStyle, self.subStyle)
   print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r')
 end
 
 Tracker.OnMouseDown = function(self, button)
-  self:SetStyle('TrackerBlock', 'MouseDown')
+  self:SetStyle('TrackerBlock', self.handler.name, 'MouseDown')
   print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE"))
   print(self.info.title)
 end
--- a/ObjectiveWidgets.lua	Sat Apr 02 17:46:52 2016 -0400
+++ b/ObjectiveWidgets.lua	Mon Apr 04 03:16:22 2016 -0400
@@ -5,6 +5,122 @@
 local GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown = GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown
 local CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll = CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll
 local tremove, tinsert, tContains, pairs, setmetatable = tremove, tinsert, tContains, pairs, setmetatable
+
+--- frame refs
+local Wrapper = _G.VeneerObjectiveWrapper
+local Scroller = Wrapper.scrollArea
+local CloseButton = Wrapper.CloseButton
+local QuestMapButton = Wrapper.QuestMapButton
+local Scroll = _G.VeneerObjectiveScroll
+
+local panelButtons = {
+  CloseButton = {
+    closedSwatch = {
+      [[Interface\Buttons\UI-Panel-QuestHideButton]],
+      [[Interface\Buttons\UI-Panel-QuestHideButton]],
+      0, 0.5, 0.5, 1,
+      0.5, 1, 0.5, 1,
+    },
+    openSwatch = {
+      [[Interface\Buttons\UI-Panel-QuestHideButton]],
+      [[Interface\Buttons\UI-Panel-QuestHideButton]],
+      0.5, 1, 0.5, 1,
+      0, 0.5, 0.5, 1,
+    },
+    parent = 'VeneerObjectiveWrapper'
+  },
+  QuestMapButton = {
+    closedSwatch = {
+      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
+      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
+      0, 1, 0.5, 1,
+      0, 1, 0, 0.5,
+    },
+    openSwatch = {
+      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
+      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
+      0, 1, 0, 0.5,
+      0, 1, 0.5, 1,
+    }
+  }
+}
+
+local Scroller_OnShow = function()
+  Wrapper.watchMoneyReasons = 0;
+  mod.UpdateWrapper()
+  mod.SetEvents()
+  for i, region in ipairs(Wrapper.headerComplex) do
+    region:Show()
+  end
+end
+
+local Scroller_OnHide = function()
+  local self = Wrapper
+  Wrapper:UnregisterAllEvents()
+  Wrapper:SetScript('OnEvent', nil)
+  for i, region in ipairs(Wrapper.headerComplex) do
+    region:Hide()
+  end
+end
+
+local Scroller_OnMouseWheel = function(self, delta)
+  local r = Scroll:GetHeight() - Scroller:GetHeight()
+  local s = B.Conf.ObjectiveScroll - delta * floor(r/5+.5)
+  local from = self:GetVerticalScroll()
+  if s >= r then
+    s = r
+  elseif s < 1 then
+    s = 0
+  end
+  self:SetVerticalScroll(s)
+  B.Conf.ObjectiveScroll = s
+  print('|cFF00FF00OnMouseWheel', 'from = ', from, 'scroll =', s, ' range =', r, 'current =', self:GetVerticalScroll())
+
+  mod.UpdateActionButtons('SCROLLING')
+end
+
+local UpdatePanelButton = function (self, state)
+  state = state and B.Conf.FrameState[state] or 1
+  local swatch = (state == 1) and self.openSwatch or self.closedSwatch
+  self:SetNormalTexture(swatch[1])
+  self:SetPushedTexture(swatch[2])
+  if #swatch >= 6 then
+    self:GetNormalTexture():SetTexCoord(swatch[3], swatch[4], swatch[5], swatch[6])
+  end
+  if #swatch == 10 then
+    self:GetPushedTexture():SetTexCoord(swatch[7], swatch[8], swatch[9], swatch[10])
+  end
+
+end
+
+local OnClick = {}
+OnClick.CloseButton = function(self)
+  Wrapper:Minimize()
+  UpdatePanelButton(self, self.parent)
+end
+
+OnClick.QuestMapButton = function()
+  ToggleWorldMap()
+end
+
+mod.InitializeWrapperWidgets = function()
+  --- tracker scroll
+  Scroller:SetScript('OnMouseWheel', Scroller_OnMouseWheel)
+  Scroller:SetScript('OnShow', Scroller_OnShow)
+  Scroller:SetScript('OnHide', Scroller_OnHide)
+  for name, swatch in pairs(panelButtons) do
+    local source = swatch and swatch or panelButtons.CloseButton
+    local button = Wrapper[name]
+    button.parent = swatch.parent
+    button.openSwatch = source.openSwatch
+    button.closedSwatch = source.closedSwatch
+    if OnClick[name] then
+      button:SetScript('OnClick', OnClick[name])
+    end
+    UpdatePanelButton(button, button.parent)
+  end
+end
+
 ----------------------------------------------------------------------------------------
 --- XML and script code lifted from "QuestKing 2" by Barjack,
 ---   found at http://mods.curse.com/addons/wow/questking
@@ -152,13 +268,13 @@
 
 --- Get a usable widget for the given achievement criteria set.
 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block
-mod.SetWidget = function(obj, info)
+mod.SetWidget = function(line, info, objectiveType, objectiveKey)
   local print = B.print('ObjectiveWidgets')
-  local widgetType = obj.type
+  local widgetType = objectiveType
   local widget
-  if wr[widgetType] and wr[widgetType].used[obj.criteriaID] then
-    widget = wr[widgetType].used[obj.criteriaID]
-    print('|cFF00FF00Updating ('..obj.criteriaID..')', widget)
+  if wr[widgetType] and wr[widgetType].used[objectiveKey] then
+    widget = wr[widgetType].used[objectiveKey]
+    print('|cFF00FF00Updating ('..objectiveKey..')', widget)
   elseif not wr[widgetType] or #wr[widgetType].free == 0 then
     widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType)
 
@@ -168,9 +284,11 @@
     print('|cFFFFFF00Acquiring released widget', widget:GetName())
   end
 
-  wr[widgetType].used[obj.criteriaID] = widget
-  widget.info = obj
-  widget.parentInfo = info
+
+  wr[widgetType].used[objectiveKey] = widget
+  widget.line = line
+  widget.info = info
+  widget.key = objectiveKey
   mod.InitializeWidget(widget)
   return widget
 end
@@ -195,7 +313,6 @@
     local maxWidth = 250
 
     frame:SetWidth(maxWidth)
-    mod.UpdateWidget[frame.widgetType](frame)
     frame:SetScript('OnEvent', mod.UpdateWidget[frame.widgetType])
     if frame.info.isCurrency then
       frame:RegisterEvent('CHAT_MSG_CURRENCY')
@@ -206,8 +323,8 @@
     frame:RegisterEvent('CRITERIA_UPDATE')
     frame:RegisterEvent('CRITERIA_COMPLETE')
     frame:RegisterEvent('CRITERIA_EARNED')
-
-    return t[frame.widgetType](frame)
+    t[frame.widgetType](frame)
+    mod.UpdateWidget[frame.widgetType](frame)
   end,
 })
 
@@ -227,10 +344,10 @@
 mod.ReleaseWidget = function(frame)
   local print = B.print('ObjectiveWidgets')
   local reg = wr[frame.widgetType]
-  if reg and reg.used[frame.info.criteriaID] then
-    reg.used[frame.info.criteriaID] = nil
+  if reg and reg.used[frame.key] then
+    reg.used[frame.key] = nil
+    frame.line = nil
     frame.info = nil
-    frame.parentInfo = nil
     frame:UnregisterAllEvents()
     tinsert(reg.free, frame)
     print('|cFFBBBBBBreleased from service', frame:GetName())
@@ -241,23 +358,30 @@
 mod.CleanWidgets = function()
   local print = B.print('ObjectiveWidgets')
   local tracked = {GetTrackedAchievements() }
+  local tasks = GetTasksTable()
   for type, reg in pairs(mod.WidgetRegistry) do
     print('collecting', type)
-    for criteriaID, frame in pairs(reg.used) do
-      local id = frame.info.cheevID
+    for key, frame in pairs(reg.used) do
+      if frame.info.cheevID then
+        local id = frame.info.cheevID
 
-      if id and not tContains(tracked, id) then
+        if id and not tContains(tracked, id) then
 
-        print('  untracked achievement', id, 'associated with', criteriaID, frame:GetName())
-        frame:Hide()
+          print('  untracked achievement', id, 'associated with', key, frame:GetName())
+          frame:Hide()
+        end
+      elseif frame.info.questID then
+        -- do something for quest task
       end
     end
   end
 end
 
 
-mod.defaults.WidgetVars = {
+
+mod.defaults.WidgetStyle = {
   ProgressBar = {
+    Spacing = 4,
     bg = {
       Height = 20,
     },
@@ -265,33 +389,42 @@
       Height = 16,
     },
     status = {
-      FontObject = _G.VeneerFontNormal
+      FontObject = _G.VeneerCriteriaFontNormal
     }
   }
 }
 mod.InitializeWidget.ProgressBar = function(self)
-  local c = mod.defaults.WidgetVars.ProgressBar
-  local params = mod.WidgetParams[self.widgetType]
-  self.height = params.height
+  local c = mod.defaults.WidgetStyle.ProgressBar
+  self.height = c.bg.Height + c.Spacing
   self:SetHeight(c.bg.Height)
   self.bg:SetHeight(c.bg.Height)
   self.fg:ClearAllPoints()
-  self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', 2, 2)
+  self.indent = (c.bg.Height - c.fg.Height) / 2
+  self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', self.indent, self.indent)
   self.fg:SetHeight(c.fg.Height)
   self.status:SetFontObject(c.status.FontObject)
   self.status:SetText(self.info.quantityString)
 end
 
 mod.UpdateWidget.ProgressBar = function (self)
-  local quantity, requiredQuantity = self.info.quantity, self.info.requiredQuantity
+  local quantity, requiredQuantity = self.line.value, self.line.maxValue
+  print('update vals:')
+  for k,v in pairs(self.line) do
+    print(k, v)
+  end
 
-  if self.info.finished then
-    self.fg:SetWidth(self.bg:GetWidth() - 4)
+  if self.line.format then
+    self.status:SetFormattedText(self.line.format, self.line.value, self.line.maxValue)
+  end
+
+
+  if self.line.finished then
+    self.fg:SetWidth(self.bg:GetWidth() - self.indent)
   elseif quantity == 0 then
     self.fg:Hide()
   else
     self.fg:Show()
-    self.fg:SetWidth((self.bg:GetWidth()-4) * (quantity / requiredQuantity))
+    self.fg:SetWidth((self.bg:GetWidth() -self.indent) * (quantity / requiredQuantity))
   end
 end
 
--- a/ObjectiveWidgets.xml	Sat Apr 02 17:46:52 2016 -0400
+++ b/ObjectiveWidgets.xml	Mon Apr 04 03:16:22 2016 -0400
@@ -19,7 +19,7 @@
       </OnEvent>
     </Scripts>
     <Layers>
-      <Layer level="BACKGROUND">
+      <Layer level="BORDER">
         <Texture name="$parentBackground" parentKey="bg">
           <Color r="0" g="0" b="0" a="0.70" />
           <Anchors>
@@ -31,11 +31,17 @@
       <Layer level="ARTWORK">
 
         <Texture name="$parentForeground" parentKey="fg">
-          <Color r="1" g="1" b="1" a="1" />
+          <Color r="1" g="1" b="1" a="0.7" />
+        </Texture>
+        <Texture name="$parentIcon" parentKey="icon" alphaMode="MOD">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.fg" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.fg" />
+          </Anchors>
         </Texture>
       </Layer>
       <Layer level="OVERLAY">
-        <FontString name="$parentQuantityString" parentKey="quantityString" inherits="VeneerCriteriaFont">
+        <FontString name="$parentStatus" parentKey="status" inherits="VeneerCriteriaFont">
           <Anchors>
             <Anchor point="CENTER" />
           </Anchors>