| 
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@3
 | 
    30 A.EventsFrame:SetScript("OnEvent", function(self, event, ...)
 | 
| 
contrebasse@3
 | 
    31 	if event == "TRADE_SKILL_UPDATE" then
 | 
| 
contrebasse@3
 | 
    32 		-- Scan availabe recipes
 | 
| 
contrebasse@3
 | 
    33 		A:ScanSimpleRecipes()
 | 
| 
contrebasse@3
 | 
    34 
 | 
| 
contrebasse@3
 | 
    35 		-- Close the external window if the tradeskill changed
 | 
| 
contrebasse@3
 | 
    36 		if A.currentTradeSkill ~= GetTradeSkillLine() then
 | 
| 
contrebasse@3
 | 
    37 			A.MenuFrame:Hide()
 | 
| 
contrebasse@3
 | 
    38 		end
 | 
| 
contrebasse@3
 | 
    39 	elseif event == "TRADE_SKILL_SHOW" then
 | 
| 
contrebasse@0
 | 
    40 		A:Initialize()
 | 
| 
contrebasse@0
 | 
    41 	end -- if
 | 
| 
contrebasse@3
 | 
    42 end) -- function
 | 
| 
contrebasse@0
 | 
    43 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW")
 | 
| 
contrebasse@3
 | 
    44 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE")
 | 
| 
contrebasse@0
 | 
    45 
 | 
| 
contrebasse@0
 | 
    46 ---------------------------------------------------
 | 
| 
contrebasse@0
 | 
    47 -- Initialize
 | 
| 
contrebasse@0
 | 
    48 ---------------------------------------------------
 | 
| 
contrebasse@1
 | 
    49 local toInitialize = true
 | 
| 
contrebasse@0
 | 
    50 function A:Initialize()
 | 
| 
contrebasse@3
 | 
    51 	A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW")
 | 
| 
contrebasse@0
 | 
    52 
 | 
| 
contrebasse@3
 | 
    53 	-- Register clics on reagent's buttons
 | 
| 
contrebasse@3
 | 
    54 	for i=1,7 do
 | 
| 
contrebasse@3
 | 
    55 		local btn = _G["TradeSkillReagent"..i];
 | 
| 
contrebasse@3
 | 
    56 		btn:HookScript("OnDoubleClick", A.ProcessReagent);
 | 
| 
contrebasse@3
 | 
    57 		btn:HookScript("OnEnter", A.btnEntered)
 | 
| 
contrebasse@3
 | 
    58 		btn:HookScript("OnLeave", A.btnLeft)
 | 
| 
contrebasse@3
 | 
    59 		btn.SplitStack = A.SplitStack
 | 
| 
contrebasse@1
 | 
    60 
 | 
| 
contrebasse@3
 | 
    61 		local textureHighlight = btn:CreateTexture()
 | 
| 
contrebasse@3
 | 
    62 		textureHighlight:Hide()
 | 
| 
contrebasse@3
 | 
    63 		textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight")
 | 
| 
contrebasse@3
 | 
    64 		textureHighlight:SetBlendMode("ADD")
 | 
| 
contrebasse@3
 | 
    65 		--textureHighlight:SetPoint("TOPLEFT")
 | 
| 
contrebasse@3
 | 
    66 		--textureHighlight:SetSize(btn:GetHeight(),btn:GetHeight())
 | 
| 
contrebasse@3
 | 
    67 		textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture")
 | 
| 
contrebasse@3
 | 
    68 		btn.textureHighlight = textureHighlight
 | 
| 
contrebasse@3
 | 
    69 
 | 
| 
contrebasse@3
 | 
    70 		local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight")
 | 
| 
contrebasse@3
 | 
    71 		label:SetSize(100,20)
 | 
| 
contrebasse@3
 | 
    72 		label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4)
 | 
| 
contrebasse@3
 | 
    73 		label:SetJustifyH("LEFT")
 | 
| 
contrebasse@3
 | 
    74 		label:SetJustifyV("TOP")
 | 
| 
contrebasse@3
 | 
    75 		label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
 | 
| 
contrebasse@3
 | 
    76 		btn.label = label
 | 
