From 51e8362859953bfe3e69a7f8825275343d2af72b Mon Sep 17 00:00:00 2001 From: dan63047 Date: Mon, 9 Oct 2023 21:48:50 +0300 Subject: [PATCH] Window titles for views I will check everything tomorrow (and tomorrow it will be released i guess) --- README.md | 7 +++++-- lib/main.dart | 12 +++++++++--- lib/services/tetrio_crud.dart | 5 +++-- lib/views/calc_view.dart | 8 ++++++++ lib/views/compare_view.dart | 9 ++++++++- lib/views/main_view.dart | 22 ++++------------------ lib/views/mathes_view.dart | 19 +++++++++++++++++++ lib/views/rank_averages_view.dart | 9 ++++++++- lib/views/ranks_averages_view.dart | 21 +++++++++++++++++---- lib/views/settings_view.dart | 26 +++++++++++++------------- lib/views/state_view.dart | 15 +++++++++++++++ lib/views/states_view.dart | 19 +++++++++++++++++++ lib/views/tl_leaderboard_view.dart | 19 ++++++++++++++++++- lib/views/tl_match_view.dart | 8 ++++++++ lib/views/tracked_players_view.dart | 18 ++++++++++++++++++ 15 files changed, 172 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 7d7b11a..975959b 100644 --- a/README.md +++ b/README.md @@ -18,5 +18,8 @@ You can [download an app](https://github.com/dan63047/TetraStats/releases), or [ # Special thanks - **kerrmunism** — formulas -- **p1nkl0bst3r** — providing players history -- **osk** and his team — TETR.IO \ No newline at end of file +- **p1nkl0bst3r** — providing players history and peak TR +- **osk** and his team — TETR.IO + +## Legal note +I do NOT own any assets located in `/res/*`, excluding app icon (`/res/icons/app.png`) and localization (`/res/i18n/*`), which is distributed under GNU license (as well, as this software) \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index e9e55fd..8b0aab5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:window_manager/window_manager.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; @@ -13,6 +14,8 @@ import 'package:tetra_stats/views/settings_view.dart'; import 'package:tetra_stats/views/tracked_players_view.dart'; import 'package:tetra_stats/views/calc_view.dart'; +late final PackageInfo packageInfo; + void main() async { if (kIsWeb) { sqfliteFfiInit(); @@ -22,10 +25,13 @@ void main() async { databaseFactory = databaseFactoryFfi; } WidgetsFlutterBinding.ensureInitialized(); - await WindowManager.instance.ensureInitialized(); - windowManager.waitUntilReadyToShow().then((_) async { + if (!Platform.isAndroid && !Platform.isIOS){ + await WindowManager.instance.ensureInitialized(); + windowManager.waitUntilReadyToShow().then((_) async { await windowManager.setTitle('Tetra Stats'); - }); + }); + } + packageInfo = await PackageInfo.fromPlatform(); prefs = await SharedPreferences.getInstance(); String? locale = prefs.getString("locale"); if (locale == null){ diff --git a/lib/services/tetrio_crud.dart b/lib/services/tetrio_crud.dart index ffe29ec..8827dac 100644 --- a/lib/services/tetrio_crud.dart +++ b/lib/services/tetrio_crud.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:developer' as developer; +import 'package:tetra_stats/main.dart' show packageInfo; import 'package:flutter/foundation.dart'; import 'package:tetra_stats/services/custom_http_client.dart'; import 'package:http/http.dart' as http; @@ -56,7 +57,7 @@ class TetrioService extends DB { final Map> _newsCache = {}; final Map> _topTRcache = {}; final Map _tlStreamsCache = {}; // i'm trying to respect oskware api It should look something like {"cached_until": TetrioPlayer} - final client = UserAgentClient("ebany u rot yatogo kazino blyat' (Tetra Stats v1.2.4 dev build)", http.Client()); + final client = UserAgentClient("package info thingy: ${packageInfo.version} (Tetra Stats v1.2.4 dev build)", http.Client()); static final TetrioService _shared = TetrioService._sharedInstance(); factory TetrioService() => _shared; late final StreamController>> _tetrioStreamController; @@ -122,7 +123,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLHistory", "user": id}); + url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "PeakTR", "user": id}); } else { url = Uri.https('api.p1nkl0bst3r.xyz', 'toptr/$id'); } diff --git a/lib/views/calc_view.dart b/lib/views/calc_view.dart index ba2cb0d..854263e 100644 --- a/lib/views/calc_view.dart +++ b/lib/views/calc_view.dart @@ -1,8 +1,10 @@ +import 'dart:io'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; +import 'package:window_manager/window_manager.dart'; double? apm; double? pps; @@ -11,6 +13,7 @@ NerdStats? nerdStats; EstTr? estTr; Playstyle? playstyle; final NumberFormat f2 = NumberFormat.decimalPatternDigits(locale: LocaleSettings.currentLocale.languageCode, decimalDigits: 2); +late String oldWindowTitle; class CalcView extends StatefulWidget { const CalcView({Key? key}) : super(key: key); @@ -28,11 +31,16 @@ class CalcState extends State { @override void initState() { _scrollController = ScrollController(); + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${t.statsCalc}"); + } super.initState(); } @override void dispose() { + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/compare_view.dart b/lib/views/compare_view.dart index ae889a7..e1d05e8 100644 --- a/lib/views/compare_view.dart +++ b/lib/views/compare_view.dart @@ -1,3 +1,4 @@ +import 'dart:io'; import 'dart:math'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/services/tetrio_crud.dart'; +import 'package:window_manager/window_manager.dart'; enum Mode{ player, @@ -18,8 +20,8 @@ Mode redSideMode = Mode.player; List theRedSide = [null, null, null]; final TetrioService teto = TetrioService(); final DateFormat dateFormat = DateFormat.yMd(LocaleSettings.currentLocale.languageCode).add_Hm(); -// ignore: unnecessary_string_escapes var numbersReg = RegExp(r'\d+(\.\d*)*'); +late String oldWindowTitle; class CompareView extends StatefulWidget { final List greenSide; @@ -42,6 +44,9 @@ class CompareState extends State { fetchGreenSide(widget.greenSide[0].userId); if (widget.redSide[0] != null) fetchRedSide(widget.redSide[0].userId); _scrollController = ScrollController(); + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + } super.initState(); } @@ -51,6 +56,7 @@ class CompareState extends State { greenSideMode = Mode.player; theRedSide = [null, null, null]; redSideMode = Mode.player; + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } @@ -253,6 +259,7 @@ class CompareState extends State { titleRedSide = t.averageXrank(rankLetter: theRedSide[2].rank.toUpperCase()); break; } + windowManager.setTitle("Tetra Stats: $titleGreenSide ${t.vs} $titleRedSide"); return Scaffold( appBar: AppBar(title: Text("$titleGreenSide ${t.vs} $titleRedSide")), backgroundColor: Colors.black, diff --git a/lib/views/main_view.dart b/lib/views/main_view.dart index c180daf..476e1bc 100644 --- a/lib/views/main_view.dart +++ b/lib/views/main_view.dart @@ -29,9 +29,6 @@ late SharedPreferences prefs; var chartsData = >>[]; List historyShortTitles = ["TR", "Glicko", "RD", "APM", "PPS", "VS", "APP", "DS/S", "DS/P", "APP + DS/P", "VS/APM", "Cheese", "GbE", "wAPP", "Area", "eTR", "±eTR"]; int chartsIndex = 0; -const allowedHeightForPlayerIdInPixels = 40.0; -const allowedHeightForPlayerBioInPixels = 30.0; -const givenTextHeightByScreenPercentage = 0.3; final NumberFormat timeInSec = NumberFormat("#,###.###s."); final NumberFormat f2 = NumberFormat.decimalPatternDigits(locale: LocaleSettings.currentLocale.languageCode, decimalDigits: 2); final NumberFormat secs = NumberFormat("00.###"); @@ -138,7 +135,7 @@ class _MainState extends State with SingleTickerProviderStateMixin { } _searchFor = me.userId; setState((){_titleNickname = me.username;}); - await windowManager.setTitle('Tetra Stats: $_titleNickname'); //TODO: Change window title on every view + if (!Platform.isAndroid && !Platform.isIOS) await windowManager.setTitle(widget.title); late List requests; late TetraLeagueAlphaStream tlStream; late Map records; @@ -400,19 +397,8 @@ class _MainState extends State with SingleTickerProviderStateMixin { return Center(child: Text(errText, style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 42, fontWeight: FontWeight.bold), textAlign: TextAlign.center)); } break; - default: - return const Center( - child: Text('default case of FutureBuilder', - style: TextStyle( - fontFamily: "Eurostile Round Extended", - fontSize: 42), - textAlign: TextAlign.center)); } - return const Center( - child: Text('end of FutureBuilder', - style: TextStyle( - fontFamily: "Eurostile Round Extended", fontSize: 42), - textAlign: TextAlign.center)); + return const Center(child: Text('default case of FutureBuilder', style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 42), textAlign: TextAlign.center)); }, ), ), @@ -1089,14 +1075,14 @@ class _OtherThingy extends StatelessWidget { padding: const EdgeInsets.fromLTRB(0, 0, 0, 48), child: Column( children: [ - Text(t.distinguishment, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)), + Text(t.distinguishment, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28), textAlign: TextAlign.center), RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children: getDistinguishmentSetOfWidgets(distinguishment!.header!), ), ), - Text(distinguishment!.footer!, style: const TextStyle(fontSize: 18)), + Text(distinguishment!.footer!, style: const TextStyle(fontSize: 18), textAlign: TextAlign.center), ], ), ), diff --git a/lib/views/mathes_view.dart b/lib/views/mathes_view.dart index 57f9a1a..47ccf59 100644 --- a/lib/views/mathes_view.dart +++ b/lib/views/mathes_view.dart @@ -1,11 +1,14 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/services/tetrio_crud.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'; final TetrioService teto = TetrioService(); final NumberFormat f2 = NumberFormat.decimalPatternDigits(locale: LocaleSettings.currentLocale.languageCode, decimalDigits: 2); +late String oldWindowTitle; class MatchesView extends StatefulWidget { final String userID; @@ -17,6 +20,22 @@ class MatchesView extends StatefulWidget { } class MatchesState extends State { + + @override + void initState() { + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${t.matchesViewTitle(nickname: widget.username)}"); + } + super.initState(); + } + + @override + void dispose(){ + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + super.dispose(); + } + @override Widget build(BuildContext context) { final t = Translations.of(context); diff --git a/lib/views/rank_averages_view.dart b/lib/views/rank_averages_view.dart index bbcc41f..9f9a175 100644 --- a/lib/views/rank_averages_view.dart +++ b/lib/views/rank_averages_view.dart @@ -1,10 +1,11 @@ +import 'dart:io'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.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/views/main_view.dart' show MainView, f4, f2; +import 'package:window_manager/window_manager.dart'; var chartsShortTitlesDropdowns = [for (MapEntry e in chartsShortTitles.entries) DropdownMenuItem(value: e.key, child: Text(e.value),)]; Stats chartsX = Stats.tr; @@ -14,6 +15,7 @@ Stats sortBy = Stats.tr; bool reversed = false; List itemCountries = [for (MapEntry e in t.countries.entries) DropdownMenuItem(value: e.key, child: Text(e.value))]; String country = ""; +late String oldWindowTitle; class RankView extends StatefulWidget { final List rank; @@ -31,6 +33,10 @@ class RankState extends State with SingleTickerProviderStateMixin { void initState() { _scrollController = ScrollController(); _tabController = TabController(length: 6, vsync: this); + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${widget.rank[1]["everyone"] ? t.everyoneAverages : t.rankAverages(rank: widget.rank[0].rank.toUpperCase())}"); + } super.initState(); } @@ -38,6 +44,7 @@ class RankState extends State with SingleTickerProviderStateMixin { void dispose() { _tabController.dispose(); _scrollController.dispose(); + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/ranks_averages_view.dart b/lib/views/ranks_averages_view.dart index 02a949c..e851d1a 100644 --- a/lib/views/ranks_averages_view.dart +++ b/lib/views/ranks_averages_view.dart @@ -1,8 +1,10 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/views/rank_averages_view.dart'; import 'package:tetra_stats/views/tl_leaderboard_view.dart'; +import 'package:window_manager/window_manager.dart'; class RankAveragesView extends StatefulWidget { const RankAveragesView({Key? key}) : super(key: key); @@ -11,18 +13,29 @@ class RankAveragesView extends StatefulWidget { State createState() => RanksAverages(); } +late String oldWindowTitle; + class RanksAverages extends State { Map> averages = {}; - - @override void initState() { - teto.fetchTLLeaderboard().then((value) {averages = value.averages; setState(() { - });}); + teto.fetchTLLeaderboard().then((value){ + averages = value.averages; + setState(() {}); + }); + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${t.rankAveragesViewTitle}"); + } super.initState(); } + @override + void dispose() { + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + super.dispose(); + } @override Widget build(BuildContext context) { diff --git a/lib/views/settings_view.dart b/lib/views/settings_view.dart index 5e7a61e..219f196 100644 --- a/lib/views/settings_view.dart +++ b/lib/views/settings_view.dart @@ -1,15 +1,18 @@ import 'dart:io'; +import 'package:tetra_stats/main.dart' show packageInfo; import 'package:file_selector/file_selector.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/services/crud_exceptions.dart'; import 'package:tetra_stats/services/tetrio_crud.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:window_manager/window_manager.dart'; + +late String oldWindowTitle; class SettingsView extends StatefulWidget { const SettingsView({Key? key}) : super(key: key); @@ -19,11 +22,6 @@ class SettingsView extends StatefulWidget { } class SettingsState extends State { - PackageInfo _packageInfo = PackageInfo( - appName: "TetraStats", - packageName: "idk man", - version: "some numbers", - buildNumber: "anotherNumber"); late SharedPreferences prefs; final TetrioService teto = TetrioService(); String defaultNickname = "Checking..."; @@ -31,16 +29,18 @@ class SettingsState extends State { @override void initState() { - _initPackageInfo(); + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${t.settings}"); + } _getPreferences(); super.initState(); } - Future _initPackageInfo() async { - final info = await PackageInfo.fromPlatform(); - setState(() { - _packageInfo = info; - }); + @override + void dispose(){ + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + super.dispose(); } Future _launchInBrowser(Uri url) async { @@ -251,7 +251,7 @@ class SettingsState extends State { _launchInBrowser(Uri.https("github.com", "dan63047/TetraStats")); }, title: Text(t.aboutApp), - subtitle: Text(t.aboutAppText(appName: _packageInfo.appName, packageName: _packageInfo.packageName, version: _packageInfo.version, buildNumber: _packageInfo.buildNumber)), + subtitle: Text(t.aboutAppText(appName: packageInfo.appName, packageName: packageInfo.packageName, version: packageInfo.version, buildNumber: packageInfo.buildNumber)), ), ], )), diff --git a/lib/views/state_view.dart b/lib/views/state_view.dart index f7bab8b..35f7892 100644 --- a/lib/views/state_view.dart +++ b/lib/views/state_view.dart @@ -1,9 +1,11 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/widgets/tl_thingy.dart'; import 'package:tetra_stats/widgets/user_thingy.dart'; +import 'package:window_manager/window_manager.dart'; final DateFormat dateFormat = DateFormat.yMMMd(LocaleSettings.currentLocale.languageCode).add_Hms(); @@ -15,15 +17,28 @@ class StateView extends StatefulWidget { State createState() => StateState(); } +late String oldWindowTitle; + class StateState extends State { late ScrollController _scrollController; @override void initState() { _scrollController = ScrollController(); + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${t.stateViewTitle(nickname: widget.state.username.toUpperCase(), date: dateFormat.format(widget.state.state))}"); + } super.initState(); } + @override + void dispose() { + _scrollController.dispose(); + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + super.dispose(); + } + void _justUpdate() { setState(() {}); } diff --git a/lib/views/states_view.dart b/lib/views/states_view.dart index 904f12b..6432f82 100644 --- a/lib/views/states_view.dart +++ b/lib/views/states_view.dart @@ -1,9 +1,11 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/views/mathes_view.dart'; import 'package:tetra_stats/views/state_view.dart'; +import 'package:window_manager/window_manager.dart'; class StatesView extends StatefulWidget { final List states; @@ -13,7 +15,24 @@ class StatesView extends StatefulWidget { State createState() => StatesState(); } +late String oldWindowTitle; + class StatesState extends State { + @override + void initState() { + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${t.statesViewTitle(number: widget.states.length, nickname: widget.states.last.username.toUpperCase())}"); + } + super.initState(); + } + + @override + void dispose() { + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + super.dispose(); + } + @override Widget build(BuildContext context) { final t = Translations.of(context); diff --git a/lib/views/tl_leaderboard_view.dart b/lib/views/tl_leaderboard_view.dart index d19fda3..249aed5 100644 --- a/lib/views/tl_leaderboard_view.dart +++ b/lib/views/tl_leaderboard_view.dart @@ -1,3 +1,4 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; @@ -6,6 +7,7 @@ import 'package:tetra_stats/services/tetrio_crud.dart'; import 'package:tetra_stats/views/main_view.dart'; import 'package:tetra_stats/views/rank_averages_view.dart'; import 'package:tetra_stats/views/ranks_averages_view.dart'; +import 'package:window_manager/window_manager.dart'; final TetrioService teto = TetrioService(); List itemStats = [for (MapEntry e in chartsShortTitles.entries) DropdownMenuItem(value: e.key, child: Text(e.value))]; @@ -13,6 +15,7 @@ Stats sortBy = Stats.tr; bool reversed = false; List itemCountries = [for (MapEntry e in t.countries.entries) DropdownMenuItem(value: e.key, child: Text(e.value))]; String country = ""; +late String oldWindowTitle; class TLLeaderboardView extends StatefulWidget { const TLLeaderboardView({Key? key}) : super(key: key); @@ -21,8 +24,22 @@ class TLLeaderboardView extends StatefulWidget { State createState() => TLLeaderboardState(); } - class TLLeaderboardState extends State { + @override + void initState() { + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${t.tlLeaderboard}"); + } + super.initState(); + } + + @override + void dispose() { + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + super.dispose(); + } + @override Widget build(BuildContext context) { final t = Translations.of(context); diff --git a/lib/views/tl_match_view.dart b/lib/views/tl_match_view.dart index 512241a..4b975e3 100644 --- a/lib/views/tl_match_view.dart +++ b/lib/views/tl_match_view.dart @@ -1,13 +1,16 @@ +import 'dart:io'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; +import 'package:window_manager/window_manager.dart'; final DateFormat dateFormat = DateFormat.yMMMd(LocaleSettings.currentLocale.languageCode).add_Hms(); int roundSelector = -1; // -1 = match averages, otherwise round number-1 List rounds = []; // index zero will be match stats +late String oldWindowTitle; class TlMatchResultView extends StatefulWidget { final TetraLeagueAlphaRecord record; @@ -27,12 +30,17 @@ class TlMatchResultState extends State { _scrollController = ScrollController(); rounds = [DropdownMenuItem(value: -1, child: Text(t.match))]; rounds.addAll([for (int i = 0; i < widget.record.endContext.first.secondaryTracking.length; i++) DropdownMenuItem(value: i, child: Text(t.roundNumber(n: i+1)))]); + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${widget.record.endContext.firstWhere((element) => element.userId == widget.initPlayerId).username.toUpperCase()} ${t.vs} ${widget.record.endContext.firstWhere((element) => element.userId != widget.initPlayerId).username.toUpperCase()} ${t.inTLmatch} ${dateFormat.format(widget.record.timestamp)}"); + } super.initState(); } @override void dispose(){ roundSelector = -1; + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/tracked_players_view.dart b/lib/views/tracked_players_view.dart index ed7ca5d..b0b19ae 100644 --- a/lib/views/tracked_players_view.dart +++ b/lib/views/tracked_players_view.dart @@ -1,11 +1,14 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/services/tetrio_crud.dart'; import 'package:tetra_stats/views/states_view.dart'; +import 'package:window_manager/window_manager.dart'; final TetrioService teto = TetrioService(); +late String oldWindowTitle; class TrackedPlayersView extends StatefulWidget { const TrackedPlayersView({Key? key}) : super(key: key); @@ -15,6 +18,21 @@ class TrackedPlayersView extends StatefulWidget { } class TrackedPlayersState extends State { + @override + void initState() { + if (!Platform.isAndroid && !Platform.isIOS){ + windowManager.getTitle().then((value) => oldWindowTitle = value); + windowManager.setTitle("Tetra Stats: ${t.trackedPlayersViewTitle}"); + } + super.initState(); + } + + @override + void dispose() { + if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + super.dispose(); + } + @override Widget build(BuildContext context) { final t = Translations.of(context);