vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
-- 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