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