Checklist keybind, Fixing research finishing chat announcement, update checklist icons on quest add, update, log in and reloadui, checklist scale, upward/downward, names/icons, hidding when all done

Leandro Silva [10-30-18 - 12:15]
Checklist keybind, Fixing research finishing chat announcement, update checklist icons on quest add, update, log in and reloadui, checklist scale, upward/downward, names/icons, hidding when all done
Filename
Bindings.xml
Lang/de.lua
Lang/en.lua
Lang/fr.lua
Lang/jp.lua
LeoAltholic.lua
LeoAltholic.txt
LeoAltholic.xml
LeoAltholicInit.lua
Settings.lua
ui/checklist.lua
diff --git a/Bindings.xml b/Bindings.xml
index d435ba7..74323fc 100644
--- a/Bindings.xml
+++ b/Bindings.xml
@@ -4,6 +4,9 @@
       <Action name="LEOALTHOLIC_TOGGLE_WINDOW">
         <Down>LeoAltholic:ToggleUI()</Down>
       </Action>
+      <Action name="LEOALTHOLIC_TOGGLE_CHECKLIST">
+        <Down>LeoAltholicChecklistUI.ToggleUI()</Down>
+      </Action>
       <Action name="LEOALTHOLIC_TRACK_QUEST">
         <Down>LeoAltholic.trackQuest(QUEST_JOURNAL_MANAGER:GetFocusedQuestIndex())</Down>
       </Action>
diff --git a/Lang/de.lua b/Lang/de.lua
index f461bb4..3cf9b62 100644
--- a/Lang/de.lua
+++ b/Lang/de.lua
@@ -24,6 +24,7 @@ ZO_CreateStringId("LEOALT_MAXIMUM", "Maximum")
 ZO_CreateStringId("LEOALT_RECOVERY",  "Wiederherst.")

 ZO_CreateStringId("LEOALT_WRIT", "schrieb")
+ZO_CreateStringId("LEOALT_DELIVER", "Beliefert")
 ZO_CreateStringId("LEOALT_ALCHEMIST", "Alchemisten")
 ZO_CreateStringId("LEOALT_BLACKSMITH", "Schmiede")
 ZO_CreateStringId("LEOALT_CLOTHIER", "Schneider")
@@ -39,9 +40,12 @@ ZO_CreateStringId("LEOALT_MAIL_ENCHANTER", "Verzauberermaterial")
 ZO_CreateStringId("LEOALT_MAIL_PROVISIONER", "Versorgerzutaten")

 ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TOGGLE_WINDOW', "Zeige/Verstecke Haupt Fenster")
+ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TOGGLE_CHECKLIST', "Zeige/Verstecke Checkliste")
 ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TRACK_QUEST', "Verfolge tägliche Quest")

 ZO_CreateStringId("LEOALT_CHECKLIST", "Checkliste")
+ZO_CreateStringId("LEOALT_CHECKLIST_UPWARDS", "Neue Anzeigen oben anfügen")
 ZO_CreateStringId("LEOALT_TOOLBAR", "Toolbar")
 ZO_CreateStringId("LEOALT_BUMP_COMPASS", "Bump Game Compass down")
 ZO_CreateStringId("LEOALT_ACCOUNT_CONFIGURATION", "Accountweite Einstellung")
+ZO_CreateStringId("LEOALT_CHAR_CONFIGURATION", "Charakter spezifisch")
diff --git a/Lang/en.lua b/Lang/en.lua
index 54fe05d..80fb885 100644
--- a/Lang/en.lua
+++ b/Lang/en.lua
@@ -24,6 +24,7 @@ ZO_CreateStringId("LEOALT_MAXIMUM", "Maximum")
 ZO_CreateStringId("LEOALT_RECOVERY", "Recovery")

 ZO_CreateStringId("LEOALT_WRIT", "Writ")
+ZO_CreateStringId("LEOALT_DELIVER", "Deliver")
 ZO_CreateStringId("LEOALT_ALCHEMIST", "Alchemist")
 ZO_CreateStringId("LEOALT_BLACKSMITH", "Blacksmith")
 ZO_CreateStringId("LEOALT_CLOTHIER", "Clothier")
@@ -39,9 +40,12 @@ ZO_CreateStringId("LEOALT_MAIL_ENCHANTER", "Raw Enchanter Materials")
 ZO_CreateStringId("LEOALT_MAIL_PROVISIONER", "Raw Provisioner Materials")

 ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TOGGLE_WINDOW', "Show/Hide Main Window")
+ZO_CreateStringId("SI_BINDING_NAME_LEOALTHOLIC_TOGGLE_CHECKLIST", "Show/Hide Checklist")
 ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TRACK_QUEST', "Track Daily Quest")

 ZO_CreateStringId("LEOALT_CHECKLIST", "Checklist")
+ZO_CreateStringId("LEOALT_CHECKLIST_UPWARDS", "Add Frames Upwards")
 ZO_CreateStringId("LEOALT_TOOLBAR", "Toolbar")
 ZO_CreateStringId("LEOALT_BUMP_COMPASS", "Bump Game Compass down")
 ZO_CreateStringId("LEOALT_ACCOUNT_CONFIGURATION", "Account Wide Configuration")
+ZO_CreateStringId("LEOALT_CHAR_CONFIGURATION", "Character Specific")
diff --git a/Lang/fr.lua b/Lang/fr.lua
index 2678e74..c27c79d 100644
--- a/Lang/fr.lua
+++ b/Lang/fr.lua
@@ -24,6 +24,7 @@ ZO_CreateStringId("LEOALT_MAXIMUM", "Maximum")
 ZO_CreateStringId("LEOALT_RECOVERY", "Recovery")

 ZO_CreateStringId("LEOALT_WRIT", "Commande")
+ZO_CreateStringId("LEOALT_DELIVER", "Livrez")
 ZO_CreateStringId("LEOALT_ALCHEMIST", "d'alchimie")
 ZO_CreateStringId("LEOALT_BLACKSMITH", "forge")
 ZO_CreateStringId("LEOALT_CLOTHIER", "tailleur")
@@ -39,9 +40,12 @@ ZO_CreateStringId("LEOALT_MAIL_ENCHANTER", "Matériaux bruts d'enchantement")
 ZO_CreateStringId("LEOALT_MAIL_PROVISIONER", "Matériaux bruts de cuisine")

 ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TOGGLE_WINDOW', "Show/Hide Main Window")
+ZO_CreateStringId("SI_BINDING_NAME_LEOALTHOLIC_TOGGLE_CHECKLIST", "Show/Hide Checklist")
 ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TRACK_QUEST', "Track Daily Quest")

 ZO_CreateStringId("LEOALT_CHECKLIST", "Liste de contrôle")
+ZO_CreateStringId("LEOALT_CHECKLIST_UPWARDS", "Add Frames Upwards")
 ZO_CreateStringId("LEOALT_TOOLBAR", "Toolbar")
 ZO_CreateStringId("LEOALT_BUMP_COMPASS", "Bump Game Compass down")
 ZO_CreateStringId("LEOALT_ACCOUNT_CONFIGURATION", "Account Wide Configuration")
