local E, L, V, P, G, _ = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB, Localize Underscore local SMB = E:NewModule('SquareMinimapButtons', 'AceHook-3.0', 'AceEvent-3.0'); local sub, len, find = string.sub, string.len, string.find local ignoreButtons = { "AsphyxiaUIMinimapHelpButton", "AsphyxiaUIMinimapVersionButton", "ElvConfigToggle", "ElvUIConfigToggle", "ElvUI_ConsolidatedBuffs", "GameTimeframe", "HelpOpenTicketButton", "MMHolder", "DroodFocusMinimapButton", "QueueStatusMinimapButton", "TimeManagerClockButton", } local genericIgnores = { "Archy", "GatherMatePin", "GatherNote", "GuildInstance", "HandyNotesPin", "MinimMap", "Spy_MapNoteList_mini", "ZGVMarker", } local partialIgnores = { "Node", "Note", "Pin", } local whiteList = { "LibDBIcon", } local moveButtons = {} local mmbuttonsAnchor, minimapButtonBar local function OnEnter() if not E.db.sle.minimap.buttons.mouseover then return end UIFrameFadeIn(MinimapButtonBar, 0.2, MinimapButtonBar:GetAlpha(), 1) end local function OnLeave() if not E.db.sle.minimap.buttons.mouseover then return end UIFrameFadeOut(MinimapButtonBar, 0.2, MinimapButtonBar:GetAlpha(), 0) end function SMB:SkinButton(frame) if frame == nil or frame:GetName() == nil or (frame:GetObjectType() ~= "Button") or not frame:IsVisible() then return end local name = frame:GetName() local validIcon = false for i = 1, #whiteList do if sub(name, 1, len(whiteList[i])) == whiteList[i] then validIcon = true break end end if not validIcon then for i = 1, #ignoreButtons do if name == ignoreButtons[i] then return end 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]) ~= nil then return end end end frame:SetPushedTexture(nil) frame:SetHighlightTexture(nil) frame:SetDisabledTexture(nil) if name == "DBMMinimapButton" then frame:SetNormalTexture("Interface\\Icons\\INV_Helmet_87") end if name == "SmartBuff_MiniMapButton" then frame:SetNormalTexture(select(3, GetSpellInfo(12051))) end if not frame.isSkinned then frame:HookScript('OnEnter', OnEnter) frame:HookScript('OnLeave', OnLeave) frame:HookScript('OnClick', SMB.UpdateLayout) for i = 1, frame:GetNumRegions() do local region = select(i, frame:GetRegions()) frame.original = {} frame.original.Width, frame.original.Height = frame:GetSize() frame.original.Point, frame.original.relativeTo, frame.original.relativePoint, frame.original.xOfs, frame.original.yOfs = frame:GetPoint() frame.original.Parent = frame:GetParent() frame.original.FrameStrata = frame:GetFrameStrata() if frame:HasScript("OnDragStart") then frame.original.DragStart = frame:GetScript("OnDragStart") end if frame:HasScript("OnDragEnd") then frame.original.DragEnd = frame:GetScript("OnDragEnd") end if (region:GetObjectType() == "Texture") then local texture = region:GetTexture() if (texture and (texture:find("Border") or texture:find("Background") or texture:find("AlphaMask"))) then region:SetTexture(nil) else region:ClearAllPoints() region:Point("TOPLEFT", frame, "TOPLEFT", 2, -2) region:Point("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -2, 2) region:SetTexCoord( 0.1, 0.9, 0.1, 0.9 ) region:SetDrawLayer( "ARTWORK" ) if (name == "PS_MinimapButton") then region.SetPoint = function() end end end end end frame:SetTemplate("Default") tinsert(moveButtons, name) frame.isSkinned = true end end function SMB:UpdateLayout() if not E.minimapbuttons then return end minimapButtonBar:SetPoint("CENTER", mmbuttonsAnchor, "CENTER", 0, 0) minimapButtonBar:Height(E.db.sle.minimap.buttons.size + 4) minimapButtonBar:Width(E.db.sle.minimap.buttons.size + 4) local lastFrame, anchor1, anchor2, offsetX, offsetY for i = 1, #moveButtons do local frame = _G[moveButtons[i]] if E.db.sle.minimap.buttons.anchor == 'NOANCHOR' then frame:SetParent(frame.original.Parent) if frame.original.DragStart then frame:SetScript("OnDragStart", frame.original.DragStart) end if frame.original.DragEnd then frame:SetScript("OnDragStop", frame.original.DragEnd) end frame:ClearAllPoints() frame:Size(E.db.sle.minimap.buttons.size) frame:SetPoint(frame.original.Point, frame.original.relativeTo, frame.original.relativePoint, frame.original.xOfs, frame.original.yOfs) frame:SetFrameStrata(frame.original.FrameStrata) frame:SetMovable(true) else frame:SetParent(minimapButtonBar) frame:SetMovable(false) frame:SetScript("OnDragStart", nil) frame:SetScript("OnDragStop", nil) frame:ClearAllPoints() frame:SetFrameStrata("LOW") frame:Size(E.db.sle.minimap.buttons.size) if E.db.sle.minimap.buttons.anchor == 'HORIZONTAL' then anchor1 = 'RIGHT' anchor2 = 'LEFT' offsetX = -2 offsetY = 0 else anchor1 = 'TOP' anchor2 = 'BOTTOM' offsetX = 0 offsetY = -2 end if not lastFrame then frame:SetPoint(anchor1, minimapButtonBar, anchor1, offsetX, offsetY) else frame:SetPoint(anchor1, lastFrame, anchor2, offsetX, offsetY) end end lastFrame = frame end if E.db.sle.minimap.buttons.anchor ~= 'NOANCHOR' and #moveButtons > 0 then if E.db.sle.minimap.buttons.anchor == "HORIZONTAL" then minimapButtonBar:Width((E.db.sle.minimap.buttons.size * #moveButtons) + (2 * #moveButtons + 1) + 1) else minimapButtonBar:Height((E.db.sle.minimap.buttons.size * #moveButtons) + (2 * #moveButtons + 1) + 1) end mmbuttonsAnchor:SetSize(minimapButtonBar:GetSize()) minimapButtonBar:Show() else minimapButtonBar:Hide() end end function SMB:ChangeMouseOverSetting() if E.db.sle.minimap.buttons.mouseover then minimapButtonBar:SetAlpha(0) else minimapButtonBar:SetAlpha(1) end end function SMB:SkinMinimapButtons() SMB:RegisterEvent("ADDON_LOADED", "DelaySkinning") for i = 1, Minimap:GetNumChildren() do self:SkinButton(select(i, Minimap:GetChildren())) end SMB:UpdateLayout() end function SMB:DelaySkinning() SMB:UnregisterEvent("ADDON_LOADED") E:Delay(20, SMB:SkinMinimapButtons()) end function SMB:CreateMinimapButtonFrames() self:UnregisterEvent("PLAYER_ENTERING_WORLD") mmbuttonsAnchor = CreateFrame("Frame", "MMButtonsAnchor", E.UIParent) mmbuttonsAnchor:Point("TOPRIGHT", ElvConfigToggle, "BOTTOMRIGHT", -2, -2) mmbuttonsAnchor:Size(200, 32) mmbuttonsAnchor:SetFrameStrata("BACKGROUND") E:CreateMover(mmbuttonsAnchor, "MMButtonsMover", L["Minimap Button Bar"], nil, nil, nil, "ALL,S&L,S&L MISC") minimapButtonBar = CreateFrame("Frame", "MinimapButtonBar", UIParent) minimapButtonBar:SetFrameStrata("BACKGROUND") minimapButtonBar:SetTemplate("Transparent") minimapButtonBar:CreateShadow() minimapButtonBar:SetPoint("CENTER", mmbuttonsAnchor, "CENTER", 0, 0) minimapButtonBar:SetScript("OnEnter", OnEnter) minimapButtonBar:SetScript("OnLeave", OnLeave) self:ChangeMouseOverSetting() self:DelaySkinning() end function SMB:Initialize() if not E.private.sle.minimap.buttons.enable then return end E.minimapbuttons = SMB self:RegisterEvent("PLAYER_ENTERING_WORLD", "CreateMinimapButtonFrames") end E:RegisterModule(SMB:GetName())