annotate ReagentMaker.lua @ 115:5a3fb8fea026

Throttle count display
author contrebasse
date Wed, 15 Jun 2011 00:05:35 +0200
parents c79ab5443ee5
children 7ce304c296b0
rev   line source
contrebasse@98 1 local addonName, A = ...
contrebasse@98 2
contrebasse@111 3 -- @todo add support for cross tradeskill, like mining + forge/ingé
contrebasse@98 4 -- @todo add support for dez ?
contrebasse@111 5 -- @todo scroll to the selected recipe on opening ?
contrebasse@111 6 -- @todo add a button to clear search ?
contrebasse@111 7
contrebasse@111 8 -- @bug Enter when choosing number of crafts
contrebasse@98 9
contrebasse@98 10 ---------------------------------------------------
contrebasse@98 11 -- Variables
contrebasse@98 12 ---------------------------------------------------
contrebasse@98 13 -- Used by findglobals
contrebasse@111 14 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME, UIParent
contrebasse@98 15
contrebasse@98 16 -- Lua functions
contrebasse@98 17
contrebasse@98 18 -- Wow functions
contrebasse@111 19 local GetTradeSkillLine = GetTradeSkillLine
contrebasse@111 20 local IsTradeSkillGuild = IsTradeSkillGuild
contrebasse@111 21 local IsTradeSkillLinked = IsTradeSkillLinked
contrebasse@111 22 local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex
contrebasse@111 23 local GetTradeSkillNumReagents = GetTradeSkillNumReagents
contrebasse@111 24 local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink
contrebasse@98 25
contrebasse@98 26 -- constant vars
contrebasse@111 27 local GameTooltip = GameTooltip
contrebasse@98 28
contrebasse@98 29 ---------------------------------------------------
contrebasse@111 30 -- Manage events and throttling
contrebasse@98 31 ---------------------------------------------------
contrebasse@98 32 A.EventsFrame = CreateFrame("Frame")
contrebasse@98 33
contrebasse@98 34 local SCAN_DELAY = 0.2
contrebasse@98 35 local t_throttle = SCAN_DELAY
contrebasse@98 36 local function throttleScan(self, t_elapsed)
contrebasse@98 37 t_throttle = t_throttle - t_elapsed
contrebasse@98 38 if t_throttle<0 then
contrebasse@98 39 self:SetScript("OnUpdate", nil)
contrebasse@98 40
contrebasse@98 41 -- Close the external window if the tradeskill changed
contrebasse@98 42 if A.currentTradeSkill ~= GetTradeSkillLine() then
contrebasse@98 43 A.MenuFrame:Hide()
contrebasse@98 44 end
contrebasse@98 45 if IsTradeSkillGuild() or IsTradeSkillLinked() then
contrebasse@98 46 A.MenuFrame:Hide()
contrebasse@98 47 return
contrebasse@98 48 end
contrebasse@98 49
contrebasse@98 50 -- Scan availabe recipes
contrebasse@98 51 -- Rescan in case of problem
contrebasse@98 52 if not A:ScanSimpleRecipes() then
contrebasse@98 53 t_throttle = SCAN_DELAY
contrebasse@98 54 self:SetScript("OnUpdate", throttleScan)
contrebasse@98 55 end
contrebasse@98 56
contrebasse@98 57 -- Show makables reagents
contrebasse@115 58 A.updateCount_throttle()
contrebasse@98 59 end
contrebasse@98 60 end
contrebasse@98 61 A.EventsFrame:SetScript("OnEvent", function(self, event)
contrebasse@115 62 --print("Throttle Scan :",event)
contrebasse@98 63 if event == "TRADE_SKILL_UPDATE" then
contrebasse@98 64 t_throttle = SCAN_DELAY
contrebasse@98 65 self:SetScript("OnUpdate", throttleScan)
contrebasse@101 66 A.ManageCampFireBtn()
contrebasse@101 67
contrebasse@101 68 elseif event == "PLAYER_REGEN_DISABLED" then
contrebasse@101 69 A.HideCampFireBtn()
contrebasse@111 70
contrebasse@101 71 elseif event == "PLAYER_REGEN_ENABLED" then
contrebasse@101 72 A.ManageCampFireBtn()
contrebasse@98 73
contrebasse@98 74 elseif event == "TRADE_SKILL_SHOW" then
contrebasse@98 75 A:Initialize()
contrebasse@98 76 A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW")
contrebasse@98 77 end -- if
contrebasse@98 78 end) -- function
contrebasse@111 79
contrebasse@111 80 --@todo Unregister events when not needed
contrebasse@98 81 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW")
contrebasse@98 82 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE")
contrebasse@98 83
contrebasse@111 84
contrebasse@98 85 ---------------------------------------------------
contrebasse@98 86 -- Initialize
contrebasse@98 87 ---------------------------------------------------
contrebasse@98 88 function A:Initialize()
contrebasse@98 89
contrebasse@98 90 -- Register clics on reagent's buttons
contrebasse@98 91 for i=1,7 do
contrebasse@98 92 local btn = _G["TradeSkillReagent"..i]
contrebasse@98 93 btn:HookScript("OnDoubleClick", A.ProcessReagent)
contrebasse@98 94 btn:HookScript("OnEnter", A.btnEntered)
contrebasse@98 95 btn:HookScript("OnLeave", A.btnLeft)
contrebasse@98 96 btn.SplitStack = A.SplitStack
contrebasse@98 97
contrebasse@98 98 local textureHighlight = btn:CreateTexture()
contrebasse@98 99 textureHighlight:Hide()
contrebasse@98 100 textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight")
contrebasse@110 101 --textureHighlight:SetTexture("Interface\\BUTTONS\\ButtonHilight-Square")
contrebasse@98 102 textureHighlight:SetBlendMode("ADD")
contrebasse@98 103 textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture")
contrebasse@98 104 btn.textureHighlight = textureHighlight
contrebasse@98 105
contrebasse@98 106 local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight")
contrebasse@98 107 label:SetSize(100,20)
contrebasse@98 108 label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4)
contrebasse@98 109 label:SetJustifyH("LEFT")
contrebasse@98 110 label:SetJustifyV("TOP")
contrebasse@98 111 label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
contrebasse@98 112 btn.label = label
contrebasse@98 113 end -- for
contrebasse@98 114
contrebasse@98 115 -- Secondary Tooltip
contrebasse@98 116 A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate")
contrebasse@98 117 A.tooltipRecipe:SetFrameStrata("TOOLTIP")
contrebasse@98 118 A.tooltipRecipe:Hide()
contrebasse@101 119
contrebasse@113 120 -- Used for the campfire button only
contrebasse@113 121 A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@113 122 A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
contrebasse@113 123
contrebasse@98 124 -- Button for enchanting directy on a scroll
contrebasse@98 125 A.LoadEnchantOnScroll()
contrebasse@98 126 end -- function
contrebasse@98 127
contrebasse@98 128 ---------------------------------------------------
contrebasse@111 129 -- Dynamic display
contrebasse@98 130 ---------------------------------------------------
contrebasse@111 131 -- Button hovering (entered)
contrebasse@98 132 function A.btnEntered(btn)
contrebasse@98 133 -- Do not manage guild tradeskill
contrebasse@98 134 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end
contrebasse@98 135
contrebasse@98 136 -- Index of the reagent in the recipe, taken from the button name
contrebasse@111 137 local reagentIndexInRecipe = A.buttonNumber(btn)
contrebasse@98 138
contrebasse@98 139 -- ID of the reagent we want to craft
contrebasse@111 140 local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentIndexInRecipe)
contrebasse@98 141 local reagentID = A.link2ID(reagentLink)
contrebasse@98 142
contrebasse@98 143 -- Continue only if the reagent is known
contrebasse@98 144 if not reagentID or not A.data[reagentID] then return end
contrebasse@98 145
contrebasse@98 146 btn.textureHighlight:Show()
contrebasse@98 147
contrebasse@98 148 -- Check if the item is made by only one recipe. If not, return
contrebasse@98 149 if not A.isRecipeUnique(A.data[reagentID]) then return end
contrebasse@98 150
contrebasse@98 151 -- Tooltips
contrebasse@98 152 local link = A.data[reagentID][1].spellLink
contrebasse@98 153 if link then
contrebasse@98 154 A.tooltipRecipe:SetOwner(btn)
contrebasse@98 155 A.tooltipRecipe:SetHyperlink(link)
contrebasse@98 156 A.tooltipRecipe:Show()
contrebasse@98 157 A.tooltipRecipe:ClearAllPoints()
contrebasse@98 158 A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT")
contrebasse@98 159 end
contrebasse@98 160 end
contrebasse@98 161
contrebasse@111 162 -- Button hovering (left)
contrebasse@98 163 function A.btnLeft(btn)
contrebasse@98 164 btn.textureHighlight:Hide()
contrebasse@98 165 A.tooltipRecipe:Hide()
contrebasse@98 166 end -- function
contrebasse@98 167
contrebasse@111 168 -- Show counts on buttons
contrebasse@115 169 local CountThrottleFrame = CreateFrame("Frame")
contrebasse@115 170 local COUNT_DELAY = 0.1
contrebasse@115 171 local t_throttleCount = SCAN_DELAY
contrebasse@115 172 function UpdateCounts(recipeIndex)
contrebasse@98 173 -- Needs an argument
contrebasse@98 174 if not recipeIndex then return end
contrebasse@98 175
contrebasse@98 176 -- Do not manage guild tradeskill
contrebasse@98 177 if IsTradeSkillGuild() or IsTradeSkillLinked() then
contrebasse@111 178 for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do
contrebasse@98 179 -- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet
contrebasse@111 180 local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label
contrebasse@98 181 if label then
contrebasse@98 182 label:Hide()
contrebasse@98 183 end
contrebasse@98 184 end
contrebasse@98 185 return
contrebasse@98 186 end
contrebasse@98 187
contrebasse@98 188 -- Count makable items and show it
contrebasse@111 189 for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do
contrebasse@98 190 -- ID of the reagent we want to craft
contrebasse@111 191 local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentIndexInRecipe))
contrebasse@98 192
contrebasse@111 193 local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label
contrebasse@111 194 if label then
contrebasse@111 195 -- Continue only if the reagent is known
contrebasse@111 196 if not reagentID or not A.data[reagentID] then
contrebasse@111 197 label:Hide()
contrebasse@98 198 else
contrebasse@111 199 -- Count and show
contrebasse@111 200 local numMakable = A.numMakable(reagentID)
contrebasse@111 201 if not numMakable then
contrebasse@111 202 label:SetText("?")
contrebasse@111 203 label:SetTextColor(0, 0.5, 1, 1) -- blue
contrebasse@98 204 else
contrebasse@111 205 label:SetText(numMakable)
contrebasse@111 206 if numMakable==0 then
contrebasse@111 207 label:SetTextColor(1, 0, 0, 1) -- red
contrebasse@111 208 else
contrebasse@111 209 label:SetTextColor(0, 1, 0, 1) -- green
contrebasse@111 210 end
contrebasse@111 211 end -- if
contrebasse@111 212 label:Show()
contrebasse@98 213 end -- if
contrebasse@98 214 end -- if
contrebasse@98 215 end -- for
contrebasse@98 216 end -- function
contrebasse@115 217 local function throttleCount(self, t_elapsed)
contrebasse@115 218 t_throttle = t_throttle - t_elapsed
contrebasse@115 219 if t_throttle<0 then
contrebasse@115 220 self:SetScript("OnUpdate", nil)
contrebasse@115 221
contrebasse@115 222 -- Show makables reagents
contrebasse@115 223 UpdateCounts(GetTradeSkillSelectionIndex())
contrebasse@115 224 end
contrebasse@115 225 end
contrebasse@115 226 function A.updateCount_throttle(self,event)
contrebasse@115 227 if not TradeSkillFrame or not TradeSkillFrame:IsVisible() or event=="TRADE_SKILL_CLOSE" then
contrebasse@115 228 CountThrottleFrame:UnregisterEvent("BAG_UPDATE")
contrebasse@115 229 t_throttleCount = 0
contrebasse@115 230 CountThrottleFrame:SetScript("OnUpdate", nil)
contrebasse@115 231 return
contrebasse@115 232 else
contrebasse@115 233 CountThrottleFrame:RegisterEvent("BAG_UPDATE")
contrebasse@115 234 end
contrebasse@115 235 t_throttleCount = SCAN_DELAY
contrebasse@115 236 CountThrottleFrame:SetScript("OnUpdate", throttleCount)
contrebasse@115 237
contrebasse@115 238 A.MenuFrame.updateCounts()
contrebasse@115 239 end
contrebasse@115 240 CountThrottleFrame:SetScript("OnEvent", A.updateCount_throttle)
contrebasse@115 241 CountThrottleFrame:RegisterEvent("TRADE_SKILL_SHOW")
contrebasse@115 242 CountThrottleFrame:RegisterEvent("TRADE_SKILL_UPDATE")
contrebasse@115 243 CountThrottleFrame:RegisterEvent("TRADE_SKILL_CLOSE")
contrebasse@115 244 hooksecurefunc("SelectTradeSkill",A.updateCount_throttle)