+ZO_CreateStringId("LEOALT_CHAR_CONFIGURATION", "Character Specific")
diff --git a/Lang/jp.lua b/Lang/jp.lua
index 037b775..425d753 100644
--- a/Lang/jp.lua
+++ b/Lang/jp.lua
@@ -24,6 +24,7 @@ ZO_CreateStringId("LEOALT_MAXIMUM", "最大")
 ZO_CreateStringId("LEOALT_RECOVERY", "回復")

 ZO_CreateStringId("LEOALT_WRIT", "依頼を調べる")
+ZO_CreateStringId("LEOALT_DELIVER", "Deliver")
 ZO_CreateStringId("LEOALT_ALCHEMIST", "錬金術")
 ZO_CreateStringId("LEOALT_BLACKSMITH", "鍛冶")
 ZO_CreateStringId("LEOALT_CLOTHIER", "仕立")
@@ -39,9 +40,12 @@ ZO_CreateStringId("LEOALT_MAIL_ENCHANTER", "付呪師用素材")
 ZO_CreateStringId("LEOALT_MAIL_PROVISIONER", "調理師用素材")

 ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TOGGLE_WINDOW', "表示/非表示 メイン 画面")
+ZO_CreateStringId("SI_BINDING_NAME_LEOALTHOLIC_TOGGLE_CHECKLIST", "表示/非表示 チェックリスト")
 ZO_CreateStringId('SI_BINDING_NAME_LEOALTHOLIC_TRACK_QUEST', "デイリークエストを追跡")

 ZO_CreateStringId("LEOALT_CHECKLIST", "チェックリスト")
+ZO_CreateStringId("LEOALT_CHECKLIST_UPWARDS", "挑発バーを上方向に追加")
 ZO_CreateStringId("LEOALT_TOOLBAR", "Toolbar")
 ZO_CreateStringId("LEOALT_BUMP_COMPASS", "Bump Game Compass down")
 ZO_CreateStringId("LEOALT_ACCOUNT_CONFIGURATION", "Account Wide Configuration")
+ZO_CreateStringId("LEOALT_CHAR_CONFIGURATION", "Character Specific")
diff --git a/LeoAltholic.lua b/LeoAltholic.lua
index 9fd204c..de55e86 100644
--- a/LeoAltholic.lua
+++ b/LeoAltholic.lua
@@ -660,7 +660,7 @@ local function createMessageQueue()
                 }
                 LeoAltholic.AddToQueue(data)
             end
-            for _, craft in pairs(char.research.doing) do
+            for _, craft in pairs(LeoAltholic.craftResearch) do
                 if char.research.doing[craft] then
                     for _, research in pairs(char.research.doing[craft]) do
                         local lineName, lineIcon = GetSmithingResearchLineInfo(research.craft, research.line)
@@ -674,7 +674,7 @@ local function createMessageQueue()
                                     GetString('SI_ITEMTRAITTYPE',traitType),
                                     lineName
                             ),
-                            time = research..time
+                            time = research.time
                         }
                         LeoAltholic.AddToQueue(data)
                     end
@@ -708,8 +708,8 @@ local function onUpdate()

     processQueue()

-    LeoAltholicChecklistUI:checkReset()
-    LeoAltholicToolbarUI:update()
+    LeoAltholicChecklistUI.checkReset()
+    --LeoAltholicToolbarUI:update()

     LeoAltholic.numUpdates = LeoAltholic.numUpdates + 1

