Fix Issue 132: properly position selector box when scaling negatively
git-svn-id: http://svg-edit.googlecode.com/svn/trunk@490 eee81c28-f429-11dd-99c0-75d572ba1dddmaster
parent
74c398b151
commit
47d7f769fc
|
@ -1525,17 +1525,18 @@ function SvgCanvas(c)
|
||||||
var ts = null;
|
var ts = null;
|
||||||
var tx = 0, ty = 0;
|
var tx = 0, ty = 0;
|
||||||
var sy = (height+dy)/height, sx = (width+dx)/width;
|
var sy = (height+dy)/height, sx = (width+dx)/width;
|
||||||
|
// if we are dragging on the north side, then adjust the scale factor and ty
|
||||||
if(current_resize_mode.indexOf("n") != -1) {
|
if(current_resize_mode.indexOf("n") != -1) {
|
||||||
sy = (height-dy)/height;
|
sy = (height-dy)/height;
|
||||||
ty = height;
|
ty = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if we dragging on the east side, then adjust the scale factor and tx
|
||||||
if(current_resize_mode.indexOf("w") != -1) {
|
if(current_resize_mode.indexOf("w") != -1) {
|
||||||
sx = (width-dx)/width;
|
sx = (width-dx)/width;
|
||||||
tx = width;
|
tx = width;
|
||||||
}
|
}
|
||||||
|
|
||||||
var selectedBBox = selectedBBoxes[0];
|
|
||||||
|
|
||||||
// find the rotation transform and prepend it
|
// find the rotation transform and prepend it
|
||||||
var ts = [" translate(", (left+tx), ",", (top+ty), ") scale(", sx, ",", sy,
|
var ts = [" translate(", (left+tx), ",", (top+ty), ") scale(", sx, ",", sy,
|
||||||
") translate(", -(left+tx), ",", -(top+ty), ")"].join('');
|
") translate(", -(left+tx), ",", -(top+ty), ")"].join('');
|
||||||
|
@ -1545,24 +1546,48 @@ function SvgCanvas(c)
|
||||||
ts = ["rotate(", angle, " ", cx, ",", cy, ")", ts].join('')
|
ts = ["rotate(", angle, " ", cx, ",", cy, ")", ts].join('')
|
||||||
}
|
}
|
||||||
selected.setAttribute("transform", ts);
|
selected.setAttribute("transform", ts);
|
||||||
|
|
||||||
|
var selectedBBox = selectedBBoxes[0];
|
||||||
|
|
||||||
|
// reset selected bbox top-left position
|
||||||
|
selectedBBox.x = left;
|
||||||
|
selectedBBox.y = top;
|
||||||
|
|
||||||
|
// if this is a translate, adjust the box position
|
||||||
if (tx) {
|
if (tx) {
|
||||||
selectedBBox.x = left+dx;
|
selectedBBox.x += dx;
|
||||||
}
|
}
|
||||||
if (ty) {
|
if (ty) {
|
||||||
selectedBBox.y = top+dy;
|
selectedBBox.y += dy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update box width/height
|
||||||
selectedBBox.width = parseInt(width*sx);
|
selectedBBox.width = parseInt(width*sx);
|
||||||
selectedBBox.height = parseInt(height*sy);
|
selectedBBox.height = parseInt(height*sy);
|
||||||
|
|
||||||
// normalize selectedBBox
|
// normalize selectedBBox
|
||||||
if (selectedBBox.width < 0) {
|
if (selectedBBox.width < 0) {
|
||||||
selectedBBox.x += selectedBBox.width;
|
selectedBBox.width *= -1;
|
||||||
selectedBBox.width *= -1;//-selectedBBox.width;
|
// if we are dragging on the east side and scaled negatively
|
||||||
|
if(current_resize_mode.indexOf("e") != -1 && sx < 0) {
|
||||||
|
selectedBBox.x = box.x - selectedBBox.width;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
selectedBBox.x -= selectedBBox.width;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (selectedBBox.height < 0) {
|
if (selectedBBox.height < 0) {
|
||||||
selectedBBox.y += selectedBBox.height;
|
selectedBBox.height *= -1;
|
||||||
selectedBBox.height *= -1;//-selectedBBox.height;
|
// if we are dragging on the south side and scaled negatively
|
||||||
|
if(current_resize_mode.indexOf("s") != -1 && sy < 0) {
|
||||||
|
selectedBBox.y = box.y - selectedBBox.height;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
selectedBBox.y -= selectedBBox.height;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
selectorManager.requestSelector(selected).resize(selectedBBox);
|
selectorManager.requestSelector(selected).resize(selectedBBox);
|
||||||
break;
|
break;
|
||||||
case "text":
|
case "text":
|
||||||
|
@ -1636,16 +1661,9 @@ function SvgCanvas(c)
|
||||||
|
|
||||||
// if the image is rotated, then we must modify the x,y mouse coordinates
|
// if the image is rotated, then we must modify the x,y mouse coordinates
|
||||||
// and rotate them into the shape's rotated coordinate system
|
// and rotate them into the shape's rotated coordinate system
|
||||||
|
|
||||||
// FIXME: the problem is that the element's rotation is controlled by
|
|
||||||
// two things: an angle and a rotation point (the center of the element).
|
|
||||||
// If the element's bbox is changed, its center changes. In this case,
|
|
||||||
// we keep the rotation center where it is (parse it out from the transform
|
|
||||||
// attribute), and move the poly point appropriately. This looks good while
|
|
||||||
// dragging, but looks funny when you subsequently rotate the element again.
|
|
||||||
var angle = canvas.getRotationAngle(current_poly) * Math.PI / 180.0;
|
var angle = canvas.getRotationAngle(current_poly) * Math.PI / 180.0;
|
||||||
if (angle) {
|
if (angle) {
|
||||||
// extract the shape's (potentially) old 'center' from the transform attribute
|
// calculate the shape's old center that was used for rotation
|
||||||
var box = selectedBBoxes[0];
|
var box = selectedBBoxes[0];
|
||||||
var cx = box.x + box.width/2,
|
var cx = box.x + box.width/2,
|
||||||
cy = box.y + box.height/2;
|
cy = box.y + box.height/2;
|
||||||
|
|
Loading…
Reference in New Issue