annotate utils.lua @ 26:886be292feec

Avoid scanning when tradeskill is not fully loaded (no recipe or the first one is not a header)
author contrebasse
date Thu, 28 Apr 2011 19:43:07 +0200
parents 578b9c9479c9
children aa2f6965c0f6
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@3 16 -- Returns the item ID from its link
contrebasse@3 17 function A.link2ID(link)
contrebasse@16 18 return tonumber(select(3,sfind(link or "", "-*:(%d+)[:|].*")) or "")
contrebasse@3 19 end -- function
contrebasse@3 20
contrebasse@3 21 -- Returns the button number for the reagents buttons
contrebasse@3 22 function A.buttonNumber(btn)
contrebasse@3 23 -- "TradeSkillReagentN"
contrebasse@3 24 return tonumber(btn:GetName():sub(-1))
contrebasse@0 25 end
contrebasse@0 26
contrebasse@16 27 do
contrebasse@16 28 -- Wow functions
contrebasse@16 29 local GetTradeSkillInfo = GetTradeSkillInfo
contrebasse@16 30 local GetNumTradeSkills = GetNumTradeSkills
contrebasse@16 31 local GetTradeSkillItemLink = GetTradeSkillItemLink
contrebasse@0 32
contrebasse@16 33 -- Gives the number of craftable objects
contrebasse@16 34 function A.numMakable(reagentID)
contrebasse@16 35 -- Look for the recipe to make the item
contrebasse@16 36 local reagentIndex = A.findSkillIndex(reagentID)
contrebasse@25 37 if not reagentIndex then return end
contrebasse@3 38
contrebasse@16 39 -- Check how many items we can craft
contrebasse@16 40 local skillName, skillType, numReagentMakable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(reagentIndex)
contrebasse@25 41 return numReagentMakable, reagentIndex
contrebasse@16 42 end
contrebasse@16 43
contrebasse@16 44 -- Find the first tradeskill index of the recipe to make an item
contrebasse@16 45 function A.findSkillIndex(itemID)
contrebasse@16 46 for i = 1,GetNumTradeSkills() do
contrebasse@16 47 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(i)
contrebasse@16 48 if skillType == "header" then
contrebasse@16 49 else
contrebasse@16 50 if skillName then
contrebasse@16 51 local ID = A.link2ID(GetTradeSkillItemLink(i))
contrebasse@16 52 if ID and ID == itemID then
contrebasse@16 53 return i
contrebasse@16 54 end -- if
contrebasse@3 55 end -- if
contrebasse@3 56 end -- if
contrebasse@16 57 end -- for
contrebasse@16 58 A.DEBUG("Tradeskill not found for "..itemID)
contrebasse@16 59 end -- function
contrebasse@16 60 end -- do
contrebasse@24 61
contrebasse@24 62
contrebasse@24 63 -- Taken from Datastore_Crafts
contrebasse@24 64 -- *** Scanning functions ***
contrebasse@24 65 do
contrebasse@24 66 local selectedTradeSkillIndex
contrebasse@24 67 local subClasses, subClassID
contrebasse@24 68 local invSlots, invSlotID
contrebasse@24 69 local haveMats
contrebasse@24 70 local headersState = {}
contrebasse@24 71
contrebasse@24 72 local function GetSubClassID()
contrebasse@24 73 -- The purpose of this function is to get the subClassID in a UI independant way
contrebasse@24 74 -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name.
contrebasse@24 75
contrebasse@24 76 if GetTradeSkillSubClassFilter(0) then -- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0
contrebasse@24 77 return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown))
contrebasse@24 78 end
contrebasse@24 79
contrebasse@24 80 local filter
contrebasse@24 81 for i = 1, #subClasses do
contrebasse@24 82 filter = GetTradeSkillSubClassFilter(i)
contrebasse@24 83 if filter then
contrebasse@24 84 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 85 end
contrebasse@24 86 end
contrebasse@24 87 end
contrebasse@24 88
contrebasse@24 89 local function GetInvSlotID()
contrebasse@24 90 -- The purpose of this function is to get the invSlotID in a UI independant way (same as GetSubClassID)
contrebasse@24 91 -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name.
contrebasse@24 92
contrebasse@24 93 if GetTradeSkillInvSlotFilter(0) then -- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0
contrebasse@24 94 return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown))
contrebasse@24 95 end
contrebasse@24 96
contrebasse@24 97 local filter
contrebasse@24 98 for i = 1, #invSlots do
contrebasse@24 99 filter = GetTradeSkillInvSlotFilter(i)
contrebasse@24 100 if filter then
contrebasse@24 101 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 102 end
contrebasse@24 103 end
contrebasse@24 104 end
contrebasse@24 105
contrebasse@24 106 function A.SaveActiveFilters()
contrebasse@24 107 print("save")
contrebasse@24 108 selectedTradeSkillIndex = GetTradeSkillSelectionIndex()
contrebasse@24 109
contrebasse@24 110 subClasses = { GetTradeSkillSubClasses() }
contrebasse@24 111 invSlots = { GetTradeSkillInvSlots() }
contrebasse@24 112 subClassID = GetSubClassID()
contrebasse@24 113 invSlotID = GetInvSlotID()
contrebasse@24 114
contrebasse@24 115 -- Subclasses
contrebasse@24 116 SetTradeSkillSubClassFilter(0, 1, 1) -- this checks "All subclasses"
contrebasse@24 117 if TradeSkillSubClassDropDown then
contrebasse@24 118 UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1)
contrebasse@24 119 end
contrebasse@24 120
contrebasse@24 121 -- Inventory slots
contrebasse@24 122 SetTradeSkillInvSlotFilter(0, 1, 1) -- this checks "All slots"
contrebasse@24 123 if TradeSkillInvSlotDropDown then
contrebasse@24 124 UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1)
contrebasse@24 125 end
contrebasse@24 126
contrebasse@24 127 -- Have Materials
contrebasse@24 128 if TradeSkillFrameAvailableFilterCheckButton then
contrebasse@24 129 haveMats = TradeSkillFrameAvailableFilterCheckButton:GetChecked() -- nil or true
contrebasse@24 130 TradeSkillFrameAvailableFilterCheckButton:SetChecked(false)
contrebasse@24 131 end
contrebasse@24 132 TradeSkillOnlyShowMakeable(false)
contrebasse@24 133
contrebasse@24 134 -- Headers
contrebasse@24 135 local headerCount = 0 -- use a counter to avoid being bound to header names, which might not be unique.
contrebasse@24 136
contrebasse@24 137 for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories
contrebasse@24 138 local _, skillType, _, isExpanded = GetTradeSkillInfo(i)
contrebasse@24 139 if (skillType == "header") then
contrebasse@24 140 headerCount = headerCount + 1
contrebasse@24 141 if not isExpanded then
contrebasse@24 142 ExpandTradeSkillSubClass(i)
contrebasse@24 143 headersState[headerCount] = true
contrebasse@24 144 end
contrebasse@24 145 end
contrebasse@24 146 end
contrebasse@24 147
contrebasse@24 148 print("saved")
contrebasse@24 149 end
contrebasse@24 150
contrebasse@24 151 function A.RestoreActiveFilters()
contrebasse@24 152 print("restore")
contrebasse@24 153 -- Subclasses
contrebasse@24 154 SetTradeSkillSubClassFilter(subClassID-1, 1, 1) -- this checks the previously checked value
contrebasse@24 155
contrebasse@24 156 local frame = TradeSkillSubClassDropDown
contrebasse@24 157 if frame then -- other addons might nil this frame (delayed load, etc..), so secure DDM calls
contrebasse@24 158 local text = (subClassID == 1) and ALL_SUBCLASSES or subClasses[subClassID-1]
contrebasse@24 159 UIDropDownMenu_SetSelectedID(frame, subClassID)
contrebasse@24 160 UIDropDownMenu_SetText(frame, text);
contrebasse@24 161 end
contrebasse@24 162
contrebasse@24 163 subClassID = nil
contrebasse@24 164 wipe(subClasses)
contrebasse@24 165 subClasses = nil
contrebasse@24 166
contrebasse@24 167 -- Inventory slots
contrebasse@24 168 invSlotID = invSlotID or 1
contrebasse@24 169 SetTradeSkillInvSlotFilter(invSlotID-1, 1, 1) -- this checks the previously checked value
contrebasse@24 170
contrebasse@24 171 frame = TradeSkillInvSlotDropDown
contrebasse@24 172 if frame then
contrebasse@24 173 local text = (invSlotID == 1) and ALL_INVENTORY_SLOTS or invSlots[invSlotID-1]
contrebasse@24 174 UIDropDownMenu_SetSelectedID(frame, invSlotID)
contrebasse@24 175 UIDropDownMenu_SetText(frame, text);
contrebasse@24 176 end
contrebasse@24 177
contrebasse@24 178 invSlotID = nil
contrebasse@24 179 wipe(invSlots)
contrebasse@24 180 invSlots = nil
contrebasse@24 181
contrebasse@24 182 -- Have Materials
contrebasse@24 183 if TradeSkillFrameAvailableFilterCheckButton then
contrebasse@24 184 TradeSkillFrameAvailableFilterCheckButton:SetChecked(haveMats or false)
contrebasse@24 185 end
contrebasse@24 186 TradeSkillOnlyShowMakeable(haveMats or false)
contrebasse@24 187 haveMats = nil
contrebasse@24 188
contrebasse@24 189 SelectTradeSkill(selectedTradeSkillIndex)
contrebasse@24 190 selectedTradeSkillIndex = nil
contrebasse@24 191
contrebasse@24 192 -- Headers
contrebasse@24 193 local headerCount = 0
contrebasse@24 194 for i = GetNumTradeSkills(), 1, -1 do
contrebasse@24 195 local _, skillType = GetTradeSkillInfo(i)
contrebasse@24 196 if (skillType == "header") then
contrebasse@24 197 headerCount = headerCount + 1
contrebasse@24 198 if headersState[headerCount] then
contrebasse@24 199 CollapseTradeSkillSubClass(i)
contrebasse@24 200 end
contrebasse@24 201 end
contrebasse@24 202 end
contrebasse@24 203 wipe(headersState)
contrebasse@24 204 end
contrebasse@24 205 print("restored")
contrebasse@24 206 end