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:material_ui/material_ui.dart';
7 : import 'dart:math';
8 :
9 : class PieRadiusPainter extends AbstractPainter {
10 : final List<ChartValue> data;
11 : late final double max;
12 :
13 0 : PieRadiusPainter({
14 : required this.data,
15 : required super.indent,
16 : }) {
17 0 : int length = data.where((o) => o.value > 0).length;
18 0 : if (length == 1) {
19 : length = 0;
20 : }
21 0 : max = data.fold(0.0, (v, o) => v + o.value) * (1 + indent * length);
22 : }
23 :
24 0 : @override
25 : void paint(Canvas canvas, Size size) {
26 0 : double startPoint = pi / 2;
27 0 : for (int i = 0; i < data.length; i++) {
28 0 : startPoint = _drawArc(canvas, size, startPoint, i);
29 : }
30 : }
31 :
32 0 : double _drawArc(Canvas canvas, Size size, double startPoint, int step) {
33 0 : final strokeWidth = size.width / 4;
34 0 : final paint = Paint()
35 0 : ..color = data[step].color
36 0 : ..strokeWidth = strokeWidth
37 0 : ..style = PaintingStyle.stroke;
38 0 : final paintBorder = Paint()
39 0 : ..strokeWidth = strokeWidth * 1.1
40 0 : ..color = data[step].color.withValues(alpha: 0.3)
41 0 : ..style = PaintingStyle.stroke;
42 : const full = 2 * pi;
43 0 : final shift = indent * full;
44 0 : double endPoint = (data[step].value / max) * full;
45 :
46 0 : var center = Offset(size.width / 2, size.height / 2);
47 0 : var radius = [size.width, size.height].reduce(min) / 4;
48 :
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 : }
|