-- ------------------------------------------------------------------------------ -- -- TradeSkillMaster_AuctionDB -- -- http://www.curse.com/addons/wow/tradeskillmaster_auctiondb -- -- -- -- A TradeSkillMaster Addon (http://tradeskillmaster.com) -- -- All Rights Reserved* - Detailed license information included with addon. -- -- ------------------------------------------------------------------------------ -- -- load the parent file (TSM) into a local variable and register this file as a module local TSM = select(2, ...) local GUI = TSM:NewModule("GUI") local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_AuctionDB") -- loads the localization table local private = {} function GUI:Show(frame) private.statusBar = private.statusBar or private:CreateStatusBar(frame.content) private.statusBar:Show() GUI:UpdateStatus("", 0, 0) private.startScanContent = private.startScanContent or private:CreateStartScanContent(frame) private.startScanContent:Show() if TSM.Scan.isScanning and not TSMAPI.AuctionScan:IsScanning() then TSM.Scan:DoneScanning() end if TSM.Scan.isScanning then GUI:SetPauseEnabled(true) GUI:SetPaused(TSMAPI.AuctionScan:IsPaused()) else GUI:SetPauseEnabled(false) GUI:SetPaused(false) end end function GUI:Hide() private.statusBar:Hide() private.startScanContent:Hide() if TSM.Scan.isScanning and not TSMAPI.AuctionScan:IsScanning() then TSM.Scan:DoneScanning() end if TSM.Scan.isScanning then TSM.Scan:PauseScan() else TSM.Scan:DoneScanning() TSMAPI.AuctionScan:StopScan() GUI:SetPauseEnabled(false) GUI:SetPaused(false) end end function GUI:UpdateStatus(text, major, minor) if text then private.statusBar:SetStatusText(text) end if major or minor then private.statusBar:UpdateStatus(major, minor) end end function GUI:SetPauseEnabled(enabled) if not private.startScanContent or not private.startScanContent.pauseFullScanButton then return end if enabled then private.startScanContent.pauseFullScanButton:Enable() else private.startScanContent.pauseFullScanButton:Disable() end end function GUI:SetPaused(isPaused) if not private.startScanContent or not private.startScanContent.pauseFullScanButton then return end private.startScanContent.pauseFullScanButton:SetText(isPaused and L["Resume"] or L["Pause"]) end function private:CreateStatusBar(parent) local frame = TSMAPI.GUI:CreateStatusBar(parent, "TSMAuctionDBStatusBar") TSMAPI.GUI:CreateHorizontalLine(frame, -30, parent) return frame end function private:CreateStartScanContent(parent) local frame = CreateFrame("Frame", nil, parent) frame:SetAllPoints(parent) frame:Hide() frame.Enable = function(self) self.startFullScanButton:Enable() self.pauseFullScanButton:Disable() self.cancelScanButton:Disable() self.startGroupScanButton:Enable() self.startInventoryScanButton:Enable() self.startBagScanButton:Enable() self.startBankScanButton:Enable() end frame.Disable = function(self) self.startFullScanButton:Disable() if TSM.Scan.isScanning then self.pauseFullScanButton:Enable() self.cancelScanButton:Enable() else self.pauseFullScanButton:Disable() self.cancelScanButton:Disable() end self.startGroupScanButton:Disable() self.startInventoryScanButton:Disable() self.startBagScanButton:Disable() self.startBankScanButton:Disable() end -- Top row: Auto updater. local text = TSMAPI.GUI:CreateLabel(frame) text:SetFont(TSMAPI.Design:GetContentFont(), 24) text:SetPoint("TOP", 0, -24) text:SetHeight(24) text:SetJustifyH("CENTER") text:SetJustifyV("CENTER") text:SetText(TSMAPI.Design:GetInlineColor("link").."TSM_AuctionDB") local ag = text:CreateAnimationGroup() local a1 = ag:CreateAnimation("Alpha") a1:SetChange(-.5) a1:SetDuration(.5) ag:SetLooping("BOUNCE") ag:Play() local content = CreateFrame("Frame", nil, frame) content:SetAllPoints(parent.content) TSMAPI.Design:SetFrameBackdropColor(content) -- Group tree. local container = CreateFrame("Frame", nil, content) container:SetPoint("TOPLEFT", 5, -35) container:SetPoint("BOTTOMRIGHT", -205, 5) TSMAPI.Design:SetFrameColor(container) frame.groupTree = TSMAPI:CreateGroupTree(container, nil, "AuctionDB") local bar = TSMAPI.GUI:CreateVerticalLine(content, 0) bar:ClearAllPoints() bar:SetPoint("TOPRIGHT", -200, -30) bar:SetPoint("BOTTOMRIGHT", -200, 0) local buttonFrame = CreateFrame("Frame", nil, content) buttonFrame:SetPoint("TOPLEFT", content, "TOPRIGHT", -200, 0) buttonFrame:SetPoint("BOTTOMRIGHT") -- Row: Full Scan. local yOffset = -50 -- Row: Full Scan. local btn = TSMAPI.GUI:CreateButton(buttonFrame, 18) btn:SetPoint("TOPLEFT", 6, yOffset) btn:SetPoint("TOPRIGHT", -6, yOffset) btn:SetHeight(22) btn:SetScript("OnClick", TSM.Scan.StartFullScan) btn:SetText(L["Run Full Scan"]) btn.tooltip = L["A full auction house scan will scan every item on the auction house. Expect this scan to take several minutes or longer."] frame.startFullScanButton = btn yOffset = yOffset - 40 TSMAPI.GUI:CreateHorizontalLine(buttonFrame, yOffset) yOffset = yOffset - 20 -- Row: Group Scan. local btn = TSMAPI.GUI:CreateButton(buttonFrame, 18) btn:SetPoint("TOPLEFT", 6, yOffset) btn:SetPoint("TOPRIGHT", -6, yOffset) btn:SetHeight(22) btn:SetScript("OnClick", GUI.StartGroupScan) btn:SetText(L["Scan Selected Groups"]) btn.tooltip = L["This will do a slow auction house scan of every item in the selected groups and update their AuctionDB prices. This may take several minutes."] frame.startGroupScanButton = btn yOffset = yOffset - 40 TSMAPI.GUI:CreateHorizontalLine(buttonFrame, yOffset) yOffset = yOffset - 20 -- Row: Inventory Scan. local btn = TSMAPI.GUI:CreateButton(buttonFrame, 18) btn:SetPoint("TOPLEFT", 6, yOffset) btn:SetPoint("TOPRIGHT", -6, yOffset) btn:SetHeight(22) btn:SetScript("OnClick", GUI.StartInventoryScan) btn:SetText(L["Scan Inventory"]) btn.tooltip = L["Scans bags and bank for all characters."] frame.startInventoryScanButton = btn yOffset = yOffset - 30 -- Row: Bag Scan. local btn = TSMAPI.GUI:CreateButton(buttonFrame, 18) btn:SetPoint("TOPLEFT", 6, yOffset) btn:SetPoint("TOPRIGHT", -6, yOffset) btn:SetHeight(22) btn:SetScript("OnClick", GUI.StartBagScan) btn:SetText(L["Scan Bags"]) btn.tooltip = L["Scan bag items."] frame.startBagScanButton = btn yOffset = yOffset - 30 -- Row: Bank Scan. local btn = TSMAPI.GUI:CreateButton(buttonFrame, 18) btn:SetPoint("TOPLEFT", 6, yOffset) btn:SetPoint("TOPRIGHT", -6, yOffset) btn:SetHeight(22) btn:SetScript("OnClick", GUI.StartBankScan) btn:SetText(L["Scan Bank"]) btn.tooltip = L["Scan bank items."] frame.startBankScanButton = btn yOffset = yOffset - 40 TSMAPI.GUI:CreateHorizontalLine(buttonFrame, yOffset) yOffset = yOffset - 20 local pauseBtn = TSMAPI.GUI:CreateButton(buttonFrame, 16) pauseBtn:SetPoint("TOPLEFT", 6, yOffset) pauseBtn:SetPoint("TOPRIGHT", -6, yOffset) pauseBtn:SetHeight(18) pauseBtn:SetScript("OnClick", TSM.Scan.TogglePause) pauseBtn:SetText(L["Pause"]) pauseBtn:Disable() frame.pauseFullScanButton = pauseBtn yOffset = yOffset - 24 local cancelBtn = TSMAPI.GUI:CreateButton(buttonFrame, 16) cancelBtn:SetPoint("TOPLEFT", 6, yOffset) cancelBtn:SetPoint("TOPRIGHT", -6, yOffset) cancelBtn:SetHeight(18) cancelBtn:SetScript("OnClick", GUI.CancelScan) cancelBtn:SetText(L["Cancel Scan"]) cancelBtn:Disable() frame.cancelScanButton = cancelBtn return frame end function GUI:StartGroupScan() local items = {} for groupName, data in pairs(private.startScanContent.groupTree:GetSelectedGroupInfo()) do groupName = TSMAPI:FormatGroupPath(groupName, true) for itemString in pairs(data.items) do tinsert(items, itemString) end end TSM.Scan:StartGroupScan(items) end function GUI:StartInventoryScan() local players = TSMAPI:ModuleAPI("ItemTracker", "playerlist") if not players then TSM:Print(L["ItemTracker data unavailable."]) return end local specificItems, baseCandidates, hasSpecific = {}, {}, {} for _, player in ipairs(players) do local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) if bags then private:CollectItemStrings(bags, specificItems, baseCandidates, hasSpecific) end if bank then private:CollectItemStrings(bank, specificItems, baseCandidates, hasSpecific) end end for baseItemString in pairs(baseCandidates) do if not hasSpecific[baseItemString] then specificItems[baseItemString] = true end end local items = {} for itemString in pairs(specificItems) do tinsert(items, itemString) end if #items == 0 then TSM:Print(L["No inventory items found."]) return end TSM.Scan:StartGroupScan(items) end function private:CollectItemStrings(data, specificItems, baseCandidates, hasSpecific) for itemString in pairs(data) do if type(itemString) == "string" then local baseItemString = TSMAPI:GetBaseItemString(itemString) or itemString if itemString ~= baseItemString then specificItems[itemString] = true hasSpecific[baseItemString] = true else baseCandidates[baseItemString] = true end end end end function private:GetItemTrackerItems(key) local data = TSMAPI:ModuleAPI("ItemTracker", key) if not data then TSM:Print(L["ItemTracker data unavailable."]) return end local specificItems, baseCandidates, hasSpecific = {}, {}, {} private:CollectItemStrings(data, specificItems, baseCandidates, hasSpecific) for baseItemString in pairs(baseCandidates) do if not hasSpecific[baseItemString] then specificItems[baseItemString] = true end end local items = {} for itemString in pairs(specificItems) do tinsert(items, itemString) end return items end function GUI:StartBagScan() local items = private:GetItemTrackerItems("playerbags") if not items then return end if #items == 0 then TSM:Print(L["No bag items found."]) return end TSM.Scan:StartGroupScan(items) end function GUI:StartBankScan() local items = private:GetItemTrackerItems("playerbank") if not items then return end if #items == 0 then TSM:Print(L["No bank items found."]) return end TSM.Scan:StartGroupScan(items) end function GUI:CancelScan() TSMAPI.AuctionScan:StopScan(true) TSM.Scan:DoneScanning() end