diff ReagentMaker.lua @ 111:af23986010ef v1.1beta0

Rewrote the main part to clarify things, should have removed some hidden nasty bugs.
author contrebasse
date Thu, 02 Jun 2011 23:07:23 +0200
parents d60d6b4cab0c
children c79ab5443ee5
line wrap: on
line diff
--- a/ReagentMaker.lua	Thu Jun 02 18:23:42 2011 +0200
+++ b/ReagentMaker.lua	Thu Jun 02 23:07:23 2011 +0200
@@ -1,30 +1,33 @@
 local addonName, A = ...
 
--- @todo clean the A table
--- @todo check local copy of globals functions
+-- @todo add support for cross tradeskill, like mining + forge/ingé
 -- @todo add support for dez ?
--- @todo add support for hidden recipes, removing filtering => save the reagent count to be able to compute the number of craftable items
--- @todo add support for cross tradeskill, like mining + forge/ingé
--- @todo when a reagent can not be crafted and the recipe has many reagents, do like ReverseEngeneering and go to this recipe (with a one step return button)
--- @todo scroll to the selected recipe on opening (usefull also for the previous todo)
--- @todo shift+clic on a reagent name while the serachbar is focused fills the serachbar with the reagent name (idem with the crafted item)
--- @todo add a button to clear search
--- @todo add a button to cast a campfire when coocking
+-- @todo scroll to the selected recipe on opening ?
+-- @todo add a button to clear search ?
+
+-- @bug Enter when choosing number of crafts
 
 ---------------------------------------------------
 -- Variables
 ---------------------------------------------------
 -- Used by findglobals
--- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME
+-- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME, UIParent
 
 -- Lua functions
 
 -- Wow functions
+local GetTradeSkillLine = GetTradeSkillLine
+local IsTradeSkillGuild = IsTradeSkillGuild
+local IsTradeSkillLinked = IsTradeSkillLinked
+local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex
+local GetTradeSkillNumReagents = GetTradeSkillNumReagents
+local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink
 
 -- constant vars
+local GameTooltip = GameTooltip
 
 ---------------------------------------------------
--- Manage events
+-- Manage events and throttling
 ---------------------------------------------------
 A.EventsFrame = CreateFrame("Frame")
 
@@ -63,6 +66,7 @@
 
 	elseif event == "PLAYER_REGEN_DISABLED" then
 		A.HideCampFireBtn()
+
 	elseif event == "PLAYER_REGEN_ENABLED" then
 		A.ManageCampFireBtn()
 
@@ -71,11 +75,14 @@
 		A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW")
 	end -- if
 end) -- function
+
+--@todo Unregister events when not needed
 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW")
 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE")
 A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
 A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
 
+
 ---------------------------------------------------
 -- Initialize
 ---------------------------------------------------
@@ -115,136 +122,19 @@
 	A.LoadEnchantOnScroll()
 end -- function
 
--- Function run after selecting a item in the tradeskill window
-function A.ProcessReagent(btn, ...)
-	--SPELL_FAILED_REAGENTS = "Missing reagent: %s";
-	--ERR_SPELL_FAILED_REAGENTS_GENERIC = "Missing reagent";
-	--ERR_INTERNAL_BAG_ERROR = "Internal Bag Error";
-	--SPELL_FAILED_ERROR = "Internal error";
-
-	-- Do not manage guild tradeskill
-	if IsTradeSkillGuild() or IsTradeSkillLinked() then return end
-
-	-- We want no modifiers, or shift to choose the number of reagent to craft
-	if IsModifierKeyDown() and not IsShiftKeyDown() then return end
-	local chooseNumberToCraft = IsShiftKeyDown()
-
-	-- Index of the reagent in the recipe, taken from the button name
-	local reagentRecipeIndex = A.buttonNumber(btn)
-
-	-- ID of the reagent we want to craft
-	local recipeIndex = GetTradeSkillSelectionIndex()
-	local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex))
-
-	-- Continue only if the reagent is known
-	if not reagentID or not A.data[reagentID] then return end
-
-	-- If only one recipe is known for the reagent, use it
-	if #(A.data[reagentID]) == 1 and not A.data[reagentID][1].macro then
-		if A.data[reagentID][1].tradeskillName and A.data[reagentID][1].tradeskillName ~= GetTradeSkillLine() then
-			A.Error(A.L["The recipe to make this reagent is in another tradeskill. Currently ReagentMaker can not manage such a case, sorry."])
-			return
-		end
-
-		local reagentIndex = A.findSkillIndex(reagentID) -- finds only the first recipe that creates the reagent, should check recipe name too
-
-		-- Try to show the recipe by removing filters once if it was not found
-		if not reagentIndex then
-			A.SaveActiveFilters(A.data[reagentID][1].header)
-			reagentIndex = A.findSkillIndex(reagentID)
-		end
-		if not reagentIndex then
-			A.Error(A.L["The recipe to make the reagent seems to be hidden, it is not makable. Try to remove the filters on the recipes."])
-			A.RestoreActiveFilters()
-			return
-		end
-
-		local numMakable = A.numMakable(reagentID)
-		if not numMakable then
-			A.Error(A.L["There was a problem while retrieving informations, please retry."])
-			A.RestoreActiveFilters()
-			return
-		end
-		if numMakable>0 then
-			A.craft(recipeIndex,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft)
-			A.RestoreActiveFilters()
-			return
-		end
-
-		-- If we can make the item needed to make the reagent, open a window to make it
-		-- one step recursion, enables to mill to create an ink
-		if A.data[reagentID][1][1] and A.data[A.data[reagentID][1][1]] then
-			if A.externalCraftWindow(A.data[reagentID][1][1],reagentID) ~= false then
-				A.RestoreActiveFilters()
-				return
-			end
-		end
-
-		A.Error(A.L["You do not have enough reagents to craft [%s]"]:format(GetItemInfo(reagentID) or "item #"..reagentID))
-		A.RestoreActiveFilters()
-		return
-	else
-		A.externalCraftWindow(reagentID)
-	end -- if
-	--A.RestoreActiveFilters()
-end -- function
-
-
 ---------------------------------------------------
