Compare commits
4 Commits
b93898cc34
...
d3b9c6de4a
Author | SHA1 | Date |
---|---|---|
dan63047 | d3b9c6de4a | |
dan63047 | acaf08d8a2 | |
dan63047 | 3545e67e4a | |
dan63047 | a3d9aa5e70 |
|
@ -18,7 +18,7 @@ jobs:
|
||||||
- uses: subosito/flutter-action@v1
|
- uses: subosito/flutter-action@v1
|
||||||
with:
|
with:
|
||||||
channel: 'stable'
|
channel: 'stable'
|
||||||
flutter-version: '3.16.5'
|
flutter-version: '3.22.3'
|
||||||
- name: Install project dependencies
|
- name: Install project dependencies
|
||||||
run: flutter pub get
|
run: flutter pub get
|
||||||
- name: Build artifacts
|
- name: Build artifacts
|
||||||
|
@ -49,9 +49,11 @@ jobs:
|
||||||
- uses: ashutoshvarma/setup-ninja@master
|
- uses: ashutoshvarma/setup-ninja@master
|
||||||
with:
|
with:
|
||||||
channel: 'stable'
|
channel: 'stable'
|
||||||
flutter-version: '3.16.5'
|
flutter-version: '3.22.3'
|
||||||
- name: Install project dependencies
|
- name: Install project dependencies
|
||||||
run: flutter pub get
|
run: |
|
||||||
|
flutter pub get
|
||||||
|
sudo apt-get install -y ninja-build libgtk-3-dev
|
||||||
- name: Build artifacts
|
- name: Build artifacts
|
||||||
run: flutter build linux --release
|
run: flutter build linux --release
|
||||||
- name: Archive Release
|
- name: Archive Release
|
||||||
|
@ -59,7 +61,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
type: 'zip'
|
type: 'zip'
|
||||||
filename: TetraStats-${{github.ref_name}}-linux.zip
|
filename: TetraStats-${{github.ref_name}}-linux.zip
|
||||||
directory: build/linux/x64/runner/Release/bundle
|
directory: build/linux/x64/release/bundle
|
||||||
- name: Push to Releases
|
- name: Push to Releases
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
|
|
|
@ -777,7 +777,9 @@ class ZenithResults{
|
||||||
speedrun = json['speedrun'];
|
speedrun = json['speedrun'];
|
||||||
speedrunSeen = json['speedrun_seen'];
|
speedrunSeen = json['speedrun_seen'];
|
||||||
splits = [];
|
splits = [];
|
||||||
for (int ms in json['splits']) splits.add(Duration(milliseconds: ms));
|
for (int ms in json['splits']) {
|
||||||
|
splits.add(Duration(milliseconds: ms));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -935,7 +937,9 @@ class TetraLeagueBetaStream{
|
||||||
|
|
||||||
TetraLeagueBetaStream.fromJson(List<dynamic> json, String userID) {
|
TetraLeagueBetaStream.fromJson(List<dynamic> json, String userID) {
|
||||||
id = userID;
|
id = userID;
|
||||||
for (var entry in json) records.add(BetaRecord.fromJson(entry));
|
for (var entry in json) {
|
||||||
|
records.add(BetaRecord.fromJson(entry));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addFromAlphaStream(List<TetraLeagueAlphaRecord> r){
|
addFromAlphaStream(List<TetraLeagueAlphaRecord> r){
|
||||||
|
@ -991,7 +995,7 @@ class TetraLeagueBetaStream{
|
||||||
naturalorder: entry.endContext[0].naturalOrder,
|
naturalorder: entry.endContext[0].naturalOrder,
|
||||||
active: false,
|
active: false,
|
||||||
alive: false,
|
alive: false,
|
||||||
lifetime: Duration(milliseconds: -1),
|
lifetime: const Duration(milliseconds: -1),
|
||||||
stats: BetaLeagueStats(
|
stats: BetaLeagueStats(
|
||||||
apm: entry.endContext[0].secondaryTracking[i],
|
apm: entry.endContext[0].secondaryTracking[i],
|
||||||
pps: entry.endContext[0].tertiaryTracking[i],
|
pps: entry.endContext[0].tertiaryTracking[i],
|
||||||
|
@ -1008,7 +1012,7 @@ class TetraLeagueBetaStream{
|
||||||
naturalorder: entry.endContext[1].naturalOrder,
|
naturalorder: entry.endContext[1].naturalOrder,
|
||||||
active: false,
|
active: false,
|
||||||
alive: false,
|
alive: false,
|
||||||
lifetime: Duration(milliseconds: -1),
|
lifetime: const Duration(milliseconds: -1),
|
||||||
stats: BetaLeagueStats(
|
stats: BetaLeagueStats(
|
||||||
apm: entry.endContext[1].secondaryTracking[i],
|
apm: entry.endContext[1].secondaryTracking[i],
|
||||||
pps: entry.endContext[1].tertiaryTracking[i],
|
pps: entry.endContext[1].tertiaryTracking[i],
|
||||||
|
@ -1072,10 +1076,14 @@ class BetaLeagueResults{
|
||||||
BetaLeagueResults({required this.leaderboard, required this.rounds});
|
BetaLeagueResults({required this.leaderboard, required this.rounds});
|
||||||
|
|
||||||
BetaLeagueResults.fromJson(Map<String, dynamic> json){
|
BetaLeagueResults.fromJson(Map<String, dynamic> json){
|
||||||
for (var lbEntry in json['leaderboard']) leaderboard.add(BetaLeagueLeaderboardEntry.fromJson(lbEntry));
|
for (var lbEntry in json['leaderboard']) {
|
||||||
|
leaderboard.add(BetaLeagueLeaderboardEntry.fromJson(lbEntry));
|
||||||
|
}
|
||||||
for (var roundEntry in json['rounds']){
|
for (var roundEntry in json['rounds']){
|
||||||
List<BetaLeagueRound> round = [];
|
List<BetaLeagueRound> round = [];
|
||||||
for (var r in roundEntry) round.add(BetaLeagueRound.fromJson(r));
|
for (var r in roundEntry) {
|
||||||
|
round.add(BetaLeagueRound.fromJson(r));
|
||||||
|
}
|
||||||
rounds.add(round);
|
rounds.add(round);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1477,7 +1485,9 @@ class ZenithExtras extends RecordExtras{
|
||||||
List<String> mods = [];
|
List<String> mods = [];
|
||||||
|
|
||||||
ZenithExtras.fromJson(Map<String, dynamic> json){
|
ZenithExtras.fromJson(Map<String, dynamic> json){
|
||||||
for (var mod in json["mods"]) mods.add(mod);
|
for (var mod in json["mods"]) {
|
||||||
|
mods.add(mod);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2407,8 +2417,8 @@ class TetrioPlayerFromLeaderboard {
|
||||||
gamesPlayed = json['league']['gamesplayed'] as int;
|
gamesPlayed = json['league']['gamesplayed'] as int;
|
||||||
gamesWon = json['league']['gameswon'] as int;
|
gamesWon = json['league']['gameswon'] as int;
|
||||||
rating = json['league']['rating'] != null ? json['league']['rating'].toDouble() : 0;
|
rating = json['league']['rating'] != null ? json['league']['rating'].toDouble() : 0;
|
||||||
glicko = json['league']['glicko'] != null ? json['league']['glicko'].toDouble() : null;
|
glicko = json['league']['glicko']?.toDouble();
|
||||||
rd = json['league']['rd'] != null ? json['league']['rd'].toDouble() : null;
|
rd = json['league']['rd']?.toDouble();
|
||||||
rank = json['league']['rank'];
|
rank = json['league']['rank'];
|
||||||
bestRank = json['league']['bestrank'];
|
bestRank = json['league']['bestrank'];
|
||||||
apm = json['league']['apm'] != null ? json['league']['apm'].toDouble() : 0.00;
|
apm = json['league']['apm'] != null ? json['league']['apm'].toDouble() : 0.00;
|
||||||
|
|
|
@ -208,12 +208,12 @@ class ReplayData{
|
||||||
stats = [];
|
stats = [];
|
||||||
roundWinners = [];
|
roundWinners = [];
|
||||||
int roundID = 0;
|
int roundID = 0;
|
||||||
List<double> APMmultipliedByWeights = [0, 0];
|
List<double> apmMultipliedByWeights = [0, 0];
|
||||||
List<double> PPSmultipliedByWeights = [0, 0];
|
List<double> ppsMultipliedByWeights = [0, 0];
|
||||||
List<double> VSmultipliedByWeights = [0, 0];
|
List<double> vsMultipliedByWeights = [0, 0];
|
||||||
List<double> SPPmultipliedByWeights = [0, 0];
|
List<double> sppMultipliedByWeights = [0, 0];
|
||||||
List<double> KPPmultipliedByWeights = [0, 0];
|
List<double> kppMultipliedByWeights = [0, 0];
|
||||||
List<double> KPSmultipliedByWeights = [0, 0];
|
List<double> kpsMultipliedByWeights = [0, 0];
|
||||||
totalStats = [ReplayStats.createEmpty(), ReplayStats.createEmpty()];
|
totalStats = [ReplayStats.createEmpty(), ReplayStats.createEmpty()];
|
||||||
for(var round in json['data']) {
|
for(var round in json['data']) {
|
||||||
int firstInEndContext = round['replays'][0]["events"].last['data']['export']['options']['username'].startsWith(endcontext[0].username) ? 0 : 1;
|
int firstInEndContext = round['replays'][0]["events"].last['data']['export']['options']['username'].startsWith(endcontext[0].username) ? 0 : 1;
|
||||||
|
@ -221,30 +221,30 @@ class ReplayData{
|
||||||
int roundLength = max(round['replays'][0]['frames'], round['replays'][1]['frames']);
|
int roundLength = max(round['replays'][0]['frames'], round['replays'][1]['frames']);
|
||||||
roundLengths.add(roundLength);
|
roundLengths.add(roundLength);
|
||||||
totalLength = totalLength + max(round['replays'][0]['frames'], round['replays'][1]['frames']);
|
totalLength = totalLength + max(round['replays'][0]['frames'], round['replays'][1]['frames']);
|
||||||
APMmultipliedByWeights[0] += endcontext[0].secondaryTracking[roundID]*roundLength;
|
apmMultipliedByWeights[0] += endcontext[0].secondaryTracking[roundID]*roundLength;
|
||||||
APMmultipliedByWeights[1] += endcontext[1].secondaryTracking[roundID]*roundLength;
|
apmMultipliedByWeights[1] += endcontext[1].secondaryTracking[roundID]*roundLength;
|
||||||
PPSmultipliedByWeights[0] += endcontext[0].tertiaryTracking[roundID]*roundLength;
|
ppsMultipliedByWeights[0] += endcontext[0].tertiaryTracking[roundID]*roundLength;
|
||||||
PPSmultipliedByWeights[1] += endcontext[1].tertiaryTracking[roundID]*roundLength;
|
ppsMultipliedByWeights[1] += endcontext[1].tertiaryTracking[roundID]*roundLength;
|
||||||
VSmultipliedByWeights[0] += endcontext[0].extraTracking[roundID]*roundLength;
|
vsMultipliedByWeights[0] += endcontext[0].extraTracking[roundID]*roundLength;
|
||||||
VSmultipliedByWeights[1] += endcontext[1].extraTracking[roundID]*roundLength;
|
vsMultipliedByWeights[1] += endcontext[1].extraTracking[roundID]*roundLength;
|
||||||
int winner = round['board'].indexWhere((element) => element['success'] == true);
|
int winner = round['board'].indexWhere((element) => element['success'] == true);
|
||||||
roundWinners.add([round['board'][winner]['id']??round['board'][winner]['user']['_id'], round['board'][winner]['username']??round['board'][winner]['user']['username']]);
|
roundWinners.add([round['board'][winner]['id']??round['board'][winner]['user']['_id'], round['board'][winner]['username']??round['board'][winner]['user']['username']]);
|
||||||
ReplayStats playerOne = ReplayStats.fromJson(round['replays'][firstInEndContext]['events'].last['data']['export']['stats'], biggestSpikeFromReplay(round['replays'][secondInEndContext]['events']), round['replays'][firstInEndContext]['frames']); // (events contain recived attacks)
|
ReplayStats playerOne = ReplayStats.fromJson(round['replays'][firstInEndContext]['events'].last['data']['export']['stats'], biggestSpikeFromReplay(round['replays'][secondInEndContext]['events']), round['replays'][firstInEndContext]['frames']); // (events contain recived attacks)
|
||||||
ReplayStats playerTwo = ReplayStats.fromJson(round['replays'][secondInEndContext]['events'].last['data']['export']['stats'], biggestSpikeFromReplay(round['replays'][firstInEndContext]['events']), round['replays'][secondInEndContext]['frames']);
|
ReplayStats playerTwo = ReplayStats.fromJson(round['replays'][secondInEndContext]['events'].last['data']['export']['stats'], biggestSpikeFromReplay(round['replays'][firstInEndContext]['events']), round['replays'][secondInEndContext]['frames']);
|
||||||
SPPmultipliedByWeights[0] += playerOne.spp*roundLength;
|
sppMultipliedByWeights[0] += playerOne.spp*roundLength;
|
||||||
SPPmultipliedByWeights[1] += playerTwo.spp*roundLength;
|
sppMultipliedByWeights[1] += playerTwo.spp*roundLength;
|
||||||
KPPmultipliedByWeights[0] += playerOne.kpp*roundLength;
|
kppMultipliedByWeights[0] += playerOne.kpp*roundLength;
|
||||||
KPPmultipliedByWeights[1] += playerTwo.kpp*roundLength;
|
kppMultipliedByWeights[1] += playerTwo.kpp*roundLength;
|
||||||
KPSmultipliedByWeights[0] += playerOne.kps*roundLength;
|
kpsMultipliedByWeights[0] += playerOne.kps*roundLength;
|
||||||
KPSmultipliedByWeights[1] += playerTwo.kps*roundLength;
|
kpsMultipliedByWeights[1] += playerTwo.kps*roundLength;
|
||||||
stats.add([playerOne, playerTwo]);
|
stats.add([playerOne, playerTwo]);
|
||||||
totalStats[0] = totalStats[0] + playerOne;
|
totalStats[0] = totalStats[0] + playerOne;
|
||||||
totalStats[1] = totalStats[1] + playerTwo;
|
totalStats[1] = totalStats[1] + playerTwo;
|
||||||
roundID ++;
|
roundID ++;
|
||||||
}
|
}
|
||||||
timeWeightedStats = [
|
timeWeightedStats = [
|
||||||
AggregateStats(APMmultipliedByWeights[0]/totalLength, PPSmultipliedByWeights[0]/totalLength, VSmultipliedByWeights[0]/totalLength, SPPmultipliedByWeights[0]/totalLength, KPPmultipliedByWeights[0]/totalLength, KPSmultipliedByWeights[0]/totalLength),
|
AggregateStats(apmMultipliedByWeights[0]/totalLength, ppsMultipliedByWeights[0]/totalLength, vsMultipliedByWeights[0]/totalLength, sppMultipliedByWeights[0]/totalLength, kppMultipliedByWeights[0]/totalLength, kpsMultipliedByWeights[0]/totalLength),
|
||||||
AggregateStats(APMmultipliedByWeights[1]/totalLength, PPSmultipliedByWeights[1]/totalLength, VSmultipliedByWeights[1]/totalLength, SPPmultipliedByWeights[1]/totalLength, KPPmultipliedByWeights[1]/totalLength, KPSmultipliedByWeights[1]/totalLength)
|
AggregateStats(apmMultipliedByWeights[1]/totalLength, ppsMultipliedByWeights[1]/totalLength, vsMultipliedByWeights[1]/totalLength, sppMultipliedByWeights[1]/totalLength, kppMultipliedByWeights[1]/totalLength, kpsMultipliedByWeights[1]/totalLength)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,13 @@ ThemeData theme = ThemeData(
|
||||||
surface: Color.fromARGB(255, 10, 10, 10),
|
surface: Color.fromARGB(255, 10, 10, 10),
|
||||||
secondary: Colors.white,
|
secondary: Colors.white,
|
||||||
),
|
),
|
||||||
cardTheme: CardTheme(surfaceTintColor: Color.fromARGB(255, 10, 10, 10)),
|
cardTheme: const CardTheme(surfaceTintColor: Color.fromARGB(255, 10, 10, 10)),
|
||||||
|
drawerTheme: const DrawerThemeData(surfaceTintColor: Color.fromARGB(255, 10, 10, 10)),
|
||||||
|
searchBarTheme: const SearchBarThemeData(
|
||||||
|
shadowColor: WidgetStatePropertyAll(Colors.black),
|
||||||
|
shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.horizontal(left: Radius.circular(12.0), right: Radius.circular(12.0)))),
|
||||||
|
elevation: WidgetStatePropertyAll(8.0)
|
||||||
|
),
|
||||||
scaffoldBackgroundColor: Colors.black
|
scaffoldBackgroundColor: Colors.black
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:developer' as developer;
|
import 'dart:developer' as developer;
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:tetra_stats/data_objects/tetra_stats.dart';
|
import 'package:tetra_stats/data_objects/tetra_stats.dart';
|
||||||
import 'package:tetra_stats/data_objects/tetrio_multiplayer_replay.dart';
|
import 'package:tetra_stats/data_objects/tetrio_multiplayer_replay.dart';
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
// ignore_for_file: curly_braces_in_flow_control_structures
|
||||||
|
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:tetra_stats/gen/strings.g.dart';
|
import 'package:tetra_stats/gen/strings.g.dart';
|
||||||
import 'package:tetra_stats/utils/numers_formats.dart';
|
import 'package:tetra_stats/utils/numers_formats.dart';
|
||||||
|
@ -87,7 +89,8 @@ String countdown(Duration difference){
|
||||||
}
|
}
|
||||||
|
|
||||||
String playtime(Duration difference){
|
String playtime(Duration difference){
|
||||||
if (difference.inHours > 0) return "${intf.format(difference.inHours)}h ${nonsecs.format(difference.inMinutes%60)}m";
|
if (difference.inHours > 0) {
|
||||||
else if (difference.inMinutes > 0) return "${difference.inMinutes}m ${nonsecs.format(difference.inSeconds%60)}s";
|
return "${intf.format(difference.inHours)}h ${nonsecs.format(difference.inMinutes%60)}m";
|
||||||
|
} else if (difference.inMinutes > 0) return "${difference.inMinutes}m ${nonsecs.format(difference.inSeconds%60)}s";
|
||||||
else return "${secs.format(difference.inMilliseconds/1000)}s";
|
else return "${secs.format(difference.inMilliseconds/1000)}s";
|
||||||
}
|
}
|
|
@ -11,8 +11,6 @@ import 'package:intl/intl.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:syncfusion_flutter_charts/charts.dart';
|
import 'package:syncfusion_flutter_charts/charts.dart';
|
||||||
import 'package:syncfusion_flutter_gauges/gauges.dart';
|
|
||||||
import 'package:tetra_stats/data_objects/tetra_stats.dart';
|
|
||||||
import 'package:tetra_stats/data_objects/tetrio.dart';
|
import 'package:tetra_stats/data_objects/tetrio.dart';
|
||||||
import 'package:tetra_stats/gen/strings.g.dart';
|
import 'package:tetra_stats/gen/strings.g.dart';
|
||||||
import 'package:tetra_stats/main.dart' show prefs, teto;
|
import 'package:tetra_stats/main.dart' show prefs, teto;
|
||||||
|
@ -25,8 +23,6 @@ import 'package:tetra_stats/views/singleplayer_record_view.dart';
|
||||||
import 'package:tetra_stats/views/tl_match_view.dart' show TlMatchResultView;
|
import 'package:tetra_stats/views/tl_match_view.dart' show TlMatchResultView;
|
||||||
import 'package:tetra_stats/views/zenith_record_view.dart';
|
import 'package:tetra_stats/views/zenith_record_view.dart';
|
||||||
import 'package:tetra_stats/widgets/finesse_thingy.dart';
|
import 'package:tetra_stats/widgets/finesse_thingy.dart';
|
||||||
import 'package:tetra_stats/widgets/gauget_num.dart';
|
|
||||||
import 'package:tetra_stats/widgets/graphs.dart';
|
|
||||||
import 'package:tetra_stats/widgets/lineclears_thingy.dart';
|
import 'package:tetra_stats/widgets/lineclears_thingy.dart';
|
||||||
import 'package:tetra_stats/widgets/list_tile_trailing_stats.dart';
|
import 'package:tetra_stats/widgets/list_tile_trailing_stats.dart';
|
||||||
import 'package:tetra_stats/widgets/recent_sp_games.dart';
|
import 'package:tetra_stats/widgets/recent_sp_games.dart';
|
||||||
|
@ -501,7 +497,7 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
Container(
|
Container(
|
||||||
width: MediaQuery.of(context).size.width-450,
|
width: MediaQuery.of(context).size.width-450,
|
||||||
constraints: const BoxConstraints(maxWidth: 1024),
|
constraints: const BoxConstraints(maxWidth: 1024),
|
||||||
child: ZenithThingy(record: snapshot.data![1].zenith, recordEX: snapshot.data![1].zenithEx, parentZenithToggle: toggleZenith, initEXvalue: zenithEX)
|
child: SingleChildScrollView(child: ZenithThingy(record: snapshot.data![1].zenith, recordEX: snapshot.data![1].zenithEx, parentZenithToggle: toggleZenith, initEXvalue: zenithEX))
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 450.0,
|
width: 450.0,
|
||||||
|
@ -531,7 +527,7 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
),
|
),
|
||||||
_TLRecords(userID: snapshot.data![0].userId, changePlayer: changePlayer, data: snapshot.data![3].records, wasActiveInTL: true, oldMathcesHere: _TLHistoryWasFetched, separateScrollController: true),
|
_TLRecords(userID: snapshot.data![0].userId, changePlayer: changePlayer, data: snapshot.data![3].records, wasActiveInTL: true, oldMathcesHere: _TLHistoryWasFetched, separateScrollController: true),
|
||||||
_History(chartsData: chartsData, changePlayer: changePlayer, userID: _searchFor, update: _justUpdate, wasActiveInTL: snapshot.data![1].league.gamesPlayed > 0),
|
_History(chartsData: chartsData, changePlayer: changePlayer, userID: _searchFor, update: _justUpdate, wasActiveInTL: snapshot.data![1].league.gamesPlayed > 0),
|
||||||
ZenithThingy(record: snapshot.data![1].zenith, recordEX: snapshot.data![1].zenithEx, parentZenithToggle: toggleZenith, initEXvalue: zenithEX),
|
SingleChildScrollView(child: ZenithThingy(record: snapshot.data![1].zenith, recordEX: snapshot.data![1].zenithEx, parentZenithToggle: toggleZenith, initEXvalue: zenithEX)),
|
||||||
_ZenithRecords(userID: snapshot.data![0].userId, data: snapshot.data![zenithEX ? 5 : 4], separateScrollController: true),
|
_ZenithRecords(userID: snapshot.data![0].userId, data: snapshot.data![zenithEX ? 5 : 4], separateScrollController: true),
|
||||||
SingleplayerRecord(record: snapshot.data![1].sprint, rank: snapshot.data![1].league.percentileRank, stream: SingleplayerStream(userId: "userId", records: [], type: "40l")),
|
SingleplayerRecord(record: snapshot.data![1].sprint, rank: snapshot.data![1].league.percentileRank, stream: SingleplayerStream(userId: "userId", records: [], type: "40l")),
|
||||||
SingleplayerRecord(record: snapshot.data![1].blitz, rank: snapshot.data![1].league.percentileRank, stream: SingleplayerStream(userId: "userId", records: [], type: "Blitz")),
|
SingleplayerRecord(record: snapshot.data![1].blitz, rank: snapshot.data![1].league.percentileRank, stream: SingleplayerStream(userId: "userId", records: [], type: "Blitz")),
|
||||||
|
@ -1153,8 +1149,8 @@ class _TwoRecordsThingy extends StatelessWidget {
|
||||||
else TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(sprint!.stats.finalTime, closestAverageSprint.value), verdict: sprintBetterThanClosestAverage ? t.verdictBetter : t.verdictWorse, rank: closestAverageSprint.key.toUpperCase())}\n", style: TextStyle(
|
else TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(sprint!.stats.finalTime, closestAverageSprint.value), verdict: sprintBetterThanClosestAverage ? t.verdictBetter : t.verdictWorse, rank: closestAverageSprint.key.toUpperCase())}\n", style: TextStyle(
|
||||||
color: sprintBetterThanClosestAverage ? Colors.greenAccent : Colors.redAccent
|
color: sprintBetterThanClosestAverage ? Colors.greenAccent : Colors.redAccent
|
||||||
)),
|
)),
|
||||||
if (sprint!.rank != null) TextSpan(text: "№${sprint!.rank}", style: TextStyle(color: getColorOfRank(sprint!.rank!))),
|
TextSpan(text: "№${sprint!.rank}", style: TextStyle(color: getColorOfRank(sprint!.rank))),
|
||||||
if (sprint!.rank != null) const TextSpan(text: " • "),
|
const TextSpan(text: " • "),
|
||||||
TextSpan(text: timestamp(sprint!.timestamp)),
|
TextSpan(text: timestamp(sprint!.timestamp)),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
|
@ -1237,8 +1233,8 @@ class _TwoRecordsThingy extends StatelessWidget {
|
||||||
color: blitzBetterThanClosestAverage ? Colors.greenAccent : Colors.redAccent
|
color: blitzBetterThanClosestAverage ? Colors.greenAccent : Colors.redAccent
|
||||||
)),
|
)),
|
||||||
TextSpan(text: timestamp(blitz!.timestamp)),
|
TextSpan(text: timestamp(blitz!.timestamp)),
|
||||||
if (blitz!.rank != null) const TextSpan(text: " • "),
|
const TextSpan(text: " • "),
|
||||||
if (blitz!.rank != null) TextSpan(text: "№${blitz!.rank}", style: TextStyle(color: getColorOfRank(blitz!.rank!))),
|
TextSpan(text: "№${blitz!.rank}", style: TextStyle(color: getColorOfRank(blitz!.rank))),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -1554,10 +1550,10 @@ class _OtherThingy extends StatelessWidget {
|
||||||
Text("${t.statCellNum.level} ${NumberFormat.decimalPattern().format(zen!.level)}", style: const TextStyle(fontSize: 28, fontWeight: FontWeight.bold)),
|
Text("${t.statCellNum.level} ${NumberFormat.decimalPattern().format(zen!.level)}", style: const TextStyle(fontSize: 28, fontWeight: FontWeight.bold)),
|
||||||
Text("${t.statCellNum.score} ${NumberFormat.decimalPattern().format(zen!.score)}", style: const TextStyle(fontSize: 18)),
|
Text("${t.statCellNum.score} ${NumberFormat.decimalPattern().format(zen!.score)}", style: const TextStyle(fontSize: 18)),
|
||||||
Container(
|
Container(
|
||||||
constraints: BoxConstraints(maxWidth: 300.0),
|
constraints: const BoxConstraints(maxWidth: 300.0),
|
||||||
child: Row(children: [
|
child: Row(children: [
|
||||||
Text("Score requirement to level up:"),
|
const Text("Score requirement to level up:"),
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
Text(intf.format(zen!.scoreRequirement))
|
Text(intf.format(zen!.scoreRequirement))
|
||||||
],),
|
],),
|
||||||
)
|
)
|
||||||
|
|
|
@ -9,12 +9,9 @@ import 'package:tetra_stats/gen/strings.g.dart';
|
||||||
import 'package:tetra_stats/utils/numers_formats.dart';
|
import 'package:tetra_stats/utils/numers_formats.dart';
|
||||||
import 'package:tetra_stats/utils/relative_timestamps.dart';
|
import 'package:tetra_stats/utils/relative_timestamps.dart';
|
||||||
import 'package:tetra_stats/utils/text_shadow.dart';
|
import 'package:tetra_stats/utils/text_shadow.dart';
|
||||||
import 'package:tetra_stats/views/compare_view.dart';
|
|
||||||
import 'package:tetra_stats/widgets/stat_sell_num.dart';
|
|
||||||
import 'package:tetra_stats/widgets/text_timestamp.dart';
|
import 'package:tetra_stats/widgets/text_timestamp.dart';
|
||||||
import 'package:tetra_stats/data_objects/tetrio.dart';
|
import 'package:tetra_stats/data_objects/tetrio.dart';
|
||||||
import 'package:tetra_stats/main.dart';
|
import 'package:tetra_stats/main.dart';
|
||||||
import 'package:tetra_stats/widgets/tl_thingy.dart';
|
|
||||||
import 'package:tetra_stats/widgets/user_thingy.dart';
|
import 'package:tetra_stats/widgets/user_thingy.dart';
|
||||||
|
|
||||||
class MainView extends StatefulWidget {
|
class MainView extends StatefulWidget {
|
||||||
|
@ -45,7 +42,7 @@ TetrioPlayer testPlayer = TetrioPlayer(
|
||||||
registrationTime: DateTime(2002, 2, 25, 9, 30, 01),
|
registrationTime: DateTime(2002, 2, 25, 9, 30, 01),
|
||||||
avatarRevision: 1704835194288,
|
avatarRevision: 1704835194288,
|
||||||
bannerRevision: 1661462402700,
|
bannerRevision: 1661462402700,
|
||||||
role: "sysop",
|
role: "user",
|
||||||
country: "BY",
|
country: "BY",
|
||||||
state: DateTime(1970),
|
state: DateTime(1970),
|
||||||
badges: [
|
badges: [
|
||||||
|
@ -63,13 +60,13 @@ TetrioPlayer testPlayer = TetrioPlayer(
|
||||||
friendCount: 69,
|
friendCount: 69,
|
||||||
gamesPlayed: 13747,
|
gamesPlayed: 13747,
|
||||||
gamesWon: 6523,
|
gamesWon: 6523,
|
||||||
gameTime: Duration(days: 79, minutes: 28, seconds: 23, microseconds: 637591),
|
gameTime: const Duration(days: 79, minutes: 28, seconds: 23, microseconds: 637591),
|
||||||
xp: 1415239,
|
xp: 1415239,
|
||||||
supporterTier: 2,
|
supporterTier: 2,
|
||||||
verified: true,
|
verified: true,
|
||||||
connections: null,
|
connections: null,
|
||||||
tlSeason1: TetraLeagueAlpha(timestamp: DateTime(1970), gamesPlayed: 28, gamesWon: 14, bestRank: "x", decaying: false, rating: 23500.6194, rank: "x", percentileRank: "x", percentile: 0.00, standing: 1, standingLocal: 1, nextAt: -1, prevAt: 500),
|
tlSeason1: TetraLeagueAlpha(timestamp: DateTime(1970), gamesPlayed: 28, gamesWon: 14, bestRank: "x", decaying: false, rating: 23500.6194, rank: "x", percentileRank: "x", percentile: 0.00, standing: 1, standingLocal: 1, nextAt: -1, prevAt: 500),
|
||||||
distinguishment: Distinguishment(type: "twc", detail: "2023"),
|
//distinguishment: Distinguishment(type: "twc", detail: "2023"),
|
||||||
bio: "кровбер не в палку, без последнего тспина - 32 атаки. кровбер не в палку, без первого тсм и последнего тспина - 30 атаки. кровбер в палку с б2б - 38 атаки.(5 б2б)(не знаю от чего зависит) кровбер в палку с б2б - 36 атаки.(5 б2б)(не знаю от чего зависит)"
|
bio: "кровбер не в палку, без последнего тспина - 32 атаки. кровбер не в палку, без первого тсм и последнего тспина - 30 атаки. кровбер в палку с б2б - 38 атаки.(5 б2б)(не знаю от чего зависит) кровбер в палку с б2б - 36 атаки.(5 б2б)(не знаю от чего зависит)"
|
||||||
);
|
);
|
||||||
News testNews = News("6098518e3d5155e6ec429cdc", [
|
News testNews = News("6098518e3d5155e6ec429cdc", [
|
||||||
|
@ -82,6 +79,7 @@ late ScrollController controller;
|
||||||
class _MainState extends State<MainView> with TickerProviderStateMixin {
|
class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
teto.open();
|
||||||
controller = ScrollController();
|
controller = ScrollController();
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
@ -95,6 +93,7 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
drawer: const SearchDrawer(),
|
||||||
body: LayoutBuilder(
|
body: LayoutBuilder(
|
||||||
builder: (BuildContext context, BoxConstraints constraints) {
|
builder: (BuildContext context, BoxConstraints constraints) {
|
||||||
return Row(
|
return Row(
|
||||||
|
@ -103,7 +102,7 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
leading: FloatingActionButton(
|
leading: FloatingActionButton(
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
// Add your onPressed code here!
|
Scaffold.of(context).openDrawer();
|
||||||
},
|
},
|
||||||
child: const Icon(Icons.search),
|
child: const Icon(Icons.search),
|
||||||
),
|
),
|
||||||
|
@ -154,8 +153,8 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: ElevatedButton.icon(onPressed: (){print("ok, and?");}, icon: Icon(Icons.person_add), label: Text(t.track), style: ButtonStyle(shape: MaterialStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.horizontal(left: Radius.circular(12.0), right: Radius.zero)))))),
|
Expanded(child: ElevatedButton.icon(onPressed: (){print("ok, and?");}, icon: const Icon(Icons.person_add), label: Text(t.track), style: const ButtonStyle(shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.horizontal(left: Radius.circular(12.0), right: Radius.zero)))))),
|
||||||
Expanded(child: ElevatedButton.icon(onPressed: (){print("ok, and?");}, icon: Icon(Icons.balance), label: Text(t.compare), style: ButtonStyle(shape: MaterialStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.horizontal(left: Radius.zero, right: Radius.circular(12.0)))))))
|
Expanded(child: ElevatedButton.icon(onPressed: (){print("ok, and?");}, icon: const Icon(Icons.balance), label: Text(t.compare), style: const ButtonStyle(shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.horizontal(left: Radius.zero, right: Radius.circular(12.0)))))))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -166,8 +165,8 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0),
|
padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Text("Badges", style: TextStyle(fontFamily: "Eurostile Round Extended")),
|
const Text("Badges", style: TextStyle(fontFamily: "Eurostile Round Extended")),
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
Text(intf.format(testPlayer.badges.length))
|
Text(intf.format(testPlayer.badges.length))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -241,9 +240,9 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
Text(t.bio, style: TextStyle(fontFamily: "Eurostile Round Extended")),
|
Text(t.bio, style: const TextStyle(fontFamily: "Eurostile Round Extended")),
|
||||||
Spacer()
|
const Spacer()
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
|
@ -267,13 +266,13 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
Text(t.tetraLeague, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 42)),
|
Text(t.tetraLeague, style: const TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 42)),
|
||||||
Spacer()
|
const Spacer()
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Card(),
|
const Card(),
|
||||||
SegmentedButton<Cards>(
|
SegmentedButton<Cards>(
|
||||||
segments: const <ButtonSegment<Cards>>[
|
segments: const <ButtonSegment<Cards>>[
|
||||||
ButtonSegment<Cards>(
|
ButtonSegment<Cards>(
|
||||||
|
@ -305,7 +304,7 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
// label: Text('Other'),
|
// label: Text('Other'),
|
||||||
// icon: Icon(Icons.calendar_today)),
|
// icon: Icon(Icons.calendar_today)),
|
||||||
],
|
],
|
||||||
selected: <Cards>{Cards.tetraLeague},
|
selected: const <Cards>{Cards.tetraLeague},
|
||||||
onSelectionChanged: (Set<Cards> newSelection) {
|
onSelectionChanged: (Set<Cards> newSelection) {
|
||||||
setState(() {
|
setState(() {
|
||||||
// By default there is only a single segment that can be
|
// By default there is only a single segment that can be
|
||||||
|
@ -328,7 +327,7 @@ class _MainState extends State<MainView> with TickerProviderStateMixin {
|
||||||
class NewsThingy extends StatelessWidget{
|
class NewsThingy extends StatelessWidget{
|
||||||
final News news;
|
final News news;
|
||||||
|
|
||||||
NewsThingy(this.news);
|
const NewsThingy(this.news, {super.key});
|
||||||
|
|
||||||
ListTile getNewsTile(NewsEntry news){
|
ListTile getNewsTile(NewsEntry news){
|
||||||
Map<String, String> gametypes = {
|
Map<String, String> gametypes = {
|
||||||
|
@ -480,9 +479,9 @@ class NewsThingy extends StatelessWidget{
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
Text(t.news, style: TextStyle(fontFamily: "Eurostile Round Extended")),
|
Text(t.news, style: const TextStyle(fontFamily: "Eurostile Round Extended")),
|
||||||
Spacer()
|
const Spacer()
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
for (NewsEntry entry in news.news) getNewsTile(entry)
|
for (NewsEntry entry in news.news) getNewsTile(entry)
|
||||||
|
@ -497,7 +496,7 @@ class NewsThingy extends StatelessWidget{
|
||||||
class DistinguishmentThingy extends StatelessWidget{
|
class DistinguishmentThingy extends StatelessWidget{
|
||||||
final Distinguishment distinguishment;
|
final Distinguishment distinguishment;
|
||||||
|
|
||||||
DistinguishmentThingy(this.distinguishment, {super.key});
|
const DistinguishmentThingy(this.distinguishment, {super.key});
|
||||||
|
|
||||||
List<InlineSpan> getDistinguishmentTitle(String? text) {
|
List<InlineSpan> getDistinguishmentTitle(String? text) {
|
||||||
// TWC champions don't have header in their distinguishments
|
// TWC champions don't have header in their distinguishments
|
||||||
|
@ -544,23 +543,23 @@ class DistinguishmentThingy extends StatelessWidget{
|
||||||
switch(type){
|
switch(type){
|
||||||
case "staff":
|
case "staff":
|
||||||
switch(detail){
|
switch(detail){
|
||||||
case "founder": return Color(0xAAFD82D4);
|
case "founder": return const Color(0xAAFD82D4);
|
||||||
case "kagarin": return Color(0xAAFF0060);
|
case "kagarin": return const Color(0xAAFF0060);
|
||||||
case "team": return Color(0xAAFACC2E);
|
case "team": return const Color(0xAAFACC2E);
|
||||||
case "team-minor": return Color(0xAAF5BD45);
|
case "team-minor": return const Color(0xAAF5BD45);
|
||||||
case "administrator": return Color(0xAAFF4E8A);
|
case "administrator": return const Color(0xAAFF4E8A);
|
||||||
case "globalmod": return Color(0xAAE878FF);
|
case "globalmod": return const Color(0xAAE878FF);
|
||||||
case "communitymod": return Color(0xAA4E68FB);
|
case "communitymod": return const Color(0xAA4E68FB);
|
||||||
case "alumni": return Color(0xAA6057DB);
|
case "alumni": return const Color(0xAA6057DB);
|
||||||
default: return theme.colorScheme.surface;
|
default: return theme.colorScheme.surface;
|
||||||
}
|
}
|
||||||
case "champion":
|
case "champion":
|
||||||
switch (detail){
|
switch (detail){
|
||||||
case "blitz":
|
case "blitz":
|
||||||
case "40l": return Color(0xAACCF5F6);
|
case "40l": return const Color(0xAACCF5F6);
|
||||||
case "league": return Color(0xAAFFDB31);
|
case "league": return const Color(0xAAFFDB31);
|
||||||
}
|
}
|
||||||
case "twc": return Color(0xAAFFDB31);
|
case "twc": return const Color(0xAAFFDB31);
|
||||||
default: return theme.colorScheme.surface;
|
default: return theme.colorScheme.surface;
|
||||||
}
|
}
|
||||||
return theme.colorScheme.surface;
|
return theme.colorScheme.surface;
|
||||||
|
@ -574,9 +573,9 @@ class DistinguishmentThingy extends StatelessWidget{
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
Text(t.distinguishment, style: TextStyle(fontFamily: "Eurostile Round Extended")),
|
Text(t.distinguishment, style: const TextStyle(fontFamily: "Eurostile Round Extended")),
|
||||||
Spacer()
|
const Spacer()
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
RichText(
|
RichText(
|
||||||
|
@ -603,17 +602,17 @@ class NewUserThingy extends StatelessWidget {
|
||||||
Color roleColor(String role){
|
Color roleColor(String role){
|
||||||
switch (role){
|
switch (role){
|
||||||
case "sysop":
|
case "sysop":
|
||||||
return Color.fromARGB(255, 23, 165, 133);
|
return const Color.fromARGB(255, 23, 165, 133);
|
||||||
case "admin":
|
case "admin":
|
||||||
return Color.fromARGB(255, 255, 78, 138);
|
return const Color.fromARGB(255, 255, 78, 138);
|
||||||
case "mod":
|
case "mod":
|
||||||
return Color.fromARGB(255, 204, 128, 242);
|
return const Color.fromARGB(255, 204, 128, 242);
|
||||||
case "halfmod":
|
case "halfmod":
|
||||||
return Color.fromARGB(255, 95, 118, 254);
|
return const Color.fromARGB(255, 95, 118, 254);
|
||||||
case "bot":
|
case "bot":
|
||||||
return Color.fromARGB(255, 60, 93, 55);
|
return const Color.fromARGB(255, 60, 93, 55);
|
||||||
case "banned":
|
case "banned":
|
||||||
return Color.fromARGB(255, 248, 28, 28);
|
return const Color.fromARGB(255, 248, 28, 28);
|
||||||
default:
|
default:
|
||||||
return Colors.white10;
|
return Colors.white10;
|
||||||
}
|
}
|
||||||
|
@ -623,7 +622,7 @@ class NewUserThingy extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final t = Translations.of(context);
|
final t = Translations.of(context);
|
||||||
return LayoutBuilder(builder: (context, constraints) {
|
return LayoutBuilder(builder: (context, constraints) {
|
||||||
bool bigScreen = constraints.maxWidth > 768;
|
//bool bigScreen = constraints.maxWidth > 768;
|
||||||
double pfpHeight = 128;
|
double pfpHeight = 128;
|
||||||
int xpTableID = 0;
|
int xpTableID = 0;
|
||||||
|
|
||||||
|
@ -638,7 +637,7 @@ class NewUserThingy extends StatelessWidget {
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
constraints: BoxConstraints(maxWidth: 960),
|
constraints: const BoxConstraints(maxWidth: 960),
|
||||||
height: player.bannerRevision != null ? 218.0 : 138.0,
|
height: player.bannerRevision != null ? 218.0 : 138.0,
|
||||||
child: Stack(
|
child: Stack(
|
||||||
//clipBehavior: Clip.none,
|
//clipBehavior: Clip.none,
|
||||||
|
@ -673,7 +672,7 @@ class NewUserThingy extends StatelessWidget {
|
||||||
child: Text(player.username,
|
child: Text(player.username,
|
||||||
//softWrap: true,
|
//softWrap: true,
|
||||||
overflow: TextOverflow.fade,
|
overflow: TextOverflow.fade,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
fontFamily: "Eurostile Round Extended",
|
fontFamily: "Eurostile Round Extended",
|
||||||
fontSize: 28,
|
fontSize: 28,
|
||||||
)
|
)
|
||||||
|
@ -686,14 +685,14 @@ class NewUserThingy extends StatelessWidget {
|
||||||
children: [
|
children: [
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(right: 4.0),
|
padding: const EdgeInsets.only(right: 4.0),
|
||||||
child: Chip(label: Text(player.role.toUpperCase(), style: TextStyle(shadows: textShadow),), padding: EdgeInsets.all(0.0), color: MaterialStatePropertyAll(roleColor(player.role))),
|
child: Chip(label: Text(player.role.toUpperCase(), style: const TextStyle(shadows: textShadow),), padding: const EdgeInsets.all(0.0), color: WidgetStatePropertyAll(roleColor(player.role))),
|
||||||
),
|
),
|
||||||
RichText(
|
RichText(
|
||||||
text: TextSpan(
|
text: TextSpan(
|
||||||
style: TextStyle(fontFamily: "Eurostile Round"),
|
style: const TextStyle(fontFamily: "Eurostile Round"),
|
||||||
children:
|
children:
|
||||||
[
|
[
|
||||||
if (player.friendCount > 0) WidgetSpan(child: Icon(Icons.person), alignment: PlaceholderAlignment.middle, baseline: TextBaseline.alphabetic),
|
if (player.friendCount > 0) const WidgetSpan(child: Icon(Icons.person), alignment: PlaceholderAlignment.middle, baseline: TextBaseline.alphabetic),
|
||||||
if (player.friendCount > 0) TextSpan(text: "${intf.format(player.friendCount)} "),
|
if (player.friendCount > 0) TextSpan(text: "${intf.format(player.friendCount)} "),
|
||||||
if (player.supporterTier > 0) WidgetSpan(child: Icon(player.supporterTier > 1 ? Icons.star : Icons.star_border, color: player.supporterTier > 1 ? Colors.yellowAccent : Colors.white), alignment: PlaceholderAlignment.middle, baseline: TextBaseline.alphabetic),
|
if (player.supporterTier > 0) WidgetSpan(child: Icon(player.supporterTier > 1 ? Icons.star : Icons.star_border, color: player.supporterTier > 1 ? Colors.yellowAccent : Colors.white), alignment: PlaceholderAlignment.middle, baseline: TextBaseline.alphabetic),
|
||||||
if (player.supporterTier > 0) TextSpan(text: player.supporterTier.toString(), style: TextStyle(color: player.supporterTier > 1 ? Colors.yellowAccent : Colors.white)),
|
if (player.supporterTier > 0) TextSpan(text: player.supporterTier.toString(), style: TextStyle(color: player.supporterTier > 1 ? Colors.yellowAccent : Colors.white)),
|
||||||
|
@ -708,10 +707,10 @@ class NewUserThingy extends StatelessWidget {
|
||||||
left: 160.0,
|
left: 160.0,
|
||||||
child: RichText(
|
child: RichText(
|
||||||
text: TextSpan(
|
text: TextSpan(
|
||||||
style: TextStyle(fontFamily: "Eurostile Round"),
|
style: const TextStyle(fontFamily: "Eurostile Round"),
|
||||||
children: [
|
children: [
|
||||||
if (player.country != null) TextSpan(text: "${t.countries[player.country]} • "),
|
if (player.country != null) TextSpan(text: "${t.countries[player.country]} • "),
|
||||||
TextSpan(text: "${player.registrationTime == null ? t.wasFromBeginning : '${timestamp(player.registrationTime!)}'}", style: TextStyle(color: Colors.grey))
|
TextSpan(text: player.registrationTime == null ? t.wasFromBeginning : timestamp(player.registrationTime!), style: const TextStyle(color: Colors.grey))
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -722,7 +721,7 @@ class NewUserThingy extends StatelessWidget {
|
||||||
child: RichText(
|
child: RichText(
|
||||||
textAlign: TextAlign.end,
|
textAlign: TextAlign.end,
|
||||||
text: TextSpan(
|
text: TextSpan(
|
||||||
style: TextStyle(fontFamily: "Eurostile Round"),
|
style: const TextStyle(fontFamily: "Eurostile Round"),
|
||||||
children: [
|
children: [
|
||||||
TextSpan(text: "Level ${intf.format(player.level.floor())}", recognizer: TapGestureRecognizer()..onTap = (){
|
TextSpan(text: "Level ${intf.format(player.level.floor())}", recognizer: TapGestureRecognizer()..onTap = (){
|
||||||
showDialog(
|
showDialog(
|
||||||
|
@ -756,14 +755,14 @@ class NewUserThingy extends StatelessWidget {
|
||||||
),
|
),
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
TextButton(
|
TextButton(
|
||||||
child: Text("OK"),
|
child: const Text("OK"),
|
||||||
onPressed: () {Navigator.of(context).pop();}
|
onPressed: () {Navigator.of(context).pop();}
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
TextSpan(text:"\n"),
|
const TextSpan(text:"\n"),
|
||||||
TextSpan(text: player.gameTime.isNegative ? "-h --m" : playtime(player.gameTime), style: TextStyle(color: player.gameTime.isNegative ? Colors.grey : Colors.white), recognizer: TapGestureRecognizer()..onTap = (){
|
TextSpan(text: player.gameTime.isNegative ? "-h --m" : playtime(player.gameTime), style: TextStyle(color: player.gameTime.isNegative ? Colors.grey : Colors.white), recognizer: TapGestureRecognizer()..onTap = (){
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
|
@ -781,16 +780,16 @@ class NewUserThingy extends StatelessWidget {
|
||||||
),
|
),
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
TextButton(
|
TextButton(
|
||||||
child: Text("OK"),
|
child: const Text("OK"),
|
||||||
onPressed: () {Navigator.of(context).pop();}
|
onPressed: () {Navigator.of(context).pop();}
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
TextSpan(text:"\n"),
|
const TextSpan(text:"\n"),
|
||||||
TextSpan(text: "${player.gamesWon > -1 ? intf.format(player.gamesWon) : "---"}", style: TextStyle(color: player.gamesWon > -1 ? Colors.white : Colors.grey)),
|
TextSpan(text: player.gamesWon > -1 ? intf.format(player.gamesWon) : "---", style: TextStyle(color: player.gamesWon > -1 ? Colors.white : Colors.grey)),
|
||||||
TextSpan(text: "/${player.gamesPlayed > -1 ? intf.format(player.gamesPlayed) : "---"}", style: TextStyle(fontFamily: "Eurostile Round Condensed", color: Colors.grey)),
|
TextSpan(text: "/${player.gamesPlayed > -1 ? intf.format(player.gamesPlayed) : "---"}", style: const TextStyle(fontFamily: "Eurostile Round Condensed", color: Colors.grey)),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -813,3 +812,61 @@ class NewUserThingy extends StatelessWidget {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SearchDrawer extends StatefulWidget{
|
||||||
|
const SearchDrawer({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SearchDrawer> createState() => _SearchDrawerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SearchDrawerState extends State<SearchDrawer> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Drawer(
|
||||||
|
child: StreamBuilder(
|
||||||
|
stream: teto.allPlayers,
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
switch (snapshot.connectionState) {
|
||||||
|
case ConnectionState.none:
|
||||||
|
case ConnectionState.waiting:
|
||||||
|
case ConnectionState.done:
|
||||||
|
case ConnectionState.active:
|
||||||
|
final allPlayers = (snapshot.data != null)
|
||||||
|
? snapshot.data as Map<String, String>
|
||||||
|
: <String, String>{};
|
||||||
|
allPlayers.remove(prefs.getString("player") ?? "6098518e3d5155e6ec429cdc"); // player from the home button will be delisted
|
||||||
|
List<String> keys = allPlayers.keys.toList();
|
||||||
|
return NestedScrollView(
|
||||||
|
headerSliverBuilder: (BuildContext context, bool value){
|
||||||
|
return [
|
||||||
|
SliverToBoxAdapter(
|
||||||
|
child: SearchBar(
|
||||||
|
hintText: "Hello",
|
||||||
|
hintStyle: const WidgetStatePropertyAll(TextStyle(color: Colors.grey)),
|
||||||
|
trailing: [
|
||||||
|
IconButton(onPressed: (){print("sas");}, icon: const Icon(Icons.search))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
];
|
||||||
|
},
|
||||||
|
body: ListView.builder( // Builds list of tracked players.
|
||||||
|
itemCount: allPlayers.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
var i = allPlayers.length-1-index; // Last players in this map are most recent ones, they are gonna be shown at the top.
|
||||||
|
return ListTile(
|
||||||
|
title: Text(allPlayers[keys[i]]??keys[i]), // Takes last known username from list of states
|
||||||
|
onTap: () {
|
||||||
|
//widget.changePlayer(keys[i]); // changes to chosen player
|
||||||
|
Navigator.of(context).pop(); // and closes itself.
|
||||||
|
},
|
||||||
|
);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:tetra_stats/main.dart' show teto;
|
import 'package:tetra_stats/main.dart' show teto;
|
||||||
import 'package:tetra_stats/gen/strings.g.dart';
|
import 'package:tetra_stats/gen/strings.g.dart';
|
||||||
import 'package:tetra_stats/views/tl_match_view.dart';
|
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
late String oldWindowTitle;
|
late String oldWindowTitle;
|
||||||
|
|
|
@ -41,7 +41,7 @@ class TlMatchResultState extends State<TlMatchResultView> {
|
||||||
late Duration time;
|
late Duration time;
|
||||||
late String readableTime;
|
late String readableTime;
|
||||||
late String reason;
|
late String reason;
|
||||||
Duration totalTime = Duration();
|
Duration totalTime = const Duration();
|
||||||
List<Duration> roundLengths = [];
|
List<Duration> roundLengths = [];
|
||||||
List<BetaLeagueStats> timeWeightedStats = [];
|
List<BetaLeagueStats> timeWeightedStats = [];
|
||||||
late bool initPlayerWon;
|
late bool initPlayerWon;
|
||||||
|
@ -53,9 +53,9 @@ class TlMatchResultState extends State<TlMatchResultView> {
|
||||||
if (rounds.indexWhere((element) => element.value == -2) == -1) rounds.insert(1, DropdownMenuItem(value: -2, child: Text(t.timeWeightedmatch)));
|
if (rounds.indexWhere((element) => element.value == -2) == -1) rounds.insert(1, DropdownMenuItem(value: -2, child: Text(t.timeWeightedmatch)));
|
||||||
greenSidePlayer = widget.record.results.leaderboard.indexWhere((element) => element.id == widget.initPlayerId);
|
greenSidePlayer = widget.record.results.leaderboard.indexWhere((element) => element.id == widget.initPlayerId);
|
||||||
redSidePlayer = widget.record.results.leaderboard.indexWhere((element) => element.id != widget.initPlayerId);
|
redSidePlayer = widget.record.results.leaderboard.indexWhere((element) => element.id != widget.initPlayerId);
|
||||||
List<double> APMmultipliedByWeights = [0, 0];
|
List<double> apmMultipliedByWeights = [0, 0];
|
||||||
List<double> PPSmultipliedByWeights = [0, 0];
|
List<double> ppsMultipliedByWeights= [0, 0];
|
||||||
List<double> VSmultipliedByWeights = [0, 0];
|
List<double> vsMultipliedByWeights = [0, 0];
|
||||||
for (var round in widget.record.results.rounds){
|
for (var round in widget.record.results.rounds){
|
||||||
var longerLifetime = round[0].lifetime.compareTo(round[1].lifetime) == 1 ? round[0].lifetime : round[1].lifetime;
|
var longerLifetime = round[0].lifetime.compareTo(round[1].lifetime) == 1 ? round[0].lifetime : round[1].lifetime;
|
||||||
roundLengths.add(longerLifetime);
|
roundLengths.add(longerLifetime);
|
||||||
|
@ -64,18 +64,18 @@ class TlMatchResultState extends State<TlMatchResultView> {
|
||||||
BetaLeagueRound greenSide = round.firstWhere((element) => element.id == widget.initPlayerId);
|
BetaLeagueRound greenSide = round.firstWhere((element) => element.id == widget.initPlayerId);
|
||||||
BetaLeagueRound redSide = round.firstWhere((element) => element.id != widget.initPlayerId);
|
BetaLeagueRound redSide = round.firstWhere((element) => element.id != widget.initPlayerId);
|
||||||
|
|
||||||
APMmultipliedByWeights[0] += greenSide.stats.apm*longerLifetime.inMilliseconds;
|
apmMultipliedByWeights[0] += greenSide.stats.apm*longerLifetime.inMilliseconds;
|
||||||
APMmultipliedByWeights[1] += redSide.stats.apm*longerLifetime.inMilliseconds;
|
apmMultipliedByWeights[1] += redSide.stats.apm*longerLifetime.inMilliseconds;
|
||||||
PPSmultipliedByWeights[0] += greenSide.stats.pps*longerLifetime.inMilliseconds;
|
ppsMultipliedByWeights[0] += greenSide.stats.pps*longerLifetime.inMilliseconds;
|
||||||
PPSmultipliedByWeights[1] += redSide.stats.pps*longerLifetime.inMilliseconds;
|
ppsMultipliedByWeights[1] += redSide.stats.pps*longerLifetime.inMilliseconds;
|
||||||
VSmultipliedByWeights[0] += greenSide.stats.vs*longerLifetime.inMilliseconds;
|
vsMultipliedByWeights[0] += greenSide.stats.vs*longerLifetime.inMilliseconds;
|
||||||
VSmultipliedByWeights[1] += redSide.stats.vs*longerLifetime.inMilliseconds;
|
vsMultipliedByWeights[1] += redSide.stats.vs*longerLifetime.inMilliseconds;
|
||||||
}
|
}
|
||||||
timeWeightedStats = [
|
timeWeightedStats = [
|
||||||
BetaLeagueStats(
|
BetaLeagueStats(
|
||||||
apm: APMmultipliedByWeights[0]/totalTime.inMilliseconds,
|
apm: apmMultipliedByWeights[0]/totalTime.inMilliseconds,
|
||||||
pps: PPSmultipliedByWeights[0]/totalTime.inMilliseconds,
|
pps: ppsMultipliedByWeights[0]/totalTime.inMilliseconds,
|
||||||
vs: VSmultipliedByWeights[0]/totalTime.inMilliseconds,
|
vs: vsMultipliedByWeights[0]/totalTime.inMilliseconds,
|
||||||
garbageSent: widget.record.results.leaderboard[greenSidePlayer].stats.garbageSent,
|
garbageSent: widget.record.results.leaderboard[greenSidePlayer].stats.garbageSent,
|
||||||
garbageReceived: widget.record.results.leaderboard[greenSidePlayer].stats.garbageReceived,
|
garbageReceived: widget.record.results.leaderboard[greenSidePlayer].stats.garbageReceived,
|
||||||
kills: widget.record.results.leaderboard[greenSidePlayer].stats.kills,
|
kills: widget.record.results.leaderboard[greenSidePlayer].stats.kills,
|
||||||
|
@ -83,9 +83,9 @@ class TlMatchResultState extends State<TlMatchResultView> {
|
||||||
rank: widget.record.results.leaderboard[greenSidePlayer].stats.rank
|
rank: widget.record.results.leaderboard[greenSidePlayer].stats.rank
|
||||||
),
|
),
|
||||||
BetaLeagueStats(
|
BetaLeagueStats(
|
||||||
apm: APMmultipliedByWeights[1]/totalTime.inMilliseconds,
|
apm: apmMultipliedByWeights[1]/totalTime.inMilliseconds,
|
||||||
pps: PPSmultipliedByWeights[1]/totalTime.inMilliseconds,
|
pps: ppsMultipliedByWeights[1]/totalTime.inMilliseconds,
|
||||||
vs: VSmultipliedByWeights[1]/totalTime.inMilliseconds,
|
vs: vsMultipliedByWeights[1]/totalTime.inMilliseconds,
|
||||||
garbageSent: widget.record.results.leaderboard[redSidePlayer].stats.garbageSent,
|
garbageSent: widget.record.results.leaderboard[redSidePlayer].stats.garbageSent,
|
||||||
garbageReceived: widget.record.results.leaderboard[redSidePlayer].stats.garbageReceived,
|
garbageReceived: widget.record.results.leaderboard[redSidePlayer].stats.garbageReceived,
|
||||||
kills: widget.record.results.leaderboard[redSidePlayer].stats.kills,
|
kills: widget.record.results.leaderboard[redSidePlayer].stats.kills,
|
||||||
|
@ -480,12 +480,12 @@ class TlMatchResultState extends State<TlMatchResultView> {
|
||||||
OverflowBar(
|
OverflowBar(
|
||||||
alignment: MainAxisAlignment.spaceEvenly,
|
alignment: MainAxisAlignment.spaceEvenly,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
TextButton( style: roundSelector == -1 ? ButtonStyle(backgroundColor: MaterialStatePropertyAll(Colors.grey.shade900)) : null,
|
TextButton( style: roundSelector == -1 ? ButtonStyle(backgroundColor: WidgetStatePropertyAll(Colors.grey.shade900)) : null,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
roundSelector = -1;
|
roundSelector = -1;
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}, child: Text(t.matchStats)),
|
}, child: Text(t.matchStats)),
|
||||||
TextButton( style: roundSelector == -2 ? ButtonStyle(backgroundColor: MaterialStatePropertyAll(Colors.grey.shade900)) : null,
|
TextButton( style: roundSelector == -2 ? ButtonStyle(backgroundColor: WidgetStatePropertyAll(Colors.grey.shade900)) : null,
|
||||||
onPressed: timeWeightedStatsAvaliable ? () {
|
onPressed: timeWeightedStatsAvaliable ? () {
|
||||||
roundSelector = -2;
|
roundSelector = -2;
|
||||||
setState(() {});
|
setState(() {});
|
||||||
|
|
|
@ -18,26 +18,18 @@ class ZenithRecordView extends StatelessWidget {
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text("${
|
title: Text("${
|
||||||
switch (record.gamemode){
|
switch (record.gamemode){
|
||||||
"zenith" => "Quick Play",
|
"zenith" => t.quickPlay,
|
||||||
"zenithex" => "Quick Play Expert",
|
"zenithex" => "${t.quickPlay} ${t.expert}",
|
||||||
String() => "5000000 Blast",
|
String() => "5000000 Blast",
|
||||||
}
|
}
|
||||||
} ${timestamp(record.timestamp)}"),
|
} ${timestamp(record.timestamp)}"),
|
||||||
),
|
),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: SingleChildScrollView(
|
child: SizedBox(
|
||||||
child: Row(
|
width: MediaQuery.of(context).size.width,
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
child: SingleChildScrollView(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
child: ZenithThingy(record: record, switchable: false),
|
||||||
children: [
|
),
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
ZenithThingy(record: record, switchable: false),
|
|
||||||
// TODO: Insert replay link here
|
|
||||||
]
|
|
||||||
)
|
|
||||||
],
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
// ignore_for_file: unused_field, unused_local_variable, invalid_use_of_visible_for_testing_member, implementation_imports, overridden_fields
|
||||||
|
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:fl_chart/fl_chart.dart';
|
import 'package:fl_chart/fl_chart.dart';
|
||||||
|
@ -196,7 +198,7 @@ class MyRadarChartPainter extends RadarChartPainter{
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyRadarChartLeaf extends RadarChartLeaf{
|
class MyRadarChartLeaf extends RadarChartLeaf{
|
||||||
MyRadarChartLeaf({required super.data, required super.targetData});
|
const MyRadarChartLeaf({super.key, required super.data, required super.targetData});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
RenderRadarChart createRenderObject(BuildContext context) => MyRenderRadarChart(
|
RenderRadarChart createRenderObject(BuildContext context) => MyRenderRadarChart(
|
||||||
|
|
|
@ -106,7 +106,7 @@ class StatCellNum extends StatelessWidget {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
style: ButtonStyle(
|
style: ButtonStyle(
|
||||||
padding: MaterialStateProperty.all(EdgeInsets.zero)),
|
padding: WidgetStateProperty.all(EdgeInsets.zero)),
|
||||||
child: Text(
|
child: Text(
|
||||||
playerStatLabel,
|
playerStatLabel,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
|
@ -26,7 +25,7 @@ class TLRatingThingy extends StatelessWidget{
|
||||||
List<String> formatedTR = f4.format(tlData.rating).split(decimalSeparator);
|
List<String> formatedTR = f4.format(tlData.rating).split(decimalSeparator);
|
||||||
List<String> formatedGlicko = f4.format(tlData.glicko).split(decimalSeparator);
|
List<String> formatedGlicko = f4.format(tlData.glicko).split(decimalSeparator);
|
||||||
List<String> formatedPercentile = f4.format(tlData.percentile * 100).split(decimalSeparator);
|
List<String> formatedPercentile = f4.format(tlData.percentile * 100).split(decimalSeparator);
|
||||||
DateTime now = DateTime.now();
|
//DateTime now = DateTime.now();
|
||||||
//bool beforeS1end = now.isBefore(seasonEnd);
|
//bool beforeS1end = now.isBefore(seasonEnd);
|
||||||
//int daysLeft = seasonEnd.difference(now).inDays;
|
//int daysLeft = seasonEnd.difference(now).inDays;
|
||||||
//int safeRD = min(100, (100 + ((tlData.rd! >= 100 && tlData.decaying) ? 7 : max(0, 7 - (lastMatchPlayed != null ? now.difference(lastMatchPlayed!).inDays : 7))) - daysLeft).toInt());
|
//int safeRD = min(100, (100 + ((tlData.rd! >= 100 && tlData.decaying) ? 7 : max(0, 7 - (lastMatchPlayed != null ? now.difference(lastMatchPlayed!).inDays : 7))) - daysLeft).toInt());
|
||||||
|
|
|
@ -2,7 +2,6 @@ import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:path/path.dart';
|
|
||||||
import 'package:tetra_stats/data_objects/tetrio.dart';
|
import 'package:tetra_stats/data_objects/tetrio.dart';
|
||||||
import 'package:syncfusion_flutter_gauges/gauges.dart';
|
import 'package:syncfusion_flutter_gauges/gauges.dart';
|
||||||
import 'package:tetra_stats/gen/strings.g.dart';
|
import 'package:tetra_stats/gen/strings.g.dart';
|
||||||
|
|
|
@ -18,7 +18,7 @@ class ZenithThingy extends StatefulWidget{
|
||||||
final RecordSingle? recordEX;
|
final RecordSingle? recordEX;
|
||||||
final Function? parentZenithToggle;
|
final Function? parentZenithToggle;
|
||||||
|
|
||||||
ZenithThingy({this.record, this.recordEX, this.switchable = true, this.parentZenithToggle, this.initEXvalue = false});
|
const ZenithThingy({super.key, this.record, this.recordEX, this.switchable = true, this.parentZenithToggle, this.initEXvalue = false});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<ZenithThingy> createState() => _ZenithThingyState();
|
State<ZenithThingy> createState() => _ZenithThingyState();
|
||||||
|
@ -71,188 +71,189 @@ class _ZenithThingyState extends State<ZenithThingy> {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return SingleChildScrollView(
|
return Padding(padding: const EdgeInsets.only(top: 8.0),
|
||||||
child: Padding(padding: const EdgeInsets.only(top: 8.0),
|
child: Column(
|
||||||
child: Column(
|
children: [
|
||||||
children: [
|
Text("${t.quickPlay}${ex ? " ${t.expert}" : ""}", style: const TextStyle(height: 0.1, fontFamily: "Eurostile Round Extended", fontSize: 18)),
|
||||||
Text("${t.quickPlay}${ex ? " ${t.expert}" : ""}", style: const TextStyle(height: 0.1, fontFamily: "Eurostile Round Extended", fontSize: 18)),
|
RichText(text: TextSpan(
|
||||||
RichText(text: TextSpan(
|
text: "${f2.format(record!.stats.zenith!.altitude)} m",
|
||||||
text: "${f2.format(record!.stats.zenith!.altitude)} m",
|
style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 36 : 32, fontWeight: FontWeight.w500, color: Colors.white),
|
||||||
style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 36 : 32, fontWeight: FontWeight.w500, color: Colors.white),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
if ((record!.extras as ZenithExtras).mods.isNotEmpty) RichText(
|
),
|
||||||
text: TextSpan(
|
if ((record!.extras as ZenithExtras).mods.isNotEmpty) RichText(
|
||||||
text: "",
|
text: TextSpan(
|
||||||
style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 14, color: Colors.white),
|
text: "",
|
||||||
children: [
|
style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 14, color: Colors.white),
|
||||||
TextSpan(text: "${t.withMods}: "),
|
|
||||||
for (String mod in (record!.extras as ZenithExtras).mods) TextSpan(text: "${mod.toUpperCase()} "),
|
|
||||||
]
|
|
||||||
),
|
|
||||||
),
|
|
||||||
RichText(
|
|
||||||
text: TextSpan(
|
|
||||||
text: "",
|
|
||||||
style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 14, color: Colors.grey),
|
|
||||||
children: [
|
|
||||||
if (record!.rank != -1) TextSpan(text: "№${record!.rank}"),
|
|
||||||
if (record!.rank != -1) const TextSpan(text: " • "),
|
|
||||||
if (record!.countryRank != -1) TextSpan(text: "№${record!.countryRank} local"),
|
|
||||||
if (record!.countryRank != -1) const TextSpan(text: " • "),
|
|
||||||
TextSpan(text: timestamp(widget.record!.timestamp)),
|
|
||||||
]
|
|
||||||
),
|
|
||||||
),
|
|
||||||
if (widget.switchable) TextButton(onPressed: (){
|
|
||||||
if (ex){
|
|
||||||
ex = false;
|
|
||||||
}else{
|
|
||||||
ex = true;
|
|
||||||
}
|
|
||||||
setState(() {
|
|
||||||
if (widget.parentZenithToggle != null) widget.parentZenithToggle!();
|
|
||||||
record = ex ? widget.recordEX : widget.record;
|
|
||||||
});
|
|
||||||
}, child: Text(ex ? "Switch to normal" : "Switch to Expert")),
|
|
||||||
Wrap(
|
|
||||||
alignment: WrapAlignment.spaceBetween,
|
|
||||||
crossAxisAlignment: WrapCrossAlignment.start,
|
|
||||||
spacing: 20,
|
|
||||||
children: [
|
children: [
|
||||||
StatCellNum(playerStat: record!.aggregateStats.apm, playerStatLabel: t.statCellNum.apm, fractionDigits: 2, isScreenBig: bigScreen, higherIsBetter: true, smallDecimal: true),
|
TextSpan(text: "${t.withMods}: "),
|
||||||
StatCellNum(playerStat: record!.aggregateStats.pps, playerStatLabel: t.statCellNum.pps, fractionDigits: 2, isScreenBig: bigScreen, higherIsBetter: true, smallDecimal: false),
|
for (String mod in (record!.extras as ZenithExtras).mods) TextSpan(text: "${mod.toUpperCase()} "),
|
||||||
StatCellNum(playerStat: record!.aggregateStats.vs, playerStatLabel: t.statCellNum.vs, fractionDigits: 2, isScreenBig: bigScreen, higherIsBetter: true, smallDecimal: true),
|
]
|
||||||
StatCellNum(playerStat: record!.stats.kills, playerStatLabel: "Kills", isScreenBig: bigScreen, higherIsBetter: true),
|
|
||||||
StatCellNum(playerStat: record!.stats.cps, playerStatLabel: "CPS\n(Peak: ${f2.format(record!.stats.zenith!.peakrank)})", fractionDigits: 2, isScreenBig: bigScreen, higherIsBetter: true)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
FinesseThingy(record?.stats.finesse, record?.stats.finessePercentage),
|
),
|
||||||
LineclearsThingy(record!.stats.clears, record!.stats.lines, record!.stats.holds, record!.stats.tSpins),
|
RichText(
|
||||||
Padding(
|
text: TextSpan(
|
||||||
padding: const EdgeInsets.only(top: 8.0),
|
text: "",
|
||||||
child: SizedBox(
|
style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 14, color: Colors.grey),
|
||||||
width: 300,
|
children: [
|
||||||
child: Column(
|
if (record!.rank != -1) TextSpan(text: "№${record!.rank}"),
|
||||||
mainAxisSize: MainAxisSize.min,
|
if (record!.rank != -1) const TextSpan(text: " • "),
|
||||||
|
if (record!.countryRank != -1) TextSpan(text: "№${record!.countryRank} local"),
|
||||||
|
if (record!.countryRank != -1) const TextSpan(text: " • "),
|
||||||
|
TextSpan(text: timestamp(widget.record!.timestamp)),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (widget.switchable) TextButton(onPressed: (){
|
||||||
|
if (ex){
|
||||||
|
ex = false;
|
||||||
|
}else{
|
||||||
|
ex = true;
|
||||||
|
}
|
||||||
|
setState(() {
|
||||||
|
if (widget.parentZenithToggle != null) widget.parentZenithToggle!();
|
||||||
|
record = ex ? widget.recordEX : widget.record;
|
||||||
|
});
|
||||||
|
}, child: Text(ex ? "Switch to normal" : "Switch to Expert")),
|
||||||
|
Wrap(
|
||||||
|
alignment: WrapAlignment.center,
|
||||||
|
crossAxisAlignment: WrapCrossAlignment.center,
|
||||||
|
spacing: 20,
|
||||||
|
children: [
|
||||||
|
StatCellNum(playerStat: record!.aggregateStats.apm, playerStatLabel: t.statCellNum.apm, fractionDigits: 2, isScreenBig: bigScreen, higherIsBetter: true, smallDecimal: true),
|
||||||
|
StatCellNum(playerStat: record!.aggregateStats.pps, playerStatLabel: t.statCellNum.pps, fractionDigits: 2, isScreenBig: bigScreen, higherIsBetter: true, smallDecimal: false),
|
||||||
|
StatCellNum(playerStat: record!.aggregateStats.vs, playerStatLabel: t.statCellNum.vs, fractionDigits: 2, isScreenBig: bigScreen, higherIsBetter: true, smallDecimal: true),
|
||||||
|
StatCellNum(playerStat: record!.stats.kills, playerStatLabel: "Kills", isScreenBig: bigScreen, higherIsBetter: true),
|
||||||
|
StatCellNum(playerStat: record!.stats.cps, playerStatLabel: "CPS\n(Peak: ${f2.format(record!.stats.zenith!.peakrank)})", fractionDigits: 2, isScreenBig: bigScreen, higherIsBetter: true)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
FinesseThingy(record?.stats.finesse, record?.stats.finessePercentage),
|
||||||
|
LineclearsThingy(record!.stats.clears, record!.stats.lines, record!.stats.holds, record!.stats.tSpins),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 8.0),
|
||||||
|
child: SizedBox(
|
||||||
|
width: 300,
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Text("Total time: ${getMoreNormalTime(record!.stats.finalTime)}", style: const TextStyle(color: Colors.white, fontFamily: "Eurostile Round Extended"), textAlign: TextAlign.center),
|
||||||
|
Table(
|
||||||
|
columnWidths: const {
|
||||||
|
0: FixedColumnWidth(36)
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
const TableRow(
|
||||||
|
children: [
|
||||||
|
Text("Floor"),
|
||||||
|
Text("Split", textAlign: TextAlign.right),
|
||||||
|
Text("Total", textAlign: TextAlign.right),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
for (int i = 0; i < record!.stats.zenith!.splits.length; i++) TableRow(
|
||||||
|
children: [
|
||||||
|
Text((i+1).toString()),
|
||||||
|
Text(record!.stats.zenith!.splits[i] != Duration.zero ? getMoreNormalTime(record!.stats.zenith!.splits[i]-(i-1 != -1 ? record!.stats.zenith!.splits[i-1] : Duration.zero)) : "--:--.---", textAlign: TextAlign.right),
|
||||||
|
Text(record!.stats.zenith!.splits[i] != Duration.zero ? getMoreNormalTime(record!.stats.zenith!.splits[i]) : "--:--.---", textAlign: TextAlign.right),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
Text(t.nerdStats, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.fromLTRB(0, 40, 0, 0),
|
||||||
|
child: Wrap(
|
||||||
|
direction: Axis.horizontal,
|
||||||
|
alignment: WrapAlignment.center,
|
||||||
|
spacing: 35,
|
||||||
|
crossAxisAlignment: WrapCrossAlignment.start,
|
||||||
|
//clipBehavior: Clip.hardEdge,
|
||||||
children: [
|
children: [
|
||||||
Text("Total time: ${getMoreNormalTime(record!.stats.finalTime)}", style: const TextStyle(color: Colors.white, fontFamily: "Eurostile Round Extended"), textAlign: TextAlign.center),
|
GaugetNum(playerStat: record!.aggregateStats.nerdStats.app, playerStatLabel: t.statCellNum.app, higherIsBetter: true, minimum: 0, maximum: 1, ranges: [
|
||||||
Table(
|
GaugeRange(startValue: 0, endValue: 0.2, color: Colors.red),
|
||||||
children: [
|
GaugeRange(startValue: 0.2, endValue: 0.4, color: Colors.yellow),
|
||||||
TableRow(
|
GaugeRange(startValue: 0.4, endValue: 0.6, color: Colors.green),
|
||||||
children: [
|
GaugeRange(startValue: 0.6, endValue: 0.8, color: Colors.blue),
|
||||||
Text("Floor"),
|
GaugeRange(startValue: 0.8, endValue: 1, color: Colors.purple),
|
||||||
Text("Split"),
|
], alertWidgets: [
|
||||||
Text("Total"),
|
Text(t.statCellNum.appDescription),
|
||||||
]
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.app}")
|
||||||
),
|
]),
|
||||||
for (int i = 0; i < record!.stats.zenith!.splits.length; i++) TableRow(
|
GaugetNum(playerStat: record!.aggregateStats.nerdStats.vsapm, playerStatLabel: "VS / APM", higherIsBetter: true, minimum: 1.8, maximum: 2.4, ranges: [
|
||||||
children: [
|
GaugeRange(startValue: 1.8, endValue: 2.0, color: Colors.green),
|
||||||
Text((i+1).toString()),
|
GaugeRange(startValue: 2.0, endValue: 2.2, color: Colors.blue),
|
||||||
Text(record!.stats.zenith!.splits[i] != Duration.zero ? getMoreNormalTime(record!.stats.zenith!.splits[i]-(i-1 != -1 ? record!.stats.zenith!.splits[i-1] : Duration.zero)) : "--:--.---"),
|
GaugeRange(startValue: 2.2, endValue: 2.4, color: Colors.purple),
|
||||||
Text(record!.stats.zenith!.splits[i] != Duration.zero ? getMoreNormalTime(record!.stats.zenith!.splits[i]) : "--:--.---"),
|
], alertWidgets: [
|
||||||
]
|
Text(t.statCellNum.vsapmDescription),
|
||||||
)
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.vsapm}")
|
||||||
],
|
])
|
||||||
),
|
]),
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
Padding(
|
||||||
Column(
|
padding: const EdgeInsets.fromLTRB(8, 0, 8, 0),
|
||||||
children: [
|
child: Wrap(
|
||||||
Text(t.nerdStats, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.fromLTRB(0, 40, 0, 0),
|
|
||||||
child: Wrap(
|
|
||||||
direction: Axis.horizontal,
|
direction: Axis.horizontal,
|
||||||
alignment: WrapAlignment.center,
|
alignment: WrapAlignment.center,
|
||||||
spacing: 35,
|
spacing: 25,
|
||||||
crossAxisAlignment: WrapCrossAlignment.start,
|
crossAxisAlignment: WrapCrossAlignment.start,
|
||||||
clipBehavior: Clip.hardEdge,
|
//clipBehavior: Clip.hardEdge,
|
||||||
children: [
|
children: [
|
||||||
GaugetNum(playerStat: record!.aggregateStats.nerdStats.app, playerStatLabel: t.statCellNum.app, higherIsBetter: true, minimum: 0, maximum: 1, ranges: [
|
StatCellNum(playerStat: record!.aggregateStats.nerdStats.dss, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.dss,
|
||||||
GaugeRange(startValue: 0, endValue: 0.2, color: Colors.red),
|
alertWidgets: [Text(t.statCellNum.dssDescription),
|
||||||
GaugeRange(startValue: 0.2, endValue: 0.4, color: Colors.yellow),
|
Text("${t.formula}: (VS / 100) - (APM / 60)"),
|
||||||
GaugeRange(startValue: 0.4, endValue: 0.6, color: Colors.green),
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.dss}"),],
|
||||||
GaugeRange(startValue: 0.6, endValue: 0.8, color: Colors.blue),
|
okText: t.popupActions.ok,
|
||||||
GaugeRange(startValue: 0.8, endValue: 1, color: Colors.purple),
|
higherIsBetter: true,),
|
||||||
], alertWidgets: [
|
StatCellNum(playerStat: record!.aggregateStats.nerdStats.dsp, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.dsp,
|
||||||
Text(t.statCellNum.appDescription),
|
alertWidgets: [Text(t.statCellNum.dspDescription),
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.app}")
|
Text("${t.formula}: DS/S / PPS"),
|
||||||
]),
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.dsp}"),],
|
||||||
GaugetNum(playerStat: record!.aggregateStats.nerdStats.vsapm, playerStatLabel: "VS / APM", higherIsBetter: true, minimum: 1.8, maximum: 2.4, ranges: [
|
okText: t.popupActions.ok,
|
||||||
GaugeRange(startValue: 1.8, endValue: 2.0, color: Colors.green),
|
higherIsBetter: true),
|
||||||
GaugeRange(startValue: 2.0, endValue: 2.2, color: Colors.blue),
|
StatCellNum(playerStat: record!.aggregateStats.nerdStats.appdsp, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.appdsp,
|
||||||
GaugeRange(startValue: 2.2, endValue: 2.4, color: Colors.purple),
|
alertWidgets: [Text(t.statCellNum.appdspDescription),
|
||||||
], alertWidgets: [
|
Text("${t.formula}: APP + DS/P"),
|
||||||
Text(t.statCellNum.vsapmDescription),
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.appdsp}"),],
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.vsapm}")
|
okText: t.popupActions.ok,
|
||||||
])
|
higherIsBetter: true),
|
||||||
]),
|
StatCellNum(playerStat: record!.aggregateStats.nerdStats.cheese, isScreenBig: bigScreen, fractionDigits: 2, playerStatLabel: t.statCellNum.cheese,
|
||||||
),
|
alertWidgets: [Text(t.statCellNum.cheeseDescription),
|
||||||
Padding(
|
Text("${t.formula}: (DS/P * 150) + ((VS/APM - 2) * 50) + (0.6 - APP) * 125"),
|
||||||
padding: const EdgeInsets.fromLTRB(8, 0, 8, 0),
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.cheese}"),],
|
||||||
child: Wrap(
|
okText: t.popupActions.ok,
|
||||||
direction: Axis.horizontal,
|
higherIsBetter: false),
|
||||||
alignment: WrapAlignment.center,
|
StatCellNum(playerStat: record!.aggregateStats.nerdStats.gbe, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.gbe,
|
||||||
spacing: 25,
|
alertWidgets: [Text(t.statCellNum.gbeDescription),
|
||||||
crossAxisAlignment: WrapCrossAlignment.start,
|
Text("${t.formula}: APP * DS/P * 2"),
|
||||||
clipBehavior: Clip.hardEdge,
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.gbe}"),],
|
||||||
children: [
|
okText: t.popupActions.ok,
|
||||||
StatCellNum(playerStat: record!.aggregateStats.nerdStats.dss, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.dss,
|
higherIsBetter: true),
|
||||||
alertWidgets: [Text(t.statCellNum.dssDescription),
|
StatCellNum(playerStat: record!.aggregateStats.nerdStats.nyaapp, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.nyaapp,
|
||||||
Text("${t.formula}: (VS / 100) - (APM / 60)"),
|
alertWidgets: [Text(t.statCellNum.nyaappDescription),
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.dss}"),],
|
Text("${t.formula}: APP - 5 * tan(radians((Cheese Index / -30) + 1))"),
|
||||||
okText: t.popupActions.ok,
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.nyaapp}")],
|
||||||
higherIsBetter: true,),
|
okText: t.popupActions.ok,
|
||||||
StatCellNum(playerStat: record!.aggregateStats.nerdStats.dsp, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.dsp,
|
higherIsBetter: true),
|
||||||
alertWidgets: [Text(t.statCellNum.dspDescription),
|
StatCellNum(playerStat: record!.aggregateStats.nerdStats.area, isScreenBig: bigScreen, fractionDigits: 1, playerStatLabel: t.statCellNum.area,
|
||||||
Text("${t.formula}: DS/S / PPS"),
|
alertWidgets: [Text(t.statCellNum.areaDescription),
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.dsp}"),],
|
Text("${t.formula}: APM * 1 + PPS * 45 + VS * 0.444 + APP * 185 + DS/S * 175 + DS/P * 450 + Garbage Effi * 315"),
|
||||||
okText: t.popupActions.ok,
|
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.area}"),],
|
||||||
higherIsBetter: true),
|
okText: t.popupActions.ok,
|
||||||
StatCellNum(playerStat: record!.aggregateStats.nerdStats.appdsp, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.appdsp,
|
higherIsBetter: true)
|
||||||
alertWidgets: [Text(t.statCellNum.appdspDescription),
|
]),
|
||||||
Text("${t.formula}: APP + DS/P"),
|
)
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.appdsp}"),],
|
],
|
||||||
okText: t.popupActions.ok,
|
),
|
||||||
higherIsBetter: true),
|
Padding(
|
||||||
StatCellNum(playerStat: record!.aggregateStats.nerdStats.cheese, isScreenBig: bigScreen, fractionDigits: 2, playerStatLabel: t.statCellNum.cheese,
|
padding: const EdgeInsets.only(top: 16.0),
|
||||||
alertWidgets: [Text(t.statCellNum.cheeseDescription),
|
child: Graphs(record!.aggregateStats.apm, record!.aggregateStats.pps, record!.aggregateStats.vs, record!.aggregateStats.nerdStats, record!.aggregateStats.playstyle),
|
||||||
Text("${t.formula}: (DS/P * 150) + ((VS/APM - 2) * 50) + (0.6 - APP) * 125"),
|
)
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.cheese}"),],
|
],
|
||||||
okText: t.popupActions.ok,
|
)
|
||||||
higherIsBetter: false),
|
|
||||||
StatCellNum(playerStat: record!.aggregateStats.nerdStats.gbe, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.gbe,
|
|
||||||
alertWidgets: [Text(t.statCellNum.gbeDescription),
|
|
||||||
Text("${t.formula}: APP * DS/P * 2"),
|
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.gbe}"),],
|
|
||||||
okText: t.popupActions.ok,
|
|
||||||
higherIsBetter: true),
|
|
||||||
StatCellNum(playerStat: record!.aggregateStats.nerdStats.nyaapp, isScreenBig: bigScreen, fractionDigits: 3, playerStatLabel: t.statCellNum.nyaapp,
|
|
||||||
alertWidgets: [Text(t.statCellNum.nyaappDescription),
|
|
||||||
Text("${t.formula}: APP - 5 * tan(radians((Cheese Index / -30) + 1))"),
|
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.nyaapp}")],
|
|
||||||
okText: t.popupActions.ok,
|
|
||||||
higherIsBetter: true),
|
|
||||||
StatCellNum(playerStat: record!.aggregateStats.nerdStats.area, isScreenBig: bigScreen, fractionDigits: 1, playerStatLabel: t.statCellNum.area,
|
|
||||||
alertWidgets: [Text(t.statCellNum.areaDescription),
|
|
||||||
Text("${t.formula}: APM * 1 + PPS * 45 + VS * 0.444 + APP * 185 + DS/S * 175 + DS/P * 450 + Garbage Effi * 315"),
|
|
||||||
Text("${t.exactValue}: ${record!.aggregateStats.nerdStats.area}"),],
|
|
||||||
okText: t.popupActions.ok,
|
|
||||||
higherIsBetter: true)
|
|
||||||
]),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 16.0),
|
|
||||||
child: Graphs(record!.aggregateStats.apm, record!.aggregateStats.pps, record!.aggregateStats.vs, record!.aggregateStats.nerdStats, record!.aggregateStats.playstyle),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
)
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
216
pubspec.lock
216
pubspec.lock
|
@ -21,18 +21,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: archive
|
name: archive
|
||||||
sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d"
|
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.4.10"
|
version: "3.6.1"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: args
|
name: args
|
||||||
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.2"
|
version: "2.5.0"
|
||||||
async:
|
async:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -101,10 +101,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: coverage
|
name: coverage
|
||||||
sha256: "8acabb8306b57a409bf4c83522065672ee13179297a6bb0cb9ead73948df7c76"
|
sha256: "576aaab8b1abdd452e0f656c3e73da9ead9d7880e15bdc494189d9c1a1baf0db"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.7.2"
|
version: "1.9.0"
|
||||||
cross_file:
|
cross_file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -133,18 +133,18 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: cupertino_icons
|
name: cupertino_icons
|
||||||
sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
|
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.6"
|
version: "1.0.8"
|
||||||
dev_build:
|
dev_build:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: dev_build
|
name: dev_build
|
||||||
sha256: e5d575f3de4b0e5f004e065e1e2d98fa012d634b61b5855216b5698ed7f1e443
|
sha256: f526d1fbe68875f6119ffc333f114dfe6aa93ad04439276d53968f7977cc410e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.16.4+3"
|
version: "1.0.0+11"
|
||||||
equatable:
|
equatable:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -197,18 +197,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file_selector_android
|
name: file_selector_android
|
||||||
sha256: "1cd66575f063b689e041aec836905ba7be18d76c9f0634d0d75daec825f67095"
|
sha256: d1e8655c1a4850a900a0cfaed55fdd273881d53a4bb78e4736dc170a0b17db78
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.0+7"
|
version: "0.5.1+5"
|
||||||
file_selector_ios:
|
file_selector_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file_selector_ios
|
name: file_selector_ios
|
||||||
sha256: b015154e6d9fddbc4d08916794df170b44531798c8dd709a026df162d07ad81d
|
sha256: "38ebf91ecbcfa89a9639a0854ccaed8ab370c75678938eebca7d34184296f0bb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.1+8"
|
version: "0.5.3"
|
||||||
file_selector_linux:
|
file_selector_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -221,10 +221,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file_selector_macos
|
name: file_selector_macos
|
||||||
sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6
|
sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.9.3+3"
|
version: "0.9.4"
|
||||||
file_selector_platform_interface:
|
file_selector_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -245,10 +245,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file_selector_windows
|
name: file_selector_windows
|
||||||
sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0
|
sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.9.3+1"
|
version: "0.9.3+2"
|
||||||
fl_chart:
|
fl_chart:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -266,10 +266,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_colorpicker
|
name: flutter_colorpicker
|
||||||
sha256: "458a6ed8ea480eb16ff892aedb4b7092b2804affd7e046591fb03127e8d8ef8b"
|
sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.3"
|
version: "1.1.0"
|
||||||
flutter_launcher_icons:
|
flutter_launcher_icons:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -282,10 +282,10 @@ packages:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: flutter_lints
|
name: flutter_lints
|
||||||
sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7
|
sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.1"
|
version: "3.0.2"
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -295,18 +295,18 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_markdown
|
name: flutter_markdown
|
||||||
sha256: "87e11b9df25a42e2db315b8b7a51fae8e66f57a4b2f50ec4b822d0fa155e6b52"
|
sha256: "04c4722cc36ec5af38acc38ece70d22d3c2123c61305d555750a091517bbe504"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.22"
|
version: "0.6.23"
|
||||||
flutter_plugin_android_lifecycle:
|
flutter_plugin_android_lifecycle:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_plugin_android_lifecycle
|
name: flutter_plugin_android_lifecycle
|
||||||
sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da
|
sha256: "9d98bd47ef9d34e803d438f17fd32b116d31009f534a6fa5ce3a1167f189a6de"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.17"
|
version: "2.0.21"
|
||||||
flutter_svg:
|
flutter_svg:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -329,10 +329,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: frontend_server_client
|
name: frontend_server_client
|
||||||
sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
|
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.0"
|
version: "4.0.0"
|
||||||
glob:
|
glob:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -345,10 +345,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: go_router
|
name: go_router
|
||||||
sha256: "7ecb2f391edbca5473db591b48555a8912dde60edd0fb3013bd6743033b2d3f8"
|
sha256: b465e99ce64ba75e61c8c0ce3d87b66d8ac07f0b35d0a7e0263fcfc10f99e836
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "13.2.1"
|
version: "13.2.5"
|
||||||
http:
|
http:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -377,18 +377,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image
|
name: image
|
||||||
sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e"
|
sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.7"
|
version: "4.2.0"
|
||||||
intl:
|
intl:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: intl
|
name: intl
|
||||||
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
|
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.18.1"
|
version: "0.19.0"
|
||||||
io:
|
io:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -401,10 +401,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: js
|
name: js
|
||||||
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
|
sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.7"
|
version: "0.7.1"
|
||||||
json2yaml:
|
json2yaml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -417,34 +417,34 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: json_annotation
|
name: json_annotation
|
||||||
sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
|
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.8.1"
|
version: "4.9.0"
|
||||||
leak_tracker:
|
leak_tracker:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
|
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.0"
|
version: "10.0.4"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
|
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "3.0.3"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_testing
|
name: leak_tracker_testing
|
||||||
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
|
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "3.0.1"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -489,10 +489,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
|
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.0"
|
version: "1.12.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -553,26 +553,26 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: path_provider
|
name: path_provider
|
||||||
sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
|
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.4"
|
||||||
path_provider_android:
|
path_provider_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_android
|
name: path_provider_android
|
||||||
sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668"
|
sha256: "490539678396d4c3c0b06efdaab75ae60675c3e0c66f72bc04c2e2c1e0e2abeb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.2"
|
version: "2.2.9"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_foundation
|
name: path_provider_foundation
|
||||||
sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
|
sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.0"
|
||||||
path_provider_linux:
|
path_provider_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -593,10 +593,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_windows
|
name: path_provider_windows
|
||||||
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
|
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.1"
|
version: "2.3.0"
|
||||||
petitparser:
|
petitparser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -609,10 +609,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: platform
|
name: platform
|
||||||
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
|
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.4"
|
version: "3.1.5"
|
||||||
plugin_platform_interface:
|
plugin_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -621,14 +621,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.8"
|
version: "2.1.8"
|
||||||
pointycastle:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: pointycastle
|
|
||||||
sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.7.4"
|
|
||||||
pool:
|
pool:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -641,10 +633,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: process_run
|
name: process_run
|
||||||
sha256: "8d9c6198b98fbbfb511edd42e7364e24d85c163e47398919871b952dc86a423e"
|
sha256: c917dfb5f7afad4c7485bc00a4df038621248fce046105020cea276d1a87c820
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.14.2"
|
version: "1.1.0"
|
||||||
pub_semver:
|
pub_semver:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -665,42 +657,42 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: shared_preferences
|
name: shared_preferences
|
||||||
sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
|
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.2"
|
version: "2.2.3"
|
||||||
shared_preferences_android:
|
shared_preferences_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_android
|
name: shared_preferences_android
|
||||||
sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
|
sha256: "041be4d9d2dc6079cf342bc8b761b03787e3b71192d658220a56cac9c04a0294"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.1"
|
version: "2.3.0"
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_foundation
|
name: shared_preferences_foundation
|
||||||
sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
|
sha256: "671e7a931f55a08aa45be2a13fe7247f2a41237897df434b30d2012388191833"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.5"
|
version: "2.5.0"
|
||||||
shared_preferences_linux:
|
shared_preferences_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_linux
|
name: shared_preferences_linux
|
||||||
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
|
sha256: "2ba0510d3017f91655b7543e9ee46d48619de2a2af38e5c790423f7007c7ccc1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.0"
|
||||||
shared_preferences_platform_interface:
|
shared_preferences_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_platform_interface
|
name: shared_preferences_platform_interface
|
||||||
sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
|
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.1"
|
||||||
shared_preferences_web:
|
shared_preferences_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -713,10 +705,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_windows
|
name: shared_preferences_windows
|
||||||
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
|
sha256: "398084b47b7f92110683cac45c6dc4aae853db47e470e5ddcd52cab7f7196ab2"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.0"
|
||||||
shelf:
|
shelf:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -758,18 +750,18 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: slang
|
name: slang
|
||||||
sha256: "5e08ac915ac27a3508863f37734280d30c3713d56746cd2e4a5da77413da4b95"
|
sha256: f68f6d6709890f85efabfb0318e9d694be2ebdd333e57fe5cb50eee449e4e3ab
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.30.1"
|
version: "3.31.1"
|
||||||
slang_flutter:
|
slang_flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: slang_flutter
|
name: slang_flutter
|
||||||
sha256: "9ee040b0d364d3a4d692e4af536acff6ef513870689403494ebc6d59b0dccea6"
|
sha256: f8400292be49c11697d94af58d7f7d054c91af759f41ffe71e4e5413871ffc62
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.30.0"
|
version: "3.31.0"
|
||||||
source_map_stack_trace:
|
source_map_stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -798,10 +790,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: sqflite
|
name: sqflite
|
||||||
sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6
|
sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.3.3+1"
|
||||||
sqflite_common:
|
sqflite_common:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -830,18 +822,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqlite3
|
name: sqlite3
|
||||||
sha256: "072128763f1547e3e9b4735ce846bfd226d68019ccda54db4cd427b12dfdedc9"
|
sha256: "1abbeb84bf2b1a10e5e1138c913123c8aa9d83cd64e5f9a0dd847b3c83063202"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.4.2"
|
||||||
sqlite3_flutter_libs:
|
sqlite3_flutter_libs:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: sqlite3_flutter_libs
|
name: sqlite3_flutter_libs
|
||||||
sha256: d6c31c8511c441d1f12f20b607343df1afe4eddf24a1cf85021677c8eea26060
|
sha256: "62bbb4073edbcdf53f40c80775f33eea01d301b7b81417e5b3fb7395416258c1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.20"
|
version: "0.5.24"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -910,26 +902,26 @@ packages:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: test
|
name: test
|
||||||
sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f
|
sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.24.9"
|
version: "1.25.2"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.1"
|
version: "0.7.0"
|
||||||
test_core:
|
test_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_core
|
name: test_core
|
||||||
sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a
|
sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.9"
|
version: "0.6.0"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -942,26 +934,26 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: url_launcher
|
name: url_launcher
|
||||||
sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e"
|
sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.2.5"
|
version: "6.3.0"
|
||||||
url_launcher_android:
|
url_launcher_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_android
|
name: url_launcher_android
|
||||||
sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745
|
sha256: "94d8ad05f44c6d4e2ffe5567ab4d741b82d62e3c8e288cc1fcea45965edf47c9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.0"
|
version: "6.3.8"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_ios
|
name: url_launcher_ios
|
||||||
sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5"
|
sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.2.5"
|
version: "6.3.1"
|
||||||
url_launcher_linux:
|
url_launcher_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -974,10 +966,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_macos
|
name: url_launcher_macos
|
||||||
sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234
|
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
version: "3.2.0"
|
||||||
url_launcher_platform_interface:
|
url_launcher_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -998,10 +990,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_windows
|
name: url_launcher_windows
|
||||||
sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
|
sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.1"
|
version: "3.1.2"
|
||||||
vector_graphics:
|
vector_graphics:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1038,10 +1030,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
|
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "13.0.0"
|
version: "14.2.1"
|
||||||
watcher:
|
watcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1078,18 +1070,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480"
|
sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.3.0"
|
version: "5.5.3"
|
||||||
window_manager:
|
window_manager:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: window_manager
|
name: window_manager
|
||||||
sha256: b3c895bdf936c77b83c5254bec2e6b3f066710c1f89c38b20b8acc382b525494
|
sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.8"
|
version: "0.3.9"
|
||||||
xdg_directories:
|
xdg_directories:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1115,5 +1107,5 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "3.1.2"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.3.0 <4.0.0"
|
dart: ">=3.4.0 <4.0.0"
|
||||||
flutter: ">=3.19.0"
|
flutter: ">=3.22.0"
|
||||||
|
|
|
@ -30,7 +30,7 @@ dependencies:
|
||||||
fl_chart: ^0.66.0
|
fl_chart: ^0.66.0
|
||||||
package_info_plus: ^5.0.1
|
package_info_plus: ^5.0.1
|
||||||
shared_preferences: ^2.1.1
|
shared_preferences: ^2.1.1
|
||||||
intl: ^0.18.0
|
intl: ^0.19.0
|
||||||
syncfusion_flutter_gauges: ^24.1.41
|
syncfusion_flutter_gauges: ^24.1.41
|
||||||
file_selector: ^1.0.1
|
file_selector: ^1.0.1
|
||||||
file_picker: ^6.1.1
|
file_picker: ^6.1.1
|
||||||
|
|
Loading…
Reference in New Issue