Files
konva/src/plugins/Label.js

303 lines
9.5 KiB
JavaScript
Raw Normal View History

2013-03-15 23:35:40 -07:00
(function() {
// constants
var ATTR_CHANGE_LIST = ['fontFamily', 'fontSize', 'fontStyle', 'padding', 'lineHeight', 'text'],
CHANGE_KINETIC = 'Change.kinetic',
NONE = 'none',
UP = 'up',
RIGHT = 'right',
DOWN = 'down',
LEFT = 'left',
LABEL = 'Label',
// cached variables
attrChangeListLen = ATTR_CHANGE_LIST.length;
2013-03-15 23:35:40 -07:00
/**
2013-05-18 22:30:57 -07:00
* Label constructor.  Labels are groups that contain a Text and Tag shape
2013-03-15 23:35:40 -07:00
* @constructor
2013-05-16 00:28:49 -07:00
* @memberof Kinetic
2013-03-15 23:35:40 -07:00
* @param {Object} config
2013-04-06 22:06:11 -07:00
* @param {Object} config.text Text config
* @param {String} [config.text.fontFamily] default is Calibri
* @param {Number} [config.text.fontSize] in pixels. Default is 12
* @param {String} [config.text.fontStyle] can be normal, bold, or italic. Default is normal
2013-04-06 22:06:11 -07:00
* @param {String} config.text.text
* @param {String} [config.text.align] can be left, center, or right
* @param {Number} [config.text.padding]
* @param {Number} [config.text.lineHeight] default is 1
2013-05-18 22:30:57 -07:00
* @param {Object} [config.tag] Tag config
* @param {String} [config.tag.pointerDirection] can be up, right, down, left, or none; the default
2013-04-06 22:06:11 -07:00
* is none. When a pointer is present, the positioning of the label is relative to the tip of the pointer.
2013-05-18 22:30:57 -07:00
* @param {Number} [config.tag.pointerWidth]
* @param {Number} [config.tag.pointerHeight]
* @param {Number} [config.tag.cornerRadius]
2013-03-15 23:35:40 -07:00
* {{NodeParams}}
2013-05-18 22:30:57 -07:00
* @example
* // create label
2013-05-18 22:30:57 -07:00
* var label = new Kinetic.Label({<br>
* x: 100,<br>
* y: 100, <br>
* draggable: true<br>
2013-05-18 22:30:57 -07:00
* });<br><br>
*
* // add a tag to the label<br>
* label.add(new Kinetic.Tag({<br>
* fill: '#bbb',<br>
* stroke: '#333',<br>
* shadowColor: 'black',<br>
* shadowBlur: 10,<br>
* shadowOffset: [10, 10],<br>
* shadowOpacity: 0.2,<br>
* lineJoin: 'round',<br>
* pointerDirection: 'up',<br>
* pointerWidth: 20,<br>
* pointerHeight: 20,<br>
* cornerRadius: 5<br>
* }));<br><br>
*
* // add text to the label<br>
* label.add(new Kinetic.Text({<br>
* text: 'Hello World!',<br>
* fontSize: 50,<br>
* lineHeight: 1.2,<br>
* padding: 10,<br>
* fill: 'green'<br>
* }));
2013-03-15 23:35:40 -07:00
*/
Kinetic.Label = function(config) {
2013-03-15 23:35:40 -07:00
this._initLabel(config);
};
Kinetic.Label.prototype = {
2013-03-15 23:35:40 -07:00
_initLabel: function(config) {
var that = this;
2013-03-15 23:35:40 -07:00
this.createAttrs();
this.className = LABEL;
Kinetic.Group.call(this, config);
this.on('add', function(evt) {
that._addListeners(evt.child);
that._sync();
});
},
/**
* get Text shape for the label. You need to access the Text shape in order to update
* the text properties
* @name getText
* @method
* @memberof Kinetic.Label.prototype
*/
getText: function() {
return this.get('Text')[0];
},
/**
* get Tag shape for the label. You need to access the Tag shape in order to update
* the pointer properties and the corner radius
* @name getTag
* @method
* @memberof Kinetic.Label.prototype
*/
getTag: function() {
return this.get('Tag')[0];
},
_addListeners: function(context) {
var that = this,
n;
// update text data for certain attr changes
for(n = 0; n < attrChangeListLen; n++) {
context.on(ATTR_CHANGE_LIST[n] + CHANGE_KINETIC, function() {
that._sync();
});
}
},
getWidth: function() {
return this.getText().getWidth();
},
getHeight: function() {
return this.getText().getHeight();
},
_sync: function() {
var text = this.getText(),
2013-05-18 22:30:57 -07:00
tag = this.getTag(),
width, height, pointerDirection, pointerWidth, x, y;
if (text && tag) {
width = text.getWidth(),
height = text.getHeight(),
2013-05-18 22:30:57 -07:00
pointerDirection = tag.getPointerDirection(),
pointerWidth = tag.getPointerWidth(),
pointerHeight = tag.getPointerHeight(),
x = 0,
y = 0;
switch(pointerDirection) {
case UP:
x = width / 2;
y = -1 * pointerHeight;
break;
case RIGHT:
x = width + pointerWidth;
y = height / 2;
break;
case DOWN:
x = width / 2;
y = height + pointerHeight;
break;
case LEFT:
x = -1 * pointerWidth;
y = height / 2;
break;
}
tag.setAttrs({
width: width,
height: height
});
}
2013-03-15 23:35:40 -07:00
}
};
2013-05-16 00:28:49 -07:00
Kinetic.Util.extend(Kinetic.Label, Kinetic.Group);
2013-04-06 22:06:11 -07:00
/**
2013-05-18 22:30:57 -07:00
* Tag constructor.&nbsp; A Tag can be configured
2013-04-06 22:06:11 -07:00
* to have a pointer element that points up, right, down, or left
* @constructor
2013-05-16 00:28:49 -07:00
* @memberof Kinetic
2013-04-06 22:06:11 -07:00
* @param {Object} config
* @param {String} [config.pointerDirection] can be up, right, down, left, or none; the default
* is none. When a pointer is present, the positioning of the label is relative to the tip of the pointer.
* @param {Number} [config.pointerWidth]
* @param {Number} [config.pointerHeight]
* @param {Number} [config.cornerRadius]
*/
2013-05-18 22:30:57 -07:00
Kinetic.Tag = function(config) {
this._initTag(config);
};
2013-05-18 22:30:57 -07:00
Kinetic.Tag.prototype = {
_initTag: function(config) {
this.createAttrs();
Kinetic.Shape.call(this, config);
this.className = 'Tag';
this._setDrawFuncs();
},
drawFunc: function(canvas) {
var context = canvas.getContext(),
width = this.getWidth(),
height = this.getHeight(),
pointerDirection = this.getPointerDirection(),
pointerWidth = this.getPointerWidth(),
pointerHeight = this.getPointerHeight(),
cornerRadius = this.getCornerRadius();
context.beginPath();
context.moveTo(0,0);
if (pointerDirection === UP) {
context.lineTo((width - pointerWidth)/2, 0);
context.lineTo(width/2, -1 * pointerHeight);
context.lineTo((width + pointerWidth)/2, 0);
}
context.lineTo(width, 0);
if (pointerDirection === RIGHT) {
context.lineTo(width, (height - pointerHeight)/2);
context.lineTo(width + pointerWidth, height/2);
context.lineTo(width, (height + pointerHeight)/2);
}
context.lineTo(width, height);
if (pointerDirection === DOWN) {
context.lineTo((width + pointerWidth)/2, height);
context.lineTo(width/2, height + pointerHeight);
context.lineTo((width - pointerWidth)/2, height);
}
context.lineTo(0, height);
if (pointerDirection === LEFT) {
context.lineTo(0, (height + pointerHeight)/2);
context.lineTo(-1 * pointerWidth, height/2);
context.lineTo(0, (height - pointerHeight)/2);
}
context.closePath();
canvas.fillStroke(this);
}
};
2013-05-18 22:30:57 -07:00
Kinetic.Util.extend(Kinetic.Tag, Kinetic.Shape);
Kinetic.Node.addGetterSetter(Kinetic.Tag, 'pointerDirection', NONE);
2013-04-06 22:06:11 -07:00
/**
* set pointer Direction
* @name setPointerDirection
2013-05-16 00:28:49 -07:00
* @method
2013-05-18 22:30:57 -07:00
* @memberof Kinetic.Tag.prototype
2013-04-06 22:06:11 -07:00
* @param {String} pointerDirection can be up, right, down, left, or none. The
* default is none
*/
/**
* get pointer Direction
* @name getPointerDirection
2013-05-16 00:28:49 -07:00
* @method
2013-05-18 22:30:57 -07:00
* @memberof Kinetic.Tag.prototype
*/
2013-05-18 22:30:57 -07:00
Kinetic.Node.addGetterSetter(Kinetic.Tag, 'pointerWidth', 0);
/**
2013-04-06 22:06:11 -07:00
* set pointer width
* @name setPointerWidth
2013-05-16 00:28:49 -07:00
* @method
2013-05-18 22:30:57 -07:00
* @memberof Kinetic.Tag.prototype
2013-04-06 22:06:11 -07:00
* @param {Number} pointerWidth
*/
/**
* get pointer width
* @name getPointerWidth
2013-05-16 00:28:49 -07:00
* @method
2013-05-18 22:30:57 -07:00
* @memberof Kinetic.Tag.prototype
2013-04-06 22:06:11 -07:00
*/
2013-05-18 22:30:57 -07:00
Kinetic.Node.addGetterSetter(Kinetic.Tag, 'pointerHeight', 0);
2013-04-06 22:06:11 -07:00
/**
* set pointer height
* @name setPointerHeight
2013-05-16 00:28:49 -07:00
* @method
2013-05-18 22:30:57 -07:00
* @memberof Kinetic.Tag.prototype
* @param {Number} pointerHeight
2013-04-06 22:06:11 -07:00
*/
/**
* get pointer height
* @name getPointerHeight
2013-05-16 00:28:49 -07:00
* @method
2013-05-18 22:30:57 -07:00
* @memberof Kinetic.Tag.prototype
2013-04-06 22:06:11 -07:00
*/
2013-05-18 22:30:57 -07:00
Kinetic.Node.addGetterSetter(Kinetic.Tag, 'cornerRadius', 0);
/**
* set corner radius
* @name setCornerRadius
2013-05-16 00:28:49 -07:00
* @method
2013-05-18 22:30:57 -07:00
* @memberof Kinetic.Tag.prototype
* @param {Number} corner radius
2013-04-06 22:06:11 -07:00
*/
/**
* get corner radius
* @name getCornerRadius
2013-05-16 00:28:49 -07:00
* @method
2013-05-18 22:30:57 -07:00
* @memberof Kinetic.Tag.prototype
2013-04-06 22:06:11 -07:00
*/
})();