local _ , S = ...
local pairs , ipairs , string , type , time = pairs , ipairs , string , type , time
local TOOLTIP_DELAY = 0.075
local TOOLTIP_DELAY_UPDATES = 0.2
S.Tooltip = { }
local extraTooltip = CreateFrame ( " GameTooltip " , " SortedExtendedTooltip " , GameTooltip , " GameTooltipTemplate " )
local i = 0
local currentlyShownIndex = 0
local lastTime , lastUpdateTime = GetTime ( ) , GetTime ( )
-- For performance, limits the rate that tooltips are displayed.
-- If enough time has passed since the last tooltip, the tooltip is displayed instantly. Otherwise, it's shown after a delay, unless another tooltip is scheduled in that time.
-- 'func' is the function which sets up the GameTooltip
-- 'self' is passed to the function
-- 'update' is set to true for item button updates. It prevents lastTime from resetting when the button updates, which would prevent the next tooltip from showing instantly
function S . Tooltip . Schedule ( func , self , update )
--local tooltipDelay = S.Settings.Get("tooltipDelay")
local tooltipDelay = TOOLTIP_DELAY
if update then
tooltipDelay = TOOLTIP_DELAY_UPDATES
end
local time = GetTime ( )
i = i + 1
local lastTooltipTime
if update then
lastTooltipTime = lastUpdateTime
else
lastTooltipTime = lastTime
end
if lastTooltipTime < time - tooltipDelay then
func ( self )
else
local id = i
local delay = tooltipDelay - ( time - lastTime )
if delay < 0 then
delay = 0
end
C_Timer.After ( delay , function ( )
if i == id then
func ( self )
lastUpdateTime = time
if not update then
lastTime = lastUpdateTime
end
end
end )
end
lastUpdateTime = time
if not update then
lastTime = lastUpdateTime
end
end
-- Hides the tooltip after a delay, unless a tooltip is shown first
-- Currently broken. Use S.Tooltip.Cancel() instead
function S . Tooltip . ScheduledCancel ( )
local tooltipDelay = TOOLTIP_DELAY
local id = currentlyShownIndex
C_Timer.After ( tooltipDelay , function ( )
if id == currentlyShownIndex then
GameTooltip : Hide ( )
extraTooltip : Hide ( )
if S.WoWVersion ( ) >= 5 then
BattlePetTooltip : Hide ( )
end
end
end )
end
-- Hides the tooltip and interrupts any scheduled tooltip
function S . Tooltip . Cancel ( )
GameTooltip : Hide ( )
extraTooltip : Hide ( )
if S.WoWVersion ( ) >= 5 then
BattlePetTooltip : Hide ( )
end
i = i + 1
end
local function Create ( )
GameTooltip : SetOwner ( S.Tooltip . parent , S.Tooltip . anchor )
GameTooltip : ClearLines ( )
GameTooltip : AddLine ( S.Tooltip . text )
GameTooltip : Show ( )
end
function S . Tooltip . CreateText ( parent , anchor , text )
S.Tooltip . parent = parent
S.Tooltip . anchor = anchor
S.Tooltip . text = text
S.Tooltip . Schedule ( Create )
end
function S . Tooltip . CreateLocalized ( parent , anchor , key , arg1 , arg2 , arg3 )
S.Tooltip . CreateText ( parent , anchor , S.Localize ( key , arg1 , arg2 , arg3 ) )
end
-- Sets GameTooltip to a currency. Works in Classic and Retail
function S . Tooltip . SetCurrency ( currencyID )
if GameTooltip.SetCurrencyByID then
GameTooltip : SetCurrencyByID ( currencyID )
-- Classic Honor and Arena Points tooltips are handled differently
elseif ( currencyID == Constants.CurrencyConsts . CLASSIC_HONOR_CURRENCY_ID ) then
GameTooltip : SetText ( HONOR_POINTS , HIGHLIGHT_FONT_COLOR.r , HIGHLIGHT_FONT_COLOR.g , HIGHLIGHT_FONT_COLOR.b ) ;
GameTooltip : AddLine ( TOOLTIP_HONOR_POINTS , nil , nil , nil , 1 ) ;
GameTooltip : Show ( ) ;
elseif ( currencyID == Constants.CurrencyConsts . CLASSIC_ARENA_POINTS_CURRENCY_ID ) then
GameTooltip : SetText ( ARENA_POINTS , HIGHLIGHT_FONT_COLOR.r , HIGHLIGHT_FONT_COLOR.g , HIGHLIGHT_FONT_COLOR.b ) ;
GameTooltip : AddLine ( TOOLTIP_ARENA_POINTS , nil , nil , nil , 1 ) ;
GameTooltip : Show ( ) ;
elseif GameTooltip.SetCurrencyToken then
GameTooltip : SetCurrencyToken ( currencyID )
end
end
extraTooltip : SetClampedToScreen ( false )
local extraTooltipLines = { }
extraTooltip.logo = extraTooltip : CreateTexture ( " " )
extraTooltip.logo : SetTexture ( " Interface \\ Addons \\ Sorted \\ Textures \\ Portrait-Text " )
extraTooltip.logo : SetTexCoord ( 0 , 1 , 0.25 , 0.75 )
extraTooltip.logo : SetPoint ( " TOPLEFT " , 10 , - 6 )
extraTooltip.logo : SetSize ( 64 , 32 )
extraTooltip.bagIcon = extraTooltip : CreateTexture ( " " )
extraTooltip.bagIcon : SetTexture ( " Interface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons " )
extraTooltip.bagIcon : SetTexCoord ( 0 , 0.25 , 0 , 1 )
extraTooltip.bagIcon : SetPoint ( " TOPRIGHT " , - 116 , - 12 )
extraTooltip.bagIcon : SetSize ( 20 , 20 )
extraTooltip.bankIcon = extraTooltip : CreateTexture ( " " )
extraTooltip.bankIcon : SetTexture ( " Interface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons " )
extraTooltip.bankIcon : SetTexCoord ( 0.25 , 0.5 , 0 , 1 )
extraTooltip.bankIcon : SetPoint ( " TOPRIGHT " , - 68 , - 12 )
extraTooltip.bankIcon : SetSize ( 20 , 20 )
extraTooltip.reagentIcon = extraTooltip : CreateTexture ( " " )
extraTooltip.reagentIcon : SetTexture ( " Interface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons " )
extraTooltip.reagentIcon : SetTexCoord ( 0.5 , 0.75 , 0 , 1 )
extraTooltip.reagentIcon : SetPoint ( " TOPRIGHT " , - 20 , - 12 )
extraTooltip.reagentIcon : SetSize ( 20 , 20 )
local function GetLine ( index )
if extraTooltipLines [ index ] then return extraTooltipLines [ index ] end
local line = { }
line.nameString = extraTooltip : CreateFontString ( nil )
line.nameString : SetFontObject ( " SortedFont " )
line.nameString : SetPoint ( " LEFT " , extraTooltip , " TOPLEFT " , 8 , - index * 22 - 22 )
line.bagString = extraTooltip : CreateFontString ( nil )
line.bagString : SetFontObject ( " SortedFont " )
line.bagString : SetPoint ( " CENTER " , extraTooltip.bagIcon , " CENTER " , 0 , - index * 22 )
line.bankString = extraTooltip : CreateFontString ( nil )
line.bankString : SetFontObject ( " SortedFont " )
line.bankString : SetPoint ( " CENTER " , extraTooltip.bankIcon , " CENTER " , 0 , - index * 22 )
line.reagentString = extraTooltip : CreateFontString ( nil )
line.reagentString : SetFontObject ( " SortedFont " )
line.reagentString : SetPoint ( " CENTER " , extraTooltip.reagentIcon , " CENTER " , 0 , - index * 22 )
extraTooltipLines [ index ] = line
return extraTooltipLines [ index ]
end
local textColor = { [ " r " ] = 1 , [ " g " ] = 1 , [ " b " ] = 1 }
local grayedTextColor = { [ " r " ] = 0.6 , [ " g " ] = 0.61 , [ " b " ] = 0.65 }
local extendedTooltipID = 0
local function QueryItemCounts ( i , itemID , GUIDs , tooltipID )
if tooltipID ~= extendedTooltipID then
return
end
local GUID = GUIDs [ 1 ]
local data = Sorted_Data [ GUID ]
local bagCount = 0
for _ , bag in pairs ( S.Utils . ContainersOfType ( S.CONTAINER_TYPES . BAGS ) ) do
for _ , itemData in pairs ( data.containers [ bag ] ) do
if itemData.itemID == itemID and itemData.count then
bagCount = bagCount + itemData.count
end
end
end
local bankCount = 0
for _ , bag in pairs ( S.Utils . ContainersOfType ( S.CONTAINER_TYPES . BANK ) ) do
for _ , itemData in pairs ( data.containers [ bag ] ) do
if itemData.itemID == itemID and itemData.count then
bagCount = bagCount + itemData.count
end
end
end
local reagentCount = 0
if S.WoWVersion ( ) >= 6 and not S.UseNewBank ( ) then
for _ , itemData in pairs ( data.containers [ REAGENTBANK_CONTAINER ] ) do
if itemData.itemID == itemID and itemData.count then
bagCount = bagCount + itemData.count
end
end
end
if bagCount > 0 or bankCount > 0 or reagentCount > 0 then
i = i + 1
extraTooltip : SetHeight ( i * 22 + 40 )
local line = GetLine ( i )
line.nameString : SetText ( S.Utils . FormatFaction ( data.faction ) .. S.Utils . GetClassHexColor ( data.class ) .. data.name )
line.bagString : SetText ( S.Utils . FormatNumber ( bagCount ) )
if bagCount > 0 then line.bagString : SetTextColor ( textColor.r , textColor.g , textColor.b ) else line.bagString : SetTextColor ( grayedTextColor.r , grayedTextColor.g , grayedTextColor.b ) end
line.bankString : SetText ( S.Utils . FormatNumber ( bankCount ) )
if bankCount > 0 then line.bankString : SetTextColor ( textColor.r , textColor.g , textColor.b ) else line.bankString : SetTextColor ( grayedTextColor.r , grayedTextColor.g , grayedTextColor.b ) end
line.nameString : Show ( )
line.bagString : Show ( )
line.bankString : Show ( )
if S.WoWVersion ( ) >= 6 then
line.reagentString : SetText ( S.Utils . FormatNumber ( reagentCount ) )
if reagentCount > 0 then line.reagentString : SetTextColor ( textColor.r , textColor.g , textColor.b ) else line.reagentString : SetTextColor ( grayedTextColor.r , grayedTextColor.g , grayedTextColor.b ) end
line.reagentString : Show ( )
end
--[[local left = Sorted_FormatFaction(data.faction)..Sorted_GetClassColor(data.class):GenerateHexColorMarkup()..data.name
local right
local bagColor , bankColor , reagentColor
if bagCount > 0 then bagColor = textColor else bagColor = grayedTextColor end
if bankCount > 0 then bankColor = textColor else bankColor = grayedTextColor end
if not Sorted_IsClassic ( ) then
if reagentCount > 0 then reagentColor = textColor else reagentColor = grayedTextColor end
right = string.format ( " %s%6d |TInterface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons:20:20:0:0:128:32:0:32:0:32|t %s%6d |TInterface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons:20:20:0:0:128:32:32:64:0:32|t %s%6d |TInterface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons:20:20:0:0:128:32:64:96:0:32|t " , bagColor , bagCount , bankColor , bankCount , reagentColor , reagentCount )
else
right = string.format ( " %s%6d |TInterface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons:20:20:0:0:128:32:0:32:0:32|t %s%6d |TInterface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons:20:20:0:0:128:32:32:64:0:32|t " , bagColor , bagCount , bankColor , bankCount )
end
extraTooltip : AddDoubleLine ( left , right ) ] ]
end
table.remove ( GUIDs , 1 )
if # GUIDs > 0 then
if # GUIDs % 3 == 0 then -- Spread the processing over multiple frames, otherwise it can be slow with many characters. This checks three characters per frame
C_Timer.After ( 0.0001 , function ( ) QueryItemCounts ( i , itemID , GUIDs , tooltipID ) end )
else
QueryItemCounts ( i , itemID , GUIDs , tooltipID )
end
end
end
function S . Tooltip . Extended ( bag , slot )
local self = S.Data . GetItem ( bag , slot )
local i = 0
if self.classID == LE_ITEM_CLASS_BATTLEPET then return end
extraTooltip.reagentIcon : SetTexture ( " Interface \\ Addons \\ Sorted \\ Textures \\ Tooltip-Icons " )
extraTooltip.reagentIcon : SetTexCoord ( 0.5 , 0.75 , 0 , 1 )
extraTooltip.bagIcon : Show ( )
extraTooltip.bankIcon : Show ( )
extraTooltip.reagentIcon : Show ( )
-- Add Sorted's tooltip info
extraTooltip : SetOwner ( GameTooltip , " ANCHOR_BOTTOM " )
extraTooltip : ClearLines ( )
--extraTooltip:AddLine("|TInterface\\Addons\\Sorted\\Textures\\Title:24:96:-6:4|t")
extraTooltip : AddLine ( " " )
for _ , line in pairs ( extraTooltipLines ) do
line.nameString : Hide ( )
line.bagString : Hide ( )
line.bankString : Hide ( )
line.reagentString : Hide ( )
end
extraTooltip : Show ( )
extraTooltip : SetHeight ( 30 )
extraTooltip : SetPoint ( " LEFT " , GameTooltip , " RIGHT " , - 288 , 0 )
extraTooltip : SetPoint ( " RIGHT " , GameTooltip )
local GUIDs = { UnitGUID ( " player " ) }
for GUID , data in pairs ( Sorted_Data ) do
if data.realm == GetRealmName ( ) and GUID ~= UnitGUID ( " player " ) then
table.insert ( GUIDs , GUID )
end
end
extendedTooltipID = extendedTooltipID + 1
C_Timer.After ( 0.0001 , function ( ) QueryItemCounts ( i , self.itemID , GUIDs , extendedTooltipID ) end )
end
function S . Tooltip . ExtendedCurrency ( currency )
extendedTooltipID = extendedTooltipID + 1
extraTooltip.bagIcon : Hide ( )
extraTooltip.bankIcon : Hide ( )
extraTooltip.reagentIcon : SetTexture ( currency.texture )
extraTooltip.reagentIcon : SetTexCoord ( 0 , 1 , 0 , 1 )
extraTooltip.reagentIcon : Show ( )
-- Add Sorted's tooltip info
extraTooltip : SetOwner ( GameTooltip , " ANCHOR_BOTTOM " )
extraTooltip : ClearLines ( )
--extraTooltip:AddLine("|TInterface\\Addons\\Sorted\\Textures\\Title:24:96:-6:4|t")
extraTooltip : AddLine ( " " )
for _ , line in pairs ( extraTooltipLines ) do
line.nameString : Hide ( )
line.bagString : Hide ( )
line.bankString : Hide ( )
line.reagentString : Hide ( )
end
local t = { }
local max = 0
for GUID , data in pairs ( Sorted_Data ) do
if data.realm == GetRealmName ( ) then
if data.currencies [ currency.id ] then
local count = data.currencies [ currency.id ] . count
if count > max then
max = count
end
table.insert ( t , { data , count } )
end
end
end
table.sort ( t , function ( a , b ) return a [ 2 ] > b [ 2 ] end )
for i = 1 , # t do
local line = GetLine ( i )
local data = t [ i ] [ 1 ]
line.nameString : SetText ( S.Utils . FormatFaction ( data.faction ) .. S.Utils . GetClassHexColor ( data.class ) .. data.name )
line.reagentString : SetText ( S.Utils . FormatNumber ( t [ i ] [ 2 ] ) )
line.nameString : Show ( )
line.reagentString : Show ( )
local color = ( t [ i ] [ 2 ] / max ) * 0.5 + 0.5
line.reagentString : SetTextColor (
textColor.r * color + grayedTextColor.r * ( 1 - color ) ,
textColor.g * color + grayedTextColor.g * ( 1 - color ) ,
textColor.b * color + grayedTextColor.b * ( 1 - color )
)
end
extraTooltip : Show ( )
local width = GameTooltip : GetWidth ( )
if width < 256 then
GameTooltip : SetWidth ( 256 )
width = 256
end
extraTooltip : SetPoint ( " LEFT " , GameTooltip , " RIGHT " , - 200 , 0 )
extraTooltip : SetPoint ( " RIGHT " , GameTooltip )
extraTooltip : SetHeight ( # t * 22 + 40 )
end
GameTooltip : HookScript ( " OnShow " , function ( self ) extraTooltip : Hide ( ) end )