diff --git a/modules/map.lua b/modules/map.lua new file mode 100644 index 0000000..8fc0534 --- /dev/null +++ b/modules/map.lua @@ -0,0 +1,193 @@ +pfUI:RegisterModule("map", "vanilla:tbc", function () + table.insert(UISpecialFrames, "WorldMapFrame") + + local function UpdateTooltipScale() + -- load scale data + local tooltipscale = tonumber(C.appearance.worldmap.tooltipsize) + local scale = WorldMapFrame:GetScale() + + -- apply tooltip scale + if tooltipscale > 0 then + WorldMapTooltip:SetScale(tooltipscale/scale) + else + WorldMapTooltip:SetScale(1) + end + end + + -- hook SetMapToCurrentZone to allow suppression + local pfOrigSetMapToCurrentZone = _G.SetMapToCurrentZone + _G.SetMapToCurrentZone = function() + if C.appearance.worldmap.autozoneswitch == "0" and WorldMapFrame:IsShown() then return end + pfOrigSetMapToCurrentZone() + end + + -- register config update handler + pfUI.map = { UpdateConfig = UpdateTooltipScale } + + function _G.ToggleWorldMap() + if WorldMapFrame:IsShown() then + WorldMapFrame:Hide() + else + WorldMapFrame:Show() + end + end + + C.position["WorldMapFrame"] = C.position["WorldMapFrame"] or { alpha = 1.0, scale = 0.7 } + C.position["WorldMapFrame"].parent = nil + local alpha = C.position["WorldMapFrame"].alpha + local scale = C.position["WorldMapFrame"].scale + + local pfMapLoader = CreateFrame("Frame") + pfMapLoader:RegisterEvent("PLAYER_ENTERING_WORLD") + pfMapLoader:SetScript("OnEvent", function() + -- do not load if other map addon is loaded + if Cartographer then return end + if METAMAP_TITLE then return end + + UIPanelWindows["WorldMapFrame"] = { area = "center" } + + WorldMapFrame:SetMovable(true) + WorldMapFrame:EnableMouse(true) + WorldMapFrame:RegisterForDrag("LeftButton") + + -- make sure the hooks get only applied once + if not this.hooked then + this.hooked = true + + HookScript(WorldMapFrame, "OnShow", function() + -- customize + this:EnableKeyboard(false) + this:EnableMouseWheel(1) + + -- set back to default scale + WorldMapFrame:SetScale(scale or .85) + + -- always switch to current zone when opening the map + pfOrigSetMapToCurrentZone() + end) + + HookScript(WorldMapFrame, "OnMouseWheel", function() + if IsShiftKeyDown() then + alpha = clamp(WorldMapFrame:GetAlpha() + arg1/10, 0.1, 1.0) + WorldMapFrame:SetAlpha(alpha) + end + + if IsControlKeyDown() then + local oldscale = WorldMapFrame:GetScale() + local point, rel, relpoint, offx, offy = WorldMapFrame:GetPoint() + scale = clamp(oldscale + arg1/10, 0.1, 2.0) + + -- recalculate world frame position based on old and new scale + if point == "TOPLEFT" and relpoint == "TOPLEFT" then + offx = offx*oldscale/scale + offy = offy*oldscale/scale + WorldMapFrame:SetPoint(point, rel, relpoint, offx, offy) + end + + WorldMapFrame:SetScale(scale) + UpdateTooltipScale() + end + + SaveMovable(this, true) + end) + + HookScript(WorldMapFrame, "OnDragStart", function() + WorldMapFrame:StartMoving() + end) + + HookScript(WorldMapFrame, "OnDragStop",function() + WorldMapFrame:StopMovingOrSizing() + SaveMovable(this, true) + end) + end + + WorldMapFrame:SetAlpha(alpha) + WorldMapFrame:SetScale(scale) + UpdateTooltipScale() + + WorldMapFrame:ClearAllPoints() + WorldMapFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + WorldMapFrame:SetWidth(WorldMapButton:GetWidth() + 15) + WorldMapFrame:SetHeight(WorldMapButton:GetHeight() + 55) + LoadMovable(WorldMapFrame) + + -- skin + WorldMapFrameCloseButton:SetPoint("TOPRIGHT", WorldMapFrame, "TOPRIGHT", 0, 0) + CreateBackdrop(WorldMapFrame) + CreateBackdropShadow(WorldMapFrame) + + BlackoutWorld:Hide() + StripTextures(WorldMapFrame) + + SkinButton(WorldMapZoomOutButton) + SkinCloseButton(WorldMapFrameCloseButton, WorldMapFrame, -3, -3) + + -- "Switch to current zone" toggle (left side of titlebar) + if not pfUI.map.autozoneswitch then + local btn = CreateFrame("CheckButton", "pfUI_map_autozoneswitch", WorldMapFrame, "UICheckButtonTemplate") + btn:SetNormalTexture("") + btn:SetPushedTexture("") + btn:SetHighlightTexture("") + btn.text = _G["pfUI_map_autozoneswitchText"] + CreateBackdrop(btn, nil, true) + btn:SetWidth(14) + btn:SetHeight(14) + btn:SetPoint("RIGHT", WorldMapContinentDropDown, "LEFT", -8, 2) + btn.text:ClearAllPoints() + btn.text:SetPoint("RIGHT", btn, "LEFT", -4, 1) + btn.text:SetJustifyH("RIGHT") + btn.text:SetText(T["Switch to current zone"]) + btn:SetScript("OnShow", function() + this:SetChecked(C.appearance.worldmap.autozoneswitch == "1") + end) + btn:SetScript("OnClick", function() + if this:GetChecked() then + C.appearance.worldmap.autozoneswitch = "1" + pfOrigSetMapToCurrentZone() + else + C.appearance.worldmap.autozoneswitch = "0" + end + end) + pfUI.map.autozoneswitch = btn + end + SkinDropDown(WorldMapContinentDropDown) + SkinDropDown(WorldMapZoneDropDown) + if WorldMapZoneMinimapDropDown then + SkinDropDown(WorldMapZoneMinimapDropDown) + end + local point, anchor, anchorPoint, x, y = WorldMapZoneDropDown:GetPoint() + WorldMapZoneDropDown:ClearAllPoints() + WorldMapZoneDropDown:SetPoint(point, anchor, anchorPoint, x+8, y) + + -- coordinates + if not WorldMapButton.coords then + WorldMapButton.coords = CreateFrame("Frame", "pfWorldMapButtonCoords", WorldMapButton) + WorldMapButton.coords.text = WorldMapButton.coords:CreateFontString(nil, "OVERLAY") + WorldMapButton.coords.text:SetPoint("BOTTOMRIGHT", WorldMapButton, "BOTTOMRIGHT", -10, 10) + WorldMapButton.coords.text:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE") + WorldMapButton.coords.text:SetTextColor(1, 1, 1) + WorldMapButton.coords.text:SetJustifyH("RIGHT") + + WorldMapButton.coords:SetScript("OnUpdate", function() + local width = WorldMapButton:GetWidth() + local height = WorldMapButton:GetHeight() + local mx, my = WorldMapButton:GetCenter() + local scale = WorldMapButton:GetEffectiveScale() + local x, y = GetCursorPosition() + + if mx and my then + mx = (( x / scale ) - ( mx - width / 2)) / width * 100 + my = (( my + height / 2 ) - ( y / scale )) / height * 100 + end + + if mx and my and MouseIsOver(WorldMapButton) then + WorldMapButton.coords.text:SetText(string.format('%.1f / %.1f', mx, my)) + else + WorldMapButton.coords.text:SetText("") + end + end) + end + end) + + pfUI.map.loader = pfMapLoader +end) \ No newline at end of file