annotate utils.lua @ 46:40d6886d1966

Correct the number of items to craft (the formulae was wrong and has to take the number of item crafted into account)
author contrebasse
date Sat, 30 Apr 2011 01:31:19 +0200
parents 00c2282f073a
children 08dfba564a6e
rev   line source
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@16 59 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(i)
contrebasse@16 60 if skillType == "header" then
contrebasse@16 61 else
contrebasse@16 62 if skillName then
contrebasse@16 63 local ID = A.link2ID(GetTradeSkillItemLink(i))
contrebasse@16 64 if ID and ID == itemID then
contrebasse@16 65 return i
contrebasse@16 66 end -- if
contrebasse@3 67 end -- if
contrebasse@3 68 end -- if
contrebasse@16 69 end -- for
contrebasse@43 70 A.Error("Tradeskill not found for "..itemID..", is the recipe hidden ?")
contrebasse@16 71 end -- function
contrebasse@16 72 end -- do
contrebasse@24 73
contrebasse@24 74
contrebasse@24 75 -- Taken from Datastore_Crafts
contrebasse@24 76 -- *** Scanning functions ***
contrebasse@24 77 do
contrebasse@24 78 local selectedTradeSkillIndex
contrebasse@24 79 local subClasses, subClassID
contrebasse@24 80 local invSlots, invSlotID
contrebasse@24 81 local haveMats
contrebasse@24 82 local headersState = {}
contrebasse@24 83
contrebasse@24 84 local function GetSubClassID()
contrebasse@24 85 -- The purpose of this function is to get the subClassID in a UI independant way
contrebasse@24 86 -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name.
contrebasse@24 87
contrebasse@24 88 if GetTradeSkillSubClassFilter(0) then -- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0
contrebasse@24 89 return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown))
contrebasse@24 90 end
contrebasse@24 91
contrebasse@24 92 local filter
contrebasse@24 93 for i = 1, #subClasses do
contrebasse@24 94 filter = GetTradeSkillSubClassFilter(i)
contrebasse@24 95 if filter then
contrebasse@24 96 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 97 end
contrebasse@24 98 end
contrebasse@24 99 end
contrebasse@24 100
contrebasse@24 101 local function GetInvSlotID()
contrebasse@24 102 -- The purpose of this function is to get the invSlotID in a UI independant way (same as GetSubClassID)
contrebasse@24 103 -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name.
contrebasse@24 104
contrebasse@24 105 if GetTradeSkillInvSlotFilter(0) then -- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0
contrebasse@24 106 return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown))
contrebasse@24 107 end
contrebasse@24 108
contrebasse@24 109 local filter
contrebasse@24 110 for i = 1, #invSlots do
contrebasse@24 111 filter = GetTradeSkillInvSlotFilter(i)
contrebasse@24 112 if filter then
contrebasse@24 113 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 114 end
contrebasse@24 115 end
contrebasse@24 116 end
contrebasse@24 117
contrebasse@24 118 function A.SaveActiveFilters()
contrebasse@24 119 print("save")
contrebasse@24 120 selectedTradeSkillIndex = GetTradeSkillSelectionIndex()
contrebasse@24 121
contrebasse@24 122 subClasses = { GetTradeSkillSubClasses() }
contrebasse@24 123 invSlots = { GetTradeSkillInvSlots() }
contrebasse@24 124 subClassID = GetSubClassID()
contrebasse@24 125 invSlotID = GetInvSlotID()
contrebasse@24 126
contrebasse@24 127 -- Subclasses
contrebasse@24 128 SetTradeSkillSubClassFilter(0, 1, 1) -- this checks "All subclasses"
contrebasse@24 129 if TradeSkillSubClassDropDown then
contrebasse@24 130 UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1)
contrebasse@24 131 end
contrebasse@24 132
contrebasse@24 133 -- Inventory slots
contrebasse@24 134 SetTradeSkillInvSlotFilter(0, 1, 1) -- this checks "All slots"
contrebasse@24 135 if TradeSkillInvSlotDropDown then
contrebasse@24 136 UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1)
contrebasse@24 137 end
contrebasse@24 138
contrebasse@24 139 -- Have Materials
contrebasse@24 140 if TradeSkillFrameAvailableFilterCheckButton then
contrebasse@24 141 haveMats = TradeSkillFrameAvailableFilterCheckButton:GetChecked() -- nil or true
contrebasse@24 142 TradeSkillFrameAvailableFilterCheckButton:SetChecked(false)
contrebasse@24 143 end
contrebasse@24 144 TradeSkillOnlyShowMakeable(false)
contrebasse@24 145
contrebasse@24 146 -- Headers
contrebasse@24 147 local headerCount = 0 -- use a counter to avoid being bound to header names, which might not be unique.
contrebasse@24 148
contrebasse@24 149 for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories
contrebasse@24 150 local _, skillType, _, isExpanded = GetTradeSkillInfo(i)
contrebasse@24 151 if (skillType == "header") then
contrebasse@24 152 headerCount = headerCount + 1
contrebasse@24 153 if not isExpanded then
contrebasse@24 154 ExpandTradeSkillSubClass(i)
contrebasse@24 155 headersState[headerCount] = true
contrebasse@24 156 end
contrebasse@24 157 end
contrebasse@24 158 end
contrebasse@24 159
contrebasse@24 160 print("saved")
contrebasse@24 161 end
contrebasse@24 162
contrebasse@24 163 function A.RestoreActiveFilters()
contrebasse@24 164 print("restore")
contrebasse@24 165 -- Subclasses
contrebasse@24 166 SetTradeSkillSubClassFilter(subClassID-1, 1, 1) -- this checks the previously checked value
contrebasse@24 167
contrebasse@24 168 local frame = TradeSkillSubClassDropDown
contrebasse@24 169 if frame then -- other addons might nil this frame (delayed load, etc..), so secure DDM calls
contrebasse@24 170 local text = (subClassID == 1) and ALL_SUBCLASSES or subClasses[subClassID-1]
contrebasse@24 171 UIDropDownMenu_SetSelectedID(frame, subClassID)
contrebasse@24 172 UIDropDownMenu_SetText(frame, text);
contrebasse@24 173 end
contrebasse@24 174
contrebasse@24 175 subClassID = nil
contrebasse@24 176 wipe(subClasses)
contrebasse@24 177 subClasses = nil
contrebasse@24 178
contrebasse@24 179 -- Inventory slots
contrebasse@24 180 invSlotID = invSlotID or 1
contrebasse@24 181 SetTradeSkillInvSlotFilter(invSlotID-1, 1, 1) -- this checks the previously checked value
contrebasse@24 182
contrebasse@24 183 frame = TradeSkillInvSlotDropDown
contrebasse@24 184 if frame then
contrebasse@24 185 local text = (invSlotID == 1) and ALL_INVENTORY_SLOTS or invSlots[invSlotID-1]
contrebasse@24 186 UIDropDownMenu_SetSelectedID(frame, invSlotID)
contrebasse@24 187 UIDropDownMenu_SetText(frame, text);
contrebasse@24 188 end
contrebasse@24 189
contrebasse@24 190 invSlotID = nil
contrebasse@24 191 wipe(invSlots)
contrebasse@24 192 invSlots = nil
contrebasse@24 193
contrebasse@24 194 -- Have Materials
contrebasse@24 195 if TradeSkillFrameAvailableFilterCheckButton then
contrebasse@24 196 TradeSkillFrameAvailableFilterCheckButton:SetChecked(haveMats or false)
contrebasse@24 197 end
contrebasse@24 198 TradeSkillOnlyShowMakeable(haveMats or false)
contrebasse@24 199 haveMats = nil
contrebasse@24 200
contrebasse@24 201 SelectTradeSkill(selectedTradeSkillIndex)
contrebasse@24 202 selectedTradeSkillIndex = nil
contrebasse@24 203
contrebasse@24 204 -- Headers
contrebasse@24 205 local headerCount = 0
contrebasse@24 206 for i = GetNumTradeSkills(), 1, -1 do
contrebasse@24 207 local _, skillType = GetTradeSkillInfo(i)
contrebasse@24 208 if (skillType == "header") then
contrebasse@24 209 headerCount = headerCount + 1
contrebasse@24 210 if headersState[headerCount] then
contrebasse@24 211 CollapseTradeSkillSubClass(i)
contrebasse@24 212 end
contrebasse@24 213 end
contrebasse@24 214 end
contrebasse@24 215 wipe(headersState)
contrebasse@24 216 end
contrebasse@24 217 print("restored")
contrebasse@24 218 end