Mercurial > wow > askmrrobot
comparison Shopping.lua @ 139:c229c759a125 v65
Update to support multiple setups per spec.
| author | yellowfive |
|---|---|
| date | Mon, 05 Nov 2018 16:06:00 -0800 |
| parents | a0894ffebd15 |
| children | 44ce007189e0 |
comparison
equal
deleted
inserted
replaced
| 138:45e467335a1b | 139:c229c759a125 |
|---|---|
| 3 local AceGUI = LibStub("AceGUI-3.0") | 3 local AceGUI = LibStub("AceGUI-3.0") |
| 4 | 4 |
| 5 local _frameShop | 5 local _frameShop |
| 6 local _panelContent | 6 local _panelContent |
| 7 local _cboPlayers | 7 local _cboPlayers |
| 8 local _selectedPlayer | 8 local _selectedSetup |
| 9 | 9 |
| 10 local _specs = { | 10 local _specs = { |
| 11 [1] = true, | 11 [1] = true, |
| 12 [2] = true, | 12 [2] = true, |
| 13 [3] = true, | 13 [3] = true, |
| 14 [4] = true, | 14 [4] = true, |
| 15 } | 15 } |
| 16 | 16 |
| 17 local _chk1 | |
| 18 local _chk2 | |
| 19 local _chk3 | |
| 20 local _chk4 | |
| 21 local _isAhOpen = false | 17 local _isAhOpen = false |
| 22 | 18 |
| 23 local function incrementTableItem(tbl, key, inc) | 19 local function incrementTableItem(tbl, key, inc) |
| 24 tbl[key] = tbl[key] and tbl[key] + inc or inc | 20 tbl[key] = tbl[key] and tbl[key] + inc or inc |
| 25 end | 21 end |
| 26 | 22 |
| 27 local function onShopFrameClose(widget) | 23 local function onShopFrameClose(widget) |
| 28 AceGUI:Release(widget) | 24 AceGUI:Release(widget) |
| 29 _frameShop = nil | 25 _frameShop = nil |
| 30 _cboPlayers = nil | 26 _cboPlayers = nil |
| 31 _chk1 = nil | |
| 32 _chk2 = nil | |
| 33 _chk3 = nil | |
| 34 _chk4 = nil | |
| 35 _panelContent = nil | 27 _panelContent = nil |
| 36 end | 28 end |
| 37 | 29 |
| 38 function Amr:HideShopWindow() | 30 function Amr:HideShopWindow() |
| 39 if not _frameShop then return end | 31 if not _frameShop then return end |
| 40 _frameShop:Hide() | 32 _frameShop:Hide() |
| 41 end | 33 end |
| 42 | 34 |
| 43 local function onPlayerChange(widget, eventName, value) | 35 local function onPlayerChange(widget, eventName, value) |
| 44 _selectedPlayer = value | 36 _selectedSetup = value |
| 45 Amr:RefreshShoppingUi() | 37 Amr:RefreshShoppingUi() |
| 46 end | 38 end |
| 47 | 39 |
| 48 local function onSpecClick(widget) | 40 local function onSpecClick(widget) |
| 49 local spec = widget:GetUserData("spec") | 41 local spec = widget:GetUserData("spec") |
| 93 _cboPlayers = AceGUI:Create("AmrUiDropDown") | 85 _cboPlayers = AceGUI:Create("AmrUiDropDown") |
| 94 _cboPlayers:SetWidth(400) | 86 _cboPlayers:SetWidth(400) |
| 95 _frameShop:AddChild(_cboPlayers) | 87 _frameShop:AddChild(_cboPlayers) |
| 96 _cboPlayers:SetPoint("TOPLEFT", _frameShop.content, "TOPLEFT", 0, -30) | 88 _cboPlayers:SetPoint("TOPLEFT", _frameShop.content, "TOPLEFT", 0, -30) |
| 97 | 89 |
| 98 -- spec pickers | |
| 99 _chk1 = AceGUI:Create("AmrUiCheckBox") | |
| 100 _chk1:SetUserData("spec", 1) | |
| 101 _chk1:SetCallback("OnClick", onSpecClick) | |
| 102 _frameShop:AddChild(_chk1) | |
| 103 _chk1:SetPoint("TOPLEFT", _cboPlayers.frame, "BOTTOMLEFT", 0, -20) | |
| 104 | |
| 105 _chk2 = AceGUI:Create("AmrUiCheckBox") | |
| 106 _chk2:SetUserData("spec", 2) | |
| 107 _chk2:SetCallback("OnClick", onSpecClick) | |
| 108 _frameShop:AddChild(_chk2) | |
| 109 _chk2:SetPoint("LEFT", _chk1.frame, "RIGHT", 30, 0) | |
| 110 | |
| 111 _chk3 = AceGUI:Create("AmrUiCheckBox") | |
| 112 _chk3:SetUserData("spec", 3) | |
| 113 _chk3:SetCallback("OnClick", onSpecClick) | |
| 114 _frameShop:AddChild(_chk3) | |
| 115 _chk3:SetPoint("LEFT", _chk2.frame, "RIGHT", 30, 0) | |
| 116 | |
| 117 _chk4 = AceGUI:Create("AmrUiCheckBox") | |
| 118 _chk4:SetUserData("spec", 4) | |
| 119 _chk4:SetCallback("OnClick", onSpecClick) | |
| 120 _frameShop:AddChild(_chk4) | |
| 121 _chk4:SetPoint("LEFT", _chk3.frame, "RIGHT", 30, 0) | |
| 122 | |
| 123 _panelContent = AceGUI:Create("AmrUiPanel") | 90 _panelContent = AceGUI:Create("AmrUiPanel") |
| 124 _panelContent:SetLayout("None") | 91 _panelContent:SetLayout("None") |
| 125 _panelContent:SetTransparent() | 92 _panelContent:SetTransparent() |
| 126 _frameShop:AddChild(_panelContent) | 93 _frameShop:AddChild(_panelContent) |
| 127 _panelContent:SetPoint("TOPLEFT", _chk1.frame, "BOTTOMLEFT", 0, -10) | 94 _panelContent:SetPoint("TOPLEFT", _cboPlayers.frame, "BOTTOMLEFT", 0, -10) |
| 128 _panelContent:SetPoint("BOTTOMRIGHT", _frameShop.content, "BOTTOMRIGHT") | 95 _panelContent:SetPoint("BOTTOMRIGHT", _frameShop.content, "BOTTOMRIGHT") |
| 129 | 96 |
| 130 -- update shopping list data | 97 -- update shopping list data |
| 131 local player = Amr:ExportCharacter() | 98 local player = Amr:ExportCharacter() |
| 132 Amr:UpdateShoppingData(player) | 99 Amr:UpdateShoppingData(player) |
| 133 | 100 |
| 134 -- fill player list | 101 -- fill player list |
| 135 local playerList = {} | 102 local playerList = {} |
| 136 for name, data in pairs(Amr.db.global.Shopping) do | 103 local firstData = nil |
| 137 table.insert(playerList, { text = name, value = name }) | 104 for name, v in pairs(Amr.db.global.Shopping2) do |
| 105 for setupName, data in pairs(v.setups) do | |
| 106 table.insert(playerList, { text = name .. " " .. setupName, value = name .. "@" .. setupName }) | |
| 107 if not firstData then | |
| 108 firstData = name .. "@" .. setupName | |
| 109 end | |
| 110 end | |
| 138 end | 111 end |
| 139 _cboPlayers:SetItems(playerList) | 112 _cboPlayers:SetItems(playerList) |
| 140 | 113 |
| 141 -- set default selected player | 114 -- set default selected player |
| 142 if not _selectedPlayer then | 115 local playerData = Amr.db.global.Shopping2[player.Name .. "-" .. player.Realm] |
| 143 _selectedPlayer = player.Name .. "-" .. player.Realm | 116 if playerData and playerData.setups then |
| 144 end | 117 _selectedSetup = Amr:GetActiveSetupLabel() |
| 145 _cboPlayers:SelectItem(_selectedPlayer) | 118 if not _selectedSetup then |
| 119 Amr:PickFirstSetupForSpec() | |
| 120 _selectedSetup = Amr:GetActiveSetupLabel() | |
| 121 end | |
| 122 if _selectedSetup and not playerData.setups[_selectedSetup] then | |
| 123 _selectedSetup = nil | |
| 124 else | |
| 125 _selectedSetup = player.Name .. "-" .. player.Realm .. "@" .. _selectedSetup | |
| 126 end | |
| 127 end | |
| 128 | |
| 129 if not _selectedSetup then | |
| 130 if playerData and playerData.setups then | |
| 131 for k,v in pairs(playerData.setups) do | |
| 132 _selectedSetup = player.Name .. "-" .. player.Realm .. "@" .. k | |
| 133 break | |
| 134 end | |
| 135 else | |
| 136 _selectedSetup = firstData | |
| 137 end | |
| 138 end | |
| 139 _cboPlayers:SelectItem(_selectedSetup) | |
| 146 | 140 |
| 147 Amr:RefreshShoppingUi() | 141 Amr:RefreshShoppingUi() |
| 148 | 142 |
| 149 -- set event on dropdown after UI has been initially rendered | 143 -- set event on dropdown after UI has been initially rendered |
| 150 _cboPlayers:SetCallback("OnChange", onPlayerChange) | 144 _cboPlayers:SetCallback("OnChange", onPlayerChange) |
| 145 | |
| 146 -- set a timer to refresh a bit after opening b/c sometimes some item info isn't available | |
| 147 Amr.Wait(2, function() | |
| 148 if _frameShop then | |
| 149 Amr:RefreshShoppingUi() | |
| 150 end | |
| 151 end) | |
| 151 else | 152 else |
| 152 _frameShop:Show() | 153 _frameShop:Show() |
| 153 Amr:RefreshShoppingUi() | 154 Amr:RefreshShoppingUi() |
| 154 end | 155 end |
| 155 | 156 |
| 268 end | 269 end |
| 269 end | 270 end |
| 270 | 271 |
| 271 function Amr:RefreshShoppingUi() | 272 function Amr:RefreshShoppingUi() |
| 272 | 273 |
| 273 local posToCheck = { _chk1, _chk2, _chk3, _chk4 } | |
| 274 local chk | |
| 275 | |
| 276 -- reset spec checkboxes | |
| 277 for specPos = 1,4 do | |
| 278 chk = posToCheck[specPos] | |
| 279 chk:SetVisible(false) | |
| 280 chk:SetChecked(false) | |
| 281 end | |
| 282 | |
| 283 -- clear out any previous data | 274 -- clear out any previous data |
| 284 _panelContent:ReleaseChildren() | 275 _panelContent:ReleaseChildren() |
| 285 | 276 |
| 286 local data = Amr.db.global.Shopping[_selectedPlayer] | 277 local parts = { strsplit("@", _selectedSetup) } |
| 278 | |
| 279 local data = Amr.db.global.Shopping2[parts[1]].setups[parts[2]] | |
| 287 if not data then | 280 if not data then |
| 288 _panelContent:SetLayout("None") | 281 _panelContent:SetLayout("None") |
| 289 | 282 |
| 290 local lbl = AceGUI:Create("AmrUiLabel") | 283 local lbl = AceGUI:Create("AmrUiLabel") |
| 291 _panelContent:AddChild(lbl) | 284 _panelContent:AddChild(lbl) |
| 296 else | 289 else |
| 297 local allStuff = { gems = {}, enchants = {}, materials = {} } | 290 local allStuff = { gems = {}, enchants = {}, materials = {} } |
| 298 local hasStuff = false | 291 local hasStuff = false |
| 299 local visited = {} | 292 local visited = {} |
| 300 | 293 |
| 301 for specPos = 1,4 do | 294 for inventoryId, stuff in pairs(data) do |
| 302 -- set labels on checkboxes | 295 hasStuff = true |
| 303 if data.specs[specPos] and data.specs[specPos] ~= 0 then | 296 if not visited[inventoryId] then |
| 304 chk = posToCheck[specPos] | 297 if stuff.gems then |
| 305 chk:SetText(L.SpecsShort[data.specs[specPos]]) | 298 for itemId, count in pairs(stuff.gems) do |
| 306 chk:SetVisible(true) | 299 incrementTableItem(allStuff.gems, itemId, count) |
| 307 chk:SetChecked(_specs[specPos]) | 300 end |
| 301 end | |
| 308 | 302 |
| 309 -- gather up all stuff for checked specs | 303 if stuff.enchants then |
| 310 if _specs[specPos] then | 304 for itemId, count in pairs(stuff.enchants) do |
| 311 hasStuff = true | 305 incrementTableItem(allStuff.enchants, itemId, count) |
| 312 | |
| 313 for inventoryId, stuff in pairs(data.stuff[specPos]) do | |
| 314 if not visited[inventoryId] then | |
| 315 if stuff.gems then | |
| 316 for itemId, count in pairs(stuff.gems) do | |
| 317 incrementTableItem(allStuff.gems, itemId, count) | |
| 318 end | |
| 319 end | |
| 320 | |
| 321 if stuff.enchants then | |
| 322 for itemId, count in pairs(stuff.enchants) do | |
| 323 incrementTableItem(allStuff.enchants, itemId, count) | |
| 324 end | |
| 325 end | |
| 326 | |
| 327 if stuff.materials then | |
| 328 for itemId, count in pairs(stuff.materials) do | |
| 329 incrementTableItem(allStuff.materials, itemId, count) | |
| 330 end | |
| 331 end | |
| 332 | |
| 333 -- make sure not to count the same physical item twice | |
| 334 if inventoryId ~= -1 then | |
| 335 visited[inventoryId] = true | |
| 336 end | |
| 337 end | |
| 338 end | 306 end |
| 339 end | 307 end |
| 340 | 308 |
| 341 end | 309 if stuff.materials then |
| 310 for itemId, count in pairs(stuff.materials) do | |
| 311 incrementTableItem(allStuff.materials, itemId, count) | |
| 312 end | |
| 313 end | |
| 342 | 314 |
| 315 -- make sure not to count the same physical item twice | |
| 316 if inventoryId ~= -1 then | |
| 317 visited[inventoryId] = true | |
| 318 end | |
| 319 end | |
| 343 end | 320 end |
| 344 | 321 |
| 345 if hasStuff then | 322 if hasStuff then |
| 346 -- remove what we already own | 323 -- remove what we already own |
| 347 local owned = { counts = {}, loaded = {} } | 324 local owned = { counts = {}, loaded = {} } |
| 417 end | 394 end |
| 418 | 395 |
| 419 return ret | 396 return ret |
| 420 end | 397 end |
| 421 | 398 |
| 422 -- look at both gear sets and find stuff that a player needs to acquire to gem/enchant their gear | 399 -- look at all gear sets and find stuff that a player needs to acquire to gem/enchant their gear for each setup |
| 423 function Amr:UpdateShoppingData(player) | 400 function Amr:UpdateShoppingData(player) |
| 424 | 401 |
| 425 local required = { | 402 local required = { |
| 426 stuff = {}, | 403 setups = {} |
| 427 specs = player.Specs | |
| 428 } | 404 } |
| 429 | 405 |
| 430 for i, spec in ipairs(required.specs) do | 406 for i, setup in ipairs(Amr.db.char.GearSetups) do |
| 431 local gear = Amr.db.char.GearSets[i] | 407 local gear = setup.Gear |
| 432 if gear then | 408 if gear then |
| 433 required.stuff[i] = getShoppingData(player, gear) | 409 required.setups[setup.Label] = getShoppingData(player, gear) |
| 434 else | 410 end |
| 435 required.stuff[i] = {} | 411 end |
| 436 end | 412 |
| 437 end | 413 Amr.db.global.Shopping2[player.Name .. "-" .. player.Realm] = required |
| 438 | |
| 439 Amr.db.global.Shopping[player.Name .. "-" .. player.Realm] = required | |
| 440 end | 414 end |
| 441 | 415 |
| 442 Amr:AddEventHandler("AUCTION_HOUSE_SHOW", function() | 416 Amr:AddEventHandler("AUCTION_HOUSE_SHOW", function() |
| 443 _isAhOpen = true | 417 _isAhOpen = true |
| 444 if Amr.db.profile.options.shopAh then | 418 if Amr.db.profile.options.shopAh then |
