--- Revision None +++ Revision 323030366433 @@ -0,0 +1,488 @@ +setfenv(1, select(2, ...)) +local Minimap, MinimapCluster, MinimapBackdrop = Minimap, MinimapCluster, MinimapBackdrop +local MiniMapMailFrame, MiniMapTracking = MiniMapMailFrame, MiniMapTracking +local MiniMapLFGFrame, MiniMapVoiceChatFrame, MiniMapBattlefieldFrame = MiniMapLFGFrame, MiniMapVoiceChatFrame, MiniMapBattlefieldFrame + +-- Drag ability +MinimapCluster:SetPoint("TOPRIGHT", -10, -10) +MinimapCluster:SetClampedToScreen(true) +MinimapCluster:SetMovable(true) + +MinimapZoneTextButton:SetScript("OnMouseDown", function(_, button) + if button == "LeftButton" and IsAltKeyDown() then + MinimapCluster:StartMoving() + end +end) + +MinimapZoneTextButton:SetScript("OnMouseUp", function() + MinimapCluster:StopMovingOrSizing() +end) + +-- Hide zoom buttons, mousewheel zooming +MinimapZoomIn:Hide() +MinimapZoomOut:Hide() + +Minimap:SetScript("OnMouseWheel", function(self, delta) + local zoom = Minimap:GetZoom() + if delta == 1 and zoom < Minimap:GetZoomLevels() then + if IsShiftKeyDown() then + Minimap:SetZoom(Minimap:GetZoomLevels()) + else + Minimap:SetZoom(zoom + 1) + end + elseif delta == -1 and zoom > 0 then + if IsShiftKeyDown() then + Minimap:SetZoom(0) + else + Minimap:SetZoom(zoom - 1) + end + end +end) + +-- Hide map button +MiniMapWorldMapButton:Hide() + +-- Hide compass +hooksecurefunc("Minimap_UpdateRotationSetting", function() + MinimapNorthTag:Hide() + MinimapCompassTexture:Hide() +end) + +-- Hide calendar +GameTimeFrame:Hide() + +-- Hide time manager +local dummy = CreateFrame("Frame") +dummy:RegisterEvent("ADDON_LOADED") +dummy:SetScript("OnEvent", function(_, event, ...) + if event == "ADDON_LOADED" then + if ... == "Blizzard_TimeManager" then + TimeManagerClockButton:Hide() + end + end +end) + +-- Hide LFG button +local showLFGMenu = MiniMapLFGFrame:IsShown() +hooksecurefunc("MiniMapLFG_UpdateIsShown", function() + showLFGMenu = MiniMapLFGFrame:IsShown() + MiniMapLFGFrame:Hide() +end) + +-- Hide voice chat button +local showVoiceMenu = MiniMapVoiceChatFrame:IsShown() +hooksecurefunc("MiniMapVoiceChat_Update", function() + showVoiceMenu = MiniMapVoiceChatFrame:IsShown() + MiniMapVoiceChatFrame:Hide() +end) + +-- Hide PvP button +local showPvPMenu = MiniMapBattlefieldFrame:IsShown() +hooksecurefunc("PVP_UpdateStatus", function() + showPvPMenu = MiniMapBattlefieldFrame:IsShown() + --MiniMapBattlefieldFrame:Hide() +end) + +-- Skin minimap +Minimap:SetPoint("CENTER", MinimapCluster, 0, -10) +Minimap:SetMaskTexture(media.background["Flat"]) +Minimap:SetFrameLevel(3) + +MinimapBackdrop:SetFrameLevel(2) +MinimapBackdrop:SetPoint("TOPLEFT", Minimap, -11, 11) +MinimapBackdrop:SetPoint("BOTTOMRIGHT", Minimap, 11, -11) +MinimapBackdrop:SetBackdrop({ + bgFile = media.background["Flat"], + edgeFile = media.border["hankui: Thin Glow"], + edgeSize = 16, + insets = { left = 4, right = 4, top = 4, bottom = 4 } +}) +MinimapBackdrop:SetBackdropColor(unpack(colors["Background"].applyAlpha(1))) +MinimapBackdrop:SetBackdropBorderColor(unpack(colors["Background"].applyAlpha(0.8))) +MinimapBorder:Hide() + +local glow = MinimapBackdrop:CreateTexture("MinimapGlow", "BACKGROUND", nil, -8) +glow:SetPoint("TOPLEFT", MinimapBackdrop, -110, 110) +glow:SetPoint("BOTTOMRIGHT", MinimapBackdrop, 110, -110) +glow:SetBlendMode("ADD") +glow:SetTexture(media.background["hankui: Minimap glow"]) +glow:SetVertexColor(unpack(colors["Signature color"].applyAlpha(1))) + +MinimapBorderTop:Hide() +fonts.overrides["hMinimapZone"] = {"Tahoma Bold", 14, "OUTLINE"} +MinimapZoneText:SetFontObject("hMinimapZone") + +-- Skin buttons +local MiniMapBin = CreateFrame("Button", "MiniMapBin", Minimap) +local MiniMapBinIcon = MiniMapBin:CreateTexture("MiniMapBinIcon", "ARTWORK") +local MiniMapBinBorder = MiniMapBin:CreateTexture("MiniMapBinBorder", "BORDER") + +for i, v in ipairs({ "MiniMapMail", "MiniMapTracking", "MiniMapBin" }) do + local frame = _G[v .. "Frame"] or _G[v] + local btn = _G[v .. "Button"] + local ico = _G[v .. "Icon"] + local bd = _G[v .. "Border"] or _G[v .. "ButtonBorder"] + + frame:SetSize(32, 32) + frame:ClearAllPoints() + frame:SetAlpha(0) + + if btn then + btn:SetAllPoints() + btn:SetHighlightTexture(nil) + btn:SetScript("OnMouseDown", nil) + btn:SetScript("OnMouseUp", nil) + end + + local scriptRef = btn or frame + scriptRef:HookScript("OnEnter", function(_, motion) + ico:SetVertexColor(unpack(colors["Signature color"].applyAlpha(1))) + bd:SetVertexColor(unpack(colors["Signature color"].applyAlpha(1))) + end) + scriptRef:HookScript("OnLeave", function(_, motion) + ico:SetVertexColor(unpack(colors["Background light"].applyAlpha(1))) + bd:SetVertexColor(unpack(colors["Background"].applyAlpha(1))) + end) + + ico:SetAllPoints() + ico:SetTexture(media.button["Minimap"]) + ico:SetTexCoord((i - 1) * 0.25, i * 0.25, 0, 0.5) + ico:SetVertexColor(unpack(colors["Background light"].applyAlpha(1))) + + bd:SetAllPoints() + bd:SetTexture(media.button["Minimap"]) + bd:SetTexCoord((i - 1) * 0.25, i * 0.25, 0.5, 1) + bd:SetVertexColor(unpack(colors["Background"].applyAlpha(1))) +end + +MiniMapTracking:SetPoint("BOTTOM", 0, 10) +MiniMapMailFrame:SetPoint("RIGHT", MiniMapTracking, "LEFT", -5, 0) +MiniMapBin:SetPoint("LEFT", MiniMapTracking, "RIGHT", 5, 0) + +-- Show buttons on mouseover +local function showBtns() + MiniMapBin:SetAlpha(1) + MiniMapTracking:SetAlpha(1) + MiniMapMailFrame:SetAlpha(1) +end + +local function hideBtns() + if not Minimap:IsMouseOver() then + MiniMapBin:SetAlpha(0) + MiniMapTracking:SetAlpha(0) + MiniMapMailFrame:SetAlpha(0) + end +end + +for _, v in ipairs({ "Minimap", "MiniMapBin", "MiniMapTrackingButton", "MiniMapMailFrame" }) do + _G[v]:HookScript("OnEnter", showBtns) + _G[v]:HookScript("OnLeave", hideBtns) +end + +hideBtns() + +-- Button bin: Try to get all external addon buttons off the map +local external = { + frames = {}, + factoryFrames = { + "MinimapZoneTextButton", + "MiniMapBattlefieldFrame", + "GameTimeFrame", + "MiniMapVoiceChatFrame", + "MiniMapBin", + "TimeManagerClockButton", + "MiniMapWorldMapButton", + "MiniMapLFGFrame", + "MinimapZoomIn", + "MinimapZoomOut", + "MiniMapRecordingButton" + }, + filteredStrings = { + "Minimap", + "Icon", + "Button", + "Frame", + "LibDB[%d]*", + "_" + } +} + +Minimap:RegisterEvent("PLAYER_LOGIN") +Minimap:HookScript("OnEvent", function(_, event) + if event == "PLAYER_LOGIN" then + local externalButtons = {} + for _, frame in ipairs({ "MinimapCluster", "Minimap", "MinimapBackdrop" }) do + if _G[frame]:GetChildren() then + for i = 1, select("#", _G[frame]:GetChildren()) do + local child = select(i, _G[frame]:GetChildren()) + if child:GetObjectType() == "Button" and not tContains(external.factoryFrames, child:GetName()) then + table.insert(external.frames, child) + child:Hide() + end + end + end + end + end +end) + +-- Button bin: Dropdown +local dropdown = CreateFrame("Frame", "MiniMapBinDropDown", MiniMapBin, "UIDropDownMenuTemplate") +local tblDropDown = {} + +local function showDropDown(self, level) + -- Root menu + if level == 1 then + -- Calendar + tblDropDown = { + text = "Calendar" .. (CalendarGetNumPendingInvites() > 0 and (" (" .. CalendarGetNumPendingInvites() .. " pending)") or ""), + notCheckable = true, + tooltipOnButton = true, + func = function() GameTimeFrame_OnClick(GameTimeFrame) end + } + UIDropDownMenu_AddButton(tblDropDown) + + -- Voice chat + if showVoiceMenu then + tblDropDown = { + text = "Voice chat", + notCheckable = true, + hasArrow = true, + value = "Voice", + func = function() ToggleFriendsFrame(3) end + } + UIDropDownMenu_AddButton(tblDropDown) + end + + -- LFG root menu + if showLFGMenu then + tblDropDown = { + text = "Dungeon finder", + notCheckable = true, + hasArrow = true, + value = "LFG", + func = function() + mode, submode = GetLFGMode() + if mode == "proposal" and not LFDDungeonReadyPopup:IsShown() then + PlaySound("igCharacterInfoTab"); + StaticPopupSpecial_Show(LFDDungeonReadyPopup) + elseif mode == "queued" or mode == "rolecheck" then + ToggleLFDParentFrame() + elseif mode == "listed" then + ToggleLFRParentFrame() + end + end + } + + local mode, submode = GetLFGMode() + + if mode == "queued" then + tblDropDown.tooltipTitle = LOOKING_FOR_DUNGEON + tblDropDown.tooltipText = LFDSearchStatusStatistic:GetText() + tblDropDown.tooltipOnButton = true + elseif mode == "proposal" then + tblDropDown.tooltipTitle = LOOKING_FOR_DUNGEON + tblDropDown.tooltipText = DUNGEON_GROUP_FOUND_TOOLTIP + tblDropDown.tooltipOnButton = true + elseif mode == "rolecheck" then + tblDropDown.tooltipTitle = LOOKING_FOR_DUNGEON + tblDropDown.tooltipText = ROLE_CHECK_IN_PROGRESS_TOOLTIP + tblDropDown.tooltipOnButton = true + elseif mode == "listed" then + tblDropDown.tooltipTitle = LOOKING_FOR_RAID + tblDropDown.tooltipText = YOU_ARE_LISTED_IN_LFR + tblDropDown.tooltipOnButton = true + elseif mode == "lfgparty" then + tblDropDown.tooltipTitle = LOOKING_FOR_DUNGEON + tblDropDown.tooltipText = YOU_ARE_IN_DUNGEON_GROUP + tblDropDown.tooltipOnButton = true + end + + UIDropDownMenu_AddButton(tblDropDown) + end + + -- PvP root menu + if showPvPMenu then + tblDropDown = { + text = "PvP", + notCheckable = true, + hasArrow = true, + value = "PvP", + tooltipTitle = "lolol", + tooltipText = string.gsub(MiniMapBattlefieldFrame.tooltip, RIGHT_CLICK_MESSAGE, ""), + tooltipOnButton = true, + func = function() + end + } + UIDropDownMenu_AddButton(tblDropDown) + end + + + -- External addons + if #external.frames > 0 then + tblDropDown = { notCheckable = true, notClickable = true } + UIDropDownMenu_AddButton(tblDropDown) + tblDropDown = { isTitle = true, text = "Addons", notCheckable = true } + UIDropDownMenu_AddButton(tblDropDown) + + for i = 1, #external.frames do + local caption + if external.frames[i]:GetName() then + caption = external.frames[i]:GetName() + -- Filter out all the crap + for _, filter in ipairs(external.filteredStrings) do + caption = string.gsub(caption, filter, "") + end + else + caption = "Unknown addon" + end + tblDropDown = { + text = caption, + notCheckable = true, + func = function() + external.frames[i]:GetScript("OnClick")(external.frames[i], "LeftButton", true) + end + } + UIDropDownMenu_AddButton(tblDropDown) + end + end + end + + -- Voice submenu + if level == 2 and UIDROPDOWNMENU_MENU_VALUE == "Voice" then + for id = 1, GetNumVoiceSessions() do + local name, active = GetVoiceSessionInfo(id); + tblDropDown = { + text = name, + checked = active, + func = function (self, id) + SetActiveVoiceChannelBySessionID(id) + end, + arg1 = id + } + UIDropDownMenu_AddButton(tblDropDown, 2) + end + + tblDropDown = { + text = NONE, + checked = not GetVoiceCurrentSessionID() and 1 or nil, + func = function (self, id) + SetActiveVoiceChannelBySessionID(id) + end, + arg1 = 0 + } + UIDropDownMenu_AddButton(tblDropDown, 2) + end + + -- LFG submenu + if level == 2 and UIDROPDOWNMENU_MENU_VALUE == "LFG" then + local mode, submode = GetLFGMode() + + -- Teleport + if IsPartyLFG() then + local addButton = false + if IsInLFGDungeon() then + tblDropDown = { + text = TELEPORT_OUT_OF_DUNGEON, + notCheckable = true, + func = function() + MiniMapLFGFrame_TeleportOut() + ToggleDropDownMenu(1, nil, dropdown) + end + } + UIDropDownMenu_AddButton(tblDropDown, 2) + elseif GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0 then + tblDropDown = { + text = TELEPORT_TO_DUNGEON, + notCheckable = true, + func = function() + MiniMapLFGFrame_TeleportIn() + ToggleDropDownMenu(1, nil, dropdown) + end + } + UIDropDownMenu_AddButton(tblDropDown, 2) + end + end + + -- Proposals, list grp / player + if mode == "proposal" and submode == "unaccepted" then + tblDropDown = { + text = ENTER_DUNGEON, + notCheckable = true, + func = function() + AcceptProposal() + ToggleDropDownMenu(1, nil, dropdown) + end + } + UIDropDownMenu_AddButton(tblDropDown, 2) + tblDropDown = { + text = LEAVE_QUEUE, + notCheckable = true, + func = function() + RejectProposal() + ToggleDropDownMenu(1, nil, dropdown) + end + } + UIDropDownMenu_AddButton(tblDropDown, 2) + elseif mode == "queued" then + tblDropDown = { + text = LEAVE_QUEUE, + notCheckable = true, + func = function() + LeaveLFG() + ToggleDropDownMenu(1, nil, dropdown) + end, + disabled = submode == "unempowered" + } + UIDropDownMenu_AddButton(tblDropDown, 2) + elseif mode == "listed" then + tblDropDown = { + text = (GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0) and UNLIST_MY_GROUP or UNLIST_ME, + notCheckable = true, + func = function() + LeaveLF() + ToggleDropDownMenu(1, nil, dropdown) + end, + disabled = submode == "unempowered" + } + UIDropDownMenu_AddButton(tblDropDown, 2) + end + end + + -- PvP submenu + if level == 2 and UIDROPDOWNMENU_MENU_VALUE == "PvP" then + -- ##2DO## + -- ************************************************************************** + -- * http://wowprogramming.com/utils/xmlbrowser/live/FrameXML/PVPFrame.lua * + -- * MiniMapBattlefieldDropDown_Initialize() * + -- ************************************************************************** + for i = 1, MAX_BATTLEFIELD_QUEUES do + local status, mapName, instanceID, levelRangeMin, levelRangeMax, teamSize, registeredMatch = GetBattlefieldStatus(i) + if status == "queued" or status == "confirm" then + if teamSize ~= 0 then + tblDropDown = { + text = ARENA_RATED_MATCH .. " " .. format(PVP_TEAMSIZE, teamSize, teamSize), + isTitle = 1, + notCheckable = 1 + } + else + tblDropDown = { + text = ARENA_RATED_MATCH .. " " .. format(PVP_TEAMSIZE, teamSize, teamSize), + isTitle = 1, + notCheckable = 1 + } + end + + UIDropDownMenu_AddButton(tblDropDown) + end + end + end + +end + +UIDropDownMenu_Initialize(dropdown, showDropDown, "MENU") +dropdown.noResize = true + +MiniMapBin:SetScript("OnClick", function() + PlaySound("igMainMenuOptionCheckBoxOn") + ToggleDropDownMenu(1, nil, dropdown, "MiniMapBin", 0, -5) +end)