feat: changing display count

This commit is contained in:
2026-05-25 12:51:24 +02:00
parent bfb40d2eab
commit efd1097d5a
9 changed files with 88 additions and 28 deletions

View File

@@ -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<StatisticScope>? scopes,
Timeframe? timeframe,
List<Group>? selectedGroups,
List<Game>? 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,
);
}
}

View File

@@ -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": {

View File

@@ -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}",

View File

@@ -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:

View File

@@ -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';

View File

@@ -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';

View File

@@ -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<StatisticDetailView> {
int displayCount = 0;
late int displayCount;
@override
void initState() {
@@ -48,7 +46,13 @@ class _StatisticDetailViewState extends State<StatisticDetailView> {
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<StatisticDetailView> {
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<StatisticDetailView> {
),
);
}
// Handles saving the display count and giving it to statistics view
Future<void> handleBack(BuildContext context) async {
final db = Provider.of<AppDatabase>(context, listen: false);
await db.statisticDao.updateDisplayCount(widget.statistic.id, displayCount);
if (context.mounted) Navigator.of(context).pop(displayCount);
}
}

View File

@@ -26,6 +26,7 @@ class _StatisticsViewState extends State<StatisticsView> {
bool isLoading = true;
List<Match> _allMatches = const [];
List<Player> _allPlayers = const [];
List<Statistic> _statistics = const [];
List<Widget> statisticTiles = [];
@override
@@ -34,7 +35,7 @@ class _StatisticsViewState extends State<StatisticsView> {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
getStatisticTiles(context);
loadStatistics(context);
});
}
@@ -84,15 +85,16 @@ class _StatisticsViewState extends State<StatisticsView> {
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<StatisticsView> {
);
}
Future<void> getStatisticTiles(BuildContext context) async {
Future<void> loadStatistics(BuildContext context) async {
setState(() {
isLoading = true;
statisticTiles = List.generate(
@@ -131,27 +133,26 @@ class _StatisticsViewState extends State<StatisticsView> {
final statistics = results[0] as List<Statistic>;
_allMatches = results[1] as List<Match>;
_allPlayers = results[2] as List<Player>;
_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<StatisticsView> {
),
),
);
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,

View File

@@ -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