Fix Color change propagation again

Closes #1672
This commit is contained in:
Jürg Lehni 2019-06-19 22:44:54 +02:00
parent b5c753f23d
commit bc5a361470
2 changed files with 28 additions and 45 deletions

View file

@ -712,7 +712,11 @@ var Color = Base.extend(new function() {
_changed: function() {
this._canvasStyle = null;
if (this._owner) {
this._owner[this._setter](this);
if (this._setter) {
this._owner[this._setter](this);
} else {
this._owner._changed(/*#=*/Change.STYLE);
}
}
},
@ -1390,30 +1394,3 @@ new function() {
*/
});
});
/**
* @name LinkedColor
*
* @class An internal version of Color that notifies its owner of each change
* through setting itself again on the setter that corresponds to the getter
* that produced this LinkedColor. This is used to solve group color update
* problem (#1152) with the same principle used in LinkedPoint.
*
* @private
*/
var LinkedColor = Color.extend({
// Make sure LinkedColor is displayed as Color in debugger.
initialize: function Color(color, item, setter) {
// Rely on real constructor for instantiation.
paper.Color.apply(this, [color]);
// Store references.
this._item = item;
this._setter = setter;
},
// Rely on Color#_changed() method to detect changes.
_changed: function(){
// Update owner color by calling setter.
this._item[this._setter](this);
}
});

View file

@ -187,7 +187,10 @@ var Style = Base.extend(new function() {
if (value && value.constructor === Color) {
// NOTE: If value is not a Color, it is only
// converted and cloned in the getter further down.
value = Color._setOwner(value, owner, set);
value = Color._setOwner(value, owner,
// Only provide a color-setter if the style
// is to be applied to the children:
applyToChildren && set);
}
}
// NOTE: We do not convert the values to Colors in the
@ -204,12 +207,24 @@ var Style = Base.extend(new function() {
fields[get] = function(_dontMerge) {
var owner = this._owner,
children = owner && owner._children,
applyToChildren = children && children.length > 0
&& !(owner instanceof CompoundPath),
value;
// If the owner has children, walk through all of them and see if
// they all have the same style.
// If true is passed for _dontMerge, don't merge children styles
if (key in this._defaults && (!children || !children.length
|| _dontMerge || owner instanceof CompoundPath)) {
// If true is passed for _dontMerge, don't merge children styles.
if (applyToChildren && !_dontMerge) {
for (var i = 0, l = children.length; i < l; i++) {
var childValue = children[i]._style[get]();
if (!i) {
value = childValue;
} else if (!Base.equals(value, childValue)) {
// If there is another child with a different
// style, the style is not defined:
return undefined;
}
}
} else if (key in this._defaults) {
var value = this._values[key];
if (value === undefined) {
value = this._defaults[key];
@ -226,22 +241,13 @@ var Style = Base.extend(new function() {
{ readNull: true, clone: true });
}
}
} else if (children) {
for (var i = 0, l = children.length; i < l; i++) {
var childValue = children[i]._style[get]();
if (!i) {
value = childValue;
} else if (!Base.equals(value, childValue)) {
// If there is another child with a different
// style, the style is not defined:
return undefined;
}
}
}
if (value && isColor) {
// Color._setOwner() may clone the color if it already has a
// different owner (e.g. resulting from `childValue` above):
value = Color._setOwner(value, owner, set);
// different owner (e.g. resulting from `childValue` above).
// Only provide a color-setter if the style is to be applied to
// the children:
value = Color._setOwner(value, owner, applyToChildren && set);
}
return value;
};