| 
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 --]]
 |