Files
RelationshipsAttune/Minimap.lua
T
2026-07-09 17:30:26 +01:00

148 lines
4.8 KiB
Lua

-- RelationshipsAttune: Minimap.lua
-- A standalone, freely-movable, hideable button (parented to UIParent so it
-- can be dragged anywhere on the screen, not just around the minimap ring).
-- Pure Lua 5.0 / WoW 1.12 safe (Turtle/Octo compatible).
--
-- Options are stored in RelationshipsAttuneDB.options:
-- minimapX : number (x offset from UIParent CENTER, in UI pixels)
-- minimapY : number (y offset from UIParent CENTER, in UI pixels)
-- minimapHide : boolean (true = hidden)
-- Legacy angle/radius fields are migrated to X/Y on first load.
RelationshipsAttune = RelationshipsAttune or {}
local RA = RelationshipsAttune
RA.Minimap = {}
local MM = RA.Minimap
local BTN_NAME = "RelationshipsAttuneMinimapButton"
local ICON = "Interface\\Icons\\INV_Misc_Book_09"
local function opts()
if not RelationshipsAttuneDB then RelationshipsAttuneDB = {} end
if not RelationshipsAttuneDB.options then RelationshipsAttuneDB.options = {} end
local o = RelationshipsAttuneDB.options
-- Migrate legacy angle/radius (around the minimap) into free X/Y.
if type(o.minimapX) ~= "number" or type(o.minimapY) ~= "number" then
local ang = (type(o.minimapAngle) == "number") and o.minimapAngle or 200
local rad = (type(o.minimapRadius) == "number") and o.minimapRadius or 80
local r = ang * math.pi / 180
local mx, my = 0, 0
if Minimap and Minimap.GetCenter then
local cx, cy = Minimap:GetCenter()
if cx then mx, my = cx, cy end
end
local ux, uy = 0, 0
if UIParent and UIParent.GetCenter then
local ucx, ucy = UIParent:GetCenter()
if ucx then ux, uy = ucx, ucy end
end
o.minimapX = (mx - ux) + math.cos(r) * rad
o.minimapY = (my - uy) + math.sin(r) * rad
end
if o.minimapHide == nil then o.minimapHide = false end
return o
end
local function applyPosition(btn)
local o = opts()
btn:ClearAllPoints()
btn:SetPoint("CENTER", UIParent, "CENTER", o.minimapX, o.minimapY)
end
MM._updatePosition = applyPosition
local function onDragUpdate()
local mx, my = GetCursorPosition()
local scale = UIParent:GetEffectiveScale() or 1
mx = mx / scale; my = my / scale
local ucx, ucy = UIParent:GetCenter()
if not ucx then return end
local o = opts()
o.minimapX = mx - ucx
o.minimapY = my - ucy
applyPosition(this)
end
function MM:Create()
if getglobal(BTN_NAME) then return getglobal(BTN_NAME) end
-- Parent to UIParent so we're not clipped to the minimap area.
local btn = CreateFrame("Button", BTN_NAME, UIParent)
btn:SetWidth(31); btn:SetHeight(31)
btn:SetFrameStrata("MEDIUM")
btn:SetFrameLevel(8)
btn:EnableMouse(true)
btn:RegisterForClicks("LeftButtonUp", "RightButtonUp")
btn:RegisterForDrag("LeftButton", "RightButton")
btn:SetMovable(true)
-- Round border ring (standard minimap-button look)
local overlay = btn:CreateTexture(nil, "OVERLAY")
overlay:SetWidth(53); overlay:SetHeight(53)
overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
overlay:SetPoint("TOPLEFT", btn, "TOPLEFT", 0, 0)
local icon = btn:CreateTexture(nil, "BACKGROUND")
icon:SetWidth(20); icon:SetHeight(20)
icon:SetTexture(ICON)
icon:SetTexCoord(0.08, 0.92, 0.08, 0.92)
icon:SetPoint("TOPLEFT", btn, "TOPLEFT", 7, -6)
btn.icon = icon
btn:SetScript("OnClick", function()
if RA.UI and RA.UI.Toggle then RA.UI:Toggle() end
end)
btn:SetScript("OnDragStart", function()
this:LockHighlight()
this:SetScript("OnUpdate", onDragUpdate)
end)
btn:SetScript("OnDragStop", function()
this:UnlockHighlight()
this:SetScript("OnUpdate", nil)
end)
btn:SetScript("OnEnter", function()
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
GameTooltip:AddLine("Relationships Attune", 1, 0.82, 0)
GameTooltip:AddLine("Left-click: open / close window", 0.9, 0.9, 0.9)
GameTooltip:AddLine("Drag: move anywhere on screen", 0.9, 0.9, 0.9)
GameTooltip:AddLine("/attune hide - hide this button", 0.6, 0.8, 1)
GameTooltip:Show()
end)
btn:SetScript("OnLeave", function() GameTooltip:Hide() end)
applyPosition(btn)
self.btn = btn
return btn
end
function MM:Show()
local o = opts()
o.minimapHide = false
local btn = self:Create()
btn:Show()
end
function MM:Hide()
local o = opts()
o.minimapHide = true
if self.btn then self.btn:Hide() end
end
function MM:Toggle()
local o = opts()
if o.minimapHide then self:Show() else self:Hide() end
end
function MM:Refresh()
local o = opts()
local btn = self:Create()
if o.minimapHide then btn:Hide() else btn:Show() end
applyPosition(btn)
end
function MM:Init()
self:Refresh()
end