@@ -732,7 +732,7 @@ local function onUpdate()
     --[[
     if LeoAltholic.numUpdates >= 30 then -- 60 seconds
         LeoAltholic.numUpdates = 1
-        LeoAltholicChecklistUI:update()
+        LeoAltholicChecklistUI.update()
         For reference only!!
         LeoAltholicUI.bioList:RefreshData()
         LeoAltholicUI.statsList:RefreshData()
@@ -789,31 +789,72 @@ function LeoAltholic.trackQuest(questId)
     trackQuest(questId)
 end

-local function onQuestAdded(eventCode, journalIndex, questName, objectiveName)
-    local quest = createQuestEntry(journalIndex)
+local function onQuestAdded(eventCode, journalQuestIndex, questName, objectiveName)
+    local quest = createQuestEntry(journalQuestIndex)
     if quest.isDaily == false then return end
     if LeoAltholic.globalData.settings.tracked.allDaily == true or
             (quest.questType == QUEST_TYPE_CRAFTING and LeoAltholic.globalData.settings.tracked.dailyWrits == true) then
-        trackQuest(journalIndex, true)
+        trackQuest(journalQuestIndex, true)
     end
-end

-local function onQuestCounterChanged(eventId, questIndex, questName, conditionText, conditionType, currConditionVal, newConditionVal, conditionMax, isFailCondition, stepOverrideText, isPushed, isComplete, isConditionComplete, isStepHidden)
     for i,trackedQuest in pairs(LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs) do
         if (trackedQuest.name == questName) then
             LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastStarted = GetTimeStamp()
-            LeoAltholicChecklistUI:startedWrit(trackedQuest.craft)
+            LeoAltholicChecklistUI.startedWrit(trackedQuest.craft)
+
+            local numConditions = GetJournalQuestNumConditions(journalQuestIndex, QUEST_MAIN_STEP_INDEX)
+            local hasUpdated = false
+            for condition = 1, numConditions do
+                local current, max =  GetJournalQuestConditionValues(journalQuestIndex, QUEST_MAIN_STEP_INDEX, condition)
+                if hasUpdated == false and current > 0 then
+                    hasUpdated = true
+                end
+                local condText = GetJournalQuestConditionInfo(journalQuestIndex, QUEST_MAIN_STEP_INDEX, condition)
+                if string.find(condText, GetString(LEOALT_DELIVER)) then
+                    LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastPreDeliver = GetTimeStamp()
+                    LeoAltholicChecklistUI.preDeliverWrit(trackedQuest.craft)
+                    return
+                end
+            end
+            if hasUpdated then
+                LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastUpdated = GetTimeStamp()
+                LeoAltholicChecklistUI.updateWrit(trackedQuest.craft)
+            end
+            return
+        end
+    end
+end
+
+local function onQuestCounterChanged(eventCode, journalQuestIndex, questName, conditionText, conditionType, currConditionVal, newConditionVal, conditionMax, isFailCondition, stepOverrideText, isPushed, isComplete, isConditionComplete, isStepHidden)
+    for i,trackedQuest in pairs(LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs) do
+        if (trackedQuest.name == questName) then
+            LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastUpdated = GetTimeStamp()
+            LeoAltholicChecklistUI.updateWrit(trackedQuest.craft)
+
+            local numConditions = GetJournalQuestNumConditions(journalQuestIndex, QUEST_MAIN_STEP_INDEX)
+            for condition = 1, numConditions do
+                local cur, max =  GetJournalQuestConditionValues(journalQuestIndex, QUEST_MAIN_STEP_INDEX, condition)
+                local condText = GetJournalQuestConditionInfo(journalQuestIndex, QUEST_MAIN_STEP_INDEX, condition)
+                if string.find(condText, GetString(LEOALT_DELIVER)) then
+                    LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastPreDeliver = GetTimeStamp()
+                    LeoAltholicChecklistUI.preDeliverWrit(trackedQuest.craft)
+                    return
+                end
+            end
+
             return
         end
     end
 end

-local function onQuestRemoved(eventId, isCompleted, journalIndex, questName, zoneIndex, poiIndex)
+local function onQuestRemoved(eventCode, isCompleted, journalQuestIndex, questName, zoneIndex, poiIndex)
     if not isCompleted then
         for i,trackedQuest in pairs(LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs) do
             if (trackedQuest.name == questName) then
                 LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastStarted = nil
-                LeoAltholicChecklistUI:stoppedWrit(trackedQuest.craft)
+                LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastPreDeliver = nil
+                LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastUpdated = nil
+                LeoAltholicChecklistUI.stoppedWrit(trackedQuest.craft)
                 return
             end
         end
@@ -826,7 +867,7 @@ local function onQuestComplete(eventCode, questName, level, previousExperience,
             LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastDone = GetTimeStamp()
             LeoAltholic.log(zo_strformat(GetString(LEOALT_QUEST_DONE_TODAY), questName))
             LeoAltholicUI.writsList:RefreshData()
-            LeoAltholicChecklistUI:doneWrit(trackedQuest.craft)
+            LeoAltholicChecklistUI.doneWrit(trackedQuest.craft)
             return
         end
     end
@@ -872,6 +913,7 @@ local function initializeVars()
         settings = {
             checklist = {
                 enabled = true,
+                hidden = false,
                 craft = {},
                 riding = true
             }
@@ -899,9 +941,16 @@ local function initializeVars()
             },
             toolbar = {
                 enabled = false
+            },
+            checklist = {
+                fontScale = 100,
+                upwards = false
             }
         }
     end
+
+    LeoAltholicChecklistUI.normalizeSettings()
+
     if not LeoAltholic.globalData.dataVersion or LeoAltholic.globalData.dataVersion < 2 then
         migrateDataToV2()
         LeoAltholic.globalData.dataVersion = 2
@@ -928,7 +977,7 @@ local function initialize()
     LeoAltholic.feedback = feedbackWindow

     LeoAltholic.RestorePosition()
-    LeoAltholicToolbarUI.RestorePosition()
+    --LeoAltholicToolbarUI.RestorePosition()
     LeoAltholicChecklistUI.RestorePosition()

     LeoAltholicUI.InitPanels()
@@ -977,10 +1026,9 @@ local function initialize()

     LeoAltholic.initialized = true
     CALLBACK_MANAGER:FireCallbacks("LeoAltholicInitialized")
-    if LeoAltholic.globalData.settings.toolbar.enabled == true then
-        LeoAltholicToolbarUI:update()
-    end
-    LeoAltholicChecklistUI:update()
+    --LeoAltholicToolbarUI:update()
+    LeoAltholicChecklistUI.updateQuests()
+    LeoAltholicChecklistUI.update()
 end

 local orig_ZO_QuestJournalNavigationEntry_OnMouseUp = ZO_QuestJournalNavigationEntry_OnMouseUp
@@ -1027,7 +1075,7 @@ local function onRidingSkillImprovement(ridingSkill, previous, current, source)
         speedMax = riding[6],
         time = ridetime
     }
-    LeoAltholicChecklistUI:doneRiding()
+    LeoAltholicChecklistUI.doneRiding()
 end

 local function onAddOnLoaded(event, addonName)
diff --git a/LeoAltholic.txt b/LeoAltholic.txt
index 6c22ef1..8dc9a2e 100644
--- a/LeoAltholic.txt
+++ b/LeoAltholic.txt
@@ -1,6 +1,6 @@
 ## Title: Leo's Altholic
 ## APIVersion: 100024 100025
-## Version: 1.4.1
+## Version: 1.4.2
 ## Author: |c39B027@LeandroSilva|r
 ## SavedVariables: LeoAltholicSavedVariables LeoAltholicCharVariables
 ## OptionalDependsOn: LibStub LibFeedback LibAddonMenu-2.0
diff --git a/LeoAltholic.xml b/LeoAltholic.xml
index 97a2d69..d3ae14e 100644
--- a/LeoAltholic.xml
+++ b/LeoAltholic.xml
@@ -1909,13 +1909,13 @@
         </TopLevelControl>

         <TopLevelControl name="LeoAltholicChecklist" mouseEnabled="true" movable="true" hidden="false" clampedToScreen="true">
-            <Dimensions x="250" y="50" />
+            <Dimensions x="200" y="50" />
             <Anchor point="TOPLEFT" relativeTo="GuiRoot" relativePoint="TOPLEFT" offsetX="100" offsetY="100" />
-            <OnMoveStop> LeoAltholicChecklistUI:OnWindowMoveStop() </OnMoveStop>
+            <OnMoveStop> LeoAltholicChecklistUI.OnWindowMoveStop() </OnMoveStop>
             <Controls>
-                <Backdrop name="$(parent)BGHeader" mouseEnabled="true" centerColor="000000" edgeColor="222222" alpha="0.6">
+                <Backdrop name="$(parent)BGHeader" mouseEnabled="false" centerColor="000000" edgeColor="222222" alpha="0.6">
                     <Anchor point="TOPLEFT" relativePoint="TOPLEFT" relativeTo="$(parent)"/>
-                    <Dimensions x="250" y="40"/>
+                    <Dimensions x="200" y="40"/>
                     <Edge edgeSize="1"/>
                 </Backdrop>
                 <Label name="$(parent)Header" color="39B027" font="LeoAltholicLargeFont" verticalAlignment="CENTER" inheritAlpha="false">
@@ -1945,70 +1945,140 @@
                 </Button>

                 <Backdrop name="$(parent)Panel" centerColor="000000" edgeColor="222222" alpha="0.3" hidden="false">
-                    <Dimensions x="250" y="10"/>
+                    <Dimensions x="200" y="10"/>
                     <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="40"/>
                     <Edge edgeSize="1"/>
                     <Controls>
-                        <Texture name="$(parent)Craft1Status" hidden="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
+                        <Texture name="$(parent)Craft1Status" hidden="true" mouseEnabled="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
                             <Dimensions x="28" y="28"/>
                             <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="10" offsetY="44"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, RIGHT, self.tooltip) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
+                        </Texture>
+                        <Texture name="$(parent)Craft1Icon" hidden="true" mouseEnabled="true" inheritAlpha="false" color="FFFFFF" textureFile="/esoui/art/icons/servicetooltipicons/gamepad/gp_servicetooltipicon_weaponsmithingstation.dds">
+                            <Dimensions x="36" y="36"/>
+                            <Anchor point="TOPLEFT" relativeTo="$(parent)Craft1Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, TOP, GetString(SI_ITEMFILTERTYPE13)) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
                         </Texture>
                         <Label name="$(parent)Craft1" hidden="true" font="LeoAltholicLargeFont" color="FFFFFF" verticalAlignment="CENTER" inheritAlpha="false">
                             <Dimensions x="200" y="32" />
                             <Anchor point="TOPLEFT" relativeTo="$(parent)Craft1Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
                         </Label>
-                        <Texture name="$(parent)Craft2Status" hidden="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
+
+                        <Texture name="$(parent)Craft2Status" hidden="true" mouseEnabled="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
                             <Dimensions x="28" y="28"/>
                             <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="10" offsetY="44"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, RIGHT, self.tooltip) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
