annotate utils.lua @ 110:d60d6b4cab0c

Tradeskill in external window should now be functional
author contrebasse
date Thu, 02 Jun 2011 18:23:42 +0200
parents 618163a6d970
children af23986010ef
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@110 45 function A.numRecipeMakable(reagentIDIfUnique,reagents)
contrebasse@110 46 if reagentIDIfUnique then -- only one reagent
contrebasse@110 47 itemCount = GetItemCount(reagentIDIfUnique)
contrebasse@110 48 if not itemCount then return end
contrebasse@110 49 return math.floor(itemCount/reagents)
contrebasse@110 50 else -- many reagents
contrebasse@110 51 local m
contrebasse@110 52 for _,reagent in pairs(reagents) do
contrebasse@110 53 itemCount = GetItemCount(reagent[1])
contrebasse@110 54 if not itemCount then return end
contrebasse@110 55 if not m then
contrebasse@110 56 m = math.floor(itemCount/reagent[2])
contrebasse@110 57 else
contrebasse@110 58 m = math.min(m,math.floor(itemCount/reagent[2]))
contrebasse@110 59 end
contrebasse@110 60 if m==0 then break end
contrebasse@110 61 end
contrebasse@110 62 return m
contrebasse@110 63 end -- if
contrebasse@110 64 end
contrebasse@110 65
contrebasse@16 66 -- Gives the number of craftable objects
contrebasse@108 67 function A.numMakable(reagentID)
contrebasse@108 68 -- No recipe
contrebasse@108 69 if not A.data[reagentID] then return 0 end
contrebasse@108 70
contrebasse@108 71 -- Many recipes
contrebasse@108 72 local n = 0
contrebasse@108 73 local itemCount
contrebasse@108 74 for _,recipe in pairs(A.data[reagentID]) do
contrebasse@110 75 n = n + A.numRecipeMakable(recipe[1],recipe[2])
contrebasse@108 76 end -- for
contrebasse@108 77 return n
contrebasse@108 78 end -- function
contrebasse@16 79
contrebasse@16 80 -- Find the first tradeskill index of the recipe to make an item
contrebasse@16 81 function A.findSkillIndex(itemID)
contrebasse@110 82 if not itemID then return end
contrebasse@16 83 for i = 1,GetNumTradeSkills() do
contrebasse@110 84 if select(2,GetTradeSkillInfo(i)) ~= "header" and A.link2ID(GetTradeSkillItemLink(i)) == itemID then
contrebasse@110 85 return i
contrebasse@110 86 end -- if
contrebasse@110 87 end -- for
contrebasse@110 88 end -- function
contrebasse@110 89
contrebasse@110 90 -- Find the exact tradeskill index of the recipe to make an item
contrebasse@110 91 function A.findExactSkillIndex(itemID,recipeName)
contrebasse@110 92 if not itemID or not recipeName then return end
contrebasse@110 93 for i = 1,GetNumTradeSkills() do
contrebasse@110 94 local skillName, skillType = GetTradeSkillInfo(i)
contrebasse@110 95 if skillType ~= "header" and skillName==recipeName and A.link2ID(GetTradeSkillItemLink(i)) == itemID then
contrebasse@110 96 return i
contrebasse@3 97 end -- if
contrebasse@16 98 end -- for
contrebasse@16 99 end -- function
contrebasse@16 100 end -- do
contrebasse@24 101
contrebasse@24 102
contrebasse@110 103 -- Bypass filters and collpsed headers
contrebasse@24 104 do
contrebasse@24 105 local selectedTradeSkillIndex
contrebasse@107 106 local stateSaved
contrebasse@107 107 local filtersState = {}
contrebasse@24 108 local headersState = {}
contrebasse@24 109
contrebasse@107 110 local function ApplyFilters()
contrebasse@107 111 TradeSkillOnlyShowSkillUps(TradeSkillFrame.filterTbl.hasSkillUp);
contrebasse@107 112 TradeSkillOnlyShowMakeable(TradeSkillFrame.filterTbl.hasMaterials);
contrebasse@107 113 SetTradeSkillSubClassFilter(TradeSkillFrame.filterTbl.subClassValue, 1, 1);
contrebasse@107 114 SetTradeSkillInvSlotFilter(TradeSkillFrame.filterTbl.slotValue, 1, 1);
contrebasse@107 115 TradeSkillUpdateFilterBar();
contrebasse@107 116 CloseDropDownMenus();
contrebasse@107 117 end
contrebasse@107 118
contrebasse@82 119 function A.SaveActiveFilters(headerName)
contrebasse@82 120 A.blockScan = true
contrebasse@82 121
contrebasse@107 122 -- Save filters
contrebasse@108 123 filtersState.text = GetTradeSkillItemNameFilter()
contrebasse@108 124 filtersState.minLevel, filtersState.maxLevel = GetTradeSkillItemLevelFilter()
contrebasse@107 125 filtersState.hasMaterials = TradeSkillFrame.filterTbl.hasMaterials
contrebasse@107 126 filtersState.hasSkillUp = TradeSkillFrame.filterTbl.hasSkillUp
contrebasse@107 127 filtersState.subClassValue = TradeSkillFrame.filterTbl.subClassValue
contrebasse@107 128 filtersState.slotValue = TradeSkillFrame.filterTbl.slotValue
contrebasse@24 129
contrebasse@107 130 -- Remove all filters
contrebasse@108 131 SetTradeSkillItemNameFilter(nil)
contrebasse@108 132 SetTradeSkillItemLevelFilter(0, 0)
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@107 140 headersState.headerName = headerName
contrebasse@24 141 for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories
contrebasse@82 142 local skillName, skillType, _, isExpanded = GetTradeSkillInfo(i)
contrebasse@108 143 if (skillType == "header") and skillName==headerName then
contrebasse@108 144 if not isExpanded then
contrebasse@108 145 ExpandTradeSkillSubClass(i)
contrebasse@108 146 table.insert(headersState,true)
contrebasse@108 147 else
contrebasse@108 148 table.insert(headersState,false)
contrebasse@24 149 end
contrebasse@108 150 end
contrebasse@24 151 end
contrebasse@24 152
contrebasse@108 153 stateSaved = true
contrebasse@108 154 A.blockScan = nil
contrebasse@108 155
contrebasse@107 156 --@todo Scroll down to the selected recipe
contrebasse@107 157 -- with TradeSkillSkillXX:Show() ?
contrebasse@24 158 end
contrebasse@24 159
contrebasse@24 160 function A.RestoreActiveFilters()
contrebasse@107 161 if not stateSaved then return end
contrebasse@82 162 A.blockScan = true
contrebasse@82 163
contrebasse@107 164 -- restore headers
contrebasse@24 165 for i = GetNumTradeSkills(), 1, -1 do
contrebasse@107 166 local skillName, skillType = GetTradeSkillInfo(i)
contrebasse@107 167 if (skillType == "header") and skillName==headersState.headerName and table.remove(headersState,1) then
contrebasse@24 168 CollapseTradeSkillSubClass(i)
contrebasse@24 169 end
contrebasse@24 170 end
contrebasse@24 171 wipe(headersState)
contrebasse@107 172
contrebasse@107 173 -- restore filters
contrebasse@108 174 SetTradeSkillItemNameFilter(filtersState.text)
contrebasse@108 175 SetTradeSkillItemLevelFilter(filtersState.minLevel, filtersState.maxLevel)
contrebasse@107 176 TradeSkillFrame.filterTbl.hasMaterials = filtersState.hasMaterials
contrebasse@107 177 TradeSkillFrame.filterTbl.hasSkillUp = filtersState.hasSkillUp
contrebasse@107 178 TradeSkillFrame.filterTbl.subClassValue = filtersState.subClassValue
contrebasse@107 179 TradeSkillFrame.filterTbl.slotValue = filtersState.slotValue
contrebasse@107 180 ApplyFilters()
contrebasse@107 181
contrebasse@108 182 stateSaved = nil
contrebasse@108 183 A.blockScan = nil
contrebasse@107 184
contrebasse@108 185 --@todo Scroll down to the selected recipe
contrebasse@108 186 -- with TradeSkillSkillXX:Show() ?
contrebasse@24 187 end
contrebasse@24 188 end
contrebasse@73 189
contrebasse@73 190 function A.isRecipeUnique(itemData)
contrebasse@73 191 local unique = true
contrebasse@107 192
contrebasse@73 193 -- Check if the item is made by only one recipe. If not, return
contrebasse@73 194 if #itemData>1 then
contrebasse@73 195 local spellLink
contrebasse@73 196 for _,v in ipairs(itemData) do
contrebasse@73 197 if not spellLink then
contrebasse@73 198 spellLink = v.spellLink
contrebasse@73 199 else
contrebasse@73 200 if v.spellLink ~= spellLink then
contrebasse@73 201 unique = nil
contrebasse@73 202 break
contrebasse@73 203 end
contrebasse@73 204 end
contrebasse@73 205 end
contrebasse@73 206 end
contrebasse@107 207
contrebasse@73 208 return unique
contrebasse@73 209 end
contrebasse@76 210
contrebasse@76 211 --[[
contrebasse@76 212 function A.isTradeskillUnique(itemData)
contrebasse@110 213 local tradeskillName = itemData[1].tradeskillName
contrebasse@107 214
contrebasse@76 215 -- Check if the item is made by only one recipe. If not, return
contrebasse@76 216 if #itemData>1 then
contrebasse@76 217 for _,v in ipairs(itemData) do
contrebasse@110 218 if v.tradeskillName ~= tradeskillName then
contrebasse@110 219 tradeskillName = nil
contrebasse@76 220 break
contrebasse@76 221 end
contrebasse@76 222 end
contrebasse@76 223 end
contrebasse@89 224
contrebasse@110 225 return tradeskillName
contrebasse@76 226 end
contrebasse@107 227 --]]