Track current poly. Toggle between select and polyedit mode when clicking on the currently selected poly. polyedit mode does nothing now but show the points

git-svn-id: http://svg-edit.googlecode.com/svn/trunk@366 eee81c28-f429-11dd-99c0-75d572ba1ddd
master
Jeff Schiller 2009-08-08 14:03:14 +00:00
parent dfb022fe6f
commit 6cb95656e0
1 changed files with 98 additions and 36 deletions

View File

@ -472,6 +472,7 @@ function SvgCanvas(c)
var freehand_max_x = null;
var freehand_min_y = null;
var freehand_max_y = null;
var current_poly = null;
var current_poly_pts = [];
// this will hold all the currently selected elements
// default size of 1 until it needs to grow bigger
@ -926,7 +927,7 @@ function SvgCanvas(c)
canvas.clearSelection();
canvas.addToSelection([t]);
}
// else the user is going to manipulate the selected elements
// else if it's a poly, go into polyedit mode in mouseup
}
else {
canvas.clearSelection();
@ -1079,6 +1080,9 @@ function SvgCanvas(c)
case "poly":
started = true;
break;
case "polyedit":
started = true;
break;
default:
console.log("Unknown mode in mousedown: " + current_mode);
break;
@ -1106,16 +1110,18 @@ function SvgCanvas(c)
if (selectedElements[0] != null) {
var dx = x - start_x;
var dy = y - start_y;
var ts = ["translate(",dx,",",dy,")"].join('');
var len = selectedElements.length;
for (var i = 0; i < len; ++i) {
var selected = selectedElements[i];
if (selected == null) break;
selected.setAttribute("transform", ts);
var box = selected.getBBox();
box.x += dx; box.y += dy;
selectorManager.requestSelector(selected).resize(box);
selectedBBoxes[i] = box;
if (dx != 0 || dy != 0) {
var ts = ["translate(",dx,",",dy,")"].join('');
var len = selectedElements.length;
for (var i = 0; i < len; ++i) {
var selected = selectedElements[i];
if (selected == null) break;
selected.setAttribute("transform", ts);
var box = selected.getBBox();
box.x += dx; box.y += dy;
selectorManager.requestSelector(selected).resize(box);
selectedBBoxes[i] = box;
}
}
}
break;
@ -1277,16 +1283,24 @@ function SvgCanvas(c)
// call("changed", selected);
};
// TODO: when a shape is moved via keystroke, it is not undo-able
// TODO: when a poly is selected, must loop through 'd' and populate current_poly_pts
// TODO: when a poly is selected, call addAllPointGripsToPoly
var removeAllPointGripsFromPoly = function() {
// loop through and hide all pointgrips
var i = current_poly_pts.length/2;
while(i--) {
document.getElementById("polypointgrip_"+i).setAttribute("display", "none");
}
};
var addAllPointGripsToPoly = function() {
// TODO: loop through all points in poly
// TODO: for each point, find the pointgrip element
// TODO: set the pointgrip element's x,y
// TODO: set the pointgrip display to inline
// loop through and hide all pointgrips
var i = current_poly_pts.length;
while(i) {
i -= 2;
var grip = document.getElementById("polypointgrip_"+i/2);
grip.setAttribute("cx", current_poly_pts[i]);
grip.setAttribute("cy", current_poly_pts[i+1]);
grip.setAttribute("display", "inline");
}
};
var addPointGripToPoly = function(x,y) {
@ -1317,7 +1331,7 @@ function SvgCanvas(c)
// TODO: set up mouse event handlers for dragging (mousedown to set polypoint drag mode)
var grip = $('#polypointgrip_'+index);
grip.mouseover( function() { console.log(this); this.setAttribute("stroke", "#F00"); } );
grip.mouseover( function() { this.setAttribute("stroke", "#F00"); } );
grip.mouseout( function() {this.setAttribute("stroke", "#00F"); } );
// grip.mousedown( function()
}
@ -1337,6 +1351,9 @@ function SvgCanvas(c)
{
if (!started) return;
var x = evt.pageX - container.parentNode.offsetLeft + container.parentNode.scrollLeft;
var y = evt.pageY - container.parentNode.offsetTop + container.parentNode.scrollTop;
started = false;
var element = svgdoc.getElementById(getId());
var keep = false;
@ -1368,11 +1385,57 @@ function SvgCanvas(c)
selectorManager.requestSelector(selected).showGrips(selected.tagName != "text");
}
recalculateAllSelectedDimensions();
var len = selectedElements.length;
for(var i = 0; i < len; ++i) {
if (selectedElements[i] == null) break;
selectorManager.requestSelector(selectedElements[i]).resize(selectedBBoxes[i]);
// if it was being dragged/resized
if (x != start_x || y != start_y) {
recalculateAllSelectedDimensions();
var len = selectedElements.length;
for (var i = 0; i < len; ++i) {
if (selectedElements[i] == null) break;
selectorManager.requestSelector(selectedElements[i]).resize(selectedBBoxes[i]);
}
}
// no change in position/size, so maybe we should move to polyedit
else {
// TODO: this causes a poly that was just going to be selected to go straight to polyedit
if (selectedElements[0].nodeName == "path" && selectedElements[1] == null) {
var t = evt.target;
if (current_poly == t) {
current_mode = "polyedit";
// recalculate current_poly_pts
current_poly_pts = [];
var segList = t.pathSegList;
var curx = segList.getItem(0).x, cury = segList.getItem(0).y;
current_poly_pts.push(curx);
current_poly_pts.push(cury);
var len = segList.numberOfItems;
for (var i = 1; i < len; ++i) {
var l = segList.getItem(i);
var x = l.x, y = l.y;
// polys can now be closed, skip Z segments
if (l.pathSegType == 1) {
break;
}
var type = l.pathSegType;
// current_poly_pts just holds the absolute coords
if (type == 4) {
curx = x;
cury = y;
} // type 4 (abs line)
else if (type == 5) {
curx += x;
cury += y;
} // type 5 (rel line)
current_poly_pts.push(curx);
current_poly_pts.push(cury);
} // for each segment
canvas.clearSelection();
addAllPointGripsToPoly();
} // going into polyedit mode
else {
current_poly = t;
}
} // no change in mouse position
}
}
// we return immediately from select so that the obj_num is not incremented
@ -1451,9 +1514,6 @@ function SvgCanvas(c)
canvas.addToSelection([element]);
break;
case "poly":
var x = evt.pageX - container.parentNode.offsetLeft + container.parentNode.scrollLeft;
var y = evt.pageY - container.parentNode.offsetTop + container.parentNode.scrollTop;
// set element to null here so that it is not removed nor finalized
element = null;
// continue to be set to true so that mouseMove happens
@ -1524,18 +1584,13 @@ function SvgCanvas(c)
poly.setAttribute("d", d_attr + "z");
}
// loop through and hide all pointgrips
var i = current_poly_pts.length/2;
while(i--) {
console.log(i);
document.getElementById("polypointgrip_"+i).setAttribute("display", "none");
}
removeAllPointGripsFromPoly();
document.getElementById("poly_stretch_line").setAttribute("display", "none");
// this will signal to commit the poly
element = poly;
current_poly_pts = [];
started = false;
document.getElementById("poly_stretch_line").setAttribute("display", "none");
}
// else, create a new point, append to pts array, update path element
else {
@ -1559,6 +1614,13 @@ function SvgCanvas(c)
keep = true;
}
break;
case "polyedit":
keep = true;
element = null;
current_mode = "select";
removeAllPointGripsFromPoly();
canvas.addToSelection([evt.target]);
break;
default:
console.log("Unknown mode in mouseup: " + current_mode);
break;