diff --git a/lib/data/models/statistic.dart b/lib/data/models/statistic.dart index 4fdbb05..e995d93 100644 --- a/lib/data/models/statistic.dart +++ b/lib/data/models/statistic.dart @@ -26,4 +26,23 @@ class Statistic { String toString() { return 'Statistic(id: $id, type: $type, scopes: $scopes, timeframe: $timeframe, selectedGroups: $selectedGroups, selectedGames: $selectedGames)'; } + + Statistic copyWith({ + StatisticType? type, + List? scopes, + Timeframe? timeframe, + List? selectedGroups, + List? selectedGames, + int? displayCount, + }) { + return Statistic( + id: id, + type: type ?? this.type, + scopes: scopes ?? this.scopes, + timeframe: timeframe ?? this.timeframe, + selectedGroups: selectedGroups ?? this.selectedGroups, + selectedGames: selectedGames ?? this.selectedGames, + displayCount: displayCount ?? this.displayCount, + ); + } } diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index b6ae56b..aef31dc 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -19,6 +19,7 @@ "color_red": "Rot", "color_teal": "Türkis", "color_yellow": "Gelb", + "displayed_entries": "Angezeigte Einträge", "confirm": "Bestätigen", "could_not_add_player": "Spieler:in {playerName} konnte nicht hinzugefügt werden", "@could_not_add_player": { diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index baf5006..902caad 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -18,6 +18,7 @@ "color_purple": "Purple", "color_red": "Red", "color_teal": "Teal", + "displayed_entries": "Displayed entries", "color_yellow": "Yellow", "confirm": "Confirm", "could_not_add_player": "Could not add player {playerName}", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 20067d4..37d0763 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -206,6 +206,12 @@ abstract class AppLocalizations { /// **'Teal'** String get color_teal; + /// No description provided for @displayed_entries. + /// + /// In en, this message translates to: + /// **'Displayed entries'** + String get displayed_entries; + /// No description provided for @color_yellow. /// /// In en, this message translates to: diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 8152185..9457988 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -62,6 +62,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get color_teal => 'Türkis'; + @override + String get displayed_entries => 'Angezeigte Einträge'; + @override String get color_yellow => 'Gelb'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 2366ce2..99ecca3 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -62,6 +62,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get color_teal => 'Teal'; + @override + String get displayed_entries => 'Displayed entries'; + @override String get color_yellow => 'Yellow'; diff --git a/lib/presentation/views/main_menu/statistics_view/statistic_detail_view.dart b/lib/presentation/views/main_menu/statistics_view/statistic_detail_view.dart index 4053cb3..06d93a4 100644 --- a/lib/presentation/views/main_menu/statistics_view/statistic_detail_view.dart +++ b/lib/presentation/views/main_menu/statistics_view/statistic_detail_view.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/models/player.dart'; import 'package:tallee/data/models/statistic.dart'; import 'package:tallee/l10n/generated/app_localizations.dart'; -import 'package:tallee/presentation/views/main_menu/statistics_view/create_statistic_view.dart' - show - translateScopeToString, - translateStatisticTypeToString, - translateTimeframeToString; +import 'package:tallee/presentation/views/main_menu/statistics_view/create_statistic_view.dart'; import 'package:tallee/presentation/widgets/buttons/haptic_icon_button.dart'; import 'package:tallee/presentation/widgets/tiles/info_tile.dart'; import 'package:tallee/presentation/widgets/tiles/statistics_tile.dart'; @@ -30,7 +28,7 @@ class StatisticDetailView extends StatefulWidget { } class _StatisticDetailViewState extends State { - int displayCount = 0; + late int displayCount; @override void initState() { @@ -48,7 +46,13 @@ class _StatisticDetailViewState extends State { const style = TextStyle(fontWeight: FontWeight.bold); return Scaffold( - appBar: AppBar(title: Text(title)), + appBar: AppBar( + title: Text(title), + leading: HapticIconButton( + icon: const Icon(Icons.arrow_back_ios_new), + onPressed: () => handleBack(context), + ), + ), body: SingleChildScrollView( padding: const EdgeInsets.all(12.0), child: Column( @@ -141,7 +145,7 @@ class _StatisticDetailViewState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const Text('Display count', style: style), + Text(loc.displayed_entries, style: style), Row( children: [ HapticIconButton( @@ -175,4 +179,11 @@ class _StatisticDetailViewState extends State { ), ); } + + // Handles saving the display count and giving it to statistics view + Future handleBack(BuildContext context) async { + final db = Provider.of(context, listen: false); + await db.statisticDao.updateDisplayCount(widget.statistic.id, displayCount); + if (context.mounted) Navigator.of(context).pop(displayCount); + } } diff --git a/lib/presentation/views/main_menu/statistics_view/statistics_view.dart b/lib/presentation/views/main_menu/statistics_view/statistics_view.dart index d981b0a..3381267 100644 --- a/lib/presentation/views/main_menu/statistics_view/statistics_view.dart +++ b/lib/presentation/views/main_menu/statistics_view/statistics_view.dart @@ -26,6 +26,7 @@ class _StatisticsViewState extends State { bool isLoading = true; List _allMatches = const []; List _allPlayers = const []; + List _statistics = const []; List statisticTiles = []; @override @@ -34,7 +35,7 @@ class _StatisticsViewState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; - getStatisticTiles(context); + loadStatistics(context); }); } @@ -84,15 +85,16 @@ class _StatisticsViewState extends State { context, adaptivePageRoute( builder: (context) => CreateStatisticView( - onStatisticCreated: () => getStatisticTiles(context), + onStatisticCreated: () => loadStatistics(context), ), ), ); if (!context.mounted) return; - final newTile = _buildStatisticTile(context, newStatistic); - setState(() { - statisticTiles.add(newTile); + _statistics = [..._statistics, newStatistic]; + statisticTiles = _statistics + .map((stat) => _buildStatisticTile(context, stat)) + .toList(); }); }, ), @@ -103,7 +105,7 @@ class _StatisticsViewState extends State { ); } - Future getStatisticTiles(BuildContext context) async { + Future loadStatistics(BuildContext context) async { setState(() { isLoading = true; statisticTiles = List.generate( @@ -131,27 +133,26 @@ class _StatisticsViewState extends State { final statistics = results[0] as List; _allMatches = results[1] as List; _allPlayers = results[2] as List; + _statistics = statistics; setState(() { - statisticTiles = [ - for (final statistic in statistics) ...[ - _buildStatisticTile(context, statistic), - ], - ]; + statisticTiles = _statistics + .map((stat) => _buildStatisticTile(context, stat)) + .toList(); isLoading = false; }); } Widget _buildStatisticTile(BuildContext context, Statistic statistic) { - return GestureDetector( - onTap: () { - final values = computeStatisticValues( - statistic: statistic, - matches: _allMatches, - players: _allPlayers, - ); + final values = computeStatisticValues( + statistic: statistic, + matches: _allMatches, + players: _allPlayers, + ); - Navigator.push( + return GestureDetector( + onTap: () async { + final newDisplayCount = await Navigator.push( context, adaptivePageRoute( builder: (context) => StatisticDetailView( @@ -162,6 +163,21 @@ class _StatisticsViewState extends State { ), ), ); + if (newDisplayCount != null && + newDisplayCount != statistic.displayCount) { + setState(() { + _statistics = _statistics + .map( + (stat) => stat.id == statistic.id + ? stat.copyWith(displayCount: newDisplayCount) + : stat, + ) + .toList(); + statisticTiles = _statistics + .map((stat) => _buildStatisticTile(context, stat)) + .toList(); + }); + } }, child: buildStatisticTile( statistic: statistic, diff --git a/pubspec.yaml b/pubspec.yaml index b8b0aa8..6c5f4d6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: tallee description: "Tracking App for Card Games" publish_to: 'none' -version: 0.0.33+280 +version: 0.0.33+281 environment: sdk: ^3.8.1