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@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@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@24: local subClasses, subClassID contrebasse@24: local invSlots, invSlotID contrebasse@24: local haveMats contrebasse@24: local headersState = {} contrebasse@24: contrebasse@24: local function GetSubClassID() contrebasse@24: -- The purpose of this function is to get the subClassID in a UI independant way contrebasse@24: -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name. contrebasse@24: contrebasse@24: if GetTradeSkillSubClassFilter(0) then -- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0 contrebasse@24: return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown)) contrebasse@24: end contrebasse@24: contrebasse@24: local filter contrebasse@24: for i = 1, #subClasses do contrebasse@24: filter = GetTradeSkillSubClassFilter(i) contrebasse@24: if filter then contrebasse@24: 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: end contrebasse@24: end contrebasse@24: end contrebasse@24: contrebasse@24: local function GetInvSlotID() contrebasse@24: -- The purpose of this function is to get the invSlotID in a UI independant way (same as GetSubClassID) contrebasse@24: -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name. contrebasse@24: contrebasse@24: if GetTradeSkillInvSlotFilter(0) then -- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0 contrebasse@24: return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown)) contrebasse@24: end contrebasse@24: contrebasse@24: local filter contrebasse@24: for i = 1, #invSlots do contrebasse@24: filter = GetTradeSkillInvSlotFilter(i) contrebasse@24: if filter then contrebasse@24: 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: end contrebasse@24: end contrebasse@24: end contrebasse@24: contrebasse@82: function A.SaveActiveFilters(headerName) contrebasse@82: A.blockScan = true contrebasse@82: contrebasse@82: --[[ contrebasse@24: print("save") contrebasse@82: print(GetNumTradeSkills()) contrebasse@24: selectedTradeSkillIndex = GetTradeSkillSelectionIndex() contrebasse@24: contrebasse@24: subClasses = { GetTradeSkillSubClasses() } contrebasse@24: invSlots = { GetTradeSkillInvSlots() } contrebasse@24: subClassID = GetSubClassID() contrebasse@24: invSlotID = GetInvSlotID() contrebasse@24: contrebasse@24: -- Subclasses contrebasse@24: SetTradeSkillSubClassFilter(0, 1, 1) -- this checks "All subclasses" contrebasse@24: if TradeSkillSubClassDropDown then contrebasse@24: UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1) contrebasse@24: end contrebasse@82: print(GetNumTradeSkills()) contrebasse@24: contrebasse@24: -- Inventory slots contrebasse@24: SetTradeSkillInvSlotFilter(0, 1, 1) -- this checks "All slots" contrebasse@24: if TradeSkillInvSlotDropDown then contrebasse@24: UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1) contrebasse@24: end contrebasse@82: print(GetNumTradeSkills()) contrebasse@24: contrebasse@24: -- Have Materials contrebasse@24: if TradeSkillFrameAvailableFilterCheckButton then contrebasse@24: haveMats = TradeSkillFrameAvailableFilterCheckButton:GetChecked() -- nil or true contrebasse@24: TradeSkillFrameAvailableFilterCheckButton:SetChecked(false) contrebasse@24: end contrebasse@24: TradeSkillOnlyShowMakeable(false) contrebasse@82: print(GetNumTradeSkills()) contrebasse@82: --]] contrebasse@24: contrebasse@24: -- Headers contrebasse@82: --local headerCount = 0 -- use a counter to avoid being bound to header names, which might not be unique. contrebasse@24: for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories contrebasse@82: local skillName, skillType, _, isExpanded = GetTradeSkillInfo(i) contrebasse@24: if (skillType == "header") then contrebasse@82: --headerCount = headerCount + 1 contrebasse@82: if not isExpanded and skillName==headerName then contrebasse@24: ExpandTradeSkillSubClass(i) contrebasse@82: --print(GetNumTradeSkills()) contrebasse@82: --headersState[headerCount] = true contrebasse@24: end contrebasse@24: end contrebasse@24: end contrebasse@24: contrebasse@82: --print("saved") contrebasse@82: contrebasse@82: A.blockScan = nil contrebasse@24: end contrebasse@24: contrebasse@24: function A.RestoreActiveFilters() contrebasse@82: A.blockScan = true contrebasse@82: contrebasse@24: print("restore") contrebasse@24: -- Subclasses contrebasse@24: SetTradeSkillSubClassFilter(subClassID-1, 1, 1) -- this checks the previously checked value contrebasse@24: contrebasse@24: local frame = TradeSkillSubClassDropDown contrebasse@24: if frame then -- other addons might nil this frame (delayed load, etc..), so secure DDM calls contrebasse@24: local text = (subClassID == 1) and ALL_SUBCLASSES or subClasses[subClassID-1] contrebasse@24: UIDropDownMenu_SetSelectedID(frame, subClassID) contrebasse@24: UIDropDownMenu_SetText(frame, text); contrebasse@24: end contrebasse@24: contrebasse@24: subClassID = nil contrebasse@24: wipe(subClasses) contrebasse@24: subClasses = nil contrebasse@24: contrebasse@24: -- Inventory slots contrebasse@24: invSlotID = invSlotID or 1 contrebasse@24: SetTradeSkillInvSlotFilter(invSlotID-1, 1, 1) -- this checks the previously checked value contrebasse@24: contrebasse@24: frame = TradeSkillInvSlotDropDown contrebasse@24: if frame then contrebasse@24: local text = (invSlotID == 1) and ALL_INVENTORY_SLOTS or invSlots[invSlotID-1] contrebasse@24: UIDropDownMenu_SetSelectedID(frame, invSlotID) contrebasse@24: UIDropDownMenu_SetText(frame, text); contrebasse@24: end contrebasse@24: contrebasse@24: invSlotID = nil contrebasse@24: wipe(invSlots) contrebasse@24: invSlots = nil contrebasse@24: contrebasse@24: -- Have Materials contrebasse@24: if TradeSkillFrameAvailableFilterCheckButton then contrebasse@24: TradeSkillFrameAvailableFilterCheckButton:SetChecked(haveMats or false) contrebasse@24: end contrebasse@24: TradeSkillOnlyShowMakeable(haveMats or false) contrebasse@24: haveMats = nil contrebasse@24: contrebasse@24: SelectTradeSkill(selectedTradeSkillIndex) contrebasse@24: selectedTradeSkillIndex = nil contrebasse@24: contrebasse@24: -- Headers contrebasse@24: local headerCount = 0 contrebasse@24: for i = GetNumTradeSkills(), 1, -1 do contrebasse@24: local _, skillType = GetTradeSkillInfo(i) contrebasse@24: if (skillType == "header") then contrebasse@24: headerCount = headerCount + 1 contrebasse@24: if headersState[headerCount] then contrebasse@24: CollapseTradeSkillSubClass(i) contrebasse@24: end contrebasse@24: end contrebasse@24: end contrebasse@24: wipe(headersState) contrebasse@24: end contrebasse@24: print("restored") contrebasse@82: contrebasse@82: A.blockScan = nil contrebasse@24: end contrebasse@73: contrebasse@73: function A.isRecipeUnique(itemData) contrebasse@73: local unique = true contrebasse@73: 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@73: 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@76: 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@76: --]]