AuctioneerSuite/Auc-Advanced/Modules/Auc-Util-ScanProgress/ScanProgress.lua
2026-04-13 17:48:13 -04:00

224 lines
8.9 KiB
Lua

--[[
Auctioneer - Price Level Utility module
Version: 5.9.4961 (WhackyWallaby)
Revision: $Id: ScanProgress.lua 4840 2010-08-04 21:44:00Z Nechckn $
URL: http://auctioneeraddon.com/
This is an Auctioneer module that adds a textual scan progress
indicator to the Auction House UI.
License:
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program(see GPL.txt); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Note:
This AddOn's source code is specifically designed to work with
World of Warcraft's interpreted AddOn system.
You have an implicit license to use this AddOn with these facilities
since that is its designated purpose as per:
http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat
--]]
if not AucAdvanced then return end
local libType, libName = "Util", "ScanProgress"
local lib,parent,private = AucAdvanced.NewModule(libType, libName)
if not lib then return end
local print,decode,_,_,replicate,empty,get,set,default,debugPrint,fill,_TRANS = AucAdvanced.GetModuleLocals()
function lib.Processor(callbackType, ...)
if (callbackType == "scanprogress") then
private.UpdateScanProgress(...)
elseif (callbackType == "config") then
private.SetupConfigGui(...)
elseif (callbackType == "configchanged") then
private.ConfigChanged(...)
end
end
lib.Processors = {}
function lib.Processors.scanprogress(callbackType, ...)
private.UpdateScanProgress(...)
end
function lib.Processors.config(callbackType, ...)
private.SetupConfigGui(...)
end
function lib.Processors.configchanged(callbackType, ...)
private.ConfigChanged(...)
end
function lib.OnLoad()
--print("AucAdvanced: {{"..libType..":"..libName.."}} loaded!")
AucAdvanced.Settings.SetDefault("util.scanprogress.activated", true)
AucAdvanced.Settings.SetDefault("util.scanprogress.leaveshown", true)
end
---- Functions to manage the progress indicator ----
private.scanStartTime = time()
--private.scanProgressFormat = "Auctioneer Advanced: %s\nScanning page %d of %d\n\nAuctions per second: %.2f\nAuctions scanned thus far: %d\n\nEstimated time left: %s\nElapsed scan time: %s"
private.scanProgressFormat = "Auctioneer Advanced: %s\nScanning page %d of %d\n\nAuctions per second: %.2f\nAuctions expected: %d\nAuctions scanned thus far: %d (%3.1f%%)\n\nElapsed scan time: %s\nEstimated time left: %s"
function private.UpdateScanProgress(state, totalAuctions, scannedAuctions, elapsedTime)
--Check that we're enabled before passing on the callback
if not AucAdvanced.Settings.GetSetting("util.scanprogress.activated")
--Check to see if browseoverride has been set, if so gracefully allow it to continue as is
or AucAdvanced.Settings.GetSetting("util.browseoverride.activated") then
state = false
end
--Change the state if we have not scanned any auctions yet.
--This is done so that we don't start the timer too soon and thus get skewed numbers
if (state == nil and (
not scannedAuctions or
scannedAuctions == 0 or
not AucAdvanced.API.IsBlocked() or
BrowseButton1:IsVisible()
)) then
state = true
end
--Distribute the callback according to the value of the state variable
if (state == false) then
if AucAdvanced.API.IsBlocked() then
private.HideScanProgressUI()
end
return
elseif (state == true) then
private.ShowScanProgressUI(totalAuctions)
end
if scannedAuctions and scannedAuctions > 0 then
private.UpdateScanProgressUI(totalAuctions, scannedAuctions, elapsedTime)
end
end
local initShown = false
function private.ShowScanProgressUI(totalAuctions)
if (nLog) then nLog.AddMessage("Auctioneer", "ScanProgress", N_INFO, "ShowScanProgressUI Called") end
for i=1, NUM_BROWSE_TO_DISPLAY do
_G["BrowseButton"..i]:Hide()
end
BrowseNoResultsText:Show()
private.scanStartTime = time()
local msg
if totalAuctions and totalAuctions > 0 then
msg = ("Scanning %d items..."):format(totalAuctions)
else
msg = "Scanning..."
end
BrowseNoResultsText:SetText(msg)
initShown = msg.." DONE"
AucAdvanced.API.BlockUpdate(true, true)
end
function private.HideScanProgressUI()
if (nLog) then nLog.AddMessage("Auctioneer", "ScanProgress", N_INFO, "HideScanProgressUI Called") end
if (AucAdvanced.Settings.GetSetting("util.scanprogress.leaveshown")) then
if (initShown) then BrowseNoResultsText:SetText(initShown) end
AucAdvanced.API.BlockUpdate(false, false)
else
BrowseNoResultsText:Hide()
BrowseNoResultsText:SetText(SEARCHING_FOR_ITEMS)
local numBatchAuctions, totalAuctions = GetNumAuctionItems("list")
local offset = FauxScrollFrame_GetOffset(BrowseScrollFrame)
for i=1, NUM_BROWSE_TO_DISPLAY do
index = offset + i + (NUM_AUCTION_ITEMS_PER_PAGE * AuctionFrameBrowse.page)
if ( index > (numBatchAuctions + (NUM_AUCTION_ITEMS_PER_PAGE * AuctionFrameBrowse.page)) ) then
_G["BrowseButton"..i]:Hide()
else
_G["BrowseButton"..i]:Show()
end
end
AucAdvanced.API.BlockUpdate(false, true)
end
initShown = nil
end
function private.UpdateScanProgressUI(totalAuctions, scannedAuctions, elapsedTime)
if (nLog) then nLog.AddMessage("Auctioneer", "ScanProgress", N_INFO, "UpdateScanProgressUI Called") end
local numAuctionsPerPage = NUM_AUCTION_ITEMS_PER_PAGE
initShown = false
-- Prefer the elapsed time which is provided by core and excludes paused time.
local secondsElapsed = elapsedTime or (time() - private.scanStartTime)
local auctionsToScan = totalAuctions - scannedAuctions
local currentPage = math.floor(scannedAuctions / numAuctionsPerPage)
local totalPages = math.ceil(totalAuctions / numAuctionsPerPage)
if (totalPages < 1) then
totalPages = 1
end
-- if (totalPages - math.floor(totalPages) > 0) then
-- totalPages = math.ceil(totalPages)
-- else
-- totalPages = math.floor(totalPages)
-- end
local auctionsScannedPerSecond = scannedAuctions / secondsElapsed
local secondsToScanCompletion = auctionsToScan / auctionsScannedPerSecond
if (currentPage+1 == totalPages) then
secondsToScanCompletion = "Done"
else
secondsToScanCompletion = SecondsToTime(secondsToScanCompletion)
end
BrowseNoResultsText:SetText(
private.scanProgressFormat:format(
"Scanning auctions.",
currentPage + 1, totalPages,
auctionsScannedPerSecond,
totalAuctions,
scannedAuctions, ((currentPage+1)/totalPages)*100,
SecondsToTime(secondsElapsed),
secondsToScanCompletion
)
)
end
--Config UI functions
function private.SetupConfigGui(gui)
-- The defaults for the following settings are set in the lib.OnLoad function
local id = gui:AddTab(libName, libType.." Modules")
gui:AddControl(id, "Header", 0, libName.." Options")
gui:AddHelp(id, "what scanprogress",
_TRANS('SPRG_Help_WhatScanProgress'), --"What is the Scan Progress indicator?"
_TRANS('SPRG_Help_WhatScanProgressAnswer')) --"The Scan Progress indicator is the text that appears while scanning the Auction House. It displays: the speed of the scan, current auctions and total number of auctions scanned, aswell as the current number of pages and total pages scanned."
-- Old answer, incase the new one is too short and/or vague.
-- "The Scan Progress indicator is the text that appears while scanning the Auction House, indicating "..
-- "how fast you are scanning, how many auctions you have scanned so far, how many total auctions there are, "..
-- "how many pages you have scanned so far, and how many total pages there are.")
gui:AddControl(id, "Checkbox", 0, 1, "util.scanprogress.activated", _TRANS('SPRG_Interface_Activated')) --"Show a textual progress indicator when scanning"
gui:AddTip(id, _TRANS('SPRG_HelpTooltip_Activated')) --"Toggles the display of the scan progress indicator\n\nNOTE: This setting is also affected by the CompactUI option to prevent other modules from changing the display of the browse tab while scanning."
gui:AddControl(id, "Checkbox", 0, 1, "util.scanprogress.leaveshown", _TRANS('SPRG_Interface_LeaveShown')) --"Leave the scan progress text shown after scan completion"
gui:AddTip(id, _TRANS('SPRG_HelpTooltip_LeaveShown')) --"If toggled, it will leave the scan progress indicator on the screen after scan has completed.\n\nIf disabled it will show the last scanned page."
end
function private.ConfigChanged()
if (not AucAdvanced.Settings.GetSetting("util.scanprogress.activated")) then
private.UpdateScanProgress(false)
elseif (AucAdvanced.Scan.IsScanning()) then
private.UpdateScanProgress(true)
end
end
AucAdvanced.RegisterRevision("$URL: http://svn.norganna.org/auctioneer/branches/5.9/Auc-Util-ScanProgress/ScanProgress.lua $", "$Rev: 4840 $")