annotate utils.lua @ 107:d64a19e5a47d

Bypass the filtering. Not fully tested, but mostly works.
author contrebasse
date Thu, 02 Jun 2011 00:57:17 +0200
parents 8dd86b6b76d8
children 618163a6d970
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@107 76 local stateSaved
contrebasse@107 77 local filtersState = {}
contrebasse@24 78 local headersState = {}
contrebasse@24 79
contrebasse@24 80 local function GetSubClassID()
contrebasse@24 81 -- The purpose of this function is to get the subClassID in a UI independant way
contrebasse@24 82 -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown), which uses a hardcoded frame name.
contrebasse@24 83
contrebasse@24 84 if GetTradeSkillSubClassFilter(0) then -- if "All Subclasses" is selected, GetTradeSkillSubClassFilter() will return 1 for all indexes, including 0
contrebasse@24 85 return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillSubClassDropDown))
contrebasse@24 86 end
contrebasse@24 87
contrebasse@24 88 local filter
contrebasse@24 89 for i = 1, #subClasses do
contrebasse@24 90 filter = GetTradeSkillSubClassFilter(i)
contrebasse@24 91 if filter then
contrebasse@24 92 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 93 end
contrebasse@24 94 end
contrebasse@24 95 end
contrebasse@24 96
contrebasse@24 97 local function GetInvSlotID()
contrebasse@24 98 -- The purpose of this function is to get the invSlotID in a UI independant way (same as GetSubClassID)
contrebasse@24 99 -- ie: without relying on UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown), which uses a hardcoded frame name.
contrebasse@24 100
contrebasse@24 101 if GetTradeSkillInvSlotFilter(0) then -- if "All Slots" is selected, GetTradeSkillInvSlotFilter() will return 1 for all indexes, including 0
contrebasse@24 102 return 1 -- thus return 1 as selected id (as would be returned by UIDropDownMenu_GetSelectedID(TradeSkillInvSlotDropDown))
contrebasse@24 103 end
contrebasse@24 104
contrebasse@24 105 local filter
contrebasse@24 106 for i = 1, #invSlots do
contrebasse@24 107 filter = GetTradeSkillInvSlotFilter(i)
contrebasse@24 108 if filter then
contrebasse@24 109 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 110 end
contrebasse@24 111 end
contrebasse@24 112 end
contrebasse@24 113
contrebasse@107 114 local function ApplyFilters()
contrebasse@107 115 TradeSkillOnlyShowSkillUps(TradeSkillFrame.filterTbl.hasSkillUp);
contrebasse@107 116 TradeSkillOnlyShowMakeable(TradeSkillFrame.filterTbl.hasMaterials);
contrebasse@107 117 SetTradeSkillSubClassFilter(TradeSkillFrame.filterTbl.subClassValue, 1, 1);
contrebasse@107 118 SetTradeSkillInvSlotFilter(TradeSkillFrame.filterTbl.slotValue, 1, 1);
contrebasse@107 119 TradeSkillUpdateFilterBar();
contrebasse@107 120 CloseDropDownMenus();
contrebasse@107 121 end
contrebasse@107 122
contrebasse@82 123 function A.SaveActiveFilters(headerName)
contrebasse@82 124 A.blockScan = true
contrebasse@82 125
contrebasse@107 126 -- Save filters
contrebasse@107 127 filtersState.hasMaterials = TradeSkillFrame.filterTbl.hasMaterials
contrebasse@107 128 filtersState.hasSkillUp = TradeSkillFrame.filterTbl.hasSkillUp
contrebasse@107 129 filtersState.subClassValue = TradeSkillFrame.filterTbl.subClassValue
contrebasse@107 130 filtersState.slotValue = TradeSkillFrame.filterTbl.slotValue
contrebasse@24 131
contrebasse@107 132 -- Remove all filters
contrebasse@107 133 TradeSkillFrame.filterTbl.hasMaterials = false
contrebasse@107 134 TradeSkillFrame.filterTbl.hasSkillUp = false
contrebasse@107 135 TradeSkillFrame.filterTbl.subClassValue = -1
contrebasse@107 136 TradeSkillFrame.filterTbl.slotValue = -1
contrebasse@107 137 ApplyFilters()
contrebasse@24 138
contrebasse@24 139 -- Headers
contrebasse@82 140 --local headerCount = 0 -- use a counter to avoid being bound to header names, which might not be unique.
contrebasse@107 141 headersState.headerName = headerName
contrebasse@24 142 for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories
contrebasse@82 143 local skillName, skillType, _, isExpanded = GetTradeSkillInfo(i)
contrebasse@107 144 if (skillType == "header") and skillName==headerName then
contrebasse@107 145 if not isExpanded then
contrebasse@107 146 ExpandTradeSkillSubClass(i)
contrebasse@107 147 table.insert(headersState,true)
contrebasse@107 148 else
contrebasse@107 149 table.insert(headersState,false)
contrebasse@107 150 end
contrebasse@24 151 end
contrebasse@24 152 end
contrebasse@24 153
contrebasse@107 154 --@todo Scroll down to the selected recipe
contrebasse@107 155 -- with TradeSkillSkillXX:Show() ?
contrebasse@107 156
contrebasse@107 157 stateSaved = true
contrebasse@82 158
contrebasse@82 159 A.blockScan = nil
contrebasse@24 160 end
contrebasse@24 161
contrebasse@24 162 function A.RestoreActiveFilters()
contrebasse@107 163 if not stateSaved then return end
contrebasse@107 164
contrebasse@82 165 A.blockScan = true
contrebasse@82 166
contrebasse@107 167 -- restore headers
contrebasse@24 168 for i = GetNumTradeSkills(), 1, -1 do
contrebasse@107 169 local skillName, skillType = GetTradeSkillInfo(i)
contrebasse@107 170 if (skillType == "header") and skillName==headersState.headerName and table.remove(headersState,1) then
contrebasse@24 171 CollapseTradeSkillSubClass(i)
contrebasse@24 172 end
contrebasse@24 173 end
contrebasse@24 174 wipe(headersState)
contrebasse@107 175
contrebasse@107 176 -- restore filters
contrebasse@107 177 TradeSkillFrame.filterTbl.hasMaterials = filtersState.hasMaterials
contrebasse@107 178 TradeSkillFrame.filterTbl.hasSkillUp = filtersState.hasSkillUp
contrebasse@107 179 TradeSkillFrame.filterTbl.subClassValue = filtersState.subClassValue
contrebasse@107 180 TradeSkillFrame.filterTbl.slotValue = filtersState.slotValue
contrebasse@107 181 ApplyFilters()
contrebasse@107 182
contrebasse@107 183
contrebasse@107 184 --print("restored")
contrebasse@107 185
contrebasse@107 186 stateSaved = nil
contrebasse@107 187
contrebasse@107 188 A.blockScan = nil
contrebasse@24 189 end
contrebasse@24 190 end
contrebasse@73 191
contrebasse@73 192 function A.isRecipeUnique(itemData)
contrebasse@73 193 local unique = true
contrebasse@107 194
contrebasse@73 195 -- Check if the item is made by only one recipe. If not, return
contrebasse@73 196 if #itemData>1 then
contrebasse@73 197 local spellLink
contrebasse@73 198 for _,v in ipairs(itemData) do
contrebasse@73 199 if not spellLink then
contrebasse@73 200 spellLink = v.spellLink
contrebasse@73 201 else
contrebasse@73 202 if v.spellLink ~= spellLink then
contrebasse@73 203 unique = nil
contrebasse@73 204 break
contrebasse@73 205 end
contrebasse@73 206 end
contrebasse@73 207 end
contrebasse@73 208 end
contrebasse@107 209
contrebasse@73 210 return unique
contrebasse@73 211 end
contrebasse@76 212
contrebasse@76 213 --[[
contrebasse@76 214 function A.isTradeskillUnique(itemData)
contrebasse@85 215 local spellName = itemData[1].spellName
contrebasse@107 216
contrebasse@76 217 -- Check if the item is made by only one recipe. If not, return
contrebasse@76 218 if #itemData>1 then
contrebasse@76 219 for _,v in ipairs(itemData) do
contrebasse@85 220 if v.spellName ~= spellName then
contrebasse@85 221 spellName = nil
contrebasse@76 222 break
contrebasse@76 223 end
contrebasse@76 224 end
contrebasse@76 225 end
contrebasse@89 226
contrebasse@85 227 return spellName
contrebasse@76 228 end
contrebasse@107 229 --]]