+                        </Texture>
+                        <Texture name="$(parent)Craft2Icon" hidden="true" mouseEnabled="true" inheritAlpha="false" color="FFFFFF" textureFile="/esoui/art/icons/servicetooltipicons/gamepad/gp_servicetooltipicon_armorsmithingstation.dds">
+                            <Dimensions x="36" y="36"/>
+                            <Anchor point="TOPLEFT" relativeTo="$(parent)Craft2Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, TOP, GetString(SI_ITEMFILTERTYPE14)) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
                         </Texture>
                         <Label name="$(parent)Craft2" hidden="true" font="LeoAltholicLargeFont" color="FFFFFF" verticalAlignment="CENTER" inheritAlpha="false">
                             <Dimensions x="200" y="32" />
                             <Anchor point="TOPLEFT" relativeTo="$(parent)Craft2Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
                         </Label>
-                        <Texture name="$(parent)Craft3Status" hidden="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
+
+                        <Texture name="$(parent)Craft3Status" hidden="true" mouseEnabled="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
                             <Dimensions x="28" y="28"/>
                             <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="10" offsetY="44"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, RIGHT, self.tooltip) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
+                        </Texture>
+                        <Texture name="$(parent)Craft3Icon" hidden="true" mouseEnabled="true" inheritAlpha="false" color="FFFFFF" textureFile="/esoui/art/icons/servicetooltipicons/gamepad/gp_servicetooltipicon_enchantingstation.dds">
+                            <Dimensions x="36" y="36"/>
+                            <Anchor point="TOPLEFT" relativeTo="$(parent)Craft3Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, TOP, GetString(SI_ITEMFILTERTYPE17)) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
                         </Texture>
                         <Label name="$(parent)Craft3" hidden="true" font="LeoAltholicLargeFont" color="FFFFFF" verticalAlignment="CENTER" inheritAlpha="false">
                             <Dimensions x="200" y="32" />
                             <Anchor point="TOPLEFT" relativeTo="$(parent)Craft3Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
                         </Label>
-                        <Texture name="$(parent)Craft4Status" hidden="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
+
+                        <Texture name="$(parent)Craft4Status" hidden="true" mouseEnabled="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
                             <Dimensions x="28" y="28"/>
                             <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="10" offsetY="44"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, RIGHT, self.tooltip) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
+                        </Texture>
+                        <Texture name="$(parent)Craft4Icon" hidden="true" mouseEnabled="true" inheritAlpha="false" color="FFFFFF" textureFile="/esoui/art/icons/servicetooltipicons/gamepad/gp_servicetooltipicon_alchemystation.dds">
+                            <Dimensions x="36" y="36"/>
+                            <Anchor point="TOPLEFT" relativeTo="$(parent)Craft4Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, TOP, GetString(SI_ITEMFILTERTYPE16)) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
                         </Texture>
                         <Label name="$(parent)Craft4" hidden="true" font="LeoAltholicLargeFont" color="FFFFFF" verticalAlignment="CENTER" inheritAlpha="false">
                             <Dimensions x="200" y="32" />
                             <Anchor point="TOPLEFT" relativeTo="$(parent)Craft4Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
                         </Label>
-                        <Texture name="$(parent)Craft5Status" hidden="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
+
+                        <Texture name="$(parent)Craft5Status" hidden="true" mouseEnabled="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
                             <Dimensions x="28" y="28"/>
                             <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="10" offsetY="44"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, RIGHT, self.tooltip) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
+                        </Texture>
+                        <Texture name="$(parent)Craft5Icon" hidden="true" mouseEnabled="true" inheritAlpha="false" color="FFFFFF" textureFile="/esoui/art/icons/servicetooltipicons/gamepad/gp_servicetooltipicon_provisioner.dds">
+                            <Dimensions x="36" y="36"/>
+                            <Anchor point="TOPLEFT" relativeTo="$(parent)Craft5Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, TOP, GetString(SI_ITEMFILTERTYPE18)) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
                         </Texture>
                         <Label name="$(parent)Craft5" hidden="true" font="LeoAltholicLargeFont" color="FFFFFF" verticalAlignment="CENTER" inheritAlpha="false">
                             <Dimensions x="200" y="32" />
                             <Anchor point="TOPLEFT" relativeTo="$(parent)Craft5Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
                         </Label>
-                        <Texture name="$(parent)Craft6Status" hidden="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
+
+                        <Texture name="$(parent)Craft6Status" hidden="true" mouseEnabled="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
                             <Dimensions x="28" y="28"/>
                             <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="10" offsetY="44"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, RIGHT, self.tooltip) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
+                        </Texture>
+                        <Texture name="$(parent)Craft6Icon" hidden="true" mouseEnabled="true" inheritAlpha="false" color="FFFFFF" textureFile="/esoui/art/icons/servicetooltipicons/gamepad/gp_servicetooltipicon_woodworker.dds">
+                            <Dimensions x="36" y="36"/>
+                            <Anchor point="TOPLEFT" relativeTo="$(parent)Craft6Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, TOP, GetString(SI_ITEMFILTERTYPE15)) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
                         </Texture>
                         <Label name="$(parent)Craft6" hidden="true" font="LeoAltholicLargeFont" color="FFFFFF" verticalAlignment="CENTER" inheritAlpha="false">
                             <Dimensions x="200" y="32" />
                             <Anchor point="TOPLEFT" relativeTo="$(parent)Craft6Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
                         </Label>
-                        <Texture name="$(parent)Craft7Status" hidden="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
+
+                        <Texture name="$(parent)Craft7Status" hidden="true" mouseEnabled="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
                             <Dimensions x="28" y="28"/>
                             <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="10" offsetY="44"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, RIGHT, self.tooltip) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
+                        </Texture>
+                        <Texture name="$(parent)Craft7Icon" hidden="true" mouseEnabled="true" inheritAlpha="false" color="FFFFFF" textureFile="/esoui/art/icons/servicetooltipicons/gamepad/gp_servicetooltipicon_jewelrycrafting.dds">
+                            <Dimensions x="36" y="36"/>
+                            <Anchor point="TOPLEFT" relativeTo="$(parent)Craft7Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, TOP, GetString(SI_ITEMFILTERTYPE24)) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
                         </Texture>
                         <Label name="$(parent)Craft7" hidden="true" font="LeoAltholicLargeFont" color="FFFFFF" verticalAlignment="CENTER" inheritAlpha="false">
                             <Dimensions x="200" y="32" />
                             <Anchor point="TOPLEFT" relativeTo="$(parent)Craft7Status" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
                         </Label>

-                        <Texture name="$(parent)RidingStatus" hidden="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
+                        <Texture name="$(parent)RidingStatus" hidden="true" mouseEnabled="true" textureFile="/esoui/art/buttons/decline_up.dds" inheritAlpha="false">
                             <Dimensions x="28" y="28"/>
                             <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="10" offsetY="44"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, RIGHT, self.tooltip) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
