diff --git a/examples/fitness/lib/feed.dart b/examples/fitness/lib/feed.dart index 263a558723c719ed21bfb2b0baa4d9d3df0ebc91..83b2ae1bd41ea327ba38cec9e315bbc9d22d246f 100644 --- a/examples/fitness/lib/feed.dart +++ b/examples/fitness/lib/feed.dart @@ -173,28 +173,59 @@ class FeedFragment extends StatefulComponent { }); } + Widget buildChart() { + double startX; + double endX; + double startY; + double endY; + List dataSet = new List(); + for (FitnessItem item in userData) { + if (item is Measurement) { + double x = item.when.millisecondsSinceEpoch.toDouble(); + double y = item.weight; + if (startX == null) + startX = x; + endX = x; + if (startY == null || startY > y) + startY = y; + if (endY == null || endY < y) + endY = y; + dataSet.add(new Point(x, y)); + } + } + playfair.ChartData data = new playfair.ChartData( + startX: startX, + startY: startY, + endX: endX, + endY: endY, + dataSet: dataSet + ); + return new playfair.Chart(data: data); + } + Widget buildBody() { TextStyle style = Theme.of(this).text.title; + if (userData.length == 0) + return new Material( + type: MaterialType.canvas, + child: new Flex( + [new Text("No data yet.\nAdd some!", style: style)], + justifyContent: FlexJustifyContent.center + ) + ); switch (_fitnessMode) { case FitnessMode.feed: - if (userData.length > 0) - return new FitnessItemList( - items: userData, - onDismissed: _handleItemDismissed - ); - return new Material( - type: MaterialType.canvas, - child: new Flex( - [new Text("No data yet.\nAdd some!", style: style)], - justifyContent: FlexJustifyContent.center - ) + return new FitnessItemList( + items: userData, + onDismissed: _handleItemDismissed ); case FitnessMode.chart: return new Material( type: MaterialType.canvas, - child: new Flex([ - new Text("Charts are coming soon!", style: style) - ], justifyContent: FlexJustifyContent.center) + child: new Container( + padding: const EdgeDims.all(20.0), + child: buildChart() + ) ); } } diff --git a/examples/fitness/lib/main.dart b/examples/fitness/lib/main.dart index e30787c52000dbb897d10f4c13f4421c29e8cf44..5cefca9c3c4a89f1a15d661ecde6cebc304d30cb 100644 --- a/examples/fitness/lib/main.dart +++ b/examples/fitness/lib/main.dart @@ -4,6 +4,7 @@ library fitness; +import 'package:playfair/playfair.dart' as playfair; import 'package:sky/editing/input.dart'; import 'package:sky/painting/text_style.dart'; import 'package:sky/theme/colors.dart' as colors; diff --git a/examples/fitness/pubspec.yaml b/examples/fitness/pubspec.yaml index f1c1d0ab87790e9d4e64a92df21caa78207cd17d..951ea09d376d55249c3abfefb06a0979aca4ce44 100644 --- a/examples/fitness/pubspec.yaml +++ b/examples/fitness/pubspec.yaml @@ -2,6 +2,7 @@ name: fitness dependencies: sky: any sky_tools: any + playfair: any path: "^1.3.6" dependency_overrides: material_design_icons: diff --git a/sky/engine/core/core.gni b/sky/engine/core/core.gni index 94821df344e098041333d198e08632c3b3ba2149..c186761ee1f5b7bba20f31abaa853efdc7568414 100644 --- a/sky/engine/core/core.gni +++ b/sky/engine/core/core.gni @@ -464,6 +464,8 @@ sky_core_files = [ "painting/Size.cpp", "painting/Size.h", "painting/TransferMode.h", + "painting/Typeface.cpp", + "painting/Typeface.h", "rendering/BidiRun.h", "rendering/BidiRunForLine.cpp", "rendering/BidiRunForLine.h", @@ -682,6 +684,7 @@ core_idl_files = get_path_info([ "painting/PictureRecorder.idl", "painting/RRect.idl", "painting/Shader.idl", + "painting/Typeface.idl", "view/EventCallback.idl", "view/FrameCallback.idl", "view/View.idl", diff --git a/sky/engine/core/painting/Canvas.cpp b/sky/engine/core/painting/Canvas.cpp index b0c81a7ec5ade5b1292ef1b199af865032e3944b..fbd34bd372f2423a49e7dd747b59fe4b44a1b861 100644 --- a/sky/engine/core/painting/Canvas.cpp +++ b/sky/engine/core/painting/Canvas.cpp @@ -264,6 +264,14 @@ void Canvas::drawPaintingNode(PaintingNode* paintingNode, const Point& p) translate(-p.sk_point.x(), -p.sk_point.y()); } +void Canvas::drawText(const String& text, const Point& p, const Paint& paint) +{ + if (!m_canvas) + return; + ASSERT(text); + m_canvas->drawText(text.utf8().data(), text.length(), p.sk_point.x(), p.sk_point.y(), paint.sk_paint); +} + void Canvas::drawAtlas(CanvasImage* atlas, const Vector& transforms, const Vector& rects, const Vector& colors, SkXfermode::Mode mode, diff --git a/sky/engine/core/painting/Canvas.h b/sky/engine/core/painting/Canvas.h index e2ed9f2bc2ec5856c7e70b6baae679e0af037bdf..e126e44147806fe0753a11689a2a63f762edbb26 100644 --- a/sky/engine/core/painting/Canvas.h +++ b/sky/engine/core/painting/Canvas.h @@ -91,6 +91,7 @@ public: void drawPicture(Picture* picture); void drawDrawable(Drawable* drawable); void drawPaintingNode(PaintingNode* paintingNode, const Point& p); + void drawText(const String& text, const Point& p, const Paint& paint); void drawAtlas(CanvasImage* atlas, const Vector& transforms, const Vector& rects, diff --git a/sky/engine/core/painting/Canvas.idl b/sky/engine/core/painting/Canvas.idl index fef62130ec6d157f03273847336345454146514b..c2c96eb4d9f1935d83b857174797cef5448e6f59 100644 --- a/sky/engine/core/painting/Canvas.idl +++ b/sky/engine/core/painting/Canvas.idl @@ -39,6 +39,7 @@ void drawPicture(Picture picture); void drawDrawable(Drawable drawable); void drawPaintingNode(PaintingNode paintingNode, Point p); + void drawText(DOMString text, Point p, Paint paint); // TODO(eseidel): Paint should be optional, but optional doesn't work. [RaisesException] void drawAtlas(Image image, diff --git a/sky/engine/core/painting/Paint.cpp b/sky/engine/core/painting/Paint.cpp index a882a2a8769134bd59c4256b769556a0727dd47d..8fbdf89cdae5282ca9baffecda8da415be9cf13c 100644 --- a/sky/engine/core/painting/Paint.cpp +++ b/sky/engine/core/painting/Paint.cpp @@ -12,6 +12,7 @@ #include "sky/engine/core/painting/PaintingStyle.h" #include "sky/engine/core/painting/Shader.h" #include "sky/engine/core/painting/TransferMode.h" +#include "sky/engine/core/painting/Typeface.h" #include "sky/engine/core/script/dom_dart_state.h" #include "sky/engine/wtf/text/StringBuilder.h" #include "third_party/skia/include/core/SkColorFilter.h" @@ -35,6 +36,7 @@ enum PaintFields { kShader, kStyle, kTransferMode, + kTypeface, // kNumberOfPaintFields must be last. kNumberOfPaintFields, @@ -82,6 +84,8 @@ Paint DartConverter::FromDart(Dart_Handle dart_paint) { paint.setStyle(DartConverter::FromDart(values[kStyle])); if (!Dart_IsNull(values[kTransferMode])) paint.setXfermodeMode(DartConverter::FromDart(values[kTransferMode])); + if (!Dart_IsNull(values[kTypeface])) + paint.setTypeface(DartConverter::FromDart(values[kTypeface])->typeface()); result.is_null = false; return result; diff --git a/sky/engine/core/painting/Paint.dart b/sky/engine/core/painting/Paint.dart index d159b59eb5b350265f245410a58ac416650537f3..6e4ef5f82533bd2274665a44b5d9bd17d4e3085e 100644 --- a/sky/engine/core/painting/Paint.dart +++ b/sky/engine/core/painting/Paint.dart @@ -43,6 +43,7 @@ class Paint { Shader _shader; PaintingStyle _style; TransferMode _transferMode; + Typeface typeface; // Must match PaintFields enum in Paint.cpp. List get _value { @@ -57,6 +58,7 @@ class Paint { _shader, _style, _transferMode, + typeface ]; } @@ -71,6 +73,8 @@ class Paint { // TODO(mpcomplete): Figure out how to show a drawLooper. if (_drawLooper != null) result += ', drawLooper:true'; + if (typeface != null) + result += ', typeface: $_typeface'; result += ')'; return result; } diff --git a/sky/engine/core/painting/Typeface.cpp b/sky/engine/core/painting/Typeface.cpp new file mode 100644 index 0000000000000000000000000000000000000000..21aa933f05f21b867cf313b47d4d07f2b2ed7fc9 --- /dev/null +++ b/sky/engine/core/painting/Typeface.cpp @@ -0,0 +1,17 @@ +// 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. + +#include "sky/engine/core/painting/Typeface.h" + +namespace blink { + +Typeface::Typeface(PassRefPtr typeface) + : typeface_(typeface) { +} + +Typeface::~Typeface() +{ +} + +} // namespace blink diff --git a/sky/engine/core/painting/Typeface.h b/sky/engine/core/painting/Typeface.h new file mode 100644 index 0000000000000000000000000000000000000000..e7707f022df15e59df2a1387ee03288f65f4287c --- /dev/null +++ b/sky/engine/core/painting/Typeface.h @@ -0,0 +1,32 @@ +// 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. + +#ifndef SKY_ENGINE_CORE_PAINTING_TYPEFACE_H_ +#define SKY_ENGINE_CORE_PAINTING_TYPEFACE_H_ + +#include "sky/engine/tonic/dart_wrappable.h" +#include "sky/engine/wtf/PassRefPtr.h" +#include "sky/engine/wtf/RefCounted.h" +#include "third_party/skia/include/core/SkTypeface.h" + +namespace blink { + +class Typeface : public RefCounted, public DartWrappable { + DEFINE_WRAPPERTYPEINFO(); + public: + ~Typeface() override; + + SkTypeface* typeface() { return typeface_.get(); } + void set_typeface(PassRefPtr typeface) { typeface_ = typeface; } + + protected: + Typeface(PassRefPtr typeface); + + private: + RefPtr typeface_; +}; + +} // namespace blink + +#endif // SKY_ENGINE_CORE_PAINTING_TYPEFACE_H_ diff --git a/sky/engine/core/painting/Typeface.idl b/sky/engine/core/painting/Typeface.idl new file mode 100644 index 0000000000000000000000000000000000000000..427a3f7c70f096da2ad596980f7e82e3e0d4271f --- /dev/null +++ b/sky/engine/core/painting/Typeface.idl @@ -0,0 +1,6 @@ +// 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. + +interface Typeface { +};