You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.8 KiB
62 lines
1.8 KiB
1 year ago
|
/**
|
||
|
* Abstract shape element. Shape element represents some visual vector or raster object.
|
||
|
* @constructor
|
||
|
* @param {String} name Tag name of the element.
|
||
|
* @param {Object} config Set of parameters to initialize element with.
|
||
|
* @param {Object} style Object with styles to set on element initialization.
|
||
|
*/
|
||
|
jvm.AbstractShapeElement = function(name, config, style){
|
||
|
this.style = style || {};
|
||
|
this.style.current = this.style.current || {};
|
||
|
this.isHovered = false;
|
||
|
this.isSelected = false;
|
||
|
this.updateStyle();
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Set element's style.
|
||
|
* @param {Object|String} property Could be string to set only one property or object to set several style properties at once.
|
||
|
* @param {String} value Value to set in case only one property should be set.
|
||
|
*/
|
||
|
jvm.AbstractShapeElement.prototype.setStyle = function(property, value){
|
||
|
var styles = {};
|
||
|
|
||
|
if (typeof property === 'object') {
|
||
|
styles = property;
|
||
|
} else {
|
||
|
styles[property] = value;
|
||
|
}
|
||
|
jvm.$.extend(this.style.current, styles);
|
||
|
this.updateStyle();
|
||
|
};
|
||
|
|
||
|
|
||
|
jvm.AbstractShapeElement.prototype.updateStyle = function(){
|
||
|
var attrs = {};
|
||
|
|
||
|
jvm.AbstractShapeElement.mergeStyles(attrs, this.style.initial);
|
||
|
jvm.AbstractShapeElement.mergeStyles(attrs, this.style.current);
|
||
|
if (this.isHovered) {
|
||
|
jvm.AbstractShapeElement.mergeStyles(attrs, this.style.hover);
|
||
|
}
|
||
|
if (this.isSelected) {
|
||
|
jvm.AbstractShapeElement.mergeStyles(attrs, this.style.selected);
|
||
|
if (this.isHovered) {
|
||
|
jvm.AbstractShapeElement.mergeStyles(attrs, this.style.selectedHover);
|
||
|
}
|
||
|
}
|
||
|
this.set(attrs);
|
||
|
};
|
||
|
|
||
|
jvm.AbstractShapeElement.mergeStyles = function(styles, newStyles){
|
||
|
var key;
|
||
|
|
||
|
newStyles = newStyles || {};
|
||
|
for (key in newStyles) {
|
||
|
if (newStyles[key] === null) {
|
||
|
delete styles[key];
|
||
|
} else {
|
||
|
styles[key] = newStyles[key];
|
||
|
}
|
||
|
}
|
||
|
}
|