mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-01 02:38:43 -05:00
Introduce Base.filter(), to copy and filter object properties.
This commit is contained in:
parent
5ec5c265ac
commit
6d5d1ce077
3 changed files with 48 additions and 23 deletions
|
@ -76,24 +76,9 @@ Base.inject(/** @lends Base# */{
|
||||||
* Base.isPlainObject() check on props or not
|
* Base.isPlainObject() check on props or not
|
||||||
* @return {Boolean} {@true if the object is a plain object}
|
* @return {Boolean} {@true if the object is a plain object}
|
||||||
*/
|
*/
|
||||||
_set: function(props, exclude, dontCheck) {
|
_set: function(props) {
|
||||||
if (props && (dontCheck || Base.isPlainObject(props))) {
|
if (props && Base.isPlainObject(props))
|
||||||
// If props is a filtering object, we need to execute hasOwnProperty
|
return Base.filter(this, props);
|
||||||
// on the original object (it's parent / prototype). See _filtered
|
|
||||||
// inheritance trick in the argument reading code.
|
|
||||||
var keys = Object.keys(props._filtering || props);
|
|
||||||
for (var i = 0, l = keys.length; i < l; i++) {
|
|
||||||
var key = keys[i];
|
|
||||||
if (!(exclude && exclude[key])) {
|
|
||||||
// Due to the _filtered inheritance trick, undefined is used
|
|
||||||
// to mask already consumed named arguments.
|
|
||||||
var value = props[key];
|
|
||||||
if (value !== undefined)
|
|
||||||
this[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return props;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
statics: /** @lends Base */{
|
statics: /** @lends Base */{
|
||||||
|
@ -308,6 +293,29 @@ Base.inject(/** @lends Base# */{
|
||||||
return !!this.getNamed(list, name);
|
return !!this.getNamed(list, name);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies all properties from `source` over to `dest`, supporting
|
||||||
|
* _filtered handling as required by Base.readNamed() mechanism, as well
|
||||||
|
* as an optional exclude` object that lists properties to exclude.
|
||||||
|
*/
|
||||||
|
filter: function(dest, source, exclude) {
|
||||||
|
// If source is a filtering object, we need to get the keys from the
|
||||||
|
// the original object (it's parent / prototype). See _filtered
|
||||||
|
// inheritance trick in the argument reading code.
|
||||||
|
var keys = Object.keys(source._filtering || source);
|
||||||
|
for (var i = 0, l = keys.length; i < l; i++) {
|
||||||
|
var key = keys[i];
|
||||||
|
if (!(exclude && exclude[key])) {
|
||||||
|
// Due to the _filtered inheritance trick, undefined is used
|
||||||
|
// to mask already consumed named arguments.
|
||||||
|
var value = source[key];
|
||||||
|
if (value !== undefined)
|
||||||
|
dest[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dest;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if obj is either a plain object or an array, as used by
|
* Returns true if obj is either a plain object or an array, as used by
|
||||||
* many argument reading methods.
|
* many argument reading methods.
|
||||||
|
|
|
@ -150,10 +150,9 @@ new function() { // // Scope to inject various item event handlers
|
||||||
if (hasProps && props !== Item.NO_INSERT) {
|
if (hasProps && props !== Item.NO_INSERT) {
|
||||||
// Filter out internal, insert, parent and project properties as
|
// Filter out internal, insert, parent and project properties as
|
||||||
// these were handled above.
|
// these were handled above.
|
||||||
this._set(props,
|
Base.filter(this, props, {
|
||||||
{ internal: true, insert: true, project: true, parent: true },
|
internal: true, insert: true, project: true, parent: true
|
||||||
// Don't check for plain object, as that's handled by hasProps.
|
});
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
return hasProps;
|
return hasProps;
|
||||||
},
|
},
|
||||||
|
@ -2031,7 +2030,7 @@ new function() { // // Scope to inject various item event handlers
|
||||||
if (obj) {
|
if (obj) {
|
||||||
// Create a copy of the match object that doesn't contain
|
// Create a copy of the match object that doesn't contain
|
||||||
// these special properties:
|
// these special properties:
|
||||||
match = new Base()._set(match, {
|
match = Base.filter({}, match, {
|
||||||
recursive: true, inside: true, overlapping: true
|
recursive: true, inside: true, overlapping: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -207,3 +207,21 @@ test('Project#getItems() empty: true', function() {
|
||||||
}).length;
|
}).length;
|
||||||
}, 2);
|
}, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Project#getItems() overlapping', function() {
|
||||||
|
var path = new Path.Circle({
|
||||||
|
radius: 100,
|
||||||
|
center: [200, 200],
|
||||||
|
fillColor: 'red'
|
||||||
|
});
|
||||||
|
|
||||||
|
var rect = new Rectangle(0, 0, 400, 400);
|
||||||
|
|
||||||
|
equals(function() {
|
||||||
|
var matches = project.getItems({
|
||||||
|
class: Path,
|
||||||
|
overlapping: rect
|
||||||
|
});
|
||||||
|
return matches.length == 1 && matches[0] == path;
|
||||||
|
}, true);
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue