init
This commit is contained in:
220
MinimapButton.lua
Normal file
220
MinimapButton.lua
Normal file
@@ -0,0 +1,220 @@
|
||||
--------------------------------------------------------------------------------
|
||||
-- S-Frames: Minimap quick access button (MinimapButton.lua)
|
||||
-- Left Click : open /nui UI settings
|
||||
-- Right Click : open /nui bag settings
|
||||
-- Shift + Drag: move icon around minimap
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
SFrames.MinimapButton = SFrames.MinimapButton or {}
|
||||
|
||||
local button = nil
|
||||
local DEFAULT_ANGLE = 225
|
||||
|
||||
local function EnsureDB()
|
||||
if not SFramesDB then
|
||||
SFramesDB = {}
|
||||
end
|
||||
|
||||
if type(SFramesDB.minimapButton) ~= "table" then
|
||||
SFramesDB.minimapButton = {}
|
||||
end
|
||||
|
||||
local db = SFramesDB.minimapButton
|
||||
if type(db.angle) ~= "number" then
|
||||
db.angle = DEFAULT_ANGLE
|
||||
end
|
||||
if db.hide == nil then
|
||||
db.hide = false
|
||||
end
|
||||
|
||||
return db
|
||||
end
|
||||
|
||||
local function SafeAtan2(y, x)
|
||||
if math.atan2 then
|
||||
return math.atan2(y, x)
|
||||
end
|
||||
|
||||
if x > 0 then
|
||||
return math.atan(y / x)
|
||||
elseif x < 0 and y >= 0 then
|
||||
return math.atan(y / x) + math.pi
|
||||
elseif x < 0 and y < 0 then
|
||||
return math.atan(y / x) - math.pi
|
||||
elseif x == 0 and y > 0 then
|
||||
return math.pi / 2
|
||||
elseif x == 0 and y < 0 then
|
||||
return -math.pi / 2
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
local function GetOrbitRadius()
|
||||
local w = Minimap and Minimap:GetWidth() or 140
|
||||
return w / 2 + 6
|
||||
end
|
||||
|
||||
local function UpdatePosition()
|
||||
if not button or not Minimap then
|
||||
return
|
||||
end
|
||||
|
||||
local db = EnsureDB()
|
||||
local radius = GetOrbitRadius()
|
||||
local angleRad = math.rad(db.angle or DEFAULT_ANGLE)
|
||||
local x = math.cos(angleRad) * radius
|
||||
local y = math.sin(angleRad) * radius
|
||||
|
||||
button:ClearAllPoints()
|
||||
button:SetPoint("CENTER", Minimap, "CENTER", x, y)
|
||||
end
|
||||
|
||||
local function StartDrag()
|
||||
if not button or not Minimap then
|
||||
return
|
||||
end
|
||||
|
||||
button:SetScript("OnUpdate", function()
|
||||
local mx, my = GetCursorPosition()
|
||||
local scale = Minimap:GetEffectiveScale() or 1
|
||||
if scale == 0 then scale = 1 end
|
||||
|
||||
mx = mx / scale
|
||||
my = my / scale
|
||||
|
||||
local cx, cy = Minimap:GetCenter()
|
||||
if not cx or not cy then
|
||||
return
|
||||
end
|
||||
|
||||
local angle = math.deg(SafeAtan2(my - cy, mx - cx))
|
||||
if angle < 0 then
|
||||
angle = angle + 360
|
||||
end
|
||||
|
||||
EnsureDB().angle = angle
|
||||
UpdatePosition()
|
||||
end)
|
||||
end
|
||||
|
||||
local function StopDrag()
|
||||
if button then
|
||||
button:SetScript("OnUpdate", nil)
|
||||
end
|
||||
end
|
||||
|
||||
function SFrames.MinimapButton:Refresh()
|
||||
local db = EnsureDB()
|
||||
|
||||
if not button then
|
||||
return
|
||||
end
|
||||
|
||||
if db.hide then
|
||||
button:Hide()
|
||||
else
|
||||
button:Show()
|
||||
end
|
||||
|
||||
if button.icon and SFrames.SetIcon then
|
||||
SFrames:SetIcon(button.icon, "logo")
|
||||
local A = SFrames.ActiveTheme
|
||||
if A and A.accentLight then
|
||||
button.icon:SetVertexColor(A.accentLight[1], A.accentLight[2], A.accentLight[3], 1)
|
||||
end
|
||||
end
|
||||
|
||||
UpdatePosition()
|
||||
end
|
||||
|
||||
function SFrames.MinimapButton:Initialize()
|
||||
if button then
|
||||
self:Refresh()
|
||||
return
|
||||
end
|
||||
|
||||
if not Minimap then
|
||||
return
|
||||
end
|
||||
|
||||
EnsureDB()
|
||||
|
||||
button = CreateFrame("Button", "SFramesMinimapButton", Minimap)
|
||||
button:SetWidth(32)
|
||||
button:SetHeight(32)
|
||||
button:SetFrameStrata("MEDIUM")
|
||||
button:SetMovable(false)
|
||||
button:RegisterForClicks("LeftButtonUp", "RightButtonUp")
|
||||
button:RegisterForDrag("LeftButton")
|
||||
|
||||
local border = button:CreateTexture(nil, "OVERLAY")
|
||||
border:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
|
||||
border:SetWidth(56)
|
||||
border:SetHeight(56)
|
||||
border:SetPoint("TOPLEFT", button, "TOPLEFT", 0, 0)
|
||||
|
||||
local bg = button:CreateTexture(nil, "BACKGROUND")
|
||||
bg:SetTexture("Interface\\Minimap\\UI-Minimap-Background")
|
||||
bg:SetWidth(20)
|
||||
bg:SetHeight(20)
|
||||
bg:SetPoint("CENTER", button, "CENTER", 0, 0)
|
||||
|
||||
local icon = button:CreateTexture(nil, "ARTWORK")
|
||||
icon:SetWidth(20)
|
||||
icon:SetHeight(20)
|
||||
icon:SetPoint("CENTER", button, "CENTER", 0, 0)
|
||||
|
||||
local hl = button:CreateTexture(nil, "HIGHLIGHT")
|
||||
hl:SetTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
|
||||
hl:SetBlendMode("ADD")
|
||||
hl:SetWidth(31)
|
||||
hl:SetHeight(31)
|
||||
hl:SetPoint("CENTER", button, "CENTER", 0, 0)
|
||||
|
||||
button.icon = icon
|
||||
|
||||
button:SetScript("OnClick", function()
|
||||
if arg1 == "RightButton" then
|
||||
if SFrames.ConfigUI and SFrames.ConfigUI.Build then
|
||||
SFrames.ConfigUI:Build("bags")
|
||||
end
|
||||
else
|
||||
if SFrames.ConfigUI and SFrames.ConfigUI.Build then
|
||||
SFrames.ConfigUI:Build("ui")
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
button:SetScript("OnEnter", function()
|
||||
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
|
||||
GameTooltip:ClearLines()
|
||||
local A = SFrames.ActiveTheme
|
||||
local tr, tg, tb = 1, 0.82, 0.94
|
||||
if A and A.accentLight then
|
||||
tr, tg, tb = A.accentLight[1], A.accentLight[2], A.accentLight[3]
|
||||
end
|
||||
GameTooltip:AddLine("Nanami-UI", tr, tg, tb)
|
||||
GameTooltip:AddLine("左键: 打开 UI 设置", 0.85, 0.85, 0.85)
|
||||
GameTooltip:AddLine("右键: 打开背包设置", 0.85, 0.85, 0.85)
|
||||
GameTooltip:AddLine("Shift+拖动: 移动图标", 0.6, 0.9, 0.6)
|
||||
GameTooltip:Show()
|
||||
end)
|
||||
|
||||
button:SetScript("OnLeave", function()
|
||||
GameTooltip:Hide()
|
||||
end)
|
||||
|
||||
button:SetScript("OnDragStart", function()
|
||||
if not IsShiftKeyDown() then
|
||||
return
|
||||
end
|
||||
StartDrag()
|
||||
end)
|
||||
|
||||
button:SetScript("OnDragStop", function()
|
||||
StopDrag()
|
||||
end)
|
||||
|
||||
self:Refresh()
|
||||
end
|
||||
Reference in New Issue
Block a user