--- Craft items
+-- Dynamic display
 ---------------------------------------------------
--- function used after choosing the number of reagent to craft
-function A.SplitStack(owner,split)
-	DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split))
-	owner.ReagentMaker_reagentIndex = nil
-end
-
--- Craft the reagent of an item, given it's position in the recipe
-function A.craft(recipeIndex,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber)
-	-- Look at how many we need to make one item for the selected recipe
-	local numToMake = 1
-	local _, _, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(recipeIndex, reagentRecipeIndex)
-	-- make enough reagents to craft one more item
-	numToMake = math.min(math.floor(playerReagentCount/reagentCount+1)*reagentCount-playerReagentCount,numReagentMakable)
-
-	-- take into account that some recipe craft more than one item
-	-- use the mean between min and max, but make at least one...
-	local minMade, maxMade = GetTradeSkillNumMade(reagentIndex)
-	numToMake = math.max(math.floor(2*numToMake/(maxMade+minMade)),1)
-
-	-- Choose number or craft directly
-	if chooseNumber then
-		-- the dialog window is linked to the reagent button
-		local btn = _G["TradeSkillReagent"..reagentRecipeIndex]
-
-		-- Store info to be able to run the function later
-		btn.ReagentMaker_reagentIndex = reagentIndex
-
-		-- Open dialog
-		OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM")
-
-		-- Fill in the number to make
-		numToMake = tostring(numToMake)
-		for i = 1,numToMake:len() do
-			StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i))
-		end
-		StackSplitFrame.typing = 0 -- reinit the frame so that the entered value will be erased on text entry
-	else
-		DoTradeSkill(reagentIndex,numToMake)
-	end -- if
-end -- function
-
-
--- Button hovering
+-- Button hovering (entered)
 function A.btnEntered(btn)
 	-- Do not manage guild tradeskill
 	if IsTradeSkillGuild() or IsTradeSkillLinked() then return end
 
 	-- Index of the reagent in the recipe, taken from the button name
-	local reagentRecipeIndex = A.buttonNumber(btn)
+	local reagentIndexInRecipe = A.buttonNumber(btn)
 
 	-- ID of the reagent we want to craft
-	local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)
+	local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentIndexInRecipe)
 	local reagentID = A.link2ID(reagentLink)
 
 	-- Continue only if the reagent is known
@@ -266,20 +156,22 @@
 	end
 end
 
+-- Button hovering (left)
 function A.btnLeft(btn)
 	btn.textureHighlight:Hide()
 	A.tooltipRecipe:Hide()
 end -- function
 
+-- Show counts on buttons
 function A.updateCounts(recipeIndex)
 	-- Needs an argument
 	if not recipeIndex then return end
 
 	-- Do not manage guild tradeskill
 	if IsTradeSkillGuild() or IsTradeSkillLinked() then
-		for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do
+		for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do
 			-- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet
-			local label = _G["TradeSkillReagent"..reagentRecipeIndex].label
+			local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label
 			if label then
 				label:Hide()
 			end
@@ -288,33 +180,31 @@
 	end
 
 	-- Count makable items and show it
-	for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do
+	for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do
 		-- ID of the reagent we want to craft
-		local reagentLink = GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex)
-		local reagentID = A.link2ID(reagentLink)
+		local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentIndexInRecipe))
 
-		local label = _G["TradeSkillReagent"..reagentRecipeIndex].label
-		if not label then break end -- Shouldn't happen...
-
-		-- Continue only if the reagent is known
-		if not reagentID or not A.data[reagentID] then
-			label:Hide()
-		else
-			-- Count and show
-			local numMakable = A.numMakable(reagentID)
-			--if not numMakable or #(A.data[reagentID]) ~= 1 or A.data[reagentID][1].macro then
-			if not numMakable then
-				label:SetText("?")
-				label:SetTextColor(0, 0.5, 1, 1) -- blue
+		local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label
+		if label then
+			-- Continue only if the reagent is known
+			if not reagentID or not A.data[reagentID] then
+				label:Hide()
 			else
-				label:SetText(numMakable)
-				if numMakable==0 then
-					label:SetTextColor(1, 0, 0, 1) -- red
+				-- Count and show
+				local numMakable = A.numMakable(reagentID)
+				if not numMakable then
+					label:SetText("?")
+					label:SetTextColor(0, 0.5, 1, 1) -- blue
 				else
-					label:SetTextColor(0, 1, 0, 1) -- green
-				end
+					label:SetText(numMakable)
+					if numMakable==0 then
+						label:SetTextColor(1, 0, 0, 1) -- red
+					else
+						label:SetTextColor(0, 1, 0, 1) -- green
+					end
+				end -- if
+				label:Show()
 			end -- if
-			label:Show()
 		end -- if
 	end -- for
 end -- function