annotate ReagentMaker.lua @ 20:4ea38bae4174

Lots of display arrangements (tooltips and counts) Corrected an id in data
author contrebasse
date Sun, 10 Apr 2011 19:26:33 +0200
parents f7b23db7bcc6
children 25b9f98f9bba
rev   line source
contrebasse@0 1 local addonName, A = ...
contrebasse@0 2
contrebasse@0 3 -- @todo clean the A table
contrebasse@0 4 -- @todo check local copy of globals functions
contrebasse@0 5 -- @todo show number of craftable items
contrebasse@0 6 -- @todo show owned items
contrebasse@0 7 -- @todo add support for dez ?
contrebasse@0 8 -- @todo add support for cross tradeskill, like mining + forge/ingé
contrebasse@0 9
contrebasse@0 10 ---------------------------------------------------
contrebasse@0 11 -- Variables
contrebasse@0 12 ---------------------------------------------------
contrebasse@0 13 -- Used by findglobals
contrebasse@0 14 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME
contrebasse@0 15
contrebasse@0 16 -- Lua functions
contrebasse@0 17
contrebasse@0 18 -- Wow functions
contrebasse@0 19
contrebasse@0 20 -- constant vars
contrebasse@0 21
contrebasse@0 22 ---------------------------------------------------
contrebasse@0 23 -- Manage events
contrebasse@0 24 ---------------------------------------------------
contrebasse@0 25 A.EventsFrame = CreateFrame("Frame")
contrebasse@0 26
contrebasse@17 27 local SCAN_DELAY = 0.2
contrebasse@17 28 local t_throttle = SCAN_DELAY
contrebasse@17 29 local function throttleScan(self, t_elapsed)
contrebasse@17 30 t_throttle = t_throttle - t_elapsed
contrebasse@17 31 if t_throttle<0 then
contrebasse@17 32 self:SetScript("OnUpdate", nil)
contrebasse@18 33
contrebasse@3 34 -- Close the external window if the tradeskill changed
contrebasse@3 35 if A.currentTradeSkill ~= GetTradeSkillLine() then
contrebasse@3 36 A.MenuFrame:Hide()
contrebasse@3 37 end
contrebasse@13 38 if IsTradeSkillGuild() or IsTradeSkillLinked() then
contrebasse@13 39 A.MenuFrame:Hide()
contrebasse@13 40 return
contrebasse@13 41 end
contrebasse@13 42
contrebasse@13 43 -- Scan availabe recipes
contrebasse@13 44 A:ScanSimpleRecipes()
contrebasse@20 45
contrebasse@20 46 -- Show makables reagents
contrebasse@20 47 A.updateCounts(GetTradeSkillSelectionIndex())
contrebasse@17 48 end
contrebasse@17 49 end
contrebasse@17 50 A.EventsFrame:SetScript("OnEvent", function(self, event)
contrebasse@17 51 if event == "TRADE_SKILL_UPDATE" then
contrebasse@17 52 t_throttle = SCAN_DELAY
contrebasse@17 53 self:SetScript("OnUpdate", throttleScan)
contrebasse@17 54
contrebasse@17 55 elseif event == "TRADE_SKILL_SHOW" then
contrebasse@0 56 A:Initialize()
contrebasse@13 57 A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW")
contrebasse@0 58 end -- if
contrebasse@3 59 end) -- function
contrebasse@0 60 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW")
contrebasse@3 61 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE")
contrebasse@0 62
contrebasse@0 63 ---------------------------------------------------
contrebasse@0 64 -- Initialize
contrebasse@0 65 ---------------------------------------------------
contrebasse@0 66 function A:Initialize()
contrebasse@0 67
contrebasse@3 68 -- Register clics on reagent's buttons
contrebasse@3 69 for i=1,7 do
contrebasse@20 70 local btn = _G["TradeSkillReagent"..i]
contrebasse@20 71 btn:HookScript("OnDoubleClick", A.ProcessReagent)
contrebasse@3 72 btn:HookScript("OnEnter", A.btnEntered)
contrebasse@3 73 btn:HookScript("OnLeave", A.btnLeft)
contrebasse@3 74 btn.SplitStack = A.SplitStack
contrebasse@1 75
contrebasse@3 76 local textureHighlight = btn:CreateTexture()
contrebasse@3 77 textureHighlight:Hide()
contrebasse@3 78 textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight")
contrebasse@3 79 textureHighlight:SetBlendMode("ADD")
contrebasse@3 80 textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture")
contrebasse@3 81 btn.textureHighlight = textureHighlight
contrebasse@3 82
contrebasse@3 83 local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight")
contrebasse@3 84 label:SetSize(100,20)
contrebasse@3 85 label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4)
contrebasse@3 86 label:SetJustifyH("LEFT")
contrebasse@3 87 label:SetJustifyV("TOP")
contrebasse@3 88 label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
contrebasse@3 89 btn.label = label
contrebasse@3 90 end -- for
contrebasse@3 91
contrebasse@3 92 A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate")
contrebasse@3 93 A.tooltipRecipe:SetFrameStrata("TOOLTIP")
contrebasse@3 94 A.tooltipRecipe:Hide()
contrebasse@7 95 --[[
contrebasse@3 96 A.tooltipReagent = CreateFrame("GameTooltip", "ReagentMaker_tooltipReagent",UIParent, "GameTooltipTemplate")
contrebasse@3 97 A.tooltipReagent:SetFrameStrata("TOOLTIP")
contrebasse@3 98 A.tooltipReagent:Hide()
contrebasse@7 99 --]]
contrebasse@3 100 end -- function
contrebasse@3 101
contrebasse@13 102 -- Function run after selecting a item in the tradeskill window
contrebasse@13 103 function A.ProcessReagent(btn, ...)
contrebasse@13 104 -- Do not manage guild tradeskill
contrebasse@13 105 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end
contrebasse@3 106
contrebasse@3 107 -- We want no modifiers, or shift to choose the number of reagent to craft
contrebasse@3 108 if IsModifierKeyDown() and not IsShiftKeyDown() then return end
contrebasse@3 109 local chooseNumberToCraft = IsShiftKeyDown()
contrebasse@3 110
contrebasse@3 111 -- Index of the reagent in the recipe, taken from the button name
contrebasse@3 112 local reagentRecipeIndex = A.buttonNumber(btn)
contrebasse@3 113
contrebasse@3 114 -- ID of the reagent we want to craft
contrebasse@3 115 local reagentID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex))
contrebasse@3 116
contrebasse@3 117 -- Continue only if the reagent is known
contrebasse@3 118 if not reagentID or not A.data[reagentID] then return end
contrebasse@3 119
contrebasse@3 120 -- If only one recipe is known for the reagent, use it
contrebasse@3 121 if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then
contrebasse@3 122 local numMakable, reagentIndex = A.numMakable(reagentID)
contrebasse@3 123 if numMakable>0 then
contrebasse@3 124 A.craft(reagentID,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft)
contrebasse@3 125 return
contrebasse@3 126 end
contrebasse@3 127 -- If we can make the item needed to make the reagent, open a window to make it
contrebasse@3 128 -- one step recursion, enables to mill to create an ink
contrebasse@3 129 if A.data[A.data[reagentID][1][1]] then
contrebasse@3 130 A.externalCraftWindow(A.data[reagentID][1][1])
contrebasse@3 131 else
contrebasse@3 132 print("Sorry, can not make reagent...")
contrebasse@3 133 end
contrebasse@3 134 else
contrebasse@3 135 A.externalCraftWindow(reagentID)
contrebasse@0 136 end -- if
contrebasse@0 137 end -- function
contrebasse@0 138
contrebasse@0 139
contrebasse@0 140 ---------------------------------------------------
contrebasse@0 141 -- Craft items
contrebasse@0 142 ---------------------------------------------------
contrebasse@3 143 -- function used after choosing the number of reagent to craft
contrebasse@3 144 function A.SplitStack(owner,split)
contrebasse@3 145 DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split))
contrebasse@3 146 owner.ReagentMaker_reagentIndex = nil
contrebasse@0 147 end
contrebasse@0 148
contrebasse@3 149 -- Craft the reagent of an item, given it's position in the recipe
contrebasse@3 150 function A.craft(reagentID,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber)
contrebasse@3 151 -- Look at how many we need to make one item for the selected recipe
contrebasse@3 152 local numToMake = 1
contrebasse@3 153 local selectedIndex = GetTradeSkillSelectionIndex()
contrebasse@3 154 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(selectedIndex)
contrebasse@3 155 if numAvailable==0 then
contrebasse@3 156 local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(selectedIndex, reagentRecipeIndex)
contrebasse@3 157 numToMake = math.min(reagentCount - playerReagentCount,numReagentMakable)
contrebasse@3 158 end -- if
contrebasse@0 159
contrebasse@3 160 -- Choose number or craft directly
contrebasse@3 161 if chooseNumber and numReagentMakable>1 then
contrebasse@3 162 -- the dialog window is linked to the reagent button
contrebasse@3 163 local btn = _G["TradeSkillReagent"..reagentRecipeIndex]
contrebasse@3 164
contrebasse@3 165 -- Store info to be able to run the function later
contrebasse@3 166 btn.ReagentMaker_reagentIndex = reagentIndex
contrebasse@3 167
contrebasse@3 168 -- Open dialog
contrebasse@3 169 OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM")
contrebasse@3 170
contrebasse@3 171 -- Fill in the number to make
contrebasse@3 172 numToMake = tostring(numToMake)
contrebasse@3 173 for i = 1,numToMake:len() do
contrebasse@3 174 StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i))
contrebasse@3 175 end
contrebasse@3 176 StackSplitFrame.typing = 0 -- reinit the frame so tha the entered value will be erased on text entry
contrebasse@3 177 else
contrebasse@3 178 DoTradeSkill(reagentIndex,numToMake)
contrebasse@3 179 end -- if
contrebasse@3 180 end -- function
contrebasse@3 181
contrebasse@3 182
contrebasse@3 183 -- Button hovering
contrebasse@3 184 function A.btnEntered(btn)
contrebasse@13 185 -- Do not manage guild tradeskill
contrebasse@13 186 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end
contrebasse@13 187
contrebasse@3 188 -- Index of the reagent in the recipe, taken from the button name
contrebasse@3 189 local reagentRecipeIndex = A.buttonNumber(btn)
contrebasse@3 190
contrebasse@3 191 -- ID of the reagent we want to craft
contrebasse@3 192 local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)
contrebasse@3 193 local reagentID = A.link2ID(reagentLink)
contrebasse@3 194
contrebasse@3 195 -- Continue only if the reagent is known
contrebasse@3 196 if not reagentID or not A.data[reagentID] then return end
contrebasse@3 197
contrebasse@3 198 btn.textureHighlight:Show()
contrebasse@3 199
contrebasse@5 200 -- Tooltips
contrebasse@19 201 local link
contrebasse@19 202 if A.data[reagentID].spell then
contrebasse@19 203 link = GetSpellLink(A.data[reagentID].spellID)
contrebasse@19 204 else
contrebasse@19 205 link = GetTradeSkillRecipeLink(A.findSkillIndex(reagentID))
contrebasse@19 206 end
contrebasse@19 207 if link then
contrebasse@15 208 A.tooltipRecipe:SetOwner(btn)
contrebasse@19 209 A.tooltipRecipe:SetHyperlink(link)
contrebasse@15 210 A.tooltipRecipe:Show()
contrebasse@15 211 A.tooltipRecipe:ClearAllPoints()
contrebasse@15 212 A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT")
contrebasse@6 213 end
contrebasse@0 214 end
contrebasse@0 215
contrebasse@3 216 function A.btnLeft(btn)
contrebasse@3 217 btn.textureHighlight:Hide()
contrebasse@3 218 A.tooltipRecipe:Hide()
contrebasse@8 219 --A.tooltipReagent:Hide()
contrebasse@20 220 end -- function
contrebasse@20 221
contrebasse@20 222 function A.updateCounts(recipeIndex)
contrebasse@20 223 -- Needs an argument
contrebasse@20 224 if not recipeIndex then return end
contrebasse@20 225
contrebasse@20 226 -- Do not manage guild tradeskill
contrebasse@20 227 if IsTradeSkillGuild() or IsTradeSkillLinked() then
contrebasse@20 228 for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do
contrebasse@20 229 _G["TradeSkillReagent"..reagentRecipeIndex].label:Hide()
contrebasse@20 230 end
contrebasse@20 231 return
contrebasse@20 232 end
contrebasse@20 233
contrebasse@20 234 -- Count makable items and show it
contrebasse@20 235 for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do
contrebasse@20 236 -- ID of the reagent we want to craft
contrebasse@20 237 local reagentLink = GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex)
contrebasse@20 238 local reagentID = A.link2ID(reagentLink)
contrebasse@20 239
contrebasse@20 240 local label = _G["TradeSkillReagent"..reagentRecipeIndex].label
contrebasse@20 241 if not label then return end
contrebasse@20 242
contrebasse@20 243 -- Continue only if the reagent is known
contrebasse@20 244 if not reagentID or not A.data[reagentID] or #(A.data[reagentID]) ~= 1 or A.data[reagentID].spell then
contrebasse@20 245 label:Hide()
contrebasse@20 246 else
contrebasse@20 247 -- Count and show
contrebasse@20 248 local numMakable = A.numMakable(reagentID)
contrebasse@20 249 label:SetText(numMakable)
contrebasse@20 250 if numMakable==0 then
contrebasse@20 251 label:SetTextColor(1, 0, 0, 1)
contrebasse@20 252 else
contrebasse@20 253 label:SetTextColor(0, 5, 0, 1)
contrebasse@20 254 end -- if
contrebasse@20 255 label:Show()
contrebasse@20 256 end -- if
contrebasse@20 257 end -- for
contrebasse@20 258 end -- function
contrebasse@20 259 hooksecurefunc("SelectTradeSkill",A.updateCounts)