Skip to content

Commit c8709ee

Browse files
committed
Fix some bugs, add some ui improvements and improve the algorithm for finding the rising star of a team
1 parent cbaabda commit c8709ee

File tree

11 files changed

+87
-82
lines changed

11 files changed

+87
-82
lines changed

jumpers_female.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"age":35,"name":"Philipp","surname":"Aschenwald","country":"at","sex":1,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":72.0,"landingStyle":-1,"jumpsConsistency":-1}},{"age":32,"name":"Daniel","surname":"Huber","country":"at","sex":1,"skills":{"qualityOnSmallerHills":81.24,"qualityOnLargerHills":88.0,"landingStyle":1,"jumpsConsistency":1}},{"age":22,"name":"Kamil","surname":"Stoch","country":"pl","sex":1,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":83.0,"landingStyle":3,"jumpsConsistency":2}},{"age":14,"name":"Stefan","surname":"Kraft","country":"at","sex":1,"skills":{"qualityOnSmallerHills":88.0,"qualityOnLargerHills":95.0,"landingStyle":3,"jumpsConsistency":1}},{"age":21,"name":"Dawid","surname":"Kubacki","country":"pl","sex":1,"skills":{"qualityOnSmallerHills":91.25,"qualityOnLargerHills":81.0,"landingStyle":1,"jumpsConsistency":0}}]
1+
[{"age":35,"name":"Philipp","surname":"Aschenwald","country":"at","sex":1,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":72.0,"landingStyle":-1,"jumpsConsistency":-1}},{"age":32,"name":"Daniel","surname":"Huber","country":"at","sex":1,"skills":{"qualityOnSmallerHills":81.24,"qualityOnLargerHills":88.0,"landingStyle":1,"jumpsConsistency":1}},{"age":37,"name":"Kamil","surname":"Stoch","country":"pl","sex":1,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":83.0,"landingStyle":3,"jumpsConsistency":2}},{"age":31,"name":"Stefan","surname":"Kraft","country":"at","sex":1,"skills":{"qualityOnSmallerHills":88.0,"qualityOnLargerHills":95.0,"landingStyle":3,"jumpsConsistency":1}},{"age":37,"name":"Dawid","surname":"Kubacki","country":"pl","sex":1,"skills":{"qualityOnSmallerHills":91.25,"qualityOnLargerHills":81.0,"landingStyle":1,"jumpsConsistency":0}}]

jumpers_male.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"age":35,"name":"Philipp","surname":"Aschenwald","country":"at","sex":0,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":72.0,"landingStyle":-1,"jumpsConsistency":-1}},{"age":37,"name":"Kamil","surname":"Stoch","country":"pl","sex":0,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":83.0,"landingStyle":3,"jumpsConsistency":2}},{"age":31,"name":"Stefan","surname":"Kraft","country":"at","sex":0,"skills":{"qualityOnSmallerHills":88.0,"qualityOnLargerHills":95.0,"landingStyle":3,"jumpsConsistency":1}},{"age":27,"name":"Andrzej","surname":"Stękała","country":"pl","sex":0,"skills":{"qualityOnSmallerHills":68.0,"qualityOnLargerHills":84.0,"landingStyle":2,"jumpsConsistency":-2}},{"age":32,"name":"Daniel","surname":"Huber","country":"at","sex":0,"skills":{"qualityOnSmallerHills":81.24,"qualityOnLargerHills":88.0,"landingStyle":1,"jumpsConsistency":1}},{"age":37,"name":"Konrad","surname":"Kubacki","country":"pl","sex":0,"skills":{"qualityOnSmallerHills":91.25,"qualityOnLargerHills":81.0,"landingStyle":1,"jumpsConsistency":0}}]
1+
[{"age":35,"name":"Philipp","surname":"Aschenwald","country":"at","sex":0,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":72.0,"landingStyle":-1,"jumpsConsistency":-1}},{"age":31,"name":"Stefan","surname":"Kraft","country":"at","sex":0,"skills":{"qualityOnSmallerHills":88.0,"qualityOnLargerHills":95.0,"landingStyle":3,"jumpsConsistency":1}},{"age":37,"name":"Kamil","surname":"Stoch","country":"pl","sex":0,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":83.0,"landingStyle":3,"jumpsConsistency":2}},{"age":27,"name":"Andrzej","surname":"Stękała","country":"pl","sex":0,"skills":{"qualityOnSmallerHills":68.0,"qualityOnLargerHills":84.0,"landingStyle":2,"jumpsConsistency":-2}},{"age":32,"name":"Daniel","surname":"Huber","country":"at","sex":0,"skills":{"qualityOnSmallerHills":81.24,"qualityOnLargerHills":88.0,"landingStyle":1,"jumpsConsistency":1}},{"age":37,"name":"Dawid","surname":"Kubacki","country":"pl","sex":0,"skills":{"qualityOnSmallerHills":91.25,"qualityOnLargerHills":81.0,"landingStyle":1,"jumpsConsistency":0}}]

