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@16: local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(i) contrebasse@16: if skillType == "header" then contrebasse@16: else contrebasse@16: if skillName then contrebasse@16: local ID = A.link2ID(GetTradeSkillItemLink(i)) contrebasse@16: if ID and ID == itemID then contrebasse@16: return i contrebasse@16: end -- if contrebasse@3: end -- if contrebasse@3: end -- if contrebasse@16: end -- for contrebasse@43: A.Error("Tradeskill not found for "..itemID..", is the recipe hidden ?") 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@24: function A.SaveActiveFilters() contrebasse@24: print("save") 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@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@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@24: contrebasse@24: -- Headers contrebasse@24: local headerCount = 0 -- use a counter to avoid being bound to header names, which might not be unique. contrebasse@24: contrebasse@24: for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories contrebasse@24: local _, skillType, _, isExpanded = GetTradeSkillInfo(i) contrebasse@24: if (skillType == "header") then contrebasse@24: headerCount = headerCount + 1 contrebasse@24: if not isExpanded then contrebasse@24: ExpandTradeSkillSubClass(i) contrebasse@24: headersState[headerCount] = true contrebasse@24: end contrebasse@24: end contrebasse@24: end contrebasse@24: contrebasse@24: print("saved") contrebasse@24: end contrebasse@24: contrebasse@24: function A.RestoreActiveFilters() 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@24: end