| 
contrebasse@3
 | 
    77 	end -- for
 | 
| 
contrebasse@3
 | 
    78 
 | 
| 
contrebasse@3
 | 
    79 	A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate")
 | 
| 
contrebasse@3
 | 
    80 	A.tooltipRecipe:SetFrameStrata("TOOLTIP")
 | 
| 
contrebasse@3
 | 
    81 	A.tooltipRecipe:Hide()
 | 
| 
contrebasse@3
 | 
    82 	A.tooltipReagent = CreateFrame("GameTooltip", "ReagentMaker_tooltipReagent",UIParent, "GameTooltipTemplate")
 | 
| 
contrebasse@3
 | 
    83 	A.tooltipReagent:SetFrameStrata("TOOLTIP")
 | 
| 
contrebasse@3
 | 
    84 	A.tooltipReagent:Hide()
 | 
| 
contrebasse@3
 | 
    85 end -- function
 | 
| 
contrebasse@3
 | 
    86 
 | 
| 
contrebasse@3
 | 
    87 
 | 
| 
contrebasse@3
 | 
    88 -- Function run avter selecting a item in the tradeskill window
 | 
| 
contrebasse@3
 | 
    89 function A.ProcessReagent(btn, ...)
 | 
| 
contrebasse@3
 | 
    90 	-- We want no modifiers, or shift to choose the number of reagent to craft
 | 
| 
contrebasse@3
 | 
    91 	if IsModifierKeyDown() and not IsShiftKeyDown() then return end
 | 
| 
contrebasse@3
 | 
    92 	local chooseNumberToCraft = IsShiftKeyDown()
 | 
| 
contrebasse@3
 | 
    93 
 | 
| 
contrebasse@3
 | 
    94 	-- Index of the reagent in the recipe, taken from the button name
 | 
| 
contrebasse@3
 | 
    95 	local reagentRecipeIndex = A.buttonNumber(btn)
 | 
| 
contrebasse@3
 | 
    96 
 | 
| 
contrebasse@3
 | 
    97 	-- ID of the reagent we want to craft
 | 
| 
contrebasse@3
 | 
    98 	local reagentID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex))
 | 
| 
contrebasse@3
 | 
    99 
 | 
| 
contrebasse@3
 | 
   100 	-- Continue only if the reagent is known
 | 
| 
contrebasse@3
 | 
   101 	if not reagentID or not A.data[reagentID] then return end
 | 
| 
contrebasse@3
 | 
   102 
 | 
| 
contrebasse@3
 | 
   103 	-- If only one recipe is known for the reagent, use it
 | 
| 
contrebasse@3
 | 
   104 	if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then
 | 
| 
contrebasse@3
 | 
   105 		local numMakable, reagentIndex = A.numMakable(reagentID)
 | 
| 
contrebasse@3
 | 
   106 		if numMakable>0 then
 | 
| 
contrebasse@3
 | 
   107 			A.craft(reagentID,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft)
 | 
| 
contrebasse@3
 | 
   108 			return
 | 
| 
contrebasse@3
 | 
   109 		end
 | 
| 
contrebasse@3
 | 
   110 		-- If we can make the item needed to make the reagent, open a window to make it
 | 
| 
contrebasse@3
 | 
   111 		-- one step recursion, enables to mill to create an ink
 | 
| 
contrebasse@3
 | 
   112 		if A.data[A.data[reagentID][1][1]] then
 | 
| 
contrebasse@3
 | 
   113 			A.externalCraftWindow(A.data[reagentID][1][1])
 | 
| 
contrebasse@3
 | 
   114 		else
 | 
| 
contrebasse@3
 | 
   115 			print("Sorry, can not make reagent...")
 | 
| 
contrebasse@3
 | 
   116 		end
 | 
| 
contrebasse@3
 | 
   117 	else
 | 
| 
contrebasse@3
 | 
   118 		A.externalCraftWindow(reagentID)
 | 
| 
contrebasse@0
 | 
   119 	end -- if
 | 
| 
contrebasse@0
 | 
   120 end -- function
 | 
