| 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:html'; |
| 6 import 'dart:async'; |
| 7 import 'package:observatory/models.dart' as M; |
| 8 import 'package:charted/charted.dart'; |
| 9 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
| 10 import 'package:observatory/src/elements/helpers/tag.dart'; |
| 11 |
| 12 class MetricGraphElement extends HtmlElement implements Renderable { |
| 13 static const tag = const Tag<MetricGraphElement>('metric-graph'); |
| 14 |
| 15 RenderingScheduler<MetricGraphElement> _r; |
| 16 |
| 17 Stream<RenderedEvent<MetricGraphElement>> get onRendered => _r.onRendered; |
| 18 |
| 19 M.IsolateRef _isolate; |
| 20 M.Metric _metric; |
| 21 M.MetricRepository _metrics; |
| 22 Timer _timer; |
| 23 |
| 24 M.IsolateRef get isolate => _isolate; |
| 25 M.Metric get metric => _metric; |
| 26 |
| 27 factory MetricGraphElement(M.IsolateRef isolate, M.Metric metric, |
| 28 M.MetricRepository metrics, |
| 29 {RenderingQueue queue}) { |
| 30 assert(isolate != null); |
| 31 assert(metric != null); |
| 32 assert(metrics != null); |
| 33 MetricGraphElement e = document.createElement(tag.name); |
| 34 e._r = new RenderingScheduler(e, queue: queue); |
| 35 e._isolate = isolate; |
| 36 e._metric = metric; |
| 37 e._metrics = metrics; |
| 38 return e; |
| 39 } |
| 40 |
| 41 MetricGraphElement.created() : super.created(); |
| 42 |
| 43 @override |
| 44 void attached() { |
| 45 super.attached(); |
| 46 _r.enable(); |
| 47 _timer = new Timer.periodic(const Duration(seconds: 1), (_) => _r.dirty()); |
| 48 } |
| 49 |
| 50 @override |
| 51 void detached() { |
| 52 super.detached(); |
| 53 _r.disable(notify: true); |
| 54 children = []; |
| 55 _timer.cancel(); |
| 56 } |
| 57 |
| 58 final _columns = [ |
| 59 new ChartColumnSpec(label: 'Time', type: ChartColumnSpec.TYPE_TIMESTAMP), |
| 60 new ChartColumnSpec(label: 'Value', formatter: (v) => v.toString()) |
| 61 ]; |
| 62 |
| 63 void render() { |
| 64 final min = _metrics.getMinValue(_isolate, _metric); |
| 65 final max = _metrics.getMaxValue(_isolate, _metric); |
| 66 final rows = _metrics.getSamples(_isolate, _metric).map((s) => |
| 67 [s.time.millisecondsSinceEpoch, s.value]).toList(); |
| 68 final current = rows.last.last; |
| 69 |
| 70 var message = 'current: $current'; |
| 71 if (min != null) { |
| 72 message = 'min: $min, ' + message; |
| 73 } |
| 74 if (max != null) { |
| 75 message = message + ', max: $max'; |
| 76 } |
| 77 |
| 78 final host = new DivElement(); |
| 79 children = [ |
| 80 new DivElement()..classes = ['memberList'] |
| 81 ..children = [ |
| 82 new DivElement()..classes = ['memberItem'] |
| 83 ..children = min == null ? const [] : [ |
| 84 new DivElement()..classes = ['memberName'] |
| 85 ..text = 'min', |
| 86 new DivElement()..classes = ['memberValue'] |
| 87 ..text = '$min' |
| 88 ], |
| 89 new DivElement()..classes = ['memberItem'] |
| 90 ..children = [ |
| 91 new DivElement()..classes = ['memberName'] |
| 92 ..text = 'current', |
| 93 new DivElement()..classes = ['memberValue'] |
| 94 ..text = '$current' |
| 95 ], |
| 96 new DivElement()..classes = ['memberItem'] |
| 97 ..children = max == null ? const [] : [ |
| 98 new DivElement()..classes = ['memberName'] |
| 99 ..text = 'max', |
| 100 new DivElement()..classes = ['memberValue'] |
| 101 ..text = '$max' |
| 102 ] |
| 103 ], |
| 104 new DivElement()..classes = ['graph'] |
| 105 ..children = [ |
| 106 host |
| 107 ] |
| 108 ]; |
| 109 if (rows.length <= 1) { |
| 110 return; |
| 111 } |
| 112 final rect = host.getBoundingClientRect(); |
| 113 var series = new ChartSeries("one", [1], new LineChartRenderer()); |
| 114 var config = new ChartConfig([series], [0]); |
| 115 config.minimumSize = new Rect(rect.width, rect.height); |
| 116 final data = new ChartData(_columns, rows); |
| 117 new CartesianArea(host, data, config, state: new ChartState()).draw(); |
| 118 } |
| 119 } |
| OLD | NEW |