mirror of
https://github.com/konvajs/konva.git
synced 2026-01-07 01:54:35 +08:00
fixed closePath bug with Path shape, added getters and setters, and added another path unit test
This commit is contained in:
35
dist/kinetic-core.js
vendored
35
dist/kinetic-core.js
vendored
@@ -4107,24 +4107,29 @@ Kinetic.Path = function(config) {
|
|||||||
context.moveTo(p[0], p[1]);
|
context.moveTo(p[0], p[1]);
|
||||||
break;
|
break;
|
||||||
case 'z':
|
case 'z':
|
||||||
context.closePath();
|
context.closePath();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.fill();
|
this.fill();
|
||||||
this.stroke();
|
this.stroke();
|
||||||
};
|
};
|
||||||
// call super constructor
|
// call super constructor
|
||||||
Kinetic.Shape.apply(this, [config]);
|
Kinetic.Shape.apply(this, [config]);
|
||||||
|
|
||||||
this.setCommandsArray();
|
this.commandsArray = this.getCommandsArray();
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
* Path methods
|
* Path methods
|
||||||
*/
|
*/
|
||||||
Kinetic.Path.prototype = {
|
Kinetic.Path.prototype = {
|
||||||
setCommandsArray: function() {
|
/**
|
||||||
|
* get parsed commands array from the commands
|
||||||
|
* string. V, v, H, h, and l commands are converted to
|
||||||
|
* L commands for the purpose of high performance Path
|
||||||
|
* rendering
|
||||||
|
*/
|
||||||
|
getCommandsArray: function() {
|
||||||
var c = this.attrs.commands;
|
var c = this.attrs.commands;
|
||||||
// command chars
|
// command chars
|
||||||
var cc = ['M', 'l', 'L', 'v', 'V', 'h', 'H', 'z'];
|
var cc = ['M', 'l', 'L', 'v', 'V', 'h', 'H', 'z'];
|
||||||
@@ -4156,7 +4161,7 @@ Kinetic.Path.prototype = {
|
|||||||
points: points
|
points: points
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// convert l, h, and v to L
|
// convert l, H, h, V, and v to L
|
||||||
var cpx = 0;
|
var cpx = 0;
|
||||||
var cpy = 0;
|
var cpy = 0;
|
||||||
for(var n = 0; n < ca.length; n++) {
|
for(var n = 0; n < ca.length; n++) {
|
||||||
@@ -4191,13 +4196,29 @@ Kinetic.Path.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reassign command
|
// reassign command
|
||||||
if(c !== 'L' && c !== 'M') {
|
if(c == 'l' || c == 'V' || c == 'v' || c == 'H' || c == 'h') {
|
||||||
ca[n].command = 'L';
|
ca[n].command = 'L';
|
||||||
ca[n].points[0] = cpx;
|
ca[n].points[0] = cpx;
|
||||||
ca[n].points[1] = cpy;
|
ca[n].points[1] = cpy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.commandsArray = ca;
|
return ca;
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* get SVG path commands string
|
||||||
|
*/
|
||||||
|
getCommands: function() {
|
||||||
|
return this.attrs.commands;
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* set SVG path commands string. This method
|
||||||
|
* also automatically parses the commands string
|
||||||
|
* into a commands array. Currently supported SVG commands:
|
||||||
|
* M, L, l, H, h, V, v, z
|
||||||
|
*/
|
||||||
|
setCommands: function(commands) {
|
||||||
|
this.attrs.commands = commands;
|
||||||
|
this.commandsArray = this.getCommandsArray();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
2
dist/kinetic-core.min.js
vendored
2
dist/kinetic-core.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -30,24 +30,29 @@ Kinetic.Path = function(config) {
|
|||||||
context.moveTo(p[0], p[1]);
|
context.moveTo(p[0], p[1]);
|
||||||
break;
|
break;
|
||||||
case 'z':
|
case 'z':
|
||||||
context.closePath();
|
context.closePath();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.fill();
|
this.fill();
|
||||||
this.stroke();
|
this.stroke();
|
||||||
};
|
};
|
||||||
// call super constructor
|
// call super constructor
|
||||||
Kinetic.Shape.apply(this, [config]);
|
Kinetic.Shape.apply(this, [config]);
|
||||||
|
|
||||||
this.setCommandsArray();
|
this.commandsArray = this.getCommandsArray();
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
* Path methods
|
* Path methods
|
||||||
*/
|
*/
|
||||||
Kinetic.Path.prototype = {
|
Kinetic.Path.prototype = {
|
||||||
setCommandsArray: function() {
|
/**
|
||||||
|
* get parsed commands array from the commands
|
||||||
|
* string. V, v, H, h, and l commands are converted to
|
||||||
|
* L commands for the purpose of high performance Path
|
||||||
|
* rendering
|
||||||
|
*/
|
||||||
|
getCommandsArray: function() {
|
||||||
var c = this.attrs.commands;
|
var c = this.attrs.commands;
|
||||||
// command chars
|
// command chars
|
||||||
var cc = ['M', 'l', 'L', 'v', 'V', 'h', 'H', 'z'];
|
var cc = ['M', 'l', 'L', 'v', 'V', 'h', 'H', 'z'];
|
||||||
@@ -79,7 +84,7 @@ Kinetic.Path.prototype = {
|
|||||||
points: points
|
points: points
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// convert l, h, and v to L
|
// convert l, H, h, V, and v to L
|
||||||
var cpx = 0;
|
var cpx = 0;
|
||||||
var cpy = 0;
|
var cpy = 0;
|
||||||
for(var n = 0; n < ca.length; n++) {
|
for(var n = 0; n < ca.length; n++) {
|
||||||
@@ -114,13 +119,29 @@ Kinetic.Path.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reassign command
|
// reassign command
|
||||||
if(c !== 'L' && c !== 'M') {
|
if(c == 'l' || c == 'V' || c == 'v' || c == 'H' || c == 'h') {
|
||||||
ca[n].command = 'L';
|
ca[n].command = 'L';
|
||||||
ca[n].points[0] = cpx;
|
ca[n].points[0] = cpx;
|
||||||
ca[n].points[1] = cpy;
|
ca[n].points[1] = cpy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.commandsArray = ca;
|
return ca;
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* get SVG path commands string
|
||||||
|
*/
|
||||||
|
getCommands: function() {
|
||||||
|
return this.attrs.commands;
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* set SVG path commands string. This method
|
||||||
|
* also automatically parses the commands string
|
||||||
|
* into a commands array. Currently supported SVG commands:
|
||||||
|
* M, L, l, H, h, V, v, z
|
||||||
|
*/
|
||||||
|
setCommands: function(commands) {
|
||||||
|
this.attrs.commands = commands;
|
||||||
|
this.commandsArray = this.getCommandsArray();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -183,7 +183,6 @@ Test.prototype.tests = {
|
|||||||
group.add(circle);
|
group.add(circle);
|
||||||
layer.draw();
|
layer.draw();
|
||||||
|
|
||||||
|
|
||||||
var expectedJson = '{"attrs":{"width":578,"height":200,"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Stage","children":[{"attrs":{"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Layer","children":[{"attrs":{"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Group","children":[{"attrs":{"radius":70,"fill":"green","stroke":"black","strokeWidth":4,"detectionType":"path","shadow":{"blur":10,"alpha":1,"offset":{"x":0,"y":0}},"visible":true,"listening":true,"name":"myCircle","alpha":1,"x":289,"y":100,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":true},"nodeType":"Shape","shapeType":"Circle"}]}]}]}';
|
var expectedJson = '{"attrs":{"width":578,"height":200,"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Stage","children":[{"attrs":{"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Layer","children":[{"attrs":{"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Group","children":[{"attrs":{"radius":70,"fill":"green","stroke":"black","strokeWidth":4,"detectionType":"path","shadow":{"blur":10,"alpha":1,"offset":{"x":0,"y":0}},"visible":true,"listening":true,"name":"myCircle","alpha":1,"x":289,"y":100,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":true},"nodeType":"Shape","shapeType":"Circle"}]}]}]}';
|
||||||
test(stage.toJSON() === expectedJson, 'problem with serialization');
|
test(stage.toJSON() === expectedJson, 'problem with serialization');
|
||||||
},
|
},
|
||||||
@@ -306,7 +305,6 @@ Test.prototype.tests = {
|
|||||||
group.add(triangle);
|
group.add(triangle);
|
||||||
layer.draw();
|
layer.draw();
|
||||||
|
|
||||||
|
|
||||||
var expectedJson = '{"attrs":{"width":578,"height":200,"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Stage","children":[{"attrs":{"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Layer","children":[{"attrs":{"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Group","children":[{"attrs":{"fill":"#00D2FF","stroke":"black","strokeWidth":4,"detectionType":"path","shadow":{"blur":10,"alpha":1,"offset":{"x":0,"y":0}},"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false,"id":"myTriangle"},"nodeType":"Shape"}]}]}]}';
|
var expectedJson = '{"attrs":{"width":578,"height":200,"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Stage","children":[{"attrs":{"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Layer","children":[{"attrs":{"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Group","children":[{"attrs":{"fill":"#00D2FF","stroke":"black","strokeWidth":4,"detectionType":"path","shadow":{"blur":10,"alpha":1,"offset":{"x":0,"y":0}},"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false,"id":"myTriangle"},"nodeType":"Shape"}]}]}]}';
|
||||||
test(stage.toJSON() === expectedJson, "problem serializing stage with custom shape");
|
test(stage.toJSON() === expectedJson, "problem serializing stage with custom shape");
|
||||||
},
|
},
|
||||||
@@ -771,7 +769,7 @@ Test.prototype.tests = {
|
|||||||
stage.add(layer);
|
stage.add(layer);
|
||||||
|
|
||||||
var json = stage.toJSON();
|
var json = stage.toJSON();
|
||||||
|
|
||||||
test(json === '{"attrs":{"width":578,"height":200,"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Stage","children":[{"attrs":{"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Layer","children":[{"attrs":{"crop":{"x":0,"y":0},"detectionType":"path","shadow":{"blur":10,"alpha":1,"offset":{"x":0,"y":0}},"visible":true,"listening":true,"alpha":1,"x":200,"y":60,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":50,"y":150},"dragConstraint":"none","dragBounds":{},"draggable":false,"id":"darth"},"nodeType":"Shape","shapeType":"Image"}]}]}');
|
test(json === '{"attrs":{"width":578,"height":200,"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Stage","children":[{"attrs":{"throttle":80,"visible":true,"listening":true,"alpha":1,"x":0,"y":0,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":0,"y":0},"dragConstraint":"none","dragBounds":{},"draggable":false},"nodeType":"Layer","children":[{"attrs":{"crop":{"x":0,"y":0},"detectionType":"path","shadow":{"blur":10,"alpha":1,"offset":{"x":0,"y":0}},"visible":true,"listening":true,"alpha":1,"x":200,"y":60,"scale":{"x":1,"y":1},"rotation":0,"centerOffset":{"x":50,"y":150},"dragConstraint":"none","dragBounds":{},"draggable":false,"id":"darth"},"nodeType":"Shape","shapeType":"Image"}]}]}');
|
||||||
};
|
};
|
||||||
imageObj.src = '../darth-vader.jpg';
|
imageObj.src = '../darth-vader.jpg';
|
||||||
@@ -1172,7 +1170,57 @@ Test.prototype.tests = {
|
|||||||
});
|
});
|
||||||
//stage.start();
|
//stage.start();
|
||||||
},
|
},
|
||||||
'SHAPE - add path': function(containerId) {
|
'SHAPE - add simple path': function(containerId) {
|
||||||
|
var stage = new Kinetic.Stage({
|
||||||
|
container: containerId,
|
||||||
|
width: 1024,
|
||||||
|
height: 480,
|
||||||
|
scale: 0.5,
|
||||||
|
x: 50,
|
||||||
|
y: 10
|
||||||
|
});
|
||||||
|
var layer = new Kinetic.Layer();
|
||||||
|
|
||||||
|
var path = new Kinetic.Path({
|
||||||
|
commands: 'M200,100h100v50z',
|
||||||
|
fill: '#ccc',
|
||||||
|
stroke: '#333',
|
||||||
|
strokeWidth: 2,
|
||||||
|
shadow: {
|
||||||
|
color: 'black',
|
||||||
|
blur: 2,
|
||||||
|
offset: [10, 10],
|
||||||
|
alpha: 0.5
|
||||||
|
},
|
||||||
|
draggable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
path.on('mouseover', function() {
|
||||||
|
this.setFill('red');
|
||||||
|
layer.draw();
|
||||||
|
});
|
||||||
|
|
||||||
|
path.on('mouseout', function() {
|
||||||
|
this.setFill('#ccc');
|
||||||
|
layer.draw();
|
||||||
|
});
|
||||||
|
|
||||||
|
layer.add(path);
|
||||||
|
|
||||||
|
stage.add(layer);
|
||||||
|
|
||||||
|
test(path.getCommands() === 'M200,100h100v50z', 'commands are incorrect');
|
||||||
|
test(path.getCommandsArray().length === 4, 'commands array should have 4 elements');
|
||||||
|
|
||||||
|
path.setCommands('M200');
|
||||||
|
|
||||||
|
test(path.getCommands() === 'M200', 'commands are incorrect');
|
||||||
|
test(path.getCommandsArray().length === 1, 'commands array should have 1 element');
|
||||||
|
|
||||||
|
path.setCommands('M200,100h100v50z');
|
||||||
|
|
||||||
|
},
|
||||||
|
'SHAPE - add map path': function(containerId) {
|
||||||
var stage = new Kinetic.Stage({
|
var stage = new Kinetic.Stage({
|
||||||
container: containerId,
|
container: containerId,
|
||||||
width: 1024,
|
width: 1024,
|
||||||
@@ -1193,12 +1241,12 @@ Test.prototype.tests = {
|
|||||||
stroke: '#999',
|
stroke: '#999',
|
||||||
strokeWidth: 1,
|
strokeWidth: 1,
|
||||||
/*
|
/*
|
||||||
shadow: {
|
shadow: {
|
||||||
color: 'black',
|
color: 'black',
|
||||||
blur: 2,
|
blur: 2,
|
||||||
offset: [10, 10]
|
offset: [10, 10]
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
});
|
});
|
||||||
|
|
||||||
path.on('mouseover', function() {
|
path.on('mouseover', function() {
|
||||||
@@ -1214,7 +1262,7 @@ Test.prototype.tests = {
|
|||||||
|
|
||||||
mapLayer.add(path);
|
mapLayer.add(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
stage.add(mapLayer);
|
stage.add(mapLayer);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user