Files
coa-elvui/ElvUI/Modules/Maps/MapMarkers.lua
T
Anthony Narkevicius ed8bdf1118 Give the map markers an option for size (#25)
* add missing Locale entries

* add size option

* link option to icon size

* add icon size option to menu

* shorten option name

* update to match naming

* map marker translations

* map marker translations

* map marker translations

* map marker translations

* map marker translations

* map makers translations

* map markers translations

* map markers translations

* remove spacer

originally I added the space because the previous option was too long and had ... at the end of the name, but now that its shorter it looks odd on its own line
2023-01-11 13:58:30 -07:00

191 lines
5.7 KiB
Lua

local E, L, V, P, G = unpack(select(2, ...)) --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
-- local MM = {}
local MM = E:GetModule("MapMarkers")
local ElvUI_AllMarkers = {};
local ElvUI_ShowedMarkers = {};
local debug = false
-- local _print = print
local dprint = function(...)
if debug then print(...) end
end
local IgnoreList = {};
-- LibStub("AceComm-3.0"):Embed(MM);
-- LibStub("AceSerializer-3.0"):Embed(MM);
local coords = {0.499, 0.751, 0.276, 0.484};
-- local mapX,mapY = WorldMapButton:GetSize()
local prefix = "ElvUI_Marker";
local texturePath = "Interface\\AddOns\\ElvUI\\Media\\Textures\\RaidIcons";
local SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h Places a marker on the map " ..
": \n|Helvm:show:%2$s:%3$s:%4$s:nil|h|cff3588ff[Show Location]|r|h |Helvm:ignore:%1$s|h|cff3588ff[Ignore markers from: %1$s]|r|h"
function MM:SendMark(text, distribution)
MM:SendCommMessage(prefix, text, distribution or "RAID");
end
local pname = UnitName("player");
function MM:RecieveMark(text, distribution, target)
local success,mapid, x, y, who = MM:Deserialize(text);
mapid = tonumber(mapid)
if success and mapid and x and y and who ~= pname and not IgnoreList[who] then
MM:PrintMarkInfo(mapid, x, y, who);
end
end
function MM:PrintMarkInfo(mapid, x, y, who)
DEFAULT_CHAT_FRAME:AddMessage(string.format(SYNC_INFO,who,mapid,x,y), 0.41, 0.8, 0.94);
end
function MM:HideAll()
for i = 1, #ElvUI_ShowedMarkers do
ElvUI_ShowedMarkers[i]:Hide();
end
table.wipe(ElvUI_ShowedMarkers);
end
function MM:ShowMark(i,mapid)
local marker = ElvUI_AllMarkers[mapid][i];
if marker.showed then
marker:Show()
table.insert(ElvUI_ShowedMarkers, marker);
elseif not marker.showed then
marker:Hide()
end
end
function MM:CreateMark(mapid,IsSendedMark,x,y)
mapid = mapid or GetCurrentMapAreaID();
mapid = tonumber(mapid)
if not WorldMapFrame:IsShown() and IsSendedMark then
ToggleFrame(WorldMapFrame)
SetMapByID(mapid-1)
end
local curX, curY = GetCursorPosition();
local scale = WorldMapDetailFrame:GetEffectiveScale();
local width, height = WorldMapDetailFrame:GetSize();
local centerX, centerY = WorldMapDetailFrame:GetCenter();
local adjustedX = (curX / scale - (centerX - (width * 0.5))) / width;
local adjustedY = (centerY + (height * 0.5) - curY / scale) / height;
x = IsSendedMark and x or adjustedX * 100;
y = IsSendedMark and y or adjustedY * 100;
ElvUI_AllMarkers[mapid] = ElvUI_AllMarkers[mapid] or {};
local lastIndex = #ElvUI_AllMarkers[mapid];
ElvUI_AllMarkers[mapid][lastIndex+1] = CreateFrame("Frame", "Marker"..mapid..lastIndex+1, WorldMapDetailFrame);
local marker = ElvUI_AllMarkers[mapid][lastIndex+1];
marker.name = "Marker"..mapid..lastIndex;
marker.index = lastIndex+1;
marker.x = x;
marker.y = y;
marker.Texture = marker:CreateTexture();
marker.Texture:SetTexture(texturePath);
marker.Texture:SetAllPoints();
marker.Texture:SetTexCoord(unpack(coords))
marker:SetPoint("CENTER", WorldMapDetailFrame, "TOPLEFT", (x / 100) * WorldMapDetailFrame:GetWidth(), (-y / 100) * WorldMapDetailFrame:GetHeight());
marker:SetWidth(E.db.general.mapMarkers.iconSize);
marker:SetHeight(E.db.general.mapMarkers.iconSize);
marker:SetFrameStrata("DIALOG");
marker:EnableMouse(true);
marker:HookScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_LEFT")
GameTooltip:SetText("SHIFT + Middle click to remove.", 1, 1, 1)
GameTooltip:Show()
end)
marker:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
marker:SetScript("OnMouseDown",function(self,click)
if IsShiftKeyDown() and click == "MiddleButton" then
self:Hide();
self.showed = false;
MM:RefreshAll();
end
end)
marker.showed = true;
table.insert(ElvUI_ShowedMarkers, marker);
marker:Show();
if IsSendedMark then
local mname = GetMapName(mapid) or (mapid .." (mapid)")
print(format("Map marker added in %s at (%.1f, %.1f)", mname, x, y))
else
MM:SendMark(MM:Serialize(mapid, x, y, pname));
end
end
function MM:RefreshAll()
MM:HideAll();
local mapid = GetCurrentMapAreaID();
mapid = tonumber(mapid)
ElvUI_AllMarkers[mapid] = ElvUI_AllMarkers[mapid] or {};
local leng = #ElvUI_AllMarkers[mapid];
if leng and leng > 0 then
for i = 1, leng do
MM:ShowMark(i,mapid);
end
end
end
local function createMark(self, link)
local _,_, mapid, x, y = strsplit(":", link);
mapid = tonumber(mapid)
MM:CreateMark(mapid,true,x,y);
end
local function AddToIgnore(self,link)
local _,_, name = strsplit(":", link);
-- MM:CreateMark(mapid,true,x,y)
IgnoreList[name] = true;
print(name.." was added to ignored markers list.");
end
function MM:Initialize()
if not E.db.general.mapMarkers.enable then return end
local _SetItemRef = SetItemRef
function SetItemRef(link, textref, button, chatFrame)
if link:match("elvm:show") then
createMark(chatFrame,link);
elseif link:match("elvm:ignore") then
AddToIgnore(chatFrame,link);
else
_SetItemRef(link, textref, button, chatFrame);
end
end
WorldMapButton:RegisterForClicks("LeftButtonDownm", "RightButtonDown","MiddleButtonDown");
WorldMapButton:HookScript("OnClick",function(self,click)
if click == "MiddleButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then
MM:CreateMark(nil,false);
end
end)
local function EventHandler(self, event, ...)
MM:RefreshAll();
end
MM.imFrame = CreateFrame("Frame",nil,UIParent);
MM.imFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
MM.imFrame:RegisterEvent("ZONE_CHANGED_NEW_AREA");
MM.imFrame:RegisterEvent("WORLD_MAP_UPDATE");
MM.imFrame:RegisterEvent("WORLD_MAP_NAME_UPDATE");
MM.imFrame:SetScript("OnEvent", EventHandler);
if E.db.general.mapMarkers.showRaidMarkers then
MM:RegisterComm(prefix, MM.RecieveMark);
end
end
local function InitializeCallback()
MM:Initialize()
end
E:RegisterInitialModule(MM:GetName(), InitializeCallback)