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 --]]
|