From 43cd1db8d2878454b906718b8725afb725391954 Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Sat, 5 Sep 2026 20:59:12 +0200 Subject: [PATCH] fix: keep Guda comparison tooltips on screen --- UI/TooltipPositionFix.lua | 110 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 UI/TooltipPositionFix.lua diff --git a/UI/TooltipPositionFix.lua b/UI/TooltipPositionFix.lua new file mode 100644 index 0000000..cadf657 --- /dev/null +++ b/UI/TooltipPositionFix.lua @@ -0,0 +1,110 @@ +-- Guda item/comparison tooltip positioning fix. +-- Keeps Guda item tooltips toward the inside of the screen so comparison +-- tooltips have room to render with pfUI/DFUI and the ClassicAPI tooltip code. + +local addon = Guda +if not addon or not Guda_ItemButton_OnEnter then return end + +local originalOnEnter = Guda_ItemButton_OnEnter + +local function IsCursorAnchored() + if GameTooltip and GameTooltip.GetAnchorType then + return GameTooltip:GetAnchorType() == "ANCHOR_CURSOR" + end + + -- Compatibility with pfUI versions that expose cursor positioning only + -- through their configuration table. + if pfUI and pfUI.env and pfUI.env.C and pfUI.env.C.tooltip then + return pfUI.env.C.tooltip.position == "cursor" + end + + return false +end + +local function PositionMainTooltip(button) + if not button or not GameTooltip or not GameTooltip:IsShown() then return end + if IsCursorAnchored() then return end + + local centerX = button.GetCenter and button:GetCenter() + local screenWidth = UIParent and UIParent.GetWidth and UIParent:GetWidth() + if not centerX or not screenWidth or screenWidth <= 0 then return end + + GameTooltip:ClearAllPoints() + + if centerX < (screenWidth / 2) then + -- Item is on the left: grow the tooltip group toward the right. + GameTooltip:SetPoint("BOTTOMLEFT", button, "TOPRIGHT", -10, 0) + else + -- Preserve Guda's historical position for items on the right. + GameTooltip:SetPoint("BOTTOMRIGHT", button, "TOPLEFT", 10, 0) + end +end + +local function GetComparisonGap(tooltip) + local separation = 6 + local edgeSize = 0 + + if tooltip and tooltip.GetBackdrop then + local backdrop = tooltip:GetBackdrop() + if type(backdrop) == "table" and backdrop.edgeSize then + edgeSize = backdrop.edgeSize + end + end + + return separation + edgeSize +end + +local function PositionComparisonTooltips() + if not GameTooltip or not GameTooltip:IsShown() then return end + + local first = ShoppingTooltip1 + local second = ShoppingTooltip2 + if not first or not first:IsShown() then return end + + local screenWidth = UIParent and UIParent.GetWidth and UIParent:GetWidth() + local left = GameTooltip.GetLeft and GameTooltip:GetLeft() + local right = GameTooltip.GetRight and GameTooltip:GetRight() + if not screenWidth or not left or not right then return end + + local leftSpace = left + local rightSpace = screenWidth - right + local useLeft = leftSpace > rightSpace + local gap = GetComparisonGap(first) + + first:SetOwner(GameTooltip, "ANCHOR_NONE") + first:ClearAllPoints() + if useLeft then + first:SetPoint("TOPRIGHT", GameTooltip, "TOPLEFT", -gap, -10) + else + first:SetPoint("TOPLEFT", GameTooltip, "TOPRIGHT", gap, -10) + end + + if second and second:IsShown() then + second:SetOwner(first, "ANCHOR_NONE") + second:ClearAllPoints() + if useLeft then + second:SetPoint("TOPRIGHT", first, "TOPLEFT", -gap, 0) + else + second:SetPoint("TOPLEFT", first, "TOPRIGHT", gap, 0) + end + end +end + +function Guda_ItemButton_OnEnter(self) + originalOnEnter(self) + + -- Empty/drop-target buttons either have no item tooltip or use a small + -- custom tooltip that does not participate in equipment comparison. + if not self or self.isDropTarget or not self.hasItem then return end + if not GameTooltip or not GameTooltip:IsShown() then return end + if IsCursorAnchored() then return end + + PositionMainTooltip(self) + + -- Comparison tooltips may already have been shown synchronously by a + -- tooltip hook. Re-anchor them now; if they are shown later, ClassicAPI's + -- own side selection will use the corrected GameTooltip position. + PositionComparisonTooltips() +end + +addon:Debug("Guda comparison tooltip positioning fix enabled")