| contrebasse@0 | 1 local addonName, A = ... | 
| contrebasse@0 | 2 | 
| contrebasse@16 | 3 -- Lua functions | 
| contrebasse@16 | 4 local tonumber = tonumber | 
| contrebasse@16 | 5 local select = select | 
| contrebasse@16 | 6 local sfind = string.find | 
| contrebasse@16 | 7 | 
| contrebasse@16 | 8 -- Wow functions | 
| contrebasse@16 | 9 | 
| contrebasse@3 | 10 -- DEBUG Print | 
| contrebasse@3 | 11 function A.DEBUG(msg) | 
| contrebasse@16 | 12 	-- GLOBALS: DEFAULT_CHAT_FRAME | 
| contrebasse@3 | 13 	DEFAULT_CHAT_FRAME:AddMessage(msg or "nil",1,0,0) | 
| contrebasse@3 | 14 end -- function | 
| contrebasse@0 | 15 | 
| contrebasse@38 | 16 -- Messages to the user | 
| contrebasse@38 | 17 function A.Warn(msg) | 
| contrebasse@38 | 18 	if not msg then return end | 
| contrebasse@38 | 19 	local event = "UI_INFO_MESSAGE" | 
| contrebasse@38 | 20 	UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg) | 
| contrebasse@38 | 21 end -- function | 
| contrebasse@38 | 22 function A.Error(msg) | 
| contrebasse@38 | 23 	if not msg then return end | 
| contrebasse@38 | 24 	local event = "UI_ERROR_MESSAGE" | 
| contrebasse@38 | 25 	UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg) | 
| contrebasse@38 | 26 end -- function | 
| contrebasse@38 | 27 | 
| contrebasse@3 | 28 -- Returns the item ID from its link | 
| contrebasse@3 | 29 function A.link2ID(link) | 
| contrebasse@16 | 30 	return tonumber(select(3,sfind(link or "", "-*:(%d+)[:|].*")) or "") | 
| contrebasse@3 | 31 end -- function | 
| contrebasse@3 | 32 | 
| contrebasse@3 | 33 -- Returns the button number for the reagents buttons | 
| contrebasse@3 | 34 function A.buttonNumber(btn) | 
| contrebasse@3 | 35 	-- "TradeSkillReagentN" | 
| contrebasse@3 | 36 	return tonumber(btn:GetName():sub(-1)) | 
| contrebasse@0 | 37 end | 
| contrebasse@0 | 38 | 
| contrebasse@16 | 39 do | 
| contrebasse@16 | 40 	-- Wow functions | 
| contrebasse@16 | 41 	local GetTradeSkillInfo = GetTradeSkillInfo | 
| contrebasse@16 | 42 	local GetNumTradeSkills = GetNumTradeSkills | 
| contrebasse@16 | 43 	local GetTradeSkillItemLink = GetTradeSkillItemLink | 
| contrebasse@0 | 44 | 
| contrebasse@16 | 45 	-- Gives the number of craftable objects | 
| contrebasse@16 | 46 	function A.numMakable(reagentID) | 
| contrebasse@16 | 47 		-- Look for the recipe to make the item | 
| contrebasse@16 | 48 		local reagentIndex = A.findSkillIndex(reagentID) | 
| contrebasse@25 | 49 		if not reagentIndex then return end | 
| contrebasse@3 | 50 | 
| contrebasse@16 | 51 		-- Check how many items we can craft | 
| contrebasse@16 | 52 		local skillName, skillType, numReagentMakable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(reagentIndex) | 
| contrebasse@25 | 53 		return numReagentMakable, reagentIndex | 
| contrebasse@16 | 54 	end | 
| contrebasse@16 | 55 | 
| contrebasse@16 | 56 	-- Find the first tradeskill index of the recipe to make an item | 
| contrebasse@16 | 57 	function A.findSkillIndex(itemID) | 
| contrebasse@16 | 58 		for i = 1,GetNumTradeSkills() do | 
| contrebasse@70 | 59 			local skillName, skillType = GetTradeSkillInfo(i) | 
| contrebasse@16 | 60 			if skillType == "header" then | 
| contrebasse@16 | 61 			else | 
| contrebasse@70 | 62 				local ID = A.link2ID(GetTradeSkillItemLink(i)) | 
| contrebasse@70 | 63 				if ID and ID == itemID then | 
| contrebasse@70 | 64 					return i | 
| contrebasse@3 | 65 				end -- if | 
| contrebasse@3 | 66 			end -- if | 
| contrebasse@16 | 67 		end -- for | 
| contrebasse@71 | 68 		--A.Error(A.L["Tradeskill not found for %d, is the recipe hidden ?"]:format(itemID)) | 
| contrebasse@16 | 69 	end -- function | 
| contrebasse@16 | 70 end -- do | 
| contrebasse@24 | 71 | 
| contrebasse@24 | 72 | 
| contrebasse@24 | 73 -- Taken from Datastore_Crafts | 
| contrebasse@24 | 74 -- *** Scanning functions *** | 
| contrebasse@24 | 75 do | 
| contrebasse@24 | 76 	local selectedTradeSkillIndex | 
| contrebasse@24 | 77 	local subClasses, subClassID | 
| contrebasse@24 | 78 	local invSlots, invSlotID | 
| contrebasse@24 | 79 	local haveMats | 
| contrebasse@24 | 80 	local headersState = {} | 
| contrebasse@24 | 81 | 
| contrebasse@24 | 82 	local function GetSubClassID() | 
| contrebasse@24 | 83 		-- The purpose of this function is to get the subClassID in a UI independant way | 
| contrebasse@24 | 84 		-- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name. | 
| contrebasse@24 | 85 | 
| contrebasse@24 | 86 		if GetTradeSkillSubClassFilter(0) then		-- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0 | 
| contrebasse@24 | 87 			return 1				-- thus return 1 as selected id	(as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown)) | 
| contrebasse@24 | 88 		end | 
| contrebasse@24 | 89 | 
| contrebasse@24 | 90 		local filter | 
| contrebasse@24 | 91 		for i = 1, #subClasses do | 
| contrebasse@24 | 92 			filter = GetTradeSkillSubClassFilter(i) | 
| contrebasse@24 | 93 			if filter then | 
| contrebasse@24 | 94 				return i+1			-- ex: 3rd element of the subClasses array, but 4th in the dropdown due to "All Subclasses", so return i+1 | 
| contrebasse@24 | 95 			end | 
| contrebasse@24 | 96 		end | 
| contrebasse@24 | 97 	end | 
| contrebasse@24 | 98 | 
| contrebasse@24 | 99 	local function GetInvSlotID() | 
| contrebasse@24 | 100 		-- The purpose of this function is to get the invSlotID in a UI independant way	(same as GetSubClassID) | 
| contrebasse@24 | 101 		-- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name. | 
| contrebasse@24 | 102 | 
| contrebasse@24 | 103 		if GetTradeSkillInvSlotFilter(0) then		-- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0 | 
| contrebasse@24 | 104 			return 1				-- thus return 1 as selected id	(as would be returned by  UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown)) | 
| contrebasse@24 | 105 		end | 
| contrebasse@24 | 106 | 
| contrebasse@24 | 107 		local filter | 
| contrebasse@24 | 108 		for i = 1, #invSlots do | 
| contrebasse@24 | 109 			filter = GetTradeSkillInvSlotFilter(i) | 
| contrebasse@24 | 110 			if filter then | 
| contrebasse@24 | 111 				return i+1			-- ex: 3rd element of the invSlots array, but 4th in the dropdown due to "All Slots", so return i+1 | 
| contrebasse@24 | 112 			end | 
| contrebasse@24 | 113 		end | 
| contrebasse@24 | 114 	end | 
| contrebasse@24 | 115 | 
| contrebasse@24 | 116 	function A.SaveActiveFilters() | 
| contrebasse@24 | 117 		print("save") | 
| contrebasse@24 | 118 		selectedTradeSkillIndex = GetTradeSkillSelectionIndex() | 
| contrebasse@24 | 119 | 
| contrebasse@24 | 120 		subClasses = { GetTradeSkillSubClasses() } | 
| contrebasse@24 | 121 		invSlots = { GetTradeSkillInvSlots() } | 
| contrebasse@24 | 122 		subClassID = GetSubClassID() | 
| contrebasse@24 | 123 		invSlotID = GetInvSlotID() | 
| contrebasse@24 | 124 | 
| contrebasse@24 | 125 		-- Subclasses | 
| contrebasse@24 | 126 		SetTradeSkillSubClassFilter(0, 1, 1)	-- this checks "All subclasses" | 
| contrebasse@24 | 127 		if TradeSkillSubClassDropDown then | 
| contrebasse@24 | 128 			UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1) | 
| contrebasse@24 | 129 		end | 
| contrebasse@24 | 130 | 
| contrebasse@24 | 131 		-- Inventory slots | 
| contrebasse@24 | 132 		SetTradeSkillInvSlotFilter(0, 1, 1)		-- this checks "All slots" | 
| contrebasse@24 | 133 		if TradeSkillInvSlotDropDown then | 
| contrebasse@24 | 134 			UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1) | 
| contrebasse@24 | 135 		end | 
| contrebasse@24 | 136 | 
| contrebasse@24 | 137 		-- Have Materials | 
| contrebasse@24 | 138 		if TradeSkillFrameAvailableFilterCheckButton then | 
| contrebasse@24 | 139 			haveMats = TradeSkillFrameAvailableFilterCheckButton:GetChecked()	-- nil or true | 
| contrebasse@24 | 140 			TradeSkillFrameAvailableFilterCheckButton:SetChecked(false) | 
| contrebasse@24 | 141 		end | 
| contrebasse@24 | 142 		TradeSkillOnlyShowMakeable(false) | 
| contrebasse@24 | 143 | 
| contrebasse@24 | 144 		-- Headers | 
| contrebasse@24 | 145 		local headerCount = 0		-- use a counter to avoid being bound to header names, which might not be unique. | 
| contrebasse@24 | 146 | 
| contrebasse@24 | 147 		for i = GetNumTradeSkills(), 1, -1 do		-- 1st pass, expand all categories | 
| contrebasse@24 | 148 			local _, skillType, _, isExpanded  = GetTradeSkillInfo(i) | 
| contrebasse@24 | 149 			 if (skillType == "header") then | 
| contrebasse@24 | 150 				headerCount = headerCount + 1 | 
| contrebasse@24 | 151 				if not isExpanded then | 
| contrebasse@24 | 152 					ExpandTradeSkillSubClass(i) | 
| contrebasse@24 | 153 					headersState[headerCount] = true | 
| contrebasse@24 | 154 				end | 
| contrebasse@24 | 155 			end | 
| contrebasse@24 | 156 		end | 
| contrebasse@24 | 157 | 
| contrebasse@24 | 158 		print("saved") | 
| contrebasse@24 | 159 	end | 
| contrebasse@24 | 160 | 
| contrebasse@24 | 161 	function A.RestoreActiveFilters() | 
| contrebasse@24 | 162 		print("restore") | 
| contrebasse@24 | 163 		-- Subclasses | 
| contrebasse@24 | 164 		SetTradeSkillSubClassFilter(subClassID-1, 1, 1)	-- this checks the previously checked value | 
| contrebasse@24 | 165 | 
| contrebasse@24 | 166 		local frame = TradeSkillSubClassDropDown | 
| contrebasse@24 | 167 		if frame then	-- other addons might nil this frame (delayed load, etc..), so secure DDM calls | 
| contrebasse@24 | 168 			local text = (subClassID == 1) and ALL_SUBCLASSES or subClasses[subClassID-1] | 
| contrebasse@24 | 169 			UIDropDownMenu_SetSelectedID(frame, subClassID) | 
| contrebasse@24 | 170 			UIDropDownMenu_SetText(frame, text); | 
| contrebasse@24 | 171 		end | 
| contrebasse@24 | 172 | 
| contrebasse@24 | 173 		subClassID = nil | 
| contrebasse@24 | 174 		wipe(subClasses) | 
| contrebasse@24 | 175 		subClasses = nil | 
| contrebasse@24 | 176 | 
| contrebasse@24 | 177 		-- Inventory slots | 
| contrebasse@24 | 178 		invSlotID = invSlotID or 1 | 
| contrebasse@24 | 179 		SetTradeSkillInvSlotFilter(invSlotID-1, 1, 1)	-- this checks the previously checked value | 
| contrebasse@24 | 180 | 
| contrebasse@24 | 181 		frame = TradeSkillInvSlotDropDown | 
| contrebasse@24 | 182 		if frame then | 
| contrebasse@24 | 183 			local text = (invSlotID == 1) and ALL_INVENTORY_SLOTS or invSlots[invSlotID-1] | 
| contrebasse@24 | 184 			UIDropDownMenu_SetSelectedID(frame, invSlotID) | 
| contrebasse@24 | 185 			UIDropDownMenu_SetText(frame, text); | 
| contrebasse@24 | 186 		end | 
| contrebasse@24 | 187 | 
| contrebasse@24 | 188 		invSlotID = nil | 
| contrebasse@24 | 189 		wipe(invSlots) | 
| contrebasse@24 | 190 		invSlots = nil | 
| contrebasse@24 | 191 | 
| contrebasse@24 | 192 		-- Have Materials | 
| contrebasse@24 | 193 		if TradeSkillFrameAvailableFilterCheckButton then | 
| contrebasse@24 | 194 			TradeSkillFrameAvailableFilterCheckButton:SetChecked(haveMats or false) | 
| contrebasse@24 | 195 		end | 
| contrebasse@24 | 196 		TradeSkillOnlyShowMakeable(haveMats or false) | 
| contrebasse@24 | 197 		haveMats = nil | 
| contrebasse@24 | 198 | 
| contrebasse@24 | 199 		SelectTradeSkill(selectedTradeSkillIndex) | 
| contrebasse@24 | 200 		selectedTradeSkillIndex = nil | 
| contrebasse@24 | 201 | 
| contrebasse@24 | 202 		-- Headers | 
| contrebasse@24 | 203 		local headerCount = 0 | 
| contrebasse@24 | 204 		for i = GetNumTradeSkills(), 1, -1 do | 
| contrebasse@24 | 205 			local _, skillType  = GetTradeSkillInfo(i) | 
| contrebasse@24 | 206 			if (skillType == "header") then | 
| contrebasse@24 | 207 				headerCount = headerCount + 1 | 
| contrebasse@24 | 208 				if headersState[headerCount] then | 
| contrebasse@24 | 209 					CollapseTradeSkillSubClass(i) | 
| contrebasse@24 | 210 				end | 
| contrebasse@24 | 211 			end | 
| contrebasse@24 | 212 		end | 
| contrebasse@24 | 213 		wipe(headersState) | 
| contrebasse@24 | 214 	end | 
| contrebasse@24 | 215 	print("restored") | 
| contrebasse@24 | 216 end | 
| contrebasse@73 | 217 | 
| contrebasse@73 | 218 function A.isRecipeUnique(itemData) | 
| contrebasse@73 | 219 	local unique = true | 
| contrebasse@73 | 220 | 
| contrebasse@73 | 221 	-- Check if the item is made by only one recipe. If not, return | 
| contrebasse@73 | 222 	if #itemData>1 then | 
| contrebasse@73 | 223 		local spellLink | 
| contrebasse@73 | 224 		for _,v in ipairs(itemData) do | 
| contrebasse@73 | 225 			if not spellLink then | 
| contrebasse@73 | 226 				spellLink = v.spellLink | 
| contrebasse@73 | 227 			else | 
| contrebasse@73 | 228 				if v.spellLink ~= spellLink then | 
| contrebasse@73 | 229 					unique = nil | 
| contrebasse@73 | 230 					break | 
| contrebasse@73 | 231 				end | 
| contrebasse@73 | 232 			end | 
| contrebasse@73 | 233 		end | 
| contrebasse@73 | 234 	end | 
| contrebasse@73 | 235 | 
| contrebasse@73 | 236 	return unique | 
| contrebasse@73 | 237 end |