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

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 vm-connect 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:async';
6
7 import 'package:observatory/src/elements/helpers/rendering_queue.dart';
8 export 'package:observatory/src/elements/helpers/rendering_queue.dart';
9
10 abstract class Renderable {
11 void render();
12 }
13
14 class RenderedEvent<T> {
15 final T element;
16 final bool otherRenderScheduled;
17 RenderedEvent(this.element, this.otherRenderScheduled);
18 }
19
20 class RenderingScheduler<T extends Renderable> implements RenderingTask {
21 bool _enabled = false;
22 bool _dirty = false;
23 bool _scheduledRendering = false;
24 bool _scheduledNotification = false;
25 final T element;
26 final RenderingQueue queue;
27
28 final StreamController<RenderedEvent<T>> _onRendered;
29 final Stream<RenderedEvent<T>> onRendered;
30
31 factory RenderingScheduler(T element, {RenderingQueue queue}) {
32 assert(element != null);
33 if (queue == null) {
34 queue = new RenderingQueue();
35 }
36 var controller = new StreamController<RenderedEvent<T>>();
37 var stream = controller.stream.asBroadcastStream();
38 return new RenderingScheduler<T>._(element, queue, controller, stream);
39 }
40
41 RenderingScheduler._(this.element, this.queue, this._onRendered,
42 this.onRendered);
43
44 void enable() {
45 if (_enabled) return;
46 _enabled = true;
47 scheduleRendering();
48 }
49
50 void disable({bool notify: false}) {
51 if (!_enabled) return;
52 _enabled = false;
53 if (notify) scheduleNotification();
54 }
55
56 void dirty() {
57 if (_dirty) return;
58 _dirty = true;
59 scheduleRendering();
60 }
61
62 void scheduleRendering() {
63 if (_scheduledRendering) return;
64 if (!_enabled) return;
65 queue.enqueue(this);
66 _scheduledRendering = true;
67 }
68
69 void render(){
70 if (!_enabled) return;
71 _dirty = false;
72 element.render();
73 _scheduledRendering = false;
74 scheduleNotification();
75 if (_dirty) scheduleRendering();
76 }
77
78 void scheduleNotification() {
79 if (_scheduledNotification) return;
80 _notify();
81 _scheduledNotification = true;
82 }
83
84 Future _notify() async {
85 _onRendered.add(new RenderedEvent<T>(element, _dirty));
86 _scheduledNotification = false;
87 }
88 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698