| 
contrebasse@0
 | 
   121 
 | 
| 
contrebasse@0
 | 
   122 
 | 
| 
contrebasse@0
 | 
   123 ---------------------------------------------------
 | 
| 
contrebasse@0
 | 
   124 -- Craft items
 | 
| 
contrebasse@0
 | 
   125 ---------------------------------------------------
 | 
| 
contrebasse@3
 | 
   126 -- function used after choosing the number of reagent to craft
 | 
| 
contrebasse@3
 | 
   127 function A.SplitStack(owner,split)
 | 
| 
contrebasse@3
 | 
   128 	DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split))
 | 
| 
contrebasse@3
 | 
   129 	owner.ReagentMaker_reagentIndex = nil
 | 
| 
contrebasse@0
 | 
   130 end
 | 
| 
contrebasse@0
 | 
   131 
 | 
| 
contrebasse@3
 | 
   132 -- Craft the reagent of an item, given it's position in the recipe
 | 
| 
contrebasse@3
 | 
   133 function A.craft(reagentID,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber)
 | 
| 
contrebasse@3
 | 
   134 	-- Look at how many we need to make one item for the selected recipe
 | 
| 
contrebasse@3
 | 
   135 	local numToMake = 1
 | 
| 
contrebasse@3
 | 
   136 	local selectedIndex = GetTradeSkillSelectionIndex()
 | 
| 
contrebasse@3
 | 
   137 	local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(selectedIndex)
 | 
| 
contrebasse@3
 | 
   138 	if numAvailable==0 then
 | 
| 
contrebasse@3
 | 
   139 		local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(selectedIndex, reagentRecipeIndex)
 | 
| 
contrebasse@3
 | 
   140 		numToMake = math.min(reagentCount - playerReagentCount,numReagentMakable)
 | 
| 
contrebasse@3
 | 
   141 	end -- if
 | 
| 
contrebasse@0
 | 
   142 
 | 
| 
contrebasse@3
 | 
   143 	-- Choose number or craft directly
 | 
| 
contrebasse@3
 | 
   144 	if chooseNumber and numReagentMakable>1 then
 | 
| 
contrebasse@3
 | 
   145 		-- the dialog window is linked to the reagent button
 | 
| 
contrebasse@3
 | 
   146 		local btn = _G["TradeSkillReagent"..reagentRecipeIndex]
 | 
| 
contrebasse@3
 | 
   147 
 | 
| 
contrebasse@3
 | 
   148 		-- Store info to be able to run the function later
 | 
| 
contrebasse@3
 | 
   149 		btn.ReagentMaker_reagentIndex = reagentIndex
 | 
| 
contrebasse@3
 | 
   150 
 | 
| 
contrebasse@3
 | 
   151 		-- Open dialog
 | 
| 
contrebasse@3
 | 
   152 		OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM")
 | 
| 
contrebasse@3
 | 
   153 
 | 
| 
contrebasse@3
 | 
   154 		-- Fill in the number to make
 | 
| 
contrebasse@3
 | 
   155 		numToMake = tostring(numToMake)
 | 
| 
contrebasse@3
 | 
   156 		for i = 1,numToMake:len() do
 | 
| 
contrebasse@3
 | 
   157 			StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i))
 | 
| 
contrebasse@3
 | 
   158 		end
 | 
| 
contrebasse@3
 | 
   159 		StackSplitFrame.typing = 0 -- reinit the frame so tha the entered value will be erased on text entry
 | 
| 
contrebasse@3
 | 
   160 	else
 | 
| 
contrebasse@3
 | 
   161 		DoTradeSkill(reagentIndex,numToMake)
 | 
| 
contrebasse@3
 | 
   162 	end -- if
 | 
| 
contrebasse@3
 | 
   163 end -- function
 | 
| 
contrebasse@3
 | 
   164 
 | 
| 
contrebasse@3
 | 
   165 
 | 
| 
contrebasse@3
 | 
   166 -- Button hovering
 | 
| 
contrebasse@3
 | 
   167 function A.btnEntered(btn)
 | 
| 
contrebasse@3
 | 
   168 	-- Index of the reagent in the recipe, taken from the button name
 | 
