vanilla-wow-addons – Rev 1
?pathlinks?
--[[
-- Name: TinyTip
-- Author: Thrae of Maelstrom (aka "Matthew Carras")
-- Release Date: 6-25-06
--
-- This file handles the position and anchoring of the
-- tooltip. If you don't care about these options, then
-- this file can safely removed from the TOC.
--]]
local _G = getfenv(0)
local UIParent,GameTooltip = _G.UIParent, _G.GameTooltip
local gtClearPts, gtSetOwner, gtSetPt = GameTooltip.ClearAllPoints, GameTooltip.SetOwner, GameTooltip.SetPoint
local tClearPts, tSetOwner, tSetPt = gtClearPts, gtSetOwner, gtSetPt
local fSetScript, fGetScale, fGetAlpha, fGetCenter, fGetLeft, fGetRight, fGetTop, fGetBottom, fGetWidth, fGetHeight = UIParent.SetScript, UIParent.GetScale, UIParent.GetAlpha, UIParent.GetCenter, UIParent.GetLeft, UIParent.GetRight, UIParent.GetTop, UIParent.GetBottom, UIParent.GetWidth, UIParent.GetHeight
local db,EventFrame
local acehook
local unitMouseover
_G.TinyTipAnchorExists = true
function TinyTipAnchor_ResetReferences(ClearPts, SetPt, SetOwner)
tClearPts, tSetPt, tSetOwner = ClearPts, SetPt, SetOwner
end
-- blatantly stolen from PerfecEventFrame by cladhaire!
-- Used for UAnchor == "STICKY"
local function SmartSetOwner(owner, setX, setY, tooltip)
if (not owner) then owner = UIParent end
if (not tooltip) then tooltip = this end
if (not setX) then setX = 0 end
if (not setY) then setY = 0 end
local x,y = fGetCenter(owner)
local left = fGetLeft(owner)
local right = fGetRight(owner)
local top = fGetTop(owner)
local bottom = fGetBottom(owner)
local screenWidth = _G.GetScreenWidth()
local screenHeight = _G.GetScreenHeight()
local scale = fGetScale(owner)
if (x~=nil and y~=nil and left~=nil and
right~=nil and top~=nil and bottom~=nil
and screenWidth>0 and screenHeight>0) then
setX = setX * scale
setY = setY * scale
x = x * scale
y = y * scale
left = left * scale
right = right * scale
width = right - left
top = top * scale
bottom = bottom * scale
local anchorPoint
if (y <= (screenHeight * (1/2))) then
top = top + setY
anchorPoint = "TOP"
if (top < 0) then
setY = setY - top
end
else
setY = -setY
bottom = bottom + setY
anchorPoint = "BOTTOM"
if (bottom > screenHeight) then
setY = setY + (screenHeight - bottom)
end
end
if (x <= (screenWidth * (1/2))) then
left = left + setX
if (anchorPoint == "BOTTOM") then
anchorPoint = anchorPoint.."RIGHT"
setX = setX - width
if (left < 0) then
setX = setX - left
end
else
anchorPoint = anchorPoint.."LEFT"
if (left < 0) then
setX = setX - left
end
end
else
setX = -setX
right = right + setX
if (anchorPoint == "BOTTOM") then
anchorPoint = anchorPoint.."LEFT"
setX = setX + width
if (right > screenWidth) then
setX = setX - (right - screenWidth)
end
else
anchorPoint = anchorPoint.."RIGHT"
if (right > screenWidth) then
setX = setX + (screenWidth - right)
end
end
end
scale = fGetScale(tooltip)
if (scale) then
setX = setX / scale
setY = setY / scale
end
tClearPts(tooltip)
tSetOwner(tooltip, owner, "ANCHOR_"..anchorPoint, setX, setY)
end
end
-- Used to stick GameTooltip to the cursor with offsets.
local x,y,uiscale, tscale,utooltip
local getcpos = _G.GetCursorPosition
local function OnUpdate()
if unitMouseover and not _G.UnitExists("mouseover") then
if db["Fade"] ~= 1 or fGetAlpha(GameTooltip) < 0.1 then
if this.tooltip == _G.TinyTipExtras_Tooltip then this.tooltip:Hide() end
fSetScript(this, "OnUpdate", nil)
return
end
end
x,y = getcpos()
utooltip = this.tooltip
uiscale,tscale = fGetScale(UIParent), fGetScale(utooltip)
x,y = (x + (utooltip.OffX or 0)) / uiscale / tscale, (y + (utooltip.OffY or 0)) / uiscale / tscale
tClearPts(utooltip)
tSetPt(utooltip, "BOTTOM", UIParent, "BOTTOMLEFT", x, y)
end
function TinyTipAnchor_AlwaysAnchor()
tClearPts(GameTooltip)
tSetPt(GameTooltip, db["FAnchor"] or "BOTTOMRIGHT", UIParent, db["FAnchor"] or "BOTTOMRIGHT", (db["FOffX"] or 0) - ((not db["FAnchor"] and (_G.CONTAINER_OFFSET_X - 13)) or 0), (db["FOffY"] or 0) + ((not db["FAnchor"] and _G.CONTAINER_OFFSET_Y) or 0))
end
_G.TinyTipAnchor_Original_GameTooltip_SetDefaultAnchor = nil
function TinyTipAnchor_SetDefaultAnchor(tooltip,owner,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10)
tooltip.owner = owner
if _G.TinyTipAnchor_Original_GameTooltip_SetDefaultAnchor and tooltip ~= _G.TinyTipExtras_Tooltip then
_G.TinyTipAnchor_Original_GameTooltip_SetDefaultAnchor(tooltip,owner,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10)
end
if db and EventFrame and (db["AnchorAll"] or (tooltip == GameTooltip or tooltip == _G.TinyTipExtras_Tooltip) ) then
if db["Fade"] == 2 then
fSetScript(EventFrame, "OnUpdate", _G.TinyTip_SlimOnUpdate)
else
fSetScript(EventFrame, "OnUpdate", nil)
end
if tooltip == _G.TinyTipExtras_Tooltip then
if db["ETAnchor"] or db["ETOffX"] or db["ETOffY"] then
gtClearPts(GameTooltip)
gtSetPt(GameTooltip, db["ETAnchor"] or "BOTTOMRIGHT", UIParent, db["ETAnchor"] or "BOTTOMRIGHT", (db["ETOffX"] or 0) - _G.CONTAINER_OFFSET_X - 13, (db["ETOffY"] or 0) + _G.CONTAINER_OFFSET_Y)
end
tClearPts(tooltip)
tSetPt(tooltip, "RIGHT", GameTooltip, "LEFT", -5 / fGetScale(UIParent) , 0 )
end
if owner ~= UIParent then
if db["FAnchor"] or db["FOffX"] or db["FOffY"] then
if db["FAnchor"] == "CURSOR" then
if db["Fade"] ~= 1 and not db["ExtraTooltip"] then
tSetOwner(tooltip, owner, "ANCHOR_CURSOR")
else
tSetOwner(tooltip, owner, "ANCHOR_NONE")
end
if db["FOffX"] or db["FOffY"] or db["Fade"] == 1 or db["ExtraTooltip"] then
tooltip.OffX, tooltip.OffY,unitMouseover = db["FOffX"] or 0, db["FOffY"] or 0, nil
fSetScript(EventFrame, "OnUpdate", OnUpdate)
end
elseif db["FAnchor"] == "STICKY" then
SmartSetOwner(owner, db["FOffX"], db["FOffY"], tooltip)
else
tSetOwner(tooltip, owner, "ANCHOR_NONE")
tClearPts(tooltip)
tSetPt(tooltip, db["FAnchor"] or "BOTTOMRIGHT", UIParent, db["FAnchor"] or "BOTTOMRIGHT", (db["FOffX"] or 0) - ((not db["FAnchor"] and (_G.CONTAINER_OFFSET_X - 13)) or 0), (db["FOffY"] or 0) + ((not db["FAnchor"] and _G.CONTAINER_OFFSET_Y) or 0))
end
end
else
if tooltip == GameTooltip and db["ExtraTooltip"] then return end
if db["MAnchor"] ~= "GAMEDEFAULT" or db["MOffX"] or db["MOffY"] then
if not db["MAnchor"] then
if db["Fade"] ~= 1 and not db["ExtraTooltip"] then
tSetOwner(tooltip, owner, "ANCHOR_CURSOR")
else
tSetOwner(tooltip, owner, "ANCHOR_NONE")
end
if db["MOffX"] or db["MOffY"] or db["Fade"] == 1 or db["ExtraTooltip"] then
tooltip.OffX, tooltip.OffY,unitMouseover = db["MOffX"] or 0, db["MOffY"] or 0, true
fSetScript(EventFrame, "OnUpdate", OnUpdate)
end
else
tSetOwner(tooltip, owner, "ANCHOR_NONE")
tClearPts(tooltip)
tSetPt(tooltip,
(db["MAnchor"] ~= "GAMEDEFAULT" and db["MAnchor"]) or "BOTTOMRIGHT",
UIParent,
(db["MAnchor"] ~= "GAMEDEFAULT" and db["MAnchor"]) or "BOTTOMRIGHT",
(db["MOffX"] or 0) - ((db["MAnchor"] == "GAMEDEFAULT" and (_G.CONTAINER_OFFSET_X - 13)) or 0),
(db["MOffY"] or 0) + ((db["MAnchor"] == "GAMEDEFAULT" and _G.CONTAINER_OFFSET_Y) or 0))
end
end
end
end
end
function TinyTipAnchor_Hook(_acehook)
acehook = _acehook
if acehook and not acehook:IsHooked("GameTooltip_SetDefaultAnchor") then
acehook:Hook("GameTooltip_SetDefaultAnchor", _G.TinyTipAnchor_SetDefaultAnchor)
_G.TinyTipAnchor_Original_GameTooltip_SetDefaultAnchor = acehook.hooks["GameTooltip_SetDefaultAnchor"].orig
end
end
function TinyTipAnchor_SetLocals(_db, _EventFrame,_acehook)
db, EventFrame,acehook = _db,_EventFrame,_acehook
TinyTipAnchor_SetLocals = nil
end