lib/bloc/database_editing/copied_local_db_cubit.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ class CopiedLocalDbCubit extends Cubit<LocalDbRepo?> {
4545

4646
Future<void> _saveChangesByType<T>(BuildContext context) async {
4747
originalDb.editableByGenericType<T>().set(state!.editableByGenericType<T>().last);
48-
_saveItemsToJsonByType<T>(
48+
final file = databaseFile(
49+
context.read(), context.read<DbFileSystemEntityNames>().byGenericType<T>());
50+
await _saveItemsToJsonByType<T>(
4951
context: context,
50-
file: File(context.read<DbFileSystemEntityNames>().byGenericType<T>()),
52+
file: file,
5153
);
5254
}
5355

@@ -82,7 +84,7 @@ class CopiedLocalDbCubit extends Cubit<LocalDbRepo?> {
8284
final parameters = context.read<DbItemsJsonConfiguration<T>>();
8385
await saveItemsListToJsonFile(
8486
file: file,
85-
items: state!.editableByGenericType<T>().last,
87+
items: originalDb.editableByGenericType<T>().last,
8688
toJson: parameters.toJson,
8789
);
8890
}
@@ -96,5 +98,6 @@ class CopiedLocalDbCubit extends Cubit<LocalDbRepo?> {
9698

9799
void dispose() {
98100
originalDb.dispose();
101+
state?.dispose();
99102
}
100103
}

lib/models/db/local_db_repo.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:flutter/material.dart';
66
import 'package:flutter_bloc/flutter_bloc.dart';
77
import 'package:sj_manager/enums/db_editable_item_type.dart';
88
import 'package:sj_manager/json/db_items_json.dart';
9-
import 'package:sj_manager/json/json_types.dart';
109

1110
import 'package:sj_manager/models/db/country/country.dart';
1211
import 'package:sj_manager/models/db/db_file_system_entity_names.dart';

lib/setup/set_up_app.dart

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'package:sj_manager/models/db/db_file_system_entity_names.dart';
1010
import 'package:sj_manager/models/db/hill/hill.dart';
1111
import 'package:sj_manager/models/db/jumper/jumper.dart';
1212
import 'package:sj_manager/models/db/local_db_repo.dart';
13-
import 'package:sj_manager/models/db/team/country_team.dart';
1413
import 'package:sj_manager/models/db/team/team.dart';
1514
import 'package:sj_manager/repositories/generic/db_items_json_configuration.dart';
1615
import 'package:sj_manager/ui/dialogs/loading_items_failed_dialog.dart';
@@ -110,8 +109,6 @@ class AppConfigurator {
110109
await _tryLoadItems<FemaleJumper>(dialogTitleText: 'Błąd wczytywania skoczkiń');
111110
await _tryLoadItems<Hill>(dialogTitleText: 'Błąd wczytywania skoczni');
112111
await _tryLoadItems<Team>(dialogTitleText: 'Błąd wczytywania zespołów');
113-
114-
// _processCountries(); // TODO, maybe remove the function and its components
115112
}
116113

117114
Future<void> _tryLoadItems<T>({required String dialogTitleText}) async {
@@ -150,47 +147,6 @@ class AppConfigurator {
150147
_context.read<LocalDbRepo>().countries.set(countriesWithLowerCaseCodes);
151148
}
152149

153-
void _processCountries() {
154-
final repo = _context.read<LocalDbRepo>().countries;
155-
final noneCountry = repo.none;
156-
_filterCountriesByTeams();
157-
_sortCountries();
158-
repo.set([noneCountry, ...repo.last]);
159-
}
160-
161-
void _filterCountriesByTeams() {
162-
final countries = _context.read<LocalDbRepo>().countries.last;
163-
final teams = _context.read<LocalDbRepo>().teams.last.cast<CountryTeam>();
164-
final countriesHavingTeam = <Country>{};
165-
for (var team in teams) {
166-
if (!countries.contains(team.country)) {
167-
throw StateError(
168-
'Team has country, which is not contained in loaded countries list (team\'s country: ${team.country})');
169-
}
170-
countriesHavingTeam.add(team.country);
171-
}
172-
_context.read<LocalDbRepo>().countries.set(countriesHavingTeam.toList());
173-
}
174-
175-
void _sortCountries() {
176-
final teams = _context.read<LocalDbRepo>().teams.last.cast<CountryTeam>();
177-
final countryStars = {
178-
for (var team in teams) team.country: team.facts.stars,
179-
};
180-
final countries = countryStars.keys.toList();
181-
182-
countries.sort((first, second) {
183-
final starsComparsion = countryStars[first]!.compareTo(countryStars[second]!);
184-
if (starsComparsion == 0) {
185-
return first.name.compareTo(second.name);
186-
} else {
187-
return starsComparsion;
188-
}
189-
});
190-
191-
_context.read<LocalDbRepo>().countries.set(countries);
192-
}
193-
194150
Future<void> _loadItems<T>() async {
195151
final parameters = _context.read<DbItemsJsonConfiguration<T>>();
196152
final loaded = await loadItemsListFromJsonFile(

lib/ui/database_item_editors/jumper_editor.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@ class JumperEditor extends StatefulWidget {
4141
final bool enableEditingName;
4242
final CountriesRepo countriesRepo;
4343

44-
/// Callback executed when some fields change.
45-
///
46-
/// Returns 'null', if has some nullable fields (so jumper is unfinished)
47-
/// Returns [Jumper] object, if the current jumper is ready to use
4844
final Function(Jumper? current) onChange;
4945

5046
@override

lib/ui/screens/main_screen/large/simulation_wizard/simulation_wizard_dialog.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'dart:async';
2-
import 'dart:io';
32

43
import 'package:flutter/material.dart';
54
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -27,7 +26,8 @@ import 'package:sj_manager/ui/screens/main_screen/large/widgets/generic/main_men
2726
import 'package:sj_manager/ui/screens/main_screen/large/simulation_wizard/widgets/simulation_wizard_option_button.dart';
2827
import 'package:sj_manager/ui/screens/main_screen/large/widgets/generic/main_menu_text_content_button_body.dart';
2928
import 'package:sj_manager/utils/file_dialogs.dart';
30-
import 'package:sj_manager/utils/team_preview_creator.dart';
29+
import 'package:sj_manager/utils/team_preview_creator/default_team_preview_creator.dart';
30+
import 'package:sj_manager/utils/team_preview_creator/team_preview_creator.dart';
3131

3232
part 'screens/__mode_screen.dart';
3333
part 'screens/__team_screen.dart';

lib/ui/screens/main_screen/large/simulation_wizard/widgets/__footer.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ class _FooterState extends State<_Footer> {
3232
stream: navPermissions.canGoBackStream,
3333
builder: (context, snapshot) {
3434
return Visibility(
35-
maintainState: false,
35+
maintainAnimation: true,
36+
maintainSize: true,
37+
maintainState: true,
38+
maintainInteractivity: false,
3639
visible: navPermissions.canGoBack,
3740
child: SizedBox(
3841
width: 80,
@@ -64,7 +67,10 @@ class _FooterState extends State<_Footer> {
6467
stream: navPermissions.canGoForwardStream,
6568
builder: (context, snapshot) {
6669
return Visibility(
67-
maintainState: false,
70+
maintainAnimation: true,
71+
maintainSize: true,
72+
maintainState: true,
73+
maintainInteractivity: false,
6874
visible: navPermissions.canGoForward,
6975
child: SizedBox(
7076
width: 80,

lib/ui/screens/main_screen/large/simulation_wizard/widgets/country_screen/__team_preview.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@ class _TeamPreview extends StatelessWidget {
2424
final largestHillText = previewCreator.largestHill(team)?.toString() ?? 'Brak';
2525

2626
return Container(
27+
decoration: BoxDecoration(
28+
color: Theme.of(context).colorScheme.surfaceContainerLowest,
29+
borderRadius: BorderRadius.only(
30+
bottomLeft: Radius.circular(20), topLeft: Radius.circular(20))),
2731
padding: const EdgeInsets.only(left: 10),
28-
color: Theme.of(context).colorScheme.surfaceContainerLow,
2932
child: Column(
3033
children: [
3134
const Gap(15),

lib/utils/team_preview_creator.dart renamed to lib/utils/team_preview_creator/default_team_preview_creator.dart

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,8 @@ import 'package:sj_manager/models/db/jumps/simple_jump.dart';
66
import 'package:sj_manager/models/db/local_db_repo.dart';
77
import 'package:sj_manager/models/db/sex.dart';
88
import 'package:sj_manager/models/db/team/country_team.dart';
9-
import 'package:sj_manager/models/db/team/team.dart';
109
import 'package:sj_manager/utils/db_items.dart';
11-
12-
abstract class TeamPreviewCreator<T extends Team> {
13-
const TeamPreviewCreator();
14-
15-
int? stars(T team);
16-
SimpleJump? record(T team);
17-
Jumper? bestJumper(T team);
18-
Jumper? risingStar(T team);
19-
Hill? largestHill(T team);
20-
}
10+
import 'package:sj_manager/utils/team_preview_creator/team_preview_creator.dart';
2111

2212
class DefaultCountryTeamPreviewCreator extends TeamPreviewCreator<CountryTeam> {
2313
const DefaultCountryTeamPreviewCreator({
@@ -47,36 +37,67 @@ class DefaultCountryTeamPreviewCreator extends TeamPreviewCreator<CountryTeam> {
4737

4838
@override
4939
Jumper? bestJumper(CountryTeam team) {
50-
final jumpers =
51-
team.sex == Sex.male ? database.maleJumpers.last : database.femaleJumpers.last;
40+
final jumpers = _jumpersBySex(team.sex);
5241
final jumpersFromCountry = jumpers.fromCountryByCode(team.country.code);
5342
if (jumpersFromCountry.isEmpty) return null;
5443
final jumperRatings = {
5544
for (var jumper in jumpersFromCountry) jumper: _calculateRating(jumper),
5645
};
57-
return _bestJumper(jumperRatings);
46+
return _atPositionFromRatings(jumperRatings, position: 1);
5847
}
5948

6049
@override
6150
Jumper? risingStar(CountryTeam team) {
62-
final jumpers =
63-
team.sex == Sex.male ? database.maleJumpers.last : database.femaleJumpers.last;
51+
final jumpers = _jumpersBySex(team.sex);
6452
final jumpersFromCountry = jumpers.fromCountryByCode(team.country.code);
6553
if (jumpersFromCountry.isEmpty) return null;
54+
6655
final jumperRatings = {
6756
for (var jumper in jumpersFromCountry)
6857
jumper: _calculateRatingForRisingStar(jumper),
6958
};
70-
return _bestJumper(jumperRatings);
59+
final best = bestJumper(team);
60+
final bestForRisingStar = _atPositionFromRatings(jumperRatings, position: 1);
61+
if (jumperRatings.values.every((rating) => rating == 0) ||
62+
(best == bestForRisingStar && jumperRatings.length == 1)) {
63+
return null;
64+
} else if (best == bestForRisingStar) {
65+
return _atPositionFromRatings(jumperRatings, position: 2);
66+
} else {
67+
return bestForRisingStar;
68+
}
69+
}
70+
71+
List<Jumper> _jumpersBySex(Sex sex) {
72+
return sex == Sex.male ? database.maleJumpers.last : database.femaleJumpers.last;
7173
}
7274

7375
double _calculateRatingForRisingStar(Jumper jumper) {
7476
final base = _calculateRating(jumper);
7577
final age = jumper.age;
76-
const k = 27;
77-
final multiplierByAge = (age == 17) ? 1.0 : (1.0 / (1.0 + (age - 18).abs() / k));
78-
print('multiplier by age ($age): $multiplierByAge');
79-
return base * multiplierByAge;
78+
final multiplierByAge = _multiplierByAge(age);
79+
print('$jumper multiplier by age ($age): $multiplierByAge');
80+
final rating = base * multiplierByAge;
81+
print('$jumper: rating: $rating');
82+
return rating;
83+
}
84+
85+
double _multiplierByAge(int age) {
86+
return switch (age) {
87+
12 => 1.0,
88+
13 => 1.0,
89+
14 => 1.0,
90+
15 => 1.0,
91+
16 => 1.05,
92+
17 => 1.05,
93+
18 => 1.1,
94+
19 => 1.1,
95+
20 => 1.05,
96+
21 => 0.95,
97+
22 => 0.9,
98+
23 => 0.8,
99+
_ => 0.0
100+
};
80101
}
81102

82103
double _calculateRating(Jumper jumper) {
@@ -105,7 +126,14 @@ class DefaultCountryTeamPreviewCreator extends TeamPreviewCreator<CountryTeam> {
105126
return rating;
106127
}
107128

108-
Jumper _bestJumper(Map<Jumper, double> jumperRatings) {
109-
return jumperRatings.entries.reduce((a, b) => a.value > b.value ? a : b).key;
129+
Jumper _atPositionFromRatings(Map<Jumper, double> jumperRatings,
130+
{required int position}) {
131+
if (position < 1 || position > jumperRatings.length) {
132+
throw ArgumentError('Position out of range');
133+
}
134+
List<MapEntry<Jumper, double>> sortedEntries = jumperRatings.entries.toList()
135+
..sort((a, b) => b.value.compareTo(a.value));
136+
137+
return sortedEntries[position - 1].key;
110138
}
111139
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'package:sj_manager/models/db/hill/hill.dart';
2+
import 'package:sj_manager/models/db/jumper/jumper.dart';
3+
import 'package:sj_manager/models/db/jumps/simple_jump.dart';
4+
import 'package:sj_manager/models/db/team/team.dart';
5+
6+
abstract class TeamPreviewCreator<T extends Team> {
7+
const TeamPreviewCreator();
8+
9+
Hill? largestHill(T team);
10+
int? stars(T team);
11+
SimpleJump? record(T team);
12+
Jumper? bestJumper(T team);
13+
Jumper? risingStar(T team);
14+
}

0 commit comments

Comments
 (0)