Drag & resize a rect - newbie problem


Posted by alexd apropos on Tue Jul 24th, 2007 at 12:49:19 BST

I'm trying to build a geographic search engine with SVG, PHP, and JavaScript. It's all going well except the JS. I've worked some with SVG in the past, but I'm completely new to JavaScript - as my horrible code below will show. It's based on Jeff Schiller's drag example, but I'm trying to modify it to support resizing as well via a little resize-box on the bottom right of the rectangle selection, and it's proving to be much more difficult than I thought (although since it's me, that's not saying much). Any help would be appreciated...

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="init()" onmousemove="mouseMove(evt)" viewBox="114 35 6 7" preserveAspectRatio="xMidYMid meet"> <script><![CDATA[ var bMouseDragging = false; var mouseOffsetX = 0; var mouseOffsetY = 0; var rMouseOffsetX = 0; var rMouseOffsetY = 0; function mouseDown(evt) { bMouseDragging = true; var frame = document.getElementById("frame"); var resizer = document.getElementById("resizer"); var point = document.documentElement.createSVGPoint(); var pos = frame.getScreenCTM(); point.x = evt.clientX; point.y = evt.clientY; point = point.matrixTransform(pos.inverse()); if (evt.target == frame) { mouseOffsetX = point.x - parseInt(frame.getAttribute("x")); mouseOffsetY = point.y - parseInt(frame.getAttribute("y")); } if (evt.target == resizer) { mouseOffsetX = point.x - parseInt(resizer.getAttribute("x")); mouseOffsetY = point.y - parseInt(resizer.getAttribute("y")); rMouseOffsetX = point.x - parseInt(frame.getAttribute("x")) - parseInt(frame.getAttribute("width")); rMouseOffsetY = point.y - parseInt(frame.getAttribute("y")) - parseInt(frame.getAttribute("height")); } } function mouseUp(evt) { bMouseDragging = false; } function mouseMove(evt) { var staticPoint = document.documentElement.createSVGPoint(); var point = document.documentElement.createSVGPoint(); point.x = evt.clientX; point.y = evt.clientY; if (bMouseDragging) { var frame = document.getElementById("frame"); var resizer = document.getElementById("resizer"); var currentFrameW = parseFloat(frame.getAttribute("stickyWidth")); var currentFrameH = parseFloat(frame.getAttribute("stickyHeight")); var currentResizerW = parseFloat(resizer.getAttribute("width")); var currentResizerH = parseFloat(resizer.getAttribute("height")); if (evt.target == frame) { var frame_pos = frame.getScreenCTM(); point = point.matrixTransform(frame_pos.inverse()); frame.setAttribute("x", point.x - mouseOffsetX); frame.setAttribute("y", point.y - mouseOffsetY); resizer.setAttribute("x", point.x + currentFrameW - currentResizerW - mouseOffsetX); resizer.setAttribute("y", point.y + currentFrameH - currentResizerH - mouseOffsetY); } if (evt.target == resizer) { var resizer_pos = resizer.getScreenCTM(); point = point.matrixTransform(resizer_pos.inverse()); resizer.setAttribute("x", point.x - mouseOffsetX); resizer.setAttribute("y", point.y - mouseOffsetY); frame.setAttribute("width", currentFrameW + rMouseOffsetX); frame.setAttribute("height", currentFrameH + rMouseOffsetY); frame.setAttribute("stickyWidth", frame.getAttribute("width")); frame.setAttribute("stickyHeight", frame.getAttribute("height")); } } var x1 = parseFloat(frame.getAttribute("x")); var y1 = parseFloat(frame.getAttribute("y")); var x2 = x1 + parseFloat(frame.getAttribute("width")); var y2 = y1 + parseFloat(frame.getAttribute("height")); var numDigits = 4; x1 = x1.toFixed(numDigits); x2 = x2.toFixed(numDigits); y1 = y1.toFixed(numDigits); y2 = y2.toFixed(numDigits); displayCoords(x1, y1, x2, y2); } function displayCoords(x1, y1, x2, y2) { var x1Form = parent.document.getElementById("x1"); var y1Form = parent.document.getElementById("y1"); var x2Form = parent.document.getElementById("x2"); var y2Form = parent.document.getElementById("y2"); var x1Print = parent.document.getElementById("printX1"); var y1Print = parent.document.getElementById("printY1"); var x2Print = parent.document.getElementById("printX2"); var y2Print = parent.document.getElementById("printY2"); x1Form.value = x1; y1Form.value = y1; x2Form.value = x2; y2Form.value = y2; x1Print.innerHTML = x1; y1Print.innerHTML = y1; x2Print.innerHTML = x2; y2Print.innerHTML = y2; } function init() { var frame = document.getElementById("frame"); var resizer = document.getElementById("resizer"); if (frame) { frame.addEventListener("mousedown", mouseDown, false); frame.addEventListener("mouseup", mouseUp, false); frame.addEventListener("mousemove", mouseMove, false); } if (resizer) { resizer.addEventListener("mousedown", mouseDown, false); resizer.addEventListener("mouseup", mouseUp, false); resizer.addEventListener("mousemove", mouseMove, false); } } ]]></script> <rect id="background" x="112" y="35" fill="#e0e0e0" width="12" height="8"> <rect id="frame" fill="blue" fill-opacity="0.2" x="115.55" y="37.5" width="3" height="2" stickyWidth="3" stickyHeight="2" stroke="#9090ff" stroke-width="0.025"> <rect id="resizer" fill="black" opacity="0.2" x="118.25" y="39.2" width="0.3" height="0.3"> </svg>
Display: Sort:
Eeeck (3.00 / 1) (#3)
by drew27 on Tue Sep 11th, 2007 at 14:12:39 BST
(User Info) http://www.eco2you.co.uk
That sounds really complicated, just looking at that code makes my eyes hurt!
Best of luck with it!
Drew Thank you, Drew

Oops (none / 0) (#1)
by alexd on Tue Jul 24th, 2007 at 12:54:05 BST
(User Info)

Sorry, I screwed up the formatting and there's no way to edit posts, and no way to post formatted code in comments. :(

  • Resizer by DesertDawg, 08/03/2007 02:28:10 BST (none / 0)
Display: Sort:
Login

Make a new account

Username:
Password: