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 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 } |
OLD | NEW |