You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

128 lines
4.1 KiB

// Initialize the zoom level and step
let isDragging = false; // Track whether the user is dragging
let startX, startY; // Starting position for dragging
let currentX, currentY;
let zoomLevel = 1;
const zoomStep = 0.1;
const minZoomLevel = 0.1;
const maxZoomLevel = 3;
// Function to update the zoom and apply it to the SVG element
function updateZoom() {
const svgElement = document.querySelector("#scrollableOutput svg");
if (svgElement) {
svgElement.style.transform = `scale(${zoomLevel})`;
// Center the SVG element within the parent div
const scrollableDiv = document.getElementById("scrollableOutput");
if (scrollableDiv) {
// Adjust the scroll position to center the SVG element
scrollableDiv.scrollLeft =
(svgElement.clientWidth - scrollableDiv.clientWidth) / 2;
scrollableDiv.scrollTop =
(svgElement.clientHeight - scrollableDiv.clientHeight) / 2;
}
}
}
// Event listener for the zoom in button
document.getElementById("zoomInBtn").addEventListener("click", function () {
zoomLevel += zoomStep;
if (zoomLevel > maxZoomLevel) {
zoomLevel = maxZoomLevel;
}
updateZoom();
});
// Event listener for the zoom out button
document.getElementById("zoomOutBtn").addEventListener("click", function () {
zoomLevel -= zoomStep;
if (zoomLevel < minZoomLevel) {
zoomLevel = minZoomLevel;
}
updateZoom();
});
function startDragging(event) {
isDragging = true; // Start dragging
startX = event.clientX;
startY = event.clientY;
}
// Event listener for mousemove on the document (applies when dragging)
function dragSVG(event) {
if (isDragging) {
// Calculate the movement
const deltaX = (event.clientX - startX) * 2;
const deltaY = (event.clientY - startY) * 2;
// Retrieve the SVG element from the #scrollableOutput div
const svgElement = document.querySelector("#scrollableOutput svg");
if (svgElement) {
// Get the current translation values from the transform attribute
const transform = svgElement.style.transform || "translate(0, 0)";
const translateMatch = transform.match(
/translate\((-?\d+)px, (-?\d+)px\)/
);
let translateX = translateMatch ? parseInt(translateMatch[1]) : 0;
let translateY = translateMatch ? parseInt(translateMatch[2]) : 0;
translateX += deltaX;
translateY += deltaY;
// Update the SVG transform with the new translation
svgElement.style.transform = `${transform.replace(
/translate\(-?\d+px, -?\d+px\)/,
""
)} translate(${translateX}px, ${translateY}px)`;
// Update the starting positions for the next drag
startX = event.clientX;
startY = event.clientY;
}
}
}
// Function to center the SVG element within the #scrollableOutput div
function centerSVG() {
const scrollableDiv = document.getElementById("scrollableOutput");
const svgElement = document.querySelector("#scrollableOutput svg");
if (svgElement) {
// Calculate the horizontal and vertical offset to center the SVG
const divWidth = scrollableDiv.clientWidth;
const divHeight = scrollableDiv.clientHeight;
const svgWidth = svgElement.getBBox().width;
const svgHeight = svgElement.getBBox().height;
// Calculate the scroll positions to center the SVG
const scrollX = (svgWidth - divWidth) / 2;
const scrollY = (svgHeight - divHeight) / 2;
// Set the scroll positions of the div to center the SVG
scrollableDiv.scrollLeft = scrollX;
scrollableDiv.scrollTop = scrollY;
}
}
document.getElementById("centerSvgButton").addEventListener("click", centerSVG);
// Event listener for mouseup on the document (ends dragging)
function stopDragging() {
isDragging = false;
}
// Event listeners to handle dragging
document.addEventListener("mousedown", (event) => {
// Only start dragging if the mousedown event occurs on the SVG element
const svgElement = document.querySelector("#scrollableOutput svg");
if (svgElement && svgElement.contains(event.target)) {
startDragging(event);
}
});
document.addEventListener("mousemove", dragSVG);
document.addEventListener("mouseup", stopDragging);