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