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