DopingControl v0.6.1
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
-- DopingControl features/minimap.lua
|
||||
-- Minimap button, standard hand-rolled 1.12 pattern:
|
||||
-- LEFT click toggles the main window, RIGHT
|
||||
-- click opens the options.
|
||||
--
|
||||
-- Design facts (in-game verified on 1.12):
|
||||
-- - Hand-rolled, no LibDBIcon on 1.12.
|
||||
-- - pfUI-safe: parent = Minimap, frame NAME contains "Minimap",
|
||||
-- SetFrameStrata("HIGH") + SetFrameLevel(9) -- MEDIUM hides under pfUI.
|
||||
-- /dc options stays as the fallback path.
|
||||
-- - Border recipe (vanilla FrameXML MiniMapTrackingButton): 54px
|
||||
-- MiniMap-TrackingBorder anchored TOPLEFT(0,0) on a 33px button. The
|
||||
-- ring is deliberately off-centre within the texture -- do NOT centre it.
|
||||
-- - Drag + click coexist: drag flag on OnDragStart/Stop, plain clicks
|
||||
-- still fire OnClick.
|
||||
-- - Radius = Minimap:GetWidth()/2 + 5 (follows resized minimaps).
|
||||
--
|
||||
-- Pure-Lua 5.0 dofile-loadable: all WoW wiring behind "if CreateFrame then";
|
||||
-- BuildButton/PlaceButton only touch the WoW API when called at runtime.
|
||||
|
||||
DopingControl = DopingControl or {}
|
||||
local DC = DopingControl
|
||||
|
||||
DC_Minimap = DC_Minimap or {}
|
||||
|
||||
local button = nil
|
||||
local function db() return DopingControlDB end
|
||||
|
||||
local function PlaceButton(angleDeg)
|
||||
if not button then return end
|
||||
local radius = (Minimap:GetWidth() / 2) + 5
|
||||
local rad = angleDeg * math.pi / 180
|
||||
button:ClearAllPoints()
|
||||
button:SetPoint("CENTER", Minimap, "CENTER", math.cos(rad) * radius, math.sin(rad) * radius)
|
||||
end
|
||||
|
||||
local function BuildButton()
|
||||
if button then return end
|
||||
local btn = CreateFrame("Button", "DopingControlMinimapButton", Minimap)
|
||||
btn:SetWidth(33); btn:SetHeight(33)
|
||||
btn:SetFrameStrata("HIGH"); btn:SetFrameLevel(9)
|
||||
|
||||
local icon = btn:CreateTexture("DopingControlMinimapIcon", "ARTWORK")
|
||||
icon:SetTexture("Interface\\Icons\\INV_Potion_97") -- the addon's fixed icon
|
||||
icon:SetWidth(20); icon:SetHeight(20)
|
||||
icon:SetPoint("CENTER", btn, "CENTER", 0, 0)
|
||||
icon:SetTexCoord(0.08, 0.92, 0.08, 0.92) -- standard action-button crop
|
||||
|
||||
local border = btn:CreateTexture("DopingControlMinimapBorder", "OVERLAY")
|
||||
border:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
|
||||
border:SetWidth(54); border:SetHeight(54)
|
||||
border:SetPoint("TOPLEFT", btn, "TOPLEFT", 0, 0)
|
||||
|
||||
btn:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
|
||||
btn:RegisterForClicks("LeftButtonUp", "RightButtonUp")
|
||||
btn:RegisterForDrag("LeftButton")
|
||||
|
||||
btn:SetScript("OnDragStart", function() this.isDragging = true end)
|
||||
btn:SetScript("OnDragStop", function() this.isDragging = false end)
|
||||
btn:SetScript("OnUpdate", function()
|
||||
if not this.isDragging then return end
|
||||
local mx, my = Minimap:GetCenter()
|
||||
local cx, cy = GetCursorPosition()
|
||||
local scale = Minimap:GetEffectiveScale()
|
||||
cx, cy = cx / scale, cy / scale
|
||||
local angle = math.deg(math.atan2(cy - my, cx - mx))
|
||||
db().minimapAngle = angle -- persist live while dragging
|
||||
PlaceButton(angle)
|
||||
end)
|
||||
|
||||
-- LEFT = main window toggle (same as /dc), RIGHT = options.
|
||||
btn:SetScript("OnClick", function()
|
||||
if arg1 == "RightButton" then DC_Options.Toggle() else DC_Matrix.Toggle() end
|
||||
end)
|
||||
btn:SetScript("OnEnter", function()
|
||||
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
|
||||
GameTooltip:SetText("DopingControl", 1, 1, 1)
|
||||
GameTooltip:AddLine("Left click: show / hide the window", 0.8, 0.8, 0.8)
|
||||
GameTooltip:AddLine("Right click: options", 0.8, 0.8, 0.8)
|
||||
GameTooltip:AddLine("Drag: move around the minimap", 0.8, 0.8, 0.8)
|
||||
GameTooltip:Show()
|
||||
end)
|
||||
btn:SetScript("OnLeave", function() GameTooltip:Hide() end)
|
||||
button = btn
|
||||
PlaceButton(db().minimapAngle or 215)
|
||||
end
|
||||
|
||||
-- Honours the "Show minimap button" checkbox (db.showMinimapButton);
|
||||
-- ui/options.lua calls this after toggling the setting.
|
||||
function DC_Minimap.Update()
|
||||
if not db().showMinimapButton then
|
||||
if button then button:Hide() end
|
||||
return
|
||||
end
|
||||
BuildButton()
|
||||
PlaceButton(db().minimapAngle or 215)
|
||||
button:Show()
|
||||
end
|
||||
|
||||
-- Reload survival: build on ADDON_LOADED for
|
||||
-- THIS addon (SavedVariables populated by then), then UnregisterEvent.
|
||||
-- NEVER on PLAYER_ENTERING_WORLD (would re-run and leak textures).
|
||||
if CreateFrame then
|
||||
local ev = CreateFrame("Frame", "DopingControlMinimapEventFrame", UIParent)
|
||||
ev:RegisterEvent("ADDON_LOADED")
|
||||
ev:SetScript("OnEvent", function()
|
||||
if event == "ADDON_LOADED" and arg1 == "DopingControl" then
|
||||
-- This handler fires BEFORE core/init.lua's (registration order
|
||||
-- follows TOC load order), so defaults may not be filled yet on a
|
||||
-- first-ever load. EnsureDefaults is idempotent -- run it here so
|
||||
-- showMinimapButton/minimapAngle are valid.
|
||||
DopingControlDB = DopingControlDB or {}
|
||||
DC.EnsureDefaults(DopingControlDB)
|
||||
DC_Minimap.Update()
|
||||
ev:UnregisterEvent("ADDON_LOADED")
|
||||
end
|
||||
end)
|
||||
end
|
||||
Reference in New Issue
Block a user