| 
contrebasse@3
 | 
   169 	local reagentRecipeIndex = A.buttonNumber(btn)
 | 
| 
contrebasse@3
 | 
   170 
 | 
| 
contrebasse@3
 | 
   171 	-- ID of the reagent we want to craft
 | 
| 
contrebasse@3
 | 
   172 	local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)
 | 
| 
contrebasse@3
 | 
   173 	local reagentID = A.link2ID(reagentLink)
 | 
| 
contrebasse@3
 | 
   174 
 | 
| 
contrebasse@3
 | 
   175 	-- Continue only if the reagent is known
 | 
| 
contrebasse@3
 | 
   176 	if not reagentID or not A.data[reagentID] then return end
 | 
| 
contrebasse@3
 | 
   177 
 | 
| 
contrebasse@3
 | 
   178 	btn.textureHighlight:Show()
 | 
| 
contrebasse@3
 | 
   179 
 | 
| 
contrebasse@3
 | 
   180 	if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then
 | 
| 
contrebasse@3
 | 
   181 		local numMakable = A.numMakable(reagentID)
 | 
| 
contrebasse@3
 | 
   182 		btn.label:SetText(numMakable)
 | 
| 
contrebasse@3
 | 
   183 		if numMakable==0 then
 | 
| 
contrebasse@3
 | 
   184 			btn.label:SetTextColor(1, 0, 0, 1)
 | 
| 
contrebasse@3
 | 
   185 		else
 | 
| 
contrebasse@3
 | 
   186 			btn.label:SetTextColor(0, 5, 0, 1)
 | 
| 
contrebasse@3
 | 
   187 		end
 | 
| 
contrebasse@3
 | 
   188 		btn.label:Show()
 | 
| 
contrebasse@0
 | 
   189 	end
 | 
| 
contrebasse@0
 | 
   190 
 | 
| 
contrebasse@5
 | 
   191 	-- Tooltips
 | 
| 
contrebasse@3
 | 
   192 	A.tooltipRecipe:SetOwner(btn)
 | 
| 
contrebasse@3
 | 
   193 	A.tooltipRecipe:SetHyperlink(GetTradeSkillRecipeLink(A.findSkillIndex(reagentID)))
 | 
| 
contrebasse@5
 | 
   194 	A.tooltipRecipe:Show()
 | 
| 
contrebasse@3
 | 
   195 	A.tooltipRecipe:ClearAllPoints()
 | 
| 
contrebasse@5
 | 
   196 	--A.tooltipRecipe:SetPoint("TOPLEFT",btn,"TOPRIGHT")
 | 
| 
contrebasse@5
 | 
   197 	A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT")
 | 
| 
contrebasse@5
 | 
   198 
 | 
| 
contrebasse@5
 | 
   199 	A.tooltipReagent:SetOwner(A.tooltipRecipe)
 | 
| 
contrebasse@5
 | 
   200 	local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(A.data[reagentID][1][1])
 | 
| 
contrebasse@5
 | 
   201 	A.tooltipReagent:SetHyperlink(link)
 | 
| 
contrebasse@5
 | 
   202 	A.tooltipReagent:Show()
 | 
| 
contrebasse@3
 | 
   203 	A.tooltipReagent:ClearAllPoints()
 | 
| 
contrebasse@5
 | 
   204 	A.tooltipReagent:SetPoint("BOTTOMLEFT",A.tooltipRecipe,"BOTTOMRIGHT")
 | 
| 
contrebasse@0
 | 
   205 end
 | 
| 
contrebasse@0
 | 
   206 
 | 
| 
contrebasse@3
 | 
   207 function A.btnLeft(btn)
 | 
| 
contrebasse@3
 | 
   208 	btn.textureHighlight:Hide()
 | 
| 
contrebasse@3
 | 
   209 	btn.label:Hide()
 | 
| 
contrebasse@3
 | 
   210 	A.tooltipRecipe:Hide()
 | 
| 
contrebasse@3
 | 
   211 	A.tooltipReagent:Hide()
 | 
| 
contrebasse@0
 | 
   212 end
 |