Chromium Code Reviews| Index: runtime/observatory/lib/src/elements/curly_block.dart |
| diff --git a/runtime/observatory/lib/src/elements/curly_block.dart b/runtime/observatory/lib/src/elements/curly_block.dart |
| index 004a02e36422e64341a952da5b85692070fd4f7b..34ecc975af0b1bde960cd3ef7b1b336ed3555479 100644 |
| --- a/runtime/observatory/lib/src/elements/curly_block.dart |
| +++ b/runtime/observatory/lib/src/elements/curly_block.dart |
| @@ -4,52 +4,102 @@ |
| library curly_block_element; |
| -import 'package:polymer/polymer.dart'; |
| -import 'observatory_element.dart'; |
| +import 'dart:async'; |
| +import 'dart:html'; |
| +import 'helpers/tag.dart'; |
|
Cutch
2016/07/07 19:50:57
fully qualify this import with "package:..."
cbernaschina
2016/07/07 22:08:13
Done.
|
| -@CustomTag('curly-block') |
| -class CurlyBlockElement extends ObservatoryElement { |
| - CurlyBlockElement.created() : super.created(); |
| +class CurlyBlockToggleEvent { |
| + final CurlyBlockElement control; |
| - @observable bool expanded = false; |
| - @observable bool busy = false; |
| - @published var callback = null; |
| - @published bool expand = false; |
| - @published String expandKey; |
| + CurlyBlockToggleEvent(this.control); |
| +} |
| - void expandChanged(oldValue) { |
| - expanded = expand; |
| - } |
| +class CurlyBlockElement extends HtmlElement { |
| + static final StyleElement _style = () { |
| + var style = new StyleElement(); |
| + style.text = 'span.curly-block {' |
| + ' color: #0489c3;' |
| + ' cursor: pointer;' |
| + '}' |
| + 'span.curly-block.disabled {' |
| + ' color: white;' |
| + ' cursor: wait;' |
| + '}'; |
| + return style; |
| + }(); |
| + |
| + static const tag = const Tag<CurlyBlockElement>('curly-block-wrapped'); |
| + |
| + bool _expanded; |
| + bool _disabled; |
| - void expandKeyChanged(oldValue) { |
| - if (expandKey != null) { |
| - var value = app.expansions[expandKey]; |
| - if (value != null) { |
| - if (expanded != value) { |
| - toggleExpand(null, null, null); |
| - } |
| - } |
| + bool get expanded => _expanded; |
| + set expanded(bool expanded) { |
| + if (_expanded != expanded) { |
| + _expanded = expanded; |
| + render(); |
| + _onToggle.add(new CurlyBlockToggleEvent(this)); |
| } |
| } |
| + bool get disabled => _disabled; |
| + set disabled(bool disabled) { |
| + if (_disabled != disabled) { |
| + _disabled = disabled; |
| + render(); |
| + } |
| + } |
| + |
| + final StreamController<CurlyBlockToggleEvent> _onToggle = |
| + new StreamController<CurlyBlockToggleEvent>(); |
| + Stream<CurlyBlockToggleEvent> get onToggle => _onToggle.stream; |
| + |
| + factory CurlyBlockElement({bool expanded: false, bool disabled:false}) { |
| + assert(expanded is bool); |
| + assert(disabled is bool); |
| + CurlyBlockElement e = document.createElement(tag.name); |
| + e._expanded = expanded; |
| + e._disabled = disabled; |
| + return e; |
| + } |
| + |
| + CurlyBlockElement.created() : super.created() { |
| + createShadowRoot(); |
| + } |
| + |
| + @override |
| + void attached() { |
| + super.attached(); |
| + render(); |
| + } |
| - void doneCallback() { |
| + void toggle() { |
| + if (disabled) return; |
| expanded = !expanded; |
| - if (expandKey != null) { |
| - app.expansions[expandKey] = expanded; |
| - } |
| - busy = false; |
| } |
| - void toggleExpand(var event, var b, var c) { |
| - assert(callback == null || expand == false); |
| - if (busy) { |
| - return; |
| - } |
| - busy = true; |
| - if (callback != null) { |
| - callback(!expanded, doneCallback); |
| + void render() { |
| + List<Element> children = [ |
| + _style.clone(true), |
| + new SpanElement()..text = '{' |
| + ]; |
| + SpanElement label = new SpanElement() |
| + ..classes = disabled ? ['curly-block', 'disabled'] : ['curly-block'] |
| + ..innerHtml = expanded ? |
| + ' ⊟ ' : ' ⊞ '; |
| + if (disabled) { |
| + children.add(label); |
| } else { |
| - doneCallback(); |
| + children.add(new AnchorElement() |
| + ..onClick.listen((_) { toggle(); }) |
| + ..children = [label]); |
| + } |
| + if (expanded) { |
| + children.addAll([ |
| + new BRElement(), |
| + new ContentElement() |
| + ]); |
| } |
| + children.add(new SpanElement()..text = '}'); |
| + shadowRoot.children = children; |
| } |
| } |