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