TetraStats/lib/widgets/stat_sell_num.dart

123 lines
5.1 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
2024-03-06 22:34:15 +00:00
import 'package:tetra_stats/data_objects/tetrio.dart';
2023-07-15 16:22:25 +00:00
import 'package:tetra_stats/gen/strings.g.dart';
2024-03-24 16:38:06 +00:00
import 'package:tetra_stats/utils/colors_functions.dart';
2024-03-06 22:34:15 +00:00
import 'package:tetra_stats/utils/numers_formats.dart';
class StatCellNum extends StatelessWidget {
2023-06-27 20:55:59 +00:00
const StatCellNum(
{super.key,
required this.playerStat,
required this.playerStatLabel,
required this.isScreenBig,
2024-03-10 22:34:30 +00:00
this.smallDecimal = true,
2023-06-27 20:55:59 +00:00
this.alertWidgets,
2023-07-12 15:14:25 +00:00
this.fractionDigits,
this.oldPlayerStat,
required this.higherIsBetter,
2024-03-10 22:34:30 +00:00
this.okText, this.alertTitle, this.pos, this.averageStat});
final num playerStat;
2023-06-28 16:50:40 +00:00
final num? oldPlayerStat;
final bool higherIsBetter;
final String playerStatLabel;
2023-07-12 15:14:25 +00:00
final String? okText;
final bool isScreenBig;
2024-03-10 22:34:30 +00:00
final bool smallDecimal;
2024-01-22 18:00:24 +00:00
final String? alertTitle;
2023-06-27 20:55:59 +00:00
final List<Widget>? alertWidgets;
final int? fractionDigits;
2024-03-06 22:34:15 +00:00
final LeaderboardPosition? pos;
2024-03-10 22:34:30 +00:00
final num? averageStat;
Color getStatColor(){
if (averageStat == null) return Colors.white;
num percentile = (higherIsBetter ? playerStat / averageStat! : averageStat! / playerStat).abs();
2024-03-17 23:15:44 +00:00
if (percentile > 1.50) return Colors.purpleAccent;
if (percentile > 1.20) return Colors.blueAccent;
if (percentile > 0.90) return Colors.greenAccent;
if (percentile > 0.70) return Colors.yellowAccent;
return Colors.redAccent;
2024-03-10 22:34:30 +00:00
}
@override
Widget build(BuildContext context) {
NumberFormat comparef = NumberFormat("+#,###.###;-#,###.###")..maximumFractionDigits = fractionDigits ?? 0;
NumberFormat fractionf = NumberFormat.decimalPatternDigits(locale: LocaleSettings.currentLocale.languageCode, decimalDigits: fractionDigits ?? 0)..maximumIntegerDigits = 0;
num fraction = playerStat.isNegative ? 1 - (playerStat - playerStat.floor()) : playerStat - playerStat.floor();
int integer = playerStat.isNegative ? (playerStat + fraction).toInt() : (playerStat - fraction).toInt();
return Column(
children: [
RichText(
text: TextSpan(text: intf.format(integer),
children: [
2024-03-10 22:34:30 +00:00
TextSpan(text: fractionf.format(fraction).substring(1), style: smallDecimal ? const TextStyle(fontSize: 16) : null)
],
style: TextStyle(
fontFamily: "Eurostile Round Extended",
fontSize: isScreenBig ? 32 : 24,
2024-03-10 22:34:30 +00:00
color: getStatColor()
)
)
),
2024-03-06 22:34:15 +00:00
if (oldPlayerStat != null || pos != null) RichText(text: TextSpan(
text: "",
style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 14, color: Colors.grey),
children: [
if (oldPlayerStat != null) TextSpan(text: comparef.format(playerStat - oldPlayerStat!), style: TextStyle(
color: higherIsBetter ?
oldPlayerStat! > playerStat ? Colors.redAccent : Colors.greenAccent :
oldPlayerStat! < playerStat ? Colors.redAccent : Colors.greenAccent
),),
if (oldPlayerStat != null && pos != null) const TextSpan(text: ""),
2024-03-24 16:38:06 +00:00
if (pos != null) TextSpan(text: pos!.position >= 1000 ? "${t.top} ${f2.format(pos!.percentage*100)}%" : "${pos!.position}", style: TextStyle(color: getColorOfRank(pos!.position)))
2024-03-06 22:34:15 +00:00
]
),
),
2023-06-27 20:55:59 +00:00
alertWidgets == null
? Text(
playerStatLabel,
textAlign: TextAlign.center,
style: const TextStyle(
fontFamily: "Eurostile Round",
fontSize: 16,
height: 1.1
),
)
: TextButton(
onPressed: () {
2023-06-27 20:55:59 +00:00
showDialog(
context: context,
builder: (BuildContext context) => AlertDialog(
2024-01-22 18:00:24 +00:00
title: Text(alertTitle??playerStatLabel.replaceAll(RegExp(r'\n'), " "),
2023-06-27 20:55:59 +00:00
style: const TextStyle(
fontFamily: "Eurostile Round Extended")),
content: SingleChildScrollView(
child: ListBody(children: alertWidgets!),
),
actions: <Widget>[
TextButton(
2023-07-12 15:14:25 +00:00
child: Text(okText??"OK"),
onPressed: () {Navigator.of(context).pop();}
2023-06-27 20:55:59 +00:00
)
],
)
);
},
2023-06-27 20:55:59 +00:00
style: ButtonStyle(
padding: MaterialStateProperty.all(EdgeInsets.zero)),
child: Text(
playerStatLabel,
textAlign: TextAlign.center,
style: const TextStyle(
fontFamily: "Eurostile Round",
fontSize: 16,
height: 1.1
),
)),
],
);
}
}