Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(704)

Side by Side Diff: runtime/observatory/lib/src/elements/helpers/rendering_scheduler.dart

Issue 2119733003: Wrapping leaf nodes in non polymer elements (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Converted script-link Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698