| 
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@89
 | 
   265 
 | 
| 
contrebasse@85
 | 
   266 	return spellName
 | 
| 
contrebasse@76
 | 
   267 end
 | 
| 
contrebasse@76
 | 
   268 --]] |