contrebasse@0: local addonName, A = ... contrebasse@0: contrebasse@111: -- GLOBALS: UIErrorsFrame, UIErrorsFrame_OnEvent contrebasse@111: contrebasse@16: -- Lua functions contrebasse@16: local tonumber = tonumber contrebasse@16: local select = select contrebasse@16: local sfind = string.find contrebasse@111: local min = math.min contrebasse@111: local floor = math.floor contrebasse@111: local pairs = pairs contrebasse@111: local ipairs = ipairs contrebasse@111: local wipe = wipe contrebasse@111: local tinsert = tinsert contrebasse@111: local tremove = tremove contrebasse@16: contrebasse@16: -- Wow functions contrebasse@111: local GetItemCount = GetItemCount 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@111: local GetTradeSkillRecipeLink = GetTradeSkillRecipeLink contrebasse@0: contrebasse@110: function A.numRecipeMakable(reagentIDIfUnique,reagents) contrebasse@111: local itemCount contrebasse@110: if reagentIDIfUnique then -- only one reagent contrebasse@110: itemCount = GetItemCount(reagentIDIfUnique) contrebasse@110: if not itemCount then return end contrebasse@111: return floor(itemCount/reagents) contrebasse@110: else -- many reagents contrebasse@110: local m contrebasse@110: for _,reagent in pairs(reagents) do contrebasse@110: itemCount = GetItemCount(reagent[1]) contrebasse@110: if not itemCount then return end contrebasse@110: if not m then contrebasse@111: m = floor(itemCount/reagent[2]) contrebasse@110: else contrebasse@111: m = min(m,floor(itemCount/reagent[2])) contrebasse@110: end contrebasse@110: if m==0 then break end contrebasse@110: end contrebasse@110: return m contrebasse@110: end -- if contrebasse@110: end contrebasse@110: contrebasse@116: -- Gives the total number of craftable items 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@116: local n1 = 0 contrebasse@116: local n2 = 0 contrebasse@116: local m contrebasse@116: local approx = nil contrebasse@108: for _,recipe in pairs(A.data[reagentID]) do contrebasse@116: -- number of times the recipe is makable contrebasse@116: m = A.numRecipeMakable(recipe[1],recipe[2]) contrebasse@116: if not m then return end contrebasse@116: contrebasse@116: -- number of items it gives contrebasse@116: if not recipe[3] or recipe[3]==1 then contrebasse@116: n1 = n1 + m contrebasse@116: n2 = n2 + m contrebasse@116: elseif recipe[3]<1 then contrebasse@116: approx = approx or m>0 -- 0 is not approx contrebasse@116: n1 = n1 + m*recipe[3] contrebasse@116: n2 = n2 + m*recipe[3] contrebasse@116: elseif recipe[4] then contrebasse@116: n1 = n1 + m*recipe[3] contrebasse@116: n2 = n2 + m*recipe[4] contrebasse@116: else contrebasse@116: n1 = n1 + m*recipe[3] contrebasse@116: n2 = n2 + m*recipe[3] contrebasse@116: end contrebasse@108: end -- for contrebasse@116: return n1,n2,approx 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@110: if not itemID then return end contrebasse@16: for i = 1,GetNumTradeSkills() do contrebasse@110: if select(2,GetTradeSkillInfo(i)) ~= "header" and A.link2ID(GetTradeSkillItemLink(i)) == itemID then contrebasse@110: return i contrebasse@110: end -- if contrebasse@110: end -- for contrebasse@110: end -- function contrebasse@110: contrebasse@110: -- Find the exact tradeskill index of the recipe to make an item contrebasse@111: function A.findExactSkillIndex(itemID,recipeLink) contrebasse@111: if not itemID or not recipeLink then return end contrebasse@110: for i = 1,GetNumTradeSkills() do contrebasse@111: if select(2,GetTradeSkillInfo(i)) ~= "header" and GetTradeSkillRecipeLink(i)==recipeLink and A.link2ID(GetTradeSkillItemLink(i)) == itemID then contrebasse@110: return i contrebasse@3: end -- if contrebasse@16: end -- for contrebasse@16: end -- function contrebasse@16: end -- do contrebasse@24: contrebasse@24: contrebasse@110: -- Bypass filters and collpsed headers 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@111: -- Save position contrebasse@111: filtersState.positionOffset = FauxScrollFrame_GetOffset(TradeSkillListScrollFrame) contrebasse@111: filtersState.positionValue = TradeSkillListScrollFrameScrollBar:GetValue() contrebasse@111: 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@111: tinsert(headersState,true) contrebasse@108: else contrebasse@111: tinsert(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@111: if (skillType == "header") and skillName==headersState.headerName and tremove(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@111: -- Re set position contrebasse@111: FauxScrollFrame_SetOffset(TradeSkillListScrollFrame,filtersState.positionOffset) contrebasse@111: TradeSkillListScrollFrameScrollBar:SetValue(filtersState.positionValue) contrebasse@111: 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@110: local tradeskillName = itemData[1].tradeskillName 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@110: if v.tradeskillName ~= tradeskillName then contrebasse@110: tradeskillName = nil contrebasse@76: break contrebasse@76: end contrebasse@76: end contrebasse@76: end contrebasse@89: contrebasse@110: return tradeskillName contrebasse@76: end contrebasse@107: --]]