OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 import 'dart:html'; | |
6 import 'dart:async'; | |
7 | |
8 abstract class Renderable { | |
9 render(); | |
10 } | |
11 | |
12 typedef void RenderingCallback(); | |
13 | |
14 abstract class AsyncRenderable extends Renderable { | |
15 Future<RenderingCallback> render(); | |
16 } | |
17 | |
18 class RenderedEvent<T> { | |
19 final T element; | |
20 final bool otherRenderScheduled; | |
21 RenderedEvent(this.element, this.otherRenderScheduled); | |
22 } | |
23 | |
24 class RenderingScheduler<T extends Renderable> { | |
25 bool _dirty = false; | |
26 bool _scheduledRendering = false; | |
27 bool _scheduledNotification = false; | |
28 final T element; | |
29 | |
30 final StreamController<RenderedEvent<T>> _onRendered; | |
31 final Stream<RenderedEvent<T>> onRendered; | |
32 | |
33 factory RenderingScheduler(T element) { | |
34 assert(element != null); | |
35 var controller = new StreamController<RenderedEvent<T>>(); | |
36 var stream = controller.stream.asBroadcastStream(); | |
37 return new RenderingScheduler<T>._(element, controller, stream); | |
38 } | |
39 | |
40 RenderingScheduler._(this.element, this._onRendered, this.onRendered); | |
41 | |
42 void dirty() { | |
43 if (_dirty) return; | |
44 _dirty = true; | |
45 scheduleRendering(); | |
46 } | |
47 | |
48 void scheduleRendering() { | |
49 if (_scheduledRendering) return; | |
50 _render(); | |
51 _scheduledRendering = true; | |
52 } | |
53 | |
54 Future _render() async { | |
55 _dirty = false; | |
56 RenderingCallback render; | |
57 if (element is AsyncRenderable) { | |
58 render = await element.render(); | |
Cutch
2016/07/12 16:24:36
just have one animationframe callback and render a
| |
59 } else { | |
60 render = element.render; | |
61 } | |
62 await window.animationFrame; | |
63 render(); | |
64 _scheduledRendering = false; | |
65 scheduleNotification(); | |
66 if (_dirty) scheduleRendering(); | |
67 } | |
68 | |
69 void scheduleNotification() { | |
70 if (_scheduledNotification) return; | |
71 _notify(); | |
72 _scheduledNotification = true; | |
73 } | |
74 | |
75 Future _notify() async { | |
76 _onRendered.add(new RenderedEvent<T>(element, _dirty)); | |
77 _scheduledNotification = false; | |
78 } | |
79 } | |
OLD | NEW |