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

Side by Side Diff: runtime/observatory/lib/src/elements/curly_block.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
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 library curly_block_element; 5 library curly_block_element;
6 6
7 import 'package:polymer/polymer.dart'; 7 import 'dart:async';
8 import 'observatory_element.dart'; 8 import 'dart:html';
9 import 'package:observatory/src/elements/helpers/tag.dart';
10 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
9 11
10 @CustomTag('curly-block') 12 class CurlyBlockToggleEvent {
11 class CurlyBlockElement extends ObservatoryElement { 13 final CurlyBlockElement control;
12 CurlyBlockElement.created() : super.created();
13 14
14 @observable bool expanded = false; 15 CurlyBlockToggleEvent(this.control);
15 @observable bool busy = false; 16 }
16 @published var callback = null;
17 @published bool expand = false;
18 @published String expandKey;
19 17
20 void expandChanged(oldValue) { 18 class CurlyBlockElement extends HtmlElement implements Renderable {
21 expanded = expand; 19 static final StyleElement _style = () {
20 var style = new StyleElement();
21 style.text = 'span.curly-block {'
22 ' color: #0489c3;'
23 ' cursor: pointer;'
24 '}'
25 'span.curly-block.disabled {'
26 ' color: white;'
27 ' cursor: wait;'
28 '}';
29 return style;
30 }();
31
32 static const tag = const Tag<CurlyBlockElement>('curly-block-wrapped');
33
34 RenderingScheduler<CurlyBlockElement> _r;
35
36 final StreamController<CurlyBlockToggleEvent> _onToggle =
37 new StreamController<CurlyBlockToggleEvent>();
38 Stream<CurlyBlockToggleEvent> get onToggle => _onToggle.stream;
39 Stream<RenderedEvent<CurlyBlockElement>> get onRendered => _r.onRendered;
40
41 bool _expanded;
42 bool _disabled;
43
44 bool get expanded => _expanded;
45 set expanded(bool expanded) {
46 if (_expanded != expanded) {
47 _expanded = expanded;
48 _onToggle.add(new CurlyBlockToggleEvent(this));
49 _r.dirty();
50 } else {
51 _r.scheduleNotification();
52 }
22 } 53 }
23 54 bool get disabled => _disabled;
24 void expandKeyChanged(oldValue) { 55 set disabled(bool disabled) {
25 if (expandKey != null) { 56 if (_disabled != disabled) {
26 var value = app.expansions[expandKey]; 57 _disabled = disabled;
27 if (value != null) { 58 _r.dirty();
28 if (expanded != value) { 59 } else {
29 toggleExpand(null, null, null); 60 _r.scheduleNotification();
30 }
31 }
32 } 61 }
33 } 62 }
34 63
35 void doneCallback() { 64 factory CurlyBlockElement({bool expanded: false, bool disabled:false}) {
36 expanded = !expanded; 65 assert(expanded != null);
37 if (expandKey != null) { 66 assert(disabled != null);
38 app.expansions[expandKey] = expanded; 67 CurlyBlockElement e = document.createElement(tag.name);
39 } 68 e._expanded = expanded;
40 busy = false; 69 e._disabled = disabled;
70 return e;
41 } 71 }
42 72
43 void toggleExpand(var event, var b, var c) { 73 CurlyBlockElement.created() : super.created() {
44 assert(callback == null || expand == false); 74 createShadowRoot();
45 if (busy) { 75 _r = new RenderingScheduler(this);
76 }
77
78 @override
79 void attached() {
80 super.attached();
81 _r.scheduleRendering();
82 }
83
84 @override
85 void detached() {
86 super.detached();
87 shadowRoot.children = [];
88 _r.scheduleNotification();
89 }
90
91 void toggle() {
92 if (disabled) {
93 _r.scheduleNotification();
46 return; 94 return;
47 } 95 }
48 busy = true; 96 expanded = !expanded;
49 if (callback != null) { 97 }
50 callback(!expanded, doneCallback); 98
99 void render() {
100 List<Element> children = [
101 _style.clone(true),
102 new SpanElement()..text = '{'
103 ];
104 SpanElement label = new SpanElement()
105 ..classes = disabled ? ['curly-block', 'disabled'] : ['curly-block']
106 ..innerHtml = expanded ?
107 '&nbsp;&nbsp;&#8863;&nbsp;&nbsp;' : '&nbsp;&nbsp;&#8862;&nbsp;&nbsp;';
108 if (disabled) {
109 children.add(label);
51 } else { 110 } else {
52 doneCallback(); 111 children.add(new AnchorElement()
112 ..onClick.listen((_) { toggle(); })
113 ..children = [label]);
53 } 114 }
115 if (expanded) {
116 children.addAll([
117 new BRElement(),
118 new ContentElement()
119 ]);
120 }
121 children.add(new SpanElement()..text = '}');
122 shadowRoot.children = children;
54 } 123 }
55 } 124 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698