Mercurial > wow > askmrrobot
comparison ui/ShoppingListTab.lua @ 0:ec731d2fe6ba
Version 1.2.12.0
author | Adam tegen <adam.tegen@gmail.com> |
---|---|
date | Tue, 20 May 2014 21:43:23 -0500 |
parents | |
children | ece9167c0d1c |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:ec731d2fe6ba |
---|---|
1 local _, AskMrRobot = ... | |
2 | |
3 -- initialize the ShoppingListTab class | |
4 AskMrRobot.ShoppingListTab = AskMrRobot.inheritsFrom(AskMrRobot.Frame) | |
5 | |
6 StaticPopupDialogs["SHOPPING_TAB_PLEASE_OPEN"] = { | |
7 text = "You need to open the mail window for this to work", | |
8 button1 = "Ok", | |
9 timeout = 0, | |
10 whileDead = true, | |
11 hideOnEscape = true, | |
12 preferredIndex = 3, -- avoid some UI taint, see http://www.wowace.com/announcements/how-to-avoid-some-ui-taint/ | |
13 } | |
14 | |
15 function AskMrRobot.ShoppingListTab:new(parent) | |
16 | |
17 local tab = AskMrRobot.Frame:new(nil, parent) | |
18 setmetatable(tab, { __index = AskMrRobot.ShoppingListTab }) | |
19 tab:SetPoint("TOPLEFT") | |
20 tab:SetPoint("BOTTOMRIGHT") | |
21 tab:Hide() | |
22 tab:RegisterEvent("AUCTION_HOUSE_CLOSED") | |
23 tab:RegisterEvent("AUCTION_HOUSE_SHOW") | |
24 tab:RegisterEvent("MAIL_SHOW") | |
25 tab:RegisterEvent("MAIL_CLOSED") | |
26 | |
27 tab.isAuctionHouseVisible = false | |
28 | |
29 tab:SetScript("OnEvent", function(...) | |
30 tab:OnEvent(...) | |
31 end) | |
32 | |
33 tab.shoppingListHeader = AskMrRobot.FontString:new(tab, nil, "ARTWORK", "GameFontNormalLarge") | |
34 tab.shoppingListHeader:SetPoint("TOPLEFT", 0, -5) | |
35 tab.shoppingListHeader:SetText("Shopping List") | |
36 | |
37 tab.shoppingPanel = AskMrRobot.Frame:new(nil, tab) | |
38 tab.shoppingPanel:SetPoint("TOPLEFT", tab.shoppingListHeader, "BOTTOMLEFT", 0, -10) | |
39 tab.shoppingPanel:SetPoint("BOTTOMRIGHT", tab, "BOTTOMRIGHT", -20, 17) | |
40 | |
41 | |
42 tab.sendButton = CreateFrame("Button", "AmrSendButton", tab.shoppingPanel, "UIPanelButtonTemplate") | |
43 tab.sendButton:SetText("send it!") | |
44 tab.sendButton:SetPoint("BOTTOMLEFT", 0, 0) | |
45 tab.sendButton:SetHeight(25) | |
46 tab.sendButton:SetNormalFontObject("GameFontNormalLarge") | |
47 tab.sendButton:SetHighlightFontObject("GameFontHighlightLarge") | |
48 tab.sendButton:SetWidth(150) | |
49 tab.sendButton:SetScript("OnClick", function() | |
50 tab:Send() | |
51 end) | |
52 | |
53 tab.enchantMaterialsCheckbox = CreateFrame("CheckButton", "AmrEnchantMaterialsCheckbox", tab.shoppingPanel, "ChatConfigCheckButtonTemplate"); | |
54 tab.enchantMaterialsCheckbox:SetChecked(AmrSendSettings.SendEnchantMaterials) | |
55 tab.enchantMaterialsCheckbox:SetScript("OnClick", function () AmrSendSettings.SendEnchantMaterials = tab.enchantMaterialsCheckbox:GetChecked() end) | |
56 tab.enchantMaterialsCheckbox:SetPoint("TOPLEFT", tab.sendButton, "TOPLEFT", 0, 25) | |
57 local text3 = getglobal(tab.enchantMaterialsCheckbox:GetName() .. 'Text') | |
58 text3:SetFontObject("GameFontHighlightLarge") | |
59 text3:SetText("Enchant Materials") | |
60 text3:SetWidth(150) | |
61 text3:SetPoint("TOPLEFT", tab.enchantMaterialsCheckbox, "TOPRIGHT", 2, -4) | |
62 | |
63 | |
64 tab.enchantsCheckbox = CreateFrame("CheckButton", "AmrEnchantsCheckbox", tab.shoppingPanel, "ChatConfigCheckButtonTemplate"); | |
65 tab.enchantsCheckbox:SetChecked(AmrSendSettings.SendEnchants) | |
66 tab.enchantsCheckbox:SetScript("OnClick", function () AmrSendSettings.SendEnchants = tab.enchantsCheckbox:GetChecked() end) | |
67 tab.enchantsCheckbox:SetPoint("TOPLEFT", tab.sendButton, "TOPLEFT", 0, 50) | |
68 local text2 = getglobal(tab.enchantsCheckbox:GetName() .. 'Text') | |
69 text2:SetFontObject("GameFontHighlightLarge") | |
70 text2:SetText("Enchants") | |
71 text2:SetWidth(150) | |
72 text2:SetPoint("TOPLEFT", tab.enchantsCheckbox, "TOPRIGHT", 2, -4) | |
73 | |
74 | |
75 | |
76 tab.gemsCheckbox = CreateFrame("CheckButton", "AmrGemsCheckbox", tab.shoppingPanel, "ChatConfigCheckButtonTemplate"); | |
77 tab.gemsCheckbox:SetPoint("TOPLEFT", tab.sendButton, "TOPLEFT", 0, 75) | |
78 tab.gemsCheckbox:SetChecked(AmrSendSettings.SendGems) | |
79 tab.gemsCheckbox:SetScript("OnClick", function () AmrSendSettings.SendGems = tab.gemsCheckbox:GetChecked() end) | |
80 local text = getglobal(tab.gemsCheckbox:GetName() .. 'Text') | |
81 text:SetFontObject("GameFontHighlightLarge") | |
82 text:SetText("Gems") | |
83 text:SetWidth(150) | |
84 text:SetPoint("TOPLEFT", tab.gemsCheckbox, "TOPRIGHT", 2, -4) | |
85 | |
86 | |
87 tab.sendMessage4 = AskMrRobot.FontString:new(tab.shoppingPanel, nil, "ARTWORK", "GameFontHighlightLarge") | |
88 tab.sendMessage4:SetText("Include:") | |
89 tab.sendMessage4:SetPoint("TOPLEFT", tab.gemsCheckbox, "TOPLEFT", 0, 20) | |
90 | |
91 | |
92 tab.sendMessage3 = AskMrRobot.FontString:new(tab.shoppingPanel, nil, "ARTWORK", "GameFontHighlightLarge") | |
93 tab.sendMessage3:SetText("Send list to") | |
94 tab.sendMessage3:SetPoint("TOPLEFT", tab.sendMessage4, "TOPLEFT", 0, 25) | |
95 | |
96 | |
97 tab.sendMessage2 = AskMrRobot.FontString:new(tab.shoppingPanel, nil, "ARTWORK", "GameFontNormal") | |
98 tab.sendMessage2:SetTextColor(.5,.5,.5) | |
99 tab.sendMessage2:SetText("Whisper to a friend or send to a channel, like /raid or /guild.") | |
100 tab.sendMessage2:SetPoint("TOPLEFT", tab.sendMessage3, "TOPLEFT", 0, 25) | |
101 | |
102 | |
103 tab.sendMessage1 = AskMrRobot.FontString:new(tab.shoppingPanel, nil, "ARTWORK", "GameFontNormalLarge") | |
104 tab.sendMessage1:SetTextColor(0,1,0) | |
105 tab.sendMessage1:SetText("Send to a Jewelcraft or Enchanter friend :)") | |
106 tab.sendMessage1:SetPoint("TOPLEFT", tab.sendMessage2, "TOPLEFT", 0, 25) | |
107 | |
108 | |
109 tab.scrollFrame = CreateFrame("ScrollFrame", "AmrScrollFrame", tab.shoppingPanel, "UIPanelScrollFrameTemplate") | |
110 tab.scrollFrame:SetPoint("TOPLEFT", 0, 0) | |
111 tab.scrollFrame:SetPoint("RIGHT", -20, 0) | |
112 tab.scrollFrame:SetPoint("BOTTOM", tab.sendMessage1, "TOP", 0, 10) | |
113 | |
114 tab.scrollParent = AskMrRobot.Frame:new(nil, tab.shoppingPanel) | |
115 tab.scrollParent:SetPoint("TOPLEFT", 0, 0) | |
116 tab.scrollParent:SetWidth(tab:GetWidth() - 20) | |
117 tab.scrollParent:SetHeight(500) | |
118 tab.scrollFrame:SetScrollChild(tab.scrollParent) | |
119 | |
120 -- magic to get the scrollbar to work with the scrollwheel... | |
121 tab.scrollFrame:SetScript("OnMouseWheel", function(arg1, arg2) | |
122 ScrollFrameTemplate_OnMouseWheel(arg1, arg2, arg1.ScrollBar) | |
123 end) | |
124 | |
125 tab.gemsHeader = AskMrRobot.FontString:new(tab.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
126 tab.gemsHeader:SetText("Gems") | |
127 tab.gemsHeader:SetPoint("TOPLEFT", tab.scrollParent, "TOPLEFT", 0, 0) | |
128 | |
129 tab.gemsQuantityHeader = AskMrRobot.FontString:new(tab.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
130 tab.gemsQuantityHeader:SetText("Total") | |
131 tab.gemsQuantityHeader:SetPoint("TOPLEFT", tab.scrollParent, "TOPLEFT", 370, 0) | |
132 | |
133 tab.enchantsHeader = AskMrRobot.FontString:new(tab.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
134 tab.enchantsHeader:SetText("Enchants") | |
135 | |
136 tab.enchantsQuantityHeader = AskMrRobot.FontString:new(tab.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
137 tab.enchantsQuantityHeader:SetText("Total") | |
138 tab.enchantsQuantityHeader:SetPoint("TOPLEFT", tab.enchantsHeader, "TOPLEFT", 370, 0) | |
139 | |
140 tab.enchantMaterialsHeader = AskMrRobot.FontString:new(tab.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
141 tab.enchantMaterialsHeader:SetText("Enchant Materials") | |
142 | |
143 tab.enchantMaterialsQuantityHeader = AskMrRobot.FontString:new(tab.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
144 tab.enchantMaterialsQuantityHeader:SetText("Total") | |
145 tab.enchantMaterialsQuantityHeader:SetPoint("TOPLEFT", tab.enchantMaterialsHeader, "TOPLEFT", 370, 0) | |
146 | |
147 tab.stamp = AskMrRobot.RobotStamp:new(nil, tab) | |
148 tab.stamp:Hide() | |
149 tab.stamp.bigText:SetText("YOUR SHOPPING IS ALL DONE!") | |
150 tab.stamp.smallText:SetText("Unless you want to buy me a birthday present! I like titanium bolts and robot dogs... Or was it titanium dogs and robot bolts...") | |
151 tab.stamp:SetPoint("TOPLEFT", tab.shoppingListHeader, "BOTTOMLEFT", 2, -15) | |
152 tab.stamp:SetPoint("RIGHT", tab, "RIGHT", -30, 0) | |
153 tab.stamp:SetHeight(92) | |
154 | |
155 tab.gemIcons = {} | |
156 tab.gemLinks = {} | |
157 tab.gemQuantity = {} | |
158 tab.enchantIcons = {} | |
159 tab.enchantLinks = {} | |
160 tab.enchantQuantity = {} | |
161 tab.enchantMaterialIcons = {} | |
162 tab.enchantMaterialLinks = {} | |
163 tab.enchantMaterialQuantity = {} | |
164 | |
165 -- Create the dropdown, and configure its appearance | |
166 tab.dropDown = CreateFrame("FRAME", "AmrSendType", tab.shoppingPanel, "UIDropDownMenuTemplate") | |
167 tab.dropDown:SetPoint("TOPLEFT", tab.sendMessage3, "TOPRIGHT", 0, 5) | |
168 UIDropDownMenu_SetWidth(tab.dropDown, 140) | |
169 UIDropDownMenu_SetText(tab.dropDown, AmrSendSettings.SendToType) | |
170 | |
171 local text = getglobal(tab.dropDown:GetName() .. 'Text') | |
172 text:SetFontObject("GameFontHighlightLarge") | |
173 | |
174 local AddButton = function(list, optionText) | |
175 local info = UIDropDownMenu_CreateInfo() | |
176 info.justifyH = "RIGHT" | |
177 info.text = optionText | |
178 info.checked = AmrSendSettings.SendToType == optionText | |
179 info.arg1 = optionText | |
180 info.func = list.SetValue | |
181 info.owner = list | |
182 info.fontObject = "GameFontHighlightLarge" | |
183 info.minWidth = 140 | |
184 return info | |
185 end | |
186 | |
187 -- Create and bind the initialization function to the dropdown menu | |
188 UIDropDownMenu_Initialize(tab.dropDown, function(self, level, menuList) | |
189 UIDropDownMenu_AddButton(AddButton(self, "a friend")) | |
190 UIDropDownMenu_AddButton(AddButton(self, "party")) | |
191 UIDropDownMenu_AddButton(AddButton(self, "raid")) | |
192 UIDropDownMenu_AddButton(AddButton(self, "guild")) | |
193 UIDropDownMenu_AddButton(AddButton(self, "channel")) | |
194 UIDropDownMenu_AddButton(AddButton(self, "mail")) | |
195 end) | |
196 | |
197 function tab.dropDown:SetValue(newValue) | |
198 AmrSendSettings.SendToType = newValue | |
199 -- Update the text; if we merely wanted it to display newValue, we would not need to do this | |
200 UIDropDownMenu_SetText(tab.dropDown, AmrSendSettings.SendToType) | |
201 -- Because this is called from a sub-menu, only that menu level is closed by default. | |
202 -- Close the entire menu with this next call | |
203 CloseDropDownMenus() | |
204 end | |
205 | |
206 tab.sendTo = CreateFrame("EditBox", "AmrSendTo", tab.shoppingPanel, "InputBoxTemplate" ) | |
207 tab.sendTo:SetPoint("TOPLEFT", tab.dropDown, "TOPRIGHT", 0, 0) | |
208 tab.sendTo:SetPoint("RIGHT", 0, 0) | |
209 tab.sendTo:SetHeight(30) | |
210 tab.sendTo:SetText(AmrSendSettings.SendTo or "") | |
211 tab.sendTo:SetFontObject("GameFontHighlightLarge") | |
212 tab.sendTo:SetAutoFocus(false) | |
213 tab.sendTo:SetScript("OnChar", function() | |
214 AmrSendSettings.SendTo = tab.sendTo:GetText() | |
215 end) | |
216 | |
217 tab.messageQueue = {} | |
218 return tab | |
219 end | |
220 | |
221 -- display a gem icon in a row | |
222 -- gemInfo is {id, enchantId, color, count } | |
223 function AskMrRobot.ShoppingListTab:SetGemIcon(row, gemInfo) | |
224 -- get gem icon for the row | |
225 local gemIcon = self.gemIcons[row] | |
226 | |
227 -- if we don't have one | |
228 if gemIcon == nil then | |
229 -- make one | |
230 gemIcon = AskMrRobot.GemIcon:new(nil, self.scrollParent) | |
231 self.gemIcons[row] = gemIcon | |
232 gemIcon:SetScript("OnMouseDown", function() | |
233 self:SearchForGem(row) | |
234 end) | |
235 | |
236 -- position it | |
237 local previous = self.gemsHeader | |
238 if row > 1 then | |
239 previous = self.gemIcons[row - 1] | |
240 end | |
241 gemIcon:SetPoint("TOPLEFT", previous, "BOTTOMLEFT", 0, -7) | |
242 | |
243 -- size it | |
244 gemIcon:SetWidth(24) | |
245 gemIcon:SetHeight(24) | |
246 | |
247 -- give it a nice border | |
248 gemIcon:SetRoundBorder() | |
249 end | |
250 | |
251 gemIcon:Show() | |
252 | |
253 -- make a link for the optimized gem | |
254 gemLink = select(2, GetItemInfo(gemInfo.id)) | |
255 | |
256 -- set the link (tooltip + icon) | |
257 gemIcon:SetItemLink(gemLink) | |
258 gemIcon:SetGemColor(gemInfo.color) | |
259 | |
260 -- if we didn't get one, its because WoW is slow | |
261 if not gemLink and gemInfo.id then | |
262 -- when WoW finally returns the link, set the icon / tooltip | |
263 AskMrRobot.RegisterItemInfoCallback(gemInfo.id, function(name, link) | |
264 gemIcon:SetItemLink(link) | |
265 end) | |
266 end | |
267 | |
268 end | |
269 | |
270 | |
271 -- display a gem icon in a row | |
272 -- gemInfo is {id, enchantId, color, count } | |
273 function AskMrRobot.ShoppingListTab:SetGemText(row, gemInfo) | |
274 -- get gem icon for the row | |
275 local gemText = self.gemLinks[row] | |
276 | |
277 -- if we don't have one | |
278 if gemText == nil then | |
279 -- make one | |
280 gemText = AskMrRobot.ItemLinkText:new(nil, self.scrollParent) | |
281 self.gemLinks[row] = gemText | |
282 gemText:SetScript("OnMouseDown", function() | |
283 self:SearchForGem(row) | |
284 end) | |
285 | |
286 -- position it | |
287 local previous = self.gemsHeader | |
288 if row > 1 then | |
289 previous = self.gemIcons[row - 1] | |
290 end | |
291 gemText:SetPoint("TOPLEFT", previous, "BOTTOMLEFT", 30, -8) | |
292 gemText:SetPoint("RIGHT", self, "RIGHT", -70, 0) | |
293 gemText:SetHeight(18) | |
294 gemText:SetFontSize(15) | |
295 end | |
296 | |
297 gemText:Show() | |
298 | |
299 gemText:SetItemId(gemInfo.id) | |
300 end | |
301 | |
302 -- display a gem icon in a row | |
303 -- gemInfo is {id, enchantId, color, count } | |
304 function AskMrRobot.ShoppingListTab:SetGemQuantity(row, qty, total) | |
305 if qty > total then qty = total end | |
306 | |
307 -- get gem icon for the row | |
308 local gemText = self.gemQuantity[row] | |
309 | |
310 -- if we don't have one | |
311 if gemText == nil then | |
312 -- make one | |
313 gemText = AskMrRobot.FontString:new(self.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
314 self.gemQuantity[row] = gemText | |
315 | |
316 -- position it | |
317 local previous = self.gemsHeader | |
318 if row > 1 then | |
319 previous = self.gemIcons[row - 1] | |
320 end | |
321 gemText:SetPoint("TOPLEFT", previous, "BOTTOMLEFT", 370, -8) | |
322 gemText:SetHeight(18) | |
323 gemText:SetFontSize(15) | |
324 end | |
325 | |
326 gemText:SetText('' .. qty .. '/' .. total) | |
327 if qty == total then | |
328 gemText:SetTextColor(0,1,0) | |
329 else | |
330 gemText:SetTextColor(1,0,0) | |
331 end | |
332 gemText:Show() | |
333 end | |
334 | |
335 | |
336 -- display an enchant icon in a row | |
337 function AskMrRobot.ShoppingListTab:SetEnchantIcon(row, enchantId) | |
338 | |
339 -- get enchant icon for the row | |
340 local enchantIcon = self.enchantIcons[row] | |
341 | |
342 -- if we don't have one | |
343 if enchantIcon == nil then | |
344 -- make one | |
345 enchantIcon = AskMrRobot.EnchantLinkIconAndText:new(nil, self.scrollParent) | |
346 self.enchantIcons[row] = enchantIcon | |
347 enchantIcon:SetScript("OnMouseDown", function() | |
348 self:SearchForEnchant(row) | |
349 end) | |
350 | |
351 -- position it | |
352 if row == 1 then | |
353 enchantIcon:SetPoint("TOPLEFT", self.enchantsHeader, "BOTTOMLEFT", 0, -12) | |
354 enchantIcon:SetPoint("RIGHT", self.scrollParent, "RIGHT", -30, 0) | |
355 else | |
356 enchantIcon:SetPoint("TOPLEFT", self.enchantIcons[row - 1], "BOTTOMLEFT", 0, -7) | |
357 enchantIcon:SetPoint("RIGHT", self.scrollParent, "RIGHT", -30, 0) | |
358 end | |
359 | |
360 -- size it | |
361 enchantIcon:SetWidth(24) | |
362 enchantIcon:SetHeight(24) | |
363 enchantIcon:SetFontSize(15) | |
364 | |
365 -- give it a nice border | |
366 enchantIcon:SetRoundBorder() | |
367 | |
368 enchantIcon:UseSpellName() | |
369 end | |
370 | |
371 enchantIcon:SetEnchantId(enchantId) | |
372 | |
373 enchantIcon:Show() | |
374 end | |
375 | |
376 -- display a gem icon in a row | |
377 -- gemInfo is {id, enchantId, color, count } | |
378 function AskMrRobot.ShoppingListTab:SetEnchantQuantity(row, qty, total) | |
379 if qty > total then qty = total end | |
380 | |
381 -- get gem icon for the row | |
382 local enchantText = self.enchantQuantity[row] | |
383 | |
384 -- if we don't have one | |
385 if enchantText == nil then | |
386 -- make one | |
387 enchantText = AskMrRobot.FontString:new(self.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
388 self.enchantQuantity[row] = enchantText | |
389 | |
390 -- position it | |
391 local previous = self.enchantsHeader | |
392 if row > 1 then | |
393 previous = self.enchantIcons[row - 1] | |
394 end | |
395 enchantText:SetPoint("TOPLEFT", previous, "BOTTOMLEFT", 370, -8) | |
396 enchantText:SetHeight(18) | |
397 enchantText:SetFontSize(15) | |
398 end | |
399 | |
400 enchantText:SetText('' .. qty .. '/' .. total) | |
401 if qty == total then | |
402 enchantText:SetTextColor(0,1,0) | |
403 else | |
404 enchantText:SetTextColor(1,0,0) | |
405 end | |
406 enchantText:Show() | |
407 end | |
408 | |
409 function AskMrRobot.ShoppingListTab:SearchForItem(itemName) | |
410 if self.isAuctionHouseVisible then | |
411 QueryAuctionItems(itemName, nil, nil, 0, 0, 0, 0, 0, 0, 0) | |
412 end | |
413 end | |
414 | |
415 function AskMrRobot.ShoppingListTab:SearchForGem(row) | |
416 self:SearchForItem(self.gemLinks[row].itemName) | |
417 end | |
418 | |
419 function AskMrRobot.ShoppingListTab:SearchForEnchant(row) | |
420 self:SearchForItem(self.enchantIcons[row].itemName) | |
421 end | |
422 | |
423 function AskMrRobot.ShoppingListTab:SearchForEnchantMaterial(row) | |
424 self:SearchForItem(self.enchantMaterialLinks[row].itemName) | |
425 end | |
426 | |
427 | |
428 -- display an enchant material icon in a row | |
429 function AskMrRobot.ShoppingListTab:SetEnchantMaterialIcon(row, itemId) | |
430 -- get enchant material icon for the row | |
431 local materialIcon = self.enchantMaterialIcons[row] | |
432 | |
433 -- if we don't have one | |
434 if materialIcon == nil then | |
435 -- make one | |
436 materialIcon = AskMrRobot.ItemIcon:new(nil, self.scrollParent) | |
437 self.enchantMaterialIcons[row] = materialIcon | |
438 materialIcon:SetScript("OnMouseDown", function() | |
439 self:SearchForEnchantMaterial(row) | |
440 end) | |
441 | |
442 -- position it | |
443 local previous = self.enchantMaterialsHeader | |
444 if row > 1 then | |
445 previous = self.enchantMaterialIcons[row - 1] | |
446 end | |
447 materialIcon:SetPoint("TOPLEFT", previous, "BOTTOMLEFT", 0, -7) | |
448 | |
449 -- size it | |
450 materialIcon:SetWidth(24) | |
451 materialIcon:SetHeight(24) | |
452 | |
453 -- give it a nice border | |
454 materialIcon:SetRoundBorder() | |
455 end | |
456 | |
457 materialIcon:Show() | |
458 | |
459 -- make a link for the optimized gem | |
460 local itemLink = select(2, GetItemInfo(itemId)) | |
461 | |
462 materialIcon:SetItemLink(itemLink) | |
463 | |
464 -- if we didn't get one, its because WoW is slow | |
465 if not itemLink and itemId then | |
466 -- when WoW finally returns the link, set the icon / tooltip | |
467 AskMrRobot.RegisterItemInfoCallback(itemId, function(name, link) | |
468 materialIcon:SetItemLink(link) | |
469 end) | |
470 end | |
471 end | |
472 | |
473 | |
474 -- display an enchant material link in a row | |
475 function AskMrRobot.ShoppingListTab:SetEnchantMaterialLink(row, itemId) | |
476 -- get gem icon for the row | |
477 local materialLink = self.enchantMaterialLinks[row] | |
478 | |
479 -- if we don't have one | |
480 if materialLink == nil then | |
481 -- make one | |
482 materialLink = AskMrRobot.ItemLinkText:new(nil, self.scrollParent) | |
483 self.enchantMaterialLinks[row] = materialLink | |
484 materialLink:SetScript("OnMouseDown", function() | |
485 self:SearchForEnchantMaterial(row) | |
486 end) | |
487 | |
488 -- position it | |
489 local previous = self.enchantMaterialsHeader | |
490 if row > 1 then | |
491 previous = self.enchantMaterialIcons[row - 1] | |
492 end | |
493 materialLink:SetPoint("TOPLEFT", previous, "BOTTOMLEFT", 30, -8) | |
494 materialLink:SetPoint("RIGHT", self, "RIGHT", -30, 0) | |
495 materialLink:SetHeight(18) | |
496 materialLink:SetFontSize(15) | |
497 end | |
498 | |
499 materialLink:Show() | |
500 | |
501 materialLink:SetItemId(itemId) | |
502 materialLink.itemId = itemId | |
503 end | |
504 | |
505 -- display a gem icon in a row | |
506 -- gemInfo is {id, enchantId, color, count } | |
507 function AskMrRobot.ShoppingListTab:SetEnchantMaterialQuantity(row, qty, total) | |
508 if qty > total then qty = total end | |
509 | |
510 -- get gem icon for the row | |
511 local enchantText = self.enchantMaterialQuantity[row] | |
512 | |
513 -- if we don't have one | |
514 if enchantText == nil then | |
515 -- make one | |
516 enchantText = AskMrRobot.FontString:new(self.scrollParent, nil, "ARTWORK", "GameFontNormalLarge") | |
517 self.enchantMaterialQuantity[row] = enchantText | |
518 | |
519 -- position it | |
520 local previous = self.enchantMaterialsHeader | |
521 if row > 1 then | |
522 previous = self.enchantMaterialIcons[row - 1] | |
523 end | |
524 enchantText:SetPoint("TOPLEFT", previous, "BOTTOMLEFT", 370, -8) | |
525 enchantText:SetHeight(18) | |
526 enchantText:SetFontSize(15) | |
527 end | |
528 | |
529 enchantText:SetText('' .. qty .. '/' .. total) | |
530 if qty == total then | |
531 enchantText:SetTextColor(0,1,0) | |
532 else | |
533 enchantText:SetTextColor(1,0,0) | |
534 end | |
535 enchantText:Show() | |
536 end | |
537 | |
538 function AskMrRobot.ShoppingListTab:HasStuffToBuy() | |
539 | |
540 local gemList, enchantList, enchantMaterials = self:CalculateItems() | |
541 | |
542 local count = 0 | |
543 for gemId, gemInfo in AskMrRobot.spairs(gemList) do | |
544 count = count + gemInfo.total - gemInfo.count | |
545 end | |
546 for slot, enchant in AskMrRobot.spairs(enchantList) do | |
547 count = count + enchant.total - enchant.count | |
548 end | |
549 | |
550 return count > 0 | |
551 end | |
552 | |
553 function AskMrRobot.ShoppingListTab:CalculateItems() | |
554 -- build a map of missing gem-ids -> {id, color, enchantid, count, total} | |
555 local gemList = {} | |
556 for slotNum, badGems in pairs(AskMrRobot.itemDiffs.gems) do | |
557 --badGems: {current: array of enchant ids, optimized: (array of {id, color, enchantId}) | |
558 for i = 1, #badGems.optimized do | |
559 if badGems.badGems[i] then | |
560 local goodGem = badGems.optimized[i] | |
561 if goodGem.id ~= 0 then | |
562 local gem = gemList[goodGem.id] | |
563 if gem == nil then | |
564 gemList[goodGem.id] = {id = goodGem.id, enchantId = goodGem.enchantId, color = goodGem.color, count = 0, total = 1} | |
565 else | |
566 gem.total = gem.total + 1 | |
567 end | |
568 end | |
569 end | |
570 end | |
571 end | |
572 | |
573 local enchantList = {} | |
574 for slot, enchantData in AskMrRobot.sortSlots(AskMrRobot.itemDiffs.enchants) do | |
575 local id = AskMrRobot.getEnchantItemId(enchantData.optimized) or enchantData.optimized | |
576 local qty = enchantList[id] | |
577 if qty then | |
578 qty.total = qty.total + 1 | |
579 else | |
580 qty = { count = 0, total = 1, optimized = enchantData.optimized } | |
581 enchantList[id] = qty | |
582 end | |
583 end | |
584 | |
585 local enchantMaterials = {} | |
586 for slot, enchantData in pairs(AskMrRobot.itemDiffs.enchants) do | |
587 AskMrRobot.addEnchantMaterials(enchantMaterials, enchantData.optimized) | |
588 end | |
589 | |
590 --substract any inventory we already have in the bank | |
591 for i = 1, #AmrBankItemsAndCounts do | |
592 local itemId = AskMrRobot.getItemIdFromLink(AmrBankItemsAndCounts[i].link) | |
593 if itemId then | |
594 local gem = gemList[itemId] | |
595 if gem then | |
596 gem.count = gem.count + AmrBankItemsAndCounts[i].count | |
597 else | |
598 local alternateGemId = AskMrRobot.gemDuplicates[itemId] | |
599 if alternateGemId then | |
600 gem = gemList[alternateGemId] | |
601 if gem then | |
602 gem.count = gem.count + AmrBankItemsAndCounts[i].count | |
603 end | |
604 end | |
605 end | |
606 local material = enchantMaterials[itemId] | |
607 if material then | |
608 material.count = material.count + AmrBankItemsAndCounts[i].count | |
609 end | |
610 local enchant = enchantList[itemId] | |
611 if enchant then | |
612 enchant.count = enchant.count + AmrBankItemsAndCounts[i].count | |
613 end | |
614 end | |
615 end | |
616 | |
617 local _ , bagItemsWithCount = AskMrRobot.ScanBags() | |
618 | |
619 --substract any inventory we already have in bags | |
620 for i = 1, #bagItemsWithCount do | |
621 local itemId = AskMrRobot.getItemIdFromLink(bagItemsWithCount[i].link) | |
622 if itemId then | |
623 local gem = gemList[itemId] | |
624 if gem then | |
625 gem.count = gem.count + bagItemsWithCount[i].count | |
626 else | |
627 local alternateGemId = AskMrRobot.gemDuplicates[itemId] | |
628 if alternateGemId then | |
629 gem = gemList[alternateGemId] | |
630 if gem then | |
631 gem.count = gem.count + bagItemsWithCount[i].count | |
632 end | |
633 end | |
634 end | |
635 local material = enchantMaterials[itemId] | |
636 if material then | |
637 material.count = material.count + bagItemsWithCount[i].count | |
638 end | |
639 local enchant = enchantList[itemId] | |
640 if enchant then | |
641 enchant.count = enchant.count + bagItemsWithCount[i].count | |
642 end | |
643 end | |
644 end | |
645 | |
646 return gemList, enchantList, enchantMaterials | |
647 end | |
648 | |
649 function AskMrRobot.ShoppingListTab:Update() | |
650 | |
651 local gemList, enchantList, enchantMaterials = self:CalculateItems() | |
652 | |
653 -- update the UI | |
654 local lastControl = nil | |
655 local row = 1 | |
656 for gemId, gemInfo in AskMrRobot.spairs(gemList) do | |
657 self:SetGemIcon(row, gemInfo) | |
658 self:SetGemText(row, gemInfo) | |
659 self:SetGemQuantity(row, gemInfo.count, gemInfo.total) | |
660 lastControl = self.gemIcons[row] | |
661 row = row + 1 | |
662 end | |
663 | |
664 -- hide any extra gem icons | |
665 for i = row, #self.gemIcons do | |
666 self.gemIcons[i]:Hide() | |
667 self.gemLinks[i]:Hide() | |
668 self.gemQuantity[i]:Hide() | |
669 end | |
670 | |
671 -- hide / show the gems header, and position the enchant headers | |
672 if row > 1 then | |
673 self.gemsHeader:Show() | |
674 self.gemsQuantityHeader:Show() | |
675 self.enchantsHeader:SetPoint("TOPLEFT", self.gemIcons[row - 1], "BOTTOMLEFT", 0, -15) | |
676 else | |
677 self.gemsHeader:Hide() | |
678 self.gemsQuantityHeader:Hide() | |
679 self.enchantsHeader:SetPoint("TOPLEFT", self.scrollParent, "TOPLEFT", 0, 0) | |
680 end | |
681 | |
682 row = 1 | |
683 for slot, enchant in AskMrRobot.spairs(enchantList) do | |
684 self:SetEnchantIcon(row, enchant.optimized) | |
685 self:SetEnchantQuantity(row, enchant.count, enchant.total) | |
686 lastControl = self.enchantIcons[row] | |
687 row = row + 1 | |
688 end | |
689 | |
690 -- hide any extra enchant icons | |
691 for i = row, #self.enchantIcons do | |
692 self.enchantIcons[i]:Hide() | |
693 self.enchantQuantity[i]:Hide() | |
694 end | |
695 | |
696 -- hide / show the enchants header, and position the enchant materials headers | |
697 if row > 1 then | |
698 self.enchantsHeader:Show() | |
699 self.enchantsQuantityHeader:Show() | |
700 self.enchantMaterialsHeader:SetPoint("TOPLEFT", self.enchantIcons[row - 1], "BOTTOMLEFT", 0, -15) | |
701 else | |
702 self.enchantsHeader:Hide() | |
703 self.enchantsQuantityHeader:Hide() | |
704 self.enchantMaterialsHeader:SetPoint("TOPLEFT", self.scrollParent, "TOPLEFT", 0, 0) | |
705 end | |
706 | |
707 row = 1 | |
708 for itemId, count in AskMrRobot.spairs(enchantMaterials) do | |
709 self:SetEnchantMaterialIcon(row, itemId) | |
710 self:SetEnchantMaterialLink(row, itemId) | |
711 self:SetEnchantMaterialQuantity(row, count.count, count.total) | |
712 lastControl = self.enchantMaterialIcons[row] | |
713 row = row + 1 | |
714 end | |
715 | |
716 for i = row, #self.enchantMaterialIcons do | |
717 self.enchantMaterialIcons[i]:Hide() | |
718 self.enchantMaterialLinks[i]:Hide() | |
719 self.enchantMaterialQuantity[i]:Hide() | |
720 end | |
721 | |
722 if row == 1 then | |
723 self.enchantMaterialsHeader:Hide() | |
724 self.enchantMaterialsQuantityHeader:Hide() | |
725 else | |
726 self.enchantMaterialsHeader:Show() | |
727 self.enchantMaterialsQuantityHeader:Show() | |
728 end | |
729 | |
730 -- fix up the scrollbar length | |
731 if lastControl then | |
732 local height = self.scrollParent:GetTop() - lastControl:GetBottom() | |
733 self.scrollParent:SetHeight(height) | |
734 if height < self.scrollFrame:GetHeight() then | |
735 self.scrollFrame.ScrollBar:Hide() | |
736 else | |
737 self.scrollFrame:Show() | |
738 self.scrollFrame.ScrollBar:Show() | |
739 end | |
740 self.stamp:Hide() | |
741 self.shoppingPanel:Show() | |
742 else | |
743 self.scrollFrame.ScrollBar:Hide() | |
744 self.shoppingPanel:Hide() | |
745 self.stamp:Show() | |
746 end | |
747 end | |
748 | |
749 | |
750 function AskMrRobot.ShoppingListTab:OnEvent(frame, event, ...) | |
751 local handler = self["On_" .. event] | |
752 if handler then | |
753 handler(self, ...) | |
754 end | |
755 end | |
756 | |
757 function AskMrRobot.ShoppingListTab:On_MAIL_SHOW() | |
758 self.mailOpen = true | |
759 end | |
760 | |
761 function AskMrRobot.ShoppingListTab:On_MAIL_CLOSED() | |
762 self.mailOpen = nil | |
763 end | |
764 | |
765 function AskMrRobot.ShoppingListTab:On_AUCTION_HOUSE_SHOW() | |
766 self.isAuctionHouseVisible = true | |
767 end | |
768 | |
769 function AskMrRobot.ShoppingListTab:On_AUCTION_HOUSE_CLOSED() | |
770 self.isAuctionHouseVisible = false | |
771 end | |
772 | |
773 function AskMrRobot.ShoppingListTab:sendMail() | |
774 | |
775 -- need mail window to be open for this to work | |
776 if not self.mailOpen then | |
777 StaticPopup_Show("SHOPPING_TAB_PLEASE_OPEN") | |
778 return | |
779 end | |
780 | |
781 local message = "Mr. Robot says I need the following to optimize my gear:\n" | |
782 | |
783 local gemList, enchantList, enchantMaterials = self:CalculateItems() | |
784 | |
785 if AmrSendSettings.SendGems then | |
786 for k,v in pairs(gemList) do | |
787 --exclude jewelcrafter gems | |
788 if not AskMrRobot.JewelcrafterGems[k] then | |
789 local needed = v.total - v.count | |
790 if needed > 0 then | |
791 local itemName = GetItemInfo(k) | |
792 if itemName then | |
793 message = message .. "\n" .. needed .. "x " .. itemName | |
794 end | |
795 end | |
796 end | |
797 end | |
798 end | |
799 | |
800 if AmrSendSettings.SendEnchants then | |
801 for k,v in pairs(enchantList) do | |
802 local needed = v.total - v.count | |
803 if needed > 0 then | |
804 local itemName = GetItemInfo(k) | |
805 if itemName then | |
806 message = message .. "\n" .. needed .. "x " .. itemName | |
807 end | |
808 end | |
809 end | |
810 end | |
811 | |
812 if AmrSendSettings.SendEnchantMaterials then | |
813 for k,v in pairs(enchantMaterials) do | |
814 local needed = v.total - v.count | |
815 if needed > 0 then | |
816 local itemName = GetItemInfo(k) | |
817 if itemName then | |
818 message = message .. "\n" .. needed .. "x " .. itemName | |
819 end | |
820 end | |
821 end | |
822 end | |
823 | |
824 MailFrameTab_OnClick(nil, 2) | |
825 if AmrSendSettings.SendGems then | |
826 if AmrSendSettings.SendEnchants then | |
827 SendMailSubjectEditBox:SetText('Request for gems and enchants') | |
828 else | |
829 SendMailSubjectEditBox:SetText('Request for gems') | |
830 end | |
831 else | |
832 SendMailSubjectEditBox:SetText('Request for enchants') | |
833 end | |
834 SendMailNameEditBox:SetText(AmrSendSettings.SendTo) | |
835 SendMailBodyEditBox:SetText(message) | |
836 end | |
837 | |
838 function AskMrRobot.ShoppingListTab:Send() | |
839 local chatType = nil | |
840 if AmrSendSettings.SendToType == "party" then | |
841 chatType = "PARTY" | |
842 elseif AmrSendSettings.SendToType == "guild" then | |
843 chatType = "GUILD" | |
844 elseif AmrSendSettings.SendToType == "raid" then | |
845 chatType = "RAID" | |
846 elseif AmrSendSettings.SendToType == "channel" then | |
847 chatType = "CHANNEL" | |
848 elseif AmrSendSettings.SendToType == "mail" then | |
849 self:sendMail() | |
850 return | |
851 else | |
852 chatType = "WHISPER" | |
853 end | |
854 | |
855 local message = "Mr. Robot says I need" | |
856 local count = 0 | |
857 | |
858 | |
859 local gemList, enchantList, enchantMaterials = self:CalculateItems() | |
860 | |
861 local items = {} | |
862 if AmrSendSettings.SendGems then | |
863 for k,v in pairs(gemList) do | |
864 if not AskMrRobot.JewelcrafterGems[k] then | |
865 local needed = v.total - v.count | |
866 if needed > 0 then | |
867 tinsert(items, {id = k, needed = needed}) | |
868 end | |
869 end | |
870 end | |
871 end | |
872 | |
873 if AmrSendSettings.SendEnchants then | |
874 for k,v in pairs(enchantList) do | |
875 local needed = v.total - v.count | |
876 if needed > 0 then | |
877 tinsert(items, {id = k, needed = needed}) | |
878 end | |
879 end | |
880 end | |
881 | |
882 if AmrSendSettings.SendEnchantMaterials then | |
883 for k,v in pairs(enchantMaterials) do | |
884 local needed = v.total - v.count | |
885 if needed > 0 then | |
886 tinsert(items, {id = k, needed = needed}) | |
887 end | |
888 end | |
889 end | |
890 | |
891 for i, entry in ipairs(items) do | |
892 local _, link = GetItemInfo(entry.id) | |
893 if link then | |
894 message = message .. " " .. entry.needed .. "x " .. link | |
895 count = count + 1 | |
896 if count == 2 then | |
897 tinsert(self.messageQueue, {message = message, chatType = chatType, chatChannel = AmrSendSettings.SendTo}) | |
898 count = 0 | |
899 message = "Mr. Robot says I need" | |
900 end | |
901 end | |
902 end | |
903 | |
904 if count > 0 then | |
905 tinsert(self.messageQueue, {message = message, chatType = chatType, chatChannel = AmrSendSettings.SendTo}) | |
906 end | |
907 | |
908 self:SendNextMessage() | |
909 end | |
910 | |
911 function AskMrRobot.ShoppingListTab:SendNextMessage() | |
912 while #self.messageQueue > 0 do | |
913 local entry = self.messageQueue[1] | |
914 table.remove(self.messageQueue, 1) | |
915 SendChatMessage(entry.message, entry.chatType, nil, entry.chatChannel) | |
916 end | |
917 end |