diff --git a/lib/presentation/widgets/tiles/statistics_tile.dart b/lib/presentation/widgets/tiles/statistics_tile.dart index b740eb5..0abe3bb 100644 --- a/lib/presentation/widgets/tiles/statistics_tile.dart +++ b/lib/presentation/widgets/tiles/statistics_tile.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:fluttericon/rpg_awesome_icons.dart'; import 'package:tallee/core/common.dart'; import 'package:tallee/core/custom_theme.dart'; +import 'package:tallee/core/enums.dart'; import 'package:tallee/data/models/game.dart'; import 'package:tallee/data/models/group.dart'; import 'package:tallee/data/models/player.dart'; @@ -62,86 +63,121 @@ class StatisticsTile extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 8.0), child: Visibility( visible: values.isNotEmpty, + + // No data avaiable message replacement: Center( heightFactor: 4, child: Text(loc.no_data_available), ), + + // Bar chart child: LayoutBuilder( builder: (context, constraints) { - final maxBarWidth = constraints.maxWidth * 0.65; + final maxBarWidth = constraints.maxWidth * 0.8; + final displayCount = min(values.length, itemCount); + final displayValues = values.take(displayCount).toList(); + final maxVal = displayValues.isNotEmpty + ? displayValues.fold( + 0, + (currentMax, entry) => + entry.$2 > currentMax ? entry.$2 : currentMax, + ) + : 0; + return Column( children: [ - // Bar chart - ...List.generate(min(values.length, itemCount), (index) { - /// The maximum wins among all players - final maxMatches = values.isNotEmpty ? values[0].$2 : 0; - + // Bars + ...List.generate(displayCount, (index) { /// Fraction of wins - final double fraction = (maxMatches > 0) - ? (values[index].$2 / maxMatches) + final double fraction = (maxVal > 0) + ? (displayValues[index].$2 / maxVal) : 0.0; /// Calculated width for current the bar - final double barWidth = maxBarWidth * fraction; + final double barWidth = (maxBarWidth * fraction).clamp( + 0.0, + maxBarWidth, + ); return Padding( padding: const EdgeInsets.symmetric(vertical: 2.0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Stack( - children: [ - // Bar - Container( - height: 24, - width: barWidth, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), - color: barColor, - ), - ), - - // Player - Padding( - padding: const EdgeInsets.only(left: 4.0), - child: RichText( - overflow: TextOverflow.ellipsis, - text: TextSpan( - style: DefaultTextStyle.of(context).style, - children: [ - TextSpan( - text: values[index].$1.name, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - TextSpan( - text: getNameCountText( - values[index].$1, - ), - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - color: CustomTheme.textColor - .withAlpha(150), - ), - ), - ], + SizedBox( + width: maxBarWidth, + child: Stack( + clipBehavior: Clip.hardEdge, + children: [ + // Bar + Container( + height: 24, + width: barWidth, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + color: barColor, ), ), - ), - ], + + // Player + Padding( + padding: const EdgeInsets.only(left: 4.0), + child: RichText( + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + text: TextSpan( + style: DefaultTextStyle.of(context).style, + children: [ + TextSpan( + text: displayValues[index].$1.name, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: + barColor == + getColorFromAppColor( + AppColor.yellow, + ) + ? const Color(0xFF101010) + : CustomTheme.textColor, + ), + ), + TextSpan( + text: getNameCountText( + displayValues[index].$1, + ), + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: + (barColor == + getColorFromAppColor( + AppColor.yellow, + ) + ? const Color( + 0xFF101010, + ) + : CustomTheme.textColor) + .withAlpha(150), + ), + ), + ], + ), + ), + ), + ], + ), ), const Spacer(), // Value Center( child: Text( - values[index].$2 <= 1 && - values[index].$2 is double - ? values[index].$2.toStringAsFixed(2) - : values[index].$2.toString(), + displayValues[index].$2 <= 1 && + displayValues[index].$2 is double + ? displayValues[index].$2.toStringAsFixed(2) + : displayValues[index].$2.toString(), textAlign: TextAlign.center, style: const TextStyle( fontSize: 16,