annotate ReagentMaker.lua @ 0:eba26c900e99

Initial commit, save state before using secure menus
author contrebasse
date Mon, 28 Mar 2011 22:32:26 +0200
parents
children 5fc29ed07094
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@0 41 function A:Initialize()
contrebasse@0 42 -- This part is done the first time only
contrebasse@0 43 if not self.MenuFrame then
contrebasse@0 44 -- Prepare the menu
contrebasse@0 45 self.MenuFrame = CreateFrame("Frame", "ReagentMakerDropDownMenu"); -- Needs a global name
contrebasse@0 46 self.MenuFrame.displayMode = "MENU";
contrebasse@0 47 self.MenuFrame.initialize = self.FillMenu;
contrebasse@0 48 self.MenuFrame.point = "TOPLEFT";
contrebasse@0 49 self.MenuFrame.relativePoint = "TOPRIGHT";
contrebasse@0 50
contrebasse@0 51 -- Register clics on reagent's buttons
contrebasse@0 52 for i=1,7 do
contrebasse@0 53 local button = _G["TradeSkillReagent"..i];
contrebasse@0 54 button:HookScript("OnClick", function() self:ToggleMenu(button, i) end);
contrebasse@0 55 --button:HookScript("OnEnter", function() self:Entered(button, i) end)
contrebasse@0 56 --button:HookScript("OnLeave", function() self:Left(button, i) end)
contrebasse@0 57 end -- for
contrebasse@0 58 end -- if
contrebasse@0 59
contrebasse@0 60 -- Scan availabe recipes
contrebasse@0 61 A:ScanSimpleRecipes()
contrebasse@0 62 end -- function
contrebasse@0 63
contrebasse@0 64
contrebasse@0 65 ---------------------------------------------------
contrebasse@0 66 -- Craft items
contrebasse@0 67 ---------------------------------------------------
contrebasse@0 68 do
contrebasse@0 69 -- WoW functions
contrebasse@0 70 local GetNumTradeSkills = GetNumTradeSkills
contrebasse@0 71 local GetTradeSkillInfo = GetTradeSkillInfo
contrebasse@0 72 local GetTradeSkillItemLink = GetTradeSkillItemLink
contrebasse@0 73
contrebasse@0 74
contrebasse@0 75 function A.findSkillIndex(itemID)
contrebasse@0 76 for i = 1,GetNumTradeSkills() do
contrebasse@0 77 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(i)
contrebasse@0 78 if skillType == "header" then
contrebasse@0 79 else
contrebasse@0 80 if skillName then
contrebasse@0 81 local ID = A.link2ID(GetTradeSkillItemLink(i))
contrebasse@0 82 if ID and ID == itemID then
contrebasse@0 83 return i
contrebasse@0 84 end -- if
contrebasse@0 85 end -- if
contrebasse@0 86 end -- if
contrebasse@0 87 end -- for
contrebasse@0 88 A.DEBUG("Tradeskill not found")
contrebasse@0 89 end -- function
contrebasse@0 90 end -- do
contrebasse@0 91
contrebasse@0 92
contrebasse@0 93 -- http://www.wowwiki.com/RunSlashCmd
contrebasse@0 94 local _G = _G
contrebasse@0 95 function RunSlashCmd(cmd)
contrebasse@0 96 local slash, rest = cmd:match("^(%S+)%s*(.-)$")
contrebasse@0 97 for name, func in pairs(SlashCmdList) do
contrebasse@0 98 local i, slashCmd = 1
contrebasse@0 99 repeat
contrebasse@0 100 slashCmd, i = _G["SLASH_"..name..i], i + 1
contrebasse@0 101 if slashCmd == slash then
contrebasse@0 102 A.DEBUG("Spell found !")
contrebasse@0 103 return true, func(rest)
contrebasse@0 104 end
contrebasse@0 105 until not slashCmd
contrebasse@0 106 end
contrebasse@0 107 A.DEBUG("Spell not found :(")
contrebasse@0 108 end
contrebasse@0 109
contrebasse@0 110 do
contrebasse@0 111 -- WoW functions
contrebasse@0 112 local DoTradeSkill = DoTradeSkill
contrebasse@0 113
contrebasse@0 114 local function SplitStack(owner,split)
contrebasse@0 115 DoTradeSkill(owner.ReagentMakerIndex,tonumber(split))
contrebasse@0 116 end
contrebasse@0 117
contrebasse@0 118 function A.craft(self,itemID, spell)
contrebasse@0 119 -- self is the menu entry
contrebasse@0 120 if spell then
contrebasse@0 121 CastSpellByName("Mouture")
contrebasse@0 122 RunSlashCmd(spell) --CastSpellByName(spell)
contrebasse@0 123 --RunSlashCmd("/use "..itemID) --CastSpellByName("/use "..itemID)
contrebasse@0 124 return
contrebasse@0 125 end
contrebasse@0 126 local index = A.findSkillIndex(itemID)
contrebasse@0 127 if index then
contrebasse@0 128 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(index)
contrebasse@0 129 if IsShiftKeyDown() and numAvailable>1 and not spell then
contrebasse@0 130 if not self.SplitStack then
contrebasse@0 131 self.SplitStack = SplitStack
contrebasse@0 132 end
contrebasse@0 133 self.ReagentMakerIndex = index
contrebasse@0 134
contrebasse@0 135 OpenStackSplitFrame(numAvailable, self, "TOPLEFT", "TOPRIGHT")
contrebasse@0 136 else
contrebasse@0 137 DoTradeSkill(index,1)
contrebasse@0 138 end
contrebasse@0 139 end
contrebasse@0 140 end -- function
contrebasse@0 141 end -- do
contrebasse@0 142
contrebasse@0 143
contrebasse@0 144 ---------------------------------------------------
contrebasse@0 145 -- Manage the popup menu
contrebasse@0 146 ---------------------------------------------------
contrebasse@0 147 do
contrebasse@0 148 -- Lua functions
contrebasse@0 149 local tonumber = tonumber
contrebasse@0 150
contrebasse@0 151 -- WoW functions
contrebasse@0 152 local IsModifierKeyDown = IsModifierKeyDown
contrebasse@0 153 local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink
contrebasse@0 154 local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex
contrebasse@0 155 local ToggleDropDownMenu = ToggleDropDownMenu
contrebasse@0 156
contrebasse@0 157 -- Toggles the reagent's menu
contrebasse@0 158 function A:ToggleMenu(button, index)
contrebasse@0 159 -- We want no modifiers
contrebasse@0 160 if IsModifierKeyDown() then return end
contrebasse@0 161
contrebasse@0 162 local itemID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), index))
contrebasse@0 163 if itemID and A.data[itemID] then
contrebasse@0 164 self.MenuFrame.ReagentMakerItemID = itemID
contrebasse@0 165 ToggleDropDownMenu(1, nil, A.MenuFrame, button,-4,0)
contrebasse@0 166 end -- if
contrebasse@0 167 end -- function
contrebasse@0 168 end -- do
contrebasse@0 169
contrebasse@0 170 do
contrebasse@0 171 -- Lua functions
contrebasse@0 172 local type = type
contrebasse@0 173
contrebasse@0 174 -- Wow functions
contrebasse@0 175 local GetItemInfo = GetItemInfo
contrebasse@0 176 local UIDropDownMenu_AddButton = UIDropDownMenu_AddButton
contrebasse@0 177
contrebasse@0 178 -- persistent vars
contrebasse@0 179 local Minfo = {notCheckable = true, func = A.craft}
contrebasse@0 180 local Tinfo = {notCheckable = true, isTitle = true}
contrebasse@0 181
contrebasse@0 182 -- function to define the menu items
contrebasse@0 183 function A.FillMenu(self, level)
contrebasse@0 184 -- Title
contrebasse@0 185 local itemName, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(self.ReagentMakerItemID)
contrebasse@0 186 Tinfo.text = "Make "..link.." with:"
contrebasse@0 187 UIDropDownMenu_AddButton(Tinfo,level)
contrebasse@0 188
contrebasse@0 189 -- Loop over the availible reciepes
contrebasse@0 190 for spellID,reagents in pairs(A.data[self.ReagentMakerItemID]) do
contrebasse@0 191 --name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink")
contrebasse@0 192 -- Right now, manage only sub-recipes with only one reagent
contrebasse@0 193 if type(reagents[1]) == "number" then
contrebasse@0 194 local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(reagents[1])
contrebasse@0 195
contrebasse@0 196 if link then
contrebasse@0 197 Minfo.text = "|T"..texture..":0|t "..link
contrebasse@0 198 if #reagents>1 and reagents[2] > 1 then
contrebasse@0 199 Minfo.text = reagents[2].."x "..Minfo.text
contrebasse@0 200 end -- if
contrebasse@0 201
contrebasse@0 202 --if reagents.spell then
contrebasse@0 203 -- Minfo.func = RunMacroText
contrebasse@0 204 -- Minfo.arg1 = reagents.spell..itemName
contrebasse@0 205 -- Minfo.arg2 = nil
contrebasse@0 206 --else
contrebasse@0 207 Minfo.func = A.craft
contrebasse@0 208 Minfo.arg1 = self.ReagentMakerItemID
contrebasse@0 209 Minfo.arg2 = reagents.spell
contrebasse@0 210 --end -- if
contrebasse@0 211 UIDropDownMenu_AddButton(Minfo,level)
contrebasse@0 212 else
contrebasse@0 213 A.DEBUG("Erreur, objet inconnu :"..reagents[1])
contrebasse@0 214 end -- if
contrebasse@0 215 end -- if
contrebasse@0 216 end -- for
contrebasse@0 217 end -- function
contrebasse@0 218 end -- do
contrebasse@0 219
contrebasse@0 220
contrebasse@0 221 ---------------------------------------------------
contrebasse@0 222 -- Manage the tradeskill window state
contrebasse@0 223 ---------------------------------------------------
contrebasse@0 224 function A:SaveState()
contrebasse@0 225 end
contrebasse@0 226
contrebasse@0 227 function A:SetState(state)
contrebasse@0 228 end
contrebasse@0 229
contrebasse@0 230 function A:ExpandAll()
contrebasse@0 231 end