Skip to content
Snippets Groups Projects
counts_by_hour.dart 2.33 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/counts_by_hour.dart';
import 'package:scrobbles/ui/widgets/abstracts/custom_bar_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart';
class ChartCountsByHour extends CustomBarChart {
  final CountsByHourData chartData;

  const ChartCountsByHour({super.key, required this.chartData});
  final double verticalTicksInterval = 5;
  final String verticalAxisTitleSuffix = '%';

  @override
  Widget build(BuildContext context) {
    if (this.chartData.data.keys.length == 0) {
      return SizedBox(
        height: this.chartHeight,
      );
    }

    return Container(
      height: this.chartHeight,
      child: LayoutBuilder(
        builder: (context, constraints) {
          final double maxWidth = constraints.maxWidth;
          final int barsCount = this.chartData.data.keys.length;

          return getBarChart(
            barWidth: this.getBarWidth(maxWidth, barsCount),
            backgroundColor: Theme.of(context).colorScheme.onSurface,
          );
        },
      ),
    );
  }

  double getMaxCountsValue() {
    double maxValue = 0;

    this.chartData.data.keys.forEach((key) {
      double? counts = this.chartData.data[key];
      if (counts != null) {
        if (counts > maxValue) {
          maxValue = counts;
        }
      }
    });

    return maxValue;
  }

  List<BarChartGroupData> getDataCounts(double barWidth) {
    List<BarChartGroupData> data = [];

    final barColor = AppColors.contentColorCyan.darken(30);
    this.chartData.data.keys.forEach((day) {
      final double? counts = this.chartData.data[day];

      if (counts != null) {
        data.add(getBarItem(
          values: [counts],
          barColors: [barColor],
          barWidth: barWidth,
        ));
      }
    });

    return data;
  }

  Widget getHorizontalTitlesWidget(double value, TitleMeta meta) {
    String text = '';

    if (value % 4 == 0 || value == 23) {
      text = value.toInt().toString().padLeft(2, '0');
    }

    return SideTitleWidget(
      axisSide: meta.axisSide,
      space: 2,
      child: Text(
        text,
        style: const TextStyle(
          color: AppColors.mainTextColor1,
          fontSize: 11,
        ),
      ),
    );
  }
}