8ad40722a0
Update nameplate coloring. Fix world map blips
469 lines
12 KiB
Lua
469 lines
12 KiB
Lua
local E, L, V, P, G = unpack(ElvUI)
|
|
local MBG = E:NewModule("Enhanced_MinimapButtonGrabber", "AceHook-3.0", "AceTimer-3.0")
|
|
|
|
local pairs, ipairs = pairs, ipairs
|
|
local select = select
|
|
local unpack = unpack
|
|
local ceil = math.ceil
|
|
local find, len, sub = string.find, string.len, string.sub
|
|
local tinsert = table.insert
|
|
|
|
local UIFrameFadeIn = UIFrameFadeIn
|
|
local UIFrameFadeOut = UIFrameFadeOut
|
|
|
|
local ignoreButtons = {
|
|
["ElvConfigToggle"] = true,
|
|
|
|
["BattlefieldMinimap"] = true,
|
|
["ButtonCollectFrame"] = true,
|
|
["GameTimeFrame"] = true,
|
|
["MiniMapBattlefieldFrame"] = true,
|
|
["MiniMapLFGFrame"] = true,
|
|
["MiniMapMailFrame"] = true,
|
|
["MiniMapPing"] = true,
|
|
["MiniMapRecordingButton"] = true,
|
|
["MiniMapTracking"] = true,
|
|
["MiniMapTrackingButton"] = true,
|
|
["MiniMapVoiceChatFrame"] = true,
|
|
["MiniMapWorldMapButton"] = true,
|
|
["Minimap"] = true,
|
|
["MinimapBackdrop"] = true,
|
|
["MinimapToggleButton"] = true,
|
|
["MinimapZoneTextButton"] = true,
|
|
["MinimapZoomIn"] = true,
|
|
["MinimapZoomOut"] = true,
|
|
["TimeManagerClockButton"] = true,
|
|
}
|
|
|
|
local genericIgnores = {
|
|
"GuildInstance",
|
|
|
|
-- GatherMate
|
|
"GatherMatePin",
|
|
-- Gatherer
|
|
"GatherNote",
|
|
-- GuildMap3
|
|
"GuildMap3Mini",
|
|
-- HandyNotes
|
|
"HandyNotesPin",
|
|
-- LibRockConfig
|
|
"LibRockConfig-1.0_MinimapButton",
|
|
-- Nauticus
|
|
"NauticusMiniIcon",
|
|
"WestPointer",
|
|
-- QuestPointer
|
|
"poiMinimap",
|
|
-- Spy
|
|
"Spy_MapNoteList_mini",
|
|
}
|
|
|
|
local partialIgnores = {
|
|
"Node",
|
|
"Note",
|
|
"Pin",
|
|
}
|
|
|
|
local whiteList = {
|
|
"LibDBIcon",
|
|
}
|
|
|
|
local buttonFunctions = {
|
|
"SetParent",
|
|
"SetFrameStrata",
|
|
"SetFrameLevel",
|
|
"ClearAllPoints",
|
|
"SetPoint",
|
|
"SetScale",
|
|
"SetSize",
|
|
"SetWidth",
|
|
"SetHeight"
|
|
}
|
|
|
|
local function OnEnter()
|
|
UIFrameFadeIn(MBG.frame, 0.1, MBG.frame:GetAlpha(), MBG.maxAlpha)
|
|
end
|
|
|
|
local function OnLeave()
|
|
UIFrameFadeOut(MBG.frame, 0.1, MBG.frame:GetAlpha(), 0)
|
|
end
|
|
|
|
function MBG:LockButton(button)
|
|
for _, func in ipairs(buttonFunctions) do
|
|
button[func] = E.noop
|
|
end
|
|
end
|
|
|
|
function MBG:UnlockButton(button)
|
|
for _, func in ipairs(buttonFunctions) do
|
|
button[func] = nil
|
|
end
|
|
end
|
|
|
|
function MBG:CheckVisibility()
|
|
local updateLayout
|
|
|
|
for _, button in ipairs(self.skinnedButtons) do
|
|
if button:IsVisible() and button.__hidden then
|
|
button.__hidden = false
|
|
updateLayout = true
|
|
elseif not button:IsVisible() and not button.__hidden then
|
|
button.__hidden = true
|
|
updateLayout = true
|
|
end
|
|
end
|
|
|
|
return updateLayout
|
|
end
|
|
|
|
function MBG:GetVisibleList()
|
|
local t = {}
|
|
|
|
for _, button in ipairs(self.skinnedButtons) do
|
|
if button:IsVisible() then
|
|
tinsert(t, button)
|
|
end
|
|
end
|
|
|
|
return t
|
|
end
|
|
|
|
function MBG:GrabMinimapButtons()
|
|
for _, frame in ipairs(self.minimapFrames) do
|
|
for i = 1, frame:GetNumChildren() do
|
|
local object = select(i, frame:GetChildren())
|
|
|
|
if object and object:IsObjectType("Button") then
|
|
self:SkinMinimapButton(object)
|
|
end
|
|
end
|
|
end
|
|
|
|
if AtlasButtonFrame then self:SkinMinimapButton(AtlasButton) end
|
|
if FishingBuddyMinimapFrame then self:SkinMinimapButton(FishingBuddyMinimapButton) end
|
|
if HealBot_MMButton then self:SkinMinimapButton(HealBot_MMButton) end
|
|
|
|
if self.needUpdate or self:CheckVisibility() then
|
|
self:UpdateLayout()
|
|
end
|
|
end
|
|
|
|
function MBG:SkinMinimapButton(button)
|
|
if not button or button.isSkinned then return end
|
|
|
|
local name = button:GetName()
|
|
if not name then return end
|
|
|
|
if button:IsObjectType("Button") then
|
|
local validIcon
|
|
|
|
for i = 1, #whiteList do
|
|
if sub(name, 1, len(whiteList[i])) == whiteList[i] then
|
|
validIcon = true
|
|
break
|
|
end
|
|
end
|
|
|
|
if not validIcon then
|
|
if ignoreButtons[name] then return end
|
|
|
|
for i = 1, #genericIgnores do
|
|
if sub(name, 1, len(genericIgnores[i])) == genericIgnores[i] then return end
|
|
end
|
|
|
|
for i = 1, #partialIgnores do
|
|
if find(name, partialIgnores[i]) then return end
|
|
end
|
|
end
|
|
|
|
button:SetPushedTexture(nil)
|
|
button:SetHighlightTexture(nil)
|
|
button:SetDisabledTexture(nil)
|
|
end
|
|
|
|
for i = 1, button:GetNumRegions() do
|
|
local region = select(i, button:GetRegions())
|
|
|
|
if region:GetObjectType() == "Texture" then
|
|
local texture = region:GetTexture()
|
|
|
|
if texture and (find(texture, "Border") or find(texture, "Background") or find(texture, "AlphaMask")) then
|
|
region:SetTexture(nil)
|
|
else
|
|
if name == "BagSync_MinimapButton" then
|
|
region:SetTexture("Interface\\AddOns\\BagSync\\media\\icon")
|
|
elseif name == "DBMMinimapButton" then
|
|
region:SetTexture("Interface\\Icons\\INV_Helmet_87")
|
|
elseif name == "OutfitterMinimapButton" then
|
|
if region:GetTexture() == "Interface\\Addons\\Outfitter\\Textures\\MinimapButton" then
|
|
region:SetTexture(nil)
|
|
end
|
|
elseif name == "SmartBuff_MiniMapButton" then
|
|
region:SetTexture("Interface\\Icons\\Spell_Nature_Purge")
|
|
elseif name == "VendomaticButtonFrame" then
|
|
region:SetTexture("Interface\\Icons\\INV_Misc_Rabbit_2")
|
|
end
|
|
|
|
region:ClearAllPoints()
|
|
region:SetInside()
|
|
region:SetTexCoord(unpack(E.TexCoords))
|
|
button:HookScript("OnLeave", function() region:SetTexCoord(unpack(E.TexCoords)) end)
|
|
|
|
region:SetDrawLayer("ARTWORK")
|
|
region.SetPoint = E.noop
|
|
end
|
|
end
|
|
end
|
|
|
|
button:SetParent(self.frame)
|
|
button:SetFrameLevel(self.frame:GetFrameLevel() + 5)
|
|
button:SetTemplate()
|
|
|
|
self:LockButton(button)
|
|
|
|
button:SetScript("OnDragStart", nil)
|
|
button:SetScript("OnDragStop", nil)
|
|
|
|
if E.db.enhanced.minimap.buttonGrabber.mouseover then
|
|
button:HookScript("OnEnter", OnEnter)
|
|
button:HookScript("OnLeave", OnLeave)
|
|
end
|
|
|
|
button.__hidden = button:IsVisible() and true or false
|
|
button.isSkinned = true
|
|
tinsert(self.skinnedButtons, button)
|
|
|
|
self.needUpdate = true
|
|
end
|
|
|
|
function MBG:UpdateLayout()
|
|
if #self.skinnedButtons == 0 then return end
|
|
|
|
local db = E.db.enhanced.minimap.buttonGrabber
|
|
local spacing = (db.backdrop and (E.Border + db.backdropSpacing) or E.Spacing)
|
|
|
|
local visibleButtons = self:GetVisibleList()
|
|
|
|
if #visibleButtons == 0 then
|
|
self.frame:Size(db.buttonSize + (spacing * 2))
|
|
self.frame.backdrop:Hide()
|
|
return
|
|
end
|
|
|
|
local numButtons = #visibleButtons
|
|
local buttonsPerRow = db.buttonsPerRow
|
|
local numColumns = ceil(numButtons / buttonsPerRow)
|
|
|
|
if buttonsPerRow > numButtons then
|
|
buttonsPerRow = numButtons
|
|
end
|
|
|
|
local barWidth = (db.buttonSize * buttonsPerRow) + (db.buttonSpacing * (buttonsPerRow - 1)) + spacing * 2
|
|
local barHeight = (db.buttonSize * numColumns) + (db.buttonSpacing * (numColumns - 1)) + spacing * 2
|
|
|
|
self.frame:Size(barWidth, barHeight)
|
|
self.frame.mover:Size(barWidth, barHeight)
|
|
|
|
if db.backdrop then
|
|
self.frame.backdrop:Show()
|
|
else
|
|
self.frame.backdrop:Hide()
|
|
end
|
|
|
|
local verticalGrowth = (db.growFrom == "TOPLEFT" or db.growFrom == "TOPRIGHT") and "DOWN" or "UP"
|
|
local horizontalGrowth = (db.growFrom == "TOPLEFT" or db.growFrom == "BOTTOMLEFT") and "RIGHT" or "LEFT"
|
|
|
|
for i, button in ipairs(visibleButtons) do
|
|
self:UnlockButton(button)
|
|
|
|
button:Size(db.buttonSize)
|
|
button:ClearAllPoints()
|
|
|
|
if i == 1 then
|
|
local x, y
|
|
if db.growFrom == "TOPLEFT" then
|
|
x, y = spacing, -spacing
|
|
elseif db.growFrom == "TOPRIGHT" then
|
|
x, y = -spacing, -spacing
|
|
elseif db.growFrom == "BOTTOMLEFT" then
|
|
x, y = spacing, spacing
|
|
else
|
|
x, y = -spacing, spacing
|
|
end
|
|
|
|
button:Point(db.growFrom, self.frame, db.growFrom, x, y)
|
|
elseif (i - 1) % buttonsPerRow == 0 then
|
|
if verticalGrowth == "DOWN" then
|
|
button:Point("TOP", visibleButtons[i - buttonsPerRow], "BOTTOM", 0, -db.buttonSpacing)
|
|
else
|
|
button:Point("BOTTOM", visibleButtons[i - buttonsPerRow], "TOP", 0, db.buttonSpacing)
|
|
end
|
|
elseif horizontalGrowth == "RIGHT" then
|
|
button:Point("LEFT", visibleButtons[i - 1], "RIGHT", db.buttonSpacing, 0)
|
|
elseif horizontalGrowth == "LEFT" then
|
|
button:Point("RIGHT", visibleButtons[i - 1], "LEFT", -db.buttonSpacing, 0)
|
|
end
|
|
|
|
self:LockButton(button)
|
|
end
|
|
|
|
self.needUpdate = false
|
|
end
|
|
|
|
function MBG:UpdatePosition()
|
|
local db = E.db.enhanced.minimap.buttonGrabber.insideMinimap
|
|
|
|
if db.enable then
|
|
self.frame:ClearAllPoints()
|
|
self.frame:Point(db.position, Minimap, db.position, db.xOffset, db.yOffset)
|
|
|
|
E:DisableMover(self.frame.mover:GetName())
|
|
else
|
|
self.frame:ClearAllPoints()
|
|
self.frame:SetAllPoints(self.frame.mover)
|
|
|
|
E:EnableMover(self.frame.mover:GetName())
|
|
end
|
|
end
|
|
|
|
function MBG:UpdateAlpha()
|
|
self.maxAlpha = E.db.enhanced.minimap.buttonGrabber.alpha
|
|
|
|
if not E.db.enhanced.minimap.buttonGrabber.mouseover then
|
|
self.frame:SetAlpha(self.maxAlpha)
|
|
end
|
|
end
|
|
|
|
function MBG:ToggleMouseover()
|
|
local mouseover = E.db.enhanced.minimap.buttonGrabber.mouseover
|
|
local enter = mouseover and OnEnter or nil
|
|
local leave = mouseover and OnLeave or nil
|
|
|
|
self.frame:SetAlpha(mouseover and 0 or E.db.enhanced.minimap.buttonGrabber.alpha)
|
|
self.frame:SetScript("OnEnter", enter)
|
|
self.frame:SetScript("OnLeave", leave)
|
|
|
|
if #self.skinnedButtons > 0 then
|
|
for _, button in ipairs(self.skinnedButtons) do
|
|
button:SetScript("OnEnter", enter)
|
|
button:SetScript("OnLeave", leave)
|
|
end
|
|
end
|
|
end
|
|
|
|
local addonFixes = {
|
|
["Atlas"] = function()
|
|
function AtlasButton_Toggle()
|
|
if AtlasButton:IsVisible() then
|
|
AtlasButton:Hide()
|
|
AtlasOptions.AtlasButtonShown = false
|
|
else
|
|
AtlasButton:Show()
|
|
AtlasOptions.AtlasButtonShown = true
|
|
end
|
|
|
|
AtlasOptions_Init()
|
|
end
|
|
end,
|
|
["DBM-Core"] = function()
|
|
local button = DBMMinimapButton
|
|
if not button then return end
|
|
|
|
if button:GetScript("OnMouseDown") then
|
|
button:SetScript("OnMouseDown", nil)
|
|
button:SetScript("OnMouseUp", nil)
|
|
end
|
|
end,
|
|
["Enchantrix"] = function()
|
|
if not Enchantrix or EnxMiniMapIcon then return end
|
|
|
|
local settings = Enchantrix.Settings
|
|
local oldButton = Enchantrix.MiniIcon
|
|
|
|
local newButton = CreateFrame("Button", "EnxMiniMapIcon", Minimap)
|
|
newButton:Size(20)
|
|
newButton:SetToplevel(true)
|
|
newButton:SetFrameStrata("LOW")
|
|
newButton:Point("RIGHT", Minimap, "LEFT", 0,0)
|
|
newButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
|
|
|
|
newButton.icon = oldButton.icon
|
|
newButton.icon:SetTexCoord(0.2, 0.84, 0.13, 0.87)
|
|
newButton.icon:SetParent(newButton)
|
|
newButton.icon:SetPoint("TOPLEFT", newButton, "TOPLEFT", 0, 0)
|
|
|
|
newButton.mask = oldButton.mask
|
|
newButton.mask:SetParent(newButton)
|
|
newButton.mask:SetPoint("TOPLEFT", newButton, "TOPLEFT", -8, 8)
|
|
|
|
newButton:SetScript("OnClick", oldButton:GetScript("OnClick"))
|
|
|
|
oldButton:SetMovable(false)
|
|
oldButton:SetParent(UIParent)
|
|
oldButton:Point("TOPRIGHT", UIParent)
|
|
oldButton:Hide()
|
|
|
|
oldButton:SetScript("OnMouseDown", nil)
|
|
oldButton:SetScript("OnMouseUp", nil)
|
|
oldButton:SetScript("OnDragStart", nil)
|
|
oldButton:SetScript("OnDragStop", nil)
|
|
oldButton:SetScript("OnClick", nil)
|
|
oldButton:SetScript("OnUpdate", nil)
|
|
|
|
Enchantrix.MiniIcon = newButton
|
|
|
|
function Enchantrix.MiniIcon.Reposition()
|
|
if settings.GetSetting("miniicon.enable") then
|
|
newButton:Show()
|
|
else
|
|
newButton:Hide()
|
|
end
|
|
end
|
|
end
|
|
}
|
|
|
|
function MBG:Initialize()
|
|
if not E.private.enhanced.minimapButtonGrabber then return end
|
|
|
|
local db = E.db.enhanced.minimap.buttonGrabber
|
|
local spacing = (db.backdrop and (E.Border + db.backdropSpacing) or E.Spacing)
|
|
|
|
self.skinnedButtons = {}
|
|
self.minimapFrames = {Minimap, MinimapBackdrop}
|
|
|
|
self.frame = CreateFrame("Frame", "ElvUI_MinimapButtonGrabber", UIParent)
|
|
self.frame:Size(db.buttonSize + (spacing * 2))
|
|
self.frame:Point("TOPRIGHT", MMHolder, "BOTTOMRIGHT", 0, 1)
|
|
self.frame:SetFrameStrata("LOW")
|
|
self.frame:SetClampedToScreen(true)
|
|
self.frame:CreateBackdrop()
|
|
|
|
self.frame.backdrop:SetPoint("TOPLEFT", self.frame, "TOPLEFT", E.Spacing, -E.Spacing)
|
|
self.frame.backdrop:SetPoint("BOTTOMRIGHT", self.frame, "BOTTOMRIGHT", -E.Spacing, E.Spacing)
|
|
self.frame.backdrop:Hide()
|
|
|
|
E:CreateMover(self.frame, "MinimapButtonGrabberMover", L["Minimap Button Grabber"], nil, nil, nil, "ALL,GENERAL")
|
|
|
|
if self.frame.mover:GetScript("OnSizeChanged") then
|
|
self.frame.mover:SetScript("OnSizeChanged", nil)
|
|
end
|
|
|
|
self.initialized = true
|
|
|
|
self:ToggleMouseover()
|
|
self:UpdateAlpha()
|
|
self:UpdatePosition()
|
|
self:GrabMinimapButtons()
|
|
|
|
self:ScheduleRepeatingTimer("GrabMinimapButtons", 5)
|
|
|
|
local AddonsCompat = E:GetModule("Enhanced_AddonsCompat")
|
|
for addon, func in pairs(addonFixes) do
|
|
AddonsCompat:AddAddon(addon, func)
|
|
end
|
|
end
|
|
|
|
local function InitializeCallback()
|
|
MBG:Initialize()
|
|
end
|
|
|
|
E:RegisterModule(MBG:GetName(), InitializeCallback) |