diff --git a/js/mapBuilder.js b/js/mapBuilder.js index ebc5543..4e5e6b0 100644 --- a/js/mapBuilder.js +++ b/js/mapBuilder.js @@ -1,18 +1,116 @@ function drawMap() { const svg = document.getElementById("map"); svg.innerHTML = ""; - svg.innerHTML += ``; + + const g = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svg.appendChild(g); + + g.innerHTML += ``; for (let nation of nations) { - addNation(svg, nation); + addNation(g, nation); } for (let capital of capitals) { - addCapital(svg, capital); + addCapital(g, capital); } for (let poi of pois) { - addPOI(svg, poi); + addPOI(g, poi); + } + + let isDragging = false; + let startX, startY, initialTranslateX, initialTranslateY, initialScale; + + const dragSensitivity = 2; + const maxScale = 6; + + svg.addEventListener("mousedown", (e) => { + if (!g.getAttribute("transform") || g.getAttribute("transform").includes("scale(1)")) return; + isDragging = true; + startX = e.clientX; + startY = e.clientY; + + // Get the current transform values, including scale + const [translate, scale] = parseTransform(g.getAttribute("transform") || "translate(0,0) scale(1)"); + initialTranslateX = translate[0]; + initialTranslateY = translate[1]; + initialScale = scale; + }); + + svg.addEventListener("mousemove", (e) => { + if (!isDragging) return; + + const svgRect = svg.getBoundingClientRect(); + const mapRect = g.getBBox(); // Get the bounding box of the map content + + // Calculate how far the mouse has moved + const deltaX = (e.clientX - startX) * dragSensitivity; + const deltaY = (e.clientY - startY) * dragSensitivity; + + // New translation values + let newTranslateX = initialTranslateX + deltaX; + let newTranslateY = initialTranslateY + deltaY; + + // Calculate boundaries + const scale = initialScale; + const mapWidth = mapRect.width * scale; + const mapHeight = mapRect.height * scale; + const svgWidth = svgRect.width; + const svgHeight = svgRect.height; + + // Constrain the translation to prevent dragging out of bounds + const minTranslateX = Math.min(0, svgWidth - mapWidth); // Minimum X translation + const minTranslateY = Math.min(0, svgHeight - mapHeight); // Minimum Y translation + + const maxTranslateX = 0; // Maximum X translation + const maxTranslateY = 0; // Maximum Y translation + + // Apply constraints + newTranslateX = Math.max(minTranslateX, Math.min(maxTranslateX, newTranslateX)); + newTranslateY = Math.max(minTranslateY, Math.min(maxTranslateY, newTranslateY)); + + // Apply the movement to the translation, using the stored initialScale + g.setAttribute("transform", `translate(${newTranslateX}, ${newTranslateY}) scale(${scale})`); + }); + + svg.addEventListener("mouseup", () => { + isDragging = false; + }); + + svg.addEventListener("mouseleave", () => { + isDragging = false; + }); + + svg.addEventListener("wheel", (e) => { + e.preventDefault(); + + const [translate, scale] = parseTransform(g.getAttribute("transform") || "translate(0,0) scale(1)"); + const newScale = Math.min(Math.max(scale * (e.deltaY > 0 ? 0.9 : 1.1), 1), maxScale); + + if (newScale === 1) { + // Center the map when zoomed out + g.setAttribute("transform", `translate(0,0) scale(1)`); + } else { + // Convert mouse position to SVG coordinates + const svgPoint = svg.createSVGPoint(); + svgPoint.x = e.clientX; + svgPoint.y = e.clientY; + const mousePoint = svgPoint.matrixTransform(svg.getScreenCTM().inverse()); + + // Adjust translation based on new scale + const newTranslateX = translate[0] - (mousePoint.x - translate[0]) * (newScale / scale - 1); + const newTranslateY = translate[1] - (mousePoint.y - translate[1]) * (newScale / scale - 1); + g.setAttribute("transform", `translate(${newTranslateX}, ${newTranslateY}) scale(${newScale})`); + } + }); + + function parseTransform(transform) { + const translateMatch = transform.match(/translate\(([^)]+)\)/); + const scaleMatch = transform.match(/scale\(([^)]+)\)/); + const translate = translateMatch ? translateMatch[1].split(",").map(Number) : [0, 0]; + const scale = scaleMatch ? parseFloat(scaleMatch[1]) : 1; + return [translate, scale]; } } diff --git a/js/tooltip.js b/js/tooltip.js index 9bdf223..cdf0683 100644 --- a/js/tooltip.js +++ b/js/tooltip.js @@ -49,8 +49,6 @@ document.addEventListener("DOMContentLoaded", () => { tooltip.style.left = `${tooltipX}px`; tooltip.style.top = `${tooltipY}px`; - - console.log("Tooltip positioned at:", tooltipX, tooltipY); }; const attachTooltipHandlers = (elements, getContentCallback) => {