annotate utils.lua @ 96:e3147b41ea9d v1.0beta9

Correct display, tooltips and error message when there are actual tradeskill spells in the SecureMenu. Still not sure that it works with enough reagents...
author contrebasse
date Fri, 20 May 2011 00:53:42 +0200
parents 8dd86b6b76d8
children d64a19e5a47d
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@82 59 local _, skillType = GetTradeSkillInfo(i)
contrebasse@16 60 if skillType == "header" then
contrebasse@16 61 else
contrebasse@70 62 local ID = A.link2ID(GetTradeSkillItemLink(i))
contrebasse@70 63 if ID and ID == itemID then
contrebasse@70 64 return i
contrebasse@3 65 end -- if
contrebasse@3 66 end -- if
contrebasse@16 67 end -- for
contrebasse@16 68 end -- function
contrebasse@16 69 end -- do
contrebasse@24 70
contrebasse@24 71
contrebasse@24 72 -- Taken from Datastore_Crafts
contrebasse@24 73 -- *** Scanning functions ***
contrebasse@24 74 do
contrebasse@24 75 local selectedTradeSkillIndex
contrebasse@24 76 local subClasses, subClassID
contrebasse@24 77 local invSlots, invSlotID
contrebasse@24 78 local haveMats
contrebasse@24 79 local headersState = {}
contrebasse@24 80
contrebasse@24 81 local function GetSubClassID()
contrebasse@24 82 -- The purpose of this function is to get the subClassID in a UI independant way
contrebasse@24 83 -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name.
contrebasse@24 84
contrebasse@24 85 if GetTradeSkillSubClassFilter(0) then -- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0
contrebasse@24 86 return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown))
contrebasse@24 87 end
contrebasse@24 88
contrebasse@24 89 local filter
contrebasse@24 90 for i = 1, #subClasses do
contrebasse@24 91 filter = GetTradeSkillSubClassFilter(i)
contrebasse@24 92 if filter then
contrebasse@24 93 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 94 end
contrebasse@24 95 end
contrebasse@24 96 end
contrebasse@24 97
contrebasse@24 98 local function GetInvSlotID()
contrebasse@24 99 -- The purpose of this function is to get the invSlotID in a UI independant way (same as GetSubClassID)
contrebasse@24 100 -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name.
contrebasse@24 101
contrebasse@24 102 if GetTradeSkillInvSlotFilter(0) then -- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0
contrebasse@24 103 return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown))
contrebasse@24 104 end
contrebasse@24 105
contrebasse@24 106 local filter
contrebasse@24 107 for i = 1, #invSlots do
contrebasse@24 108 filter = GetTradeSkillInvSlotFilter(i)
contrebasse@24 109 if filter then
contrebasse@24 110 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 111 end
contrebasse@24 112 end
contrebasse@24 113 end
contrebasse@24 114
contrebasse@82 115 function A.SaveActiveFilters(headerName)
contrebasse@82 116 A.blockScan = true
contrebasse@82 117
contrebasse@82 118 --[[
contrebasse@24 119 print("save")
contrebasse@82 120 print(GetNumTradeSkills())
contrebasse@24 121 selectedTradeSkillIndex = GetTradeSkillSelectionIndex()
contrebasse@24 122
contrebasse@24 123 subClasses = { GetTradeSkillSubClasses() }
contrebasse@24 124 invSlots = { GetTradeSkillInvSlots() }
contrebasse@24 125 subClassID = GetSubClassID()
contrebasse@24 126 invSlotID = GetInvSlotID()
contrebasse@24 127
contrebasse@24 128 -- Subclasses
contrebasse@24 129 SetTradeSkillSubClassFilter(0, 1, 1) -- this checks "All subclasses"
contrebasse@24 130 if TradeSkillSubClassDropDown then
contrebasse@24 131 UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1)
contrebasse@24 132 end
contrebasse@82 133 print(GetNumTradeSkills())
contrebasse@24 134
contrebasse@24 135 -- Inventory slots
contrebasse@24 136 SetTradeSkillInvSlotFilter(0, 1, 1) -- this checks "All slots"
contrebasse@24 137 if TradeSkillInvSlotDropDown then
contrebasse@24 138 UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1)
contrebasse@24 139 end
contrebasse@82 140 print(GetNumTradeSkills())
contrebasse@24 141
contrebasse@24 142 -- Have Materials
contrebasse@24 143 if TradeSkillFrameAvailableFilterCheckButton then
contrebasse@24 144 haveMats = TradeSkillFrameAvailableFilterCheckButton:GetChecked() -- nil or true
contrebasse@24 145 TradeSkillFrameAvailableFilterCheckButton:SetChecked(false)
contrebasse@24 146 end
contrebasse@24 147 TradeSkillOnlyShowMakeable(false)
contrebasse@82 148 print(GetNumTradeSkills())
contrebasse@82 149 --]]
contrebasse@24 150
contrebasse@24 151 -- Headers
contrebasse@82 152 --local headerCount = 0 -- use a counter to avoid being bound to header names, which might not be unique.
contrebasse@24 153 for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories
contrebasse@82 154 local skillName, skillType, _, isExpanded = GetTradeSkillInfo(i)
contrebasse@24 155 if (skillType == "header") then
contrebasse@82 156 --headerCount = headerCount + 1
contrebasse@82 157 if not isExpanded and skillName==headerName then
contrebasse@24 158 ExpandTradeSkillSubClass(i)
contrebasse@82 159 --print(GetNumTradeSkills())
contrebasse@82 160 --headersState[headerCount] = true
contrebasse@24 161 end
contrebasse@24 162 end
contrebasse@24 163 end
contrebasse@24 164
contrebasse@82 165 --print("saved")
contrebasse@82 166
contrebasse@82 167 A.blockScan = nil
contrebasse@24 168 end
contrebasse@24 169
contrebasse@24 170 function A.RestoreActiveFilters()
contrebasse@82 171 A.blockScan = true
contrebasse@82 172
contrebasse@24 173 print("restore")
contrebasse@24 174 -- Subclasses
contrebasse@24 175 SetTradeSkillSubClassFilter(subClassID-1, 1, 1) -- this checks the previously checked value
contrebasse@24 176
contrebasse@24 177 local frame = TradeSkillSubClassDropDown
contrebasse@24 178 if frame then -- other addons might nil this frame (delayed load, etc..), so secure DDM calls
contrebasse@24 179 local text = (subClassID == 1) and ALL_SUBCLASSES or subClasses[subClassID-1]
contrebasse@24 180 UIDropDownMenu_SetSelectedID(frame, subClassID)
contrebasse@24 181 UIDropDownMenu_SetText(frame, text);
contrebasse@24 182 end
contrebasse@24 183
contrebasse@24 184 subClassID = nil
contrebasse@24 185 wipe(subClasses)
contrebasse@24 186 subClasses = nil
contrebasse@24 187
contrebasse@24 188 -- Inventory slots
contrebasse@24 189 invSlotID = invSlotID or 1
contrebasse@24 190 SetTradeSkillInvSlotFilter(invSlotID-1, 1, 1) -- this checks the previously checked value
contrebasse@24 191
contrebasse@24 192 frame = TradeSkillInvSlotDropDown
contrebasse@24 193 if frame then
contrebasse@24 194 local text = (invSlotID == 1) and ALL_INVENTORY_SLOTS or invSlots[invSlotID-1]
contrebasse@24 195 UIDropDownMenu_SetSelectedID(frame, invSlotID)
contrebasse@24 196 UIDropDownMenu_SetText(frame, text);
contrebasse@24 197 end
contrebasse@24 198
contrebasse@24 199 invSlotID = nil
contrebasse@24 200 wipe(invSlots)
contrebasse@24 201 invSlots = nil
contrebasse@24 202
contrebasse@24 203 -- Have Materials
contrebasse@24 204 if TradeSkillFrameAvailableFilterCheckButton then
contrebasse@24 205 TradeSkillFrameAvailableFilterCheckButton:SetChecked(haveMats or false)
contrebasse@24 206 end
contrebasse@24 207 TradeSkillOnlyShowMakeable(haveMats or false)
contrebasse@24 208 haveMats = nil
contrebasse@24 209
contrebasse@24 210 SelectTradeSkill(selectedTradeSkillIndex)
contrebasse@24 211 selectedTradeSkillIndex = nil
contrebasse@24 212
contrebasse@24 213 -- Headers
contrebasse@24 214 local headerCount = 0
contrebasse@24 215 for i = GetNumTradeSkills(), 1, -1 do
contrebasse@24 216 local _, skillType = GetTradeSkillInfo(i)
contrebasse@24 217 if (skillType == "header") then
contrebasse@24 218 headerCount = headerCount + 1
contrebasse@24 219 if headersState[headerCount] then
contrebasse@24 220 CollapseTradeSkillSubClass(i)
contrebasse@24 221 end
contrebasse@24 222 end
contrebasse@24 223 end
contrebasse@24 224 wipe(headersState)
contrebasse@24 225 end
contrebasse@24 226 print("restored")
contrebasse@82 227
contrebasse@82 228 A.blockScan = nil
contrebasse@24 229 end
contrebasse@73 230
contrebasse@73 231 function A.isRecipeUnique(itemData)
contrebasse@73 232 local unique = true
contrebasse@73 233
contrebasse@73 234 -- Check if the item is made by only one recipe. If not, return
contrebasse@73 235 if #itemData>1 then
contrebasse@73 236 local spellLink
contrebasse@73 237 for _,v in ipairs(itemData) do
contrebasse@73 238 if not spellLink then
contrebasse@73 239 spellLink = v.spellLink
contrebasse@73 240 else
contrebasse@73 241 if v.spellLink ~= spellLink then
contrebasse@73 242 unique = nil
contrebasse@73 243 break
contrebasse@73 244 end
contrebasse@73 245 end
contrebasse@73 246 end
contrebasse@73 247 end
contrebasse@73 248
contrebasse@73 249 return unique
contrebasse@73 250 end
contrebasse@76 251
contrebasse@76 252 --[[
contrebasse@76 253 function A.isTradeskillUnique(itemData)
contrebasse@85 254 local spellName = itemData[1].spellName
contrebasse@76 255
contrebasse@76 256 -- Check if the item is made by only one recipe. If not, return
contrebasse@76 257 if #itemData>1 then
contrebasse@76 258 for _,v in ipairs(itemData) do
contrebasse@85 259 if v.spellName ~= spellName then
contrebasse@85 260 spellName = nil
contrebasse@76 261 break
contrebasse@76 262 end
contrebasse@76 263 end
contrebasse@76 264 end
contrebasse@89 265
contrebasse@85 266 return spellName
contrebasse@76 267 end
contrebasse@76 268 --]]