| 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@16 | 59 			local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(i) | 
| contrebasse@16 | 60 			if skillType == "header" then | 
| contrebasse@16 | 61 			else | 
| contrebasse@16 | 62 				if skillName then | 
| contrebasse@16 | 63 					local ID = A.link2ID(GetTradeSkillItemLink(i)) | 
| contrebasse@16 | 64 					if ID and ID == itemID then | 
| contrebasse@16 | 65 						return i | 
| contrebasse@16 | 66 					end -- if | 
| contrebasse@3 | 67 				end -- if | 
| contrebasse@3 | 68 			end -- if | 
| contrebasse@16 | 69 		end -- for | 
| contrebasse@47 | 70 		--A.Error("Tradeskill not found for "..itemID..", is the recipe hidden ?") | 
| contrebasse@16 | 71 	end -- function | 
| contrebasse@16 | 72 end -- do | 
| contrebasse@24 | 73 | 
| contrebasse@24 | 74 | 
| contrebasse@24 | 75 -- Taken from Datastore_Crafts | 
| contrebasse@24 | 76 -- *** Scanning functions *** | 
| contrebasse@24 | 77 do | 
| contrebasse@24 | 78 	local selectedTradeSkillIndex | 
| contrebasse@24 | 79 	local subClasses, subClassID | 
| contrebasse@24 | 80 	local invSlots, invSlotID | 
| contrebasse@24 | 81 	local haveMats | 
| contrebasse@24 | 82 	local headersState = {} | 
| contrebasse@24 | 83 | 
| contrebasse@24 | 84 	local function GetSubClassID() | 
| contrebasse@24 | 85 		-- The purpose of this function is to get the subClassID in a UI independant way | 
| contrebasse@24 | 86 		-- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name. | 
| contrebasse@24 | 87 | 
| contrebasse@24 | 88 		if GetTradeSkillSubClassFilter(0) then		-- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0 | 
| contrebasse@24 | 89 			return 1				-- thus return 1 as selected id	(as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown)) | 
| contrebasse@24 | 90 		end | 
| contrebasse@24 | 91 | 
| contrebasse@24 | 92 		local filter | 
| contrebasse@24 | 93 		for i = 1, #subClasses do | 
| contrebasse@24 | 94 			filter = GetTradeSkillSubClassFilter(i) | 
| contrebasse@24 | 95 			if filter then | 
| contrebasse@24 | 96 				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 | 97 			end | 
| contrebasse@24 | 98 		end | 
| contrebasse@24 | 99 	end | 
| contrebasse@24 | 100 | 
| contrebasse@24 | 101 	local function GetInvSlotID() | 
| contrebasse@24 | 102 		-- The purpose of this function is to get the invSlotID in a UI independant way	(same as GetSubClassID) | 
| contrebasse@24 | 103 		-- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name. | 
| contrebasse@24 | 104 | 
| contrebasse@24 | 105 		if GetTradeSkillInvSlotFilter(0) then		-- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0 | 
| contrebasse@24 | 106 			return 1				-- thus return 1 as selected id	(as would be returned by  UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown)) | 
| contrebasse@24 | 107 		end | 
| contrebasse@24 | 108 | 
| contrebasse@24 | 109 		local filter | 
| contrebasse@24 | 110 		for i = 1, #invSlots do | 
| contrebasse@24 | 111 			filter = GetTradeSkillInvSlotFilter(i) | 
| contrebasse@24 | 112 			if filter then | 
| contrebasse@24 | 113 				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 | 114 			end | 
| contrebasse@24 | 115 		end | 
| contrebasse@24 | 116 	end | 
| contrebasse@24 | 117 | 
| contrebasse@24 | 118 	function A.SaveActiveFilters() | 
| contrebasse@24 | 119 		print("save") | 
| contrebasse@24 | 120 		selectedTradeSkillIndex = GetTradeSkillSelectionIndex() | 
| contrebasse@24 | 121 | 
| contrebasse@24 | 122 		subClasses = { GetTradeSkillSubClasses() } | 
| contrebasse@24 | 123 		invSlots = { GetTradeSkillInvSlots() } | 
| contrebasse@24 | 124 		subClassID = GetSubClassID() | 
| contrebasse@24 | 125 		invSlotID = GetInvSlotID() | 
| contrebasse@24 | 126 | 
| contrebasse@24 | 127 		-- Subclasses | 
| contrebasse@24 | 128 		SetTradeSkillSubClassFilter(0, 1, 1)	-- this checks "All subclasses" | 
| contrebasse@24 | 129 		if TradeSkillSubClassDropDown then | 
| contrebasse@24 | 130 			UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1) | 
| contrebasse@24 | 131 		end | 
| contrebasse@24 | 132 | 
| contrebasse@24 | 133 		-- Inventory slots | 
| contrebasse@24 | 134 		SetTradeSkillInvSlotFilter(0, 1, 1)		-- this checks "All slots" | 
| contrebasse@24 | 135 		if TradeSkillInvSlotDropDown then | 
| contrebasse@24 | 136 			UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1) | 
| contrebasse@24 | 137 		end | 
| contrebasse@24 | 138 | 
| contrebasse@24 | 139 		-- Have Materials | 
| contrebasse@24 | 140 		if TradeSkillFrameAvailableFilterCheckButton then | 
| contrebasse@24 | 141 			haveMats = TradeSkillFrameAvailableFilterCheckButton:GetChecked()	-- nil or true | 
| contrebasse@24 | 142 			TradeSkillFrameAvailableFilterCheckButton:SetChecked(false) | 
| contrebasse@24 | 143 		end | 
| contrebasse@24 | 144 		TradeSkillOnlyShowMakeable(false) | 
| contrebasse@24 | 145 | 
| contrebasse@24 | 146 		-- Headers | 
| contrebasse@24 | 147 		local headerCount = 0		-- use a counter to avoid being bound to header names, which might not be unique. | 
| contrebasse@24 | 148 | 
| contrebasse@24 | 149 		for i = GetNumTradeSkills(), 1, -1 do		-- 1st pass, expand all categories | 
| contrebasse@24 | 150 			local _, skillType, _, isExpanded  = GetTradeSkillInfo(i) | 
| contrebasse@24 | 151 			 if (skillType == "header") then | 
| contrebasse@24 | 152 				headerCount = headerCount + 1 | 
| contrebasse@24 | 153 				if not isExpanded then | 
| contrebasse@24 | 154 					ExpandTradeSkillSubClass(i) | 
| contrebasse@24 | 155 					headersState[headerCount] = true | 
| contrebasse@24 | 156 				end | 
| contrebasse@24 | 157 			end | 
| contrebasse@24 | 158 		end | 
| contrebasse@24 | 159 | 
| contrebasse@24 | 160 		print("saved") | 
| contrebasse@24 | 161 	end | 
| contrebasse@24 | 162 | 
| contrebasse@24 | 163 	function A.RestoreActiveFilters() | 
| contrebasse@24 | 164 		print("restore") | 
| contrebasse@24 | 165 		-- Subclasses | 
| contrebasse@24 | 166 		SetTradeSkillSubClassFilter(subClassID-1, 1, 1)	-- this checks the previously checked value | 
| contrebasse@24 | 167 | 
| contrebasse@24 | 168 		local frame = TradeSkillSubClassDropDown | 
| contrebasse@24 | 169 		if frame then	-- other addons might nil this frame (delayed load, etc..), so secure DDM calls | 
| contrebasse@24 | 170 			local text = (subClassID == 1) and ALL_SUBCLASSES or subClasses[subClassID-1] | 
| contrebasse@24 | 171 			UIDropDownMenu_SetSelectedID(frame, subClassID) | 
| contrebasse@24 | 172 			UIDropDownMenu_SetText(frame, text); | 
| contrebasse@24 | 173 		end | 
| contrebasse@24 | 174 | 
| contrebasse@24 | 175 		subClassID = nil | 
| contrebasse@24 | 176 		wipe(subClasses) | 
| contrebasse@24 | 177 		subClasses = nil | 
| contrebasse@24 | 178 | 
| contrebasse@24 | 179 		-- Inventory slots | 
| contrebasse@24 | 180 		invSlotID = invSlotID or 1 | 
| contrebasse@24 | 181 		SetTradeSkillInvSlotFilter(invSlotID-1, 1, 1)	-- this checks the previously checked value | 
| contrebasse@24 | 182 | 
| contrebasse@24 | 183 		frame = TradeSkillInvSlotDropDown | 
| contrebasse@24 | 184 		if frame then | 
| contrebasse@24 | 185 			local text = (invSlotID == 1) and ALL_INVENTORY_SLOTS or invSlots[invSlotID-1] | 
| contrebasse@24 | 186 			UIDropDownMenu_SetSelectedID(frame, invSlotID) | 
| contrebasse@24 | 187 			UIDropDownMenu_SetText(frame, text); | 
| contrebasse@24 | 188 		end | 
| contrebasse@24 | 189 | 
| contrebasse@24 | 190 		invSlotID = nil | 
| contrebasse@24 | 191 		wipe(invSlots) | 
| contrebasse@24 | 192 		invSlots = nil | 
| contrebasse@24 | 193 | 
| contrebasse@24 | 194 		-- Have Materials | 
| contrebasse@24 | 195 		if TradeSkillFrameAvailableFilterCheckButton then | 
| contrebasse@24 | 196 			TradeSkillFrameAvailableFilterCheckButton:SetChecked(haveMats or false) | 
| contrebasse@24 | 197 		end | 
| contrebasse@24 | 198 		TradeSkillOnlyShowMakeable(haveMats or false) | 
| contrebasse@24 | 199 		haveMats = nil | 
| contrebasse@24 | 200 | 
| contrebasse@24 | 201 		SelectTradeSkill(selectedTradeSkillIndex) | 
| contrebasse@24 | 202 		selectedTradeSkillIndex = nil | 
| contrebasse@24 | 203 | 
| contrebasse@24 | 204 		-- Headers | 
| contrebasse@24 | 205 		local headerCount = 0 | 
| contrebasse@24 | 206 		for i = GetNumTradeSkills(), 1, -1 do | 
| contrebasse@24 | 207 			local _, skillType  = GetTradeSkillInfo(i) | 
| contrebasse@24 | 208 			if (skillType == "header") then | 
| contrebasse@24 | 209 				headerCount = headerCount + 1 | 
| contrebasse@24 | 210 				if headersState[headerCount] then | 
| contrebasse@24 | 211 					CollapseTradeSkillSubClass(i) | 
| contrebasse@24 | 212 				end | 
| contrebasse@24 | 213 			end | 
| contrebasse@24 | 214 		end | 
| contrebasse@24 | 215 		wipe(headersState) | 
| contrebasse@24 | 216 	end | 
| contrebasse@24 | 217 	print("restored") | 
| contrebasse@24 | 218 end |