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