+                        </Texture>
+                        <Texture name="$(parent)RidingIcon" hidden="true" mouseEnabled="true" inheritAlpha="false" color="FFFFFF" textureFile="/esoui/art/icons/servicetooltipicons/gamepad/gp_servicetooltipicon_stablemaster.dds">
+                            <Dimensions x="36" y="36"/>
+                            <Anchor point="TOPLEFT" relativeTo="$(parent)RidingStatus" relativePoint="TOPRIGHT" offsetX="10" offsetY="0"/>
+                            <OnMouseEnter> ZO_Tooltips_ShowTextTooltip(self, TOP, GetString(SI_STAT_GAMEPAD_RIDING_HEADER_TRAINING)) </OnMouseEnter>
+                            <OnMouseExit> ZO_Tooltips_HideTextTooltip() </OnMouseExit>
                         </Texture>
                         <Label name="$(parent)Riding" hidden="true" font="LeoAltholicLargeFont" color="FFFFFF" verticalAlignment="CENTER" inheritAlpha="false">
                             <Dimensions x="200" y="32" />
diff --git a/LeoAltholicInit.lua b/LeoAltholicInit.lua
index 42901a7..1fc33b5 100644
--- a/LeoAltholicInit.lua
+++ b/LeoAltholicInit.lua
@@ -6,7 +6,7 @@ LeoAltholicToolbarUI = LeoAltholicToolbarUI or {}

 LeoAltholic.name = "LeoAltholic"
 LeoAltholic.displayName = "Leo's Altholic"
-LeoAltholic.version = "1.4.1"
+LeoAltholic.version = "1.4.2"
 LeoAltholic.chatPrefix = "|c39B027" .. LeoAltholic.name .. "|r: "

 LeoAltholic.TAB_BIO = "Bio"
@@ -45,3 +45,12 @@ LeoAltholic.craftResearch = {
     CRAFTING_TYPE_WOODWORKING,
     CRAFTING_TYPE_JEWELRYCRAFTING
 }
+LeoAltholic.craftIcons = {
+    [CRAFTING_TYPE_BLACKSMITHING] = "esoui/art/inventory/inventory_tabicon_craftbag_blacksmithing_up.dds",
+    [CRAFTING_TYPE_CLOTHIER] = "esoui/art/inventory/inventory_tabicon_craftbag_clothing_up.dds",
+    [CRAFTING_TYPE_WOODWORKING] = "esoui/art/inventory/inventory_tabicon_craftbag_woodworking_up.dds",
+    [CRAFTING_TYPE_ALCHEMY] = "esoui/art/inventory/inventory_tabicon_craftbag_alchemy_up.dds",
+    [CRAFTING_TYPE_ENCHANTING] = "esoui/art/inventory/inventory_tabicon_craftbag_enchanting_up.dds",
+    [CRAFTING_TYPE_PROVISIONING] = "esoui/art/inventory/inventory_tabicon_craftbag_provisioning_up.dds",
+    [CRAFTING_TYPE_JEWELRYCRAFTING] = "esoui/art/inventory/inventory_tabicon_craftbag_jewelrycrafting_up.dds",
+}
diff --git a/Settings.lua b/Settings.lua
index 5c8c84b..065a54d 100644
--- a/Settings.lua
+++ b/Settings.lua
@@ -34,106 +34,128 @@ function LeoAltholic_Settings:CreatePanel()
 			type = "checkbox",
 			name = GetString(SI_ADDON_MANAGER_ENABLED),
 			default = true,
-			getFunc = function() return LeoAltholic.charData.settings.checklist.enabled end,
-			setFunc = function(value)
-				LeoAltholic.charData.settings.checklist.enabled = value
-                LeoAltholicChecklistUI.RestorePosition()
-			end,
+			getFunc = LeoAltholicChecklistUI.IsEnabled,
+			setFunc = LeoAltholicChecklistUI.SetEnabled,
+		},{
+			type = "button",
+			name = GetString(SI_OUTFIT_STYLES_BOOK_PREVIEW_KEYBIND),
+			func = function() LeoAltholicChecklistUI.ShowUI() end,
+			width = "full",
+		},{
+			type = "slider",
+			name = GetString(SI_VIDEO_OPTIONS_UI_USE_CUSTOM_SCALE),
+			getFunc = LeoAltholicChecklistUI.GetFontScale,
+			setFunc = LeoAltholicChecklistUI.SetFontScale,
+			min = 80,
+			max = 120,
+			default = 100,
+		},{
+			type = "checkbox",
+			name = GetString(LEOALT_CHECKLIST_UPWARDS),
+			default = false,
+			getFunc = LeoAltholicChecklistUI.IsUpwards,
+			setFunc = LeoAltholicChecklistUI.SetUpwards,
+		},{
+			type = "checkbox",
+			name = GetString(SI_GAMEPAD_INTERFACE_OPTIONS_PRIMARY_PLAYER_NAME),
+			default = false,
+			getFunc = LeoAltholicChecklistUI.DisplayName,
+			setFunc = LeoAltholicChecklistUI.SetDisplayName,
+		--[[},{
+			type = "checkbox",
+			name = GetString(SI_INTERFACE_OPTIONS_CAMERA_THIRD_PERSON_HORIZONTAL_POSITION_MULTIPLIER),
+			default = false,
+			getFunc = LeoAltholicChecklistUI.IsHorizontal,
+			setFunc = LeoAltholicChecklistUI.SetHorizontal,
+			disabled = function() return LeoAltholicChecklistUI.DisplayName() end]]
 		},{
 			type = "submenu",
-			name = GetString(SI_GAMEPAD_OPTIONS_MENU),
+			name = GetString(SI_INVENTORY_MODE_ITEMS),
 			controls = {
 				{
+					type = "description",
+					text = GetString(LEOALT_CHAR_CONFIGURATION)
+				},{
 					type = "checkbox",
 					name = GetString(SI_ITEMFILTERTYPE16),
 					default = true,
-					disabled = function() return not LeoAltholic.charData.settings.checklist.enabled end,
+					disabled = function() return not LeoAltholicChecklistUI.IsEnabled() end,
 					width = "half",
-					getFunc = function() return LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_ALCHEMY] end,
+					getFunc = function() return LeoAltholicChecklistUI.GetCraft(CRAFTING_TYPE_ALCHEMY) end,
 					setFunc = function(value)
-						LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_ALCHEMY] = value
-						LeoAltholicChecklistUI.update()
+						LeoAltholicChecklistUI.SetCraft(CRAFTING_TYPE_ALCHEMY, value)
 					end,
 				},{
 					type = "checkbox",
 					name = GetString(SI_ITEMFILTERTYPE13),
 					default = true,
-					disabled = function() return not LeoAltholic.charData.settings.checklist.enabled end,
+					disabled = function() return not LeoAltholicChecklistUI.IsEnabled() end,
 					width = "half",
-					getFunc = function() return LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_BLACKSMITHING] end,
+					getFunc = function() return LeoAltholicChecklistUI.GetCraft(CRAFTING_TYPE_BLACKSMITHING) end,
 					setFunc = function(value)
-						LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_BLACKSMITHING] = value
-						LeoAltholicChecklistUI.update()
+						LeoAltholicChecklistUI.SetCraft(CRAFTING_TYPE_BLACKSMITHING, value)
 					end,
 				},{
 					type = "checkbox",
 					name = GetString(SI_ITEMFILTERTYPE14),
 					default = true,
-					disabled = function() return not LeoAltholic.charData.settings.checklist.enabled end,
+					disabled = function() return not LeoAltholicChecklistUI.IsEnabled() end,
 					width = "half",
-					getFunc = function() return LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_CLOTHIER] end,
+					getFunc = function() return LeoAltholicChecklistUI.GetCraft(CRAFTING_TYPE_CLOTHIER) end,
 					setFunc = function(value)
