OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:html'; | 5 import 'dart:html'; |
6 import 'dart:async'; | 6 import 'dart:async'; |
7 import 'package:observatory/models.dart' as M | 7 import 'package:observatory/models.dart' as M |
8 show IsolateRef, IsolateUpdateEvent; | 8 show IsolateRef, EventRepository; |
9 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; | 9 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
10 import 'package:observatory/src/elements/helpers/tag.dart'; | 10 import 'package:observatory/src/elements/helpers/tag.dart'; |
11 import 'package:observatory/src/elements/helpers/uris.dart'; | 11 import 'package:observatory/src/elements/helpers/uris.dart'; |
12 import 'package:observatory/src/elements/nav/menu.dart'; | 12 import 'package:observatory/src/elements/nav/menu.dart'; |
13 import 'package:observatory/src/elements/nav/menu_item.dart'; | 13 import 'package:observatory/src/elements/nav/menu_item.dart'; |
14 | 14 |
15 class NavIsolateMenuElement extends HtmlElement implements Renderable { | 15 class NavIsolateMenuElement extends HtmlElement implements Renderable { |
16 static const tag = const Tag<NavIsolateMenuElement>('nav-isolate-menu', | 16 static const tag = const Tag<NavIsolateMenuElement>('nav-isolate-menu', |
17 dependencies: const [NavMenuElement.tag, | 17 dependencies: const [NavMenuElement.tag, |
18 NavMenuItemElement.tag]); | 18 NavMenuItemElement.tag]); |
19 | 19 |
20 RenderingScheduler _r; | 20 RenderingScheduler _r; |
21 | 21 |
22 Stream<RenderedEvent<NavIsolateMenuElement>> get onRendered => _r.onRendered; | 22 Stream<RenderedEvent<NavIsolateMenuElement>> get onRendered => _r.onRendered; |
23 | 23 |
24 Stream<M.IsolateUpdateEvent> _updates; | 24 bool _last; |
| 25 M.IsolateRef _isolate; |
| 26 M.EventRepository _events; |
25 StreamSubscription _updatesSubscription; | 27 StreamSubscription _updatesSubscription; |
26 | 28 |
27 bool _last; | |
28 M.IsolateRef _isolate; | |
29 bool get last => _last; | 29 bool get last => _last; |
30 M.IsolateRef get isolate => _isolate; | 30 M.IsolateRef get isolate => _isolate; |
| 31 |
31 set last(bool value) => _last = _r.checkAndReact(_last, value); | 32 set last(bool value) => _last = _r.checkAndReact(_last, value); |
32 | 33 |
33 factory NavIsolateMenuElement(M.IsolateRef isolate, | 34 factory NavIsolateMenuElement(M.IsolateRef isolate, |
34 Stream<M.IsolateUpdateEvent> updates, {bool last: false, | 35 M.EventRepository events, {bool last: false, |
35 RenderingQueue queue}) { | 36 RenderingQueue queue}) { |
36 assert(isolate != null); | 37 assert(isolate != null); |
| 38 assert(events != null); |
37 assert(last != null); | 39 assert(last != null); |
38 NavIsolateMenuElement e = document.createElement(tag.name); | 40 NavIsolateMenuElement e = document.createElement(tag.name); |
39 e._r = new RenderingScheduler(e, queue: queue); | 41 e._r = new RenderingScheduler(e, queue: queue); |
40 e._isolate = isolate; | 42 e._isolate = isolate; |
41 e._last = last; | 43 e._last = last; |
42 e._updates = updates; | 44 e._events = events; |
43 return e; | 45 return e; |
44 } | 46 } |
45 | 47 |
46 NavIsolateMenuElement.created() : super.created() { | 48 NavIsolateMenuElement.created() : super.created() { |
47 _r = new RenderingScheduler(this); | 49 _r = new RenderingScheduler(this); |
48 createShadowRoot(); | 50 createShadowRoot(); |
49 } | 51 } |
50 | 52 |
51 @override | 53 @override |
52 void attached() { | 54 void attached() { |
53 super.attached(); | 55 super.attached(); |
54 assert(_isolate != null); | 56 _updatesSubscription = _events.onIsolateUpdate |
55 assert(_updates != null); | 57 .where((e) => e.isolate.id == isolate.id) |
| 58 .listen((e) { _isolate = e.isolate; _r.dirty(); }); |
56 _r.enable(); | 59 _r.enable(); |
57 _updatesSubscription = _updates | |
58 .where((M.IsolateUpdateEvent e) => e.isolate.id == isolate.id) | |
59 .listen((M.IsolateUpdateEvent e) { _isolate = e.isolate; _r.dirty(); }); | |
60 } | 60 } |
61 | 61 |
62 @override | 62 @override |
63 void detached() { | 63 void detached() { |
64 super.detached(); | 64 super.detached(); |
65 _r.disable(notify: true); | 65 _r.disable(notify: true); |
66 shadowRoot.children = []; | 66 shadowRoot.children = []; |
67 assert(_updatesSubscription != null); | 67 assert(_updatesSubscription != null); |
68 _updatesSubscription.cancel(); | 68 _updatesSubscription.cancel(); |
69 _updatesSubscription = null; | 69 _updatesSubscription = null; |
(...skipping 24 matching lines...) Expand all Loading... |
94 link: Uris.persistentHandles(isolate)), | 94 link: Uris.persistentHandles(isolate)), |
95 new NavMenuItemElement('ports', queue: _r.queue, | 95 new NavMenuItemElement('ports', queue: _r.queue, |
96 link: Uris.ports(isolate)), | 96 link: Uris.ports(isolate)), |
97 new NavMenuItemElement('logging', queue: _r.queue, | 97 new NavMenuItemElement('logging', queue: _r.queue, |
98 link: Uris.logging(isolate)), | 98 link: Uris.logging(isolate)), |
99 new ContentElement() | 99 new ContentElement() |
100 ] | 100 ] |
101 ]; | 101 ]; |
102 } | 102 } |
103 } | 103 } |
OLD | NEW |