Line data Source code
1 : // Copyright 2023 The terCAD team. All rights reserved. 2 : // Use of this source code is governed by a CC BY-NC-ND 4.0 license that can be found in the LICENSE file. 3 : 4 : import 'package:app_finance/charts/interface/chart_value.dart'; 5 : import 'package:app_finance/charts/painter/abstract_painter.dart'; 6 : import 'package:flutter/material.dart'; 7 : import 'dart:math'; 8 : 9 : class PieRadiusPainter extends AbstractPainter { 10 : final List<ChartValue> data; 11 : late final double max; 12 : double radius = 0; 13 : Offset center = const Offset(0, 0); 14 : 15 0 : PieRadiusPainter({ 16 : required this.data, 17 : required super.indent, 18 : }) { 19 0 : int length = data.where((o) => o.value > 0).length; 20 0 : if (length == 1) { 21 : length = 0; 22 : } 23 0 : max = data.fold(0.0, (v, o) => v + o.value) * (1 + indent * length); 24 : } 25 : 26 0 : @override 27 : void paint(Canvas canvas, Size size) { 28 0 : center = Offset(size.width, size.height * 3 / 4); 29 0 : radius = size.width / 2; 30 : 31 0 : double startPoint = pi / 2; 32 0 : for (int i = 0; i < data.length; i++) { 33 0 : startPoint = _drawArc(canvas, size, startPoint, i); 34 : } 35 : } 36 : 37 0 : double _drawArc(Canvas canvas, Size size, double startPoint, int step) { 38 0 : final paint = Paint() 39 0 : ..color = data[step].color 40 0 : ..strokeWidth = size.width / 2 41 0 : ..style = PaintingStyle.stroke; 42 0 : final paintBorder = Paint() 43 0 : ..strokeWidth = size.width * 1.1 / 2 44 0 : ..color = data[step].color.withOpacity(0.3) 45 0 : ..style = PaintingStyle.stroke; 46 : const full = 2 * pi; 47 0 : final shift = indent * full; 48 0 : double endPoint = (data[step].value / max) * full; 49 0 : final arc = Rect.fromCircle(center: center, radius: radius); 50 0 : canvas.drawArc(arc, startPoint - shift / 2, endPoint + shift, false, paintBorder); 51 0 : canvas.drawArc(arc, startPoint, endPoint, false, paint); 52 0 : return startPoint + endPoint + shift; 53 : } 54 : }