Index: sky/framework/fn.dart |
diff --git a/sky/framework/fn.dart b/sky/framework/fn.dart |
index 1a1118c07e56a04fcb7f0cf7d067e53e6d3bef28..29caedab9276e9801743d4acb639129d1846c760 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 ParentDataNode extends ContentNode { |
+ final ParentData parentData; |
+ |
+ ParentDataNode(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 ParentDataNode && 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); |