annotate ReagentMaker.lua @ 1:5fc29ed07094

First atempt at using secure menus, it doesn't open yet...
author contrebasse
date Mon, 28 Mar 2011 22:59:20 +0200
parents eba26c900e99
children 04c5b817eead
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 add support for sub-recipes (like ink plus milling)
contrebasse@0 6 -- @todo show a tooltip
contrebasse@0 7 -- @todo show number of craftable items
contrebasse@0 8 -- @todo show owned items
contrebasse@0 9 -- @todo add support for dez ?
contrebasse@0 10 -- @todo add support for cross tradeskill, like mining + forge/ingé
contrebasse@0 11 -- @todo icon on reagent's button
contrebasse@0 12
contrebasse@0 13 ---------------------------------------------------
contrebasse@0 14 -- Variables
contrebasse@0 15 ---------------------------------------------------
contrebasse@0 16 -- Used by findglobals
contrebasse@0 17 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME
contrebasse@0 18
contrebasse@0 19 -- Lua functions
contrebasse@0 20
contrebasse@0 21 -- Wow functions
contrebasse@0 22
contrebasse@0 23 -- constant vars
contrebasse@0 24
contrebasse@0 25 ---------------------------------------------------
contrebasse@0 26 -- Manage events
contrebasse@0 27 ---------------------------------------------------
contrebasse@0 28 A.EventsFrame = CreateFrame("Frame")
contrebasse@0 29
contrebasse@0 30 A.EventsFrame:SetScript("OnEvent", function(self, event)
contrebasse@0 31 if event == "TRADE_SKILL_SHOW" then
contrebasse@0 32 A:Initialize()
contrebasse@0 33 end -- if
contrebasse@0 34 end); -- function
contrebasse@0 35 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW")
contrebasse@0 36
contrebasse@0 37
contrebasse@0 38 ---------------------------------------------------
contrebasse@0 39 -- Initialize
contrebasse@0 40 ---------------------------------------------------
contrebasse@1 41 local toInitialize = true
contrebasse@0 42 function A:Initialize()
contrebasse@0 43 -- This part is done the first time only
contrebasse@1 44 if toInitialize then
contrebasse@0 45
contrebasse@0 46 -- Register clics on reagent's buttons
contrebasse@0 47 for i=1,7 do
contrebasse@0 48 local button = _G["TradeSkillReagent"..i];
contrebasse@0 49 button:HookScript("OnClick", function() self:ToggleMenu(button, i) end);
contrebasse@0 50 --button:HookScript("OnEnter", function() self:Entered(button, i) end)
contrebasse@0 51 --button:HookScript("OnLeave", function() self:Left(button, i) end)
contrebasse@0 52 end -- for
contrebasse@1 53
contrebasse@1 54 toInitialize = nil
contrebasse@0 55 end -- if
contrebasse@0 56
contrebasse@0 57 -- Scan availabe recipes
contrebasse@0 58 A:ScanSimpleRecipes()
contrebasse@0 59 end -- function
contrebasse@0 60
contrebasse@0 61
contrebasse@0 62 ---------------------------------------------------
contrebasse@0 63 -- Craft items
contrebasse@0 64 ---------------------------------------------------
contrebasse@0 65 do
contrebasse@0 66 -- WoW functions
contrebasse@0 67 local GetNumTradeSkills = GetNumTradeSkills
contrebasse@0 68 local GetTradeSkillInfo = GetTradeSkillInfo
contrebasse@0 69 local GetTradeSkillItemLink = GetTradeSkillItemLink
contrebasse@0 70
contrebasse@0 71
contrebasse@0 72 function A.findSkillIndex(itemID)
contrebasse@0 73 for i = 1,GetNumTradeSkills() do
contrebasse@0 74 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(i)
contrebasse@0 75 if skillType == "header" then
contrebasse@0 76 else
contrebasse@0 77 if skillName then
contrebasse@0 78 local ID = A.link2ID(GetTradeSkillItemLink(i))
contrebasse@0 79 if ID and ID == itemID then
contrebasse@0 80 return i
contrebasse@0 81 end -- if
contrebasse@0 82 end -- if
contrebasse@0 83 end -- if
contrebasse@0 84 end -- for
contrebasse@0 85 A.DEBUG("Tradeskill not found")
contrebasse@0 86 end -- function
contrebasse@0 87 end -- do
contrebasse@0 88
contrebasse@0 89
contrebasse@0 90 -- http://www.wowwiki.com/RunSlashCmd
contrebasse@0 91 local _G = _G
contrebasse@0 92 function RunSlashCmd(cmd)
contrebasse@0 93 local slash, rest = cmd:match("^(%S+)%s*(.-)$")
contrebasse@0 94 for name, func in pairs(SlashCmdList) do
contrebasse@0 95 local i, slashCmd = 1
contrebasse@0 96 repeat
contrebasse@0 97 slashCmd, i = _G["SLASH_"..name..i], i + 1
contrebasse@0 98 if slashCmd == slash then
contrebasse@0 99 A.DEBUG("Spell found !")
contrebasse@0 100 return true, func(rest)
contrebasse@0 101 end
contrebasse@0 102 until not slashCmd
contrebasse@0 103 end
contrebasse@0 104 A.DEBUG("Spell not found :(")
contrebasse@0 105 end
contrebasse@0 106
contrebasse@0 107 do
contrebasse@0 108 -- WoW functions
contrebasse@0 109 local DoTradeSkill = DoTradeSkill
contrebasse@0 110
contrebasse@0 111 local function SplitStack(owner,split)
contrebasse@0 112 DoTradeSkill(owner.ReagentMakerIndex,tonumber(split))
contrebasse@0 113 end
contrebasse@0 114
contrebasse@1 115 function A.craft(btn,...)
contrebasse@1 116 local index = A.findSkillIndex(btn:GetAttribute(target-item))
contrebasse@0 117 if index then
contrebasse@0 118 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(index)
contrebasse@0 119 if IsShiftKeyDown() and numAvailable>1 and not spell then
contrebasse@1 120 if not btn.SplitStack then
contrebasse@1 121 btn.SplitStack = SplitStack
contrebasse@0 122 end
contrebasse@1 123 btn.ReagentMakerIndex = index
contrebasse@0 124
contrebasse@1 125 OpenStackSplitFrame(numAvailable, btn, "TOPLEFT", "TOPRIGHT")
contrebasse@0 126 else
contrebasse@0 127 DoTradeSkill(index,1)
contrebasse@0 128 end
contrebasse@0 129 end
contrebasse@0 130 end -- function
contrebasse@0 131 end -- do
contrebasse@0 132
contrebasse@0 133
contrebasse@0 134 ---------------------------------------------------
contrebasse@0 135 -- Manage the popup menu
contrebasse@0 136 ---------------------------------------------------
contrebasse@0 137 do
contrebasse@0 138 -- Lua functions
contrebasse@0 139 local tonumber = tonumber
contrebasse@0 140
contrebasse@0 141 -- WoW functions
contrebasse@0 142 local IsModifierKeyDown = IsModifierKeyDown
contrebasse@0 143 local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink
contrebasse@0 144 local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex
contrebasse@0 145 local ToggleDropDownMenu = ToggleDropDownMenu
contrebasse@0 146
contrebasse@0 147 -- Toggles the reagent's menu
contrebasse@0 148 function A:ToggleMenu(button, index)
contrebasse@0 149 -- We want no modifiers
contrebasse@0 150 if IsModifierKeyDown() then return end
contrebasse@0 151
contrebasse@0 152 local itemID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), index))
contrebasse@0 153 if itemID and A.data[itemID] then
contrebasse@1 154 A.FillMenu(itemID)
contrebasse@1 155 A.menuOpen(button)
contrebasse@0 156 end -- if
contrebasse@0 157 end -- function
contrebasse@0 158 end -- do
contrebasse@0 159
contrebasse@0 160 do
contrebasse@0 161 -- Lua functions
contrebasse@0 162 local type = type
contrebasse@0 163
contrebasse@0 164 -- Wow functions
contrebasse@0 165 local GetItemInfo = GetItemInfo
contrebasse@0 166
contrebasse@0 167 -- persistent vars
contrebasse@0 168 local Minfo = {notCheckable = true, func = A.craft}
contrebasse@0 169
contrebasse@0 170 -- function to define the menu items
contrebasse@1 171 function A.FillMenu(itemID)
contrebasse@0 172 -- Title
contrebasse@1 173 --local itemName, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID)
contrebasse@1 174 --Tinfo.text = "Make "..link.." with:"
contrebasse@0 175
contrebasse@1 176 -- Loop over the available reciepes
contrebasse@1 177 for spellID,reagents in pairs(A.data[itemID]) do
contrebasse@0 178 --name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink")
contrebasse@0 179 -- Right now, manage only sub-recipes with only one reagent
contrebasse@0 180 if type(reagents[1]) == "number" then
contrebasse@0 181 local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(reagents[1])
contrebasse@0 182
contrebasse@0 183 if link then
contrebasse@1 184 local text = reagents[2].."x |T"..texture..":0|t "..link
contrebasse@1 185
contrebasse@1 186 if reagents.spell then
contrebasse@1 187 -- Special spell
contrebasse@1 188 -- Minfo.func = RunMacroText
contrebasse@1 189 -- Minfo.arg1 = reagents.spell..itemName
contrebasse@1 190 -- Minfo.arg2 = nil
contrebasse@1 191 A.menuAddItem(text,action,itemID)
contrebasse@1 192 else
contrebasse@1 193 -- Standard tradeskill spell
contrebasse@1 194 A.menuAddItem(text,A.craft,itemID)
contrebasse@0 195 end -- if
contrebasse@0 196 else
contrebasse@0 197 A.DEBUG("Erreur, objet inconnu :"..reagents[1])
contrebasse@0 198 end -- if
contrebasse@0 199 end -- if
contrebasse@0 200 end -- for
contrebasse@0 201 end -- function
contrebasse@0 202 end -- do
contrebasse@0 203
contrebasse@0 204
contrebasse@0 205 ---------------------------------------------------
contrebasse@0 206 -- Manage the tradeskill window state
contrebasse@0 207 ---------------------------------------------------
contrebasse@0 208 function A:SaveState()
contrebasse@0 209 end
contrebasse@0 210
contrebasse@0 211 function A:SetState(state)
contrebasse@0 212 end
contrebasse@0 213
contrebasse@0 214 function A:ExpandAll()
contrebasse@0 215 end