annotate utils.lua @ 113:c79ab5443ee5 v1.1beta1

Corrected the lua error when entering combat
author contrebasse
date Fri, 03 Jun 2011 12:24:04 +0200
parents af23986010ef
children 7ce304c296b0
rev   line source
contrebasse@0 1 local addonName, A = ...
contrebasse@0 2
contrebasse@111 3 -- GLOBALS: UIErrorsFrame, UIErrorsFrame_OnEvent
contrebasse@111 4
contrebasse@16 5 -- Lua functions
contrebasse@16 6 local tonumber = tonumber
contrebasse@16 7 local select = select
contrebasse@16 8 local sfind = string.find
contrebasse@111 9 local min = math.min
contrebasse@111 10 local floor = math.floor
contrebasse@111 11 local pairs = pairs
contrebasse@111 12 local ipairs = ipairs
contrebasse@111 13 local wipe = wipe
contrebasse@111 14 local tinsert = tinsert
contrebasse@111 15 local tremove = tremove
contrebasse@16 16
contrebasse@16 17 -- Wow functions
contrebasse@111 18 local GetItemCount = GetItemCount
contrebasse@0 19
contrebasse@38 20 -- Messages to the user
contrebasse@38 21 function A.Warn(msg)
contrebasse@38 22 if not msg then return end
contrebasse@38 23 local event = "UI_INFO_MESSAGE"
contrebasse@38 24 UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg)
contrebasse@38 25 end -- function
contrebasse@38 26 function A.Error(msg)
contrebasse@38 27 if not msg then return end
contrebasse@38 28 local event = "UI_ERROR_MESSAGE"
contrebasse@38 29 UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg)
contrebasse@38 30 end -- function
contrebasse@38 31
contrebasse@3 32 -- Returns the item ID from its link
contrebasse@3 33 function A.link2ID(link)
contrebasse@16 34 return tonumber(select(3,sfind(link or "", "-*:(%d+)[:|].*")) or "")
contrebasse@3 35 end -- function
contrebasse@3 36
contrebasse@3 37 -- Returns the button number for the reagents buttons
contrebasse@3 38 function A.buttonNumber(btn)
contrebasse@3 39 -- "TradeSkillReagentN"
contrebasse@3 40 return tonumber(btn:GetName():sub(-1))
contrebasse@0 41 end
contrebasse@0 42
contrebasse@16 43 do
contrebasse@16 44 -- Wow functions
contrebasse@16 45 local GetTradeSkillInfo = GetTradeSkillInfo
contrebasse@16 46 local GetNumTradeSkills = GetNumTradeSkills
contrebasse@16 47 local GetTradeSkillItemLink = GetTradeSkillItemLink
contrebasse@111 48 local GetTradeSkillRecipeLink = GetTradeSkillRecipeLink
contrebasse@0 49
contrebasse@110 50 function A.numRecipeMakable(reagentIDIfUnique,reagents)
contrebasse@111 51 local itemCount
contrebasse@110 52 if reagentIDIfUnique then -- only one reagent
contrebasse@110 53 itemCount = GetItemCount(reagentIDIfUnique)
contrebasse@110 54 if not itemCount then return end
contrebasse@111 55 return floor(itemCount/reagents)
contrebasse@110 56 else -- many reagents
contrebasse@110 57 local m
contrebasse@110 58 for _,reagent in pairs(reagents) do
contrebasse@110 59 itemCount = GetItemCount(reagent[1])
contrebasse@110 60 if not itemCount then return end
contrebasse@110 61 if not m then
contrebasse@111 62 m = floor(itemCount/reagent[2])
contrebasse@110 63 else
contrebasse@111 64 m = min(m,floor(itemCount/reagent[2]))
contrebasse@110 65 end
contrebasse@110 66 if m==0 then break end
contrebasse@110 67 end
contrebasse@110 68 return m
contrebasse@110 69 end -- if
contrebasse@110 70 end
contrebasse@110 71
contrebasse@111 72 -- Gives the total number of craftable objects
contrebasse@108 73 function A.numMakable(reagentID)
contrebasse@108 74 -- No recipe
contrebasse@108 75 if not A.data[reagentID] then return 0 end
contrebasse@108 76
contrebasse@108 77 -- Many recipes
contrebasse@108 78 local n = 0
contrebasse@108 79 local itemCount
contrebasse@108 80 for _,recipe in pairs(A.data[reagentID]) do
contrebasse@110 81 n = n + A.numRecipeMakable(recipe[1],recipe[2])
contrebasse@108 82 end -- for
contrebasse@108 83 return n
contrebasse@108 84 end -- function
contrebasse@16 85
contrebasse@16 86 -- Find the first tradeskill index of the recipe to make an item
contrebasse@16 87 function A.findSkillIndex(itemID)
contrebasse@110 88 if not itemID then return end
contrebasse@16 89 for i = 1,GetNumTradeSkills() do
contrebasse@110 90 if select(2,GetTradeSkillInfo(i)) ~= "header" and A.link2ID(GetTradeSkillItemLink(i)) == itemID then
contrebasse@110 91 return i
contrebasse@110 92 end -- if
contrebasse@110 93 end -- for
contrebasse@110 94 end -- function
contrebasse@110 95
contrebasse@110 96 -- Find the exact tradeskill index of the recipe to make an item
contrebasse@111 97 function A.findExactSkillIndex(itemID,recipeLink)
contrebasse@111 98 if not itemID or not recipeLink then return end
contrebasse@110 99 for i = 1,GetNumTradeSkills() do
contrebasse@111 100 if select(2,GetTradeSkillInfo(i)) ~= "header" and GetTradeSkillRecipeLink(i)==recipeLink and A.link2ID(GetTradeSkillItemLink(i)) == itemID then
contrebasse@110 101 return i
contrebasse@3 102 end -- if
contrebasse@16 103 end -- for
contrebasse@16 104 end -- function
contrebasse@16 105 end -- do
contrebasse@24 106
contrebasse@24 107
contrebasse@110 108 -- Bypass filters and collpsed headers
contrebasse@24 109 do
contrebasse@24 110 local selectedTradeSkillIndex
contrebasse@107 111 local stateSaved
contrebasse@107 112 local filtersState = {}
contrebasse@24 113 local headersState = {}
contrebasse@24 114
contrebasse@107 115 local function ApplyFilters()
contrebasse@107 116 TradeSkillOnlyShowSkillUps(TradeSkillFrame.filterTbl.hasSkillUp);
contrebasse@107 117 TradeSkillOnlyShowMakeable(TradeSkillFrame.filterTbl.hasMaterials);
contrebasse@107 118 SetTradeSkillSubClassFilter(TradeSkillFrame.filterTbl.subClassValue, 1, 1);
contrebasse@107 119 SetTradeSkillInvSlotFilter(TradeSkillFrame.filterTbl.slotValue, 1, 1);
contrebasse@107 120 TradeSkillUpdateFilterBar();
contrebasse@107 121 CloseDropDownMenus();
contrebasse@107 122 end
contrebasse@107 123
contrebasse@82 124 function A.SaveActiveFilters(headerName)
contrebasse@82 125 A.blockScan = true
contrebasse@82 126
contrebasse@111 127 -- Save position
contrebasse@111 128 filtersState.positionOffset = FauxScrollFrame_GetOffset(TradeSkillListScrollFrame)
contrebasse@111 129 filtersState.positionValue = TradeSkillListScrollFrameScrollBar:GetValue()
contrebasse@111 130
contrebasse@107 131 -- Save filters
contrebasse@108 132 filtersState.text = GetTradeSkillItemNameFilter()
contrebasse@108 133 filtersState.minLevel, filtersState.maxLevel = GetTradeSkillItemLevelFilter()
contrebasse@107 134 filtersState.hasMaterials = TradeSkillFrame.filterTbl.hasMaterials
contrebasse@107 135 filtersState.hasSkillUp = TradeSkillFrame.filterTbl.hasSkillUp
contrebasse@107 136 filtersState.subClassValue = TradeSkillFrame.filterTbl.subClassValue
contrebasse@107 137 filtersState.slotValue = TradeSkillFrame.filterTbl.slotValue
contrebasse@24 138
contrebasse@107 139 -- Remove all filters
contrebasse@108 140 SetTradeSkillItemNameFilter(nil)
contrebasse@108 141 SetTradeSkillItemLevelFilter(0, 0)
contrebasse@107 142 TradeSkillFrame.filterTbl.hasMaterials = false
contrebasse@107 143 TradeSkillFrame.filterTbl.hasSkillUp = false
contrebasse@107 144 TradeSkillFrame.filterTbl.subClassValue = -1
contrebasse@107 145 TradeSkillFrame.filterTbl.slotValue = -1
contrebasse@107 146 ApplyFilters()
contrebasse@24 147
contrebasse@24 148 -- Headers
contrebasse@107 149 headersState.headerName = headerName
contrebasse@24 150 for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories
contrebasse@82 151 local skillName, skillType, _, isExpanded = GetTradeSkillInfo(i)
contrebasse@108 152 if (skillType == "header") and skillName==headerName then
contrebasse@108 153 if not isExpanded then
contrebasse@108 154 ExpandTradeSkillSubClass(i)
contrebasse@111 155 tinsert(headersState,true)
contrebasse@108 156 else
contrebasse@111 157 tinsert(headersState,false)
contrebasse@24 158 end
contrebasse@108 159 end
contrebasse@24 160 end
contrebasse@24 161
contrebasse@108 162 stateSaved = true
contrebasse@108 163 A.blockScan = nil
contrebasse@108 164
contrebasse@107 165 --@todo Scroll down to the selected recipe
contrebasse@107 166 -- with TradeSkillSkillXX:Show() ?
contrebasse@24 167 end
contrebasse@24 168
contrebasse@24 169 function A.RestoreActiveFilters()
contrebasse@107 170 if not stateSaved then return end
contrebasse@82 171 A.blockScan = true
contrebasse@82 172
contrebasse@107 173 -- restore headers
contrebasse@24 174 for i = GetNumTradeSkills(), 1, -1 do
contrebasse@107 175 local skillName, skillType = GetTradeSkillInfo(i)
contrebasse@111 176 if (skillType == "header") and skillName==headersState.headerName and tremove(headersState,1) then
contrebasse@24 177 CollapseTradeSkillSubClass(i)
contrebasse@24 178 end
contrebasse@24 179 end
contrebasse@24 180 wipe(headersState)
contrebasse@107 181
contrebasse@107 182 -- restore filters
contrebasse@108 183 SetTradeSkillItemNameFilter(filtersState.text)
contrebasse@108 184 SetTradeSkillItemLevelFilter(filtersState.minLevel, filtersState.maxLevel)
contrebasse@107 185 TradeSkillFrame.filterTbl.hasMaterials = filtersState.hasMaterials
contrebasse@107 186 TradeSkillFrame.filterTbl.hasSkillUp = filtersState.hasSkillUp
contrebasse@107 187 TradeSkillFrame.filterTbl.subClassValue = filtersState.subClassValue
contrebasse@107 188 TradeSkillFrame.filterTbl.slotValue = filtersState.slotValue
contrebasse@107 189 ApplyFilters()
contrebasse@107 190
contrebasse@111 191 -- Re set position
contrebasse@111 192 FauxScrollFrame_SetOffset(TradeSkillListScrollFrame,filtersState.positionOffset)
contrebasse@111 193 TradeSkillListScrollFrameScrollBar:SetValue(filtersState.positionValue)
contrebasse@111 194
contrebasse@108 195 stateSaved = nil
contrebasse@108 196 A.blockScan = nil
contrebasse@107 197
contrebasse@108 198 --@todo Scroll down to the selected recipe
contrebasse@108 199 -- with TradeSkillSkillXX:Show() ?
contrebasse@24 200 end
contrebasse@24 201 end
contrebasse@73 202
contrebasse@73 203 function A.isRecipeUnique(itemData)
contrebasse@73 204 local unique = true
contrebasse@107 205
contrebasse@73 206 -- Check if the item is made by only one recipe. If not, return
contrebasse@73 207 if #itemData>1 then
contrebasse@73 208 local spellLink
contrebasse@73 209 for _,v in ipairs(itemData) do
contrebasse@73 210 if not spellLink then
contrebasse@73 211 spellLink = v.spellLink
contrebasse@73 212 else
contrebasse@73 213 if v.spellLink ~= spellLink then
contrebasse@73 214 unique = nil
contrebasse@73 215 break
contrebasse@73 216 end
contrebasse@73 217 end
contrebasse@73 218 end
contrebasse@73 219 end
contrebasse@107 220
contrebasse@73 221 return unique
contrebasse@73 222 end
contrebasse@76 223
contrebasse@76 224 --[[
contrebasse@76 225 function A.isTradeskillUnique(itemData)
contrebasse@110 226 local tradeskillName = itemData[1].tradeskillName
contrebasse@107 227
contrebasse@76 228 -- Check if the item is made by only one recipe. If not, return
contrebasse@76 229 if #itemData>1 then
contrebasse@76 230 for _,v in ipairs(itemData) do
contrebasse@110 231 if v.tradeskillName ~= tradeskillName then
contrebasse@110 232 tradeskillName = nil
contrebasse@76 233 break
contrebasse@76 234 end
contrebasse@76 235 end
contrebasse@76 236 end
contrebasse@89 237
contrebasse@110 238 return tradeskillName
contrebasse@76 239 end
contrebasse@107 240 --]]