| 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@2 | 49 			button:HookScript("OnClick", function(btn) A.ToggleMenu(btn, 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 | 
| contrebasse@0 | 146 	-- Toggles the reagent's menu | 
| contrebasse@2 | 147 	function A.ToggleMenu(button, index) | 
| contrebasse@0 | 148 		-- We want no modifiers | 
| contrebasse@0 | 149 		if IsModifierKeyDown() then return end | 
| contrebasse@0 | 150 | 
| contrebasse@2 | 151 		if A.menuIsOpen(button) then | 
| contrebasse@2 | 152 			A.menuClose() | 
| contrebasse@2 | 153 		else | 
| contrebasse@2 | 154 			local itemID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), index)) | 
| contrebasse@2 | 155 			if itemID and A.data[itemID] then | 
| contrebasse@2 | 156 				A.FillMenu(itemID) | 
| contrebasse@2 | 157 				A.menuOpen(button) | 
| contrebasse@2 | 158 			else | 
| contrebasse@2 | 159 				if A.menuIsOpen() then | 
| contrebasse@2 | 160 					A.menuClose() | 
| contrebasse@2 | 161 				end | 
| contrebasse@2 | 162 			end -- if | 
| contrebasse@0 | 163 		end -- if | 
| contrebasse@0 | 164 	end -- function | 
| contrebasse@0 | 165 end -- do | 
| contrebasse@0 | 166 | 
| contrebasse@0 | 167 do | 
| contrebasse@0 | 168 	-- Lua functions | 
| contrebasse@0 | 169 	local type = type | 
| contrebasse@0 | 170 | 
| contrebasse@0 | 171 	-- Wow functions | 
| contrebasse@0 | 172 	local GetItemInfo = GetItemInfo | 
| contrebasse@0 | 173 | 
| contrebasse@0 | 174 	-- persistent vars | 
| contrebasse@0 | 175 	local Minfo = {notCheckable = true, func = A.craft} | 
| contrebasse@0 | 176 | 
| contrebasse@0 | 177 	-- function to define the menu items | 
| contrebasse@1 | 178 	function A.FillMenu(itemID) | 
| contrebasse@0 | 179 		-- Title | 
| contrebasse@1 | 180 		--local itemName, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) | 
| contrebasse@1 | 181 		--Tinfo.text = "Make "..link.." with:" | 
| contrebasse@0 | 182 | 
| contrebasse@1 | 183 		-- Loop over the available reciepes | 
| contrebasse@1 | 184 		for spellID,reagents in pairs(A.data[itemID]) do | 
| contrebasse@0 | 185 			--name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink") | 
| contrebasse@0 | 186 			-- Right now, manage only sub-recipes with only one reagent | 
| contrebasse@0 | 187 			if type(reagents[1]) == "number" then | 
| contrebasse@0 | 188 				local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(reagents[1]) | 
| contrebasse@0 | 189 | 
| contrebasse@0 | 190 				if link then | 
| contrebasse@1 | 191 					local text = reagents[2].."x |T"..texture..":0|t "..link | 
| contrebasse@1 | 192 | 
| contrebasse@1 | 193 					if reagents.spell then | 
| contrebasse@1 | 194 						-- Special spell | 
| contrebasse@1 | 195 						--	Minfo.func = RunMacroText | 
| contrebasse@1 | 196 						--	Minfo.arg1 = reagents.spell..itemName | 
| contrebasse@1 | 197 						--	Minfo.arg2 = nil | 
| contrebasse@1 | 198 						A.menuAddItem(text,action,itemID) | 
| contrebasse@1 | 199 					else | 
| contrebasse@1 | 200 						-- Standard tradeskill spell | 
| contrebasse@1 | 201 						A.menuAddItem(text,A.craft,itemID) | 
| contrebasse@0 | 202 					end -- if | 
| contrebasse@0 | 203 				else | 
| contrebasse@0 | 204 					A.DEBUG("Erreur, objet inconnu :"..reagents[1]) | 
| contrebasse@0 | 205 				end -- if | 
| contrebasse@0 | 206 			end -- if | 
| contrebasse@0 | 207 		end -- for | 
| contrebasse@0 | 208 	end -- function | 
| contrebasse@0 | 209 end -- do | 
| contrebasse@0 | 210 | 
| contrebasse@0 | 211 | 
| contrebasse@0 | 212 --------------------------------------------------- | 
| contrebasse@0 | 213 -- Manage the tradeskill window state | 
| contrebasse@0 | 214 --------------------------------------------------- | 
| contrebasse@0 | 215 function A:SaveState() | 
| contrebasse@0 | 216 end | 
| contrebasse@0 | 217 | 
| contrebasse@0 | 218 function A:SetState(state) | 
| contrebasse@0 | 219 end | 
| contrebasse@0 | 220 | 
| contrebasse@0 | 221 function A:ExpandAll() | 
| contrebasse@0 | 222 end |