Re: SVG dragging problem

Daniel Holbert <[email protected]> Sat, 31 Oct 2009 02:00:30 -0700
Newsgroups gmane.comp.mozilla.devel.svg
Message-ID <[email protected]>
I'm not sure what causes it, but I actually filed a bug on this exact
issue earlier today:
  https://bugzilla.mozilla.org/show_bug.cgi?id=525591

~Daniel

On 10/31/2009 01:50 AM, Giorgio wrote:
> Hi all,
> 
> it is months I am facing an irritating problem in my SVG-based web-
> application. Basically, I am implementing a drag functionality within
> an SVG embedded object. The SVG contains a set of rectangles (with
> text inside them), a set of ellipses (with text) and set of paths
> connecting some elements. Now, the user is able to move rectangles and
> ellipses and the paths are recomputed and drawn in the correct new
> position.
> 
> The issue is that sometimes (actually most of the times), when the
> user tries to drag something, the movement is slowed down and the icon
> of the "official" firefox drag and drop function appears. It seems
> like the handler of firefox drag and drop kicks in.
> 
> In order to clarify the situation I prepared a video http://vimeo.com/7162526
> . The problem appears at the ~23rd sec.
> 
> I hope you can help me out,
> 
> thanks in advance
> 
> Giorgio
> 
> P.S: This is the code I'm using for the drag functionality:
> 
> /**
>  * This function is called at the beginning in order to initialize all
> the
>  * datastructures.
>  */
> function Init(obj) {
> 	SVGDocument = obj.ownerDocument;
> 	SVGRoot = SVGDocument.documentElement;
> 	TrueCoords = SVGRoot.createSVGPoint();
> 	GrabPoint = SVGRoot.createSVGPoint();
> 	lines = new Array();
> 	newX = 0;
> 	newY = 0;
> 	isMoving = false;
> }
> 
> /**
>  * This function is called when a concept is clicked for moving. It
> firstly
>  * removes lines that are connected to the concept, then it activates
> other
>  * event listners.
>  *
>  * @param evt
>  *            the event mousedown generating the call.
>  */
> function move(evt) {
> 	if (!evt)
> 		return;
> 	query = top.getQuery();
> 	var group = evt.element().parentNode;
> 	transMatrix = group.getCTM();
> 	GrabPoint.x = evt.pointerX() - Number(transMatrix.e);
> 	GrabPoint.y = evt.pointerY() - Number(transMatrix.f);
> 	setLines(evt.element().id);
> 	document.addEventListener("mousemove", moving, true);
> 	document.addEventListener("mouseup", mouseUp, true);
> 	document.addEventListener("mouseout", mouseUp, true);
> 	evt.stopPropagation()
> }
> 
> 
> /**
>  * This function is called when a concept is being dragged around.
>  *
>  * @param evt
>  *            the event generating the call
>  */
> function moving(evt) {
> 	evt = evt || window.event;
> 	getTrueCoords(evt);
> 	if (TrueCoords.x == GrabPoint.x && TrueCoords.y == GrabPoint.y) {
> 		isMoving = false;
> 	} else {
> 		isMoving = true;
> 	}
> 	newX = TrueCoords.x - GrabPoint.x;
> 	newY = TrueCoords.y - GrabPoint.y;
> 	if (evt.element().parentNode) {
> 		evt.element().parentNode.setAttribute('transform', 'translate(' +
> newX
> 				+ ',' + newY + ')');
> 		evt.element().parentNode.setAttribute('dragx', newX);
> 		evt.element().parentNode.setAttribute('dragy', newY);
> 	}
>         //lines are redrawn here
> 	evt.stopPropagation()
> 
> }
> 
> /**
>  * This function is called when the element is standing.
>  *
>  * @param evt
>  *            the event generating the call.
>  */
> function mouseUp(evt) {
> 
> 	isMoving = false;
> 	document.removeEventListener("mousemove", moving, true);
> 	document.removeEventListener("mouseup", mouseUp, true);
> 	document.removeEventListener("mouseout", mouseUp, true);
> }
> 
> function getTrueCoords(evt) {
> 	// find the current zoom level and pan setting, and adjust the
> reported
> 	// mouse position accordingly
> 	var newScale = SVGRoot.currentScale;
> 	var translation = SVGRoot.currentTranslate;
> 	TrueCoords.x = (evt.pointerX() - translation.x) / newScale;
> 	TrueCoords.y = (evt.pointerY() - translation.y) / newScale;
> };
> _______________________________________________
> dev-tech-svg mailing list
> [email protected]
> https://lists.mozilla.org/listinfo/dev-tech-svg