-						LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_CLOTHIER] = value
-						LeoAltholicChecklistUI.update()
+						LeoAltholicChecklistUI.SetCraft(CRAFTING_TYPE_CLOTHIER, value)
 					end,
 				},{
 					type = "checkbox",
 					name = GetString(SI_ITEMFILTERTYPE17),
 					default = true,
-					disabled = function() return not LeoAltholic.charData.settings.checklist.enabled end,
+					disabled = function() return not LeoAltholicChecklistUI.IsEnabled() end,
 					width = "half",
-					getFunc = function() return LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_ENCHANTING] end,
+					getFunc = function() return LeoAltholicChecklistUI.GetCraft(CRAFTING_TYPE_ENCHANTING) end,
 					setFunc = function(value)
-						LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_ENCHANTING] = value
-						LeoAltholicChecklistUI.update()
+						LeoAltholicChecklistUI.SetCraft(CRAFTING_TYPE_ENCHANTING, value)
 					end,
 				},{
 					type = "checkbox",
 					name = GetString(SI_ITEMFILTERTYPE25),
 					default = true,
-					disabled = function() return not LeoAltholic.charData.settings.checklist.enabled end,
+					disabled = function() return not LeoAltholicChecklistUI.IsEnabled() end,
 					width = "half",
-					getFunc = function() return LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_JEWELRYCRAFTING] end,
+					getFunc = function() return LeoAltholicChecklistUI.GetCraft(CRAFTING_TYPE_JEWELRYCRAFTING) end,
 					setFunc = function(value)
-						LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_JEWELRYCRAFTING] = value
-						LeoAltholicChecklistUI.update()
+						LeoAltholicChecklistUI.SetCraft(CRAFTING_TYPE_JEWELRYCRAFTING, value)
 					end,
 				},{
 					type = "checkbox",
 					name = GetString(SI_ITEMFILTERTYPE18),
 					default = true,
-					disabled = function() return not LeoAltholic.charData.settings.checklist.enabled end,
+					disabled = function() return not LeoAltholicChecklistUI.IsEnabled() end,
 					width = "half",
-					getFunc = function() return LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_PROVISIONING] end,
+					getFunc = function() return LeoAltholicChecklistUI.GetCraft(CRAFTING_TYPE_PROVISIONING) end,
 					setFunc = function(value)
-						LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_PROVISIONING] = value
-						LeoAltholicChecklistUI.update()
+						LeoAltholicChecklistUI.SetCraft(CRAFTING_TYPE_PROVISIONING, value)
 					end,
 				},{
 					type = "checkbox",
 					name = GetString(SI_ITEMFILTERTYPE15),
 					default = true,
-					disabled = function() return not LeoAltholic.charData.settings.checklist.enabled end,
+					disabled = function() return not LeoAltholicChecklistUI.IsEnabled() end,
 					width = "half",
-					getFunc = function() return LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_WOODWORKING] end,
+					getFunc = function() return LeoAltholicChecklistUI.GetCraft(CRAFTING_TYPE_WOODWORKING) end,
 					setFunc = function(value)
-						LeoAltholic.charData.settings.checklist.craft[CRAFTING_TYPE_WOODWORKING] = value
-						LeoAltholicChecklistUI.update()
+						LeoAltholicChecklistUI.SetCraft(CRAFTING_TYPE_WOODWORKING, value)
 					end,
 				},{
 					type = "checkbox",
 					name = GetString(SI_STAT_GAMEPAD_RIDING_HEADER_TRAINING),
 					default = true,
-					disabled = function() return not LeoAltholic.charData.settings.checklist.enabled end,
+					disabled = function() return not LeoAltholicChecklistUI.IsEnabled() end,
 					width = "half",
-					getFunc = function() return LeoAltholic.charData.settings.checklist.riding end,
-					setFunc = function(value)
-						LeoAltholic.charData.settings.checklist.riding = value
-						LeoAltholicChecklistUI.update()
-					end,
+					getFunc = LeoAltholicChecklistUI.GetRiding,
+					setFunc = LeoAltholicChecklistUI.SetRiding,
 				}
 			}
