extjs-gpl
Version:
GPL licensed version of Sencha Ext JS
96 lines (87 loc) • 2.75 kB
JavaScript
/**
* @class Ext.draw.modifier.Modifier
*
* Each sprite has a stack of modifiers. The resulting attributes of sprite is
* the content of the stack top. When setting attributes to a sprite,
* changes will be pushed-down though the stack of modifiers and pop-back the
* additive changes; When modifier is triggered to change the attribute of a
* sprite, it will pop-up the changes to the top.
*/
Ext.define('Ext.draw.modifier.Modifier', {
mixins: {
observable: 'Ext.mixin.Observable'
},
config: {
/**
* @private
* @cfg {Ext.draw.modifier.Modifier} lower Modifier that receives the push-down changes.
*/
lower: null,
/**
* @private
* @cfg {Ext.draw.modifier.Modifier} upper Modifier that receives the pop-up changes.
*/
upper: null,
/**
* @cfg {Ext.draw.sprite.Sprite} sprite The sprite to which the modifier belongs.
*/
sprite: null
},
constructor: function (config) {
this.mixins.observable.constructor.call(this, config);
},
updateUpper: function (upper) {
if (upper) {
upper.setLower(this);
}
},
updateLower: function (lower) {
if (lower) {
lower.setUpper(this);
}
},
/**
* @private
* Validate attribute set before use.
*
* @param {Object} attr The attribute to be validated. Note that it may be already initialized, so do
* not override properties that have already been used.
*/
prepareAttributes: function (attr) {
if (this._lower) {
this._lower.prepareAttributes(attr);
}
},
/**
* @private
* Invoked when changes need to be popped up to the top.
* @param {Object} attributes The source attributes.
* @param {Object} changes The changes to be popped up.
*/
popUp: function (attributes, changes) {
if (this._upper) {
this._upper.popUp(attributes, changes);
} else {
Ext.apply(attributes, changes);
}
},
/**
* @private
* Invoked when changes need to be pushed down to the sprite.
* @param {Object} attr The source attributes.
* @param {Object} changes The changes to make. This object might be changed unexpectedly inside the method.
* @return {Mixed}
*/
pushDown: function (attr, changes) {
if (this._lower) {
return this._lower.pushDown(attr, changes);
} else {
for (var name in changes) {
if (changes[name] === attr[name]) {
delete changes[name];
}
}
return changes;
}
}
});