| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:sky' as sky; | 6 import 'dart:sky' as sky; |
| 7 | 7 |
| 8 import 'package:vector_math/vector_math.dart'; | 8 import 'package:vector_math/vector_math.dart'; |
| 9 | 9 |
| 10 import 'package:sky/mojo/asset_bundle.dart'; | 10 import 'package:sky/mojo/asset_bundle.dart'; |
| 11 import 'package:sky/mojo/net/image_cache.dart' as image_cache; | 11 import 'package:sky/mojo/net/image_cache.dart' as image_cache; |
| 12 import 'package:sky/painting/text_style.dart'; | 12 import 'package:sky/painting/text_style.dart'; |
| 13 import 'package:sky/rendering/block.dart'; | 13 import 'package:sky/rendering/block.dart'; |
| 14 import 'package:sky/rendering/box.dart'; | 14 import 'package:sky/rendering/box.dart'; |
| 15 import 'package:sky/rendering/flex.dart'; | 15 import 'package:sky/rendering/flex.dart'; |
| 16 import 'package:sky/rendering/object.dart'; | 16 import 'package:sky/rendering/object.dart'; |
| 17 import 'package:sky/rendering/paragraph.dart'; | 17 import 'package:sky/rendering/paragraph.dart'; |
| 18 import 'package:sky/rendering/stack.dart'; | 18 import 'package:sky/rendering/stack.dart'; |
| 19 import 'package:sky/widgets/default_text_style.dart'; | 19 import 'package:sky/widgets/default_text_style.dart'; |
| 20 import 'package:sky/widgets/widget.dart'; | 20 import 'package:sky/widgets/widget.dart'; |
| 21 | 21 |
| 22 export 'package:sky/rendering/box.dart' show BackgroundImage, BoxConstraints, Bo
xDecoration, Border, BorderSide, EdgeDims; | 22 export 'package:sky/rendering/box.dart' show BackgroundImage, BoxConstraints, Bo
xDecoration, Border, BorderSide, EdgeDims; |
| 23 export 'package:sky/rendering/flex.dart' show FlexDirection, FlexJustifyContent,
FlexAlignItems; | 23 export 'package:sky/rendering/flex.dart' show FlexDirection, FlexJustifyContent,
FlexAlignItems; |
| 24 export 'package:sky/rendering/object.dart' show Point, Offset, Size, Rect, Color
, Paint, Path; | 24 export 'package:sky/rendering/object.dart' show Point, Offset, Size, Rect, Color
, Paint, Path; |
| 25 export 'package:sky/widgets/widget.dart' show Widget, Component, StatefulCompone
nt, App, runApp, Listener, ParentDataNode; | 25 export 'package:sky/widgets/widget.dart' show Widget, Component, StatefulCompone
nt, App, runApp, Listener, ParentDataNode; |
| 26 | 26 |
| 27 |
| 27 // PAINTING NODES | 28 // PAINTING NODES |
| 28 | 29 |
| 29 class Opacity extends OneChildRenderObjectWrapper { | 30 class Opacity extends OneChildRenderObjectWrapper { |
| 30 Opacity({ String key, this.opacity, Widget child }) | 31 Opacity({ String key, this.opacity, Widget child }) |
| 31 : super(key: key, child: child); | 32 : super(key: key, child: child); |
| 32 | 33 |
| 33 RenderOpacity get root => super.root; | |
| 34 final double opacity; | 34 final double opacity; |
| 35 | 35 |
| 36 RenderOpacity createNode() => new RenderOpacity(opacity: opacity); | 36 RenderOpacity createNode() => new RenderOpacity(opacity: opacity); |
| 37 RenderOpacity get root => super.root; |
| 37 | 38 |
| 38 void syncRenderObject(Opacity old) { | 39 void syncRenderObject(Opacity old) { |
| 39 super.syncRenderObject(old); | 40 super.syncRenderObject(old); |
| 40 root.opacity = opacity; | 41 root.opacity = opacity; |
| 41 } | 42 } |
| 42 } | 43 } |
| 43 | 44 |
| 44 class ColorFilter extends OneChildRenderObjectWrapper { | 45 class ColorFilter extends OneChildRenderObjectWrapper { |
| 45 ColorFilter({ String key, this.color, this.transferMode, Widget child }) | 46 ColorFilter({ String key, this.color, this.transferMode, Widget child }) |
| 46 : super(key: key, child: child); | 47 : super(key: key, child: child); |
| 47 | 48 |
| 48 RenderColorFilter get root => super.root; | |
| 49 final Color color; | 49 final Color color; |
| 50 final sky.TransferMode transferMode; | 50 final sky.TransferMode transferMode; |
| 51 | 51 |
| 52 RenderColorFilter createNode() => new RenderColorFilter(color: color, transfer
Mode: transferMode); | 52 RenderColorFilter createNode() => new RenderColorFilter(color: color, transfer
Mode: transferMode); |
| 53 RenderColorFilter get root => super.root; |
| 53 | 54 |
| 54 void syncRenderObject(ColorFilter old) { | 55 void syncRenderObject(ColorFilter old) { |
| 55 super.syncRenderObject(old); | 56 super.syncRenderObject(old); |
| 56 root.color = color; | 57 root.color = color; |
| 57 root.transferMode = transferMode; | 58 root.transferMode = transferMode; |
| 58 } | 59 } |
| 59 } | 60 } |
| 60 | 61 |
| 61 class DecoratedBox extends OneChildRenderObjectWrapper { | 62 class DecoratedBox extends OneChildRenderObjectWrapper { |
| 62 | |
| 63 DecoratedBox({ String key, this.decoration, Widget child }) | 63 DecoratedBox({ String key, this.decoration, Widget child }) |
| 64 : super(key: key, child: child); | 64 : super(key: key, child: child); |
| 65 | 65 |
| 66 RenderDecoratedBox get root => super.root; | |
| 67 final BoxDecoration decoration; | 66 final BoxDecoration decoration; |
| 68 | 67 |
| 69 RenderDecoratedBox createNode() => new RenderDecoratedBox(decoration: decorati
on); | 68 RenderDecoratedBox createNode() => new RenderDecoratedBox(decoration: decorati
on); |
| 69 RenderDecoratedBox get root => super.root; |
| 70 | 70 |
| 71 void syncRenderObject(DecoratedBox old) { | 71 void syncRenderObject(DecoratedBox old) { |
| 72 super.syncRenderObject(old); | 72 super.syncRenderObject(old); |
| 73 root.decoration = decoration; | 73 root.decoration = decoration; |
| 74 } | 74 } |
| 75 | |
| 76 } | 75 } |
| 77 | 76 |
| 78 class CustomPaint extends OneChildRenderObjectWrapper { | 77 class CustomPaint extends OneChildRenderObjectWrapper { |
| 79 | |
| 80 CustomPaint({ String key, this.callback, this.token, Widget child }) | 78 CustomPaint({ String key, this.callback, this.token, Widget child }) |
| 81 : super(key: key, child: child); | 79 : super(key: key, child: child); |
| 82 | 80 |
| 83 RenderCustomPaint get root => super.root; | |
| 84 final CustomPaintCallback callback; | 81 final CustomPaintCallback callback; |
| 85 final dynamic token; // set this to be repainted automatically when the token
changes | 82 final dynamic token; // set this to be repainted automatically when the token
changes |
| 86 | 83 |
| 87 RenderCustomPaint createNode() => new RenderCustomPaint(callback: callback); | 84 RenderCustomPaint createNode() => new RenderCustomPaint(callback: callback); |
| 85 RenderCustomPaint get root => super.root; |
| 88 | 86 |
| 89 void syncRenderObject(CustomPaint old) { | 87 void syncRenderObject(CustomPaint old) { |
| 90 super.syncRenderObject(old); | 88 super.syncRenderObject(old); |
| 91 if (old != null && old.token != token) | 89 if (old != null && old.token != token) |
| 92 root.markNeedsPaint(); | 90 root.markNeedsPaint(); |
| 93 root.callback = callback; | 91 root.callback = callback; |
| 94 } | 92 } |
| 95 | 93 |
| 96 void remove() { | 94 void remove() { |
| 97 root.callback = null; | 95 root.callback = null; |
| 98 super.remove(); | 96 super.remove(); |
| 99 } | 97 } |
| 100 | |
| 101 } | 98 } |
| 102 | 99 |
| 103 class ClipRect extends OneChildRenderObjectWrapper { | 100 class ClipRect extends OneChildRenderObjectWrapper { |
| 104 ClipRect({ String key, Widget child }) | 101 ClipRect({ String key, Widget child }) |
| 105 : super(key: key, child: child); | 102 : super(key: key, child: child); |
| 106 | 103 |
| 104 RenderClipRect createNode() => new RenderClipRect(); |
| 107 RenderClipRect get root => super.root; | 105 RenderClipRect get root => super.root; |
| 108 RenderClipRect createNode() => new RenderClipRect(); | |
| 109 | 106 |
| 110 // Nothing to sync, so we don't implement syncRenderObject() | 107 // Nothing to sync, so we don't implement syncRenderObject() |
| 111 } | 108 } |
| 112 | 109 |
| 113 class ClipRRect extends OneChildRenderObjectWrapper { | 110 class ClipRRect extends OneChildRenderObjectWrapper { |
| 111 ClipRRect({ String key, this.xRadius, this.yRadius, Widget child }) |
| 112 : super(key: key, child: child); |
| 113 |
| 114 final double xRadius; | 114 final double xRadius; |
| 115 final double yRadius; | 115 final double yRadius; |
| 116 ClipRRect({ String key, Widget child, this.xRadius, this.yRadius }) | |
| 117 : super(key: key, child: child); | |
| 118 | 116 |
| 117 RenderClipRRect createNode() => new RenderClipRRect(xRadius: xRadius, yRadius:
yRadius); |
| 119 RenderClipRRect get root => super.root; | 118 RenderClipRRect get root => super.root; |
| 120 RenderClipRRect createNode() => new RenderClipRRect(xRadius: xRadius, yRadius:
yRadius); | |
| 121 | 119 |
| 122 void syncRenderObject(ClipRRect old) { | 120 void syncRenderObject(ClipRRect old) { |
| 123 super.syncRenderObject(old); | 121 super.syncRenderObject(old); |
| 124 root.xRadius = xRadius; | 122 root.xRadius = xRadius; |
| 125 root.yRadius = yRadius; | 123 root.yRadius = yRadius; |
| 126 } | 124 } |
| 127 } | 125 } |
| 128 | 126 |
| 129 class ClipOval extends OneChildRenderObjectWrapper { | 127 class ClipOval extends OneChildRenderObjectWrapper { |
| 130 ClipOval({ String key, Widget child }) | 128 ClipOval({ String key, Widget child }) |
| 131 : super(key: key, child: child); | 129 : super(key: key, child: child); |
| 132 | 130 |
| 131 RenderClipOval createNode() => new RenderClipOval(); |
| 133 RenderClipOval get root => super.root; | 132 RenderClipOval get root => super.root; |
| 134 RenderClipOval createNode() => new RenderClipOval(); | |
| 135 | 133 |
| 136 // Nothing to sync, so we don't implement syncRenderObject() | 134 // Nothing to sync, so we don't implement syncRenderObject() |
| 137 } | 135 } |
| 138 | 136 |
| 137 |
| 139 // POSITIONING AND SIZING NODES | 138 // POSITIONING AND SIZING NODES |
| 140 | 139 |
| 141 class Transform extends OneChildRenderObjectWrapper { | 140 class Transform extends OneChildRenderObjectWrapper { |
| 142 | |
| 143 Transform({ String key, this.transform, Widget child }) | 141 Transform({ String key, this.transform, Widget child }) |
| 144 : super(key: key, child: child); | 142 : super(key: key, child: child); |
| 145 | 143 |
| 146 RenderTransform get root => super.root; | |
| 147 final Matrix4 transform; | 144 final Matrix4 transform; |
| 148 | 145 |
| 149 RenderTransform createNode() => new RenderTransform(transform: transform); | 146 RenderTransform createNode() => new RenderTransform(transform: transform); |
| 147 RenderTransform get root => super.root; |
| 150 | 148 |
| 151 void syncRenderObject(Transform old) { | 149 void syncRenderObject(Transform old) { |
| 152 super.syncRenderObject(old); | 150 super.syncRenderObject(old); |
| 153 root.transform = transform; | 151 root.transform = transform; |
| 154 } | 152 } |
| 155 | |
| 156 } | 153 } |
| 157 | 154 |
| 158 class Padding extends OneChildRenderObjectWrapper { | 155 class Padding extends OneChildRenderObjectWrapper { |
| 159 | |
| 160 Padding({ String key, this.padding, Widget child }) | 156 Padding({ String key, this.padding, Widget child }) |
| 161 : super(key: key, child: child); | 157 : super(key: key, child: child); |
| 162 | 158 |
| 163 RenderPadding get root => super.root; | |
| 164 final EdgeDims padding; | 159 final EdgeDims padding; |
| 165 | 160 |
| 166 RenderPadding createNode() => new RenderPadding(padding: padding); | 161 RenderPadding createNode() => new RenderPadding(padding: padding); |
| 162 RenderPadding get root => super.root; |
| 167 | 163 |
| 168 void syncRenderObject(Padding old) { | 164 void syncRenderObject(Padding old) { |
| 169 super.syncRenderObject(old); | 165 super.syncRenderObject(old); |
| 170 root.padding = padding; | 166 root.padding = padding; |
| 171 } | 167 } |
| 172 | |
| 173 } | 168 } |
| 174 | 169 |
| 175 class Center extends OneChildRenderObjectWrapper { | 170 class Center extends OneChildRenderObjectWrapper { |
| 176 Center({ String key, Widget child }) | 171 Center({ String key, Widget child }) |
| 177 : super(key: key, child: child); | 172 : super(key: key, child: child); |
| 178 | 173 |
| 174 RenderPositionedBox createNode() => new RenderPositionedBox(); |
| 179 RenderPositionedBox get root => super.root; | 175 RenderPositionedBox get root => super.root; |
| 180 RenderPositionedBox createNode() => new RenderPositionedBox(); | |
| 181 | 176 |
| 182 // Nothing to sync, so we don't implement syncRenderObject() | 177 // Nothing to sync, so we don't implement syncRenderObject() |
| 183 } | 178 } |
| 184 | 179 |
| 185 class SizedBox extends OneChildRenderObjectWrapper { | 180 class SizedBox extends OneChildRenderObjectWrapper { |
| 186 | 181 SizedBox({ String key, this.width, this.height, Widget child }) |
| 187 SizedBox({ | 182 : super(key: key, child: child); |
| 188 String key, | |
| 189 this.width, | |
| 190 this.height, | |
| 191 Widget child | |
| 192 }) : super(key: key, child: child); | |
| 193 | |
| 194 RenderConstrainedBox get root => super.root; | |
| 195 | 183 |
| 196 final double width; | 184 final double width; |
| 197 final double height; | 185 final double height; |
| 198 | 186 |
| 199 RenderConstrainedBox createNode() => new RenderConstrainedBox(additionalConstr
aints: _additionalConstraints()); | 187 RenderConstrainedBox createNode() => new RenderConstrainedBox(additionalConstr
aints: _additionalConstraints()); |
| 188 RenderConstrainedBox get root => super.root; |
| 200 | 189 |
| 201 BoxConstraints _additionalConstraints() { | 190 BoxConstraints _additionalConstraints() { |
| 202 var result = const BoxConstraints(); | 191 BoxConstraints result = const BoxConstraints(); |
| 203 if (width != null) | 192 if (width != null) |
| 204 result = result.applyWidth(width); | 193 result = result.applyWidth(width); |
| 205 if (height != null) | 194 if (height != null) |
| 206 result = result.applyHeight(height); | 195 result = result.applyHeight(height); |
| 207 return result; | 196 return result; |
| 208 } | 197 } |
| 209 | 198 |
| 210 void syncRenderObject(SizedBox old) { | 199 void syncRenderObject(SizedBox old) { |
| 211 super.syncRenderObject(old); | 200 super.syncRenderObject(old); |
| 212 root.additionalConstraints = _additionalConstraints(); | 201 root.additionalConstraints = _additionalConstraints(); |
| 213 } | 202 } |
| 214 | |
| 215 } | 203 } |
| 216 | 204 |
| 217 class ConstrainedBox extends OneChildRenderObjectWrapper { | 205 class ConstrainedBox extends OneChildRenderObjectWrapper { |
| 218 | |
| 219 ConstrainedBox({ String key, this.constraints, Widget child }) | 206 ConstrainedBox({ String key, this.constraints, Widget child }) |
| 220 : super(key: key, child: child); | 207 : super(key: key, child: child); |
| 221 | 208 |
| 222 RenderConstrainedBox get root => super.root; | |
| 223 | |
| 224 final BoxConstraints constraints; | 209 final BoxConstraints constraints; |
| 225 | 210 |
| 226 RenderConstrainedBox createNode() => new RenderConstrainedBox(additionalConstr
aints: constraints); | 211 RenderConstrainedBox createNode() => new RenderConstrainedBox(additionalConstr
aints: constraints); |
| 212 RenderConstrainedBox get root => super.root; |
| 227 | 213 |
| 228 void syncRenderObject(ConstrainedBox old) { | 214 void syncRenderObject(ConstrainedBox old) { |
| 229 super.syncRenderObject(old); | 215 super.syncRenderObject(old); |
| 230 root.additionalConstraints = constraints; | 216 root.additionalConstraints = constraints; |
| 231 } | 217 } |
| 232 | |
| 233 } | 218 } |
| 234 | 219 |
| 235 class ShrinkWrapWidth extends OneChildRenderObjectWrapper { | 220 class ShrinkWrapWidth extends OneChildRenderObjectWrapper { |
| 236 | 221 ShrinkWrapWidth({ String key, this.stepWidth, this.stepHeight, Widget child }) |
| 237 ShrinkWrapWidth({ | 222 : super(key: key, child: child); |
| 238 String key, | |
| 239 this.stepWidth, | |
| 240 this.stepHeight, | |
| 241 Widget child | |
| 242 }): super(key: key, child: child); | |
| 243 | |
| 244 RenderShrinkWrapWidth get root => super.root; | |
| 245 | 223 |
| 246 final double stepWidth; | 224 final double stepWidth; |
| 247 final double stepHeight; | 225 final double stepHeight; |
| 248 | 226 |
| 249 RenderShrinkWrapWidth createNode() => new RenderShrinkWrapWidth(); | 227 RenderShrinkWrapWidth createNode() => new RenderShrinkWrapWidth(); |
| 228 RenderShrinkWrapWidth get root => super.root; |
| 250 | 229 |
| 251 void syncRenderObject(ShrinkWrapWidth old) { | 230 void syncRenderObject(ShrinkWrapWidth old) { |
| 252 super.syncRenderObject(old); | 231 super.syncRenderObject(old); |
| 253 root.stepWidth = stepWidth; | 232 root.stepWidth = stepWidth; |
| 254 root.stepHeight = stepHeight; | 233 root.stepHeight = stepHeight; |
| 255 } | 234 } |
| 256 | |
| 257 } | 235 } |
| 258 | 236 |
| 259 class Baseline extends OneChildRenderObjectWrapper { | 237 class Baseline extends OneChildRenderObjectWrapper { |
| 238 Baseline({ String key, this.baseline, this.baselineType: TextBaseline.alphabet
ic, Widget child }) |
| 239 : super(key: key, child: child); |
| 260 | 240 |
| 261 Baseline({ | 241 final double baseline; // in pixels |
| 262 String key, | |
| 263 this.baseline, // in pixels | |
| 264 this.baselineType: TextBaseline.alphabetic, | |
| 265 Widget child | |
| 266 }): super(key: key, child: child); | |
| 267 | |
| 268 RenderBaseline get root => super.root; | |
| 269 | |
| 270 final double baseline; | |
| 271 final TextBaseline baselineType; | 242 final TextBaseline baselineType; |
| 272 | 243 |
| 273 RenderBaseline createNode() => new RenderBaseline(baseline: baseline, baseline
Type: baselineType); | 244 RenderBaseline createNode() => new RenderBaseline(baseline: baseline, baseline
Type: baselineType); |
| 245 RenderBaseline get root => super.root; |
| 274 | 246 |
| 275 void syncRenderObject(Baseline old) { | 247 void syncRenderObject(Baseline old) { |
| 276 super.syncRenderObject(old); | 248 super.syncRenderObject(old); |
| 277 root.baseline = baseline; | 249 root.baseline = baseline; |
| 278 root.baselineType = baselineType; | 250 root.baselineType = baselineType; |
| 279 } | 251 } |
| 280 | |
| 281 } | 252 } |
| 282 | 253 |
| 283 class Viewport extends OneChildRenderObjectWrapper { | 254 class Viewport extends OneChildRenderObjectWrapper { |
| 284 | 255 Viewport({ String key, this.offset: 0.0, Widget child }) |
| 285 Viewport({ | 256 : super(key: key, child: child); |
| 286 String key, | |
| 287 this.offset: 0.0, | |
| 288 Widget child | |
| 289 }) : super(key: key, child: child); | |
| 290 | 257 |
| 291 final double offset; | 258 final double offset; |
| 292 | 259 |
| 260 RenderViewport createNode() => new RenderViewport(scrollOffset: new Offset(0.0
, offset)); |
| 293 RenderViewport get root => super.root; | 261 RenderViewport get root => super.root; |
| 294 RenderViewport createNode() => new RenderViewport(scrollOffset: new Offset(0.0
, offset)); | |
| 295 | 262 |
| 296 void syncRenderObject(Viewport old) { | 263 void syncRenderObject(Viewport old) { |
| 297 super.syncRenderObject(old); | 264 super.syncRenderObject(old); |
| 298 root.scrollOffset = new Offset(0.0, offset); | 265 root.scrollOffset = new Offset(0.0, offset); |
| 299 } | 266 } |
| 300 | |
| 301 } | 267 } |
| 302 | 268 |
| 303 class SizeObserver extends OneChildRenderObjectWrapper { | 269 class SizeObserver extends OneChildRenderObjectWrapper { |
| 304 | |
| 305 SizeObserver({ String key, this.callback, Widget child }) | 270 SizeObserver({ String key, this.callback, Widget child }) |
| 306 : super(key: key, child: child); | 271 : super(key: key, child: child); |
| 307 | 272 |
| 308 RenderSizeObserver get root => super.root; | |
| 309 final SizeChangedCallback callback; | 273 final SizeChangedCallback callback; |
| 310 | 274 |
| 311 RenderSizeObserver createNode() => new RenderSizeObserver(callback: callback); | 275 RenderSizeObserver createNode() => new RenderSizeObserver(callback: callback); |
| 276 RenderSizeObserver get root => super.root; |
| 312 | 277 |
| 313 void syncRenderObject(SizeObserver old) { | 278 void syncRenderObject(SizeObserver old) { |
| 314 super.syncRenderObject(old); | 279 super.syncRenderObject(old); |
| 315 root.callback = callback; | 280 root.callback = callback; |
| 316 } | 281 } |
| 317 | 282 |
| 318 void remove() { | 283 void remove() { |
| 319 root.callback = null; | 284 root.callback = null; |
| 320 super.remove(); | 285 super.remove(); |
| 321 } | 286 } |
| 322 | |
| 323 } | 287 } |
| 324 | 288 |
| 325 | 289 |
| 326 // CONVENIENCE CLASS TO COMBINE COMMON PAINTING, POSITIONING, AND SIZING NODES | 290 // CONVENIENCE CLASS TO COMBINE COMMON PAINTING, POSITIONING, AND SIZING NODES |
| 327 | 291 |
| 328 class Container extends Component { | 292 class Container extends Component { |
| 329 | 293 |
| 330 Container({ | 294 Container({ |
| 331 String key, | 295 String key, |
| 332 this.child, | 296 this.child, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 | 345 |
| 382 } | 346 } |
| 383 | 347 |
| 384 | 348 |
| 385 // LAYOUT NODES | 349 // LAYOUT NODES |
| 386 | 350 |
| 387 class Block extends MultiChildRenderObjectWrapper { | 351 class Block extends MultiChildRenderObjectWrapper { |
| 388 Block(List<Widget> children, { String key }) | 352 Block(List<Widget> children, { String key }) |
| 389 : super(key: key, children: children); | 353 : super(key: key, children: children); |
| 390 | 354 |
| 355 RenderBlock createNode() => new RenderBlock(); |
| 391 RenderBlock get root => super.root; | 356 RenderBlock get root => super.root; |
| 392 RenderBlock createNode() => new RenderBlock(); | |
| 393 } | 357 } |
| 394 | 358 |
| 395 class Stack extends MultiChildRenderObjectWrapper { | 359 class Stack extends MultiChildRenderObjectWrapper { |
| 396 Stack(List<Widget> children, { String key }) | 360 Stack(List<Widget> children, { String key }) |
| 397 : super(key: key, children: children); | 361 : super(key: key, children: children); |
| 398 | 362 |
| 363 RenderStack createNode() => new RenderStack(); |
| 399 RenderStack get root => super.root; | 364 RenderStack get root => super.root; |
| 400 RenderStack createNode() => new RenderStack(); | |
| 401 } | 365 } |
| 402 | 366 |
| 403 class Positioned extends ParentDataNode { | 367 class Positioned extends ParentDataNode { |
| 404 Positioned({ | 368 Positioned({ |
| 405 String key, | 369 String key, |
| 406 Widget child, | 370 Widget child, |
| 407 double top, | 371 double top, |
| 408 double right, | 372 double right, |
| 409 double bottom, | 373 double bottom, |
| 410 double left | 374 double left |
| 411 }) : super(child, | 375 }) : super(child, |
| 412 new StackParentData()..top = top | 376 new StackParentData()..top = top |
| 413 ..right = right | 377 ..right = right |
| 414 ..bottom = bottom | 378 ..bottom = bottom |
| 415 ..left = left, | 379 ..left = left, |
| 416 key: key); | 380 key: key); |
| 417 } | 381 } |
| 418 | 382 |
| 419 class Flex extends MultiChildRenderObjectWrapper { | 383 class Flex extends MultiChildRenderObjectWrapper { |
| 420 | 384 |
| 421 Flex(List<Widget> children, { | 385 Flex(List<Widget> children, { |
| 422 String key, | 386 String key, |
| 423 this.direction: FlexDirection.horizontal, | 387 this.direction: FlexDirection.horizontal, |
| 424 this.justifyContent: FlexJustifyContent.start, | 388 this.justifyContent: FlexJustifyContent.start, |
| 425 this.alignItems: FlexAlignItems.center | 389 this.alignItems: FlexAlignItems.center |
| 426 }) : super(key: key, children: children); | 390 }) : super(key: key, children: children); |
| 427 | 391 |
| 428 RenderFlex get root => super.root; | |
| 429 RenderFlex createNode() => new RenderFlex(direction: this.direction); | |
| 430 | |
| 431 final FlexDirection direction; | 392 final FlexDirection direction; |
| 432 final FlexJustifyContent justifyContent; | 393 final FlexJustifyContent justifyContent; |
| 433 final FlexAlignItems alignItems; | 394 final FlexAlignItems alignItems; |
| 434 | 395 |
| 396 RenderFlex createNode() => new RenderFlex(direction: this.direction); |
| 397 RenderFlex get root => super.root; |
| 398 |
| 435 void syncRenderObject(Widget old) { | 399 void syncRenderObject(Widget old) { |
| 436 super.syncRenderObject(old); | 400 super.syncRenderObject(old); |
| 437 root.direction = direction; | 401 root.direction = direction; |
| 438 root.justifyContent = justifyContent; | 402 root.justifyContent = justifyContent; |
| 439 root.alignItems = alignItems; | 403 root.alignItems = alignItems; |
| 440 } | 404 } |
| 441 | 405 |
| 442 } | 406 } |
| 443 | 407 |
| 444 class Flexible extends ParentDataNode { | 408 class Flexible extends ParentDataNode { |
| 445 Flexible({ String key, Widget child, int flex: 1 }) | 409 Flexible({ String key, int flex: 1, Widget child }) |
| 446 : super(child, new FlexBoxParentData()..flex = flex, key: key); | 410 : super(child, new FlexBoxParentData()..flex = flex, key: key); |
| 447 } | 411 } |
| 448 | 412 |
| 449 class Inline extends LeafRenderObjectWrapper { | 413 class Inline extends LeafRenderObjectWrapper { |
| 450 Inline({ String key, this.text }) : super(key: key); | 414 Inline({ String key, this.text }) : super(key: key); |
| 451 | 415 |
| 416 final InlineBase text; |
| 417 |
| 418 RenderParagraph createNode() => new RenderParagraph(text); |
| 452 RenderParagraph get root => super.root; | 419 RenderParagraph get root => super.root; |
| 453 RenderParagraph createNode() => new RenderParagraph(text); | |
| 454 | |
| 455 final InlineBase text; | |
| 456 | 420 |
| 457 void syncRenderObject(Widget old) { | 421 void syncRenderObject(Widget old) { |
| 458 super.syncRenderObject(old); | 422 super.syncRenderObject(old); |
| 459 root.inline = text; | 423 root.inline = text; |
| 460 } | 424 } |
| 461 | |
| 462 } | 425 } |
| 463 | 426 |
| 464 class StyledText extends Component { | 427 class StyledText extends Component { |
| 465 // elements ::= "string" | [<text-style> <elements>*] | 428 // elements ::= "string" | [<text-style> <elements>*] |
| 466 // Where "string" is text to display and text-style is an instance of | 429 // Where "string" is text to display and text-style is an instance of |
| 467 // TextStyle. The text-style applies to all of the elements that follow. | 430 // TextStyle. The text-style applies to all of the elements that follow. |
| 468 StyledText({ this.elements, String key }) : super(key: key); | 431 StyledText({ this.elements, String key }) : super(key: key); |
| 469 | 432 |
| 470 final dynamic elements; | 433 final dynamic elements; |
| 471 | 434 |
| 472 InlineBase _toInline(dynamic element) { | 435 InlineBase _toInline(dynamic element) { |
| 473 if (element is String) { | 436 if (element is String) |
| 474 return new InlineText(element); | 437 return new InlineText(element); |
| 475 } | 438 if (element is Iterable && element.first is TextStyle) |
| 476 if (element is Iterable && element.first is TextStyle) { | |
| 477 return new InlineStyle(element.first, element.skip(1).map(_toInline).toLis
t()); | 439 return new InlineStyle(element.first, element.skip(1).map(_toInline).toLis
t()); |
| 478 } | |
| 479 throw new ArgumentError("invalid elements"); | 440 throw new ArgumentError("invalid elements"); |
| 480 } | 441 } |
| 481 | 442 |
| 482 Widget build() { | 443 Widget build() { |
| 483 return new Inline(text: _toInline(elements)); | 444 return new Inline(text: _toInline(elements)); |
| 484 } | 445 } |
| 485 } | 446 } |
| 486 | 447 |
| 487 class Text extends Component { | 448 class Text extends Component { |
| 488 Text(this.data, { String key, TextStyle this.style }) : super(key: key); | 449 Text(this.data, { String key, TextStyle this.style }) : super(key: key); |
| 450 |
| 489 final String data; | 451 final String data; |
| 490 final TextStyle style; | 452 final TextStyle style; |
| 491 bool get interchangeable => true; | 453 |
| 492 Widget build() { | 454 Widget build() { |
| 493 InlineBase text = new InlineText(data); | 455 InlineBase text = new InlineText(data); |
| 494 TextStyle defaultStyle = DefaultTextStyle.of(this); | 456 TextStyle defaultStyle = DefaultTextStyle.of(this); |
| 495 TextStyle combinedStyle; | 457 TextStyle combinedStyle; |
| 496 if (defaultStyle != null) { | 458 if (defaultStyle != null) { |
| 497 if (style != null) | 459 if (style != null) |
| 498 combinedStyle = defaultStyle.merge(style); | 460 combinedStyle = defaultStyle.merge(style); |
| 499 else | 461 else |
| 500 combinedStyle = defaultStyle; | 462 combinedStyle = defaultStyle; |
| 501 } else { | 463 } else { |
| 502 combinedStyle = style; | 464 combinedStyle = style; |
| 503 } | 465 } |
| 504 if (combinedStyle != null) | 466 if (combinedStyle != null) |
| 505 text = new InlineStyle(combinedStyle, [text]); | 467 text = new InlineStyle(combinedStyle, [text]); |
| 506 return new Inline(text: text); | 468 return new Inline(text: text); |
| 507 } | 469 } |
| 508 } | 470 } |
| 509 | 471 |
| 510 class Image extends LeafRenderObjectWrapper { | 472 class Image extends LeafRenderObjectWrapper { |
| 511 Image({ sky.Image image, this.size }) | 473 Image({ sky.Image image, this.size }) |
| 512 : image = image, super(key: image.hashCode.toString()); | 474 : image = image, |
| 513 | 475 super(key: image.hashCode.toString()); // TODO(ianh): Find a way to unique
ly identify the sky.Image rather than using hashCode, which could collide |
| 514 RenderImage get root => super.root; | |
| 515 RenderImage createNode() => new RenderImage(image, size); | |
| 516 | 476 |
| 517 final sky.Image image; | 477 final sky.Image image; |
| 518 final Size size; | 478 final Size size; |
| 519 | 479 |
| 480 RenderImage createNode() => new RenderImage(image, size); |
| 481 RenderImage get root => super.root; |
| 482 |
| 520 void syncRenderObject(Widget old) { | 483 void syncRenderObject(Widget old) { |
| 521 super.syncRenderObject(old); | 484 super.syncRenderObject(old); |
| 522 root.image = image; | 485 root.image = image; |
| 523 root.requestedSize = size; | 486 root.requestedSize = size; |
| 524 } | 487 } |
| 525 } | 488 } |
| 526 | 489 |
| 527 class FutureImage extends StatefulComponent { | 490 class FutureImage extends StatefulComponent { |
| 528 FutureImage({ this.image, this.size }); | 491 FutureImage({ String key, this.image, this.size }) : super(key: key); |
| 529 | 492 |
| 530 Future<sky.Image> image; | 493 Future<sky.Image> image; |
| 531 Size size; | 494 Size size; |
| 495 |
| 532 sky.Image _resolvedImage; | 496 sky.Image _resolvedImage; |
| 533 | 497 |
| 534 void didMount() { | |
| 535 super.didMount(); | |
| 536 _resolveImage(); | |
| 537 } | |
| 538 | |
| 539 void _resolveImage() { | 498 void _resolveImage() { |
| 540 image.then((sky.Image resolvedImage) { | 499 image.then((sky.Image resolvedImage) { |
| 541 if (!mounted) | 500 if (!mounted) |
| 542 return; | 501 return; |
| 543 setState(() { | 502 setState(() { |
| 544 _resolvedImage = resolvedImage; | 503 _resolvedImage = resolvedImage; |
| 545 }); | 504 }); |
| 546 }); | 505 }); |
| 547 } | 506 } |
| 548 | 507 |
| 508 void didMount() { |
| 509 super.didMount(); |
| 510 _resolveImage(); |
| 511 } |
| 512 |
| 549 void syncFields(FutureImage source) { | 513 void syncFields(FutureImage source) { |
| 550 bool needToResolveImage = (image != source.image); | 514 bool needToResolveImage = (image != source.image); |
| 551 image = source.image; | 515 image = source.image; |
| 552 size = source.size; | 516 size = source.size; |
| 553 if (needToResolveImage) | 517 if (needToResolveImage) |
| 554 _resolveImage(); | 518 _resolveImage(); |
| 555 } | 519 } |
| 556 | 520 |
| 557 Widget build() { | 521 Widget build() { |
| 558 return new Image(image: _resolvedImage, size: size); | 522 return new Image(image: _resolvedImage, size: size); |
| 559 } | 523 } |
| 560 } | 524 } |
| 561 | 525 |
| 562 class NetworkImage extends Component { | 526 class NetworkImage extends Component { |
| 563 NetworkImage({ String src, this.size }) : src = src, super(key: src); | 527 NetworkImage({ String src, this.size }) |
| 528 : src = src, |
| 529 super(key: src); |
| 564 | 530 |
| 565 final String src; | 531 final String src; |
| 566 final Size size; | 532 final Size size; |
| 567 | 533 |
| 568 Widget build() { | 534 Widget build() { |
| 569 return new FutureImage(image: image_cache.load(src), size: size); | 535 return new FutureImage(image: image_cache.load(src), size: size); |
| 570 } | 536 } |
| 571 } | 537 } |
| 572 | 538 |
| 573 class AssetImage extends Component { | 539 class AssetImage extends Component { |
| 574 AssetImage({ this.bundle, String name, this.size }) | 540 AssetImage({ String name, this.bundle, this.size }) |
| 575 : name = name, super(key: name); | 541 : name = name, |
| 542 super(key: name); |
| 576 | 543 |
| 544 final String name; |
| 577 final AssetBundle bundle; | 545 final AssetBundle bundle; |
| 578 final String name; | |
| 579 final Size size; | 546 final Size size; |
| 580 | 547 |
| 581 Widget build() { | 548 Widget build() { |
| 582 return new FutureImage(image: bundle.loadImage(name), size: size); | 549 return new FutureImage(image: bundle.loadImage(name), size: size); |
| 583 } | 550 } |
| 584 } | 551 } |
| 585 | 552 |
| 586 class WidgetToRenderBoxAdapter extends LeafRenderObjectWrapper { | 553 class WidgetToRenderBoxAdapter extends LeafRenderObjectWrapper { |
| 587 | |
| 588 WidgetToRenderBoxAdapter(RenderBox renderBox) | 554 WidgetToRenderBoxAdapter(RenderBox renderBox) |
| 589 : renderBox = renderBox, | 555 : renderBox = renderBox, |
| 590 super(key: renderBox.hashCode.toString()); | 556 super(key: renderBox.hashCode.toString()); // TODO(ianh): Find a way to un
iquely identify the RenderBox rather than using hashCode, which could collide |
| 591 | |
| 592 RenderBox get root => super.root; | |
| 593 RenderBox createNode() => this.renderBox; | |
| 594 | 557 |
| 595 final RenderBox renderBox; | 558 final RenderBox renderBox; |
| 596 | 559 |
| 560 RenderBox createNode() => this.renderBox; |
| 561 RenderBox get root => super.root; |
| 562 |
| 597 void syncRenderObject(Widget old) { | 563 void syncRenderObject(Widget old) { |
| 598 super.syncRenderObject(old); | 564 super.syncRenderObject(old); |
| 599 if (old != null) { | 565 if (old != null) { |
| 600 assert(old is WidgetToRenderBoxAdapter); | 566 assert(old is WidgetToRenderBoxAdapter); |
| 601 assert(root == old.root); | 567 assert(root == old.root); |
| 602 } | 568 } |
| 603 } | 569 } |
| 604 | 570 |
| 605 void remove() { | 571 void remove() { |
| 606 RenderObjectWrapper ancestor = findAncestorRenderObjectWrapper(); | 572 RenderObjectWrapper ancestor = findAncestorRenderObjectWrapper(); |
| 607 assert(ancestor is RenderObjectWrapper); | 573 assert(ancestor is RenderObjectWrapper); |
| 574 assert(ancestor.root == root.parent); |
| 608 ancestor.detachChildRoot(this); | 575 ancestor.detachChildRoot(this); |
| 609 super.remove(); | 576 super.remove(); |
| 610 } | 577 } |
| 611 | |
| 612 } | 578 } |
| OLD | NEW |