-		},{
+		--[[},{
 			type = "header",
 			name = "|c3f7fff"..GetString(LEOALT_TOOLBAR).."|r"
 		},{
@@ -198,7 +220,7 @@ function LeoAltholic_Settings:CreatePanel()
 						LeoAltholicToolbarUI.update()
 					end,
 				}
-			}
+			}]]
 		},{
 			type = "header",
 			name = "|c3f7fff"..GetString(LEOALT_TRACKED_QUESTS).."|r"
diff --git a/ui/checklist.lua b/ui/checklist.lua
index 9363199..d293bee 100644
--- a/ui/checklist.lua
+++ b/ui/checklist.lua
@@ -1,22 +1,105 @@

-function LeoAltholicChecklistUI:OnWindowMoveStop()
-    LeoAltholic.globalData.positionChecklist = {
-        left = LeoAltholicChecklist:GetLeft(),
-        top = LeoAltholicChecklist:GetTop()
+function LeoAltholicChecklistUI.normalizeSettings()
+    if not LeoAltholic.globalData.checklist then LeoAltholic.globalData.checklist = {} end
+    if not LeoAltholic.globalData.settings.checklist then LeoAltholic.globalData.settings.checklist = {} end
+    if not LeoAltholic.charData.settings.checklist then LeoAltholic.charData.settings.checklist = {} end
+end
+
+function LeoAltholicChecklistUI.SetPosition(left, top)
+    LeoAltholic.globalData.checklist.position = {
+        left = left,
+        top = top
     }
 end
+function LeoAltholicChecklistUI.GetPosition()
+    return LeoAltholic.globalData.checklist.position or { left = 100; top = 200; }
+end
+
+function LeoAltholicChecklistUI.SetFontScale(value)
+    LeoAltholic.globalData.settings.checklist.fontScale = value
+    LeoAltholicChecklistUI.update()
+end
+function LeoAltholicChecklistUI.GetFontScale()
+    return LeoAltholic.globalData.settings.checklist.fontScale or 100
+end
+function LeoAltholicChecklistUI.SetDisplayName(value)
+    LeoAltholic.globalData.settings.checklist.displayName = value
+    LeoAltholicChecklistUI.update()
+end
+function LeoAltholicChecklistUI.DisplayName()
+    if LeoAltholic.globalData.settings.checklist.displayName == nil then LeoAltholic.globalData.settings.checklist.displayName = true end
+    return LeoAltholic.globalData.settings.checklist.displayName
+end
+function LeoAltholicChecklistUI.SetHorizontal(value)
+    LeoAltholic.globalData.settings.checklist.horizontal = value
+    LeoAltholicChecklistUI.update()
+end
+function LeoAltholicChecklistUI.IsHorizontal()
+    if LeoAltholic.globalData.settings.checklist.horizontal == nil then LeoAltholic.globalData.settings.checklist.horizontal = false end
+    return LeoAltholic.globalData.settings.checklist.horizontal
+end
+
+function LeoAltholicChecklistUI.SetUpwards(value)
+    LeoAltholic.globalData.settings.checklist.upwards = value
+    LeoAltholicChecklistUI.update()
+end
+function LeoAltholicChecklistUI.IsUpwards()
+    return LeoAltholic.globalData.settings.checklist.upwards or false
+end
+
+function LeoAltholicChecklistUI.SetEnabled(value)
+    LeoAltholic.charData.settings.checklist.enabled = value
+    LeoAltholicChecklistUI.RestorePosition()
+end
+function LeoAltholicChecklistUI.IsEnabled()
+    return LeoAltholic.charData.settings.checklist.enabled or true
+end
+
+function LeoAltholicChecklistUI.SetCraft(craft, value)
+    if not LeoAltholic.charData.settings.checklist.craft then LeoAltholic.charData.settings.checklist.craft = {} end
+    LeoAltholic.charData.settings.checklist.craft[craft] = value
+    LeoAltholicChecklistUI.update()
+end
+function LeoAltholicChecklistUI.GetCraft(craft)
+    if not LeoAltholic.charData.settings.checklist.craft then LeoAltholic.charData.settings.checklist.craft = {} end
+    return LeoAltholic.charData.settings.checklist.craft[craft] or false
+end
+function LeoAltholicChecklistUI.SetRiding(value)
+    LeoAltholic.charData.settings.checklist.riding = value
+    LeoAltholicChecklistUI.update()
+end
+function LeoAltholicChecklistUI.GetRiding()
+    return LeoAltholic.charData.settings.checklist.riding or false
+end
+
+
+function LeoAltholicChecklistUI.OnWindowMoveStop()
+    LeoAltholicChecklistUI.SetPosition(LeoAltholicChecklist:GetLeft(), LeoAltholicChecklist:GetTop())
+end
+
+function LeoAltholicChecklistUI.ToggleUI()
+    if not LeoAltholicChecklistUI.IsEnabled() then return end
+    LeoAltholicChecklist:SetHidden(not LeoAltholicChecklist:IsHidden())
+end
+
+function LeoAltholicChecklistUI.ShowUI()
+    if not LeoAltholicChecklistUI.IsEnabled() then return end
+    LeoAltholicChecklist:SetHidden(false)
+end

 function LeoAltholicChecklistUI.RestorePosition()
-    local position = LeoAltholic.globalData.positionChecklist or { left = 100; top = 200; }
+    local position = LeoAltholicChecklistUI.GetPosition()
     local left = position.left
     local top = position.top

     LeoAltholicChecklist:ClearAnchors()
     LeoAltholicChecklist:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, left, top)
-    if LeoAltholic.charData.settings.checklist.enabled == false then
-        LeoAltholicChecklist:SetHidden(true)
+    if LeoAltholicChecklistUI.IsEnabled() then
+        if not LeoAltholicChecklistUI.checkAllDone() then
+            LeoAltholicChecklist:SetHidden(false)
+        end
     else
-        LeoAltholicChecklist:SetHidden(false)
+        LeoAltholicChecklist:SetHidden(true)
     end
 end

@@ -24,30 +107,36 @@ local SPACE = 32
 local checklist = WINDOW_MANAGER:GetControlByName("LeoAltholicChecklist")
 local panel = GetControl(checklist, "Panel")
 local height = 0
-local anchorY = SPACE + 4
 local lastChecklist = GetTimeStamp()
-local checklistDone = 0

-local function createItem(label, labelText, texture, canShow)
-    if canShow then
+local function createItem(label, labelText, texture, craftIcon, canShow)
+    if canShow == true then
         texture:SetTexture("esoui/art/buttons/decline_up.dds")
         texture:SetColor(1,0,0,1)
         texture:SetDimensions(32, 32)
-        texture:SetAnchor(TOPLEFT, checklist, TOPLEFT, 10, height + anchorY)
+        texture:SetAnchor(TOPLEFT, panel, TOPLEFT, 10, height)
+        texture.tooltip = "Quest not started"

         height = height + SPACE
-        label:SetText(labelText)
-        label:SetHidden(false)
+        if LeoAltholicChecklistUI.DisplayName() then
+            label:SetText(labelText)
+            label:SetHidden(false)
+            craftIcon:SetHidden(true)
+        else
+            craftIcon:SetHidden(false)
+            label:SetHidden(true)
+        end
         texture:SetHidden(false)
     else
         label:SetHidden(true)
         texture:SetHidden(true)
+        craftIcon:SetHidden(false)
     end
 end

-function LeoAltholicChecklistUI:checkReset()
+function LeoAltholicChecklistUI.checkReset()
     if LeoAltholic.IsBeforeReset(lastChecklist) then
-        LeoAltholicChecklistUI:update()
+        LeoAltholicChecklistUI.update()
         lastChecklist = GetTimeStamp()
     end
 end
@@ -55,94 +144,206 @@ end
 local function doneItem(label, texture)
     texture:SetTexture("esoui/art/loot/loot_finesseItem.dds")
     texture:SetColor(0,1,0,1)
+    texture.tooltip = GetString(SI_ACHIEVEMENTS_TOOLTIP_COMPLETE)
 end

 local function startItem(label, texture)
+    texture:SetTexture("esoui/art/buttons/pointsminus_up.dds")
+    texture:SetColor(1,1,1,1)
+    texture.tooltip = "Quest Started"
+end
+
+local function updateItem(label, texture)
+    texture:SetTexture("esoui/art/loot/loot_finesseItem.dds")
+    texture:SetColor(1,0.65,0,1)
+    texture.tooltip = "Quest Updated"
+end
+
+local function preDeliverItem(label, texture)
     texture:SetTexture("esoui/art/loot/loot_finesseItem.dds")
     texture:SetColor(1,1,0,1)
+    texture.tooltip = "Ready for deliver"
 end

 local function stoppedItem(label, texture)
     texture:SetTexture("esoui/art/buttons/decline_up.dds")
     texture:SetColor(1,0,0,1)
+    texture.tooltip = "Quest Deleted"
 end

-local function incrementDone()
-    checklistDone = checklistDone + 1
-    if checklistDone == 8 then
-        LeoAltholicChecklistPanel:SetHidden(true)
-        LeoAltholicChecklistMinButton:SetHidden(true)
-        LeoAltholicChecklistMaxButton:SetHidden(false)
+function LeoAltholicChecklistUI.checkAllDone()
+    local char = LeoAltholic.GetMyself()
+
+    for _, craft in pairs(LeoAltholic.allCrafts) do
+        if LeoAltholicChecklistUI.GetCraft(craft) then
+            for _, writ in pairs(char.quests.writs) do
+                if craft == writ.craft then
+                    if writ.lastDone == nil or not LeoAltholic.IsAfterReset(writ.lastDone) then return false end
+                end
+            end
+        end
     end
+    if LeoAltholicChecklistUI.GetRiding() and char.attributes.riding.time - GetTimeStamp() < 0 then
+        return false
+    end
+    LeoAltholicChecklist:SetHidden(true)
+    return true
 end

-function LeoAltholicChecklistUI:doneWrit(craft)
-    if not LeoAltholic.charData.settings.checklist.enabled then return end
+function LeoAltholicChecklistUI.doneWrit(craft)
+    if not LeoAltholicChecklistUI.IsEnabled() then return end

     local label = GetControl(panel, "Craft"..craft)
     local texture = GetControl(panel, "Craft"..craft.."Status")
     doneItem(label, texture)
-    incrementDone()
+    LeoAltholicChecklistUI.checkAllDone()
 end

-function LeoAltholicChecklistUI:startedWrit(craft)
-    if not LeoAltholic.charData.settings.checklist.enabled then return end
+function LeoAltholicChecklistUI.startedWrit(craft)
+    if not LeoAltholicChecklistUI.IsEnabled() then return end

     local label = GetControl(panel, "Craft"..craft)
     local texture = GetControl(panel, "Craft"..craft.."Status")
     startItem(label, texture)
 end

-function LeoAltholicChecklistUI:stoppedWrit(craft)
-    if not LeoAltholic.charData.settings.checklist.enabled then return end
+function LeoAltholicChecklistUI.updateWrit(craft)
+    if not LeoAltholicChecklistUI.IsEnabled() then return end
+
+    local label = GetControl(panel, "Craft"..craft)
+    local texture = GetControl(panel, "Craft"..craft.."Status")
+    updateItem(label, texture)
+end
+
+function LeoAltholicChecklistUI.preDeliverWrit(craft)
+    if not LeoAltholicChecklistUI.IsEnabled() then return end
+
+    local label = GetControl(panel, "Craft"..craft)
+    local texture = GetControl(panel, "Craft"..craft.."Status")
+    preDeliverItem(label, texture)
+end
+
+function LeoAltholicChecklistUI.stoppedWrit(craft)
+    if not LeoAltholicChecklistUI.IsEnabled() then return end

     local label = GetControl(panel, "Craft"..craft)
     local texture = GetControl(panel, "Craft"..craft.."Status")
     stoppedItem(label, texture)
 end

-function LeoAltholicChecklistUI:doneRiding()
-    if not LeoAltholic.charData.settings.checklist.enabled then return end
+function LeoAltholicChecklistUI.doneRiding()
+    if not LeoAltholicChecklistUI.IsEnabled() then return end

     local label = GetControl(panel, "Riding")
     local texture = GetControl(panel, "RidingStatus")
     doneItem(label, texture)
-    incrementDone()
 end

-function LeoAltholicChecklistUI:update()
+function LeoAltholicChecklistUI.updateQuests()
+    for i,trackedQuest in pairs(LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs) do
+        for questIndex = 1, MAX_JOURNAL_QUESTS do
+            if IsValidQuestIndex(questIndex) and GetJournalQuestName(questIndex) == trackedQuest.name then
+                LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].questIndex = questIndex
+                local numConditions = GetJournalQuestNumConditions(questIndex, QUEST_MAIN_STEP_INDEX)
+                for condition = 1, numConditions do
+                    local condText = GetJournalQuestConditionInfo(questIndex, QUEST_MAIN_STEP_INDEX, condition)
+                    if string.find(condText, GetString(LEOALT_DELIVER)) then
+                        LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastPreDeliver = GetTimeStamp()
+                        LeoAltholicChecklistUI.preDeliverWrit(trackedQuest.craft)
+                    end
+                end
+                break
+            end
+        end
+    end
+end
+
+function LeoAltholicChecklistUI.update()

