view utils.lua @ 46:40d6886d1966

Correct the number of items to craft (the formulae was wrong and has to take the number of item crafted into account)
author contrebasse
date Sat, 30 Apr 2011 01:31:19 +0200
parents 00c2282f073a
children 08dfba564a6e
line wrap: on
line source
local addonName, A = ...

-- Lua functions
local tonumber = tonumber
local select = select
local sfind = string.find

-- Wow functions

-- DEBUG Print
function A.DEBUG(msg)
	-- GLOBALS: DEFAULT_CHAT_FRAME
	DEFAULT_CHAT_FRAME:AddMessage(msg or "nil",1,0,0)
end -- function

-- Messages to the user
function A.Warn(msg)
	if not msg then return end
	local event = "UI_INFO_MESSAGE"
	UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg)
end -- function
function A.Error(msg)
	if not msg then return end
	local event = "UI_ERROR_MESSAGE"
	UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg)
end -- function

-- Returns the item ID from its link
function A.link2ID(link)
	return tonumber(select(3,sfind(link or "", "-*:(%d+)[:|].*")) or "")
end -- function

-- Returns the button number for the reagents buttons
function A.buttonNumber(btn)
	-- "TradeSkillReagentN"
	return tonumber(btn:GetName():sub(-1))
end

do
	-- Wow functions
	local GetTradeSkillInfo = GetTradeSkillInfo
	local GetNumTradeSkills = GetNumTradeSkills
	local GetTradeSkillItemLink = GetTradeSkillItemLink

	-- Gives the number of craftable objects
	function A.numMakable(reagentID)
		-- Look for the recipe to make the item
		local reagentIndex = A.findSkillIndex(reagentID)
		if not reagentIndex then return end

		-- Check how many items we can craft
		local skillName, skillType, numReagentMakable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(reagentIndex)
		return numReagentMakable, reagentIndex
	end

	-- Find the first tradeskill index of the recipe to make an item
	function A.findSkillIndex(itemID)
		for i = 1,GetNumTradeSkills() do
			local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(i)
			if skillType == "header" then
			else
				if skillName then
					local ID = A.link2ID(GetTradeSkillItemLink(i))
					if ID and ID == itemID then
						return i
					end -- if
				end -- if
			end -- if
		end -- for
		A.Error("Tradeskill not found for "..itemID..", is the recipe hidden ?")
	end -- function
end -- do


-- Taken from Datastore_Crafts
-- *** Scanning functions ***
do
	local selectedTradeSkillIndex
	local subClasses, subClassID
	local invSlots, invSlotID
	local haveMats
	local headersState = {}

	local function GetSubClassID()
		-- The purpose of this function is to get the subClassID in a UI independant way
		-- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name.

		if GetTradeSkillSubClassFilter(0) then		-- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0
			return 1				-- thus return 1 as selected id	(as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown))
		end

		local filter
		for i = 1, #subClasses do
			filter = GetTradeSkillSubClassFilter(i)
			if filter then
				return i+1			-- ex: 3rd element of the subClasses array, but 4th in the dropdown due to "All Subclasses", so return i+1
			end
		end
	end

	local function GetInvSlotID()
		-- The purpose of this function is to get the invSlotID in a UI independant way	(same as GetSubClassID)
		-- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name.

		if GetTradeSkillInvSlotFilter(0) then		-- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0
			return 1				-- thus return 1 as selected id	(as would be returned by  UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown))
		end

		local filter
		for i = 1, #invSlots do
			filter = GetTradeSkillInvSlotFilter(i)
			if filter then
				return i+1			-- ex: 3rd element of the invSlots array, but 4th in the dropdown due to "All Slots", so return i+1
			end
		end
	end

	function A.SaveActiveFilters()
		print("save")
		selectedTradeSkillIndex = GetTradeSkillSelectionIndex()

		subClasses = { GetTradeSkillSubClasses() }
		invSlots = { GetTradeSkillInvSlots() }
		subClassID = GetSubClassID()
		invSlotID = GetInvSlotID()

		-- Subclasses
		SetTradeSkillSubClassFilter(0, 1, 1)	-- this checks "All subclasses"
		if TradeSkillSubClassDropDown then
			UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1)
		end

		-- Inventory slots
		SetTradeSkillInvSlotFilter(0, 1, 1)		-- this checks "All slots"
		if TradeSkillInvSlotDropDown then
			UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1)
		end

		-- Have Materials
		if TradeSkillFrameAvailableFilterCheckButton then
			haveMats = TradeSkillFrameAvailableFilterCheckButton:GetChecked()	-- nil or true
			TradeSkillFrameAvailableFilterCheckButton:SetChecked(false)
		end
		TradeSkillOnlyShowMakeable(false)

		-- Headers
		local headerCount = 0		-- use a counter to avoid being bound to header names, which might not be unique.

		for i = GetNumTradeSkills(), 1, -1 do		-- 1st pass, expand all categories
			local _, skillType, _, isExpanded  = GetTradeSkillInfo(i)
			 if (skillType == "header") then
				headerCount = headerCount + 1
				if not isExpanded then
					ExpandTradeSkillSubClass(i)
					headersState[headerCount] = true
				end
			end
		end

		print("saved")
	end

	function A.RestoreActiveFilters()
		print("restore")
		-- Subclasses
		SetTradeSkillSubClassFilter(subClassID-1, 1, 1)	-- this checks the previously checked value

		local frame = TradeSkillSubClassDropDown
		if frame then	-- other addons might nil this frame (delayed load, etc..), so secure DDM calls
			local text = (subClassID == 1) and ALL_SUBCLASSES or subClasses[subClassID-1]
			UIDropDownMenu_SetSelectedID(frame, subClassID)
			UIDropDownMenu_SetText(frame, text);
		end

		subClassID = nil
		wipe(subClasses)
		subClasses = nil

		-- Inventory slots
		invSlotID = invSlotID or 1
		SetTradeSkillInvSlotFilter(invSlotID-1, 1, 1)	-- this checks the previously checked value

		frame = TradeSkillInvSlotDropDown
		if frame then
			local text = (invSlotID == 1) and ALL_INVENTORY_SLOTS or invSlots[invSlotID-1]
			UIDropDownMenu_SetSelectedID(frame, invSlotID)
			UIDropDownMenu_SetText(frame, text);
		end

		invSlotID = nil
		wipe(invSlots)
		invSlots = nil

		-- Have Materials
		if TradeSkillFrameAvailableFilterCheckButton then
			TradeSkillFrameAvailableFilterCheckButton:SetChecked(haveMats or false)
		end
		TradeSkillOnlyShowMakeable(haveMats or false)
		haveMats = nil

		SelectTradeSkill(selectedTradeSkillIndex)
		selectedTradeSkillIndex = nil

		-- Headers
		local headerCount = 0
		for i = GetNumTradeSkills(), 1, -1 do
			local _, skillType  = GetTradeSkillInfo(i)
			if (skillType == "header") then
				headerCount = headerCount + 1
				if headersState[headerCount] then
					CollapseTradeSkillSubClass(i)
				end
			end
		end
		wipe(headersState)
	end
	print("restored")
end