Skip to content
Snippets Groups Projects
top_artists.dart 3.31 KiB
Newer Older
import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart';

import 'package:scrobbles/config/app_colors.dart';
import 'package:scrobbles/models/topartists.dart';
import 'package:scrobbles/utils/color_extensions.dart';

class ChartTopArtists extends StatelessWidget {
  final TopArtistsData chartData;

  const ChartTopArtists({super.key, required this.chartData});

  @override
  Widget build(BuildContext context) {
    return AspectRatio(
      aspectRatio: 2.1,
      child: Row(
        children: <Widget>[
          Expanded(
            child: AspectRatio(
              aspectRatio: 1,
              child: PieChart(
                PieChartData(
                  sections: getPieChartData(),
                  sectionsSpace: 2,
                  centerSpaceRadius: 40,
                  startDegreeOffset: -45,
                  pieTouchData: PieTouchData(enabled: false),
                  borderData: FlBorderData(show: false),
          ),
          buildLegendWidget(),
        ],
      ),
    );
  }

  Color getColorIndex(int index) {
    const List<int> hexValues = [
      0x8dd3c7,
      0xffffb3,
      0xbebada,
      0xfb8072,
      0x80b1d3,
      0xfdb462,
      0xb3de69,
      0xfccde5,
      0xd9d9d9,
      0xbc80bd,
      0xccebc5,
      0xffed6f,
    ];

    return Color(hexValues[index % hexValues.length] + 0xff000000);
  }

  List<PieChartSectionData> getPieChartData() {
    List<PieChartSectionData> items = [];

    final radius = 40.0;
    final fontSize = 11.0;
    const shadows = [Shadow(color: Colors.black, blurRadius: 2)];

    int index = 0;

    this.chartData.topArtists.forEach((element) {
      Color baseColor = getColorIndex(index++);

      final PieChartSectionData item = PieChartSectionData(
        value: element.count.toDouble(),
        title: element.artistName,
        color: baseColor.darken(20),
        borderSide: BorderSide(
          color: baseColor.darken(40),
          width: 1,
        ),
        radius: radius,
        titleStyle: TextStyle(
          fontSize: fontSize,
          color: AppColors.mainTextColor1,
          shadows: shadows,
        ),
      );

      items.add(item);
    });

    return items;
  }

  Widget buildLegendWidget() {
    const double itemSize = 12;

    List<Widget> items = [];
    int index = 0;

    this.chartData.topArtists.forEach((element) {
      Color baseColor = getColorIndex(index++);

      final Widget item = Row(
        children: <Widget>[
          Container(
            width: itemSize,
            height: itemSize,
            decoration: BoxDecoration(
              shape: BoxShape.rectangle,
              color: baseColor.darken(20),
              border: Border.all(
                color: baseColor.darken(40),
                width: 1,
              ),
            ),
          ),
          const SizedBox(
            width: 4,
          ),
          Text(
            element.artistName + ' (' + element.count.toString() + ')',
            style: TextStyle(
              fontSize: itemSize - 2,
              fontWeight: FontWeight.bold,
            ),
          )
        ],
      );

      items.add(item);
    });

    return Column(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: items,
    );
  }
}