-    if not LeoAltholic.charData.settings.checklist.enabled then return end
+    if not LeoAltholicChecklistUI.IsEnabled() then return end

     local char = LeoAltholic.GetMyself()

-    local texture, label
-    local done = false
+    local texture, label, craftIcon

     height = 0
-    anchorY = 44
+
+    local scale = LeoAltholicChecklistUI.GetFontScale() / 100

     for _, craft in pairs(LeoAltholic.allCrafts) do
         label = GetControl(panel, "Craft"..craft)
+        label:SetScale(scale)
+        craftIcon = GetControl(panel, "Craft"..craft.."Icon")
+        craftIcon:SetScale(scale)
         texture = GetControl(panel, "Craft"..craft.."Status")
-        createItem(label, GetCraftingSkillName(craft), texture, LeoAltholic.charData.settings.checklist.craft[craft])
-        if LeoAltholic.IsWritDoneToday(craft) then
-            doneItem(label, texture)
-            done = true
-            incrementDone()
-        elseif LeoAltholic.IsWritStartedToday(craft) then
-            startItem(label, texture)
+        texture:SetScale(scale)
+
+        local isDone = false
+        local isPreDeliver = false
+        local isUpdated = false
+        local isStarted = false
+        for _, writ in pairs(char.quests.writs) do
+            if craft == writ.craft then
+                if writ.lastDone ~= nil and LeoAltholic.IsAfterReset(writ.lastDone) then
+                    isDone = true
+                elseif writ.lastPreDeliver ~= nil and LeoAltholic.IsAfterReset(writ.lastPreDeliver) then
+                    isPreDeliver = true
+                elseif writ.lastUpdated ~= nil and LeoAltholic.IsAfterReset(writ.lastUpdated) then
+                    isUpdated = true
+                elseif writ.lastStarted ~= nil and LeoAltholic.IsAfterReset(writ.lastStarted) then
+                    isStarted = true
+                end
+            end
+        end
+
+        local canShow = LeoAltholicChecklistUI.GetCraft(craft)
+
+        createItem(label, GetCraftingSkillName(craft), texture, craftIcon, canShow)
+        if canShow then
+            if isDone then
+                doneItem(label, texture)
+                LeoAltholicChecklistUI.checkAllDone()
+            elseif isPreDeliver then
+                preDeliverItem(label, texture)
+            elseif isUpdated then
+                updateItem(label, texture)
+            elseif isStarted then
+                startItem(label, texture)
+            end
         end
     end

     label = GetControl(panel, "Riding")
+    label:SetScale(scale)
+    label:SetColor(1,1,1,1)
     texture = GetControl(panel, "RidingStatus")
-    createItem(label, GetString(SI_STAT_GAMEPAD_RIDING_HEADER_TRAINING), texture, LeoAltholic.charData.settings.checklist.riding)
+    texture:SetScale(scale)
+    craftIcon = GetControl(panel, "RidingIcon")
+    craftIcon:SetScale(scale)
+    createItem(label, GetString(SI_STAT_GAMEPAD_RIDING_HEADER_TRAINING), texture, craftIcon, LeoAltholicChecklistUI.GetRiding())
     if char.attributes.riding.time - GetTimeStamp() > 0 then
         doneItem(label, texture)
-        incrementDone()
+        LeoAltholicChecklistUI.checkAllDone()
     end

-    panel:SetHeight(10 + height)
     checklist:SetHeight(60 + height)
+    panel:SetHeight(10 + height)
+    panel:ClearAnchors()
+    local header = GetControl(checklist, "BGHeader")
+    header:ClearAnchors()
+    if LeoAltholicChecklistUI.IsUpwards() then
+        header:SetAnchor(BOTTOMLEFT, checklist, BOTTOMLEFT, 0, 0)
+        panel:SetAnchor(BOTTOMLEFT, header, TOPLEFT, 0, 2)
+    else
+        header:SetAnchor(TOPLEFT, checklist, TOPLEFT, 0, 0)
+        panel:SetAnchor(TOPLEFT, checklist, TOPLEFT, 0, 40)
+    end
+
+    local width = 200
+    if not LeoAltholicChecklistUI.DisplayName() then
+        width = 120
+    end
+    checklist:SetWidth(width)
+    panel:SetWidth(width)
+    header:SetWidth(width)
 end