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