| 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@82 | 59 			local _, 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@16 | 68 	end -- function | 
| contrebasse@16 | 69 end -- do | 
| contrebasse@24 | 70 | 
| contrebasse@24 | 71 | 
| contrebasse@24 | 72 -- Taken from Datastore_Crafts | 
| contrebasse@24 | 73 -- *** Scanning functions *** | 
| contrebasse@24 | 74 do | 
| contrebasse@24 | 75 	local selectedTradeSkillIndex | 
| contrebasse@24 | 76 	local subClasses, subClassID | 
| contrebasse@24 | 77 	local invSlots, invSlotID | 
| contrebasse@24 | 78 	local haveMats | 
| contrebasse@24 | 79 	local headersState = {} | 
| contrebasse@24 | 80 | 
| contrebasse@24 | 81 	local function GetSubClassID() | 
| contrebasse@24 | 82 		-- The purpose of this function is to get the subClassID in a UI independant way | 
| contrebasse@24 | 83 		-- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name. | 
| contrebasse@24 | 84 | 
| contrebasse@24 | 85 		if GetTradeSkillSubClassFilter(0) then		-- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0 | 
| contrebasse@24 | 86 			return 1				-- thus return 1 as selected id	(as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown)) | 
| contrebasse@24 | 87 		end | 
| contrebasse@24 | 88 | 
| contrebasse@24 | 89 		local filter | 
| contrebasse@24 | 90 		for i = 1, #subClasses do | 
| contrebasse@24 | 91 			filter = GetTradeSkillSubClassFilter(i) | 
| contrebasse@24 | 92 			if filter then | 
| contrebasse@24 | 93 				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 | 94 			end | 
| contrebasse@24 | 95 		end | 
| contrebasse@24 | 96 	end | 
| contrebasse@24 | 97 | 
| contrebasse@24 | 98 	local function GetInvSlotID() | 
| contrebasse@24 | 99 		-- The purpose of this function is to get the invSlotID in a UI independant way	(same as GetSubClassID) | 
| contrebasse@24 | 100 		-- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name. | 
| contrebasse@24 | 101 | 
| contrebasse@24 | 102 		if GetTradeSkillInvSlotFilter(0) then		-- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0 | 
| contrebasse@24 | 103 			return 1				-- thus return 1 as selected id	(as would be returned by  UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown)) | 
| contrebasse@24 | 104 		end | 
| contrebasse@24 | 105 | 
| contrebasse@24 | 106 		local filter | 
| contrebasse@24 | 107 		for i = 1, #invSlots do | 
| contrebasse@24 | 108 			filter = GetTradeSkillInvSlotFilter(i) | 
| contrebasse@24 | 109 			if filter then | 
| contrebasse@24 | 110 				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 | 111 			end | 
| contrebasse@24 | 112 		end | 
| contrebasse@24 | 113 	end | 
| contrebasse@24 | 114 | 
| contrebasse@82 | 115 	function A.SaveActiveFilters(headerName) | 
| contrebasse@82 | 116 		A.blockScan = true | 
| contrebasse@82 | 117 | 
| contrebasse@82 | 118 		--[[ | 
| contrebasse@24 | 119 		print("save") | 
| contrebasse@82 | 120 		print(GetNumTradeSkills()) | 
| contrebasse@24 | 121 		selectedTradeSkillIndex = GetTradeSkillSelectionIndex() | 
| contrebasse@24 | 122 | 
| contrebasse@24 | 123 		subClasses = { GetTradeSkillSubClasses() } | 
| contrebasse@24 | 124 		invSlots = { GetTradeSkillInvSlots() } | 
| contrebasse@24 | 125 		subClassID = GetSubClassID() | 
| contrebasse@24 | 126 		invSlotID = GetInvSlotID() | 
| contrebasse@24 | 127 | 
| contrebasse@24 | 128 		-- Subclasses | 
| contrebasse@24 | 129 		SetTradeSkillSubClassFilter(0, 1, 1)	-- this checks "All subclasses" | 
| contrebasse@24 | 130 		if TradeSkillSubClassDropDown then | 
| contrebasse@24 | 131 			UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1) | 
| contrebasse@24 | 132 		end | 
| contrebasse@82 | 133 		print(GetNumTradeSkills()) | 
| contrebasse@24 | 134 | 
| contrebasse@24 | 135 		-- Inventory slots | 
| contrebasse@24 | 136 		SetTradeSkillInvSlotFilter(0, 1, 1)		-- this checks "All slots" | 
| contrebasse@24 | 137 		if TradeSkillInvSlotDropDown then | 
| contrebasse@24 | 138 			UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1) | 
| contrebasse@24 | 139 		end | 
| contrebasse@82 | 140 		print(GetNumTradeSkills()) | 
| contrebasse@24 | 141 | 
| contrebasse@24 | 142 		-- Have Materials | 
| contrebasse@24 | 143 		if TradeSkillFrameAvailableFilterCheckButton then | 
| contrebasse@24 | 144 			haveMats = TradeSkillFrameAvailableFilterCheckButton:GetChecked()	-- nil or true | 
| contrebasse@24 | 145 			TradeSkillFrameAvailableFilterCheckButton:SetChecked(false) | 
| contrebasse@24 | 146 		end | 
| contrebasse@24 | 147 		TradeSkillOnlyShowMakeable(false) | 
| contrebasse@82 | 148 		print(GetNumTradeSkills()) | 
| contrebasse@82 | 149 		--]] | 
| contrebasse@24 | 150 | 
| contrebasse@24 | 151 		-- Headers | 
| contrebasse@82 | 152 		--local headerCount = 0		-- use a counter to avoid being bound to header names, which might not be unique. | 
| contrebasse@24 | 153 		for i = GetNumTradeSkills(), 1, -1 do		-- 1st pass, expand all categories | 
| contrebasse@82 | 154 			local skillName, skillType, _, isExpanded  = GetTradeSkillInfo(i) | 
| contrebasse@24 | 155 			 if (skillType == "header") then | 
| contrebasse@82 | 156 				--headerCount = headerCount + 1 | 
| contrebasse@82 | 157 				if not isExpanded and skillName==headerName then | 
| contrebasse@24 | 158 					ExpandTradeSkillSubClass(i) | 
| contrebasse@82 | 159 					--print(GetNumTradeSkills()) | 
| contrebasse@82 | 160 					--headersState[headerCount] = true | 
| contrebasse@24 | 161 				end | 
| contrebasse@24 | 162 			end | 
| contrebasse@24 | 163 		end | 
| contrebasse@24 | 164 | 
| contrebasse@82 | 165 		--print("saved") | 
| contrebasse@82 | 166 | 
| contrebasse@82 | 167 		A.blockScan = nil | 
| contrebasse@24 | 168 	end | 
| contrebasse@24 | 169 | 
| contrebasse@24 | 170 	function A.RestoreActiveFilters() | 
| contrebasse@82 | 171 		A.blockScan = true | 
| contrebasse@82 | 172 | 
| contrebasse@24 | 173 		print("restore") | 
| contrebasse@24 | 174 		-- Subclasses | 
| contrebasse@24 | 175 		SetTradeSkillSubClassFilter(subClassID-1, 1, 1)	-- this checks the previously checked value | 
| contrebasse@24 | 176 | 
| contrebasse@24 | 177 		local frame = TradeSkillSubClassDropDown | 
| contrebasse@24 | 178 		if frame then	-- other addons might nil this frame (delayed load, etc..), so secure DDM calls | 
| contrebasse@24 | 179 			local text = (subClassID == 1) and ALL_SUBCLASSES or subClasses[subClassID-1] | 
| contrebasse@24 | 180 			UIDropDownMenu_SetSelectedID(frame, subClassID) | 
| contrebasse@24 | 181 			UIDropDownMenu_SetText(frame, text); | 
| contrebasse@24 | 182 		end | 
| contrebasse@24 | 183 | 
| contrebasse@24 | 184 		subClassID = nil | 
| contrebasse@24 | 185 		wipe(subClasses) | 
| contrebasse@24 | 186 		subClasses = nil | 
| contrebasse@24 | 187 | 
| contrebasse@24 | 188 		-- Inventory slots | 
| contrebasse@24 | 189 		invSlotID = invSlotID or 1 | 
| contrebasse@24 | 190 		SetTradeSkillInvSlotFilter(invSlotID-1, 1, 1)	-- this checks the previously checked value | 
| contrebasse@24 | 191 | 
| contrebasse@24 | 192 		frame = TradeSkillInvSlotDropDown | 
| contrebasse@24 | 193 		if frame then | 
| contrebasse@24 | 194 			local text = (invSlotID == 1) and ALL_INVENTORY_SLOTS or invSlots[invSlotID-1] | 
| contrebasse@24 | 195 			UIDropDownMenu_SetSelectedID(frame, invSlotID) | 
| contrebasse@24 | 196 			UIDropDownMenu_SetText(frame, text); | 
| contrebasse@24 | 197 		end | 
| contrebasse@24 | 198 | 
| contrebasse@24 | 199 		invSlotID = nil | 
| contrebasse@24 | 200 		wipe(invSlots) | 
| contrebasse@24 | 201 		invSlots = nil | 
| contrebasse@24 | 202 | 
| contrebasse@24 | 203 		-- Have Materials | 
| contrebasse@24 | 204 		if TradeSkillFrameAvailableFilterCheckButton then | 
| contrebasse@24 | 205 			TradeSkillFrameAvailableFilterCheckButton:SetChecked(haveMats or false) | 
| contrebasse@24 | 206 		end | 
| contrebasse@24 | 207 		TradeSkillOnlyShowMakeable(haveMats or false) | 
| contrebasse@24 | 208 		haveMats = nil | 
| contrebasse@24 | 209 | 
| contrebasse@24 | 210 		SelectTradeSkill(selectedTradeSkillIndex) | 
| contrebasse@24 | 211 		selectedTradeSkillIndex = nil | 
| contrebasse@24 | 212 | 
| contrebasse@24 | 213 		-- Headers | 
| contrebasse@24 | 214 		local headerCount = 0 | 
| contrebasse@24 | 215 		for i = GetNumTradeSkills(), 1, -1 do | 
| contrebasse@24 | 216 			local _, skillType  = GetTradeSkillInfo(i) | 
| contrebasse@24 | 217 			if (skillType == "header") then | 
| contrebasse@24 | 218 				headerCount = headerCount + 1 | 
| contrebasse@24 | 219 				if headersState[headerCount] then | 
| contrebasse@24 | 220 					CollapseTradeSkillSubClass(i) | 
| contrebasse@24 | 221 				end | 
| contrebasse@24 | 222 			end | 
| contrebasse@24 | 223 		end | 
| contrebasse@24 | 224 		wipe(headersState) | 
| contrebasse@24 | 225 	end | 
| contrebasse@24 | 226 	print("restored") | 
| contrebasse@82 | 227 | 
| contrebasse@82 | 228 	A.blockScan = nil | 
| contrebasse@24 | 229 end | 
| contrebasse@73 | 230 | 
| contrebasse@73 | 231 function A.isRecipeUnique(itemData) | 
| contrebasse@73 | 232 	local unique = true | 
| contrebasse@73 | 233 | 
| contrebasse@73 | 234 	-- Check if the item is made by only one recipe. If not, return | 
| contrebasse@73 | 235 	if #itemData>1 then | 
| contrebasse@73 | 236 		local spellLink | 
| contrebasse@73 | 237 		for _,v in ipairs(itemData) do | 
| contrebasse@73 | 238 			if not spellLink then | 
| contrebasse@73 | 239 				spellLink = v.spellLink | 
| contrebasse@73 | 240 			else | 
| contrebasse@73 | 241 				if v.spellLink ~= spellLink then | 
| contrebasse@73 | 242 					unique = nil | 
| contrebasse@73 | 243 					break | 
| contrebasse@73 | 244 				end | 
| contrebasse@73 | 245 			end | 
| contrebasse@73 | 246 		end | 
| contrebasse@73 | 247 	end | 
| contrebasse@73 | 248 | 
| contrebasse@73 | 249 	return unique | 
| contrebasse@73 | 250 end | 
| contrebasse@76 | 251 | 
| contrebasse@76 | 252 --[[ | 
| contrebasse@76 | 253 function A.isTradeskillUnique(itemData) | 
| contrebasse@85 | 254 	local spellName = itemData[1].spellName | 
| contrebasse@76 | 255 | 
| contrebasse@76 | 256 	-- Check if the item is made by only one recipe. If not, return | 
| contrebasse@76 | 257 	if #itemData>1 then | 
| contrebasse@76 | 258 		for _,v in ipairs(itemData) do | 
| contrebasse@85 | 259 			if v.spellName ~= spellName then | 
| contrebasse@85 | 260 				spellName = nil | 
| contrebasse@76 | 261 				break | 
| contrebasse@76 | 262 			end | 
| contrebasse@76 | 263 		end | 
| contrebasse@76 | 264 	end | 
| contrebasse@76 | 265 | 
| contrebasse@85 | 266 	return spellName | 
| contrebasse@76 | 267 end | 
| contrebasse@76 | 268 --]] |