Skip to content
Snippets Groups Projects
settings_form.dart 15.3 KiB
Newer Older
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:scrobbles/cubit/activity/data_counts_by_day_cubit.dart';
import 'package:scrobbles/cubit/activity/data_counts_by_hour_cubit.dart';
import 'package:scrobbles/cubit/activity/data_discoveries_cubit.dart';
import 'package:scrobbles/cubit/activity/data_heatmap_cubit.dart';
import 'package:scrobbles/cubit/activity/data_new_artists_cubit.dart';
import 'package:scrobbles/cubit/activity/data_new_tracks_cubit.dart';
import 'package:scrobbles/cubit/activity/data_statistics_recent_cubit.dart';
import 'package:scrobbles/cubit/activity/data_timeline_cubit.dart';
import 'package:scrobbles/cubit/activity/data_top_artists_cubit.dart';
import 'package:scrobbles/config/application_config.dart';

class SettingsForm extends StatefulWidget {
  const SettingsForm({super.key});

  @override
  State<SettingsForm> createState() => _SettingsFormState();
}

class _SettingsFormState extends State<SettingsForm> {
  String discoveriesDaysCount = ApplicationConfig.config
      .getFromCode(ApplicationConfig.parameterCodeDiscoveriesDaysCount)
      .defaultValue;
  String distributionDaysCount = ApplicationConfig.config
      .getFromCode(ApplicationConfig.parameterCodeDistributionDaysCount)
      .defaultValue;
  String statisticsRecentDaysCount = ApplicationConfig.config
      .getFromCode(ApplicationConfig.parameterCodeStatisticsRecentDaysCount)
      .defaultValue;
  String timelineDaysCount = ApplicationConfig.config
      .getFromCode(ApplicationConfig.parameterCodeTimelineDaysCount)
      .defaultValue;
  String topArtistsDaysCount = ApplicationConfig.config
      .getFromCode(ApplicationConfig.parameterCodeTopArtistsDaysCount)
      .defaultValue;
  String newArtistsCount = ApplicationConfig.config
      .getFromCode(ApplicationConfig.parameterCodeNewArtistsCount)
      .defaultValue;
  String newTracksCount = ApplicationConfig.config
      .getFromCode(ApplicationConfig.parameterCodeNewTracksCount)
      .defaultValue;
  final List<bool> _selectedDiscoveriesDaysCount = [];
  final List<bool> _selectedDistributionDaysCount = [];
  final List<bool> _selectedStatisticsRecentDaysCount = [];
  final List<bool> _selectedTimelineDaysCount = [];
  final List<bool> _selectedTopArtistsDaysCount = [];
  final List<bool> _selectedNewArtistsCount = [];
  final List<bool> _selectedNewTracksCount = [];

  @override
  void didChangeDependencies() {
    ActivitySettings settings = BlocProvider.of<ActivitySettingsCubit>(context).state.settings;
    discoveriesDaysCount = settings.get(ApplicationConfig.parameterCodeDiscoveriesDaysCount);
    distributionDaysCount = settings.get(ApplicationConfig.parameterCodeDistributionDaysCount);
    statisticsRecentDaysCount =
        settings.get(ApplicationConfig.parameterCodeStatisticsRecentDaysCount);
    timelineDaysCount = settings.get(ApplicationConfig.parameterCodeTimelineDaysCount);
    topArtistsDaysCount = settings.get(ApplicationConfig.parameterCodeTopArtistsDaysCount);
    newArtistsCount = settings.get(ApplicationConfig.parameterCodeNewArtistsCount);
    newTracksCount = settings.get(ApplicationConfig.parameterCodeNewTracksCount);
    _selectedDiscoveriesDaysCount.clear();
    for (var parameterItemValue in ApplicationConfig.allowedDaysCountValues) {
      _selectedDiscoveriesDaysCount.add(parameterItemValue.value == discoveriesDaysCount);
    }
    _selectedDistributionDaysCount.clear();
    for (var parameterItemValue in ApplicationConfig.allowedDaysCountValues) {
      _selectedDistributionDaysCount.add(parameterItemValue.value == distributionDaysCount);
    }
    _selectedStatisticsRecentDaysCount.clear();
    for (var parameterItemValue in ApplicationConfig.allowedDaysCountValues) {
      _selectedStatisticsRecentDaysCount
          .add(parameterItemValue.value == statisticsRecentDaysCount);
    }
    _selectedTimelineDaysCount.clear();
    for (var parameterItemValue in ApplicationConfig.allowedDaysCountValues) {
      _selectedTimelineDaysCount.add(parameterItemValue.value == timelineDaysCount);
    }

    _selectedTopArtistsDaysCount.clear();
    for (var parameterItemValue in ApplicationConfig.allowedDaysCountValues) {
      _selectedTopArtistsDaysCount.add(parameterItemValue.value == topArtistsDaysCount);
    }

    _selectedNewArtistsCount.clear();
    for (var parameterItemValue in ApplicationConfig.allowedCountValues) {
      _selectedNewArtistsCount.add(parameterItemValue.value == newArtistsCount);
    }

    _selectedNewTracksCount.clear();
    for (var parameterItemValue in ApplicationConfig.allowedCountValues) {
      _selectedNewTracksCount.add(parameterItemValue.value == newTracksCount);
    }

    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    void saveSettings() {
      BlocProvider.of<ActivitySettingsCubit>(context).setValues(values: {
        ApplicationConfig.parameterCodeDiscoveriesDaysCount: discoveriesDaysCount,
        ApplicationConfig.parameterCodeDistributionDaysCount: distributionDaysCount,
        ApplicationConfig.parameterCodeStatisticsRecentDaysCount: statisticsRecentDaysCount,
        ApplicationConfig.parameterCodeTimelineDaysCount: timelineDaysCount,
        ApplicationConfig.parameterCodeTopArtistsDaysCount: topArtistsDaysCount,
        ApplicationConfig.parameterCodeNewArtistsCount: newArtistsCount,
        ApplicationConfig.parameterCodeNewTracksCount: newTracksCount,
      });
    }

    return Column(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.max,
      children: <Widget>[
        const SizedBox(height: 8),

        // Light/dark theme
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            const Text('settings_label_theme').tr(),
            const Row(
              mainAxisAlignment: MainAxisAlignment.end,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                ApplicationSettingsThemeModeCard(
                  mode: ThemeMode.system,
                  icon: UniconsLine.cog,
                ),
                ApplicationSettingsThemeModeCard(
                  mode: ThemeMode.light,
                  icon: UniconsLine.sun,
                ),
                ApplicationSettingsThemeModeCard(
                  mode: ThemeMode.dark,
                  icon: UniconsLine.moon,
                )
              ],
            ),
          ],
        ),

