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