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:async'; | |
6 | |
7 import 'package:observatory/src/elements/helpers/rendering_queue.dart'; | |
8 export 'package:observatory/src/elements/helpers/rendering_queue.dart'; | |
9 | |
10 /// A generic renderable object. | |
11 abstract class Renderable { | |
12 void render(); | |
13 } | |
14 | |
15 /// Even related to a Renderable rendering phase. | |
Cutch
2016/07/18 17:36:39
Event
cbernaschina
2016/07/18 17:39:29
Done.
| |
16 class RenderedEvent<T extends Renderable> { | |
17 /// Renderable to which the event is related | |
18 final T element; | |
19 /// Is another rendering scheduled for this element. | |
20 final bool otherRenderScheduled; | |
21 | |
22 RenderedEvent(this.element, this.otherRenderScheduled) { | |
23 assert(element != null); | |
24 assert(otherRenderScheduled != null); | |
25 } | |
26 } | |
27 | |
28 /// Scheduler for rendering operations. | |
29 class RenderingScheduler<T extends Renderable> implements RenderingTask { | |
30 bool _enabled = false; | |
31 bool _dirty = false; | |
32 bool _renderingScheduled = false; | |
33 bool _notificationScheduled = false; | |
34 /// Element managed by this scheduler. | |
35 final T element; | |
36 /// Queue used for rendering operations. | |
37 final RenderingQueue queue; | |
38 | |
39 final StreamController<RenderedEvent<T>> _onRendered = | |
40 new StreamController<RenderedEvent<T>>.broadcast(); | |
41 Stream<RenderedEvent<T>> get onRendered => _onRendered.stream; | |
42 | |
43 /// Creates a new scheduler for an element. | |
44 /// If no queue is provided it will create a new default configured queue. | |
45 factory RenderingScheduler(T element, {RenderingQueue queue}) { | |
46 assert(element != null); | |
47 if (queue == null) { queue = new RenderingQueue(); } | |
48 return new RenderingScheduler<T>._(element, queue); | |
49 } | |
50 | |
51 RenderingScheduler._(this.element, this.queue); | |
52 | |
53 /// Enable the scheduler. | |
54 /// New dirty or schedule request will be considered. | |
55 void enable() { | |
56 if (_enabled) return; | |
57 _enabled = true; | |
58 scheduleRendering(); | |
59 } | |
60 | |
61 /// Disable the scheduler. | |
62 /// New dirty or schedule request will be discarded. | |
63 /// [optional] notify: send a final RenderEvent. | |
64 void disable({bool notify: false}) { | |
65 assert(notify != null); | |
66 if (!_enabled) return; | |
67 _enabled = false; | |
68 if (notify) scheduleNotification(); | |
69 } | |
70 | |
71 /// Set the object as dirty. A rendering will be scheduled. | |
72 void dirty() { | |
73 if (_dirty) return; | |
74 _dirty = true; | |
75 scheduleRendering(); | |
76 } | |
77 | |
78 /// Schedules a new rendering phase. | |
79 void scheduleRendering() { | |
80 if (_renderingScheduled) return; | |
81 if (!_enabled) return; | |
82 queue.enqueue(this); | |
83 _renderingScheduled = true; | |
84 } | |
85 | |
86 /// Renders the element (if the scheduler is enabled). | |
87 /// It will clear the dirty flag. | |
88 void render(){ | |
Cutch
2016/07/18 17:36:39
() {
cbernaschina
2016/07/18 17:39:29
Done.
| |
89 if (!_enabled) return; | |
90 _dirty = false; | |
91 element.render(); | |
92 _renderingScheduled = false; | |
93 scheduleNotification(); | |
94 if (_dirty) scheduleRendering(); | |
95 } | |
96 | |
97 /// Schedules a notification. | |
98 void scheduleNotification() { | |
99 if (_notificationScheduled) return; | |
100 _notify(); | |
101 _notificationScheduled = true; | |
102 } | |
103 | |
104 Future _notify() async { | |
105 _onRendered.add(new RenderedEvent<T>(element, _dirty)); | |
106 _notificationScheduled = false; | |
107 } | |
108 } | |
OLD | NEW |