From 287294526a4d0c1ecef9f57f3d925ad256ceb69f Mon Sep 17 00:00:00 2001 From: Felix Kirchner Date: Sat, 2 Aug 2025 16:44:31 +0200 Subject: [PATCH] Implemented new point view --- lib/presentation/views/points_view.dart | 259 +++++++++++++----------- pubspec.yaml | 2 +- 2 files changed, 145 insertions(+), 116 deletions(-) diff --git a/lib/presentation/views/points_view.dart b/lib/presentation/views/points_view.dart index 1379785..64ea452 100644 --- a/lib/presentation/views/points_view.dart +++ b/lib/presentation/views/points_view.dart @@ -17,125 +17,154 @@ class _PointsViewState extends State { @override Widget build(BuildContext context) { return CupertinoPageScaffold( - navigationBar: CupertinoNavigationBar( - middle: Text(AppLocalizations.of(context).point_overview), - previousPageTitle: AppLocalizations.of(context).back, - ), - child: SingleChildScrollView( - padding: const EdgeInsets.fromLTRB(0, 100, 0, 0), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: DataTable( - dataRowMinHeight: 60, - dataRowMaxHeight: 60, - dividerThickness: 0.5, - columnSpacing: 20, - columns: [ - const DataColumn( - numeric: true, - headingRowAlignment: MainAxisAlignment.center, - label: Text( - '#', - style: TextStyle(fontWeight: FontWeight.bold), - ), - columnWidth: IntrinsicColumnWidth(flex: 0.5)), - ...widget.gameSession.players.map( - (player) => DataColumn( - label: FittedBox( - fit: BoxFit.fill, - child: Text( - player, - style: const TextStyle(fontWeight: FontWeight.bold), - )), - headingRowAlignment: MainAxisAlignment.center, - columnWidth: const IntrinsicColumnWidth(flex: 1)), - ), - ], - rows: [ - ...List.generate( - widget.gameSession.roundList.length, - (roundIndex) { - final round = widget.gameSession.roundList[roundIndex]; - return DataRow( - cells: [ - DataCell(Align( - alignment: Alignment.center, - child: Text( - '${roundIndex + 1}', - style: const TextStyle(fontSize: 20), - ), - )), - ...List.generate(widget.gameSession.players.length, - (playerIndex) { - final int score = round.scores[playerIndex]; - final int update = round.scoreUpdates[playerIndex]; - final bool saidCabo = - round.caboPlayerIndex == playerIndex; - return DataCell( - Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.symmetric( - horizontal: 6, vertical: 2), - decoration: BoxDecoration( - color: update <= 0 - ? CustomTheme.pointLossColor - : CustomTheme.pointGainColor, - borderRadius: BorderRadius.circular(8), - ), - child: Text( - '${update >= 0 ? '+' : ''}$update', - style: const TextStyle( - color: CupertinoColors.white, - fontWeight: FontWeight.bold, - ), - ), - ), - const SizedBox(height: 4), - Text('$score', - style: TextStyle( - fontWeight: saidCabo - ? FontWeight.bold - : FontWeight.normal, - )), - ], + navigationBar: CupertinoNavigationBar( + middle: Text(AppLocalizations.of(context).point_overview), + previousPageTitle: AppLocalizations.of(context).back, + ), + child: SafeArea(child: LayoutBuilder(builder: (context, constraints) { + final int columnCount = 1 + widget.gameSession.players.length; + final double columnWidth = constraints.maxWidth / columnCount; + + return SingleChildScrollView( + scrollDirection: Axis.vertical, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: ConstrainedBox( + constraints: BoxConstraints(minWidth: constraints.maxWidth), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: DataTable( + dataRowMaxHeight: 60, + dataRowMinHeight: 60, + columnSpacing: 20, + columns: [ + const DataColumn( + label: SizedBox( + width: 18, + child: Text( + '#', + style: TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, ), ), - ); - }), - ], - ); - }, - ), - DataRow( - cells: [ - const DataCell(Align( - alignment: Alignment.center, - child: Text( - 'Σ', - style: - TextStyle(fontSize: 25, fontWeight: FontWeight.bold), - ), - )), - ...widget.gameSession.playerScores.map( - (score) => DataCell( - Center( - child: Text( - '$score', - style: const TextStyle( - fontSize: 20, fontWeight: FontWeight.bold), + numeric: true, ), - ), + ...widget.gameSession.players.map( + (player) => DataColumn( + label: SizedBox( + width: columnWidth, + child: Text( + player, + style: const TextStyle( + fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + softWrap: true, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + rows: [ + ...List.generate( + widget.gameSession.roundList.length, + (roundIndex) { + final round = + widget.gameSession.roundList[roundIndex]; + return DataRow( + cells: [ + DataCell(Align( + alignment: Alignment.center, + child: Text( + '${roundIndex + 1}', + style: const TextStyle(fontSize: 20), + ), + )), + ...List.generate( + widget.gameSession.players.length, + (playerIndex) { + final int score = round.scores[playerIndex]; + final int update = + round.scoreUpdates[playerIndex]; + final bool saidCabo = + round.caboPlayerIndex == playerIndex; + return DataCell( + Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const SizedBox( + height: 5, + ), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 6, vertical: 2), + decoration: BoxDecoration( + color: update <= 0 + ? CustomTheme.pointLossColor + : CustomTheme.pointGainColor, + borderRadius: + BorderRadius.circular(8), + ), + child: Text( + '${update >= 0 ? '+' : ''}$update', + style: const TextStyle( + color: CupertinoColors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + const SizedBox(height: 4), + Text('$score', + style: TextStyle( + decorationThickness: 1, + decoration: saidCabo + ? TextDecoration.underline + : TextDecoration.none, + fontWeight: saidCabo + ? FontWeight.bold + : FontWeight.normal, + )), + ], + ), + ), + ); + }), + ], + ); + }, + ), + DataRow( + cells: [ + const DataCell(Align( + alignment: Alignment.center, + child: Text( + 'Σ', + style: TextStyle( + fontSize: 25, fontWeight: FontWeight.bold), + ), + )), + ...widget.gameSession.playerScores.map( + (score) => DataCell( + Center( + child: Text( + '$score', + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + ], + ), + ], ), ), - ], - ), - ], - ), - ), - ), - ); + ), + )); + }))); } } diff --git a/pubspec.yaml b/pubspec.yaml index 95e9bab..8d46244 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: cabo_counter description: "Mobile app for the card game Cabo" publish_to: 'none' -version: 0.5.4+613 +version: 0.5.4+616 environment: sdk: ^3.5.4