diff --git a/packages/playfair/lib/playfair.dart b/packages/playfair/lib/playfair.dart index 33c763f785c..ae6b25867c0 100644 --- a/packages/playfair/lib/playfair.dart +++ b/packages/playfair/lib/playfair.dart @@ -4,5 +4,10 @@ library playfair; -import 'dart:math' as math; +import 'dart:sky' as sky; +import 'package:sky/widgets/framework.dart'; +import 'package:sky/rendering/box.dart'; +import 'package:sky/rendering/object.dart'; + +part 'src/base.dart'; diff --git a/packages/playfair/lib/src/base.dart b/packages/playfair/lib/src/base.dart new file mode 100644 index 00000000000..64120e5c09f --- /dev/null +++ b/packages/playfair/lib/src/base.dart @@ -0,0 +1,96 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of playfair; + +class ChartData { + const ChartData({ this.startX, this.endX, this.startY, this.endY, this.dataSet }); + final double startX; + final double endX; + final double startY; + final double endY; + final List dataSet; +} + +class Chart extends LeafRenderObjectWrapper { + Chart({ Key key, this.data }) : super(key: key); + + final ChartData data; + + RenderChart createNode() => new RenderChart(data: data); + RenderChart get root => super.root; + + void syncRenderObject(Widget old) { + super.syncRenderObject(old); + root.data = data; + } +} + +class RenderChart extends RenderConstrainedBox { + + RenderChart({ + ChartData data + }) : _painter = new ChartPainter(data), + super(child: null, additionalConstraints: BoxConstraints.expand); + + final ChartPainter _painter; + + ChartData get data => _painter.data; + void set data (ChartData value) { + assert(value != null); + if (value == _painter.data) + return; + _painter.data = value; + markNeedsPaint(); + } + + void paint(PaintingCanvas canvas, Offset offset) { + assert(size.width != null); + assert(size.height != null); + _painter.paint(canvas, offset & size); + super.paint(canvas, offset); + } +} + +class ChartPainter { + ChartPainter(this.data); + + ChartData data; + + Point _convertPointToRectSpace(sky.Point point, Rect rect) { + double x = rect.left + ((point.x - data.startX) / (data.endX - data.startX)) * rect.width; + double y = rect.bottom - ((point.y - data.startY) / (data.endY - data.startY)) * rect.height; + return new Point(x, y); + } + + void _paintChart(sky.Canvas canvas, Rect rect) { + Paint paint = new Paint() + ..strokeWidth = 2.0 + ..color = const Color(0xFF000000); + List dataSet = data.dataSet; + assert(dataSet != null); + assert(dataSet.length > 0); + Path path = new Path(); + Point start = _convertPointToRectSpace(data.dataSet[0], rect); + path.moveTo(start.x, start.y); + for(sky.Point point in data.dataSet) { + Point current = _convertPointToRectSpace(point, rect); + canvas.drawCircle(current, 3.0, paint); + path.lineTo(current.x, current.y); + } + paint.setStyle(sky.PaintingStyle.stroke); + canvas.drawPath(path, paint); + } + + void _paintScale(sky.Canvas canvas, Rect rect) { + Paint paint = new Paint()..color = const Color(0xFF000000); + canvas.drawText("${data.startY}", rect.bottomRight, paint); + canvas.drawText("${data.endY}", rect.topRight, paint); + } + + void paint(sky.Canvas canvas, Rect rect) { + _paintChart(canvas, rect); + _paintScale(canvas, rect); + } +} diff --git a/packages/playfair/test/playfair_test.dart b/packages/playfair/test/playfair_test.dart index 736ee1fae38..6a516aff02f 100644 --- a/packages/playfair/test/playfair_test.dart +++ b/packages/playfair/test/playfair_test.dart @@ -1,12 +1,13 @@ -// Copyright (c) 2015 The Chromium Authors. All rights reserved. +// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. library playfair.test; -import 'package:test/test.dart'; +// import 'package:test/test.dart'; -import 'package:playfair/playfair.dart'; +// import 'package:playfair/playfair.dart'; void main() { + // TODO(jackson): Tests }