| 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@108 | 46 	--[[ | 
| contrebasse@16 | 47 	function A.numMakable(reagentID) | 
| contrebasse@16 | 48 		-- Look for the recipe to make the item | 
| contrebasse@16 | 49 		local reagentIndex = A.findSkillIndex(reagentID) | 
| contrebasse@25 | 50 		if not reagentIndex then return end | 
| contrebasse@3 | 51 | 
| contrebasse@16 | 52 		-- Check how many items we can craft | 
| contrebasse@16 | 53 		local skillName, skillType, numReagentMakable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(reagentIndex) | 
| contrebasse@25 | 54 		return numReagentMakable, reagentIndex | 
| contrebasse@16 | 55 	end | 
| contrebasse@108 | 56 	--]] | 
| contrebasse@108 | 57 	function A.numMakable(reagentID) | 
| contrebasse@108 | 58 		-- No recipe | 
| contrebasse@108 | 59 		if not A.data[reagentID] then return 0 end | 
| contrebasse@108 | 60 | 
| contrebasse@108 | 61 		-- Many recipes | 
| contrebasse@108 | 62 		local n = 0 | 
| contrebasse@108 | 63 		local itemCount | 
| contrebasse@108 | 64 		for _,recipe in pairs(A.data[reagentID]) do | 
| contrebasse@108 | 65 			if recipe[1] then -- only one reagent | 
| contrebasse@108 | 66 				itemCount = GetItemCount(recipe[1]) | 
| contrebasse@108 | 67 				if not itemCount then return end | 
| contrebasse@108 | 68 				n = n + math.floor(itemCount/recipe[2]) | 
| contrebasse@108 | 69 			else -- many reagents | 
| contrebasse@108 | 70 				local m | 
| contrebasse@108 | 71 				for _,reagent in pairs(recipe[2]) do | 
| contrebasse@108 | 72 					itemCount = GetItemCount(reagent[1]) | 
| contrebasse@108 | 73 					if not itemCount then return end | 
| contrebasse@108 | 74 					if not m then | 
| contrebasse@108 | 75 						m = math.floor(itemCount/reagent[2]) | 
| contrebasse@108 | 76 					else | 
| contrebasse@108 | 77 						m = math.min(m,math.floor(itemCount/reagent[2])) | 
| contrebasse@108 | 78 					end | 
| contrebasse@108 | 79 					if m==0 then break end | 
| contrebasse@108 | 80 				end | 
| contrebasse@108 | 81 				n = n + m | 
| contrebasse@108 | 82 			end -- if | 
| contrebasse@108 | 83 		end -- for | 
| contrebasse@108 | 84 		return n | 
| contrebasse@108 | 85 	end -- function | 
| contrebasse@16 | 86 | 
| contrebasse@16 | 87 	-- Find the first tradeskill index of the recipe to make an item | 
| contrebasse@16 | 88 	function A.findSkillIndex(itemID) | 
| contrebasse@16 | 89 		for i = 1,GetNumTradeSkills() do | 
| contrebasse@82 | 90 			local _, skillType = GetTradeSkillInfo(i) | 
| contrebasse@16 | 91 			if skillType == "header" then | 
| contrebasse@16 | 92 			else | 
| contrebasse@70 | 93 				local ID = A.link2ID(GetTradeSkillItemLink(i)) | 
| contrebasse@70 | 94 				if ID and ID == itemID then | 
| contrebasse@70 | 95 					return i | 
| contrebasse@3 | 96 				end -- if | 
| contrebasse@3 | 97 			end -- if | 
| contrebasse@16 | 98 		end -- for | 
| contrebasse@16 | 99 	end -- function | 
| contrebasse@16 | 100 end -- do | 
| contrebasse@24 | 101 | 
| contrebasse@24 | 102 | 
| contrebasse@24 | 103 -- Taken from Datastore_Crafts | 
| contrebasse@24 | 104 -- *** Scanning functions *** | 
| contrebasse@24 | 105 do | 
| contrebasse@24 | 106 	local selectedTradeSkillIndex | 
| contrebasse@107 | 107 	local stateSaved | 
| contrebasse@107 | 108 	local filtersState = {} | 
| contrebasse@24 | 109 	local headersState = {} | 
| contrebasse@24 | 110 | 
| contrebasse@107 | 111 	local function ApplyFilters() | 
| contrebasse@107 | 112 		TradeSkillOnlyShowSkillUps(TradeSkillFrame.filterTbl.hasSkillUp); | 
| contrebasse@107 | 113 		TradeSkillOnlyShowMakeable(TradeSkillFrame.filterTbl.hasMaterials); | 
| contrebasse@107 | 114 		SetTradeSkillSubClassFilter(TradeSkillFrame.filterTbl.subClassValue, 1, 1); | 
| contrebasse@107 | 115 		SetTradeSkillInvSlotFilter(TradeSkillFrame.filterTbl.slotValue, 1, 1); | 
| contrebasse@107 | 116 		TradeSkillUpdateFilterBar(); | 
| contrebasse@107 | 117 		CloseDropDownMenus(); | 
| contrebasse@107 | 118 	end | 
| contrebasse@107 | 119 | 
| contrebasse@82 | 120 	function A.SaveActiveFilters(headerName) | 
| contrebasse@82 | 121 		A.blockScan = true | 
| contrebasse@82 | 122 | 
| contrebasse@107 | 123 		-- Save filters | 
| contrebasse@108 | 124 		filtersState.text = GetTradeSkillItemNameFilter() | 
| contrebasse@108 | 125 		filtersState.minLevel, filtersState.maxLevel = GetTradeSkillItemLevelFilter() | 
| contrebasse@107 | 126 		filtersState.hasMaterials = TradeSkillFrame.filterTbl.hasMaterials | 
| contrebasse@107 | 127 		filtersState.hasSkillUp = TradeSkillFrame.filterTbl.hasSkillUp | 
| contrebasse@107 | 128 		filtersState.subClassValue = TradeSkillFrame.filterTbl.subClassValue | 
| contrebasse@107 | 129 		filtersState.slotValue = TradeSkillFrame.filterTbl.slotValue | 
| contrebasse@24 | 130 | 
| contrebasse@107 | 131 		-- Remove all filters | 
| contrebasse@108 | 132 		SetTradeSkillItemNameFilter(nil) | 
| contrebasse@108 | 133 		SetTradeSkillItemLevelFilter(0, 0) | 
| contrebasse@107 | 134 		TradeSkillFrame.filterTbl.hasMaterials = false | 
| contrebasse@107 | 135 		TradeSkillFrame.filterTbl.hasSkillUp = false | 
| contrebasse@107 | 136 		TradeSkillFrame.filterTbl.subClassValue = -1 | 
| contrebasse@107 | 137 		TradeSkillFrame.filterTbl.slotValue = -1 | 
| contrebasse@107 | 138 		ApplyFilters() | 
| contrebasse@24 | 139 | 
| contrebasse@24 | 140 		-- Headers | 
| contrebasse@107 | 141 		headersState.headerName = headerName | 
| contrebasse@24 | 142 		for i = GetNumTradeSkills(), 1, -1 do		-- 1st pass, expand all categories | 
| contrebasse@82 | 143 			local skillName, skillType, _, isExpanded  = GetTradeSkillInfo(i) | 
| contrebasse@108 | 144 			if (skillType == "header") and skillName==headerName then | 
| contrebasse@108 | 145 				if not isExpanded then | 
| contrebasse@108 | 146 					ExpandTradeSkillSubClass(i) | 
| contrebasse@108 | 147 					table.insert(headersState,true) | 
| contrebasse@108 | 148 				else | 
| contrebasse@108 | 149 					table.insert(headersState,false) | 
| contrebasse@24 | 150 				end | 
| contrebasse@108 | 151 			end | 
| contrebasse@24 | 152 		end | 
| contrebasse@24 | 153 | 
| contrebasse@108 | 154 		stateSaved = true | 
| contrebasse@108 | 155 		A.blockScan = nil | 
| contrebasse@108 | 156 | 
| contrebasse@107 | 157 		--@todo Scroll down to the selected recipe | 
| contrebasse@107 | 158 		-- with TradeSkillSkillXX:Show() ? | 
| contrebasse@24 | 159 	end | 
| contrebasse@24 | 160 | 
| contrebasse@24 | 161 	function A.RestoreActiveFilters() | 
| contrebasse@107 | 162 		if not stateSaved then return end | 
| contrebasse@82 | 163 		A.blockScan = true | 
| contrebasse@82 | 164 | 
| contrebasse@107 | 165 		-- restore headers | 
| contrebasse@24 | 166 		for i = GetNumTradeSkills(), 1, -1 do | 
| contrebasse@107 | 167 			local skillName, skillType  = GetTradeSkillInfo(i) | 
| contrebasse@107 | 168 			if (skillType == "header") and skillName==headersState.headerName and table.remove(headersState,1) then | 
| contrebasse@24 | 169 					CollapseTradeSkillSubClass(i) | 
| contrebasse@24 | 170 			end | 
| contrebasse@24 | 171 		end | 
| contrebasse@24 | 172 		wipe(headersState) | 
| contrebasse@107 | 173 | 
| contrebasse@107 | 174 		-- restore filters | 
| contrebasse@108 | 175 		SetTradeSkillItemNameFilter(filtersState.text) | 
| contrebasse@108 | 176 		SetTradeSkillItemLevelFilter(filtersState.minLevel, filtersState.maxLevel) | 
| contrebasse@107 | 177 		TradeSkillFrame.filterTbl.hasMaterials = filtersState.hasMaterials | 
| contrebasse@107 | 178 		TradeSkillFrame.filterTbl.hasSkillUp = filtersState.hasSkillUp | 
| contrebasse@107 | 179 		TradeSkillFrame.filterTbl.subClassValue = filtersState.subClassValue | 
| contrebasse@107 | 180 		TradeSkillFrame.filterTbl.slotValue = filtersState.slotValue | 
| contrebasse@107 | 181 		ApplyFilters() | 
| contrebasse@107 | 182 | 
| contrebasse@108 | 183 		stateSaved = nil | 
| contrebasse@108 | 184 		A.blockScan = nil | 
| contrebasse@107 | 185 | 
| contrebasse@108 | 186 		--@todo Scroll down to the selected recipe | 
| contrebasse@108 | 187 		-- with TradeSkillSkillXX:Show() ? | 
| contrebasse@24 | 188 	end | 
| contrebasse@24 | 189 end | 
| contrebasse@73 | 190 | 
| contrebasse@73 | 191 function A.isRecipeUnique(itemData) | 
| contrebasse@73 | 192 	local unique = true | 
| contrebasse@107 | 193 | 
| contrebasse@73 | 194 	-- Check if the item is made by only one recipe. If not, return | 
| contrebasse@73 | 195 	if #itemData>1 then | 
| contrebasse@73 | 196 		local spellLink | 
| contrebasse@73 | 197 		for _,v in ipairs(itemData) do | 
| contrebasse@73 | 198 			if not spellLink then | 
| contrebasse@73 | 199 				spellLink = v.spellLink | 
| contrebasse@73 | 200 			else | 
| contrebasse@73 | 201 				if v.spellLink ~= spellLink then | 
| contrebasse@73 | 202 					unique = nil | 
| contrebasse@73 | 203 					break | 
| contrebasse@73 | 204 				end | 
| contrebasse@73 | 205 			end | 
| contrebasse@73 | 206 		end | 
| contrebasse@73 | 207 	end | 
| contrebasse@107 | 208 | 
| contrebasse@73 | 209 	return unique | 
| contrebasse@73 | 210 end | 
| contrebasse@76 | 211 | 
| contrebasse@76 | 212 --[[ | 
| contrebasse@76 | 213 function A.isTradeskillUnique(itemData) | 
| contrebasse@85 | 214 	local spellName = itemData[1].spellName | 
| contrebasse@107 | 215 | 
| contrebasse@76 | 216 	-- Check if the item is made by only one recipe. If not, return | 
| contrebasse@76 | 217 	if #itemData>1 then | 
| contrebasse@76 | 218 		for _,v in ipairs(itemData) do | 
| contrebasse@85 | 219 			if v.spellName ~= spellName then | 
| contrebasse@85 | 220 				spellName = nil | 
| contrebasse@76 | 221 				break | 
| contrebasse@76 | 222 			end | 
| contrebasse@76 | 223 		end | 
| contrebasse@76 | 224 	end | 
| contrebasse@89 | 225 | 
| contrebasse@85 | 226 	return spellName | 
| contrebasse@76 | 227 end | 
| contrebasse@107 | 228 --]] |