389 lines
12 KiB
Lua
389 lines
12 KiB
Lua
--[[
|
|
Norganna's Tooltip Helper class
|
|
Version: 1.0
|
|
Revision: $Id$
|
|
URL: http://norganna.org/tthelp
|
|
|
|
This is a slide-in helper class for the Norganna's AddOns family of AddOns
|
|
It is designed to work with the LibExtraTip tooltip library and provide additional
|
|
information that is useful for the Auctioneer et al AddOns.
|
|
|
|
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 source code is specifically designed to work with World of Warcraft's
|
|
interpreted AddOn system.
|
|
You have an implicit licence to use this code with these facilities
|
|
since that is its designated purpose as per:
|
|
http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat
|
|
|
|
If you copy this code, please rename it to your own tastes, as this file is
|
|
liable to change without notice and could possibly destroy any code that relies
|
|
on it staying the same.
|
|
We will attempt to avoid this happening where possible (of course).
|
|
]]
|
|
|
|
local MAJOR,MINOR,REVISION = "nTipHelper", 1, 1
|
|
|
|
--[[-----------------------------------------------------------------
|
|
|
|
LibStub is a simple versioning stub meant for use in Libraries.
|
|
See <http://www.wowwiki.com/LibStub> for more info.
|
|
LibStub is hereby placed in the Public Domain.
|
|
Credits:
|
|
Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
|
|
|
|
--]]-----------------------------------------------------------------
|
|
do
|
|
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2
|
|
local LibStub = _G[LIBSTUB_MAJOR]
|
|
|
|
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
|
LibStub = LibStub or {libs = {}, minors = {} }
|
|
_G[LIBSTUB_MAJOR] = LibStub
|
|
LibStub.minor = LIBSTUB_MINOR
|
|
|
|
function LibStub:NewLibrary(major, minor)
|
|
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
|
|
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
|
|
|
|
local oldminor = self.minors[major]
|
|
if oldminor and oldminor >= minor then return nil end
|
|
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
|
|
return self.libs[major], oldminor
|
|
end
|
|
|
|
function LibStub:GetLibrary(major, silent)
|
|
if not self.libs[major] and not silent then
|
|
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
|
|
end
|
|
return self.libs[major], self.minors[major]
|
|
end
|
|
|
|
function LibStub:IterateLibraries() return pairs(self.libs) end
|
|
setmetatable(LibStub, { __call = LibStub.GetLibrary })
|
|
end
|
|
end
|
|
--[End of LibStub]---------------------------------------------------
|
|
|
|
local LIBSTRING = MAJOR..":"..MINOR
|
|
local lib = LibStub:NewLibrary(LIBSTRING,REVISION)
|
|
if not lib then return end
|
|
|
|
local type = type
|
|
local gsub = gsub
|
|
|
|
do -- tooltip class definition
|
|
local libTT = LibStub("LibExtraTip-1")
|
|
local MoneyViewClass = LibStub("LibMoneyFrame-1")
|
|
|
|
local curFrame = nil
|
|
local asText = false
|
|
local defaultR = 0.7
|
|
local defaultG = 0.7
|
|
local defaultB = 0.7
|
|
local defaultEmbed = false
|
|
local itemData
|
|
|
|
local activated = false
|
|
local inLayout = false
|
|
|
|
local GOLD="ffd100"
|
|
local SILVER="e6e6e6"
|
|
local COPPER="c8602c"
|
|
|
|
local GSC_3 = "|cff%s%d|cff000000.|cff%s%02d|cff000000.|cff%s%02d|r"
|
|
local GSC_2 = "|cff%s%d|cff000000.|cff%s%02d|r"
|
|
local GSC_1 = "|cff%s%d|r"
|
|
|
|
local iconpath = "Interface\\MoneyFrame\\UI-"
|
|
local goldicon = "%d|T"..iconpath.."GoldIcon:0|t"
|
|
local silvericon = "%s|T"..iconpath.."SilverIcon:0|t"
|
|
local coppericon = "%s|T"..iconpath.."CopperIcon:0|t"
|
|
|
|
|
|
local function coins(money, graphic)
|
|
money = math.floor(tonumber(money) or 0)
|
|
local g = math.floor(money / 10000)
|
|
local s = math.floor(money % 10000 / 100)
|
|
local c = money % 100
|
|
|
|
if not graphic then
|
|
if g > 0 then
|
|
return GSC_3:format(GOLD, g, SILVER, s, COPPER, c)
|
|
elseif s > 0 then
|
|
return GSC_2:format(SILVER, s, COPPER, c)
|
|
else
|
|
return GSC_1:format(COPPER, c)
|
|
end
|
|
else
|
|
if g > 0 then
|
|
return goldicon:format(g)..silvericon:format("%02d"):format(s)..coppericon:format("%02d"):format(c)
|
|
elseif s > 0 then
|
|
return silvericon:format("%d"):format(s)..coppericon:format("%02d"):format(c)
|
|
else
|
|
return coppericon:format("%d"):format(c)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function breakHyperlink(match, matchlen, ...)
|
|
local v
|
|
local n = select("#", ...)
|
|
for i = 2, n do
|
|
v = select(i, ...)
|
|
if (v:sub(1,matchlen) == match) then
|
|
return strsplit(":", v:sub(2))
|
|
end
|
|
end
|
|
end
|
|
|
|
function lib:BreakHyperlink(...)
|
|
return breakHyperlink(...)
|
|
end
|
|
|
|
function lib:GetFactor(suffix, seed)
|
|
if (suffix < 0 and seed) then
|
|
return bit.band(seed, 65535)
|
|
end
|
|
return 0
|
|
end
|
|
|
|
local lastSaneLink, lastSanitized
|
|
function lib:SanitizeLink(link)
|
|
if not link then
|
|
return
|
|
end
|
|
if lastSanitized == link or lastSaneLink == link then
|
|
return lastSaneLink
|
|
end
|
|
if type(link) == "number" then
|
|
local _, tlink = GetItemInfo(link)
|
|
link = tlink
|
|
end
|
|
if type(link) ~= "string" then
|
|
return
|
|
end
|
|
local newlink, test = gsub(link, "(|Hitem:[^:]+:[^:]+:[^:]+:[^:]+:[^:]+:[^:]+:[^:]+:[^:]+):%d+([|:][^h]*h)", "%1:80%2")
|
|
lastSaneLink = newlink
|
|
lastSanitized = link
|
|
return lastSaneLink
|
|
end
|
|
|
|
function lib:DecodeLink(link, info)
|
|
local lType,id,enchant,gem1,gem2,gem3,gemBonus,suffix,seed,factor
|
|
local vartype = type(link)
|
|
if (vartype == "string") then
|
|
lType,id,enchant,gem1,gem2,gem3,gemBonus,suffix,seed = breakHyperlink("Hitem:", 6, strsplit("|", link))
|
|
if (lType ~= "item") then return end
|
|
id = tonumber(id) or 0
|
|
enchant = tonumber(enchant) or 0
|
|
suffix = tonumber(suffix) or 0
|
|
seed = tonumber(seed) or 0
|
|
factor = lib:GetFactor(suffix, seed)
|
|
elseif (vartype == "number") then
|
|
lType,id, suffix,factor,enchant,seed, gem1,gem2,gem3,gemBonus =
|
|
"item",link, 0,0,0,0, 0,0,0,0
|
|
end
|
|
if info and type(info) == "table" then
|
|
info.itemLink = link
|
|
info.itemType = lType
|
|
info.itemId = id
|
|
info.itemSuffix = suffix
|
|
info.itemFactor = factor
|
|
info.itemEnchant = enchant
|
|
info.itemSeed = seed
|
|
info.itemGem1 = gem1
|
|
info.itemGem2 = gem2
|
|
info.itemGem3 = gem3
|
|
info.itemGemBonus = gemBonus
|
|
end
|
|
return lType,id,suffix,factor,enchant,seed,gem1,gem2,gem3,gemBonus
|
|
end
|
|
|
|
function lib:GetLinkQuality(link)
|
|
if not link or type(link) ~= "string" then return end
|
|
local color = link:match("(|c%x+)|Hitem:")
|
|
if color then
|
|
local _, hex
|
|
for i = 0, 6 do
|
|
_,_,_, hex = GetItemQualityColor(i)
|
|
if color == hex then return i end
|
|
end
|
|
end
|
|
return -1
|
|
end
|
|
|
|
-- Call the given frame's SetHyperlink call
|
|
function lib:ShowItemLink(frame, link, count, additional)
|
|
libTT:SetHyperlinkAndCount(frame, link, count, additional)
|
|
end
|
|
|
|
-- Activation function. All client addons should call this when they get ADDON_LOADED
|
|
function lib:Activate()
|
|
if activated then return end
|
|
libTT:RegisterTooltip(GameTooltip)
|
|
libTT:RegisterTooltip(ItemRefTooltip)
|
|
activated = true
|
|
end
|
|
|
|
-- Allow client addon to add their callback
|
|
function lib:AddCallback(callback, priority)
|
|
self:Activate() -- We should be activated by now, but make sure.
|
|
libTT:AddCallback(callback, priority)
|
|
end
|
|
|
|
-- Accessor functions for the current frame that the tooltip is affecting
|
|
function lib:SetFrame(frame)
|
|
assert(libTT:IsRegistered(frame), "Error, frame is not registered with LibExtraTip in nTipHelper:SetFrame()")
|
|
|
|
curFrame = frame
|
|
inLayout = true
|
|
end
|
|
function lib:GetFrame()
|
|
return curFrame
|
|
end
|
|
-- Try to Clear the frame after you've finished using it, this will stop stray reuse
|
|
-- of the tooltip other than at the proper layout time.
|
|
function lib:ClearFrame(tip)
|
|
assert(tip == curFrame, "Error, frame is not the current frame in nTipHelper:ClearFrame()")
|
|
curFrame = nil
|
|
inLayout = false
|
|
end
|
|
|
|
-- Accessor functions for the data the tooltip contains
|
|
function lib:SetData(data)
|
|
itemData = data
|
|
end
|
|
function lib:GetData()
|
|
return itemData
|
|
end
|
|
|
|
-- Sets the color that the tooltip will use from now on.
|
|
-- (resets to default color between calls to modules)
|
|
function lib:SetColor(r, g, b)
|
|
defaultR = r
|
|
defaultG = g
|
|
defaultB = b
|
|
end
|
|
|
|
-- Sets the embed mode that the tooltip will use from now on.
|
|
-- (resets to default mode between calls to modules)
|
|
function lib:SetEmbed(embed)
|
|
defaultEmbed = embed
|
|
end
|
|
|
|
-- Sets the money mode that the tooltip will use from now on.
|
|
-- (resets to default mode between calls to modules)
|
|
function lib:SetMoneyAsText(text)
|
|
asText = text
|
|
end
|
|
|
|
-- Gets money as colorized text
|
|
function lib:Coins(amount, graphic)
|
|
return coins(amount, graphic)
|
|
end
|
|
|
|
--[[
|
|
Adds a line of text to the tooltip.
|
|
|
|
Supported calling formats:
|
|
lib:AddLine(text, [rightText | amount], [red, green, blue], [embed])
|
|
]]
|
|
function lib:AddLine(...)
|
|
assert(inLayout, "Error, no tooltip to add line to in nTipHelper:AddLine()")
|
|
|
|
local left, right, amount, red,green,blue, embed
|
|
local numArgs = select("#", ...)
|
|
local left = ...
|
|
left = tostring(left)
|
|
|
|
if numArgs > 1 then
|
|
-- Check if the last arg is a boolean
|
|
local lastArg = select(numArgs, ...)
|
|
if type(lastArg) == "boolean" then
|
|
-- Strip it off
|
|
embed = lastArg
|
|
numArgs = numArgs - 1
|
|
end
|
|
end
|
|
|
|
if numArgs > 3 then
|
|
-- Possible that the last 3 numbers are colors
|
|
local r,g,b = select(numArgs-2, ...)
|
|
|
|
if type(r)=="number" and type(g)=="number" and type(b)=="number" then
|
|
if r>=0 and r<=1 and g>=0 and g<=1 and b>=0 and b<=1 then
|
|
-- Assumption is that these are colors
|
|
red,green,blue = r,g,b
|
|
numArgs = numArgs - 3
|
|
end
|
|
end
|
|
end
|
|
|
|
if numArgs > 1 then
|
|
-- There's a second parameter, if it's a number, it's a money amount
|
|
-- otherwise it's the right-aligned text.
|
|
local secondArg = select(2, ...)
|
|
if type(secondArg) == "number" then
|
|
if asText then
|
|
right = coins(secondArg)
|
|
else
|
|
amount = secondArg
|
|
end
|
|
elseif right ~= nil then
|
|
right = tostring(secondArg)
|
|
end
|
|
end
|
|
|
|
red = tonumber(red)
|
|
green = tonumber(green)
|
|
blue = tonumber(blue)
|
|
|
|
if red == nil or green == nil or blue == nil then
|
|
-- Not all colors supplied
|
|
red,green,blue = defaultR,defaultG,defaultB
|
|
end
|
|
if embed == nil then
|
|
embed = defaultEmbed
|
|
end
|
|
left = left:gsub("{{", "|cffddeeff"):gsub("}}", "|r")
|
|
if amount then
|
|
libTT:AddMoneyLine(curFrame, left, amount, red, green, blue, embed)
|
|
elseif right then
|
|
libTT:AddDoubleLine(curFrame, left, right, red, green, blue, embed)
|
|
else
|
|
libTT:AddLine(curFrame, left, red, green, blue, embed)
|
|
end
|
|
end
|
|
|
|
-- Return the extra information from this tooltip
|
|
function lib:GetExtra()
|
|
assert(inLayout, "Error, no tooltip to get extra info in nTipHelper:Extra()")
|
|
return libTT:GetTooltipAdditional(curFrame)
|
|
end
|
|
|
|
function lib:CreateMoney(high, wide, red,green,blue)
|
|
local m = MoneyViewClass:new(high, wide, red,green,blue);
|
|
return m
|
|
end
|
|
|
|
end -- tooltip class definition
|
|
|
|
function _debug(link)
|
|
print(gsub(link, "|", "||"))
|
|
print(gsub(AucAdvanced.SanitizeLink(link), "|", "||"))
|
|
end
|