        const SizedBox(height: 16),

        AppTitle(text: tr('settings_title_days_count')),
        // Statistics (recent)
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Text('settings_label_statistics_recent_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  statisticsRecentDaysCount =
                      ApplicationConfig.allowedDaysCountValues[index].value;
                  for (int i = 0; i < _selectedStatisticsRecentDaysCount.length; i++) {
                    _selectedStatisticsRecentDaysCount[i] = i == index;
                saveSettings();
                BlocProvider.of<DataStatisticsRecentCubit>(context).refresh(context);
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedStatisticsRecentDaysCount,
              children: ApplicationConfig.allowedDaysCountValues
                  .map((ApplicationSettingsParameterItemValue parameterItemValue) =>
                      Text(parameterItemValue.toString()))
        // Timeline
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Text('settings_label_timeline_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  timelineDaysCount = ApplicationConfig.allowedDaysCountValues[index].value;
                  for (int i = 0; i < _selectedTimelineDaysCount.length; i++) {
                    _selectedTimelineDaysCount[i] = i == index;
                saveSettings();
                BlocProvider.of<DataTimelineCubit>(context).refresh(context);
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedTimelineDaysCount,
              children: ApplicationConfig.allowedDaysCountValues
                  .map((ApplicationSettingsParameterItemValue parameterItemValue) =>
                      Text(parameterItemValue.toString()))
        // Top Artists
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Text('settings_label_top_artists_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  topArtistsDaysCount = ApplicationConfig.allowedDaysCountValues[index].value;
                  for (int i = 0; i < _selectedTopArtistsDaysCount.length; i++) {
                    _selectedTopArtistsDaysCount[i] = i == index;
                saveSettings();
                BlocProvider.of<DataTopArtistsCubit>(context).refresh(context);
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedTopArtistsDaysCount,
              children: ApplicationConfig.allowedDaysCountValues
                  .map((ApplicationSettingsParameterItemValue parameterItemValue) =>
                      Text(parameterItemValue.toString()))
        // Discoveries
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Text('settings_label_discoveries_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  discoveriesDaysCount = ApplicationConfig.allowedDaysCountValues[index].value;
                  for (int i = 0; i < _selectedDiscoveriesDaysCount.length; i++) {
                    _selectedDiscoveriesDaysCount[i] = i == index;
                saveSettings();
                BlocProvider.of<DataDiscoveriesCubit>(context).refresh(context);
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedDiscoveriesDaysCount,
              children: ApplicationConfig.allowedDaysCountValues
                  .map((ApplicationSettingsParameterItemValue parameterItemValue) =>
                      Text(parameterItemValue.toString()))
        // Distribution by day/hour + heatmap
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Text('settings_label_distribution_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  distributionDaysCount =
                      ApplicationConfig.allowedDaysCountValues[index].value;
                  for (int i = 0; i < _selectedDistributionDaysCount.length; i++) {
                    _selectedDistributionDaysCount[i] = i == index;
                saveSettings();
                BlocProvider.of<DataCountsByDayCubit>(context).refresh(context);
                BlocProvider.of<DataCountsByHourCubit>(context).refresh(context);
                BlocProvider.of<DataHeatmapCubit>(context).refresh(context);
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedDistributionDaysCount,
              children: ApplicationConfig.allowedDaysCountValues
                  .map((ApplicationSettingsParameterItemValue parameterItemValue) =>
                      Text(parameterItemValue.toString()))
        const SizedBox(height: 8),
        AppTitle(text: tr('settings_title_counts')),

        // New artists count
        Row(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Text('settings_label_new_artists_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  newArtistsCount = ApplicationConfig.allowedCountValues[index].value;
                  for (int i = 0; i < _selectedNewArtistsCount.length; i++) {
                    _selectedNewArtistsCount[i] = i == index;
                  }
                });
                saveSettings();
                BlocProvider.of<DataNewArtistsCubit>(context).refresh(context);
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedNewArtistsCount,
              children: ApplicationConfig.allowedCountValues
                  .map((ApplicationSettingsParameterItemValue parameterItemValue) =>
                      Text(parameterItemValue.toString()))
                  .toList(),
            ),
          ],
        ),

        // New tracks count
        Row(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Text('settings_label_new_tracks_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  newTracksCount = ApplicationConfig.allowedCountValues[index].value;
                  for (int i = 0; i < _selectedNewTracksCount.length; i++) {
                    _selectedNewTracksCount[i] = i == index;
                  }
                });
                saveSettings();
                BlocProvider.of<DataNewTracksCubit>(context).refresh(context);
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedNewTracksCount,
              children: ApplicationConfig.allowedCountValues
                  .map((ApplicationSettingsParameterItemValue parameterItemValue) =>
                      Text(parameterItemValue.toString()))
                  .toList(),