| 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 |