mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-08-28 22:08:54 -04:00
Finish ObservedRectangle, by solving observer notification for all setters.
This commit is contained in:
parent
14010eb8b2
commit
dbb947b7aa
1 changed files with 43 additions and 50 deletions
|
@ -97,7 +97,6 @@ var Rectangle = this.Rectangle = Base.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
setLeft: function(left) {
|
setLeft: function(left) {
|
||||||
// right should not move
|
|
||||||
this.width -= left - this.x;
|
this.width -= left - this.x;
|
||||||
this.x = left;
|
this.x = left;
|
||||||
return this;
|
return this;
|
||||||
|
@ -255,14 +254,17 @@ var Rectangle = this.Rectangle = Base.extend({
|
||||||
getX = 'get' + x,
|
getX = 'get' + x,
|
||||||
getY = 'get' + y,
|
getY = 'get' + y,
|
||||||
setX = 'set' + x,
|
setX = 'set' + x,
|
||||||
setY = 'set' + y;
|
setY = 'set' + y,
|
||||||
this['get' + part] = function() {
|
get = 'get' + part,
|
||||||
return ObservedPoint.create(this, 'set' + part,
|
set = 'set' + part;
|
||||||
|
this[get] = function() {
|
||||||
|
return ObservedPoint.create(this, set,
|
||||||
this[getX](), this[getY]());
|
this[getX](), this[getY]());
|
||||||
};
|
};
|
||||||
this['set' + part] = function(point) {
|
this[set] = function(point) {
|
||||||
point = Point.read(arguments);
|
point = Point.read(arguments);
|
||||||
return this[setX](point.x)[setY](point.y); // Note: call chaining!
|
// Note: call chaining happens here.
|
||||||
|
return this[setX](point.x)[setY](point.y);
|
||||||
};
|
};
|
||||||
}, { beans: true });
|
}, { beans: true });
|
||||||
});
|
});
|
||||||
|
@ -280,50 +282,6 @@ var ObservedRectangle = Rectangle.extend({
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
// TODO: Use loop to create these?
|
|
||||||
getX: function() {
|
|
||||||
return this._x;
|
|
||||||
},
|
|
||||||
|
|
||||||
setX: function(x) {
|
|
||||||
this._x = x;
|
|
||||||
this._observer[this._set](this);
|
|
||||||
},
|
|
||||||
|
|
||||||
getY: function() {
|
|
||||||
return this._y;
|
|
||||||
},
|
|
||||||
|
|
||||||
setY: function(y) {
|
|
||||||
this._y = y;
|
|
||||||
this._observer[this._set](this);
|
|
||||||
},
|
|
||||||
|
|
||||||
getWidth: function() {
|
|
||||||
return this._width;
|
|
||||||
},
|
|
||||||
|
|
||||||
setWidth: function(width) {
|
|
||||||
this._width = width;
|
|
||||||
this._observer[this._set](this);
|
|
||||||
},
|
|
||||||
|
|
||||||
getHeight: function() {
|
|
||||||
return this._height;
|
|
||||||
},
|
|
||||||
|
|
||||||
setHeight: function(height) {
|
|
||||||
this._height = height;
|
|
||||||
this._observer[this._set](this);
|
|
||||||
},
|
|
||||||
|
|
||||||
// TODO: Implement for all properties on ObservedRectangle using loop
|
|
||||||
setCenter: function(center) {
|
|
||||||
Rectangle.prototype.setCenter.apply(this, center);
|
|
||||||
this._observer[this._set](this);
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
statics: {
|
statics: {
|
||||||
/**
|
/**
|
||||||
* Provide a faster creator for Points out of two coordinates that
|
* Provide a faster creator for Points out of two coordinates that
|
||||||
|
@ -342,4 +300,39 @@ var ObservedRectangle = Rectangle.extend({
|
||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}, new function() {
|
||||||
|
var proto = Rectangle.prototype;
|
||||||
|
|
||||||
|
return Base.each(['x', 'y', 'width', 'height'], function(key) {
|
||||||
|
var part = Base.capitalize(key);
|
||||||
|
var internal = '_' + key;
|
||||||
|
this['get' + part] = function() {
|
||||||
|
return this[internal];
|
||||||
|
}
|
||||||
|
|
||||||
|
this['set' + part] = function(value) {
|
||||||
|
this[internal] = value;
|
||||||
|
// Check if this setter is called from another one which sets
|
||||||
|
// _dontNotify, as it will notify itself
|
||||||
|
if (!this._dontNotify)
|
||||||
|
this._observer[this._set](this);
|
||||||
|
}
|
||||||
|
}, Base.each(['Point', 'Size', 'Center',
|
||||||
|
'Left', 'Top', 'Right', 'Bottom', 'CenterX', 'CenterY',
|
||||||
|
'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight',
|
||||||
|
'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'],
|
||||||
|
function(key) {
|
||||||
|
var name = 'set' + key;
|
||||||
|
this[name] = function(value) {
|
||||||
|
// Make sure the above setters of x, y, width, height do not
|
||||||
|
// each notify the observer, as we're going to take care of this
|
||||||
|
// afterwards here, only once per change.
|
||||||
|
this._dontNotify = true;
|
||||||
|
proto[name].apply(this, arguments);
|
||||||
|
delete this._dontNotify;
|
||||||
|
this._observer[this._set](this);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}, { beans: true })
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue