Chromium Code Reviews| Index: sky/framework/fn.dart |
| diff --git a/sky/framework/fn.dart b/sky/framework/fn.dart |
| index 1a1118c07e56a04fcb7f0cf7d067e53e6d3bef28..8b4aa5a8eefab31ab7e529a5b6c074eb335a0072 100644 |
| --- a/sky/framework/fn.dart |
| +++ b/sky/framework/fn.dart |
| @@ -148,6 +148,12 @@ class StyleNode extends ContentNode { |
| StyleNode(UINode content, this.style): super(content); |
| } |
| +class ParentDataStyler extends ContentNode { |
|
eseidel
2015/05/11 23:07:22
ParentDataSetter?
|
| + final ParentData parentData; |
| + |
| + ParentDataStyler(UINode content, this.parentData): super(content); |
| +} |
| + |
| /* |
| * SkyNodeWrappers correspond to a desired state of a RenderCSS. They are fully |
| * immutable, with one exception: A UINode which is a Component which lives within |
| @@ -389,14 +395,28 @@ abstract class SkyElementWrapper extends SkyNodeWrapper { |
| List<Style> styles = new List<Style>(); |
| if (style != null) |
| styles.add(style); |
| + ParentData parentData = null; |
| UINode parent = _parent; |
| while (parent != null && parent is! SkyNodeWrapper) { |
| if (parent is StyleNode && parent.style != null) |
| styles.add(parent.style); |
| + else |
| + if (parent is ParentDataStyler && parent.parentData != null) { |
| + if (parentData != null) |
| + parentData.merge(parent.parentData); // this will throw if the types aren't the same |
| + else |
| + parentData = parent.parentData; |
| + } |
| parent = parent._parent; |
| } |
| _root.updateStyles(styles); |
| - |
| + if (parentData != null) { |
| + assert(_root.parentData != null); |
| + _root.parentData.merge(parentData); // this will throw if the types aren't approriate |
| + assert(parent != null); |
| + assert(parent._root != null); |
| + parent._root.markNeedsLayout(); |
| + } |
| _root.updateInlineStyle(inlineStyle); |
| _syncChildren(oldSkyElementWrapper); |