Advertisement
harmonyV

After second half

Jul 26th, 2024
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 5.34 KB | None | 0 0
  1. import 'package:flutter/material.dart';
  2. import 'package:habit_tracker/database/habit_database.dart';
  3. import 'package:habit_tracker/models/habit.dart';
  4. import 'package:habit_tracker/services/extensions/day.dart';
  5. import 'package:habit_tracker/services/lists_enums_maps.dart';
  6. import 'package:habit_tracker/services/providers/day_change_provider.dart';
  7. import 'package:provider/provider.dart';
  8. import 'package:table_calendar/table_calendar.dart';
  9.  
  10. class DefaultTileBuilder extends StatelessWidget {
  11.   const DefaultTileBuilder({
  12.     super.key,
  13.     required this.day,
  14.   });
  15.  
  16.   final DateTime day;
  17.  
  18.   @override
  19.   Widget build(BuildContext context) {
  20.     // ignore: unused_local_variable
  21.     final colorScheme = Theme.of(context).colorScheme;
  22.     final textTheme = Theme.of(context).textTheme;
  23.  
  24.     return Container(
  25.       alignment: Alignment.center,
  26.       margin: const EdgeInsets.all(6.0),
  27.       decoration: BoxDecoration(
  28.         color: returnHeatMapColor(context, day.withoutTime()),
  29.         borderRadius: BorderRadius.circular(8),
  30.       ),
  31.       child: Text(
  32.         "${day.day}",
  33.         style: textTheme.labelMedium!
  34.             .copyWith(color: colorScheme.onSecondaryContainer),
  35.       ),
  36.     );
  37.   }
  38. }
  39.  
  40. class SelectedTileBuilder extends StatelessWidget {
  41.   const SelectedTileBuilder({
  42.     super.key,
  43.     required DateTime? selectedDay,
  44.     required DateTime focusedDay,
  45.     required this.day,
  46.   })  : _selectedDay = selectedDay,
  47.         _focusedDay = focusedDay;
  48.  
  49.   final DateTime? _selectedDay;
  50.   final DateTime _focusedDay;
  51.   final DateTime day;
  52.  
  53.   @override
  54.   Widget build(BuildContext context) {
  55.     final colorScheme = Theme.of(context).colorScheme;
  56.     final textTheme = Theme.of(context).textTheme;
  57.  
  58.     return Container(
  59.       alignment: Alignment.center,
  60.       margin: const EdgeInsets.all(6.0),
  61.       decoration: BoxDecoration(
  62.           color: returnHeatMapColor(context, day.withoutTime()),
  63.           shape: BoxShape.rectangle,
  64.           border: isSameDay(_selectedDay, _focusedDay)
  65.               ? Border.all(color: colorScheme.outline, width: 1.5)
  66.               : Border.all(color: Colors.transparent),
  67.           borderRadius: BorderRadius.circular(8),
  68.           boxShadow: <BoxShadow>[
  69.             BoxShadow(
  70.               offset: const Offset(0, 1.2),
  71.               blurRadius: 3,
  72.               color: Colors.grey.shade400.withOpacity(0.7),
  73.             )
  74.           ]),
  75.       child: Text(
  76.         "${day.day}",
  77.         style: textTheme.labelMedium!
  78.             .copyWith(color: colorScheme.onSecondaryContainer),
  79.       ),
  80.     );
  81.   }
  82. }
  83.  
  84. class TodayTileBuilder extends StatelessWidget {
  85.   const TodayTileBuilder({
  86.     super.key,
  87.     required this.day,
  88.   });
  89.  
  90.   final DateTime day;
  91.  
  92.   @override
  93.   Widget build(BuildContext context) {
  94.     final colorScheme = Theme.of(context).colorScheme;
  95.     final textTheme = Theme.of(context).textTheme;
  96.  
  97.     return Container(
  98.       alignment: Alignment.center,
  99.       margin: const EdgeInsets.all(6.0),
  100.       decoration: BoxDecoration(
  101.         color: returnHeatMapColor(context, day.withoutTime()),
  102.         border: Border.all(
  103.           color: colorScheme.outline,
  104.           width: 2,
  105.         ),
  106.         borderRadius: BorderRadius.circular(8),
  107.       ),
  108.       child: Text(
  109.         "${day.day}",
  110.         style: textTheme.labelMedium,
  111.       ),
  112.     );
  113.   }
  114. }
  115.  
  116. class WeekEndTileBuilder extends StatelessWidget {
  117.   const WeekEndTileBuilder({
  118.     super.key,
  119.     required this.day,
  120.   });
  121.  
  122.   final DateTime day;
  123.  
  124.   @override
  125.   Widget build(BuildContext context) {
  126.     // ignore: unused_local_variable
  127.     final colorScheme = Theme.of(context).colorScheme;
  128.     final textTheme = Theme.of(context).textTheme;
  129.  
  130.     return Container(
  131.       alignment: Alignment.center,
  132.       margin: const EdgeInsets.all(6.0),
  133.       decoration: BoxDecoration(
  134.         color: context.watch<DayChangeProvider>().isDayChanged
  135.             ? Colors.amber
  136.             : returnHeatMapColor(context, day.withoutTime()),
  137.         borderRadius: BorderRadius.circular(8),
  138.       ),
  139.       child: Text(
  140.         "${day.day}",
  141.         style: textTheme.labelMedium!.copyWith(
  142.           color: Colors.grey.shade500,
  143.         ),
  144.       ),
  145.     );
  146.   }
  147. }
  148.  
  149. Map<DateTime, int> prepareHeatMapDataset(List<Habit> habits) {
  150.   final dataset = <DateTime, int>{};
  151.  
  152.   for (Habit habit in habits) {
  153.     for (DateTime date in habit.completedDays) {
  154.       // normalize date to avoid time mismatch
  155.       final normalizedDate = DateTime(date.year, date.month, date.day);
  156.  
  157.       // if date already exists in dataset, increment its count
  158.       if (dataset.containsKey(normalizedDate)) {
  159.         dataset[normalizedDate] = dataset[normalizedDate]! + 1;
  160.       }
  161.       // initialize it with a count of 1
  162.       else {
  163.         dataset[normalizedDate] = 1;
  164.       }
  165.     }
  166.   }
  167.   return dataset;
  168. }
  169.  
  170. Color returnHeatMapColor(BuildContext context, DateTime day) {
  171.   final habitDatabase = context.watch<HabitDatabase>();
  172.   final currentHabits = habitDatabase.listOfHabits;
  173.   final dataset = prepareHeatMapDataset(currentHabits);
  174.   final maxInt = heatMapColors.length;
  175.  
  176.   Color? color;
  177.  
  178.   if (dataset.containsKey(day)) {
  179.     if (dataset[day]! <= maxInt) {
  180.       color = heatMapColors[dataset[day]];
  181.     } else {
  182.       color = heatMapColors[maxInt];
  183.     }
  184.   } else {
  185.     color = Colors.white;
  186.   }
  187.  
  188.   return color!;
  189. }
  190.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement