From 4b7db0f43877298c83668034106c83b680eecf2c Mon Sep 17 00:00:00 2001 From: Scott Sibley Date: Mon, 4 Jul 2011 06:56:47 +0000 Subject: [PATCH] The Position module has a new setting, "Position UI Tooltip." Here you can choose to place the default Unit tooltip next to the fake libqtip tooltip, choosing top, bottom, left, right, or position it offscreen. Positioning it offscreen as opposed to just hiding it keeps the GameTooltip valid for the unit. Otherwise if hide it then GameTooltip:GetUnit() returns nothing, which breaks other addons. This is one of the main reasons the switch to libqtip was warranted. Once you hide or otherwise trash the GameTooltip, then it's left disfunctional. Allowing the user to position the default tooltip alongside the fake tooltip will allow players to use StarTip along with other addons that otherwise modify the default tooltip, such as MyRolePlay. --- Modules/Position/Position.lua | 122 +++++++++++++++++++++++++++++------------ StarTip.lua | 6 +- 2 files changed, 90 insertions(+), 38 deletions(-) diff --git a/Modules/Position/Position.lua b/Modules/Position/Position.lua index dacb464..2ec28ac 100644 --- a/Modules/Position/Position.lua +++ b/Modules/Position/Position.lua @@ -8,6 +8,10 @@ local UIParent = _G.UIParent local self = mod local L = StarTip.L +local square = {L["Left"], L["Right"], L["Top"], L["Bottom"], L["Offscreen"]} +local squareDict = {[L["Left"]] = 1, [L["Right"]] = 2, [L["Top"]] = 3, [L["Bottom"]] = 4, [L["Offscreen"]] = 5} +local squareNames = {"LEFT", "RIGHT", "TOP", "BOTTOM"} + local defaults = { profile = { inCombat = 1, @@ -21,7 +25,9 @@ local defaults = { unitFramesXOffset = 10, unitFramesYOffset = 0, otherXOffset = 10, - otherYOffset = 0 + otherYOffset = 0, + defaultUnitTooltipPos = 5 + } } @@ -281,7 +287,7 @@ local options = { return val >= minY and val <= maxY end, order = 18 - } + }, --[[otherXOffset = { name = "X-axis offset", desc = "The x-axis offset used to position the tooltip in relationship to the anchor point", @@ -306,6 +312,16 @@ local options = { set = set, order = 18 }]] + defaultUnitTooltipPos = { + name = "Position UI Tooltip", + type = "select", + values = square, + get = function() return mod.db.profile.defaultUnitTooltipPos end, + set = function(info, val) + mod.db.profile.defaultUnitTooltipPos = val + end, + order = 20 + } } function mod:OnInitialize() @@ -348,56 +364,85 @@ local getIndex = function(owner) return index end -local isSpell -local isItem -local lastSpell +local isTrouble +local isUnitTooltip local updateFrame = CreateFrame("Frame") local fakeUpdateFrame = CreateFrame("Frame") -local oldX, oldY = -1, -1 local currentAnchor = "BOTTOM" local xoffset, yoffset = 0, 0 local active local positionTooltip = function() - if not active or isSpell or isItem then return end - + if isTrouble or not active then return end local x, y = GetCursorPosition() local effScale = GameTooltip:GetEffectiveScale() - if x ~= oldX or y ~= oldY then + if not isUnitTooltip then GameTooltip:ClearAllPoints() GameTooltip:SetPoint(currentAnchor, UIParent, "BOTTOMLEFT", (x + xoffset) / effScale, (y + yoffset) / effScale + 5) end - oldX, oldY = x, y + + if isUnitTooltip then + if mod.db.profile.defaultUnitTooltipPos == 5 then + + GameTooltip:ClearAllPoints() + GameTooltip:SetClampRectInsets(10000, 0, 0, 0) + GameTooltip:SetPoint("RIGHT", UIParent, "LEFT") + else + local pos = squareNames[self.db.profile.defaultUnitTooltipPos] + GameTooltip:ClearAllPoints() + GameTooltip:SetPoint(StarTip.opposites[pos], StarTip.tooltipMain, pos) + end + end + end local oldX, oldY local positionMainTooltip = function() + local x, y = GetCursorPosition() + if oldX == x and oldY == y then return end + oldX, oldY = x, y + local index = getIndex(UIParent) local currentAnchor = StarTip.opposites[StarTip.anchors[index]:sub(8)] - local x, y = GetCursorPosition() local tooltip = StarTip.tooltipMain local effScale = tooltip:GetEffectiveScale() local height = tooltip:GetHeight() or 0 local width = tooltip:GetWidth() or 0 + local realHeight = GameTooltip:GetHeight() + local realWidth = GameTooltip:GetWidth() local screenWidth = UIParent:GetWidth() * effScale local screenHeight = UIParent:GetHeight() * effScale + local realHeight = GameTooltip:GetHeight() + local realWidth = GameTooltip:GetWidth() local myOffsetX, myOffsetY = 0, 0 + local leftBottomOffset = 0 + + if mod.db.profile.defaultUnitTooltipPos == 1 then -- left + leftBottomOffset = realWidth + elseif mod.db.profile.defaultUnitTooltipPos == 2 then -- right + screenWidth = screenWidth - realWidth + elseif mod.db.profile.defaultUnitTooltipPos == 3 then -- top + screenHeight = screenHeight - realHeight + elseif mod.db.profile.defaultUnitTooltipPos == 4 then -- bottom + leftBottomOffset = realHeight + end if x + width / 2 + xoffset > screenWidth then myOffsetX = (screenWidth - (x + width / 2 + xoffset)) * effScale end if y + height + yoffset > screenHeight then myOffsetY = (screenHeight - (y + height + yoffset) + 1) * effScale end - if x - width / 2 < 0 then - myOffsetX = (x - width / 2 + 1) * -1 * effScale + if x - width / 2 - leftBottomOffset < 0 then + myOffsetX = (x - width / 2 - leftBottomOffset + 2) * -1 * effScale end - if x ~= oldX or y ~= oldY then - tooltip:ClearAllPoints() - tooltip:SetPoint(currentAnchor, UIParent, "BOTTOMLEFT", - (x + xoffset + myOffsetX) / effScale, (y + yoffset + myOffsetY) / effScale + 5) + if y - height - leftBottomOffset < 0 then + myOffsetY = (y - height - leftBottomOffset + 2) * effScale end + tooltip:ClearAllPoints() + tooltip:SetPoint(currentAnchor, UIParent, "BOTTOMLEFT", + (x + xoffset + myOffsetX) / effScale, (y + yoffset + myOffsetY) / effScale + 5) end @@ -426,6 +471,7 @@ local setOffsets = function(owner) end end +local locked = false local currentOwner local currentThis local delayFrame = CreateFrame("Frame") @@ -443,11 +489,18 @@ local function delayAnchor() elseif StarTip.anchors[index]:find("^CURSOR_") then oldX, oldY = 0, 0 currentAnchor = StarTip.opposites[StarTip.anchors[index]:sub(8)] - updateFrame:SetScript("OnUpdate", positionTooltip) - fakeUpdateFrame:SetScript("OnUPdate", positionMainTooltip) + isUnitTooltip = false + if GameTooltip:GetUnit() then + isUnitTooltip = true + end active = true + if isUnitTooltip then + updateFrame:SetScript("OnUpdate", positionTooltip) + fakeUpdateFrame:SetScript("OnUPdate", positionMainTooltip) + positionMainTooltip() + end positionTooltip() - positionMainTooltip() + else if updateFrame:GetScript("OnUpdate") then updateFrame:SetScript("OnUpdate", nil) end this:SetPoint(StarTip.anchors[index], UIParent, StarTip.anchors[index], xoffset, yoffset) @@ -468,31 +521,29 @@ end mod.REGEN_ENABLED = mod.REGEN_DISABLED -local locked = false function mod:OnHide() updateFrame:SetScript("OnUpdate", nil) delayFrame:SetScript("OnUpdate", nil) - oldSpell = nil - newSpell = nil + isTrouble = false locked = false end -local threshold = .3 +local threshold = 1 local lastTime = GetTime() function mod:SetSpell() +--[[ if locked then return end if GetTime() - lastTime < threshold then locked = true end lastTime = GetTime() - +]] local index = getIndex(currentOwner) if StarTip.anchors[index]:find("^CURSOR_") then - isSpell = false - isItem = false updateFrame:SetScript("OnUpdate", nil) + isTrouble = false positionTooltip() - isSpell = true + isTrouble = true else GameTooltip:ClearAllPoints() GameTooltip:SetPoint(StarTip.anchors[index], UIParent, StarTip.anchors[index], xoffset, yoffset) @@ -501,18 +552,19 @@ function mod:SetSpell() end function mod:SetItem() +--[[ if locked then return end if GetTime() - lastTime < threshold then locked = true end lastTime = GetTime() +]] local index = getIndex(currentOwner) if StarTip.anchors[index]:find("^CURSOR_") then - isSpell = false - isItem = false updateFrame:SetScript("OnUpdate", nil) + isTrouble = false positionTooltip() - isItem = true + isTrouble = true else GameTooltip:ClearAllPoints() GameTooltip:SetPoint(StarTip.anchors[index], UIParent, StarTip.anchors[index], xoffset, yoffset) @@ -521,8 +573,8 @@ function mod:SetItem() end function mod:SetUnit() - isSpell = false - isItem = false - updateFrame:SetScript("OnUpdate", positionTooltip) - fakeUpdateFrame:SetScript("OnUpdate", positionMainTooltip) + isTrouble = false + --updateFrame:SetScript("OnUpdate", positionTooltip) + --fakeUpdateFrame:SetScript("OnUpdate", positionMainTooltip) end + diff --git a/StarTip.lua b/StarTip.lua index d06a9df..932e6d0 100644 --- a/StarTip.lua +++ b/StarTip.lua @@ -515,7 +515,7 @@ function StarTip:OnEnable() self:RawHook(GameTooltip, "FadeOut", "GameTooltipFadeOut", true) self:RawHook(GameTooltip, "Hide", "GameTooltipHide", true) self:RawHook(GameTooltip, "Show", "GameTooltipShow", true) - self:RawHook(GameTooltip, "GetUnit", "GameTooltipGetUnit", true) + --self:RawHook(GameTooltip, "GetUnit", "GameTooltipGetUnit", true) for k,v in self:IterateModules() do if (self.db.profile.modules[k] == nil and not v.defaultOff) or self.db.profile.modules[k] then @@ -703,7 +703,6 @@ function StarTip.OnTooltipSetUnit(...) end StarTip.justSetUnit = nil --checkTooltipAlphaFrame:SetScript("OnUpdate", checkTooltipAlpha) - GameTooltip:Hide() StarTip.tooltipMain:Show() end @@ -823,6 +822,7 @@ function StarTip:GameTooltipShow(...) end end +--[[ function StarTip:GameTooltipGetUnit() local name, unit = self.hooks[GameTooltip].GetUnit(GameTooltip) if name then @@ -833,7 +833,7 @@ function StarTip:GameTooltipGetUnit() return name, StarTip.unit end end - +]] function StarTip.OnTooltipShow(...) -- 1.7.9.5