diff --git a/lib/presentation/views/graph_view.dart b/lib/presentation/views/graph_view.dart index da9f8e7..d67507a 100644 --- a/lib/presentation/views/graph_view.dart +++ b/lib/presentation/views/graph_view.dart @@ -30,29 +30,28 @@ class _GraphViewState extends State { middle: Text(AppLocalizations.of(context).scoring_history), previousPageTitle: AppLocalizations.of(context).back, ), - child: Visibility( - visible: widget.gameSession.roundNumber > 1 || - widget.gameSession.isGameFinished, - replacement: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Center( - child: Icon(CupertinoIcons.chart_bar_alt_fill, size: 60), - ), - const SizedBox(height: 10), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 40), - child: Text( - AppLocalizations.of(context).empty_graph_text, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 16), + child: SafeArea( + child: Visibility( + visible: widget.gameSession.roundNumber > 1 || + widget.gameSession.isGameFinished, + replacement: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Center( + child: Icon(CupertinoIcons.chart_bar_alt_fill, size: 60), ), - ), - ], - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(0, 100, 0, 0), + const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 40), + child: Text( + AppLocalizations.of(context).empty_graph_text, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 16), + ), + ), + ], + ), child: SfCartesianChart( enableAxisAnimation: true, legend: const Legend( diff --git a/lib/presentation/views/points_view.dart b/lib/presentation/views/points_view.dart index 1379785..161d72e 100644 --- a/lib/presentation/views/points_view.dart +++ b/lib/presentation/views/points_view.dart @@ -17,125 +17,239 @@ 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), + navigationBar: CupertinoNavigationBar( + middle: Text(AppLocalizations.of(context).point_overview), + previousPageTitle: AppLocalizations.of(context).back, + ), + child: SafeArea(child: LayoutBuilder(builder: (context, constraints) { + const double caboFieldWidthFactor = 0.2; + const double roundColWidth = 35; + const double tablePadding = 8; + final int playerCount = widget.gameSession.players.length; + final double playerColWidth = + (constraints.maxWidth - roundColWidth - (tablePadding)) / + playerCount; + + return Column( + children: [ + ConstrainedBox( + constraints: BoxConstraints(maxWidth: constraints.maxWidth), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: tablePadding), + child: DataTable( + dataRowMaxHeight: 0, + dataRowMinHeight: 0, + columnSpacing: 0, + horizontalMargin: 0, + columns: [ + const DataColumn( + label: SizedBox( + width: roundColWidth, + child: Text( + '#', + style: TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), ), - )), - ...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, + numeric: true, + ), + ...widget.gameSession.players.map( + (player) => DataColumn( + label: SizedBox( + width: playerColWidth, + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 8), + child: Text( + player, + style: const TextStyle( + fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + softWrap: true, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ), + ), + ), + ], + rows: const [], + ), + ), + ), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: ConstrainedBox( + constraints: + BoxConstraints(maxWidth: constraints.maxWidth), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: tablePadding), + child: DataTable( + dataRowMaxHeight: 75, + dataRowMinHeight: 75, + columnSpacing: 0, + horizontalMargin: 0, + headingRowHeight: 0, + columns: [ + const DataColumn( + label: SizedBox( + width: roundColWidth, + child: Text( + '#', + style: TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + ), + numeric: true, + ), + ...widget.gameSession.players.map( + (player) => DataColumn( + label: SizedBox( + width: playerColWidth, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8), + child: Text( + player, + style: const TextStyle( + fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + softWrap: true, + maxLines: 2, + textAlign: TextAlign.center, ), ), ), - const SizedBox(height: 4), - Text('$score', - style: TextStyle( - fontWeight: saidCabo - ? FontWeight.bold - : FontWeight.normal, + ), + ), + ], + 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: Padding( + padding: const EdgeInsets.symmetric( + vertical: 6.0), + child: Container( + width: playerColWidth * + (playerCount * + caboFieldWidthFactor), // Adjust width based on amount of players + decoration: BoxDecoration( + color: saidCabo + ? CustomTheme + .buttonBackgroundColor + : CupertinoColors.transparent, + borderRadius: + BorderRadius.circular(5), + ), + 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( + 6), + ), + child: Text( + '${update >= 0 ? '+' : ''}$update', + style: const TextStyle( + color: + CupertinoColors.white, + fontWeight: + FontWeight.bold, + ), + ), + ), + const SizedBox(height: 4), + Text( + '$score', + style: TextStyle( + color: CustomTheme.white, + 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), + ), + ), + ), + ), ], ), - ), - ); - }), - ], - ); - }, - ), - 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 0873c95..f59ec44 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+609 +version: 0.5.5+639 environment: sdk: ^3.5.4