contrebasse@0: local addonName, A = ... contrebasse@0: contrebasse@16: -- Lua functions contrebasse@16: local tonumber = tonumber contrebasse@16: local select = select contrebasse@16: local sfind = string.find contrebasse@16: contrebasse@16: -- Wow functions contrebasse@16: contrebasse@3: -- DEBUG Print contrebasse@3: function A.DEBUG(msg) contrebasse@16: -- GLOBALS: DEFAULT_CHAT_FRAME contrebasse@3: DEFAULT_CHAT_FRAME:AddMessage(msg or "nil",1,0,0) contrebasse@3: end -- function contrebasse@0: contrebasse@38: -- Messages to the user contrebasse@38: function A.Warn(msg) contrebasse@38: if not msg then return end contrebasse@38: local event = "UI_INFO_MESSAGE" contrebasse@38: UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg) contrebasse@38: end -- function contrebasse@38: function A.Error(msg) contrebasse@38: if not msg then return end contrebasse@38: local event = "UI_ERROR_MESSAGE" contrebasse@38: UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg) contrebasse@38: end -- function contrebasse@38: contrebasse@3: -- Returns the item ID from its link contrebasse@3: function A.link2ID(link) contrebasse@16: return tonumber(select(3,sfind(link or "", "-*:(%d+)[:|].*")) or "") contrebasse@3: end -- function contrebasse@3: contrebasse@3: -- Returns the button number for the reagents buttons contrebasse@3: function A.buttonNumber(btn) contrebasse@3: -- "TradeSkillReagentN" contrebasse@3: return tonumber(btn:GetName():sub(-1)) contrebasse@0: end contrebasse@0: contrebasse@16: do contrebasse@16: -- Wow functions contrebasse@16: local GetTradeSkillInfo = GetTradeSkillInfo contrebasse@16: local GetNumTradeSkills = GetNumTradeSkills contrebasse@16: local GetTradeSkillItemLink = GetTradeSkillItemLink contrebasse@0: contrebasse@16: -- Gives the number of craftable objects contrebasse@108: --[[ contrebasse@16: function A.numMakable(reagentID) contrebasse@16: -- Look for the recipe to make the item contrebasse@16: local reagentIndex = A.findSkillIndex(reagentID) contrebasse@25: if not reagentIndex then return end contrebasse@3: contrebasse@16: -- Check how many items we can craft contrebasse@16: local skillName, skillType, numReagentMakable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(reagentIndex) contrebasse@25: return numReagentMakable, reagentIndex contrebasse@16: end contrebasse@108: --]] contrebasse@108: function A.numMakable(reagentID) contrebasse@108: -- No recipe contrebasse@108: if not A.data[reagentID] then return 0 end contrebasse@108: contrebasse@108: -- Many recipes contrebasse@108: local n = 0 contrebasse@108: local itemCount contrebasse@108: for _,recipe in pairs(A.data[reagentID]) do contrebasse@108: if recipe[1] then -- only one reagent contrebasse@108: itemCount = GetItemCount(recipe[1]) contrebasse@108: if not itemCount then return end contrebasse@108: n = n + math.floor(itemCount/recipe[2]) contrebasse@108: else -- many reagents contrebasse@108: local m contrebasse@108: for _,reagent in pairs(recipe[2]) do contrebasse@108: itemCount = GetItemCount(reagent[1]) contrebasse@108: if not itemCount then return end contrebasse@108: if not m then contrebasse@108: m = math.floor(itemCount/reagent[2]) contrebasse@108: else contrebasse@108: m = math.min(m,math.floor(itemCount/reagent[2])) contrebasse@108: end contrebasse@108: if m==0 then break end contrebasse@108: end contrebasse@108: n = n + m contrebasse@108: end -- if contrebasse@108: end -- for contrebasse@108: return n contrebasse@108: end -- function contrebasse@16: contrebasse@16: -- Find the first tradeskill index of the recipe to make an item contrebasse@16: function A.findSkillIndex(itemID) contrebasse@16: for i = 1,GetNumTradeSkills() do contrebasse@82: local _, skillType = GetTradeSkillInfo(i) contrebasse@16: if skillType == "header" then contrebasse@16: else contrebasse@70: local ID = A.link2ID(GetTradeSkillItemLink(i)) contrebasse@70: if ID and ID == itemID then contrebasse@70: return i contrebasse@3: end -- if contrebasse@3: end -- if contrebasse@16: end -- for contrebasse@16: end -- function contrebasse@16: end -- do contrebasse@24: contrebasse@24: contrebasse@24: -- Taken from Datastore_Crafts contrebasse@24: -- *** Scanning functions *** contrebasse@24: do contrebasse@24: local selectedTradeSkillIndex contrebasse@107: local stateSaved contrebasse@107: local filtersState = {} contrebasse@24: local headersState = {} contrebasse@24: contrebasse@107: local function ApplyFilters() contrebasse@107: TradeSkillOnlyShowSkillUps(TradeSkillFrame.filterTbl.hasSkillUp); contrebasse@107: TradeSkillOnlyShowMakeable(TradeSkillFrame.filterTbl.hasMaterials); contrebasse@107: SetTradeSkillSubClassFilter(TradeSkillFrame.filterTbl.subClassValue, 1, 1); contrebasse@107: SetTradeSkillInvSlotFilter(TradeSkillFrame.filterTbl.slotValue, 1, 1); contrebasse@107: TradeSkillUpdateFilterBar(); contrebasse@107: CloseDropDownMenus(); contrebasse@107: end contrebasse@107: contrebasse@82: function A.SaveActiveFilters(headerName) contrebasse@82: A.blockScan = true contrebasse@82: contrebasse@107: -- Save filters contrebasse@108: filtersState.text = GetTradeSkillItemNameFilter() contrebasse@108: filtersState.minLevel, filtersState.maxLevel = GetTradeSkillItemLevelFilter() contrebasse@107: filtersState.hasMaterials = TradeSkillFrame.filterTbl.hasMaterials contrebasse@107: filtersState.hasSkillUp = TradeSkillFrame.filterTbl.hasSkillUp contrebasse@107: filtersState.subClassValue = TradeSkillFrame.filterTbl.subClassValue contrebasse@107: filtersState.slotValue = TradeSkillFrame.filterTbl.slotValue contrebasse@24: contrebasse@107: -- Remove all filters contrebasse@108: SetTradeSkillItemNameFilter(nil) contrebasse@108: SetTradeSkillItemLevelFilter(0, 0) contrebasse@107: TradeSkillFrame.filterTbl.hasMaterials = false contrebasse@107: TradeSkillFrame.filterTbl.hasSkillUp = false contrebasse@107: TradeSkillFrame.filterTbl.subClassValue = -1 contrebasse@107: TradeSkillFrame.filterTbl.slotValue = -1 contrebasse@107: ApplyFilters() contrebasse@24: contrebasse@24: -- Headers contrebasse@107: headersState.headerName = headerName contrebasse@24: for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories contrebasse@82: local skillName, skillType, _, isExpanded = GetTradeSkillInfo(i) contrebasse@108: if (skillType == "header") and skillName==headerName then contrebasse@108: if not isExpanded then contrebasse@108: ExpandTradeSkillSubClass(i) contrebasse@108: table.insert(headersState,true) contrebasse@108: else contrebasse@108: table.insert(headersState,false) contrebasse@24: end contrebasse@108: end contrebasse@24: end contrebasse@24: contrebasse@108: stateSaved = true contrebasse@108: A.blockScan = nil contrebasse@108: contrebasse@107: --@todo Scroll down to the selected recipe contrebasse@107: -- with TradeSkillSkillXX:Show() ? contrebasse@24: end contrebasse@24: contrebasse@24: function A.RestoreActiveFilters() contrebasse@107: if not stateSaved then return end contrebasse@82: A.blockScan = true contrebasse@82: contrebasse@107: -- restore headers contrebasse@24: for i = GetNumTradeSkills(), 1, -1 do contrebasse@107: local skillName, skillType = GetTradeSkillInfo(i) contrebasse@107: if (skillType == "header") and skillName==headersState.headerName and table.remove(headersState,1) then contrebasse@24: CollapseTradeSkillSubClass(i) contrebasse@24: end contrebasse@24: end contrebasse@24: wipe(headersState) contrebasse@107: contrebasse@107: -- restore filters contrebasse@108: SetTradeSkillItemNameFilter(filtersState.text) contrebasse@108: SetTradeSkillItemLevelFilter(filtersState.minLevel, filtersState.maxLevel) contrebasse@107: TradeSkillFrame.filterTbl.hasMaterials = filtersState.hasMaterials contrebasse@107: TradeSkillFrame.filterTbl.hasSkillUp = filtersState.hasSkillUp contrebasse@107: TradeSkillFrame.filterTbl.subClassValue = filtersState.subClassValue contrebasse@107: TradeSkillFrame.filterTbl.slotValue = filtersState.slotValue contrebasse@107: ApplyFilters() contrebasse@107: contrebasse@108: stateSaved = nil contrebasse@108: A.blockScan = nil contrebasse@107: contrebasse@108: --@todo Scroll down to the selected recipe contrebasse@108: -- with TradeSkillSkillXX:Show() ? contrebasse@24: end contrebasse@24: end contrebasse@73: contrebasse@73: function A.isRecipeUnique(itemData) contrebasse@73: local unique = true contrebasse@107: contrebasse@73: -- Check if the item is made by only one recipe. If not, return contrebasse@73: if #itemData>1 then contrebasse@73: local spellLink contrebasse@73: for _,v in ipairs(itemData) do contrebasse@73: if not spellLink then contrebasse@73: spellLink = v.spellLink contrebasse@73: else contrebasse@73: if v.spellLink ~= spellLink then contrebasse@73: unique = nil contrebasse@73: break contrebasse@73: end contrebasse@73: end contrebasse@73: end contrebasse@73: end contrebasse@107: contrebasse@73: return unique contrebasse@73: end contrebasse@76: contrebasse@76: --[[ contrebasse@76: function A.isTradeskillUnique(itemData) contrebasse@85: local spellName = itemData[1].spellName contrebasse@107: contrebasse@76: -- Check if the item is made by only one recipe. If not, return contrebasse@76: if #itemData>1 then contrebasse@76: for _,v in ipairs(itemData) do contrebasse@85: if v.spellName ~= spellName then contrebasse@85: spellName = nil contrebasse@76: break contrebasse@76: end contrebasse@76: end contrebasse@76: end contrebasse@89: contrebasse@85: return spellName contrebasse@76: end contrebasse@107: --]]